
create or replace package venped is

   Procedure Ordenar(pcia in varchar2, psuc in varchar2, pped in number, porden in varchar2 default 'D');

   Procedure CambiarLista(pcia in varchar2, psuc in varchar2, pped in number, plista in varchar2, pTipo in varchar2,
                          plinea  in varchar2, pmoneda in varchar2);

   Function RegAlisto(pCia in Varchar2, pSuc in Varchar2, pCaja in varchar2, pFecha in Date,
                      pTipo in Varchar2, pBultos in Number, pBoletas in Number,
                      pPrioridad in Number, pCliente in Varchar2, pRef in Number, pObs in Varchar2, 
                      pUltEvento in Varchar2, pImpreso in Varchar2, pEstado in Varchar2,
                      pAlisto in Number Default Null) Return Number;

   Procedure RegDetAlisto(pCia in Varchar2, pSuc in Varchar2, pDoc in Number, 
                          pSec in out Number, pLinPed in Number, pLote in Varchar2, 
                          pBodega in Varchar2, pArticulo in Varchar2, 
                          pMedida in Varchar2, pCant in Number, pDescripcion in Varchar2);

   Function GenAlistos(pCia in Varchar2, pSuc in Varchar2, pPed in Number, 
                       pCaja in varchar2, pPrior in number, pMaxLineas in Number,
                       pTipoSel in varchar2 default 'B') Return Number;

   Function AlistoPedido(pCia in Varchar2, pSuc in Varchar2, pPed in Number) Return Number;

End;
/

