-- Storeprocedure {getCalcJuros(financ_rp_id, retorno)} Versao {049} Esquema {padrao} Descricao {Retornar juro do titulo em atraso}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.getCalcJuros(integer, char(1))
  RETURNS NUMERIC(14,6) AS
$BODY$

 DECLARE
 --p_cad_cadastro_id     alias for $1; -- Id Cli/For
 p_financ_rp_id        alias for $1; -- financ_rp_id
 --p_parcela             alias for $3; -- Parcela
 --p_rp                  alias for $2; -- RP - Receber/Pagar
 p_retorno             alias for $2; -- 1)JurosMora 2)acrescimo 3)descontos 4)Saldo do titulo
 v_retorna             NUMERIC(14,6);
 pjurosmora            NUMERIC(14,6); -- (%)Juros Mora
 pmulta                NUMERIC(14,6); -- (%)multa por atraso
 pacrescimo            NUMERIC(14,6); -- (%)acrescimo
 ncarencia             NUMERIC(14,6); -- dias carencia
 vmulta                NUMERIC(14,6); -- valor da multa
 vjuros                NUMERIC(14,6); -- valor do juro
 vacrescimo            NUMERIC(14,6); -- valor do acrescimo financeiro 
 vDescAntecipacao      NUMERIC(14,6); -- valor do acrescimo financeiro 
 ndias                 INT;           -- dias vencido
 ndiasDescAntecipado   NUMERIC(5,0);  -- dias antecipado para desconto  
 pDescAnticipado       NUMERIC(14,6); -- (%) de desconto para  pgto antecipado   
 nperiodocap           INT;           -- periodo de capitalizacao
 x                     NUMERIC;
 y                     NUMERIC;
 v_database            DATE;   
 ctipotaxa             CHAR(1);       -- Tipo taxa
 ctipojuro             CHAR(1);       -- Tipo juro 
 r_rp                  RECORD;
 r_tipocobranca        RECORD;
 r_parameters          RECORD;
 r_cadastro            RECORD;
 r_ultimaBx            RECORD;
 
 BEGIN
	 ncarencia        = 0;
	 vmulta           = 0;
	 vjuros           = 0;
	 pacrescimo       = 0;
	 ndias            = 0;
	 pjurosmora       = 0;
	 vDescAntecipacao = 0;
	 vacrescimo       = 0;

		--Posiciona o titulo
	    SELECT id,cad_filial_id,vcto,CASE WHEN vcto < prorrogacao THEN prorrogacao ELSE vcto END AS prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_rp AS R
	      INTO r_rp
	     WHERE R.id              = p_financ_rp_id;

	     IF FOUND THEN
	     
	     	  v_database =  r_rp.prorrogacao;
         
	     	  --Ultimo pgto 
	          --IF r_rp.valor_total != r_rp.valor_saldo THEN 
				   SELECT financ_rp_id,  datapgto, valor_juros, valor_recebido,valor_despesasac,valor_devolucaom
				          valor_descontos, valor_liquido
				     INTO r_ultimaBx
				     FROM financ_rp_baixas
				    WHERE financ_rp_id = r_rp.id
				      AND datapgto    <= current_date
				    ORDER BY datapgto DESC, financ_rp_id DESC
				    LIMIT 1;
				    
				   -- ORDER BY DataMovto DESC, fat_docto_c_controle DESC
				   IF FOUND  AND  r_ultimaBx.financ_rp_id    =  r_rp.id AND  r_rp.prorrogacao < r_ultimaBx.datapgto THEN
			          v_database =  r_ultimaBx.datapgto;
				   ELSE
				      v_database =  r_rp.prorrogacao;
				   END IF;
	        --END IF; 	     
	      
	     
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM padrao.financ_tipocobranca
	         WHERE id = r_rp.tipocobranca_id; 
	        
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_parameters 
	          FROM fat_parameters 
	          LIMIT 1 ; 
	          
	        --Tipo taxa e tipo de Juros
	        ctipojuro = substring(r_parameters.financtipojuro from 1 for 1);
	        ctipotaxa = substring(r_parameters.financtipotaxa from 1 for 1);
	        --configuracao de desconto para pagamento antecipado
	        ndiasDescAntecipado = CASE WHEN r_parameters.financdescate      IS NULL THEN 0 ELSE r_parameters.financdescate      END;
	        pDescAnticipado     = CASE WHEN r_parameters.financdescanterior IS NULL THEN 0 ELSE r_parameters.financdescanterior END;
	        
	        IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	           ctipojuro = substring(r_tipocobranca.tipojuro from 1 for 1);
	           ctipotaxa = substring(r_tipocobranca.tipotaxa from 1 for 1);
	           
	          ndiasDescAntecipado = coalesce( r_tipocobranca.desc_ate, 0);
	          pDescAnticipado     = coalesce( r_tipocobranca.desc_ant, 0);
		    END IF;
		    
	        --Checa JurosMora/Multa/Acrescimo
		    pjurosmora = coalesce( r_rp.per_jurosmora / 30, 0);
		    pmulta     = coalesce( r_rp.per_multa, 0);
		    pacrescimo = coalesce( r_rp.per_acrescimo, 0);
		    ncarencia  = coalesce( r_rp.carencia, 0);
		    ndias      = Current_date - v_database;
		    nperiodocap= 30;
		    
		    --RAISE NOTICE 'ndiasDescAntecipado: (%)',     ndiasDescAntecipado;
		    --RAISE NOTICE 'pDescAnticipado: (%)',     pDescAnticipado;
		    --RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
		    --RAISE NOTICE 'pmulta: (%)',         pmulta;
		    --RAISE NOTICE 'pacrescimo: (%)',     pacrescimo;
		    --RAISE NOTICE 'ncarencia: (%)',      ncarencia;
		    --RAISE NOTICE 'ndias: (%)',          ndias;
		    --RAISE NOTICE 'nperiodocap: (%)',    nperiodocap;
		    --RAISE NOTICE 'ctipojuro: (%)',    ctipojuro;
		    --RAISE NOTICE 'ctipotaxa: (%)',    ctipotaxa;
		    
		        
		    
		    IF ndias > ncarencia AND COALESCE(r_rp.valor_saldo,0) > 0 THEN
		       vmulta     = ROUND(r_rp.valor_saldo * pmulta     / 100,2);
		       vacrescimo = ROUND(r_rp.valor_saldo * pacrescimo / 100,2);
	 	       IF ctipojuro = 'S'   THEN -- Simples
                  IF ctipotaxa = '1' THEN -- por dentro
                     --vjuros = @ROUND((r_rp.valor_saldo / ((100 - (pjurosmora * ndias)) / 100)) - r_rp.valor_saldo,2);
                      vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;  
                  IF ctipotaxa = '2' THEN -- por fora
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;
               END IF; 
               IF ctipojuro = 'C'   THEN -- Composto
                  pjurosmora = pjurosmora * nperiodocap;

                  IF ctipotaxa = '1' THEN -- por dentro
                     pjurosmora = pjurosmora / (100 - pjurosmora) * 100;
                  END IF;

                 x = 1 + pjurosmora / 100; 
                 y = cast(ndias as float) / nperiodocap;
                 
                 vjuros = ROUND(r_rp.valor_saldo * POWER(x,y) - r_rp.valor_saldo,2);
                 
                 
               END IF;
		    ELSE
		       IF ndiasDescAntecipado >= 0 THEN
		          IF ndiasDescAntecipado <= cast(@ndias as NUMERIC) THEN
		              
		             --RAISE NOTICE 'ndiasDescAntecipado <= cast(ndias as NUMERIC): (%)',     ndiasDescAntecipado > cast(ndias as NUMERIC);
		             
		             vDescAntecipacao = r_rp.valor_saldo * pDescAnticipado / 100;
		             
		             --RAISE NOTICE 'cast(@ndias as NUMERIC): (%)',    cast(@ndias as NUMERIC);
		             --RAISE NOTICE 'r_rp.valor_saldo: (%)',    r_rp.valor_saldo;
		             --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
		             
		          
		          END IF;
		       END IF;
            END IF;
	     END IF; 
	     
	   -- UPDATE financ_receber
       --    SET valor_jurosmora = vjuros, valor_acrescimo =  vmulta + vacrescimo, valor_desconto = vDescAntecipacao
       --  WHERE cad_cadastro_id = p_cad_cadastro_id
       --    AND fatura          = p_financ_rp_id
       --    AND parcela         = p_parcela;
           
	--END IF ;
	


	--RAISE NOTICE 'nperiodocap: (%)',     nperiodocap;
	--RAISE NOTICE 'x: (%)',     x;
	--RAISE NOTICE 'y: (%) - (%)',     y, TRUNC(ndias / nperiodocap,9);
	--RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
    --RAISE NOTICE 'r_rp.valor_saldo: (%)',     r_rp.valor_saldo;
    --RAISE NOTICE 'vjuros: (%)',     vjuros;
    --RAISE NOTICE 'vmulta: (%)',     vmulta;
    --RAISE NOTICE 'vacrescimo: (%)',     vacrescimo;
    --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
    
    IF p_retorno = '1' THEN
       RETURN COALESCE(vjuros,0) ;
    END IF;
    IF p_retorno = '2' THEN
       RETURN ROUND(COALESCE(vmulta,0) + COALESCE(vacrescimo,0),3);
    END IF;
    IF p_retorno = '3' THEN
       RETURN COALESCE(vDescAntecipacao,0);
    END IF;
    IF p_retorno = '4' THEN
       RETURN ROUND(r_rp.valor_saldo + ((COALESCE(vmulta,0) + COALESCE(vacrescimo,0) + COALESCE(vjuros,0)) - COALESCE(vDescAntecipacao,0)),3);
    END IF;
    
    return 0;
    
    
 END;
 
 $BODY$
 
