
-- StoreProcedure {atualiza_rp()} Versao {69} Esquema {padrao} Descricao {Atualiza saldo titulo a receber e pagar}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.atualiza_rp()
RETURNS trigger AS
$BODY$
DECLARE
 saldoTitulo    NUMERIC(14,2); -- Valor da PArcela
 aCampos               character varying[];
 aDados                character varying[];
 aCamposCl             character varying[];
 aDadosCl              character varying[];
 r_baixa        RECORD;
 r_rp           RECORD;
 r_rp_lctobaixa RECORD;
 r_rp_cl        RECORD;
 r_ccmovcl      RECORD;
 r_cc_movto     RECORD;
 r_classes      RECORD;
 r_parameters   RECORD;
BEGIN
   IF TG_OP = 'DELETE'  THEN

     UPDATE financ_rp
         SET valor_saldo = CASE WHEN valor_saldo = valor_total THEN valor_total ELSE (valor_saldo + COALESCE(old.valor_liquido, 0))END
       WHERE id = OLD.financ_rp_id;

   ELSE
      SELECT SUM(Round(valor_liquido,2))    AS totalBaixa,
             SUM(Round(valor_juros,2))      AS total_juros,
             SUM(Round(valor_despesasac,2)) AS total_despesasac,
             SUM(Round(valor_devolucaom,2)) AS total_devolucaom,
             SUM(Round(valor_descontos,2))  AS total_descontos
        INTO r_baixa
	    FROM financ_rp_baixas
	    WHERE financ_rp_id = NEW.financ_rp_id;


      UPDATE financ_rp
         SET valor_saldo = (Round(valor_total,2) - COALESCE(r_baixa.totalBaixa, 0))
       WHERE id = NEW.financ_rp_id;

      ---financdescobtidos
      --
      -- atualizar apuracao de resultados de competencia (classificacao gerencial)
      --
      --IF TG_OP = 'INSERT' THEN
	      --Posiciona Registro (financ_cc_movto)
	        SELECT financ_cc_id, controle, financ_rp_lctobaixa_lcto, valor, data_emissao
		      INTO r_cc_movto
		      FROM financ_cc_movto
		     WHERE financ_rp_lctobaixa_lcto = NEW.financ_rp_lctobaixa_lcto;
		  --Posiciona Registro (financ_rp_lctobaixa)
	        SELECT lcto, valorbruto, valortroco, valorjuros, valordesconto, valordespesa, valordevolucao,valorliquido
		      INTO r_rp_lctobaixa
		      FROM financ_rp_lctobaixa
		     WHERE lcto = NEW.financ_rp_lctobaixa_lcto;
		  --Posiciona Tipo de Cobranca
		    SELECT *
		      INTO r_parameters
		      FROM fat_parameters
		     LIMIT 1 ;

		  --Posiciona financ_rp
		    SELECT id, natureza
		      INTO r_rp
		      FROM financ_rp
		     WHERE id = NEW.financ_rp_id;

		   aCampos =  '{financ_cc_id,
		                financ_classificacao_g_id,
		                financ_cc_movto_controle,
		                datalcto,
		                natureza,
		                valor,
		                tipolcto}';

		     --Grava Juros pagos/recebidos

		     IF r_rp_lctobaixa.valorjuros > 0 THEN
		       IF r_rp.natureza = 'R' THEN
		          IF r_parameters.financjurosrecebidos > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financjurosrecebidos,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Credito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valorjuros,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe juros recebidos no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF r_rp.natureza = 'P' THEN
		          IF r_parameters.financjurospagos > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financjurospagos,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Debito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valorjuros,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe juros pagos no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF NOT padrao.gravacccl(aCampos, aDados)THEN
			       RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',
			                        r_cc_movto.financ_cc_id ,
			                        to_Char(COALESCE(NEW.valor_juros,0), '999999999.99') ;
			   END IF;
		    END IF;

		    --Grava Despesas Acessorias recebidas/pagas

		    IF r_rp_lctobaixa.valordespesa > 0 THEN
		       IF r_rp.natureza = 'R' THEN
		          IF r_parameters.financdespacessoriasrec > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdespacessoriasrec,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Credito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordespesa,0), '999999999.99')||','
				              		|| 'A'              ||'}';

				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe despesas acessorias (recebidas) no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF r_rp.natureza = 'P' THEN
		          IF r_parameters.financdespacessoriaspag > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdespacessoriaspag,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Debito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordespesa,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe despesas acessorias (pagas) no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF NOT padrao.gravacccl(aCampos, aDados)THEN
			       RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',
			                        r_cc_movto.financ_cc_id ,
			                        to_Char(COALESCE(NEW.valor_despesasac,0), '999999999.99') ;
			   END IF;
		    END IF;

		    --Grava Descontos recebidas/obtidos

		    IF r_rp_lctobaixa.valordesconto > 0 THEN
		       IF r_rp.natureza = 'R' THEN
		          IF r_parameters.financdescconcedidos > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdescconcedidos,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Debito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordesconto,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				     --RAISE NOTICE 'Grava classe gerencial Descontos recebidas/obtidos :% (%)',  r_parameters.financdescconcedidos, COALESCE(r_rp_lctobaixa.valordesconto,0);
				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe descontos concedidos no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF r_rp.natureza = 'P' THEN
		          IF r_parameters.financdescobtidos > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdescobtidos,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Credito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordesconto,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				   ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe de descontos obtidos no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF NOT padrao.gravacccl(aCampos, aDados)THEN
			       RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',
			                        r_cc_movto.financ_cc_id ,
			                        to_Char(COALESCE(NEW.valor_descontos,0), '999999999.99') ;
			   END IF;
		    END IF;

		    --Grava devolucoes recebidas/obtidos

		    IF r_rp_lctobaixa.valordevolucao > 0 THEN
		       IF r_rp.natureza = 'R' THEN
		          IF r_parameters.financdevrecebidas > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdevrecebidas,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Debito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordevolucao,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				  ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe de devolucoes recebidas no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;

		       END IF;
		       IF r_rp.natureza = 'P' THEN
		          IF r_parameters.financdevenviadas > 0 THEN
		    		 aDados  =   '{'|| to_char(r_cc_movto.financ_cc_id,'99999')                     ||','
				              		|| to_char(r_parameters.financdescobtidos,  '999')||','
				              		|| to_char(r_cc_movto.controle,  '9999999999')             ||','
				              		|| to_Char(NEW.datapgto, 'dd/MM/yyyy')          ||','
				              		|| 'Credito,'
				              		||  to_Char(COALESCE(r_rp_lctobaixa.valordevolucao,0), '999999999.99')||','
				              		|| 'A'              ||'}';
				  ELSE
				      RAISE EXCEPTION 'Nao foi informado a classe de devolucoes enviadas no parametro padrao do sistema. Favor verificar no Opcao Arquivos>Configuracoes padrao do sistema>Guia Finaneiro: %', aDados;
		          END IF;
		       END IF;
		       IF NOT padrao.gravacccl(aCampos, aDados)THEN
			       RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',
			                        r_rp_cl.financ_classificacao_g_id,
			                        to_Char(COALESCE(NEW.valor_devolucaom,0), '999999999.99') ;
			   END IF;
		    END IF;

   END IF;




   RETURN NULL;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;


-- Gatilho {atualiza_rp()} Versao {001} Esquema {empresa} Descricao {Atualiza saldos receber epagar}
-- ------------------------------------------------------------

CREATE TRIGGER atualiza_rp AFTER INSERT OR UPDATE OR DELETE ON financ_rp_baixas
       FOR EACH ROW EXECUTE PROCEDURE padrao.atualiza_rp();


