-- StoreProcedure {rp_integra()} Versao {032} Esquema {padrao} Descricao {Integracao contas a receber/pagar}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.rp_integra()
RETURNS trigger AS

$BODY$

DECLARE
 --Variaveis
   dia                   double precision;
   mes                   double precision;
   ano                   double precision;
   ultimoVcto            DATE;
   vencimento            DATE;
   valorNFsaldo          NUMERIC(14,2); -- Valor Total da NF
   valorPA               NUMERIC(14,2); -- Valor da PArcela
   indicePA              NUMERIC(14,5); -- Valor da PArcela equivalente ao total da venda
   valorComissao         NUMERIC(14,2); -- Valor da Comissao pelo recebimento
   Receber_Pagar         CHAR(1);
   aCampos               character varying[];
   aDados                character varying[];
   aCamposCl             character varying[];
   aDadosCl              character varying[];
   sCampos               VARCHAR;
   sDados                VARCHAR;

 --Faturamento
   d11_perc_comissao     NUMERIC(14,5);
   d12_natureza          CHAR(1); --Natureza: Entrada/Saida
   d13_tipo_docto        CHAR(1); --Tipo Docto: Nota Fiscal/Pedido/Orcamento
   d14_calcularICMS      CHAR(1); --Calcular ICMS: Sim/Nao
   d15_calcularIPI       CHAR(1); --Calcular IPI: Sim/Nao
   d16_calcularFUNRURAL  CHAR(1); --Calcular FUNRURAL: Sim/Nao
   d17_CFOP              VARCHAR; --Classificacao Fiscal(CFOP) da transacao
   d18_usarCFOP          CHAR(1); --Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos
   d19_devolucao         CHAR(1); --devolucao de mercadorias (Sim - Nao)
   d115_NFE              CHAR(1); --Nota Fiscal Eletronica: (Sim/Nao)
   d118_classgerencialproduto   CHAR(1); --Class.Gerencial do Produto: (Sim/Nao)
 --Estoque
   d26_atualiza_estoque  CHAR(1); --Atualiza estouque:(Sim/Nao)
   d27_tipo_mvto         CHAR(1); --Tipo de Movimento :0-Normal/1-Consignacao - Envio/ ...
   d28_alterarCM         CHAR(1); --Alterar Custo Medio : Sim/Nao
   d29_alterrrCUC        CHAR(1); --Alterar Custo Ultima compra: Sim/Nao
   d210_checarestoque    CHAR(1); --Checar Estoque: 0-Checar saldo negativo/1-Vetar saida com saldo negativo
 --Financeiro
   d49_lancarCRP         CHAR(1); --Lancar contas a receber/pagar: Sim/Nao
   d410_atualizarsaldoCC CHAR(1); --Atualizar saldo do C/C: Sim/Nao
   d411_tipolcto         CHAR(1); --Tipo lancamento: 0-Normal/1-Transferencia
   d412_natureza         CHAR(1); --Natureza: Creditol/Debito
   d413_comissao         CHAR(1); --Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar
   d414_conciliar        CHAR(1); --Conciliar automatico: Sim/Nao
   d423_gerar_fatura     CHAR(1); --Gerar Fatura: R/P=Receber/Pagar)
   d424_CondPgto         INTEGER; --Gerar Fatura: Condição de Pgto)
   d426_ClassGerParcCondPgto  CHAR(1); --Classificacao Gerencial pela parcela da Condicao de Pgto
--Classificacao Gerencial
   d71_codigoclasse1      VARCHAR(5); --Codigo classificacacao gerencial 1
   d72_codigoclasse2      VARCHAR(5); --Codigo classificacacao gerencial 2
   d73_codigoclasse3      VARCHAR(5); --Codigo classificacacao gerencial 3


   r_docto_c         RECORD;
   r_docto_i         RECORD;
   r_tipocobranca    RECORD;
   r_parameters      RECORD;
   r_baixa           RECORD;
   r_financ_rp_baixa RECORD;
   r_transacao       RECORD;
   r_classidicacaoG  RECORD;
   r_contem_Baixa    RECORD;
   r_classe          RECORD;
   r_cc_movto        RECORD;
   r_condpg_p        RECORD;

   v_retorna        boolean;