LANGUAGE 'plpgsql' VOLATILE;

-- Storeprocedure {getCalcJuros(cad_cadastro_id , fatura , parcela, rp, retorno)} Versao {045} Esquema {padrao} Descricao {Retornar juro do titulo em atraso}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.getCalcJuros(integer , bigint , integer, char(1), char(1))
  RETURNS NUMERIC(14,6) AS
$BODY$

 DECLARE
 p_cad_cadastro_id     alias for $1; -- Id Cli/For
 p_financ_rp_id              alias for $2; -- Fatura
 p_parcela             alias for $3; -- Parcela
 p_rp                  alias for $4; -- RP - Receber/Pagar
 p_retorno             alias for $5; -- 1)JurosMora 2)acrescimo 3)descontos 4)Saldo do titulo
 v_retorna             NUMERIC(14,6);
 pjurosmora            NUMERIC(14,6); -- (%)Juros Mora
 pmulta                NUMERIC(14,6); -- (%)multa por atraso
 pacrescimo            NUMERIC(14,6); -- (%)acrescimo
 ncarencia             NUMERIC(14,6); -- dias carencia
 vmulta                NUMERIC(14,6); -- valor da multa
 vjuros                NUMERIC(14,6); -- valor do juro
 vacrescimo            NUMERIC(14,6); -- valor do acrescimo financeiro 
 vDescAntecipacao      NUMERIC(14,6); -- valor do acrescimo financeiro 
 ndias                 INT;           -- dias vencido
 ndiasDescAntecipado   NUMERIC(5,0);  -- dias antecipado para desconto  
 pDescAnticipado       NUMERIC(14,6); -- (%) de desconto para  pgto antecipado   
 nperiodocap           INT;           -- periodo de capitalizacao
 x                     NUMERIC;
 y                     NUMERIC;
 v_database            DATE;   
 ctipotaxa             CHAR(1);       -- Tipo taxa
 ctipojuro             CHAR(1);       -- Tipo juro 
 r_rp                  RECORD;
 r_tipocobranca        RECORD;
 r_parameters          RECORD;
 r_cadastro            RECORD;
 r_ultimaBx            RECORD;
 
 BEGIN
	 ncarencia        = 0;
	 vmulta           = 0;
	 vjuros           = 0;
	 pacrescimo       = 0;
	 ndias            = 0;
	 pjurosmora       = 0;
	 vDescAntecipacao = 0;
	 vacrescimo       = 0;

 	 IF p_rp = 'R' THEN
		--Posiciona o titulo  
	    SELECT id,cad_filial_id,vcto,CASE WHEN vcto < prorrogacao THEN prorrogacao ELSE vcto END AS prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_rp AS R
	      INTO r_rp
	     WHERE R.cad_cadastro_id = p_cad_cadastro_id
	       AND R.fatura          = p_financ_rp_id
	       AND R.parcela         = p_parcela
	       AND R.natureza = 'R';
	    
	     
	      
	     IF FOUND THEN
	     
	     	  v_database =  r_rp.prorrogacao;
         
	     	  --Ultimo pgto 
	          --IF r_rp.valor_total != r_rp.valor_saldo THEN 
				   SELECT financ_rp_id,  datapgto, valor_juros, valor_recebido,valor_despesasac,valor_devolucaom
				          valor_descontos, valor_liquido
				     INTO r_ultimaBx
				     FROM financ_rp_baixas
				    WHERE financ_rp_id = r_rp.id
				      AND datapgto    <= current_date
				    ORDER BY datapgto DESC, financ_rp_id DESC
				    LIMIT 1;
				    
				   -- ORDER BY DataMovto DESC, fat_docto_c_controle DESC
				   IF FOUND  AND  r_ultimaBx.financ_rp_id    =  r_rp.id AND  r_rp.prorrogacao < r_ultimaBx.datapgto THEN
			          v_database =  r_ultimaBx.datapgto;
				   ELSE
				      v_database =  r_rp.prorrogacao;
				   END IF;
	        --END IF; 	     
	      
	     
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM padrao.financ_tipocobranca
	         WHERE id = r_rp.tipocobranca_id; 
	        
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_parameters 
	          FROM fat_parameters 
	          LIMIT 1 ; 
	          
	        --Tipo taxa e tipo de Juros
	        ctipojuro = substring(r_parameters.financtipojuro from 1 for 1);
	        ctipotaxa = substring(r_parameters.financtipotaxa from 1 for 1);
	        --configuracao de desconto para pagamento antecipado
	        ndiasDescAntecipado = CASE WHEN r_parameters.financdescate      IS NULL THEN 0 ELSE r_parameters.financdescate      END;
	        pDescAnticipado     = CASE WHEN r_parameters.financdescanterior IS NULL THEN 0 ELSE r_parameters.financdescanterior END;
	        
	        IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	           ctipojuro = substring(r_tipocobranca.tipojuro from 1 for 1);
	           ctipotaxa = substring(r_tipocobranca.tipotaxa from 1 for 1);
	           
	          ndiasDescAntecipado = coalesce( r_tipocobranca.desc_ate, 0);
	          pDescAnticipado     = coalesce( r_tipocobranca.desc_ant, 0);
		    END IF;
		    
	        --Checa JurosMora/Multa/Acrescimo
		    pjurosmora = coalesce( r_rp.per_jurosmora / 30, 0);
		    pmulta     = coalesce( r_rp.per_multa, 0);
		    pacrescimo = coalesce( r_rp.per_acrescimo, 0);
		    ncarencia  = coalesce( r_rp.carencia, 0);
		    ndias      = Current_date - v_database;
		    nperiodocap= 30;
		    
		    --RAISE NOTICE 'ndiasDescAntecipado: (%)',     ndiasDescAntecipado;
		    --RAISE NOTICE 'pDescAnticipado: (%)',     pDescAnticipado;
		    --RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
		    --RAISE NOTICE 'pmulta: (%)',         pmulta;
		    --RAISE NOTICE 'pacrescimo: (%)',     pacrescimo;
		    --RAISE NOTICE 'ncarencia: (%)',      ncarencia;
		    --RAISE NOTICE 'ndias: (%)',          ndias;
		    --RAISE NOTICE 'nperiodocap: (%)',    nperiodocap;
		    --RAISE NOTICE 'ctipojuro: (%)',    ctipojuro;
		    --RAISE NOTICE 'ctipotaxa: (%)',    ctipotaxa;
		    
		        
		    
		    IF ndias > ncarencia AND COALESCE(r_rp.valor_saldo,0) > 0 THEN
		       vmulta     = ROUND(r_rp.valor_saldo * pmulta     / 100,2);
		       vacrescimo = ROUND(r_rp.valor_saldo * pacrescimo / 100,2);
	 	       IF ctipojuro = 'S'   THEN -- Simples
                  IF ctipotaxa = '1' THEN -- por dentro
                     --vjuros = @ROUND((r_rp.valor_saldo / ((100 - (pjurosmora * ndias)) / 100)) - r_rp.valor_saldo,2);
                      vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;  
                  IF ctipotaxa = '2' THEN -- por fora
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;
               END IF; 
               IF ctipojuro = 'C'   THEN -- Composto
                  pjurosmora = pjurosmora * nperiodocap;

                  IF ctipotaxa = '1' THEN -- por dentro
                     pjurosmora = pjurosmora / (100 - pjurosmora) * 100;
                  END IF;

                 x = 1 + pjurosmora / 100; 
                 y = cast(ndias as float) / nperiodocap;
                 
                 vjuros = ROUND(r_rp.valor_saldo * POWER(x,y) - r_rp.valor_saldo,2);
                 
                 
               END IF;
		    ELSE
		       IF ndiasDescAntecipado > 0 THEN
		          IF ndiasDescAntecipado <= cast(@ndias as NUMERIC) THEN
		              
		             --RAISE NOTICE 'ndiasDescAntecipado <= cast(ndias as NUMERIC): (%)',     ndiasDescAntecipado > cast(ndias as NUMERIC);
		             
		             vDescAntecipacao = r_rp.valor_saldo * pDescAnticipado / 100;
		             
		             --RAISE NOTICE 'cast(@ndias as NUMERIC): (%)',    cast(@ndias as NUMERIC);
		             --RAISE NOTICE 'r_rp.valor_saldo: (%)',    r_rp.valor_saldo;
		             --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
		             
		          
		          END IF;
		       END IF;
            END IF;
	     END IF; 
	     
	   -- UPDATE financ_receber
       --    SET valor_jurosmora = vjuros, valor_acrescimo =  vmulta + vacrescimo, valor_desconto = vDescAntecipacao
       --  WHERE cad_cadastro_id = p_cad_cadastro_id
       --    AND fatura          = p_financ_rp_id
       --    AND parcela         = p_parcela;
           
	END IF ;
	
	IF p_rp = 'P' THEN
		--Posiciona o titulo  
	    SELECT id,cad_filial_id,vcto,CASE WHEN vcto < prorrogacao THEN prorrogacao ELSE vcto END AS prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_rp AS P
	      INTO r_rp
	     WHERE P.cad_cadastro_id = p_cad_cadastro_id
	       AND P.fatura          = p_financ_rp_id
	       AND P.parcela         = p_parcela 
	       AND P.natureza = 'P';
	       
	     IF FOUND THEN
 			--Ultimo pgto 
	        --IF r_rp.valor_total != r_rp.valor_saldo THEN 
				   SELECT financ_rp_id,  datapgto, valor_juros, valor_recebido,valor_despesasac,valor_devolucaom
				          valor_descontos, valor_liquido
				     INTO r_ultimaBx
				     FROM financ_rp_baixas
				    WHERE financ_rp_id = r_rp.id
				      AND datapgto    <= current_date
				    ORDER BY datapgto DESC, financ_rp_id DESC
				    LIMIT 1;
				    
				   -- ORDER BY DataMovto DESC, fat_docto_c_controle DESC
				   IF FOUND  AND  r_ultimaBx.financ_rp_id    =  r_rp.id  AND  r_rp.prorrogacao < r_ultimaBx.datapgto THEN
				      v_database =  r_ultimaBx.datapgto;
				   ELSE
				     v_database =  r_rp.prorrogacao;
				   END IF;
	        --END IF; 	     
	     
	     
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM padrao.financ_tipocobranca
	         WHERE id = r_rp.tipocobranca_id; 
	    
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_parameters 
	          FROM fat_parameters 
	          LIMIT 1 ; 
	          
	        --Tipo taxa e tipo de Juros
	        ctipojuro = substring(r_parameters.financtipojuro from 1 for 1);
	        ctipotaxa = substring(r_parameters.financtipotaxa from 1 for 1);
	        --configuracao de desconto para pagamento antecipado
	        ndiasDescAntecipado = CASE WHEN r_parameters.financdescate      IS NULL THEN 0 ELSE r_parameters.financdescate      END;
	        pDescAnticipado     = CASE WHEN r_parameters.financdescanterior IS NULL THEN 0 ELSE r_parameters.financdescanterior END;
	        
	        IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	           ctipojuro = substring(r_tipocobranca.tipojuro from 1 for 1);
	           ctipotaxa = substring(r_tipocobranca.tipotaxa from 1 for 1);
	           
	          ndiasDescAntecipado = CASE WHEN r_tipocobranca.desc_ate  IS NULL THEN 0 ELSE r_tipocobranca.desc_ate END;
	          pDescAnticipado     = CASE WHEN r_tipocobranca.desc_ant  IS NULL THEN 0 ELSE r_tipocobranca.desc_ant END;
	        END IF;   
	        
		    --Checa JurosMora/Multa/Acrescimo
		    pjurosmora = CASE WHEN r_rp.per_jurosmora IS NULL THEN 0 ELSE r_rp.per_jurosmora / 30 END;
		    pmulta     = CASE WHEN r_rp.per_multa     IS NULL THEN 0 ELSE r_rp.per_multa END;
		    pacrescimo = CASE WHEN r_rp.per_acrescimo IS NULL THEN 0 ELSE r_rp.per_acrescimo END;
		    ncarencia  = CASE WHEN r_rp.carencia      IS NULL THEN 0 ELSE r_rp.carencia END;
		    ndias      = Current_date - v_database;
		    nperiodocap= 30;
		    
		    
		    --RAISE NOTICE 'ndiasDescAntecipado: (%)',     ndiasDescAntecipado;
		    --RAISE NOTICE 'pDescAnticipado: (%)',     pDescAnticipado;
		    --RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
		    --RAISE NOTICE 'pmulta: (%)',         pmulta;
		    --RAISE NOTICE 'pacrescimo: (%)',     pacrescimo;
		    --RAISE NOTICE 'ncarencia: (%)',      ncarencia;
		    --RAISE NOTICE 'ndias: (%)',          ndias;
		    --RAISE NOTICE 'nperiodocap: (%)',    nperiodocap;
		    --RAISE NOTICE 'ctipojuro: (%)',    ctipojuro;
		    --RAISE NOTICE 'ctipotaxa: (%)',    ctipotaxa;
		    
		        
		    
		    IF ndias > ncarencia AND COALESCE(r_rp.valor_saldo,0) > 0 THEN
		       vmulta     = ROUND(r_rp.valor_saldo * pmulta     / 100,2);
		       vacrescimo = ROUND(r_rp.valor_saldo * pacrescimo / 100,2);
	 	       IF ctipojuro = 'S'   THEN -- Simples
                  IF ctipotaxa = '1' THEN -- por dentro
                     --vjuros = @ROUND((r_rp.valor_saldo / ((100 - (pjurosmora * ndias)) / 100)) - r_rp.valor_saldo,2);
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;  
                  IF ctipotaxa = '2' THEN -- por fora
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;
               END IF; 
               IF ctipojuro = 'C'   THEN -- Composto
                  pjurosmora = pjurosmora * nperiodocap;

                  IF ctipotaxa = '1' THEN -- por dentro
                     pjurosmora = pjurosmora / (100 - pjurosmora) * 100;
                  END IF;

                 x = 1 + pjurosmora / 100; 
                 y = cast(ndias as float) / nperiodocap;
                 
                 vjuros = ROUND(r_rp.valor_saldo * POWER(x,y) - r_rp.valor_saldo,2);
                 
                 
               END IF;
		    ELSE
		       IF ndiasDescAntecipado > 0 THEN
		          IF ndiasDescAntecipado <= cast(@ndias as NUMERIC) THEN
		              
		             --RAISE NOTICE 'ndiasDescAntecipado <= cast(ndias as NUMERIC): (%)',     ndiasDescAntecipado > cast(ndias as NUMERIC);
		             
		             vDescAntecipacao = r_rp.valor_saldo * pDescAnticipado / 100;
		             
		             --RAISE NOTICE 'cast(@ndias as NUMERIC): (%)',    cast(@ndias as NUMERIC);
		             --RAISE NOTICE 'r_rp.valor_saldo: (%)',    r_rp.valor_saldo;
		             --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
		             
		          
		          END IF;
		       END IF;
            END IF;
	     END IF; 
           
	END IF ;    

	--RAISE NOTICE 'nperiodocap: (%)',     nperiodocap;
	--RAISE NOTICE 'x: (%)',     x;
	--RAISE NOTICE 'y: (%) - (%)',     y, TRUNC(ndias / nperiodocap,9);
	--RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
    --RAISE NOTICE 'r_rp.valor_saldo: (%)',     r_rp.valor_saldo;
    --RAISE NOTICE 'vjuros: (%)',     vjuros;
    --RAISE NOTICE 'vmulta: (%)',     vmulta;
    --RAISE NOTICE 'vacrescimo: (%)',     vacrescimo;
    --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
    
    IF p_retorno = '1' THEN
       RETURN COALESCE(vjuros,0) ;
    END IF;
    IF p_retorno = '2' THEN
       RETURN ROUND(COALESCE(vmulta,0) + COALESCE(vacrescimo,0),3);
    END IF;
    IF p_retorno = '3' THEN
       RETURN COALESCE(vDescAntecipacao,0);
    END IF;
    IF p_retorno = '4' THEN
       RETURN ROUND(r_rp.valor_saldo + ((COALESCE(vmulta,0) + COALESCE(vacrescimo,0) + COALESCE(vjuros,0)) - COALESCE(vDescAntecipacao,0)),3);
    END IF;

    return 0;
    
    
 END;
 
 $BODY$
 
