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

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

CREATE OR REPLACE Function CajaRemota(Palias in char, Pcia in char, Pcaja in char) return boolean IS
   x number(2);
BEGIN
   EXECUTE IMMEDIATE
         'Select 1 from caja@'||palias||' '||
         'where cia=:xcia and caja=:xcaja'
      into x
      using pcia, pcaja;
   return true;
Exception
   When others then
      return false;
END CajaRemota;
/

CREATE OR REPLACE PROCEDURE CierreRemoto(palias in char, pcia in char, pcaja in char, pcajero in char) IS
BEGIN
   EXECUTE IMMEDIATE
         'Update operacioncaja s set estado=''C'' '||
         'where s.cia=:xcia '||
         '  and s.caja=:xcaja '||
         '  and s.cajero=:xcajero '||
         '  and s.estado=''A'' '||
         '  and exists (select 1 from operacioncaja@'||palias||' r '||
         '      where r.cia=:xcia and r.caja=:xcaja and r.dia=s.dia and r.estado=''C'') '
         using pcia, pcaja, pcajero, pcia, pcaja;
END CierreRemoto;
/

CREATE OR REPLACE PROCEDURE CopiaOps(palias in char, pcia in char, pcaja in char, pcajero in char) IS
BEGIN
   EXECUTE IMMEDIATE
         'Insert into operacioncaja '||
         '(CIA,CAJA,DIA,CAJERO,ANO_FISCAL,PER_PROCESO,TIPO,SALDOINICIO,'||
         ' BALANCECAJA,SOBRACOMPENSA,ESTADO) '||
         'select cia, caja, dia, cajero, ano_fiscal,per_proceso, tipo, saldoinicio,'||
         '   balancecaja, sobracompensa, estado '||
         'from operacioncaja@'||palias||' r '||
         'where r.cia=:xcia and r.caja=:xcaja and r.cajero=:xcajero '||
         '  and not exists (select 1 from operacioncaja s '||
         '      where s.cia=:xcia and s.caja=:xcaja and s.dia=r.dia)'
      USING pcia, pcaja, pcajero, pcia, pcaja;
END CopiaOps;
/

CREATE OR REPLACE FUNCTION OperacionesOffLine(palias in char, pcia in char, pcaja in char) return number IS
   TYPE    TransCurx IS REF CURSOR;
   tcv     TransCurx;
   Existen number(5):=0;
BEGIN
   OPEN tcv FOR
         'SELECT count(*) FROM ventransaccion@'||palias||' '||
         'WHERE cia  = :xcia AND caja = :xcaja AND estado = ''P'' '
      USING pcia, pcaja;
   fetch tcv into Existen;
   close tcv;
   return nvl(Existen,0);
END OperacionesOffLine;
/

CREATE OR REPLACE PROCEDURE ActualizaConsecutivo(palias in char, 
                            pcia  in char,
                            pcaja in char,
                            pclase in char,
                            pinicio in number,
                            pactual in number) IS
BEGIN
   EXECUTE IMMEDIATE
         'update venbloques@'||palias||' set actual=:xac '||
         'where cia=:xcia and caja=:xcaja and clase=:xcla and inicio=:xini'
      USING pactual, pcia, pcaja, pclase, pinicio;
   if SQl%NOTFOUND then
      raise_application_error(-100,'ERROR <ActCon>: Bloque no existe.');      
   end if;
END ActualizaConsecutivo;
/

CREATE OR REPLACE FUNCTION SiguienteSerie(Vcia  in char,
                     Vcaja in char,
                     Vclase in char,
                     Vserie in char) RETURN NUMBER IS
   Vactual  VenBloques.actual%type:=null;
   cursor bloques is
      select actual
      from venbloques
      where cia=Vcia
      and   caja=Vcaja
      and   clase=Vclase
      and   ((serie is null and vSerie is null) or serie=Vserie)
      and   inicio>actual-cantidad
      order by inicio;
BEGIN
   open bloques;
   fetch bloques into Vactual;
   close bloques;
   return Vactual;
END siguienteSerie;
/