BEGIN
   IF TG_OP <> 'DELETE' THEN
        d118_classgerencialproduto =  'N';
       IF NEW.status_reg = 'G' THEN
              --Posiciona financ_cc_movto
              SELECT controle,fat_transacao_id, valor
                INTO r_cc_movto
                FROM financ_cc_movto
                WHERE controle = new.financ_cc_movto_controle
                LIMIT 1 ;

              d118_classgerencialproduto =  'N';
              -- LOOP
              FOR r_transacao IN SELECT * FROM view_transacao WHERE codigo_transacao = r_cc_movto.fat_transacao_id ORDER BY diretiva LOOP
                  --RAISE NOTICE 'Propriedade:% (%)',  r_transacao.diretiva, r_transacao.propriedade;
               -- diretiva/Regra 11 -( (%) Comissao vendedores)
                  IF r_transacao.diretiva = 11 THEN
                      d11_perc_comissao = CAST(r_transacao.propriedade AS DECIMAL(14,5));
                  END IF;

               -- diretiva/Regra 12 - ( Natureza: Entrada/Saida)
                  IF r_transacao.diretiva = 12 THEN
                      d12_natureza = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 13 - ( Tipo Docto: Nota Fiscao/Pedido/Orcamento)
                  IF r_transacao.diretiva = 13 THEN
                      d13_tipo_docto = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 14 - ( Calcular ICMS: Sim/Nao)
                  IF r_transacao.diretiva = 14 THEN
                      d14_calcularICMS = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 15 - ( Calcular IPI: Sim/Nao)
                  IF r_transacao.diretiva = 15 THEN
                      d15_calcularIPI = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 16 - ( Calcular FUNRURAL: Sim/Nao)
                  IF r_transacao.diretiva = 16 THEN
                      d16_calcularFUNRURAL = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 17 - ( Classificacao Fiscal(CFOP))
                  IF r_transacao.diretiva = 17 THEN
                      d17_CFOP = Trim(both ' ' from r_transacao.propriedade);
                  END IF;

               -- diretiva/Regra 18 - ( Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos )
                  IF r_transacao.diretiva = 18 THEN
                      d18_usarCFOP = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 19 - (Devolucao:( Sim/Nao )
                  IF r_transacao.diretiva = 19 THEN
                      d19_devolucao = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 115 - (Nota Fiscal Eletronica: Sim/Nao)
                  IF r_transacao.diretiva = 115 THEN
                      d115_NFE = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
               -- diretiva/Regra 26 - ( Atualiza estoque: Sim/Nao.)
                  IF r_transacao.diretiva = 26 THEN
                      d26_atualiza_estoque = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 27 - ( Tipo de Movimentacao: 0-Normal/1-Consignacao - Envio/ ...)
                  IF r_transacao.diretiva = 27 THEN
                      d27_tipo_mvto = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 28 - ( Alterar Custo Medio: Sim/Nao)
                  IF r_transacao.diretiva = 28 THEN
                      d28_alterarCM = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;

              -- diretiva/Regra 29 - ( Alterar Custo Ultima compra: Sim/Nao)
                  IF r_transacao.diretiva = 29 THEN
                      d29_alterrrCUC = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;
               -- diretiva/Regra 210 - ( Checar Saldo Negativo:  0-Checar saldo negativo/1-Vetar saida com saldo negativo)
                  IF r_transacao.diretiva = 210 THEN
                      d210_checarestoque = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;
              -- diretiva/Regra 49 - ( Lancar contas a receber/pagar: Sim/Nao)
                  IF r_transacao.diretiva = 49 THEN
                     d49_lancarCRP =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;
               -- diretiva/Regra 71 - ( -codigo classificacacao gerencial 1 )
                  IF r_transacao.diretiva = 71 THEN
                     d71_codigoclasse1 =  r_transacao.propriedade;
                  END IF;
               -- diretiva/Regra 72 - ( -codigo classificacacao gerencial 2 )
                  IF r_transacao.diretiva = 72 THEN
                     d72_codigoclasse2 =  r_transacao.propriedade;
                  END IF;
                -- diretiva/Regra 73 - ( -codigo classificacacao gerencial 3 )
                  IF r_transacao.diretiva = 73 THEN
                     d73_codigoclasse3 =  r_transacao.propriedade;
                  END IF;
                -- diretiva/Regra 410 - ( Atualiza saldo do C/C: Sim/Nao)
                  IF r_transacao.diretiva = 410 THEN
                      d410_atualizarsaldoCC = substring(r_transacao.propriedade from 1 for 1)  ;
                  END IF;

              -- diretiva/Regra 411 - ( Tipo lancamento: 0-Normal/1-Transferencia)
                  IF r_transacao.diretiva = 411 THEN
                      d411_tipolcto =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 412 - ( Natureza: Creditol/Debito)
                  IF r_transacao.diretiva = 412 THEN
                      d412_natureza = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 413 - ( Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar)
                  IF r_transacao.diretiva = 413 THEN
                      d413_comissao =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 414 - (Regra Conciliar automatico: Sim/Nao)
                 IF r_transacao.diretiva = 414 THEN
                    d414_conciliar = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
               --Gerar Fatura: R/P=Receber/Pagar)
                 IF r_transacao.diretiva = 423 THEN
                    --d118_classgerencialproduto = 'N'; -- Se Diretiva Gera Fatura Classe Gerencia nao pode ser pelo produto
                    d423_gerar_fatura = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
               --Gerar Fatura: Condicção de Pgto
                 IF r_transacao.diretiva = 424 THEN
                    d424_CondPgto = CAST(r_transacao.propriedade AS INTEGER);
                 END IF;

              -- diretiva/Regra 426 - (Regra Classificacao Gerencial pela parcela da Condicao de Pgto
                 IF r_transacao.diretiva = 426 THEN
                    d426_ClassGerParcCondPgto = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
              END LOOP;

              --
              -- atualizar apuracao de resultados de competencia (classificacao gerencial)
              --

              --Posiciona Parameters
              SELECT *
               INTO r_parameters
               FROM fat_parameters
              LIMIT 1 ;


              IF COALESCE(d426_ClassGerParcCondPgto, 'N') = 'S' THEN
                 --Posiciona parcela da Condicao de pgto
                 SELECT *
                 INTO r_condpg_p
                 FROM fat_condpg_p
                 WHERE fat_condpg_id = d424_CondPgto AND parcela = NEW.parcela;
                 IF FOUND THEN
                     aCamposCl =  '{
                            financ_rp_id,
                            cad_cadastro_id,
                            financ_classificacao_g_id,
                            tipo,
                            regimecaixa,
                            regimecompetencia,
                            natureza,
                            datalcto,
                            valor}';

                     aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                    || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                    || 	to_char(r_condpg_p.financ_classificacao_g_id, '99999')         ||','
                                                    ||  New.natureza                          	||','
                                                    || 	'false'                                	||','
                                                    || 	'true'                                 	||','
                                                    || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                             ELSE 'Credito'
                                                        END                                    	||','
                                                    || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                    || to_Char(New.valor_total, '999999999.99') ||'}';

                      IF aDadosCL IS NULL THEN
                            RAISE EXCEPTION 'Nao sera possivel gravar operacao.
                                     Dados para apuracao de resultados pela Condicao de Pgto esta incompleto. Verifique campos <NULL>:
                                    (id:%
                                      cad_cadastro_id:%
                                      classe:%
                                      tipo:%
                                      regimecaixa:%
                                      regimecompetencia:%
                                      natureza:%
                                      datalcto:%
                                      valor:%)',
                                       to_char(New.id,'9999999999')   ,
                                       to_char(NEW.cad_cadastro_id, '999999999') ,
                                       r_condpg_p.financ_classificacao_g_id ,
                                       New.natureza              ,
                                       'false'            ,
                                       'true'          ,
                                       CASE WHEN d12_natureza = 'E'THEN 'Debito'
                                            ELSE 'Credito'
                                       END,
                                       to_Char(NEW.emissao, 'dd/MM/yyyy')       ,
                                       to_Char(r_docto_i.total_classe, '999999999.99');
                      END IF;
                      IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                    RAISE EXCEPTION 'nao foi possivel persistir classificacao gerencial pela Condicao de Pgto (Docto:% - CTRL:% CLASSE:%)!',NEW.docto , New.controle, r_docto_i.classe;
                      END IF;

                 END IF;

              ELSE

                  --Gravar  classificacao gerencial
                  BEGIN
                         aCamposCl =  '{
                            financ_rp_id,
                            cad_cadastro_id,
                            financ_classificacao_g_id,
                            tipo,
                            regimecaixa,
                            regimecompetencia,
                            natureza,
                            datalcto,
                            valor}';


                       --RAISE EXCEPTION 'd71_codigoclasse1:%',d71_codigoclasse1 ;

                         IF d71_codigoclasse1 IS NOT NULL AND
                            d72_codigoclasse2 IS NOT NULL AND
                            d73_codigoclasse3 IS NOT NULL THEN
                            FOR i IN 1..3 LOOP

                                --Posiciona  classe
                                SELECT id, natureza
                                  INTO r_classe
                                  FROM financ_classificacao_g
                                  WHERE financ_classificacao_g.id = CASE WHEN i=1 THEN d71_codigoclasse1
                                                                        WHEN i=2 THEN d72_codigoclasse2
                                                                        ELSE          d73_codigoclasse3
                                                                    END;

                                aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                    || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                    || 	CASE WHEN i=1 THEN d71_codigoclasse1
                                                             WHEN i=2 THEN d72_codigoclasse2
                                                             ELSE          d73_codigoclasse3
                                                        END                                   	||','
                                                    ||  New.natureza                          	||','
                                                    || 	'false'                                	||','
                                                    || 	'true'                                 	||','
                                                    || 	r_classe.natureza                      	||','
                                                    || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                    || to_Char(New.valor_total/3, '999999999.99')     	||'}';



            --                    aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
            --			                       		|| 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
            --							       		|| 	CASE WHEN i=1 THEN d71_codigoclasse1
            --								           		 WHEN i=2 THEN d72_codigoclasse2
            --								       			 ELSE          d73_codigoclasse3
            --							           		END                                   	||','
            --							  			||  New.natureza                          	||','
            --							  			|| 	'false'                                	||','
            --							  			|| 	'true'                                 	||','
            --							  			|| 	CASE WHEN New.natureza = 'P' THEN 'Debito'
            --								  	   		ELSE 'Credito'
            --							     			END                                    	||','
            --							  			|| to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
            --							  			|| to_Char(New.valor_total/3, '999999999.99')     	||'}';

                                IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                        RAISE EXCEPTION 'nao foi possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,
                                                                                        CASE WHEN i=1 THEN d71_codigoclasse1
                                                                                             WHEN i=2 THEN d72_codigoclasse2
                                                                                             ELSE          d73_codigoclasse3
                                                                                        END;
                                END IF;
                            END LOOP;
                         END IF;
                         IF d71_codigoclasse1 IS NOT NULL AND
                            d72_codigoclasse2 IS NOT NULL THEN
                            FOR i IN 1..2 LOOP
                                aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                    || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                    || 	CASE WHEN i=1 THEN d71_codigoclasse1
                                                             ELSE 	       d72_codigoclasse2
                                                        END                                   	||','
                                                    || 	New.natureza                          	||','
                                                    || 	'false'                                	||','
                                                    || 	'true'                                 	||','
                                                    || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                        ELSE 'Credito'
                                                        END                                    	||','
                                                    || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                    || to_Char(New.valor_total/2, '999999999.99')     	||'}';

                                IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                        RAISE EXCEPTION 'nao possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,
                                                                                        CASE WHEN i=1 THEN d71_codigoclasse1
                                                                                             ELSE          d72_codigoclasse2
                                                                                        END;
                                END IF;
                            END LOOP;
                         END IF;
                         IF d71_codigoclasse1 IS NOT NULL THEN
                            aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                || 	d71_codigoclasse1                      	||','
                                                || 	New.natureza                          	||','
                                                || 	'false'                                	||','
                                                || 	'true'                                 	||','
                                                || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                    ELSE 'Credito'
                                                    END                                    	||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                || to_Char(New.valor_total, '999999999.99')	||'}';

                                IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                        RAISE EXCEPTION 'nao possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,d71_codigoclasse1;
                                END IF;
                         END IF;
                  END;
              END IF;
       ELSE
               --Posiciona fat_docto_c
               SELECT controle,fat_transacao_id, fat_condpg_id, valortotal_docto
                 INTO r_docto_c
                 FROM fat_docto_c
                WHERE controle = new.fatura
                LIMIT 1 ;

              d118_classgerencialproduto = 'N';
              d426_ClassGerParcCondPgto = 'N';
              -- LOOP
              FOR r_transacao IN SELECT * FROM view_transacao WHERE codigo_transacao = r_docto_c.fat_transacao_id ORDER BY diretiva LOOP
                  --RAISE NOTICE 'Propriedade:% (%)',  r_transacao.diretiva, r_transacao.propriedade;
               -- diretiva/Regra 11 -( (%) Comissao vendedores)
                  IF r_transacao.diretiva = 11 THEN

                      d11_perc_comissao = CAST(r_transacao.propriedade AS DECIMAL(14,5));
                  END IF;

               -- diretiva/Regra 12 - ( Natureza: Entrada/Saida)
                  IF r_transacao.diretiva = 12 THEN
                      d12_natureza = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 13 - ( Tipo Docto: Nota Fiscao/Pedido/Orcamento)
                  IF r_transacao.diretiva = 13 THEN
                      d13_tipo_docto = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 14 - ( Calcular ICMS: Sim/Nao)
                  IF r_transacao.diretiva = 14 THEN
                      d14_calcularICMS = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 15 - ( Calcular IPI: Sim/Nao)
                  IF r_transacao.diretiva = 15 THEN
                      d15_calcularIPI = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 16 - ( Calcular FUNRURAL: Sim/Nao)
                  IF r_transacao.diretiva = 16 THEN
                      d16_calcularFUNRURAL = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 17 - ( Classificacao Fiscal(CFOP))
                  IF r_transacao.diretiva = 17 THEN
                      d17_CFOP = Trim(both ' ' from r_transacao.propriedade);
                  END IF;

               -- diretiva/Regra 18 - ( Usar classificacao fiscal(CFOP) do:(1-Cadastro de Transacao/2-Cadastro do produtos )
                  IF r_transacao.diretiva = 18 THEN
                      d18_usarCFOP = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 19 - (Devolucao:( Sim/Nao )
                  IF r_transacao.diretiva = 19 THEN
                      d19_devolucao = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 115 - (Nota Fiscal Eletronica: Sim/Nao)
                  IF r_transacao.diretiva = 115 THEN
                      d115_NFE = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
               -- diretiva/Regra 26 - ( Atualiza estoque: Sim/Nao.)
                  IF r_transacao.diretiva = 26 THEN
                      d26_atualiza_estoque = substring(r_transacao.propriedade from 1 for 1);
                  END IF;
                -- diretiva/Regra 27 - ( Tipo de Movimentacao: 0-Normal/1-Consignacao - Envio/ ...)
                  IF r_transacao.diretiva = 27 THEN
                      d27_tipo_mvto = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 28 - ( Alterar Custo Medio: Sim/Nao)
                  IF r_transacao.diretiva = 28 THEN
                      d28_alterarCM = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;

              -- diretiva/Regra 29 - ( Alterar Custo Ultima compra: Sim/Nao)
                  IF r_transacao.diretiva = 29 THEN
                      d29_alterrrCUC = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;
               -- diretiva/Regra 210 - ( Checar Saldo Negativo:  0-Checar saldo negativo/1-Vetar saida com saldo negativo)
                  IF r_transacao.diretiva = 210 THEN
                      d210_checarestoque = substring(r_transacao.propriedade from 1 for 1) ;
                  END IF;
              -- diretiva/Regra 49 - ( Lancar contas a receber/pagar: Sim/Nao)
                  IF r_transacao.diretiva = 49 THEN
                     d49_lancarCRP =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;
               -- diretiva/Regra 71 - ( -codigo classificacacao gerencial 1 )
                  IF r_transacao.diretiva = 71 THEN
                     d71_codigoclasse1 =  r_transacao.propriedade;
                  END IF;
               -- diretiva/Regra 72 - ( -codigo classificacacao gerencial 2 )
                  IF r_transacao.diretiva = 72 THEN
                     d72_codigoclasse2 =  r_transacao.propriedade;
                  END IF;
                -- diretiva/Regra 73 - ( -codigo classificacacao gerencial 3 )
                  IF r_transacao.diretiva = 73 THEN
                     d73_codigoclasse3 =  r_transacao.propriedade;
                  END IF;
                -- diretiva/Regra 410 - ( Atualiza saldo do C/C: Sim/Nao)
                  IF r_transacao.diretiva = 410 THEN
                      d410_atualizarsaldoCC = substring(r_transacao.propriedade from 1 for 1)  ;
                  END IF;

              -- diretiva/Regra 411 - ( Tipo lancamento: 0-Normal/1-Transferencia)
                  IF r_transacao.diretiva = 411 THEN
                      d411_tipolcto =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 412 - ( Natureza: Creditol/Debito)
                  IF r_transacao.diretiva = 412 THEN
                      d412_natureza = substring(r_transacao.propriedade from 1 for 1);
                  END IF;

              -- diretiva/Regra 413 - ( Comissao: 0-Creditar comissao/1-Debitar comissao/2-Nao comissionar)
                  IF r_transacao.diretiva = 413 THEN
                      d413_comissao =  substring(r_transacao.propriedade from 1 for 1);
                  END IF;

               -- diretiva/Regra 414 - (Regra Conciliar automatico: Sim/Nao)
                 IF r_transacao.diretiva = 414 THEN
                    d414_conciliar = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
               --Gerar Fatura: R/P=Receber/Pagar)
                 IF r_transacao.diretiva = 423 THEN
                    --d118_classgerencialproduto = 'N'; -- Se Diretiva Gera Fatura Classe Gerencia nao pode ser pelo produto
                    d423_gerar_fatura = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
               --Gerar Fatura: Condicção de Pgto
                 IF r_transacao.diretiva = 424 THEN
                    d424_CondPgto = CAST(r_transacao.propriedade AS INTEGER);
                 END IF;
               -- diretiva/Regra 118 - (Class.Gerencial do Produto: Sim/Nao)
                 IF r_transacao.diretiva = 118 THEN
                   d118_classgerencialproduto = substring(r_transacao.propriedade from 1 for 1);
                   --RAISE EXCEPTION 'd118_classgerencialproduto %.', d118_classgerencialproduto;
                 END IF;

              -- diretiva/Regra 426 - (Regra Classificacao Gerencial pela parcela da Condicao de Pgto
                 IF r_transacao.diretiva = 426 THEN
                    d426_ClassGerParcCondPgto = substring(r_transacao.propriedade from 1 for 1);
                 END IF;
              END LOOP;

               --
               -- atualizar apuracao de resultados de competencia (classificacao gerencial)
               --

              --Posiciona Parameters
                SELECT *
                  INTO r_parameters
                  FROM fat_parameters
                 LIMIT 1 ;

              -- Classificacao gerencia pelo produto
              IF COALESCE(d118_classgerencialproduto, 'N') = 'S' THEN
                 -- Campos
                  aCamposCl =  '{
                            financ_rp_id,
                            cad_cadastro_id,
                            financ_classificacao_g_id,
                            tipo,
                            regimecaixa,
                            regimecompetencia,
                            natureza,
                            datalcto,
                            valor}';
                 --Roda Itens do docto


                  FOR r_docto_i IN SELECT fat_produto.class_g_id as classe, sum(valor_total_liquido) as total_classe
                                     FROM fat_docto_i
                                     JOIN fat_produto ON id = fat_produto_id
                                    WHERE fat_docto_c_controle = r_docto_c.controle
                                    GROUP BY fat_produto.class_g_id
                                    LOOP

                        indicePA = 0;
                        IF(COALESCE(r_docto_c.valortotal_docto, 0) > 0) THEN
                            indicePA =  Round(NEW.valor_total / r_docto_c.valortotal_docto,3);
                        END IF;

                      --RAISE EXCEPTION 'Teste: %',indicePA;

                      aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                            || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                            || 	r_docto_i.classe                       	||','
                                            || 	New.natureza                         	||','
                                            || 	'false'                                	||','
                                            || 	'true'                                 	||','
                                            || 	CASE WHEN d12_natureza = 'E'THEN 'Debito'
                                                    ELSE 'Credito'
                                                END                                    	||','
                                            || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                            || to_Char(Round(r_docto_i.total_classe * indicePA,2), '999999999.99')     	||'}';
                                        --	|| to_Char(NEW.valor_total, '999999999.99')     	||'}';

                       IF aDadosCL IS NULL THEN
                            RAISE EXCEPTION 'Nao sera possivel gravar operacao.
                                     Dados para apauracao de resultaso incompleto. Verifique campos <NULL>:
                                    (id:%
                                      cad_cadastro_id:%
                                      classe:%
                                      tipo:%
                                      regimecaixa:%
                                      regimecompetencia:%
                                      natureza:%
                                      datalcto:%
                                      valor:%)',
                                       to_char(New.id,'9999999999')   ,
                                       to_char(NEW.cad_cadastro_id, '999999999')           ,
                                       r_docto_i.classe            ,
                                       New.natureza              ,
                                       'false'            ,
                                       'true'          ,
                                       CASE WHEN d12_natureza = 'E'THEN 'Debito'
                                            ELSE 'Credito'
                                       END,
                                       to_Char(NEW.emissao, 'dd/MM/yyyy')       ,
                                       to_Char(r_docto_i.total_classe, '999999999.99');
                      END IF;
                      IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                    RAISE EXCEPTION 'nao foi possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.controle, r_docto_i.classe;
                      END IF;
                  END LOOP;
              ELSIF COALESCE(d426_ClassGerParcCondPgto, 'N') = 'S' THEN
                   --Posiciona parcela da Condicao de pgto
                   SELECT *
                   INTO r_condpg_p
                   FROM fat_condpg_p
                   WHERE fat_condpg_id = r_docto_c.fat_condpg_id AND parcela = NEW.parcela;
                   IF FOUND THEN
                      aCamposCl =  '{
                                   financ_rp_id,
                                   cad_cadastro_id,
                                   financ_classificacao_g_id,
                                   tipo,
                                   regimecaixa,
                                   regimecompetencia,
                                   natureza,
                                   datalcto,
                                   valor}';
                      aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                            || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                            || 	to_char(r_condpg_p.financ_classificacao_g_id, '99999')         ||','
                                            ||  New.natureza                          	||','
                                            || 	'false'                                	||','
                                            || 	'true'                                 	||','
                                            || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                ELSE 'Credito'
                                                END                                    	||','
                                            || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                            || to_Char(New.valor_total, '999999999.99') ||'}';

                      IF aDadosCL IS NULL THEN
                                   RAISE EXCEPTION 'Nao sera possivel gravar operacao.
                                            Dados para apuracao de resultados pela Condicao de Pgto esta incompleto. Verifique campos <NULL>:
                                           (id:%
                                             cad_cadastro_id:%
                                             classe:%
                                             tipo:%
                                             regimecaixa:%
                                             regimecompetencia:%
                                             natureza:%
                                             datalcto:%
                                             valor:%)',
                                             to_char(New.id,'9999999999')   ,
                                             to_char(NEW.cad_cadastro_id, '999999999')           ,
                                             r_condpg_p.financ_classificacao_g_id            ,
                                             New.natureza              ,
                                             'false'            ,
                                             'true'          ,
                                              CASE WHEN d12_natureza = 'E'THEN 'Debito'
                                                   ELSE 'Credito'
                                              END,
                                              to_Char(NEW.emissao, 'dd/MM/yyyy')       ,
                                              to_Char(New.valor_total, '999999999.99');
                       END IF;
                       IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                          RAISE EXCEPTION 'nao foi possivel persistir classificacao gerencial pela Condicao de Pgto (Docto:% - CTRL:% CLASSE:%)!',NEW.docto , New.controle, r_docto_i.classe;
                       END IF;
                   END IF;
              ELSE
               --Gravar  classificacao gerencial
                 BEGIN
                     aCamposCl =  '{
                        financ_rp_id,
                        cad_cadastro_id,
                        financ_classificacao_g_id,
                        tipo,
                        regimecaixa,
                        regimecompetencia,
                        natureza,
                        datalcto,
                        valor}';

                   --RAISE EXCEPTION 'd71_codigoclasse1:%',d71_codigoclasse1 ;

                     IF d71_codigoclasse1 IS NOT NULL AND
                        d72_codigoclasse2 IS NOT NULL AND
                        d73_codigoclasse3 IS NOT NULL THEN
                        FOR i IN 1..3 LOOP

                            --Posiciona  classe
                            SELECT id, natureza
                             INTO r_classe
                             FROM financ_classificacao_g
                             WHERE financ_classificacao_g.id = CASE WHEN i=1 THEN d71_codigoclasse1
                                                                    WHEN i=2 THEN d72_codigoclasse2
                                                                    ELSE          d73_codigoclasse3
                                                                END;

                            aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                || 	CASE WHEN i=1 THEN d71_codigoclasse1
                                                         WHEN i=2 THEN d72_codigoclasse2
                                                         ELSE          d73_codigoclasse3
                                                    END                                   	||','
                                                ||  New.natureza                          	||','
                                                || 	'false'                                	||','
                                                || 	'true'                                 	||','
                                                || 	r_classe.natureza                      	||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                || to_Char(New.valor_total/3, '999999999.99')     	||'}';



        --                    aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
        --			                       		|| 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
        --							       		|| 	CASE WHEN i=1 THEN d71_codigoclasse1
        --								           		 WHEN i=2 THEN d72_codigoclasse2
        --								       			 ELSE          d73_codigoclasse3
        --							           		END                                   	||','
        --							  			||  New.natureza                          	||','
        --							  			|| 	'false'                                	||','
        --							  			|| 	'true'                                 	||','
        --							  			|| 	CASE WHEN New.natureza = 'P' THEN 'Debito'
        --								  	   		ELSE 'Credito'
        --							     			END                                    	||','
        --							  			|| to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
        --							  			|| to_Char(New.valor_total/3, '999999999.99')     	||'}';

                            IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                    RAISE EXCEPTION 'nao foi possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,
                                                                                    CASE WHEN i=1 THEN d71_codigoclasse1
                                                                                         WHEN i=2 THEN d72_codigoclasse2
                                                                                         ELSE          d73_codigoclasse3
                                                                                    END;
                            END IF;
                        END LOOP;
                     END IF;
                     IF d71_codigoclasse1 IS NOT NULL AND
                        d72_codigoclasse2 IS NOT NULL THEN
                        FOR i IN 1..2 LOOP
                            aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                                || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                                || 	CASE WHEN i=1 THEN d71_codigoclasse1
                                                         ELSE 	       d72_codigoclasse2
                                                    END                                   	||','
                                                || 	New.natureza                          	||','
                                                || 	'false'                                	||','
                                                || 	'true'                                 	||','
                                                || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                    ELSE 'Credito'
                                                    END                                    	||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                                || to_Char(New.valor_total/2, '999999999.99')     	||'}';

                            IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                    RAISE EXCEPTION 'nao possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,
                                                                                    CASE WHEN i=1 THEN d71_codigoclasse1
                                                                                         ELSE          d72_codigoclasse2
                                                                                    END;
                            END IF;
                        END LOOP;
                     END IF;
                     IF d71_codigoclasse1 IS NOT NULL THEN
                        aDadosCL  =   '{' 	|| 	to_char(New.id,'9999999999')   			||','
                                            || 	to_char(NEW.cad_cadastro_id, '999999999')   	||','
                                            || 	d71_codigoclasse1                      	||','
                                            || 	New.natureza                          	||','
                                            || 	'false'                                	||','
                                            || 	'true'                                 	||','
                                            || 	CASE WHEN New.natureza = 'P'THEN 'Debito'
                                                ELSE 'Credito'
                                                END                                    	||','
                                            || to_Char(NEW.emissao, 'dd/MM/yyyy')     	||','
                                            || to_Char(New.valor_total, '999999999.99')	||'}';

                            IF NOT padrao.gravarpCl(aCamposcl, aDadoscl)THEN
                                    RAISE EXCEPTION 'nao possivel persistir classificacao gerencial (NF:% - CTRL:% CLASSE:%)!',NEW.docto , New.fatura,d71_codigoclasse1;
                            END IF;
                     END IF;
                 END;
              END IF;

       END IF;
   END IF;

   RETURN NULL;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;


-- Gatilho {rp_integra()} Versao {001} Esquema {empresa} Descricao {Grava apuracao de resultado (classes de competencia) }
-- ------------------------------------------------------------

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