class CorrigeTriggerAtualizaValorPago < ActiveRecord::Migration[5.2]
  def up
    execute <<-SQL
      CREATE OR REPLACE FUNCTION public.contabilidade_liquidacoes_atualiza_valor_pago()
      RETURNS trigger
      LANGUAGE 'plpgsql'
      COST 100
      VOLATILE NOT LEAKPROOF
      AS $BODY$
        BEGIN
          IF TG_OP = 'INSERT' OR TG_OP = 'UPDATE' THEN
            UPDATE contabilidade_liquidacoes
            SET valor_pago = (
              SELECT COALESCE(SUM(valor), 0) FROM contabilidade_pagamentos WHERE status IN (2, 3, 4, 5) and liquidacao_id = NEW.liquidacao_id
            ) - (
              SELECT COALESCE(SUM(valor), 0) FROM contabilidade_pagamentos WHERE coalesce(status, 0) in (0, 99) and liquidacao_id = NEW.liquidacao_id
            )
            WHERE id = NEW.liquidacao_id;
          ELSE
            UPDATE contabilidade_liquidacoes
            SET valor_pago = (
              SELECT COALESCE(SUM(valor), 0) FROM contabilidade_pagamentos WHERE status IN (2, 3, 4, 5) and liquidacao_id = OLD.liquidacao_id
            ) - (
              SELECT COALESCE(SUM(valor), 0) FROM contabilidade_pagamentos WHERE coalesce(status, 0) in (0, 99) and liquidacao_id = OLD.liquidacao_id
            )
            WHERE id = OLD.liquidacao_id;
          END IF;

          RETURN NEW;
        END;
      
      $BODY$;

    SQL
  end
end