CREATE OR REPLACE FUNCTION consecutivoSerie(Vcia  in char,
                     Vcaja in char,
                     Vclase in char,
                     Valias in char,
                     Vserie in char,
                     Vcant  in number default 1) RETURN NUMBER IS
   pragma autonomous_transaction;
   Vactual  VenBloques.actual%type:=null;
   Vinicio  VenBloques.inicio%type:=null;
   cursor bloques is
      select inicio, actual
      from venbloques
      where cia=Vcia
      and   caja=Vcaja
      and   clase=Vclase
      and   ((serie is null and vserie is null) or serie = Vserie)
      and   inicio>actual-cantidad+vcant-1
      order by inicio
      for update of actual;
BEGIN
   open bloques;
   fetch bloques into Vinicio, Vactual;
   if Vinicio is not null and Vactual is not null then
      update venbloques
         set actual=Vactual+Vcant
      where current of bloques;
      close bloques;

      if Valias is not null then
         ActualizaConsecutivo(Valias, vcia, vcaja, vclase, vinicio, vactual+1);
      end if;

      commit;
   else
      close bloques;	
      raise_application_error(-20001,'No hay consecutivos disponibles en caja ('||Vcaja||'-'||Vclase||'-'||Vserie||') ');
   end if;

   return Vactual;
END ConsecutivoSerie;
/

-- Consecutivo Serie sin pragma
CREATE OR REPLACE FUNCTION consecutivoSerie(Vcia  in char,
                     Vcaja in char,
                     Vclase in char,
                     Valias in char,
                     Vserie in char,
                     Vcant  in number default 1) RETURN NUMBER IS
   Vactual  VenBloques.actual%type:=null;
   Vinicio  VenBloques.inicio%type:=null;
   cursor bloques is
      select inicio, actual
      from venbloques
      where cia=Vcia
      and   caja=Vcaja
      and   clase=Vclase
      and   ((serie is null and vserie is null) or serie = Vserie)
      and   inicio>actual-cantidad+vcant-1
      order by inicio
      for update of actual;
BEGIN
   open bloques;
   fetch bloques into Vinicio, Vactual;
   if Vinicio is not null and Vactual is not null then
      update venbloques
         set actual=Vactual+Vcant
      where current of bloques;
      close bloques;
      if Valias is not null then
         ActualizaConsecutivo(Valias, vcia, vcaja, vclase, vinicio, vactual+1);
      end if;
   else
      close bloques;	
      raise_application_error(-20001,'No hay consecutivos disponibles en caja ('||Vcaja||'-'||Vclase||'-'||Vserie||') ');
   end if;
   return Vactual;
END ConsecutivoSerie;
/