LANGUAGE 'plpgsql' VOLATILE;

-- Storeprocedure {getCalcJuros(cad_cadastro_id , fatura , parcela, rp, retorno, data_juros)} Versao {047} Esquema {padrao} Descricao {Retornar juro do titulo em atraso}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.getCalcJuros(integer , bigint , integer, char(1), char(1), date)
  RETURNS NUMERIC(14,6) AS
$BODY$

 DECLARE
 p_cad_cadastro_id     alias for $1; -- Id Cli/For
 p_financ_rp_id              alias for $2; -- Fatura
 p_parcela             alias for $3; -- Parcela
 p_rp                  alias for $4; -- RP - Receber/Pagar
 p_retorno             alias for $5; -- 1)JurosMora 2)acrescimo 3)descontos 4)Saldo do titulo
 p_datajuros           alias for $6; -- data base para calculo doe juros
 v_retorna             NUMERIC(14,6);
 pjurosmora            NUMERIC(14,6); -- (%)Juros Mora
 pmulta                NUMERIC(14,6); -- (%)multa por atraso
 pacrescimo            NUMERIC(14,6); -- (%)acrescimo
 ncarencia             NUMERIC(14,6); -- dias carencia
 vmulta                NUMERIC(14,6); -- valor da multa
 vjuros                NUMERIC(14,6); -- valor do juro
 vacrescimo            NUMERIC(14,6); -- valor do acrescimo financeiro 
 vDescAntecipacao      NUMERIC(14,6); -- valor do acrescimo financeiro 
 ndias                 INT;           -- dias vencido
 ndiasDescAntecipado   NUMERIC(5,0);  -- dias antecipado para desconto  
 pDescAnticipado       NUMERIC(14,6); -- (%) de desconto para  pgto antecipado   
 nperiodocap           INT;           -- periodo de capitalizacao
 x                     NUMERIC;
 y                     NUMERIC;
 v_database            DATE;   
 ctipotaxa             CHAR(1);       -- Tipo taxa
 ctipojuro             CHAR(1);       -- Tipo juro 
 r_rp                  RECORD;
 r_tipocobranca        RECORD;
 r_parameters          RECORD;
 r_cadastro            RECORD;
 r_ultimaBx            RECORD;
 
 BEGIN
	 ncarencia        = 0;
	 vmulta           = 0;
	 vjuros           = 0;
	 pacrescimo       = 0;
	 ndias            = 0;
	 pjurosmora       = 0;
	 vDescAntecipacao = 0;
	 vacrescimo       = 0;

 	 IF p_rp = 'R' THEN
		--Posiciona o titulo  
	    SELECT id,cad_filial_id,vcto,CASE WHEN vcto < prorrogacao THEN prorrogacao ELSE vcto END AS prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_rp AS R
	      INTO r_rp
	     WHERE R.cad_cadastro_id = p_cad_cadastro_id
	       AND R.fatura          = p_financ_rp_id
	       AND R.parcela         = p_parcela
	       AND R.natureza = 'R';
	    
	     
	      
	     IF FOUND THEN
	     
	     	  v_database =  r_rp.prorrogacao;
         
	     	  --Ultimo pgto 
	          --IF r_rp.valor_total != r_rp.valor_saldo THEN 
				   SELECT financ_rp_id,  datapgto, valor_juros, valor_recebido,valor_despesasac,valor_devolucaom
				          valor_descontos, valor_liquido
				     INTO r_ultimaBx
				     FROM financ_rp_baixas
				    WHERE financ_rp_id = r_rp.id
				      AND datapgto    <= p_datajuros
				    ORDER BY datapgto DESC, financ_rp_id DESC
				    LIMIT 1;
				    
				   -- ORDER BY DataMovto DESC, fat_docto_c_controle DESC
				   IF FOUND  AND  r_ultimaBx.financ_rp_id    =  r_rp.id AND  r_rp.prorrogacao < r_ultimaBx.datapgto THEN
				      v_database =  r_ultimaBx.datapgto;
				   ELSE
				     v_database =  r_rp.prorrogacao;
				   END IF;
	        --END IF; 	     
	      
	     
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM padrao.financ_tipocobranca
	         WHERE id = r_rp.tipocobranca_id; 
	        
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_parameters 
	          FROM fat_parameters 
	          LIMIT 1 ; 
	          
	        --Tipo taxa e tipo de Juros
	        ctipojuro = substring(r_parameters.financtipojuro from 1 for 1);
	        ctipotaxa = substring(r_parameters.financtipotaxa from 1 for 1);
	        --configuracao de desconto para pagamento antecipado
	        ndiasDescAntecipado = CASE WHEN r_parameters.financdescate      IS NULL THEN 0 ELSE r_parameters.financdescate      END;
	        pDescAnticipado     = CASE WHEN r_parameters.financdescanterior IS NULL THEN 0 ELSE r_parameters.financdescanterior END;
	        
	        IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	           ctipojuro = substring(r_tipocobranca.tipojuro from 1 for 1);
	           ctipotaxa = substring(r_tipocobranca.tipotaxa from 1 for 1);
	           
	          ndiasDescAntecipado = coalesce( r_tipocobranca.desc_ate, 0);
	          pDescAnticipado     = coalesce( r_tipocobranca.desc_ant, 0);
		    END IF;
		    
	        --Checa JurosMora/Multa/Acrescimo
		    pjurosmora = coalesce( r_rp.per_jurosmora / 30, 0);
		    pmulta     = coalesce( r_rp.per_multa, 0);
		    pacrescimo = coalesce( r_rp.per_acrescimo, 0);
		    ncarencia  = coalesce( r_rp.carencia, 0);
		    ndias      = p_datajuros - v_database;
		    nperiodocap= 30;
		    
		    --RAISE NOTICE 'ndiasDescAntecipado: (%)',     ndiasDescAntecipado;
		    --RAISE NOTICE 'pDescAnticipado: (%)',     pDescAnticipado;
		    --RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
		    --RAISE NOTICE 'pmulta: (%)',         pmulta;
		    --RAISE NOTICE 'pacrescimo: (%)',     pacrescimo;
		    --RAISE NOTICE 'ncarencia: (%)',      ncarencia;
		    --RAISE NOTICE 'ndias: (%)',          ndias;
		    --RAISE NOTICE 'nperiodocap: (%)',    nperiodocap;
		    --RAISE NOTICE 'ctipojuro: (%)',    ctipojuro;
		    --RAISE NOTICE 'ctipotaxa: (%)',    ctipotaxa;
		    
		        
		    
		    IF ndias > ncarencia AND COALESCE(r_rp.valor_saldo,0) > 0 THEN
		       vmulta     = ROUND(r_rp.valor_saldo * pmulta     / 100,2);
		       vacrescimo = ROUND(r_rp.valor_saldo * pacrescimo / 100,2);
	 	       IF ctipojuro = 'S'   THEN -- Simples
                  IF ctipotaxa = '1' THEN -- por dentro
                     --vjuros = @ROUND((r_rp.valor_saldo / ((100 - (pjurosmora * ndias)) / 100)) - r_rp.valor_saldo,2);
                      vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2) ;
                  END IF;  
                  IF ctipotaxa = '2' THEN -- por fora
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;
               END IF; 
               IF ctipojuro = 'C'   THEN -- Composto
                  pjurosmora = pjurosmora * nperiodocap;

                  IF ctipotaxa = '1' THEN -- por dentro
                     pjurosmora = pjurosmora / (100 - pjurosmora) * 100;
                  END IF;

                 x = 1 + pjurosmora / 100; 
                 y = cast(ndias as float) / nperiodocap;
                 
                 vjuros = ROUND(r_rp.valor_saldo * POWER(x,y) - r_rp.valor_saldo,2);
                 
                 
               END IF;
		    ELSE
		       IF ndiasDescAntecipado > 0 THEN
		          IF ndiasDescAntecipado <= cast(@ndias as NUMERIC) THEN
		              
		             --RAISE NOTICE 'ndiasDescAntecipado <= cast(ndias as NUMERIC): (%)',     ndiasDescAntecipado > cast(ndias as NUMERIC);
		             
		             vDescAntecipacao = r_rp.valor_saldo * pDescAnticipado / 100;
		             
		             --RAISE NOTICE 'cast(@ndias as NUMERIC): (%)',    cast(@ndias as NUMERIC);
		             --RAISE NOTICE 'r_rp.valor_saldo: (%)',    r_rp.valor_saldo;
		             --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
		             
		          
		          END IF;
		       END IF;
            END IF;
	     END IF; 
	     
	   -- UPDATE financ_receber
       --    SET valor_jurosmora = vjuros, valor_acrescimo =  vmulta + vacrescimo, valor_desconto = vDescAntecipacao
       --  WHERE cad_cadastro_id = p_cad_cadastro_id
       --    AND fatura          = p_financ_rp_id
       --    AND parcela         = p_parcela;
           
	END IF ;
	
	IF p_rp = 'P' THEN
		--Posiciona o titulo  
	    SELECT id,cad_filial_id,vcto,CASE WHEN vcto < prorrogacao THEN prorrogacao ELSE vcto END AS prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_rp AS P
	      INTO r_rp
	     WHERE P.cad_cadastro_id = p_cad_cadastro_id
	       AND P.fatura          = p_financ_rp_id
	       AND P.parcela         = p_parcela 
	       AND P.natureza = 'P';
	       
	     IF FOUND THEN
 			--Ultimo pgto 
	        --IF r_rp.valor_total != r_rp.valor_saldo THEN 
				   SELECT financ_rp_id,  datapgto, valor_juros, valor_recebido,valor_despesasac,valor_devolucaom
				          valor_descontos, valor_liquido
				     INTO r_ultimaBx
				     FROM financ_rp_baixas
				    WHERE financ_rp_id = r_rp.id
				      AND datapgto    <= p_datajuros
				    ORDER BY datapgto DESC, financ_rp_id DESC
				    LIMIT 1;
				    
				   -- ORDER BY DataMovto DESC, fat_docto_c_controle DESC
				   IF FOUND  AND  r_ultimaBx.financ_rp_id    =  r_rp.id AND  r_rp.prorrogacao < r_ultimaBx.datapgto THEN
				      v_database =  r_ultimaBx.datapgto;
				   ELSE
				     v_database =  r_rp.prorrogacao;
				   END IF;
	        --END IF; 	     
	     
	     
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM padrao.financ_tipocobranca
	         WHERE id = r_rp.tipocobranca_id; 
	    
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_parameters 
	          FROM fat_parameters 
	          LIMIT 1 ; 
	          
	        --Tipo taxa e tipo de Juros
	        ctipojuro = substring(r_parameters.financtipojuro from 1 for 1);
	        ctipotaxa = substring(r_parameters.financtipotaxa from 1 for 1);
	        --configuracao de desconto para pagamento antecipado
	        ndiasDescAntecipado = CASE WHEN r_parameters.financdescate      IS NULL THEN 0 ELSE r_parameters.financdescate      END;
	        pDescAnticipado     = CASE WHEN r_parameters.financdescanterior IS NULL THEN 0 ELSE r_parameters.financdescanterior END;
	        
	        IF substring(r_tipocobranca.def_juros from 1 for 1) = '1' THEN -- Juros pelo Tipo de Cobranca   
	           ctipojuro = substring(r_tipocobranca.tipojuro from 1 for 1);
	           ctipotaxa = substring(r_tipocobranca.tipotaxa from 1 for 1);
	           
	          ndiasDescAntecipado = CASE WHEN r_tipocobranca.desc_ate  IS NULL THEN 0 ELSE r_tipocobranca.desc_ate END;
	          pDescAnticipado     = CASE WHEN r_tipocobranca.desc_ant  IS NULL THEN 0 ELSE r_tipocobranca.desc_ant END;
	        END IF;   
	        
		    --Checa JurosMora/Multa/Acrescimo
		    pjurosmora = CASE WHEN r_rp.per_jurosmora IS NULL THEN 0 ELSE r_rp.per_jurosmora / 30 END;
		    pmulta     = CASE WHEN r_rp.per_multa     IS NULL THEN 0 ELSE r_rp.per_multa END;
		    pacrescimo = CASE WHEN r_rp.per_acrescimo IS NULL THEN 0 ELSE r_rp.per_acrescimo END;
		    ncarencia  = CASE WHEN r_rp.carencia      IS NULL THEN 0 ELSE r_rp.carencia END;
		    ndias      = p_datajuros - v_database;
		    nperiodocap= 30;
		    
		    
		    --RAISE NOTICE 'ndiasDescAntecipado: (%)',     ndiasDescAntecipado;
		    --RAISE NOTICE 'pDescAnticipado: (%)',     pDescAnticipado;
		    --RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
		    --RAISE NOTICE 'pmulta: (%)',         pmulta;
		    --RAISE NOTICE 'pacrescimo: (%)',     pacrescimo;
		    --RAISE NOTICE 'ncarencia: (%)',      ncarencia;
		    --RAISE NOTICE 'ndias: (%)',          ndias;
		    --RAISE NOTICE 'nperiodocap: (%)',    nperiodocap;
		    --RAISE NOTICE 'ctipojuro: (%)',    ctipojuro;
		    --RAISE NOTICE 'ctipotaxa: (%)',    ctipotaxa;
		    
		        
		    
		    IF ndias > ncarencia AND COALESCE(r_rp.valor_saldo,0) > 0 THEN 
		       vmulta     = ROUND(r_rp.valor_saldo * pmulta     / 100,2);
		       vacrescimo = ROUND(r_rp.valor_saldo * pacrescimo / 100,2);
	 	       IF ctipojuro = 'S'   THEN -- Simples
                  IF ctipotaxa = '1' THEN -- por dentro
                     --vjuros = @ROUND((r_rp.valor_saldo / ((100 - (pjurosmora *     ndias)) / 100)) - r_rp.valor_saldo,2);
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2)   ;    
                  END IF;  
                  IF ctipotaxa = '2' THEN -- por fora
                     vjuros := @ROUND(r_rp.valor_saldo * pjurosmora / 100 * ndias,2);
                  END IF;
               END IF; 
               IF ctipojuro = 'C'   THEN -- Composto
                  pjurosmora = pjurosmora * nperiodocap;

                  IF ctipotaxa = '1' THEN -- por dentro
                     pjurosmora = pjurosmora / (100 - pjurosmora) * 100;
                  END IF;

                 x = 1 + pjurosmora / 100; 
                 y = cast(ndias as float) / nperiodocap;
                 
                 vjuros = ROUND(r_rp.valor_saldo * POWER(x,y) - r_rp.valor_saldo,2);
                 
                 
               END IF;
		    ELSE
		       IF ndiasDescAntecipado > 0 THEN
		          IF ndiasDescAntecipado <= cast(@ndias as NUMERIC) THEN
		              
		             --RAISE NOTICE 'ndiasDescAntecipado <= cast(ndias as NUMERIC): (%)',     ndiasDescAntecipado > cast(ndias as NUMERIC);
		             
		             vDescAntecipacao = r_rp.valor_saldo * pDescAnticipado / 100;
		             
		             --RAISE NOTICE 'cast(@ndias as NUMERIC): (%)',    cast(@ndias as NUMERIC);
		             --RAISE NOTICE 'r_rp.valor_saldo: (%)',    r_rp.valor_saldo;
		             --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
		             
		          
		          END IF;
		       END IF;
            END IF;
	     END IF; 
           
	END IF ;    

	--RAISE NOTICE 'nperiodocap: (%)',     nperiodocap;
	--RAISE NOTICE 'x: (%)',     x;
	--RAISE NOTICE 'y: (%) - (%)',     y, TRUNC(ndias / nperiodocap,9);
	--RAISE NOTICE 'pjurosmora: (%)',     pjurosmora;
    --RAISE NOTICE 'r_rp.valor_saldo: (%)',     r_rp.valor_saldo;
    --RAISE NOTICE 'vjuros: (%)',     vjuros;
    --RAISE NOTICE 'vmulta: (%)',     vmulta;
    --RAISE NOTICE 'vacrescimo: (%)',     vacrescimo;
    --RAISE NOTICE 'vDescAntecipacao: (%)',    vDescAntecipacao;
    
     IF p_retorno = '1' THEN
        RETURN COALESCE(vjuros,0) ;
     END IF;
     IF p_retorno = '2' THEN
        RETURN ROUND(COALESCE(vmulta,0) + COALESCE(vacrescimo,0),3);
     END IF;
     IF p_retorno = '3' THEN
        RETURN COALESCE(vDescAntecipacao,0);
     END IF;
     IF p_retorno = '4' THEN
        RETURN ROUND(r_rp.valor_saldo + ((COALESCE(vmulta,0) + COALESCE(vacrescimo,0) + COALESCE(vjuros,0)) - COALESCE(vDescAntecipacao,0)),3);
     END IF;

     return 0;
    
    
 END;
 
 $BODY$
 
LANGUAGE 'plpgsql' VOLATILE;
  



  


