-- StoreProcedure {rpbaixa_integra()} Versao {004} Esquema {padrao} Descricao {Grava apuracao de resultado (classes de competencia)}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.rpbaixa_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
   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)
 --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
--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_transacao      RECORD;
   r_tipocobranca   RECORD;
   r_parameters     RECORD;  
   r_rbaixa         RECORD;
   r_financ_rpbaixa RECORD;
   r_pbaixa         RECORD; -- Financeiro - Gravar classificacao gerencial

   v_retorna        boolean;
BEGIN
   IF TG_OP <> 'DELETE' THEN  	
	  -- 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);
	      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;   
	  END LOOP;	
		 
	   --
	   -- atualizar apuracao de resultados de competencia (classificacao gerencial)
	   --
		     
	  --Posiciona Baixas
	    SELECT *
	      INTO r_parameters 
	      FROM fat_parameters 
	     LIMIT 1 ;    

	   IF TG_OP <> 'DELETE' THEN
           aCampos =  '{financ_cc_id,
                        financ_classificacao_g_id,
                        financ_cc_movto_controle,
                        datalcto,
                        natureza,
                        valor,
                        tipolcto}';

            FOR I IN 1..4 LOOP -- (juros recebidos, descontos obtidos(recebido), devolucoes de compra, despesas acessorias)
                CASE
                WHEN I = 1 THEN  aDados  =   '{'|| to_char(NEW.financ_cc_id,'99999')   ||','
                                                || to_char(r_parameters.financjurosrecebidos,  '999999')           ||','
                                                || to_char(NEW.financ_cc_movto_controle,  '9999999999')            ||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')             ||','
                                                || CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ||','
                                                || to_Char(NEW.valorjuros, '999999999.99')               ||','
                                                || 'A'               ||'}';

                                 IF COALESCE(r_parameters.financjurosrecebidos, 0) > 0  AND  NEW.valorjuros > 0 THEN
                                    IF aDados IS NULL THEN
                                        RAISE EXCEPTION 'Nao sera possivel persistir apuracao de resultado (classificacao gerencial).
                                             Dados para persistencia incompleto. Verifique campos <NULL>:
                                            (financ_cc_id:%
                                              financ_classificacao_g_id:%
                                              financ_cc_movto_controle:%
                                              datalcto:%
                                              natureza:%
                                              valor:%
                                              tipolcto:%)',
                                               to_char(NEW.financ_cc_id,'99999')   ,
                                               to_char(r_parameters.financjurosrecebidos,  '999999'),
                                               to_char(NEW.financ_cc_movto_controle,  '9999999999'),
                                               to_Char(NEW.emissao, 'dd/MM/yyyy'),
                                               CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END  ,
                                               to_Char(NEW.valorjuros, '999999999.99')    ,
                                               'A'               ;

                                    END IF;

                                        --RAISE NOTICE 'aDados: (%)',      aDados;

                                    IF NOT gravacccl(aCampos, aDados)THEN
                                       RAISE EXCEPTION 'nao possivel persistir apuracao de resultado (classes de competencia) (Codigo:% - Valor:%)!',r_parameters.financjurosrecebidos , NEW.valorjuros ;
                                    END IF;
                                 END IF;
                 WHEN I = 2 THEN  aDados  =   '{'|| to_char(NEW.financ_cc_id,'99999')   ||','
                                                 || to_char(r_parameters.financdescobtidos,  '999999')           ||','
                                                 || to_char(NEW.financ_cc_movto_controle,  '9999999999')          ||','
                                                 || to_Char(NEW.emissao, 'dd/MM/yyyy')             ||','
                                                 || CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ||','
                                                 || to_Char(NEW.valordesconto, '999999999.99')               ||','
                                                 || 'A'              ||'}';
                                   IF COALESCE(r_parameters.financdescobtidos, 0) > 0 AND  NEW.valordesconto > 0	THEN
                                      IF aDados IS NULL THEN
                                        RAISE EXCEPTION 'Nao sera possivel classificacao gerencial.
                                               Dados para persistencia incompleto. Verifique campos <NULL>:
                                              (financ_cc_id:%
                                                financ_classificacao_g_id:%
                                                financ_cc_movto_controle:%
                                                datalcto:%
                                                natureza:%
                                                valor:%
                                                tipolcto:%)',
                                                 to_char(NEW.financ_cc_id,'99999')   ,
                                                 to_char(r_parameters.financdescobtidos,  '999999'),
                                                 to_char(NEW.financ_cc_movto_controle,  '9999999999') ,
                                                 to_Char(NEW.emissao, 'dd/MM/yyyy'),
                                                 CASE WHEN d412_natureza = 'C' THEN 'Credito,' ELSE 'Debito' END  ,
                                                 to_Char(NEW.valordesconto, '999999999.99')    ,
                                                 'A'               ;

                                      END IF;

                                          --RAISE NOTICE 'aDados: (%)',      aDados;

                                      IF NOT gravacccl(aCampos, aDados)THEN
                                         RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',r_parameters.financdescobtidos , NEW.valordesconto ;
                                      END IF;
                                    END IF;
                WHEN I = 3 THEN  aDados  =   '{'|| to_char(NEW.financ_cc_id,'99999')   ||','
                                                || to_char(r_parameters.financdevrecebidas,  '999999')           ||','
                                                || to_char(NEW.financ_cc_movto_controle,  '9999999999')            ||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')             ||','
                                                || CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ||','
                                                || to_Char(NEW.valordevolucao, '999999999.99')                ||','
                                                || 'A'               ||'}';
                                    IF COALESCE(r_parameters.financdevrecebidas, 0) > 0 AND  NEW.valordevolucao > 0	THEN
                                       IF aDados IS NULL THEN
                                          RAISE EXCEPTION 'Nao sera possivel classificacao gerencial.
                                                Dados para persistencia incompleto. Verifique campos <NULL>:
                                               (financ_cc_id:%
                                                 financ_classificacao_g_id:%
                                                 financ_cc_movto_controle:%
                                                 datalcto:%
                                                 natureza:%
                                                 valor:%
                                                 tipolcto:%)',
                                                  to_char(NEW.financ_cc_id,'99999')   ,
                                                  to_char(r_parameters.financdevrecebidas,  '999'),
                                                  to_char(NEW.financ_cc_movto_controle,  '9999999999'),
                                                  to_Char(NEW.emissao, 'dd/MM/yyyy'),
                                                  CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ,
                                                  to_Char(NEW.valordevolucao, '999999999.99')    ,
                                                  'A'               ;

                                       END IF;

                                           --RAISE NOTICE 'aDados: (%)',      aDados;

                                       IF NOT gravacccl(aCampos, aDados)THEN
                                          RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',r_parameters.financdevrecebidas , NEW.valordevolucao ;
                                       END IF;
                                     END IF;
                WHEN I = 4 THEN  aDados  =   '{'||  to_char(NEW.financ_cc_id,'99999')   ||','
                                                || to_char(r_parameters.financdespacessoriasrec,  '999999')           ||','
                                                || to_char(NEW.financ_cc_movto_controle,  '9999999999')           ||','
                                                || to_Char(NEW.emissao, 'dd/MM/yyyy')             ||','
                                                || CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ||','
                                                || to_Char(new.valordespesa, '999999999.99')               ||','
                                                || 'A'                ||'}';
                                   IF COALESCE(r_parameters.financdespacessoriasrec, 0) > 0 AND  NEW.valordespesa > 0	THEN
                                      IF aDados IS NULL THEN
                                        RAISE EXCEPTION 'Nao sera possivel classificacao gerencial.
                                               Dados para persistencia incompleto. Verifique campos <NULL>:
                                              (financ_cc_id:%
                                                financ_classificacao_g_id:%
                                                financ_cc_movto_controle:%
                                                datalcto:%
                                                natureza:%
                                                valor:%
                                                tipolcto:%)',
                                                 to_char(NEW.financ_cc_id,'99999')   ,
                                                 to_char(r_parameters.financdespacessoriasrec,  '999'),
                                                 to_char(NEW.financ_cc_movto_controle,  '9999999999'),
                                                 to_Char(NEW.emissao, 'dd/MM/yyyy'),
                                                 CASE WHEN d412_natureza = 'C' THEN 'Credito' ELSE 'Debito' END ,
                                                 to_Char(NEW.valordespesa, '999999999.99')   ,
                                                 'A'               ;

                                      END IF;

                                          --RAISE NOTICE 'aDados: (%)',      aDados;

                                          IF NOT gravacccl(aCampos, aDados)THEN
                                             RAISE EXCEPTION 'nao possivel persistir classes de competencia (Codigo:% - Valor:%)!',r_parameters.financdespacessoriasrec , NEW.valordespesa ;
                                          END IF;
                                        END IF;
                    END CASE;
                END LOOP;
           END IF;
	END IF;    			      
	  			      
     

   
   RETURN NULL;
END;

$BODY$

LANGUAGE 'plpgsql' VOLATILE;


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

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