CREATE OR REPLACE PROCEDURE SincronizeBloques (palias in char,
                        pcia      IN char,
                        pcaja     IN char,
                        pclase    IN char,
                        Maximo    IN number) IS
   cursor bloquesActivos is
      select inicio, fecha, cantidad, actual, usuario
      from venbloques
      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
         execute immediate
               'Insert into VenBloques@'||palias||
               ' (cia, caja, clase, inicio, fecha, cantidad, actual, usuario) '||
               'Values (:xcia, :xcaja, :Xcla, :xini, :xfec, :xcan, :xact, :xusu)'
            using pcia, pcaja, pclase, b.inicio, b.fecha, b.cantidad, b.actual, b.usuario;
      else
         execute immediate
               'select actual from venbloques@'||palias||' '||
               'where cia=:xcia and caja=:xcaja and clase=:xcla and inicio=:xini'
               into vactual
            using pcia, pcaja, pclase, b.inicio;
         if b.actual<Vactual then
            update venbloques
               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   VenConsecutivo
   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 VenBloques
         (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 VenConsecutivo
      set    documento = documento + docsBloque*numbloqs
   where  cia      = Pcia
   and    sucursal = Psucursal
   and    clase    = Pclase;
END CreaBloques;
/

CREATE OR REPLACE Function ConsecDisponibles(palias in char,
                                pcia      IN char,
                                pcaja     IN char,
                                pclase    In char)  Return NUMBER IS
   total  number(6);
BEGIN
   -- Calcula el numero de consecutivos disponible
   execute immediate
         'select sum(inicio+cantidad-actual) from venbloques'||palias||' '||
         'where cia=:xcia and caja=:xcaja and clase=:xclase and inicio>actual-cantidad'
         into total
      using pcia, pcaja, pclase;
   return nvl(total,0);
END ConsecDisponibles;
/

CREATE OR REPLACE PROCEDURE ActualizaBloques(palias in char,
                                pcia      IN char,
                                psuc      In char,
                                pcaja     IN char,
                                pclase    In char,
                                Pminimo   in number) IS
   total  number(6);
   maximo venbloques.inicio%type;
BEGIN
   Total:=ConsecDisponibles('@'||palias, pcia, pcaja, pclase);
   -- Si los consecutivos disponibles esta por debajo del minimo crea los bloques necesarios
   if nvl(total,0)<nvl(pminimo,0) then
      CreaBloques(Pcia, Psuc, Pcaja, Pclase, nvl(pminimo,0)-nvl(total,0));
   end if;

   -- Verifica el bloque mas alto en la caja para sincronizar:
   --   Copia del servidor los mayores al mas alto
   --   Sube al servidor el 'actual' de los demas
   execute immediate 
         'select max(inicio) from venbloques@'||palias||' '||
         'where cia=:xcia and caja=:xcaja and clase=:xclase'
      into maximo
      using pcia, pcaja, pclase;
   SincronizeBloques(Palias, Pcia, Pcaja, Pclase, nvl(Maximo,0));
END ActualizaBloques;
/

CREATE OR REPLACE PROCEDURE SincronizeCaja(Palias in char, 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 (Palias, Pcia, Psucursal, Pcaja, 'O', MinPedido);
   ActualizaBloques (Palias, Pcia, Psucursal, Pcaja, 'F', Minfactura);
   ActualizaBloques (Palias, Pcia, Psucursal, Pcaja, 'D', Mindevolucion);
   ActualizaBloques (Palias, Pcia, Psucursal, Pcaja, 'P', Minpago);
   ActualizaBloques (Palias, Pcia, Psucursal, Pcaja, 'S', Minservicio);
   ActualizaBloques (Palias, Pcia, Psucursal, Pcaja, 'V', Minvale);
   --commit; xxx
END SincronizeCaja;
/

CREATE OR REPLACE PROCEDURE CreaPista(Vcia in char, Vcaja in char, Vcajero in char, Vfecha in date,
             Vmodo in varchar2, VtransTipo in char, VtransEstado in char,
             Vorigen in char, documento in number, Vllave in char) IS
BEGIN
   if Vmodo='OffLine' and (VtransTipo='I' or VtransEstado in ('A','N')) then
      Insert into VenTransaccion
         (CIA, CAJA, CAJERO, FECHAHORA, TRANSACCION, ORIGEN, DOCUMENTO, LLAVE, ESTADO)
         Values (Vcia, Vcaja, Vcajero, Vfecha, VtransTipo||VtransEstado, Vorigen, documento, Vllave, 'P');
   End if;
END CreaPista;
/

CREATE OR REPLACE PROCEDURE CopiaDeposito(palias in char, pcia in char, pConcepto in char,
                                          pdoc in number, ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate 
            'insert into vendeposito (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(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from vendeposito@'||Palias||' '||
            'where cia=:xcia and concepto=:xcon and deposito=:xdoc'
         using Ptrans, pcia, pconcepto, pdoc;
      execute immediate
            'insert into vendetdeposito '||
            '   select * from vendetdeposito@'||palias||' '||
            '   where cia=:xcia and concepto=:xcon and deposito=:xdoc'
         using pcia, pconcepto, pdoc;
   elsif Ptrans='UN' then
      update vendeposito
         set estado=substr(ptrans,2,1)
      where cia=pcia
           and concepto=pconcepto
           and deposito=pdoc;
   end if;
END CopiaDeposito;
/

CREATE OR REPLACE PROCEDURE CopiaCierre(Palias in char, Pcia in char, PCaja in char,
                                        Pdia in date, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate 
            'insert into vencierre '||
            '      (CIA, CAJA, DIA, CAJERO, DESCRIPCION, FECHA, ESTADO) '||
            '   select CIA, CAJA, DIA, CAJERO, DESCRIPCION, FECHA, '||
            '      decode(substr(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from vencierre@'||Palias||' '||
            'where cia=:xcia and caja=:xcaja and dia=:xdia'
         using Ptrans, Pcia, Pcaja, Pdia;
      execute immediate
            'insert into vendetcierre '||
            'select * from vendetcierre@'||palias||' '||
            'where cia=:xcia and caja=:xcaja and dia=:xdia'
         using pcia, pcaja, pdia;
   elsif Ptrans='UN' then
      update vencierre
         set estado=substr(ptrans,2,1)
      where cia=Pcia
        and caja=Pcaja
        and dia=Pdia;
   end if;
END CopiaCierre;
/

CREATE OR REPLACE PROCEDURE CopiaDevolucion(Palias in char, Pcia in char, PSuc in char,
                                            Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into vendevolucion '||
            '   (CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, '||
            '    FECHA, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, MONEDA, TIPOCAMBIO, '||
            '    CAMBIOBASE, OTROSCARGOS, ASIENTO, NOMBRE, DESCRIPCION, ESTADO) '||
            'select CIA, SUCURSAL, DOCUMENTO, TIPO, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, '||
            '    FECHA, PORCIMPUESTO, AGENTEVENTA, CLIENTE, LISTA_PRECIO, MONEDA, TIPOCAMBIO, '||
            '    CAMBIOBASE, OTROSCARGOS, ASIENTO, NOMBRE, DESCRIPCION, '||
            '    decode(substr(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from vendevolucion@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
      execute immediate
            'insert into vendetdevolucion '||
            '   select * from vendetdevolucion@'||Palias||' '||
            '   where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using pcia, psuc, pdoc;
   elsif Ptrans='UN' then
      update vendevolucion
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaDevolucion;
/

CREATE OR REPLACE PROCEDURE CopiaFactura(Palias in char, Pcia in char, Psuc in char,
                                         Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into venfactura (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(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from venfactura@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
      execute immediate
            'insert into vendetfactura '||
            '   select * from vendetfactura@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Pcia, Psuc, Pdoc;
   elsif Ptrans='UN' then
      update venfactura
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaFactura;
/

CREATE OR REPLACE PROCEDURE CopiaPedido(Palias in char, Pcia in char, PSuc in char,
                                        Pdoc in number, Ptrans in char) is
   Function Existe return boolean is
      Vexiste number(1):=null;
   Begin
      select 1 into Vexiste
      from venpedido
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
      return True;
   Exception
      when no_data_found then
         return false;
   End;
BEGIN
   if substr(Ptrans,1,1)='I' then
      If Not Existe Then
         execute immediate
              'insert into venpedido (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(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
              'from venpedido@'||palias||' '||
              'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
            using Ptrans, Pcia, Psuc, Pdoc;
         execute immediate
               'insert into vendetpedido '||
               '   select * from vendetpedido@'||Palias||' '||
               'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
            using Pcia, Psuc, Pdoc;
      end if;
   else
      update venpedido
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaPedido;
/

CREATE OR REPLACE PROCEDURE CopiaPago(Palias in char, Pcia in char, PSuc in char,
                                      Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into venpago (CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, FECHA, MONEDA, '||
            '   TIPOCAMBIO, CAMBIOBASE, CLIENTE, CAMBIO, DESCRIPCION, ORIGEN, AGENTE, ESTADO) '||
            'select CIA, SUCURSAL, DOCUMENTO, CAJA, CAJERO, DIA, FECHA, MONEDA, '||
            '   TIPOCAMBIO, CAMBIOBASE, CLIENTE, CAMBIO, DESCRIPCION, ORIGEN, AGENTE, '||
            '   decode(substr(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from venpago@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
      execute immediate
            'insert into venpagovalores '||
            'select * from venpagovalores@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Pcia, Psuc, Pdoc;
      execute immediate
            'insert into venpagodocumentos '||
            'select * from venpagodocumentos@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Pcia, Psuc, Pdoc;
   elsif Ptrans='UN' then
      update venpago
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaPago;
/

CREATE OR REPLACE PROCEDURE CopiaServicio(Palias in char, Pcia in char, PSuc in char,
                                          Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into venservicios (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(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from venservicio@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
      execute immediate
            'insert into vensalservicio '||
            '   select * from vensalservicio@'||Palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Pcia, Psuc, Pdoc;
   elsif Ptrans='UN' then
      update venservicio
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaServicio;
/

CREATE OR REPLACE PROCEDURE CopiaVale(Palias in char, Pcia in char, PSuc in char,
                                      Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into venvale (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, '||
            '   decode(substr(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from venvale@'||Palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
   elsif Ptrans='UN' then
      update venvale
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaVale;
/

CREATE OR REPLACE PROCEDURE CopiaNota(Palias in char, Pcia in char, PSuc in char,
                                            Pdoc in number, Ptrans in char) is
BEGIN
   if substr(Ptrans,1,1)='I' then
      execute immediate
            'insert into vennota '||
            '   (CIA, SUCURSAL, DOCUMENTO, TIPO, TIPODOC, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, '||
            '    FECHA, PORCIMPUESTO, AGENTEVENTA, CLIENTE, MONEDA, TIPOCAMBIO, '||
            '    CAMBIOBASE, NOMBRE, DESCRIPCION, OTROSCARGOS, PAGO,ESTADO) '||
            'select CIA, SUCURSAL, DOCUMENTO, TIPO, TIPODOC, CAJA, CAJERO, DIA, LINEA, FACTURA, VALE, '||
            '    FECHA, PORCIMPUESTO, AGENTEVENTA, CLIENTE, MONEDA, TIPOCAMBIO, '||
            '    CAMBIOBASE, NOMBRE, DESCRIPCION, OTROSCARGOS, PAGO, '||
            '    decode(substr(:xtra,2,1),''P'',''P'',''A'',''P'',''N'') '||
            'from venNOTA@'||palias||' '||
            'where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using Ptrans, Pcia, Psuc, Pdoc;
      execute immediate
            'insert into vendetNOTA '||
            '   select * from vendetNOTA@'||Palias||' '||
            '   where cia=:xcia and sucursal=:xsuc and documento=:xdoc'
         using pcia, psuc, pdoc;
   elsif Ptrans='UN' then
      update vennota
         set estado=substr(Ptrans,2,1)
      where cia=Pcia
        and sucursal=Psuc
        and documento=Pdoc;
   end if;
END CopiaNOTA;
/

CREATE OR REPLACE FUNCTION LevantaOps(palias in char, pcia in char, pcaja in char, pcajero in char) RETURN NUMBER IS
   TYPE        TransCur IS REF CURSOR;
   TYPE        TransRec is
      RECORD
         (fechahora    date,
          transaccion  char(2),
          origen       char(1),
          llave        varchar(15),
          documento    number(10),
          estado       char(1));
   tcv         TransCur;
   t           TransRec;
   Vcont       number(6):=0;
BEGIN
   CopiaOps(pAlias, Pcia, Pcaja, pcajero);
   OPEN tcv FOR
         'select fechahora, transaccion, origen, llave, documento, estado '||
         'from ventransaccion@'||palias||' '||
         'where cia=:xcia and caja=:xcaja and cajero=:xcajero and estado=''P'' '||
         'order by decode(origen, ''V'',''A'',''P'',''B'',''F'',''C'',''D'',''D'',''F''), fechahora '||
         'for update of estado'
      USING pcia, pcaja, pcajero;
   loop
      fetch tcv into t;
      exit when tcv%notfound;
      if t.origen='B' then
         CopiaDeposito(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='C' then
         CopiaCierre(palias, pcia, pcaja, to_date(t.llave, 'DDMMYYYY HH24MI'), t.transaccion);
      elsif t.origen='D' then
         CopiaDevolucion(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='F' then
         CopiaFactura(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='O' then
         CopiaPedido(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='P' then
         CopiaPago(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='S' then
         CopiaServicio(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='V' then
         CopiaVale(palias, pcia, t.llave, t.documento, t.transaccion);
      elsif t.origen='N' then
         CopiaNota(palias, pcia, t.llave, t.documento, t.transaccion);
      end if;
      if substr(t.transaccion, 2, 1)='A' then
         insert into ventransaccion
             (CIA, CAJA, CAJERO, FECHAHORA, TRANSACCION, ORIGEN, DOCUMENTO, LLAVE, ESTADO)
             Values (pcia, pcaja, pcajero, t.fechahora, t.transaccion, t.origen,
                     t.documento, t.llave, 'P');
      end if;
      EXECUTE IMMEDIATE
            'delete from ventransaccion@'||Palias||' tr '||
            'where cia=:xcia and caja=:xcaja and cajero=:xcajero and fechahora=:xfh '||
            '  and transaccion=:xtr and origen=:xor '
         USING pcia, pcaja, pcajero, t.fechahora, t.transaccion, t.origen;
      Vcont:=Vcont+1;
   end loop;
   close tcv;
   return Vcont;
END LevantaOps;
/
