-- Rutinas de la caja 1/1/1999
-- Desarrollo Creativo S.A.

CREATE OR REPLACE PROCEDURE CajaActiva is
BEGIN
   null;
END CajaActiva;
/

CREATE OR REPLACE PROCEDURE RemoteTest(Vcia in char, Vcaja in char) IS
   cursor transacciones is
      select 'S'
      from ventransaccionservidor
      where cia=Vcia
        and caja=Vcaja
        and estado='P';
   Existen char(1):='N';
BEGIN
   Open transacciones;
   fetch transacciones into Existen;
   close transacciones;
END RemoteTest;
/

CREATE OR REPLACE PROCEDURE CopiaOps(Vcia in char, Vcaja in char) IS
BEGIN
   Insert into operacioncajaServidor
      (CIA,CAJA,DIA,CAJERO,ANO_FISCAL,PER_PROCESO,TIPO,SALDOINICIO,    
       BALANCECAJA,SOBRACOMPENSA,ESTADO)
      select Vcia, Vcaja, dia, cajero, ano_fiscal,per_proceso, tipo, saldoinicio,
             balancecaja, sobracompensa, estado
      from operacioncaja c
      where cia=Vcia
        and caja=Vcaja
        and not exists (select caja from
                        operacioncajaservidor
                        where cia=Vcia
                          and caja=Vcaja
                          and dia=c.dia);    
END CopiaOps;
/

CREATE OR REPLACE PROCEDURE OperacionesOffLine(Vcia in char, Vcaja in char) IS
   cursor transacciones is
      select 'S'
      from ventransaccion
      where cia=Vcia
        and caja=Vcaja
        and estado='P';
   Existen char(1):='N';
BEGIN
   Open transacciones;
   fetch transacciones into Existen;
   close transacciones;
   if nvl(Existen,'N')='N' then
      raise_application_error(-100,'ERROR <OpeOff>: No existen operaciones.');      
   end if;
END OperacionesOffLine;
/

CREATE OR REPLACE PROCEDURE ActualizaConsecutivo(Vcia  in char,
                            Vcaja in char,
                            Vclase in char,
                            Vinicio in number,
                            Vactual in number) IS
BEGIN
   update venbloques
      set actual=Vactual
   where cia=Vcia
     and caja=Vcaja
     and clase=Vclase
     and inicio=Vinicio;
   if SQl%NOTFOUND then
      raise_application_error(-100,'ERROR <ActCon>: Bloque no existe.');      
   end if;
END ActualizaConsecutivo;
/

CREATE OR REPLACE PROCEDURE SincronizeBloques (Pcia      IN char,
                        Pcaja     IN char,
                        Pclase    IN char,
                        Maximo    IN number) IS
   cursor bloquesActivos is
      select inicio, fecha, cantidad, actual, usuario
      from venbloquesservidor
      where cia=pcia
        and caja=pcaja
        and clase=pclase
        and inicio>actual-cantidad
      for update of actual;
   Vactual venbloques.actual%type;
BEGIN
   for b in bloquesactivos
   loop
      if b.inicio>Maximo then
         Insert into VenBloques
            (cia, caja, clase, inicio, fecha, cantidad, actual, usuario)
             Values (Pcia, Pcaja, pclase, b.inicio, b.fecha, b.cantidad, b.actual, b.usuario);
      else
         select actual into Vactual
         from venbloques
         where cia=pcia
         and caja=pcaja
         and clase=pclase
         and inicio=b.inicio;
         if b.actual<Vactual then
            update venbloquesservidor
               set actual=Vactual
            where current of bloquesActivos;
         end if;
      end if;
   end loop;
END SincronizeBloques;
/

CREATE OR REPLACE PROCEDURE CreaBloques(Pcia      IN char,
                          Psucursal IN char,
                          Pcaja     IN char,
                          Pclase    IN char,
                          Pnumdocs  IN number) IS
   docActual VenConsecutivo.documento%type;
   docsBloq  VenConsecutivo.docsBloque%type;
   numBloqs  number(4):=1;

