class AdicionaTriggerDeMovimentacaoDasContasBancarias < ActiveRecord::Migration[5.2]
  def change
    execute "

      CREATE OR REPLACE FUNCTION public.contas_bancarias_por_unidade_orcamentaria_atualiza_saldo()
          RETURNS trigger
          LANGUAGE 'plpgsql'
          COST 100
          VOLATILE NOT LEAKPROOF
      AS $BODY$
      BEGIN
        IF (TG_OP = 'INSERT') THEN
          RAISE NOTICE 'INSERINDO... %', NEW.conta_bancaria_por_unidade_orcamentaria_id;
          update base_contas_bancarias_por_unidade_orcamentaria as a set saldo_atual = (
            select sum(valor) from contabilidade_movimentacoes_da_conta_bancaria as b
            where b.conta_bancaria_por_unidade_orcamentaria_id = a.id	
          ) where a.id = NEW.conta_bancaria_por_unidade_orcamentaria_id;
          
          update base_contas_bancarias as a set saldo_atual = (
            select sum(saldo_atual) from base_contas_bancarias_por_unidade_orcamentaria as b
            where b.conta_bancaria_id = a.id
          ) where a.id in (
            select conta_bancaria_id from base_contas_bancarias_por_unidade_orcamentaria 
            where id  = NEW.conta_bancaria_por_unidade_orcamentaria_id
            );
          return new;
        END IF;
        IF TG_OP = 'UPDATE' THEN
          RAISE NOTICE 'ATUALIZANDO... %', OLD.conta_bancaria_por_unidade_orcamentaria_id;
          update base_contas_bancarias_por_unidade_orcamentaria as a set saldo_atual = (
            select sum(valor) from contabilidade_movimentacoes_da_conta_bancaria as b
            where b.conta_bancaria_por_unidade_orcamentaria_id = a.id	
          ) where a.id = OLD.conta_bancaria_por_unidade_orcamentaria_id;	
          
          update base_contas_bancarias as a set saldo_atual = (
            select sum(saldo_atual) from base_contas_bancarias_por_unidade_orcamentaria as b
            where b.conta_bancaria_id = a.id
          ) where a.id in (
            select conta_bancaria_id from base_contas_bancarias_por_unidade_orcamentaria 
            where id  = OLD.conta_bancaria_por_unidade_orcamentaria_id
            );
          return old;
        END IF;
        IF TG_OP = 'DELETE' THEN
          RAISE NOTICE 'DELETANDO... %', OLD.conta_bancaria_por_unidade_orcamentaria_id;
          update base_contas_bancarias_por_unidade_orcamentaria as a set saldo_atual = (
            select sum(valor) from contabilidade_movimentacoes_da_conta_bancaria as b
            where b.conta_bancaria_por_unidade_orcamentaria_id = a.id	
          ) where a.id = OLD.conta_bancaria_por_unidade_orcamentaria_id;
          
          update base_contas_bancarias as a set saldo_atual = (
            select sum(saldo_atual) from base_contas_bancarias_por_unidade_orcamentaria as b
            where b.conta_bancaria_id = a.id
          ) where a.id in (
            select conta_bancaria_id from base_contas_bancarias_por_unidade_orcamentaria 
            where id  = OLD.conta_bancaria_por_unidade_orcamentaria_id
            );
          return old;
        END IF;
      END;
      $BODY$;

    
    
      CREATE TRIGGER atualiza_saldo_unidade_da_conta_bancaria_trigger
        AFTER INSERT OR DELETE OR UPDATE 
        ON public.contabilidade_movimentacoes_da_conta_bancaria
        FOR EACH ROW
        EXECUTE PROCEDURE public.contas_bancarias_por_unidade_orcamentaria_atualiza_saldo();

      update contabilidade_movimentacoes_da_conta_bancaria set modulo_id = modulo_id;
    "
  end
end
