
-- StoreProcedure {lancamento_integra()} Versao {261} Esquema {padrao} Descricao {Grava integracao do documento}
-- ------------------------------------------------------------

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

 $BODY$


DECLARE
 --Variaveis
   dia                   double precision;
   ultimoDia             double precision;
   mes                   double precision;
   ano                   double precision;
   ultimoVcto            DATE;
   emissao               DATE;
   vencimento            DATE;
   valorNFsaldo          NUMERIC(14,2); -- Valor Total da NF
   valorPA               NUMERIC(14,2); -- Valor da Parcela
   valorPA_arred         NUMERIC(14,2); -- Valor da Parcela (Valor absoluto - arredeondado)
   valorAgg_arred        NUMERIC(14,2); -- Soma diferenca  arredendada
   valorComissao         NUMERIC(14,2); -- Valor da Comissao pelo recebimento
   pjurosmora            NUMERIC(14,6); -- (%)Juros Mora
   pmulta                NUMERIC(14,6); -- (%)multa por atraso
   pacrescimo            NUMERIC(14,6); -- (%)acrescimo
   ncarencia             NUMERIC( 4,0); -- (%)carencia
   rateio_desc_valor_nf  NUMERIC(14,6); --  Rateio Valor Desconto total docto
   rateio_desc_valor_nf_perc  NUMERIC(14,6); --  Rateio Valor Desconto total docto
   rateio_vl_unit_liq    NUMERIC(14,6); --  Rateio Valor unitario liquido
   rateio_vl_total_liq   NUMERIC(14,6); --  Rateio Valor total liquido
   total_prod2            NUMERIC(14,6);
   rateio_totalprod_bruto      NUMERIC(14,6);
   rateio_totalprod_liquido    NUMERIC(14,6);
   
   r_lctoitens_valor_unitario       NUMERIC(9,6);
   r_lctoitens_desc_valor_unitario  NUMERIC(9,6);
   r_lctoitens_desc_valor_promocao  NUMERIC(9,6);
   r_lctoitens_desc_valor_cliente   NUMERIC(9,6);
   r_lctoitens_desc_valor_avista    NUMERIC(9,6);
   r_lctoitens_qtde                 NUMERIC(14,6);
   
   
   Receber_Pagar         CHAR(1);
   aCampos               character varying[];
   aDados                character varying[];
   aCamposCl             character varying[];
   aDadosCl              character varying[];
   aCamposPed            character varying[];
   aDadosPed             character varying[];
   sCampos               VARCHAR;
   sDados                VARCHAR;
   totParcelas           NUMERIC(14,2);
   qtdeParcelas          integer;
   valorTotalNF          NUMERIC(14,2); -- Valor Total da NF
   rp_id_seq             integer; 
 
 --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)
   d119_NFe               CHAR(1); --Nota Fiasal eletronica: (Sim/Nao)
   d127_UsarClassTrib     CHAR(1); --Usar classificacao tributaria do:(1-Cadastro de Transacao/2-Cadastro do produtos
   d128_ClassTrib         CHAR(1); --Classificacao tributaria da transacao
   d133_InformeCongPg     CHAR(1); --Informe  cond. Pgto Cadastro (1-Nao Obrigatorio 2-Somente Avisar 3-Obrigatorio
   d134_InformeTabPreco   CHAR(1); --Informe Preco tabela (1-Nao Obrigatorio 2-Somente Avisar 3-Obrigatorio
 --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
   d426_ClassGerParcCondPgto  CHAR(1); --Classificacao Gerencial pela parcela da Condicao de Pgto
   d427_TipoCobPeloCadastro  CHAR(1); --Tipo de Cobranca pelo Cadastro(S/N)
--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
--Contabilidade

   
   r_transacao      RECORD;
   r_lctoitens      RECORD;
   r_condpgto       RECORD; -- Condicao de pgto
   r_condpgtop      RECORD; -- Condicao de pgto - parcelas
   r_finaceiro      RECORD; -- Financeiro - Gravar classificacao gerencial
   r_tipocobranca   RECORD; -- Tipo de cobranca
   r_parameters     RECORD; -- Parametros padrao do sistema
   r_doctoI         RECORD; -- Documento Itens
   r_unidade        RECORD; -- Cadastro de unidade p/ sincronizacao
   r_detail_sync    RECORD; -- Cadastro de faixas para sincronizacao
   r_listapre       RECORD; -- Lista de preco
   r_listapretab    RECORD; -- Lista de preco - tabela
   r_cad            RECORD; -- Cadastro Cadastro Destinatario
   r_filial         RECORD; -- Cadastro Cadastro Emitente
   r_doctoI_tot_prod   RECORD; -- Documento Itens
   r_tot_rp            RECORD; -- Total RP
   r_contem_Baixa      RECORD; -- Total RP
   r_serie             RECORD; -- cadastro de serie
   dados_adicionais TEXT; --dados adicionais
   texto_padrao TEXT; --dados adicionais
   arr TEXT[]; -- Array temporário p/ FUNRURAL
   arr2 TEXT[]; -- Array temporário p/ FUNRURAL

BEGIN
	
	
	
-- SE FOR UMA EXCLUSAO
   IF TG_OP = 'DELETE'  THEN
   -- DELETE  CONTAS A RECEBE/PAGAR
      --EXECUTE 'DELETE FROM ' || getesquema('pagar')||'.pagar WHERE cad_cadastro_id = '|| OLD.cad_cadastro_id ||'AND fatura = '|| OLD.fat_docto_c_controle ; 

	  DELETE FROM fat_docto_pc WHERE fat_docto_c_controle = old.controle;
	  DELETE FROM financ_rp WHERE status_reg = 'A' AND fatura = old.controle;



      IF LENGTH(TRIM(COALESCE(OLD.ctrl_agrupados,''))) > 0  THEN
         EXECUTE 'UPDATE fat_docto_c SET statuslcto = 94, statusdocto = ''LCTO DESAGRUPADO->'' WHERE controle IN ('|| OLD.ctrl_agrupados ||')' ;
         EXECUTE 'UPDATE fat_docto_i SET qtde = qtde WHERE fat_docto_c_controle IN ('|| OLD.ctrl_agrupados ||')' ;
      END IF;

      RETURN NULL;
   END IF;

   IF NEW.statuslcto = 7    OR
      NEW.statuslcto = 8    OR
      NEW.statuslcto = 17   OR
      NEW.statuslcto = 135  OR
      NEW.statuslcto = 205  OR
      NEW.statuslcto = 302  THEN
      -- LOOP PRODUTOS
      FOR r_doctoI IN SELECT fat_docto_c_controle, fat_produto_id
                        FROM fat_docto_i
                       WHERE fat_docto_c_controle  = old.controle
                       LOOP
     
   	      EXECUTE 'DELETE FROM fat_produto_movto WHERE fat_docto_c_controle = '|| r_doctoI.fat_docto_c_controle || 'and fat_produto_id = ' || r_doctoI.fat_produto_id;
	
	      IF NOT padrao.gravaEstoque(r_doctoI.fat_produto_id, old.cad_filial_id, old.dataentradasaida, false)THEN
	         RAISE EXCEPTION 'Nao foi possivel persistir estoque do produto (Cod.:% NF:% - CTRL:%)!', r_doctoI.fat_produto_id,OLD.numero_docto ,OLD.fat_docto_c_controle ;
	      END IF;
      END LOOP;
      
      DELETE FROM financ_rp    WHERE status_reg =  'A' AND fatura =  old.controle;
      DELETE FROM fat_docto_pc WHERE fat_docto_c_controle = old.controle;

      IF LENGTH(TRIM(COALESCE(OLD.ctrl_agrupados,''))) > 0  THEN
         EXECUTE 'UPDATE fat_docto_c SET statuslcto = 94, statusdocto = ''LCTO DESAGRUPADO->'' WHERE controle IN ('|| OLD.ctrl_agrupados ||')';
         EXECUTE 'UPDATE fat_docto_i SET qtde = qtde WHERE fat_docto_c_controle IN ('|| OLD.ctrl_agrupados ||')' ;
      END IF;
      
      RETURN NULL;
   END IF;
   
   
-- LOOP 
   FOR r_transacao IN SELECT * FROM view_transacao WHERE codigo_transacao = NEW.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);
       	  --RAISE EXCEPTION 'd12_natureza:(%)',  d12_natureza;
       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/Deduzir) 
       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 118 - (Class.Gerencial do Produto: Sim/Nao) 
       IF r_transacao.diretiva = 118 THEN
       	  d118_classgerencialproduto = substring(r_transacao.propriedade from 1 for 1);
       END IF;    
       -- diretiva/Regra 119 - (Nota Fiscal eletornica: Sim/Nao) 
       IF r_transacao.diretiva = 119 THEN
       	  d119_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;    
       --Usar classificacao tributaria do:(1-Cadastro de Transacao/2-Cadastro do produtos
       IF r_transacao.diretiva = 127 THEN
       	  d127_UsarClassTrib = substring(r_transacao.propriedade from 1 for 1)  ;
       END IF; 
     
     --Classificacao tributaria da transacao  
       IF r_transacao.diretiva = 128 THEN
       	  d128_ClassTrib = substring(r_transacao.propriedade from 1 for 1)  ;
       END IF; 
       --Informe Cond.Pgto Cadastro (1-Nao Obrigatorio 2-Somente Avisar 3-Obrigatorio
       IF r_transacao.diretiva = 133 THEN
       	  d133_InformeCongPg = substring(r_transacao.propriedade from 1 for 1)  ;
       END IF;
      --Informe Preco tabela (1-Nao Obrigatorio 2-Somente Avisar 3-Obrigatorio
       IF r_transacao.diretiva = 134 THEN
       	  d134_InformeTabPreco = substring(r_transacao.propriedade from 1 for 1)  ;
       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;

       -- 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;
        -- diretiva/Regra 427 - (Regra Tipo de Cobrabca para financeiro pelo cadastro
       IF r_transacao.diretiva = 427 THEN
       	  d427_TipoCobPeloCadastro = substring(r_transacao.propriedade from 1 for 1);
       END IF;

   END LOOP;
  
   -- Posiciona Cadastro (Destinatario)
   SELECT cad_cadastro.id, razaosocial, nomefantasia, pessoa, cad_mun_id,padrao.cad_mun.municipio AS municipio,
          fat_listapre_id, fat_listapre_tabela_tabela, fat_condpg_id, tipo_cobranca_id,
          padrao.cad_mun.uf AS uf,contribuinteicms, COALESCE(calculoicmssobre_ipi, false) AS calculoicmssobre_ipi ,
          CASE WHEN contribuinteicms = 'Sim' THEN 1 ELSE 2 END AS tipoa,  CASE WHEN contribuinteicms = 'Sim' THEN 3 ELSE 4 END AS tipoadif
     INTO r_cad
     FROM cad_cadastro
     LEFT JOIN padrao.cad_mun ON cad_cadastro.cad_mun_id = padrao.cad_mun.id
    WHERE cad_cadastro.id = NEW.cad_cadastro_id;

   -- Posiciona Filial (Emitente)
   SELECT cad_filial.id, razaosocial, nomefantasia, pessoa, cad_mun_id,padrao.cad_mun.municipio AS municipio, padrao.cad_mun.uf AS uf,substring(regimetributacao from 1 for 1) AS regimetributacao
     INTO r_filial
     FROM cad_filial
     LEFT JOIN padrao.cad_mun ON cad_filial.cad_mun_id = padrao.cad_mun.id
    WHERE cad_filial.id = NEW.cad_filial_id;    
   
--   IF d12_natureza = 'S' THEN 
--       -- Verifica Condicao de Pagamento
--       IF d133_InformeCongPg = '3'THEN
--	      --fat_listapre_id, fat_listapre_tabela_tabela, fat_condpg_id	
--	      SELECT id INTO r_condpgto from fat_condpg WHERE id = NEW.fat_condpg_id;
--	      IF NOT FOUND THEN
--	        RAISE EXCEPTION 'CONDICAO PGTO ( % ) NAO CADASTRADA. VERIFIQUE!',  NEW.fat_condpg_id; 
--	      END IF;  
--	      IF r_cad.fat_condpg_id != NEW.fat_condpg_id THEN
--	         RAISE EXCEPTION 'CONDICAO PGTO ( % ) DIFERENTE DA CONDICAO PGTO PERMITIDA ( % ). VERIFIQUE!',  NEW.fat_condpg_id, r_cad.fat_condpg_id; 
--	     END IF;
--       END IF;
--       
--       -- Verifica Lista e Tabela de Precos
--       IF d134_InformeTabPreco= '3'THEN
--	      SELECT id INTO r_listapre from fat_listapre WHERE id = NEW.fat_listapre_id;
--	      IF NOT FOUND THEN
--		     RAISE EXCEPTION 'LISTA DE PRECO ( % ) NAO CADASTRADA. VERIFIQUE!',  NEW.fat_listapre_id; 
--	      END IF; 
--	   
--	      SELECT tabela_id INTO r_listapretab from fat_listapre_tabela WHERE tabela_id =  NEW.fat_listapre_id AND fat_listapre_id = NEW.fat_listapre_tabela_tabela;
--	      IF NOT FOUND THEN
--		     RAISE EXCEPTION 'TABELA ( % ) DA LISTA DE PRECO ( % ) NAO CADASTRADA. VERIFIQUE!',  NEW.fat_listapre_tabela_tabela, NEW.fat_listapre_id; 
--	      END IF;
--
--          IF r_cad.fat_listapre_id != NEW.fat_listapre_id THEN
--	         RAISE EXCEPTION 'LISTA DE PRECO ( % ) DIFERENTE DA LISTA DE PRECO PERMITIDA ( % ). VERIFIQUE!',  NEW.fat_listapre_id, r_cad.fat_listapre_id; 
--	      END IF;
--	       
--	      IF r_cad.fat_listapre_tabela_tabela != NEW.fat_listapre_tabela_tabela THEN
--	         RAISE EXCEPTION 'TABELA DE PRECO ( % ) DIFERENTE DA TABELA DE PRECO PERMITIDA ( % ). VERIFIQUE!', r_cad.fat_listapre_tabela_tabela,NEW.fat_listapre_tabela_tabela; 
--	      END IF;
--	   END IF;
--       
--   END IF;
    
   
   --RAISE EXCEPTION 'numero doc:% (%)', new.seriedocto_codigo, new.numero_docto; 

    IF d26_atualiza_estoque = 'S' THEN
    	IF d29_alterrrCUC = 'S'  OR d28_alterarCM = 'S' THEN
       		UPDATE fat_docto_i SET qtde = qtde,custo_nf = valor_unitario_liquido, dataalteracao = current_date, horaalteracao = current_time WHERE fat_docto_c_controle = NEW.controle;
   		END IF;
    END IF;
   
   
   
   
   --
   -- grava consignacao/entrega futura 
   --
      
      
--      IF d27_tipo_mvto = '1' OR d27_tipo_mvto = '3' OR d27_tipo_mvto = '5' OR d27_tipo_mvto = '7' OR d27_tipo_mvto = 'O' OR d27_tipo_mvto = 'P' THEN
      IF d27_tipo_mvto IN('1' , '3', '5', '7', 'L', 'N', 'O', 'P') THEN
	       aCamposPed =  '{ fat_docto_c_controle,
		                   tipo,
		                   cad_cadastro_id,
		                   cad_filial_id,
		                   data_p,
		                   status_p}';
		    
		     
		      aDadosPed  =   '{' || to_char(NEW.controle,  '9999999999')   ||',' 
		     			         || cast(d27_tipo_mvto ||d12_natureza as varchar)  ||','
		     			         || to_Char(NEW.cad_cadastro_id, '999999999')  ||','
		     			         || to_Char(NEW.cad_filial_id, '999')      ||','
		     			         || to_Char(NEW.emissao, 'dd/MM/yyyy')     ||','
		     			         || 'P'                                    ||'}';
		     			          
		     --RAISE NOTICE 'aCamposPed: (%)',     aCamposPed;
		     --RAISE NOTICE 'aDadosPed: (%)',      aDados;
	   
		     IF NOT padrao.gravaPC(aCamposPed, aDadosPed)THEN
		        RAISE EXCEPTION 'nao possivel persistir saldo ds pedidos-fat_docto_pc (NF:% - CTRL:% - Tipo:%)!',NEW.numero_docto , New.controle, cast(d27_tipo_mvto ||d12_natureza as varchar) ;
		     END IF;
      END IF;
   
   -- -------------------------------------------------------
   -- Rateio Desconto Total
   -- -------------------------------------------------------
  SELECT SUM(((
        coalesce(valor_unitario,0)-
        coalesce(desc_valor_unitario,0)-
        coalesce(desc_valor_promocao,0)-
        coalesce(desc_valor_cliente,0)-
        coalesce(desc_valor_avista,0)-
        coalesce(desc_valor_avista,0))))   As    total_produto,
        SUM(coalesce(icms_valor,0)) as           total_icms_valor,
        SUM(coalesce(icms_basecalculo,0)) as     total_icms_base_calculo,
        SUM(coalesce(funrural_valor,0)) as       total_funrural_valor,
        SUM(coalesce(funrural_basecalculo,0)) as total_funrural_base_calculo,
        SUM(coalesce(ipi_valor,0)) as            total_ipi,
        SUM(coalesce(icms_subst_valor,0)) as     total_icms_st_base_calculo,
        SUM(coalesce(icms_outros,0)) as          total_icms_outros

   INTO r_doctoI_tot_prod     
   FROM fat_docto_i       
  WHERE fat_docto_c_controle = NEW.controle;
  
  rateio_totalprod_bruto   := 0;
  rateio_totalprod_liquido := 0;

  --IF TG_OP = 'INSERT' THEN
  --Posiciona Serie
    SELECT codigo, natureza, tipodocto
      INTO r_serie
      FROM padrao.fat_serie
     WHERE id = NEW.seriedocto_id;

     NEW.serie_natureza = r_serie.natureza;
     NEW.seriedocto_codigo = r_serie.codigo;

     --raise exception 'serie_natureza: % , seriedocto_codigo: %  ' ,  NEW.serie_natureza, NEW.seriedocto_codigo;


    -- valores totais de impostos dos itens.
     NEW.icms_valor = r_doctoI_tot_prod.total_icms_valor;
     NEW.icms_basecalculo = r_doctoI_tot_prod.total_icms_base_calculo;
     NEW.funrural_valor = r_doctoI_tot_prod.total_funrural_valor;
     NEW.ipi_valor = r_doctoI_tot_prod.total_ipi;
     NEW.icmssubst_basecalculo = r_doctoI_tot_prod.total_icms_st_base_calculo;

     IF TG_OP = 'INSERT' OR (TG_OP = 'UPDATE' AND  (NEW.icms_valor <> coalesce(OLD.icms_valor,0)
                                                        OR  NEW.icms_basecalculo <> coalesce(OLD.icms_basecalculo,0)
                                                        OR  NEW.funrural_valor <> coalesce(OLD.funrural_valor,0)
                                                        OR  NEW.ipi_valor <> coalesce(OLD.ipi_valor,0)
                                                        OR  NEW.icmssubst_basecalculo <> coalesce(OLD.icmssubst_basecalculo,0)  ) ) THEN

      -- raise exception '% , % , % , % , % ' , NEW.icms_valor, NEW.icms_basecalculo, NEW.funrural_valor, NEW.ipi_valor, NEW.icmssubst_basecalculo;
      -- Adiciona / replace funrural nos dados adicionais

	   IF d16_calcularFUNRURAL = 'S' OR  d16_calcularFUNRURAL = 'D' THEN
             NEW.dadosadicionais = COALESCE(NEW.dadosadicionais, '');
             IF COALESCE(NEW.dadosadicionais, '') = ''  THEN
                NEW.dadosadicionais = 'FUNRURAL: R$='||replace(CAST(ROUND(NEW.funrural_valor, 2) AS text),'.',',');
             ELSE
                 arr:= string_to_array(COALESCE(NEW.dadosadicionais, ''),chr(10)) ;
                 FOREACH dados_adicionais IN ARRAY arr
                 LOOP
                  IF dados_adicionais NOT LIKE '%FUNRURAL%' THEN
                      arr2:= array_append(arr2, dados_adicionais);
                  END IF;
                 END LOOP;
                 arr2:= array_append(arr2, 'FUNRURAL: R$='||replace(CAST(ROUND(NEW.funrural_valor, 2) AS text),'.',','));
                 --RAISE NOTICE 'antes: %', array_to_string(arr, chr(10));
                 --RAISE NOTICE 'depois: %', array_to_string(arr2, chr(10));
                 NEW.dadosadicionais := array_to_string(arr2, chr(10));
            END IF;
	   END IF;

--	   FOR r_lctoitens IN SELECT * FROM fat_docto_i WHERE fat_docto_c_controle = NEW.controle LOOP
--	        NEW.dadosadicionais = COALESCE(NEW.dadosadicionais, '');
--	        IF COALESCE(NEW.dadosadicionais, '') = ''  THEN
--               NEW.dadosadicionais =  padrao.gettextopadrao(CAST(r_lctoitens.icms_classtrib AS INT),r_cad.uf,1)|| CHR(10)|| padrao.gettextopadrao(CAST(r_lctoitens.icms_classtrib AS INT),r_cad.uf,2);
--            ELSE
--               arr:= string_to_array(COALESCE(NEW.dadosadicionais, ''),chr(10)) ;
--               FOREACH dados_adicionais IN ARRAY arr LOOP
--                       IF dados_adicionais NOT LIKE '%'|| LEFT(padrao.gettextopadrao(CAST(r_lctoitens.icms_classtrib AS INT),r_cad.uf,1),15)||'%' THEN
--                          arr2:= array_append(arr2, dados_adicionais);
--                          RAISE EXCEPTION 'TEXTO PADRAO: DADOS ADICIONAIS-> %  ARRAY2-> %)!',dados_adicionais, arr2 ;
--                       END IF;
--               END LOOP;
--               arr2:= array_append(arr2, padrao.gettextopadrao(CAST(r_lctoitens.icms_classtrib AS INT),r_cad.uf,1));
--               --RAISE NOTICE 'icms ANTES: %', array_to_string(arr, chr(10));
--               --RAISE NOTICE 'ICMS DEPOIS: %', array_to_string(arr2, chr(10));
--               NEW.dadosadicionais := array_to_string(arr2, chr(10));
--            END IF;
--	   END LOOP;

      UPDATE fat_docto_c  SET icms_valor = r_doctoI_tot_prod.total_icms_valor
            , icms_basecalculo = r_doctoI_tot_prod.total_icms_base_calculo
            , funrural_valor = r_doctoI_tot_prod.total_funrural_valor
            , ipi_valor = r_doctoI_tot_prod.total_ipi
            , dadosadicionais = NEW.dadosadicionais
            , serie_natureza = r_serie.natureza
            , seriedocto_codigo = r_serie.codigo
            , icmssubst_basecalculo = r_doctoI_tot_prod.total_icms_st_base_calculo WHERE  controle = NEW.controle;

     END IF;

     --raise exception '% , % , % , % , % ' , NEW.icms_valor, NEW.icms_basecalculo, NEW.funrural_valor, NEW.ipi_valor, NEW.icmssubst_basecalculo;
     --NEW.icms_outros = r_doctoI_tot_prod.total_icms_outros;



  --END IF;

  IF coalesce(NEW.descontodocto_valor,0) > 0 AND TG_OP = 'INSERT' THEN
	   FOR r_lctoitens IN SELECT * FROM fat_docto_i WHERE fat_docto_c_controle = NEW.controle LOOP
	        IF coalesce(NEW.descontodocto_valor,0) > 0 THEN
	       
                rateio_desc_valor_nf := (coalesce(NEW.descontodocto_valor,0) * (((coalesce(r_lctoitens.valor_unitario,0)-
                                                                    coalesce(r_lctoitens.desc_valor_unitario,0)-
                                                                    coalesce(r_lctoitens.desc_valor_promocao,0)-
                                                                    coalesce(r_lctoitens.desc_valor_cliente,0)-
                                                                    coalesce(r_lctoitens.desc_valor_avista,0)-
                                                                    coalesce(r_lctoitens.desc_valor_avista,0)) * r_lctoitens.qtde) /  r_doctoI_tot_prod.total_produto * 100) / 100) / r_lctoitens.qtde;


                rateio_desc_valor_nf_perc :=  rateio_desc_valor_nf /  r_lctoitens.valor_unitario * 100;


                rateio_vl_unit_liq  := Round(r_lctoitens.valor_unitario-
                                             coalesce(r_lctoitens.desc_valor_unitario,0)-
                                             coalesce(r_lctoitens.desc_valor_promocao,0)-
                                             coalesce(r_lctoitens.desc_valor_cliente,0)-
                                             coalesce(r_lctoitens.desc_valor_avista,0)-
                                             coalesce(r_lctoitens.desc_valor_avista,0)-
                                             rateio_desc_valor_nf,6);

                rateio_vl_total_liq := Round(rateio_vl_unit_liq * r_lctoitens. qtde,6);

                rateio_totalprod_bruto   =   Round(rateio_totalprod_bruto   + (r_lctoitens.valor_unitario * r_lctoitens.qtde),6)    ;
                rateio_totalprod_liquido =   Round(rateio_totalprod_liquido + rateio_vl_total_liq, 6);




              EXECUTE 'UPDATE fat_docto_i '||
                       '   SET desc_valor_nf = '|| COALESCE(rateio_desc_valor_nf, 0)||', desc_perc_nf ='|| COALESCE(rateio_desc_valor_nf_perc,0) || ', valor_unitario_liquido=' || COALESCE(rateio_vl_unit_liq,0) || ', valor_total_liquido =' || ROUND(COALESCE(rateio_vl_total_liq,0),2) ||
                       ' WHERE fat_docto_c_controle ='|| r_lctoitens.fat_docto_c_controle||
                       '   AND fat_produto_id ='|| r_lctoitens.fat_produto_id;
			          												
	      END IF;
	   END LOOP ;

	   
   ELSEIF TG_OP = 'UPDATE'  THEN
       IF (OLD.statuslcto = 100  AND NEW.statuslcto <> 135) OR
           OLD.statuslcto = 17  OR
           OLD.statuslcto = 135  OR
           OLD.statuslcto = 205  OR
           OLD.statuslcto = 302  THEN

          RETURN NULL;

       END IF;
   	   IF coalesce(NEW.descontodocto_valor,0) > 0 THEN
		   FOR r_lctoitens IN SELECT * FROM fat_docto_i WHERE fat_docto_c_controle = NEW.controle LOOP
		   
		        rateio_desc_valor_nf := (coalesce(NEW.descontodocto_valor,0) * (((coalesce(r_lctoitens.valor_unitario,0)-
		          												coalesce(r_lctoitens.desc_valor_unitario,0)-
		          												coalesce(r_lctoitens.desc_valor_promocao,0)- 
		          												coalesce(r_lctoitens.desc_valor_cliente,0)-
		          												coalesce(r_lctoitens.desc_valor_avista,0)-
		          												coalesce(r_lctoitens.desc_valor_avista,0)) * r_lctoitens.qtde) / r_doctoI_tot_prod.total_produto * 100) / 100) / r_lctoitens.qtde;
				
				rateio_desc_valor_nf_perc :=  rateio_desc_valor_nf /  r_lctoitens.valor_unitario * 100;      
				
						
				rateio_vl_unit_liq  := Round(r_lctoitens.valor_unitario-
				                             coalesce(r_lctoitens.desc_valor_unitario,0)-
				                             coalesce(r_lctoitens.desc_valor_promocao,0)-
				                             coalesce(r_lctoitens.desc_valor_cliente,0)-
				                             coalesce(r_lctoitens.desc_valor_avista,0)-
				                             coalesce(r_lctoitens.desc_valor_avista,0)-
				                             rateio_desc_valor_nf,6);
				                             
				rateio_vl_total_liq := Round(rateio_vl_unit_liq * r_lctoitens. qtde,6);
						
				rateio_totalprod_bruto   =   Round(rateio_totalprod_bruto   + (r_lctoitens.valor_unitario * r_lctoitens.qtde),6)    ;
                rateio_totalprod_liquido =   Round(rateio_totalprod_liquido + rateio_vl_total_liq, 6);


		        EXECUTE 'UPDATE fat_docto_i '||
		               '    SET desc_valor_nf = '|| COALESCE(rateio_desc_valor_nf,0)||', desc_perc_nf ='|| COALESCE(rateio_desc_valor_nf_perc,0) || ', valor_unitario_liquido=' || COALESCE(rateio_vl_unit_liq,0) || ', valor_total_liquido =' || ROUND(COALESCE(rateio_vl_total_liq,0),2) ||
		               '  WHERE fat_docto_c_controle ='|| r_lctoitens.fat_docto_c_controle||
		               '    AND fat_produto_id ='|| r_lctoitens.fat_produto_id;
				          												
		       
		   END LOOP ;
		   
	   END IF;
   END IF;   
   

   --Consiste Total do Docto
   --NEW.valortotal_docto = ROUND((NEW.totalliquidoprodutos + COALESCE(NEW.frete_valor,0) + COALESCE(NEW.seguro_valor,0) + COALESCE(NEW.despesa_valor,0) +  COALESCE(NEW.icmssubst_valor,0)) - COALESCE(NEW.desconto_valor,0),2);
   --RAISE EXCEPTION 'TOTAL DOCUMENTO :(%). VERIFIQUE !!!',  NEW.valortotal_docto;
   --********************************************************
   -- Lanca Contas a receber/ Pagar
   --********************************************************
   
 
  IF d49_lancarCRP != 'S'  OR
       NEW.statuslcto = 7    OR
       NEW.statuslcto = 8    OR
       NEW.statuslcto = 17   OR
       NEW.statuslcto = 95   OR
       NEW.statuslcto = 135  OR
       NEW.statuslcto = 205  OR
       NEW.statuslcto = 302  THEN
	  IF TG_OP = 'UPDATE'  THEN
	   	 -- Exclui Financeiro caso nao haja integracao com o mesmo
	   	 DELETE FROM financ_rp WHERE fatura = OLD.controle;
       --Consiste Itens do documento
       UPDATE fat_docto_i      SET qtde = qtde  WHERE fat_docto_c_controle = OLD.controle;
       --Consiste Itens do documento antendidos
       UPDATE fat_docto_pa   SET qtde=qtde  WHERE  fat_docto_pc_controle = OLD.controle;
       RETURN NULL;
	  END IF;
  END IF;
  IF d49_lancarCRP = 'S' THEN
       IF TG_OP = 'INSERT'  THEN
          --Posiciona cadastro de unidade (sync)
--		   SELECT id
--		     INTO r_unidade
--		     FROM cad_unidade
--		    ORDER BY id
--		    LIMIT 1;
--		   IF FOUND THEN
--		      -- Checa Faixa sync financ_rp
--		      SELECT *
--		      INTO   r_detail_sync
--		      FROM   sync_table_details
--		      WHERE  unidade_id = r_unidade.id
--		        AND  nome_table = 'fat_docto_c';
--		      IF FOUND THEN
--		         IF NOT (NEW.controle >= r_detail_sync.faixa_inicio AND NEW.controle <= r_detail_sync.faixa_fim) THEN
--		            RETURN NULL;
--		         END IF;
--		      END IF;
--		   END IF;

		   IF COALESCE(NEW.valortotal_docto,0) = 0 THEN
		       RETURN NULL;
		   END IF;
	   END IF;

       --exlcuir contas a receber/pagar
       IF TG_OP = 'UPDATE' THEN
        --Consiste Saldo
          UPDATE financ_rp_baixas SET  datapgto = datapgto  WHERE fat_docto_c_controle = OLD.controle;
        --Soma RP
--          SELECT SUM(round(coalesce(valor_saldo),2)) As total_saldo
--          INTO r_tot_rp
--          FROM financ_rp
--          WHERE fatura = OLD.controle AND (OLD.statuslcto = 6 OR OLD.statuslcto = 100) ;

       	    SELECT fat_docto_c_controle FROM financ_rp_baixas
              INTO r_contem_Baixa
             WHERE fat_docto_c_controle =  NEW.controle;

    	  IF FOUND AND d13_tipo_docto = 'N' THEN
       	     --RAISE EXCEPTION 'DOCUMENTO CONTEM BAIXA - CONTROLE:(%). VERIFIQUE !!!', OLD.controle;
	         RETURN NULL;
	      END IF;



	       --Posiciona condpg
			SELECT parcelas,prazoparcelas,vctoapartir,arred_parcela
			  INTO r_condpgto
			  FROM fat_condpg
			 WHERE id = NEW.fat_condpg_id;



           --Corrige documento no financ
           UPDATE financ_rp        SET docto = NEW.seriedocto_codigo||'-'||ltrim(to_char(NEW.numero_docto,'0999999'))||'-'||ltrim(to_char(financ_rp.parcela,'09'))||'/'||ltrim(to_char(r_condpgto.parcelas,'09')), prorrogacao = vcto, valor_saldo = valor_total  WHERE fatura = OLD.controle;
           --Consiste Itens do documento
           UPDATE fat_docto_i      SET qtde = qtde  WHERE fat_docto_c_controle = OLD.controle;
           --UPDATE financ_rp_baixas SET  datapgto = datapgto  WHERE fatura = OLD.controle;

           IF NEW.fat_condpg_id     = OLD.fat_condpg_id    AND 
              Trunc(NEW.valortotal_docto,2)  = Trunc(OLD.valortotal_docto,2) AND
              (Trunc(coalesce(NEW.funrural_valor, 0), 2 )  = Trunc(coalesce(OLD.funrural_valor,0), 2) OR d16_calcularFUNRURAL != 'D') AND
              NEW.cad_cadastro_id   = OLD.cad_cadastro_id  AND
              NEW.cad_filial_id     = OLD.cad_filial_id    AND
              NEW.emissao           = OLD.emissao          AND
              NEW.dataentradasaida  = OLD.dataentradasaida AND
              NEW.fat_transacao_id  = OLD.fat_transacao_id AND
              NEW.statuslcto        = OLD.statuslcto       THEN

              RETURN NULL;
           END IF;

           IF NEW.statuslcto     = 97   AND
              NEW.fat_condpg_id  = OLD.fat_condpg_id THEN
              RETURN NULL;
           END IF;

           
--	       IF NEW.fat_condpg_id     != OLD.fat_condpg_id    OR 
--	          NEW.valortotal_docto  != OLD.valortotal_docto OR
--	          NEW.nfesituacao       != OLD.nfesituacao      OR
--	          OLD.nfesituacao        = 'Cancelada'          OR
--              NEW.numero_docto      != OLD.numero_docto     THEN 
	          
	          --IF d12_natureza = 'E' THEN -- Entrada
	             -- DELETE FROM financ_rp WHERE cad_cadastro_id =  OLD.cad_cadastro_id  AND fatura = OLD.controle;
	               DELETE FROM financ_rp WHERE  fatura = OLD.controle;

	          --END IF; 
	          
--	       END IF;
	       IF NEW.nfesituacao = 'Cancelada' OR  COALESCE(NEW.valortotal_docto,0) = 0 THEN
	          RETURN NULL;
	       END IF;   
	   END IF;    
	 --Posiciona condpg
	   SELECT parcelas,prazoparcelas,vctoapartir, arred_parcela
	     INTO r_condpgto 
	     FROM fat_condpg 
	    WHERE id = NEW.fat_condpg_id;  
	 
	 
	 --Valor Nota Fiscal
	   valorNFsaldo = ROUND(NEW.valortotal_docto,2);
	   valorTotalNF = ROUND(NEW.valortotal_docto,2);
	   --RAISE EXCEPTION 'd16_calcularFUNRURAL (%) valorNFsaldo:(%) FUNRURAL:(%)  ', d16_calcularFUNRURAL,  ROUND(COALESCE(NEW.funrural_valor,0),2) , valorNFsaldo;
	   IF d16_calcularFUNRURAL = 'D' THEN
	      valorNFsaldo = Round(valorNFsaldo - ROUND(COALESCE(r_doctoI_tot_prod.total_funrural_valor,0),2),2);
	      valorTotalNF = Round(valorTotalNF - ROUND(COALESCE(r_doctoI_tot_prod.total_funrural_valor,0),2),2);
	      --RAISE EXCEPTION 'd16_calcularFUNRURAL (%) valorNFsaldo:(%) FUNRURAL:(%)  ', d16_calcularFUNRURAL,  ROUND(COALESCE(NEW.funrural_valor,0),2) , valorNFsaldo;
	   END IF;
	 --Loop parcelas
	   IF r_condpgto.vctoapartir = 'Data de Entrada/Saida' THEN
	      dia 		  = EXTRACT(DAY   FROM NEW.dataentradasaida);
          mes         = EXTRACT(MONTH FROM NEW.dataentradasaida);
          ano         = EXTRACT(YEAR  FROM NEW.dataentradasaida);
          ultimoVcto  = NEW.dataentradasaida;
          emissao     = NEW.dataentradasaida;
	   ELSE
	      dia 		  = EXTRACT(DAY   FROM NEW.emissao);
          mes         = EXTRACT(MONTH FROM NEW.emissao);
          ano         = EXTRACT(YEAR  FROM NEW.emissao);
          ultimoVcto  = NEW.emissao;
          emissao     = NEW.emissao;
	   END IF;

      valorAgg_arred = 0;
	  qtdeParcelas   = 0;
	  FOR r_condpgtop IN SELECT * 
	                       FROM fat_condpg_p 
	                      WHERE fat_condpg_id = NEW.fat_condpg_id
	                      ORDER BY parcela LOOP
	        
	      
	       
	       --RAISE NOTICE 'dia: (%)',     dia;
	       --RAISE NOTICE 'mes: (%)',     mes;
	       --RAISE NOTICE 'ano: (%)',     ano;
	       --RAISE NOTICE 'ultimoVcto: (%)',     ultimoVcto;
	     --Periodo (em construcao)
	       IF r_condpgto.prazoparcelas = 'Periodo' THEN
	          RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao' ; 
	       END IF;
	     --Mensal   
	       IF r_condpgto.prazoparcelas = 'Mensal' THEN

	          mes = mes + 1;
	          IF mes > 12 THEN
	             mes = 1;
	             ano = ano + 1;
	          END IF;

	          ultimoDia = EXTRACT( DAY FROM (date_trunc('MONTH', (Trim(to_Char(ano,'0999'))||Trim(to_Char(mes,'09'))||'01')::date) + INTERVAL '1 MONTH - 1 day')::DATE);
	          IF dia > ultimoDia THEN
	            dia = ultimoDia;
	          END IF;
	          --RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao % %', vencimento ,to_Char(ano,'9999')||'-'||to_Char(mes,'99'||'/'||to_Char(dia,'99');
	          vencimento = to_Date(Trim(to_Char(ano,'0999'))||'-'||Trim(to_Char(mes,'09'))||'-'||Trim(to_Char(dia,'09')),'YYYY-MM-DD');
	          --RAISE EXCEPTION 'Condicao de pagamento por periodo ainda em construcao %', vencimento ; 
	          IF vencimento IS NULL THEN    
	             vencimento = getLastDay(emissao);
	          END IF;
	       END IF;
	     
	    --Diario
	      IF r_condpgto.prazoparcelas = 'Diario' THEN
	         --vencimento = ultimoVcto + r_condpgtop.diasemissao;
	         vencimento = emissao + r_condpgtop.diasemissao;
	         ultimoVcto = vencimento;
	      END IF;


       IF r_condpgto.parcelas > 1 THEN
          IF r_condpgto.arred_Parcela THEN
             --valorPA  = FLOOR((valorTotalNF  * r_condpgtop.percentual) / 100);
            valorPA  = ROUND((valorTotalNF  * r_condpgtop.percentual) / 100);
          ELSE
            valorPA  = (valorTotalNF  * r_condpgtop.percentual) / 100;
          END IF;

          valorNFsaldo  = valorNFsaldo - valorPA;
          qtdeParcelas  = qtdeParcelas + 1;

          IF qtdeParcelas = r_condpgto.parcelas THEN
             IF valorNFsaldo <> 0 THEN
                valorPA = valorPA + valorNFsaldo;
             END IF;
          END IF;
       ELSE
           valorPA = valorTotalNF;
       END IF;


	     --RAISE EXCEPTION 'valorTotalNF:%  - valorPA:%',valorTotalNF,valorPA ; 
	     
	     if valorPA IS NULL THEN
	        valorPA = COALESCE(valorPA, 0);
	        --RAISE EXCEPTION 'Valor parcela NULL: %  - ValorSaldo: % Prazo Parcela: %', valorPA, valorNFsaldo, r_condpgto.prazoparcelas ;
	     END IF;   
	     --mCm          = Comissao * FaCondI->fpe / 100;
	   --Grava contas Receber/Pagar
	     Receber_Pagar = (CASE WHEN d12_natureza = 'E' THEN 'P' ELSE 'R' END);
	     Receber_Pagar = (CASE WHEN d13_tipo_docto <> 'N' THEN 'O' ELSE Receber_Pagar END);
	     --RAISE EXCEPTION 'Receber_Pagar:( % )',  Receber_Pagar;
	   --Checa constrant 
	     IF vencimento IS NULL THEN
	        RAISE EXCEPTION 'Vencimento nulo. Nao possivel persistir financeiro (NF:% - CTRL:%)!',NEW.numero_docto , New.controle ;
	     END IF;
	
	     IF r_condpgtop.financ_portador_id IS NULL THEN
	        RAISE EXCEPTION 'Portador nulo. Verique condicao de pgto (NF:% - CTRL:% C.Pgto.:%) !',NEW.numero_docto , New.controle, NEW.fat_condpg_id ;
	     END IF;

	     IF d427_TipoCobPeloCadastro = 'S' THEN
	         IF r_cad.tipo_cobranca_id IS NULL THEN
                RAISE EXCEPTION 'Tipo de cobranca nulo. Verique Cadastro Cliente/Fonecedor (NF:% - CTRL:% Cadastro:%) !',NEW.numero_docto , New.controle, NEW.cad_cadastro_id || ' - ' || r_cad.razaosocial  ;
             END IF;
	     ELSE
             IF r_condpgtop.financ_tipocobranca_id IS NULL THEN
                RAISE EXCEPTION 'Tipo de cobranca nulo. Verique condicao de pgto (NF:% - CTRL:% C.Pgto.:%) !',NEW.numero_docto , New.controle, NEW.fat_condpg_id ;
             END IF;
         END IF;
	     --Posiciona Serie
--	     SELECT codigo, natureza, tipodocto
--	       INTO r_serie
--	       FROM padrao.fat_serie
--	      WHERE id = NEW.seriedocto_id;

	     --Posiciona Tipo de Cobranca
	     IF d427_TipoCobPeloCadastro = 'S' THEN
	        SELECT multa, juro, desconto, def_juros,acrescimo,carencia, id
               INTO r_tipocobranca
               FROM padrao.financ_tipocobranca
              WHERE id = r_cad.tipo_cobranca_id;
	     ELSE
             SELECT multa, juro, desconto, def_juros,acrescimo,carencia, id
               INTO r_tipocobranca
               FROM padrao.financ_tipocobranca
              WHERE id = r_condpgtop.financ_tipocobranca_id;
	     END IF;
	     --Posiciona Tipo de Cobranca
	     SELECT *
	       INTO r_parameters 
	       FROM fat_parameters 
	      LIMIT 1 ;


	     --Checa JurosMora/Multa/Acrescimo
	     pjurosmora = CASE WHEN r_parameters.financjurosmora IS NULL THEN 0 ELSE r_parameters.financjurosmora END;
	     pmulta     = CASE WHEN r_parameters.financmulta     IS NULL THEN 0 ELSE r_parameters.financmulta     END;
	     pacrescimo = CASE WHEN r_parameters.financacrescimo IS NULL THEN 0 ELSE r_parameters.financacrescimo END;
	     ncarencia  = CASE WHEN r_parameters.financcarencia  IS NULL THEN 0 ELSE r_parameters.financcarencia  END;
	    
	     IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	        pjurosmora = CASE WHEN r_tipocobranca.juro      IS NULL THEN 0 ELSE r_tipocobranca.juro      END;
	        pmulta     = CASE WHEN r_tipocobranca.multa     IS NULL THEN 0 ELSE r_tipocobranca.multa     END;
	        pacrescimo = CASE WHEN r_tipocobranca.acrescimo IS NULL THEN 0 ELSE r_tipocobranca.acrescimo END;
	        ncarencia  = CASE WHEN r_tipocobranca.carencia  IS NULL THEN 0 ELSE r_tipocobranca.carencia  END;
	     END IF;
	     
	     
	     
	     aCampos =  '{ cad_cadastro_id,
	                   fatura,
	                   parcela,
	                   cad_filial_id,
	                   emissao,
	                   vcto,
	                   prorrogacao,
	                   docto,
	                   portador_id,
	                   tipocobranca_id,
	                   status_reg,
	                   moeda_id,
                       vendedor_id,
					   per_acrescimo,
					   per_jurosmora,
					   per_multa,	
                       carencia,
	                   valor_desconto,
					   valor_jurosmora,
					   valor_acrescimo,
	                   valor_total,
	                   valor_saldo}';
	       
	     
	                  
	      aDados  =   '{' || to_char(NEW.cad_cadastro_id,'999999999')   ||','
	                      || to_char(NEW.controle,  '9999999999')           ||',' 
	                      || to_char(r_condpgtop.parcela,  '999')           ||',' 
	     			      || to_Char(NEW.cad_filial_id, '999')              ||','
	     			      || to_Char(emissao, 'dd/MM/yyyy')             ||','
	     			      || to_Char(vencimento::DATE, 'dd/MM/yyyy')          ||','
	     			      || to_Char(vencimento::DATE, 'dd/MM/yyyy')          ||','
	     			      || Trim(r_serie.codigo)||'-'||ltrim(to_char(NEW.numero_docto,'0999999'))||'-'||ltrim(to_char(r_condpgtop.parcela,'09'))||'/'||ltrim(to_char(r_condpgto.parcelas,'09'))  ||','
	     			      || to_Char(r_condpgtop.financ_portador_id, '999')    ||','
	     			      || to_Char(r_tipocobranca.id, '999')||','
	     			      || 'A'                                            ||','
	     			      || 'R$'                                           ||',' 
	     			      || to_char(NEW.cadastro_vendedor_id,'999999999')   ||','
	     			      || to_Char(pacrescimo, '999999999.99')            ||','
	     			      || to_Char(pjurosmora, '999999999.99')            ||','
	     			      || to_Char(pmulta, '999999999.99')                ||','
	     			      || to_Char(ncarencia, '999999999')              ||','
	     			      || '0.00'                                         ||',' 
	     			      || '0.00'                                         ||',' 
	     			      || '0.00'                                         ||',' 
	     			      || to_Char(valorPA, '999999999.99')               ||','
	     			      || to_Char(valorPA, '999999999.99')               ||'}';
	     			          
	     --RAISE NOTICE 'aCampos fianc_rp: (%)',     aCampos;
	     --RAISE NOTICE 'aDados financ_rp: (%)',      aDados;
	     
	     IF aDados IS NULL THEN
	        RAISE EXCEPTION 'Nao sera possivel gravar docto. 
                             Dados para financeiro incompleto. Verifique campos <NULL>:
                            (cad_cadastro_id:%      
                              fatura:%              
                              parcela:%             
                              cad_filial_id:%       
                              emissao:%             
                              vcto:%                
                              prorrogacao:%         
                              docto:%               
                              portador_id:%     
                              tipocobranca_id:% 
                              status_reg:%          
                              moeda_id:% 
							  cadastro_vendedor_id:% 
                              per_acrescimo:%
					          per_jurosmora:%
					          per_multa:%	
                              carencia:%	       
                              valor_desconto:%      
                              valor_jurosmora:%     
                              valor_acrescimo:%     
                              valor_total:%         
                              valor_saldo:%)',      
                               to_char(NEW.cad_cadastro_id, '999999999')   ,
                               to_char(NEW.controle,  '9999999999')           ,  
                               to_char(r_condpgtop.parcela,  '999')           ,  
                               to_Char(NEW.cad_filial_id, '999')              ,  
                               to_Char(emissao, 'dd/MM/yyyy')             ,
                               to_Char(vencimento::DATE, 'dd/MM/yyyy')          ,
                               to_Char(vencimento::DATE, 'dd/MM/yyyy')          ,
                               NEW.seriedocto_codigo||'-'||NEW.numero_docto||'-'||to_char(r_condpgtop.parcela,  '99')||'/'||to_char(r_condpgto.parcelas, '99'),
                               to_Char(r_condpgtop.financ_portador_id, '999')    ,  
                               to_Char(r_tipocobranca.id, '999'),
                               'A'                                            ,  
                               'R$'                                           , 
                               to_char(NEW.cadastro_vendedor_id,'9999999999')   ,
                               to_Char(pacrescimo, '999999999.99')            ,
	     			           to_Char(pjurosmora, '999999999.99')            ,
	     			           to_Char(pmulta, '999999999.99')               ,
	     			           to_Char(ncarencia, '999999999')               ,
                               '0.00'                                         ,  
                               '0.00'                                         ,  
                               '0.00'                                         ,  
                               to_Char(valorPA, '999999999.99')               ,  
                               to_Char(valorPA, '999999999.99')               ; 
                            
	     END IF;
	     
	     --RAISE NOTICE 'aDados: (%)',      aDados;
	     
	     
	     IF NOT padrao.gravarp(Receber_Pagar, aCampos, aDados)THEN
	        RAISE EXCEPTION 'nao possivel persistir financeiro (NF:% - CTRL:%)!',NEW.numero_docto , New.controle ;
	     END IF;

	  END LOOP;
   END IF; 

   RETURN NULL;
END;


$BODY$

LANGUAGE 'plpgsql' VOLATILE;

-- Gatilho {lancamento_integra()} Versao {003} Esquema {empresa} Descricao {Grava integracao do documento }
-- ------------------------------------------------------------

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