BEGIN
   --- Verifica que ya exista en la tabla de Consecutivos
   select documento, docsBloque
      into   docActual, docsBloq
   from   VenConsecutivoServidor
   where  cia      = Pcia
   and    sucursal = Psucursal
   and    clase    = Pclase
   for update of documento;
   ---
   numbloqs:=trunc((PnumDocs-1)/docsbloq)+1;
   for i in 1..numbloqs
   loop
      Insert into VenBloquesServidor
         (cia, caja, clase, inicio, fecha, cantidad, actual, usuario)
      Values
         (Pcia, Pcaja, Pclase, docActual+(i-1)*docsBloq, sysdate, docsBloq, docActual+(i-1)*docsBloq, User);
   end loop;
   Update VenConsecutivoServidor
      set    documento = documento + docsBloque*numbloqs
   where  cia      = Pcia
   and    sucursal = Psucursal
   and    clase    = Pclase;
END CreaBloques;
/

CREATE OR REPLACE PROCEDURE ActualizaBloques(Pcia      IN char,
                                Psucursal in char,
                                Pcaja     IN char,
                                Pclase    In char,
                                Pminimo   in number) IS
   total  number(6);
   maximo venbloques.inicio%type;
BEGIN
   select sum(inicio+cantidad-actual) into total
   from venbloques
      where cia=pcia
      and   caja=pcaja
      and   clase=pclase
      and   inicio>actual-cantidad;
   select max(inicio) into maximo
   from venbloques
   where cia=pcia
     and caja=pcaja
     and clase=pclase;
   if nvl(total,0)<nvl(pminimo,0) then
      CreaBloques(Pcia, Psucursal, Pcaja, Pclase, nvl(pminimo,0)-nvl(total,0));
   end if;
   SincronizeBloques(Pcia, Pcaja, Pclase, nvl(Maximo,0));
END ActualizaBloques;
/

CREATE OR REPLACE PROCEDURE SincronizeCaja(Pcia in char, Psucursal in char, Pcaja in char,
                         minpedido in number, minfactura in number,
                         mindevolucion in number, minpago in number,
                         minservicio in number, minvale in number) IS
BEGIN
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'O', MinPedido);
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'F', Minfactura);
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'D', Mindevolucion);
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'P', Minpago);
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'S', Minservicio);
   ActualizaBloques (Pcia, Psucursal, Pcaja, 'V', Minvale);
   Commit;
END SincronizeCaja;
/

