--- PAQUETE PARA EL MANEJO DE PAGOS CON MILLAS 
create or replace package facmillas is

   Function MillasAValor(pCia in varchar2, pConcepto in Varchar2, pMillas in number) return number;

   Function ValorAMillas(pCia in varchar2, pConcepto in Varchar2, pColones in number) return number;

   Function SoportaMillas(pCia in varchar2, pConcepto in Varchar2) RETURN boolean;

end facmillas;
/

create or replace package body facmillas is

   vCia        venconceptoval.cia%type;
   vConcepto   venconceptoval.concepto%type;
   vValor      number(8,2);
   vMillas     number(8,2);

   --- FIJA VARIABLES GENERALES
   --- NECESARIOS PARA LOS CALCULOS
   Procedure FijarConcepto(pCia in varchar2, pConcepto in varchar2) is
   begin
      if vCia is null or vCia!=pCia or vConcepto is null or vConcepto!=pConcepto then
         select valor, millas
            into vValor, vMillas
         from venconceptoval
         where cia=pCia
           and Concepto=pConcepto
           and clase='T';
         vCia:=pCia;
         vConcepto:=pConcepto;
      end if;
   Exception
      when no_data_found then
         raise_application_error(-20001, '<FijarConcepto>: El concepto no existe o no es tarjeta '||pCia||'-'||pConcepto||'.');
   End FijarConcepto;

   --- CONVIERTE UN NUMERO DE MILLAS 
   --- A SU VALOR CORRESPONDIENTE EN DINERO 
   Function MillasAValor(pCia in varchar2, pConcepto in Varchar2, pMillas in number) return number is
   Begin
      FijarConcepto(pCia, pConcepto);
      if vValor>0 and vMillas>0 then
         return pMillas*vValor/vMillas;
      else
         raise_application_error(-20001,'<MillasAValor>: La tarjeta '||pConcepto||' no soporta pago con millas.');
      end if;
   End MillasAValor;

   --- CONVIERTE UN MONTO EN DINERO 
   --- A SU VALOR CORRESPONDIENTE EN NUMERO DE MILLAS 
   Function ValorAMillas(pCia in varchar2, pConcepto in Varchar2, pColones in number) return number is
   Begin
      FijarConcepto(pCia, pConcepto);
      if vValor>0 and vMillas>0 then
         return pColones*vMillas/vValor;
      else
         raise_application_error(-20001,'<ValorAMillas>: La tarjeta '||pConcepto||' no soporta pago con millas.');
      end if;
   End ValorAMillas;

   --- RETORNA SI UNA FORMA DE PAGO 
   --- SOPORTA PAGO DE MILLAS O NO 
   Function SoportaMillas(pCia in varchar2, pConcepto in Varchar2) RETURN boolean IS
   BEGIN
      FijarConcepto(pCia, pConcepto);
      If vvalor>0 and vmillas>0 then
         RETURN true;
      else
         RETURN false;
      end if;
   Exception
      when no_data_found then
         RETURN false;
   END SoportaMillas;

end facmillas;
/
