CREATE OR REPLACE PACKAGE BODY Catalogos IS
 
   Tabc cattab;
 
   vRaiz varchar2(5):='CAT%';
 
   procedure Inicializar(Pcia in char) is
      cursor catalogos is
         select c.tipo, c.catalogo, trunc(c.fecha) fecha, trunc(c.fecharige) fecharige
         from vencatalogo c
         where c.cia=Pcia
           and c.fecha<=trunc(sysdate)
           and exists (select 1 from venclasecli cc
                       where cc.cia=pCia
                         and cc.catalogo=c.catalogo);
      Function FecVence(pTipo in varchar2, pFecrig in date) return date is
         vFec date;
      begin
         select min(trunc(fecharige))
            into vFec
         from vencatalogo
         where cia=pCia
           and tipo=pTipo
           and fecharige>pFecrig;
         return vFec;
      end;
   begin
      tabc.delete;
      for c in catalogos
      loop
         tabc(c.catalogo).tipo:=c.tipo;
         tabc(c.catalogo).fecha:=c.fecha;
         tabc(c.catalogo).fecharige:=c.fecharige;
         tabc(c.catalogo).fechavence:=Fecvence(c.tipo, c.fecharige);
      end loop;
   end Inicializar;
 
   Function HayCatalogo return boolean is
   begin
      return tabc.count>0;
   end;
 
   Function EsCatalogo(pArt in varchar2) return boolean is
   begin
      return tabc(pArt).tipo is not null;
   exception
      when no_data_found then
         return false;
   end;
 
   Function Fecha(pArt in varchar2, pSel in varchar2 default 'D') return date is
   begin
      if pSel = 'R' then
         return tabc(pArt).fecharige;
      elsif pSel = 'V' then
         return tabc(pArt).fechavence;
      else
         return tabc(pArt).fecha;
      end if;
   exception
      when no_data_found then
         return null;
   end;
 
   Function Bodega return varchar2 is
   begin
      return PBod;
   end;
 
   Function Raiz return varchar2 is
   begin
      return vRaiz;
   end;
 
   procedure FijarBodega(pCia in char, pSuc in char, pAge in varchar2) is
   begin
      select bodega
         into pBod
      from gen_agente
      where cod_cia=Pcia
        and sucursal=Psuc
        and cod_agente=Page;
   exception
      when no_data_found then
         pBod:=null;
   end FijarBodega;
 
   --El tipo 010 es el que se usa para Cambios y devoluciones, por lo que realmente no se deve contemplar en las facturas
   Function PrimerFactura(pCia in char, pSuc in char, pCli in varchar2, Pdia in date) return boolean is
      cursor facturas is
         select '1' from venfactura
         where cia=pCia
           and sucursal=pSuc
           and cliente=pCli
           and tipo <> '010'
           and fecha>=Trunc(pDia)
           and estado='A';
      pFacts char(1);
   Begin
      open facturas;
      fetch facturas into pFacts;
      close facturas;
      return pFacts is null;
   End PrimerFactura;
 
   Function PrimerPedido(pCia in char, pSuc in char, pCli in varchar2, Pdia in date) return boolean is
      cursor pedidos is
         select '1' from venPedido
         where cia=pCia
           and sucursal=pSuc
           and cliente=pCli
           and fecha>=Trunc(pDia)
           and estado='A';
      pPeds char(1);
   Begin
      open pedidos;
      fetch pedidos into pPeds;
      close pedidos;
      return pPeds is null;
   End PrimerPedido;
 
 
   --trunc(dia)>=sysdate-150:  un cliente con 150 dias o mas de no hacer compras, se tomara como cliente nuevo.
   Function EsClienteNuevo(pCia in varchar2, pSuc in varchar2, pCli in varchar2) return varchar2 is
      pFacts varchar2(1);
   Begin
      select distinct 'N'
         into pFacts
      from venfactura
      where cia=pCia
         and sucursal=pSuc
         and cliente=pCli
         and trunc(dia)>=sysdate-150
         and estado='A';
      return nvl(pFacts, 'S');
   exception
    when no_data_found then
      return 'S';
   End EsClienteNuevo;
 
END;
/