CREATE OR REPLACE PROCEDURE CopiaDeposito(Vcia in char, VConcepto in char, Vdoc in number,
                                          Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into vendepositoservidor
         (CIA, CONCEPTO, DEPOSITO, SUCURSAL, CAJA, CAJERO, DIA, FECHA, DESCRIPCION,
          MONEDA, VALORES, EFECTIVO, TIPOCAMBIO, CAMBIOBASE, ESTADO)
         select CIA, CONCEPTO, DEPOSITO, SUCURSAL, CAJA, CAJERO, DIA, FECHA, DESCRIPCION, MONEDA,
                VALORES, EFECTIVO, TIPOCAMBIO, CAMBIOBASE, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from vendeposito
         where cia=Vcia
           and concepto=Vconcepto
           and deposito=Vdoc;
      insert into vendetdepositoservidor
         select * from vendetdeposito
         where cia=Vcia
           and concepto=Vconcepto
           and deposito=Vdoc;
   else
      update vendepositoservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
           and concepto=Vconcepto
           and deposito=Vdoc;
   end if;
END CopiaDeposito;
/

CREATE OR REPLACE PROCEDURE CopiaCierre(Vcia in char, VCaja in char, Vdia in date,
                                        Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into vencierreservidor
         (CIA, CAJA, DIA, CAJERO, DESCRIPCION, FECHA, ESTADO)
         select CIA, CAJA, DIA, CAJERO, DESCRIPCION, FECHA, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from vencierre   
         where cia=Vcia
           and caja=Vcaja
           and dia=Vdia;
      insert into vendetcierreservidor
         select * from vendetcierre
         where cia=Vcia
           and caja=Vcaja
           and dia=Vdia;
   else
      update vencierreservidor
         set estado=substr(vtrans,2,1)
      where cia=Vcia
        and caja=Vcaja
        and dia=Vdia;
   end if;
END CopiaCierre;
/

CREATE OR REPLACE PROCEDURE CopiaDevolucion(Vcia in char, VSuc in char, Vdoc in number,
                                            Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into vendevolucionservidor
         (CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, FECHA, PORCIMPUESTO,
          AGENTEVENTA, CLIENTE, LISTA_PRECIO, MONEDA, TIPOCAMBIO, CAMBIOBASE, ASIENTO, NOMBRE,         
          DESCRIPCION, ESTADO)         
         select CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, FECHA, PORCIMPUESTO,
                AGENTEVENTA, CLIENTE, LISTA_PRECIO, MONEDA, TIPOCAMBIO, CAMBIOBASE, ASIENTO, NOMBRE,         
                DESCRIPCION, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from vendevolucion
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into vendetdevolucionservidor
         select * from vendetdevolucion
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   else
      update vendevolucionservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
        and sucursal=Vsuc
        and documento=Vdoc;
   end if;
END CopiaDevolucion;
/

CREATE OR REPLACE PROCEDURE CopiaFactura(Vcia in char, VSuc in char, Vdoc in number,
                                         Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into venfacturaservidor
         (CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, PAGO, FECHA, VENCIMIENTO,
          PORCDESCUENTO, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, PERSONA, MONEDA,         
          TIPOCAMBIO, CAMBIOBASE, AUTORIZACION, CLAVE, ASIENTO, NOMBRE, DESCRIPCION, OTROSCARGOS,
          REFERENCIA, CONSIGNATARIO, ESTADO)
         select CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, PAGO, FECHA, VENCIMIENTO,
                PORCDESCUENTO, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, PERSONA, MONEDA,         
                TIPOCAMBIO, CAMBIOBASE, AUTORIZACION, CLAVE, ASIENTO, NOMBRE, DESCRIPCION, OTROSCARGOS,
                REFERENCIA, CONSIGNATARIO, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from venfactura
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into vendetfacturaservidor
         select * from vendetfactura
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   else
      update venfacturaservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
        and sucursal=Vsuc
        and documento=Vdoc;
   end if;
END CopiaFactura;
/

CREATE OR REPLACE PROCEDURE CopiaPedido(Vcia in char, VSuc in char, Vdoc in number,
                                         Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into venpedidoservidor
         (CIA, SUCURSAL, DOCUMENTO, CLASE, TIPO, LINEA, FECHA, PLAZO, VENCIMIENTO,
          PORCDESCUENTO, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, PERSONA,
          CONSIGNATARIO, FECHAREG, ATENCION,
          MONEDA, TIPOCAMBIO, CAMBIOBASE, AUTORIZACION, CLAVE, NOMBRE, DESCRIPCION,
          OTROSCARGOS, ESTADO)
         select CIA, SUCURSAL, DOCUMENTO, CLASE, TIPO, LINEA, FECHA, PLAZO, VENCIMIENTO,
                PORCDESCUENTO, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, PERSONA,
                CONSIGNATARIO, FECHAREG, ATENCION,
                MONEDA, TIPOCAMBIO, CAMBIOBASE, AUTORIZACION, CLAVE, NOMBRE, DESCRIPCION,
                OTROSCARGOS, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from venpedido
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into vendetpedidoservidor
         select * from vendetpedido
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   else
      update venpedidoservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
        and sucursal=Vsuc
        and documento=Vdoc;
   end if;
END CopiaPedido;
/

CREATE OR REPLACE PROCEDURE CopiaPago(Vcia in char, VSuc in char, Vdoc in number,
                                      Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into venpagoservidor
         (CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, FECHA, MONEDA, CLIENTE, CAMBIO,
         DESCRIPCION, ORIGEN, AGENTE, ESTADO)         
         select CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, FECHA, MONEDA, CLIENTE, CAMBIO,
                DESCRIPCION, ORIGEN, AGENTE, decode(substr(vtrans,2,1),'P','P','A','P','N')
         from venpago
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into venpagovaloresservidor
         select * from venpagovalores
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into venpagodocumentosservidor
         select * from venpagodocumentos
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   else
      update venpagoservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
        and sucursal=Vsuc
        and documento=Vdoc;
   end if;
END CopiaPago;
/

CREATE OR REPLACE PROCEDURE CopiaServicio(Vcia in char, VSuc in char, Vdoc in number,
                                          Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into venservicioservidor
         (CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, SERVICIO, PAGO, CLIENTE, FECHA, IDENTIFICACION,
          DESCRIPCION, VALORES, EFECTIVO, CAMBIOENTRADA, CAMBIOSALIDA, ESTADO)
         select CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, SERVICIO, PAGO, CLIENTE, FECHA, IDENTIFICACION,
                DESCRIPCION, VALORES, EFECTIVO, CAMBIOENTRADA, CAMBIOSALIDA,
                decode(substr(vtrans,2,1),'P','P','A','P','N')
         from venservicio
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
      insert into vensalservicioservidor
         select * from vensalservicio
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   else
      update venservicioservidor
         set estado=substr(Vtrans,2,1)
      where cia=Vcia
        and sucursal=Vsuc
        and documento=Vdoc;
   end if;
END CopiaServicio;
/

CREATE OR REPLACE PROCEDURE CopiaVale(Vcia in char, VSuc in char, Vdoc in number,
                                        Vtrans in char) is
BEGIN
   if substr(Vtrans,1,1)='I' then
      insert into venvaleservidor
         (CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, CLASE, FECHA, CLIENTE, IDENTIFICACION,
          DESCRIPCION, MONEDA, VALOR, SALDO, ESTADO)        
         select CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, CLASE, FECHA, CLIENTE, IDENTIFICACION,
                DESCRIPCION, MONEDA, VALOR, VALOR, ESTADO
         from venvale
         where cia=Vcia
           and sucursal=Vsuc
           and documento=Vdoc;
   end if;
END CopiaVale;
/

CREATE OR REPLACE PROCEDURE LevantaOps(Vcia in char, Vcaja in char, VNumero in number) IS
   cursor transacciones is
      select fechahora, transaccion, origen, llave, documento, estado
      from ventransaccion
      where cia=Vcia
        and caja=Vcaja
        and estado='P'
      order by fechahora, decode(origen, 'V','A','P','B','F','C','D')
      for update of estado;
   VtotalPago  number;
   Vconteo     number(4):=0;
BEGIN
   for t in transacciones
   loop
      if t.origen='B' then
         CopiaDeposito(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='C' then
         CopiaCierre(Vcia, Vcaja, to_date(t.llave, 'DDMMYYYY HH24MI'), t.transaccion);
      elsif t.origen='D' then
         CopiaDevolucion(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='F' then
         CopiaFactura(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='O' then
         CopiaPedido(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='P' then
         CopiaPago(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='S' then
         CopiaServicio(Vcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='V' then
         CopiaVale(Vcia, t.llave, t.documento, t.transaccion);
      end if;
      if substr(t.transaccion, 2, 1)='A' then
         insert into ventransaccionservidor
             (CIA, CAJA, FECHAHORA, TRANSACCION, ORIGEN, DOCUMENTO, LLAVE, ESTADO)
             Values (Vcia, Vcaja, t.fechahora, t.transaccion, t.origen, t.documento, t.llave,
                     decode(substr(t.transaccion,2,1),'P','A','A','P','N'));
         Vconteo:=Vconteo+1;
      end if;
      delete ventransaccion
      where current of transacciones;
      exit when Vconteo>=VNumero;
   end loop;
END LevantaOps;
/
