class AdicionaTriggerLancamentosOrcamentarios < ActiveRecord::Migration[5.2]
  def change
    execute "
    
      CREATE OR REPLACE FUNCTION public.atualizar_valor_arrecadado()
          RETURNS trigger
          LANGUAGE 'plpgsql'
          COST 100
          VOLATILE NOT LEAKPROOF
      AS $BODY$
        BEGIN
          IF TG_OP = 'DELETE' OR TG_OP = 'UPDATE' THEN
            UPDATE loa_orcamentos_da_receita as a
            SET valor_arrecadado = (
              SELECT SUM(valor)
              FROM contabilidade_lancamentos_do_orcamento_da_receita
              WHERE orcamento_da_receita_id = OLD.orcamento_da_receita_id
            )
            WHERE id = OLD.orcamento_da_receita_id;

          END IF;
          
          IF TG_OP = 'INSERT' THEN
            UPDATE loa_orcamentos_da_receita
            SET valor_arrecadado = (
              SELECT SUM(valor)
              FROM contabilidade_lancamentos_do_orcamento_da_receita
              WHERE orcamento_da_receita_id = NEW.orcamento_da_receita_id
            )
            WHERE id = NEW.orcamento_da_receita_id;
          END IF;
          
          RETURN NEW;
        END;
      $BODY$;

      CREATE TRIGGER atualizar_valor_arrecadado_trigger
      AFTER INSERT OR UPDATE OR DELETE ON contabilidade_lancamentos_do_orcamento_da_receita
      FOR EACH ROW
      EXECUTE PROCEDURE public.atualizar_valor_arrecadado();

      CREATE OR REPLACE FUNCTION public.atualizar_valor_empenhado()
          RETURNS trigger
          LANGUAGE 'plpgsql'
          COST 100
          VOLATILE NOT LEAKPROOF
      AS $BODY$

        BEGIN
          IF TG_OP = 'DELETE' OR TG_OP = 'UPDATE' THEN
            IF OLD.modulo_type = 'Contabilidade::Empenho' OR OLD.modulo_type = 'Contabilidade::AnulacaoDoEmpenho' THEN
            UPDATE loa_orcamentos_da_despesa
            SET valor_empenhado = (
              SELECT SUM(valor)
              FROM contabilidade_lancamentos_do_orcamento_da_despesa
              WHERE orcamento_da_despesa_id = OLD.orcamento_da_despesa_id
            )
            WHERE id = OLD.orcamento_da_despesa_id;
            END IF;
          END IF;

          IF TG_OP = 'INSERT' THEN
            IF NEW.modulo_type = 'Contabilidade::Empenho' OR NEW.modulo_type = 'Contabilidade::AnulacaoDoEmpenho' THEN
            UPDATE loa_orcamentos_da_despesa
            SET valor_empenhado = (
              SELECT SUM(valor)
              FROM contabilidade_lancamentos_do_orcamento_da_despesa
              WHERE orcamento_da_despesa_id = NEW.orcamento_da_despesa_id
            )
            WHERE id = NEW.orcamento_da_despesa_id;
            END IF;
          END IF;

          RETURN NEW;
        END;
      $BODY$;

      CREATE TRIGGER atualizar_valor_empenhado_trigger
      AFTER INSERT OR UPDATE OR DELETE ON contabilidade_lancamentos_do_orcamento_da_despesa
      FOR EACH ROW
      EXECUTE PROCEDURE public.atualizar_valor_empenhado();

    "
  end
end