create or replace package body venped is

   vUltCiaAtr   VenParametros.Cia%Type := 'XXX';
   vAtrMulCaj   GenPrefsVal.Valor%Type;

   Procedure ordenar(pcia in varchar2, psuc in varchar2, pped in number, porden in varchar2 default 'D') is
      cursor detalle is
         select p.secuencia, p.articulo, p.rowid rowped
         from vendetpedido p, inv_articulo a
         where p.cia=pCia
           and p.sucursal=pSuc
           and p.documento=pPed
           and a.cod_cia=pcia
           and a.cod_articulo=p.articulo
         order by decode(pOrden,'C',articulo,'D',a.des_articulo, p.secuencia);
      vLinea  number(4);
      vInicio number(4);
   begin
      select max(secuencia)
         into vInicio
      from vendetpedido
      where cia=pCia
        and sucursal=pSuc
        and documento=pPed;
      vLinea:=vInicio;
      for d in detalle
      loop
         update vendetpedido
            set secuencia=vLinea+1
         where rowid=d.rowped;
         vLinea:=vLinea+1;
      end loop;
      update vendetpedido
         set secuencia=secuencia-vInicio
      where cia=pCia
        and sucursal=pSuc
        and documento=pPed;
      commit;
   end;

   Procedure CambiarLista(pcia in varchar2, psuc in varchar2, pped in number, plista in varchar2, pTipo in varchar2,
                          plinea  in varchar2, pmoneda in varchar2) is
      cursor detalle is
         select secuencia, cantidad, d.articulo, a.cod_linea, a.imptovtas
         from vendetpedido d, inv_articulo a
         where d.cia=pCia
           and a.cod_cia=pcia
           and d.sucursal=pSuc
           and d.documento=pPed
           and d.articulo=a.cod_articulo
           and d.facturado=0;
      vImpCli      venpedido.porcimpuesto%type;
      vMoneda      venpedido.moneda%type;
      vImpArt      venpedido.porcimpuesto%type;
      vprecio      vendetpedido.precio%type;
      vImpuesto    vendetpedido.impuesto%type;
      vTotalLinea  vendetpedido.totallinea%type;
   begin
      update venpedido
         set tipo=pTipo, lista_precio=pLista, linea=plinea
      where cia=pCia
        and sucursal=pSuc
        and documento=pPed
      returning porcimpuesto, moneda into vImpCli, vMoneda;
      if vMoneda!=pMoneda then
         update venpedido
            set moneda=pmoneda, tipocambio=convmoneda.tipocambio(pMoneda, fecha)
         where cia=pCia
           and sucursal=pSuc
           and documento=pPed;
      end if;
      for d in detalle
      loop
         vImpArt:=Precios.ObtImpuesto(pcia, d.imptoVtas);
         vPrecio:=Precios.PrecioLista(pCia, pLista, d.articulo, pMoneda);
         vPrecio:=Precios.PrecioNeto(pCia, Vprecio, d.cod_linea, pMoneda);
         Pre_Par.CalculaTotales(vPrecio, d.cantidad, 0, vImpArt, vImpCli, vTotalLinea, vImpuesto);
         update vendetpedido set pdesc1=0, pdesc2=0, pdesc3=0, porcdescuento=0,
                             precio=vPrecio, impuesto=vImpuesto, totallinea=vTotallinea
         where cia=pCia
           and sucursal=pSuc
           and documento=pPed
           and secuencia=d.secuencia;
      end loop;
   end;

   Function RegAlisto(pCia in Varchar2, pSuc in Varchar2, pCaja in varchar2, pFecha in Date,
                      pTipo in Varchar2, pBultos in Number, pBoletas in Number,
                      pPrioridad in Number, pCliente in Varchar2, pRef in Number, pObs in Varchar2, 
                      pUltEvento in Varchar2, pImpreso in Varchar2, pEstado in Varchar2,
                      pAlisto in Number Default Null) Return Number is

      vAlisto VenAlisto.Documento%Type := pAlisto;
   Begin     
      If vAlisto Is Null Then
         vAlisto := ConsecutivoSerie(pCia, pCaja, 'A', null, null);
      End If;

      Insert Into VenAlisto(Cia, Sucursal, Documento, Fecha, Tipo, 
                            Bultos, Boletas, Prioridad, Cliente, Referencia, 
                            Observaciones, UltEvento, Impreso, Estado)
                     Values(pCia, pSuc, vAlisto, pFecha, pTipo, pBultos, pBoletas, 
                            pPrioridad, pCliente, pRef, pObs, pUltEvento, pImpreso,
                            pEstado);

      Return vAlisto;
   End RegAlisto;                       

   Procedure RegDetAlisto(pCia in Varchar2, pSuc in Varchar2, pDoc in Number, 
                          pSec in out Number, pLinPed in Number, pLote in Varchar2, 
                          pBodega in Varchar2, pArticulo in Varchar2, 
                          pMedida in Varchar2, pCant in Number, pDescripcion in Varchar2) Is
   Begin
      Insert Into VenDetAlisto(Cia, Sucursal, Documento, Secuencia, LinPed, Lote, 
                               Bodega, Articulo, Medida, Cantidad, Descripcion)
                        Values(pCia, pSuc, pDoc, pSec, pLinPed, pLote, 
                               pBodega, pArticulo, pMedida, pCant, pDescripcion);

      pSec := pSec + 1;
   End RegDetAlisto;

   Function AtrMulCaj(pCia in Varchar2) Return Varchar2 Is
   Begin
      If vAtrMulCaj Is Null Or pCia != vUltCiaAtr Then
         vAtrMulCaj := Calcgen.ObtClave(pCia, 'POS', 'INICIO','ATRMULCAJ','INICIO','MLC');

         vUltCiaAtr := pCia;
      End If;
 
      Return vAtrMulCaj;
   End AtrMulCaj;

   Function DetalleArt(pCia in Varchar2, pArticulo in Varchar2, 
                       pTipo in Varchar2) Return Varchar2 IS
      vValor Inv_Detalles.Valor%Type;                    
   Begin
      Select Valor
	Into vValor
      From Inv_Detalles
      Where Cod_Cia      = pCia
        And Cod_Articulo = pArticulo
	And Tipo         = pTipo;
		
      Return vValor;		
   Exception
      When No_Data_Found Then
	Return null;
   End DetalleArt;


   Function GenAlistos(pCia in Varchar2, pSuc in Varchar2, pPed in Number, 
                       pCaja in varchar2, pPrior in number, pMaxLineas in Number,
                       pTipoSel in varchar2 default 'B') Return Number is
      Cursor Pedidos Is Select Documento, Cliente 
                        From VenPedido
                        Where Cia       = pCia
                          And Sucursal  = pSuc
                          And Documento = pPed
                          And Estado    = 'A';

      Cursor Detalle(pPedido in Number)
                     Is Select Secuencia, Lote, Bodega, Articulo, Medida, 
                               decode(pTipoSel,'B',Cantidad-Facturado,reservado-facturado) Cantidad, Descripcion
                        From VenDetPedido
                        Where Cia       = pCia
                          And Sucursal  = pSuc
                          And Documento = pPedido
                          And Cantidad - Facturado > 0
                        Order by Articulo, Secuencia;

      vPrimerAlisto VenAlisto.Documento%Type;
      vAlisto       VenAlisto.Documento%Type;
      vLinea        VenDetAlisto.Secuencia%Type;
      vBultos       VenAlisto.Bultos%Type;
      vMulCaj       VenDetAlisto.Cantidad%Type;
   Begin
      For P in Pedidos
      Loop
         vAlisto := Null;
         vBultos := 0;
         For D in Detalle(P.Documento)
         Loop
            If vAlisto Is Null Or vLinea > pMaxLineas Then
               If vBultos > 0 Then
                  Update VenAlisto
                    Set Bultos = vBultos
                  Where Cia       = pCia
                    And Sucursal  = pSuc
                    And Documento = vAlisto;

                  vBultos := 0;
               End If;
               
               vAlisto := RegAlisto(pCia, pSuc, pCaja, Sysdate, 'P', 0, 0, pPrior,
                                    P.Cliente, P.Documento, Null, Null, 'N', 'A');

               vLinea  := 1;

               If vPrimerAlisto Is Null Then
                  vPrimerAlisto := vAlisto;
               End If;
            End If;

            RegDetAlisto(pCia, pSuc, vAlisto, vLinea, D.Secuencia, D.Lote, 
                         D.Bodega, D.Articulo, D.Medida, D.Cantidad, 
                         D.Descripcion);

            vMulCaj := Nvl(DetalleArt(pCia, D.Articulo, AtrMulCaj(pCia)), 1);

            If vMulCaj != 0 Then
               vBultos := vBultos + ceil(D.Cantidad/vMulCaj);
            Else
               vBultos := vBultos + D.Cantidad;
            End If;
         End Loop;

         If vBultos > 0 Then
            Update VenAlisto
               Set Bultos = 1       -- Se cambio vBultos
            Where Cia       = pCia
              And Sucursal  = pSuc
              And Documento = vAlisto;
         End If;
        
      End Loop;

      Return vPrimerAlisto;
   End GenAlistos;

   --Retorna el alisto de un pedido
   Function AlistoPedido(pCia in Varchar2, pSuc in Varchar2, pPed in Number) Return Number Is
      Cursor Alistos is Select Documento
                        From VenAlisto
                        Where Cia        = pCia
                          And Sucursal   = pSuc
                          And Referencia = pPed
                          And Estado     = 'A'
                        Order by Documento;

      vAlisto VenAlisto.Documento%Type;
   Begin
      Open Alistos;
      Fetch Alistos Into vAlisto;
      Close Alistos;

      Return vAlisto;
   End AlistoPedido;

End;
/

select documento, secuencia, articulo --, dump(articulo) 
from vendetpedido p, inv_articulo a
where p.cia='001'
  and p.sucursal='001'
  and p.documento=8
  and a.cod_cia='001'
  and a.cod_articulo=p.articulo
order by articulo;

begin
   venped.ordenar('001','001',8,'C');
   commit;
end;
/

set serveroutput on
begin
   if '79056M'>'CMB1' then
      dbms_output.put_line ('Si');
   else
      dbms_output.put_line ('No');
   end if;
end;
/
