class AjustaTriggerEmpenhos < ActiveRecord::Migration[5.2]
  def change
    execute "
      CREATE OR REPLACE FUNCTION public.contabilidade_empenhos_atualiza_valor_liquidado()
        RETURNS trigger
        LANGUAGE 'plpgsql'
        COST 100
        VOLATILE NOT LEAKPROOF
      AS $BODY$
      BEGIN
        IF TG_OP = 'DELETE' OR TG_OP = 'UPDATE' THEN
          UPDATE contabilidade_empenhos
          SET valor_liquidado = (
            SELECT SUM(valor)
            FROM contabilidade_liquidacoes
            WHERE empenho_id = OLD.empenho_id
            AND (
              (de_multiplas_notas_fiscais = TRUE AND liquidacao_mae_id IS NOT NULL) 
              OR (de_multiplas_notas_fiscais IS NOT TRUE)
            )
          )
          WHERE id = OLD.empenho_id;
        END IF;

        IF TG_OP = 'INSERT' THEN
          UPDATE contabilidade_empenhos
          SET valor_liquidado = (
            SELECT SUM(valor)
            FROM contabilidade_liquidacoes
            WHERE empenho_id = NEW.empenho_id
            AND (
              (de_multiplas_notas_fiscais = TRUE AND liquidacao_mae_id IS NOT NULL) 
              OR (de_multiplas_notas_fiscais IS NOT TRUE)
            )
          )
          WHERE id = NEW.empenho_id;
        END IF;

        RETURN NEW;
      END;
      $BODY$;

      CREATE TRIGGER atualiza_valor_liquidado_trigger
        AFTER INSERT OR DELETE OR UPDATE
        ON public.contabilidade_liquidacoes
        FOR EACH ROW
        EXECUTE PROCEDURE public.contabilidade_empenhos_atualiza_valor_liquidado();
      
      update contabilidade_liquidacoes set orcamento_id = orcamento_id;

    "
  end
end
