-- Storeprocedure {rpgravajuros(cad_cadastro_id , fatura , parcela, rp)} Versao {007} Esquema {padrao} Descricao {Atualiza juros e acrescimos no titulo}
-- ------------------------------------------------------------

CREATE OR REPLACE FUNCTION padrao.rpgravajuros(integer , integer , integer, char(1))
  RETURNS VOID AS
$BODY$

 DECLARE
 p_cad_cadastro_id     alias for $1; -- Id do titulo
 p_fatura              alias for $2; -- Fatura
 p_parcela             alias for $3; -- Parcela
 p_rp                  alias for $4; -- RP - Receber/Pagar
 v_retorna             financ_receber.valor_jurosmora%TYPE;
 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;
 ctipotaxa             CHAR(1);       -- Tipo taxa
 ctipojuro             CHAR(1);       -- Tipo juro 
 r_rp                  RECORD;
 r_tipocobranca        RECORD;
 r_parameters          RECORD;
 r_cadastro            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 cad_filial_id,vcto,prorrogacao,portador_id,tipocobranca_id,moeda_id, carencia,
	           valor_total,valor_saldo,per_jurosmora,per_acrescimo,per_multa,vendedor_id, desc_ate
	      FROM financ_receber AS R
	      INTO r_rp
	     WHERE R.cad_cadastro_id = p_cad_cadastro_id
	       AND R.fatura          = p_fatura
	       AND R.parcela         = p_parcela;
	    
	     IF FOUND THEN
	        --Posiciona Tipo de Cobranca
	        SELECT *
	          INTO r_tipocobranca 
	          FROM 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 = r_tipocobranca.desc_ate;
	           pDescAnticipado     = r_tipocobranca.desc_ant;
	           
	          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 = r_rp.per_jurosmora / 30;
		    pmulta     = r_rp.per_multa;
		    pacrescimo = r_rp.per_acrescimo;
		    ncarencia  = CASE WHEN r_rp.carencia IS NULL THEN 0 ELSE r_rp.carencia END;
		    ndias      = Current_date - r_rp.prorrogacao;
		    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 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);
                     
                  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_fatura
           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 'vDescAntecipacao: (%)',    vDescAntecipacao;
    
    
 END;
 
 $BODY$
 
LANGUAGE 'plpgsql' VOLATILE
  
