CREATE OR REPLACE PACKAGE BODY Estadisticas IS

   TYPE estrec is RECORD (mven  number(14,2),
                          uven  number(12,4),
                          cven  number(14,2),
                          iven  number(14,2),
                          mdev  number(14,2),
                          udev  number(12,4),
                          cdev  number(14,2),
                          idev  number(14,2));

   nue estrec;

   Procedure AgrDet(PSuc in char, Pbod in char, Pper in number,
                    Pcli in varchar2, Page in varchar2, Pmon in varchar2,
                    Part in varchar2, trans in char, monto in number, cantidad in number,
                    costo in number, impuesto in number) Is
      cursor Est is
         select montoven+decode(trans, 'V', monto, 0),
                cantidadven+decode(trans, 'V', cantidad, 0),
                costoven+decode(trans, 'V', costo, 0),
                imptoven+decode(trans, 'V', impuesto, 0),
                montodev+decode(trans, 'D', monto, 0),
                cantidaddev+decode(trans, 'D', cantidad, 0),
                costodev+decode(trans, 'D', costo, 0),
                imptodev+decode(trans, 'D', impuesto, 0)
         from   estdet
         Where  cia          = Vcia
         And    sucursal     = Psuc
         And    bodega       = Pbod
         And    moneda       = Pmon
         And    periodo      = Pper
         And    cliente      = Pcli
         And    agente       = Page
         And    articulo     = Part
         for update of montoven, cantidadven, costoven, imptoven,
                       montodev, cantidaddev, costodev, imptodev;
   Begin
      open est;
      fetch est into nue;
      if est%notfound then
         Insert InTo EstDet
            (cia, sucursal, bodega, cliente, agente, articulo, periodo, moneda,
            montoven, cantidadven, costoven, imptoven,
            montodev, cantidaddev, costodev, imptodev)
         Values
            (Vcia, Psuc, Pbod, Pcli, Page, Part, Pper, Pmon,
             decode(trans, 'V', monto, 0), decode(trans, 'V', cantidad, 0),
             decode(trans, 'V', costo, 0), decode(trans, 'V', impuesto, 0),
             decode(trans, 'D', monto, 0), decode(trans, 'D', cantidad, 0),
             decode(trans, 'D', costo, 0), decode(trans, 'D', impuesto, 0));
      else
         If nue.mven=0 and nue.uven=0 and nue.mdev=0 and nue.udev=0 then
            delete from estdet
            Where  current of est;
         else
            Update EstDet
               Set montoven = nue.mven, cantidadven = nue.uven,
                   costoven=nue.cven, imptoven=nue.iven,
                   montodev = nue.mdev, cantidaddev = nue.udev,
                   costodev=nue.cdev, imptodev=nue.idev
            Where  current of est;
         End if;
      End if;
      Close Est;
   Exception
      when others then
         if est%isopen then
            close est;
         end if;
         raise_application_error(-20001,'ERROR <AgrDet> '||Sqlerrm);
   End AgrDet;

   Function ObtTipoEst(Pcia in char) return varchar2 is
      VTipo venparametros.tipoest%type:='N'; -- Fiscal, Natural, Dia (Natural)
   Begin
      select tipoest into Vtipo
      from venparametros
      where cia=pcia;
      return Vtipo;
   End ObtTipoEst;

   Function Periodo(Pcia in varchar2, tipoest in varchar2, fecha in date) return number is
   begin
      if TipoEst='F' then
         return calcgen.ObtenerPeriodo(Pcia, fecha)*100;
      elsif TipoEst='N' then
         return To_char(Fecha,'YYYYMM')||'00';
      elsif TipoEst='D' then
         return To_char(Fecha,'YYYYMMDD');
      end if;
   End Periodo;

   Function FechaIni(Pcia in varchar2, tipoest in varchar2, per in number) return date is
   begin
      if TipoEst='F' then
         return calcgen.InicioPeriodo(Pcia, per/100);
      else
         return to_date(trunc(per/100),'yyyymm');
      end if;
   End FechaIni;

   Function FechaFin(Pcia in varchar2, tipoest in varchar2, per in number) return date is
   begin
      if TipoEst='F' then
         return calcgen.FinPeriodo(Pcia, per/100)+0.99999;
      else
         return last_day(to_date(trunc(per/100),'yyyymm'))+0.99999;
      end if;
   End FechaFin;

   Procedure Inicializa(Pcia in char) is
   Begin
      VTipoEst:=ObtTipoEst(Pcia);
      Vcia:=Pcia;
   End Inicializa;

   Procedure Actualiza(Pcia in char, PSuc in char, PBod in char, perfis in number,
                Fecha in date, Pcliente in varchar2, Pmoneda in varchar2, Pagente in varchar2,
                Particulo in varchar2, trans in char, monto in number, cantidad in number,
                costo in number, impuesto in number)Is
      Vperiodo estdet.periodo%type;
   Begin

      if nvl(Vcia,' x ')!=Pcia then
         Inicializa(Pcia);
      end if;
      if VtipoEST='F' then
         Vperiodo:=perfis*100;
      elsif VtipoEST='N' then
         Vperiodo:=To_char(Fecha,'YYYYMM')||'00';
      elsif VtipoEST='D' then
         Vperiodo:=To_char(Fecha,'YYYYMMDD');
      end if;

      AgrDet(PSuc, PBod, Vperiodo, Pcliente, Pagente, Pmoneda, Particulo,
            trans, monto, cantidad, costo, impuesto);

   End Actualiza;

END;
/