ALTER TABLE PUB_EMPRESAS
ADD IND_PROVISION INTEGER;

ALTER TABLE OPE_TIPO_MERCADERIA
ADD TIPO_MERCANCIAS INTEGER;

COMMENT ON COLUMN OPE_TIPO_MERCADERIA.TIPO_MERCANCIAS IS 
'0: Reefer (refrigeradas)
1: Dry (secas)';

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 1);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 2);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 0
WHERE (CODEMP = '08') AND
      (ID = 3);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 0
WHERE (CODEMP = '08') AND
      (ID = 4);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 5);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 6);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 0
WHERE (CODEMP = '08') AND
      (ID = 7);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 9);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 0
WHERE (CODEMP = '08') AND
      (ID = 8);

UPDATE OPE_TIPO_MERCADERIA SET 
    TIPO_MERCANCIAS = 1
WHERE (CODEMP = '08') AND
      (ID = 10);

INSERT INTO PUB_TABLA_PARAMETROS (EMPRESA, LLAVE, ITEM, CODIGO, DESCRIPCION, COMENTARIO, VALOR_OPCIONAL1, VALOR_OPCIONAL2, VALOR_OPCIONAL3) VALUES ('08', 'CUENTA_IGV_MP', 1, '6411010000', 'CUENTA GASTO X IGV', 'Parámetro de cuenta contable de gasto por IGV', NULL, NULL, NULL);

SET TERM ^ ;

create or alter procedure SP_GENERAR_OS_CUSTODIA (
    CODEMP varchar(2),
    CODLOC varchar(2),
    ANIO_CONVOY integer,
    ITEM_CONVOY integer,
    USUARIO varchar(15),
    ACCION varchar(1))
returns (
    ANIO_SLP integer,
    TIPO_SLP varchar(2),
    NRO_SLP integer,
    ID_PLANTA integer,
    VAR_NRO_ORDEN numeric(18,0),
    ID_PROVEEDOR varchar(15),
    RAZON_SOC varchar(150),
    COD_CONCEPTO varchar(3),
    UND_COSTEO varchar(2),
    MONEDA char(1),
    CANTIDAD numeric(12,3),
    COSTO decimal(18,6),
    OUT_TOTAL_VALOR numeric(18,4),
    OUT_TOTAL_IGV numeric(18,4),
    OUT_TOTAL_PRECIO numeric(18,4))
as
declare variable VAR_DIAS_CREDITO integer;
declare variable VAR_FORMA_PAGO varchar(2);
declare variable VAR_UNIDAD_NEGOCIO varchar(20);
declare variable VAR_DESCRIPCION_REQ varchar(250);
declare variable VAR_ITEM integer;
declare variable VAR_ITEM_DET integer;
declare variable VAR_CONT_PROV integer;
declare variable VAR_ROL varchar(2);
declare variable VAR_FAMILIA varchar(2);
declare variable VAR_CENCOS varchar(30);
declare variable VAR_TIPO_CATALOGO varchar(3);
declare variable VAR_ID_ARTICULO varchar(15);
declare variable VAR_DES_ARTICULO varchar(150);
declare variable VAR_DESTINO varchar(10);
declare variable VAR_DES_ROL varchar(150);
declare variable VAR_MEDIDA varchar(10);
declare variable VAR_CANT_UNIDADES integer;
declare variable VAR_TELEFONO varchar(75);
declare variable VAR_CONTACTO varchar(50);
declare variable VAR_DES_PLANTA varchar(40);
declare variable VAR_DES_DESTINO varchar(40);
declare variable VAR_CONTADOR integer;
declare variable VAR_NRO_ORDEN_SLP integer;
declare variable VAR_TOTAL_UNIDADES integer;
declare variable VAR_REFERENCIA varchar(100);
declare variable VAR_DES_MERCADERIA varchar(50);
declare variable VAR_NOM_SLP varchar(20);
declare variable VAR_USUARIO_VB_LOG varchar(20);
declare variable V_VALOR integer;
declare variable VAR_TIPO_OS_AUTO varchar(20);
begin

  if (:ACCION = 'G') then ---Si se genera la Orden de Servicio
  begin
    VAR_CONTADOR = 0;
    VAR_ITEM_DET = 0;
    OUT_TOTAL_VALOR = 0;

    /*Se obtiene el Nro de Orden del Convoy*/
    select OPE_CONVOY.OS_NRO_ORDEN
    from OPE_CONVOY
    where OPE_CONVOY.CODEMP = :CODEMP and
          OPE_CONVOY.CODLOC = :CODLOC and
          OPE_CONVOY.ANIO = :ANIO_CONVOY and
          OPE_CONVOY.ITEM = :ITEM_CONVOY
    into :VAR_NRO_ORDEN;

    /*Se obtiene el parametro para el indicador de conformidad*/
    select PS.VALOR_OPCIONAL1, PS.CODIGO
    from PUB_TABLA_PARAMETROS PS
    where PS.EMPRESA = :CODEMP and
          PS.LLAVE = 'IND_CONFORMIDAD' and
          PS.CODIGO = 'OS_CUSTODIA'
    into V_VALOR, VAR_TIPO_OS_AUTO;

    if (V_VALOR is null) then
      V_VALOR = 0;

    ------------------------------Generar O/S para Convoys---------------------------------------
    for select OPE_CONVOY.COD_PROV_CUST, OPE_CONVOY.DES_PROV_CUST, OPE_SLP_CONVOY.ANIO_SLP, OPE_SLP_CONVOY.TIPO_SLP,
               OPE_SLP_CONVOY.NRO_SLP, OPE_CONVOY.ID_ALMACEN, COS_CAMPANA.PUERTO_EMBARQUE, OPE_CONVOY.NRO_UNIDADES,
               coalesce(OPE_SLP.REFERENCIA, ''), OPE_SLP.DES_MERCADERIA, PUB_TIPO_SLP.NOM_SLP, OPE_SLP.ID_CENCOS,
               count(*)
        from OPE_SLP_CONVOY
        join PUB_TIPO_SLP on (PUB_TIPO_SLP.TIPO_SLP = OPE_SLP_CONVOY.TIPO_SLP)
        join OPE_CONVOY on (OPE_CONVOY.CODEMP = OPE_SLP_CONVOY.CODEMP and OPE_CONVOY.CODLOC = OPE_SLP_CONVOY.CODLOC and OPE_CONVOY.ANIO = OPE_SLP_CONVOY.ANIO_CONVOY and OPE_CONVOY.ITEM = OPE_SLP_CONVOY.ITEM_CONVOY)
        join OPE_SLP on (OPE_SLP.CODEMP = OPE_SLP_CONVOY.CODEMP and OPE_SLP.CODLOCAL = OPE_SLP_CONVOY.CODLOC and OPE_SLP.ANIO = OPE_SLP_CONVOY.ANIO_SLP and OPE_SLP.TIPO_SLP = OPE_SLP_CONVOY.TIPO_SLP and OPE_SLP.NRO_SLP = OPE_SLP_CONVOY.NRO_SLP)
        join COS_CAMPANA on (COS_CAMPANA.CODEMP = OPE_SLP.CODEMP and COS_CAMPANA.CODLOC = OPE_SLP.CODLOCAL and COS_CAMPANA.ANIO = OPE_SLP.ANIO_CAMPANA and COS_CAMPANA.NRO_CAMPANA = OPE_SLP.NRO_CAMPANA)
        where OPE_SLP_CONVOY.CODEMP = :CODEMP and
              OPE_SLP_CONVOY.CODLOC = :CODLOC and
              OPE_SLP_CONVOY.ANIO_CONVOY = :ANIO_CONVOY and
              OPE_SLP_CONVOY.ITEM_CONVOY = :ITEM_CONVOY
        group by 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
        into :ID_PROVEEDOR, :RAZON_SOC, :ANIO_SLP, :TIPO_SLP, :NRO_SLP, :ID_PLANTA, :VAR_DESTINO, :VAR_TOTAL_UNIDADES,
             :VAR_REFERENCIA, :VAR_DES_MERCADERIA, :VAR_NOM_SLP, :VAR_CENCOS, :VAR_CANT_UNIDADES

    do
    begin

      VAR_CONTADOR = VAR_CONTADOR + 1;
      VAR_NRO_ORDEN_SLP = null;

      if (:VAR_CANT_UNIDADES > 0) then
      begin

        if (:VAR_CONTADOR = 1) then
        begin
          /*Se obtiene Unidad de Negocio de la Orden de Custodia*/
          select DESCRIPCION
          from PUB_TABLA_PARAMETROS
          where EMPRESA = :CODEMP and
                LLAVE = 'UNIDAD_NEGOCIO' and
                CODIGO = :TIPO_SLP
          into :VAR_UNIDAD_NEGOCIO;

          /*Se obtiene el Rol del Proveedor de Custodia*/
          select PUB_ROLES.COD_ROL, PUB_ROLES.COD_FAMILIA, PUB_ROLES.DES_ROL
          from PUB_ROLES
          where PUB_ROLES.CODEMP = :CODEMP and
                PUB_ROLES.COD_FAMILIA = (select PS.VALOR
                                         from PARAMETROS_SISTEMAS PS
                                         where PS.EMPRESA = :CODEMP and
                                               PS.SISTEMA = '015' and
                                               PS.LLAVE = 'CUSTODIA')
          into :VAR_ROL, :VAR_FAMILIA, :VAR_DES_ROL;
        end

        select count(*)
        from OPE_SLP_ROLES
        where OPE_SLP_ROLES.CODEMP = :CODEMP and
              OPE_SLP_ROLES.CODLOC = :CODLOC and
              OPE_SLP_ROLES.ANIO = :ANIO_SLP and
              OPE_SLP_ROLES.TIPO_SLP = :TIPO_SLP and
              OPE_SLP_ROLES.NRO_SLP = :NRO_SLP and
              OPE_SLP_ROLES.COD_ROL = :VAR_ROL
        into :VAR_CONT_PROV;

        if (:VAR_CONT_PROV = 0) then
        begin
          insert into OPE_SLP_ROLES (CODEMP, CODLOC, ANIO, TIPO_SLP, NRO_SLP, COD_ROL, DES_ROL, ESTADO, COD_FAMILIA,
                                     FLAG_PLANTA)
          values (:CODEMP, :CODLOC, :ANIO_SLP, :TIPO_SLP, :NRO_SLP, :VAR_ROL, :VAR_DES_ROL, '1', :VAR_FAMILIA, '1');
        end

        /*Se recorre por moneda*/
        for select distinct '67', OPE_CONVOY_CUSTODIO.MONEDA
            from OPE_CONVOY_CUSTODIO
            where OPE_CONVOY_CUSTODIO.CODEMP = :CODEMP and
                  OPE_CONVOY_CUSTODIO.CODLOC = :CODLOC and
                  OPE_CONVOY_CUSTODIO.ANIO = :ANIO_CONVOY and
                  OPE_CONVOY_CUSTODIO.ITEM_CONVOY = :ITEM_CONVOY
            into :UND_COSTEO, :MONEDA
        do
        begin

          /*Se valida si el proveedor ya tiene asignado una Orden de Servicio*/
          select OSP.OS_NRO_ORDEN
          from OPE_SLP_PROVEEDORES OSP
          where OSP.CODEMP = :CODEMP and
                OSP.CODLOC = :CODLOC and
                OSP.ANIO = :ANIO_SLP and
                OSP.NRO_SLP = :NRO_SLP and
                OSP.TIPO_SLP = :TIPO_SLP and
                OSP.OS_UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
                OSP.OS_TIPO = 'S' and
                OSP.ID_PROVEEDOR = :ID_PROVEEDOR and
                OSP.ROL_PROVEEDOR = :VAR_ROL and
                OSP.COD_PLANTA = :ID_PLANTA and
                OSP.MONEDA = :MONEDA and
                OSP.UND_COSTEO = :UND_COSTEO
          into :VAR_NRO_ORDEN_SLP;

          VAR_ITEM = 0;

          select max(OSP.ITEM)
          from OPE_SLP_PROVEEDORES OSP
          where OSP.CODEMP = :CODEMP and
                OSP.CODLOC = :CODLOC and
                OSP.ANIO = :ANIO_SLP and
                OSP.TIPO_SLP = :TIPO_SLP and
                OSP.NRO_SLP = :NRO_SLP
          into :VAR_ITEM;

          if (:VAR_ITEM is null) then
            VAR_ITEM = 0;

          VAR_ITEM = VAR_ITEM + 1;

          if (:VAR_NRO_ORDEN_SLP is null) then
          begin
            insert into OPE_SLP_PROVEEDORES (CODEMP, CODLOC, ANIO, NRO_SLP, TIPO_SLP, ITEM, ROL_PROVEEDOR, ID_PROVEEDOR,
                                             DES_PROVEEDOR, COD_PLANTA, USUAREG, FECREG, USUAMOD, FECMOD,
                                             OS_UNID_OPERATIVA, OS_NRO_ORDEN, OS_TIPO, CANTIDAD, UND_COSTEO, MONEDA)
            values (:CODEMP, :CODLOC, :ANIO_SLP, :NRO_SLP, :TIPO_SLP, :VAR_ITEM, :VAR_ROL, :ID_PROVEEDOR, :RAZON_SOC,
                    :ID_PLANTA, :USUARIO, current_time, null, null, null, null, null, :CANTIDAD, :UND_COSTEO, :MONEDA);
          end
          ----------------------------------Generar la Orden de Servicio---------------------------

          --Paso 1 : Insertar Cabecera de O/S
          if (:VAR_CONTADOR = 1) then
          begin
            if (:VAR_NRO_ORDEN is null) then
            begin
              select coalesce(max(LOG_ORDENES.NRO_ORDEN), 0)
              from LOG_ORDENES
              where LOG_ORDENES.EMPRESA = :CODEMP and
                    LOG_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
                    LOG_ORDENES.ANIO = :ANIO_CONVOY and
                    LOG_ORDENES.TIPO = 'S'
              into :VAR_NRO_ORDEN;
              VAR_NRO_ORDEN = VAR_NRO_ORDEN + 1;
            end
            else
            begin
              delete from LOG_ORDENES
              where LOG_ORDENES.EMPRESA = :CODEMP and
                    LOG_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
                    LOG_ORDENES.ANIO = :ANIO_CONVOY and
                    LOG_ORDENES.TIPO = 'S' and
                    LOG_ORDENES.NRO_ORDEN = :VAR_NRO_ORDEN;

              delete from LOG_ORDENES_DET
              where LOG_ORDENES_DET.EMPRESA = :CODEMP and
                    LOG_ORDENES_DET.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
                    LOG_ORDENES_DET.ANIO = :ANIO_SLP and
                    LOG_ORDENES_DET.TIPO = 'S' and
                    LOG_ORDENES_DET.NRO_ORDEN = :VAR_NRO_ORDEN;

              /*Limpiamos el dato de la orden. BAVALOS 17.10.25*/
              update OPE_SLP_PROVEEDORES
              set OPE_SLP_PROVEEDORES.OS_UNID_OPERATIVA = NULL,
                  OPE_SLP_PROVEEDORES.OS_ANIO = NULL,
                  OPE_SLP_PROVEEDORES.OS_TIPO = NULL,
                  OPE_SLP_PROVEEDORES.OS_NRO_ORDEN = NULL
              where OPE_SLP_PROVEEDORES.CODEMP = :CODEMP and
                    OPE_SLP_PROVEEDORES.CODLOC = :CODLOC and
                    OPE_SLP_PROVEEDORES.ANIO = :ANIO_SLP and
                    OPE_SLP_PROVEEDORES.NRO_SLP = :NRO_SLP and
                    OPE_SLP_PROVEEDORES.TIPO_SLP = :TIPO_SLP and
                    OPE_SLP_PROVEEDORES.ID_PROVEEDOR = :ID_PROVEEDOR and
                    OPE_SLP_PROVEEDORES.ROL_PROVEEDOR = :VAR_ROL and
                    OPE_SLP_PROVEEDORES.COD_PLANTA = :ID_PLANTA and
                    OPE_SLP_PROVEEDORES.MONEDA = :MONEDA and
                    OPE_SLP_PROVEEDORES.UND_COSTEO = :UND_COSTEO;
    
              update OPE_CONVOY
              set OPE_CONVOY.OS_UNIDAD_OPE = NULL,
                  OPE_CONVOY.OS_ANIO = NULL,
                  OPE_CONVOY.OS_TIPO = NULL,
                  OPE_CONVOY.OS_NRO_ORDEN = NULL
              where OPE_CONVOY.CODEMP = :CODEMP and
                    OPE_CONVOY.CODLOC = :CODLOC and
                    OPE_CONVOY.ANIO = :ANIO_CONVOY and
                    OPE_CONVOY.ITEM = :ITEM_CONVOY;
            end

            ---Obtener datos del Proveedor -----
            select iif(PP.TIPO_PAGO = 1, 'CR', 'CO'), iif(PP.TIPO_PAGO = 1, PP.DIAS_CREDITO_PAGO, 0),
                   cast(PP.TELEFONO as varchar(25)), PP.NOM_REPRESENTANTE
            from PUB_PERSONAS PP
            where PP.CODEMP = :CODEMP and
                  PP.ID_PERSONA = :ID_PROVEEDOR
            into :VAR_FORMA_PAGO, :VAR_DIAS_CREDITO, :VAR_TELEFONO, :VAR_CONTACTO;

            --Obtener descripcion de Planta y Destino
            select OPE_PLANTAS.DECRIPCION
            from OPE_PLANTAS
            where OPE_PLANTAS.COD_PLANTA = :ID_PLANTA
            into :VAR_DES_PLANTA;

            select OPE_PUERTO.DES_PUERTO
            from OPE_PUERTO
            where OPE_PUERTO.PUERTOPAIS = :VAR_DESTINO
            into :VAR_DES_DESTINO;

            select PUB_TABLA_PARAMETROS.VALOR_OPCIONAL1
            from PUB_TABLA_PARAMETROS
            where PUB_TABLA_PARAMETROS.EMPRESA = :CODEMP and
                  PUB_TABLA_PARAMETROS.LLAVE = 'UNIDAD_NEGOCIO' and
                  PUB_TABLA_PARAMETROS.CODIGO = :TIPO_SLP
            into :VAR_USUARIO_VB_LOG;

            VAR_DESCRIPCION_REQ = 'SERVICIO DE CUSTODIA DE ' || :VAR_DES_PLANTA || ' - ' || :VAR_DES_DESTINO || '// PRODUCTO: ' || :VAR_DES_MERCADERIA;

            insert into LOG_ORDENES (EMPRESA, UNID_OPERATIVA, ANIO, TIPO, NRO_ORDEN, NRO_REQUERIMIENTO, ID_COTIZACION,
                                     FECHA, RUC_PROVEEDOR, RAZON_PROVEEDOR, FORMA_PAGO, DIAS_CREDITO, MONEDA,
                                     TIPO_ENTREGA, USUA_REG, FEC_REG, USUA_MOD, FEC_MOD, DESCRIPCION, VB_LOGISTICA,
                                     ORIENTACION, CON_CATALOGO, CON_INDICACIONES, ESTADO, ID_CENCOS, NRO_SLP, TIPO_SLP,
                                     CODLOCAL_SLP, ANIO_SLP, CONTACTO, FONO_PROVEEDOR, FECHA_VB_LOG, USUARIO_VB_LOG,
                                     RUTA_FIRMA_VB_LOG, IND_CONFORMIDAD, NIVEL_VB, TIPO_OS_AUTO, TIPO_REGISTRO,
                                     TIPO_CLASIFICACION, TIPO_CONFORMIDAD)
            values (:CODEMP, :VAR_UNIDAD_NEGOCIO, :ANIO_CONVOY, 'S', :VAR_NRO_ORDEN, 0, 0, current_date, :ID_PROVEEDOR,
                    :RAZON_SOC, :VAR_FORMA_PAGO, :VAR_DIAS_CREDITO, :MONEDA, 'IN', :USUARIO, current_time, :USUARIO,
                    current_time, :VAR_DESCRIPCION_REQ, 1, '1', '0', '0', 'OK', :VAR_CENCOS, :NRO_SLP, :TIPO_SLP,
                    :CODLOC, :ANIO_SLP, :VAR_CONTACTO, :VAR_TELEFONO, current_time, :VAR_USUARIO_VB_LOG,
                                                                                                                           'firma_' || lower(:VAR_USUARIO_VB_LOG) || '.png',
                                                                                                                           :V_VALOR,
                                                                                                                           9,
                                                                                                                           :VAR_TIPO_OS_AUTO,
                                                                                                                           1,1,'P');

          end

          --Paso 2 : Obtener costos de Tarifario de Campana

          for select TL.COD_CONCEPTO,
                     TL.COSTO_UNITARIO * cast((:VAR_CANT_UNIDADES * 1.00000 / :VAR_TOTAL_UNIDADES * 1.00000) as decimal(18,8)),
                     LC.TIPO_CATALOGO, LC.COD_ARTICULO, LC.DESCRIPCION, count(*)
              from OPE_CONVOY_CUSTODIO TL
              inner join LOG_CATALOGO LC on (LC.EMPRESA = TL.CODEMP and LC.COD_FAMILIA = TL.COD_FAMILIA and LC.COD_CONCEPTO = TL.COD_CONCEPTO)
              where TL.CODEMP = :CODEMP and
                    TL.CODLOC = :CODLOC and
                    TL.ANIO = :ANIO_CONVOY and
                    TL.ITEM_CONVOY = :ITEM_CONVOY
              group by 1, 2, 3, 4, 5
              order by LC.COD_ARTICULO
              into :COD_CONCEPTO, :COSTO, :VAR_TIPO_CATALOGO, :VAR_ID_ARTICULO, :VAR_DES_ARTICULO, :CANTIDAD
          do
          begin

            VAR_ITEM_DET = VAR_ITEM_DET + 1;
            VAR_MEDIDA = :UND_COSTEO;

            VAR_DES_ARTICULO = :VAR_DES_ARTICULO || ' (' || :VAR_NOM_SLP || ' ' || NRO_SLP || ')';
            --Fin Obtener

            insert into LOG_ORDENES_DET (EMPRESA, UNID_OPERATIVA, ANIO, TIPO, NRO_ORDEN, ITEM, NRO_REQUERIMIENTO,
                                         ID_COTIZACION, COD_PROD_SERV, DES_PROD_SERV, CANTIDAD, UNIMED, MONEDA,
                                         VALOR_VENTA, TOTAL_VALOR, CANTIDAD_FACTURADA, TIPO_CATALOGO, COD_PLANTA,
                                         CODLOCAL_SLP, ANIO_SLP, TIPO_SLP, NRO_SLP, ID_CENCOS)
            values (:CODEMP, :VAR_UNIDAD_NEGOCIO, :ANIO_CONVOY, 'S', :VAR_NRO_ORDEN, :VAR_ITEM_DET, 0, 0,
                    :VAR_ID_ARTICULO, :VAR_DES_ARTICULO, :CANTIDAD, :VAR_MEDIDA, :MONEDA, :COSTO, :COSTO * :CANTIDAD, 0,
                    :VAR_TIPO_CATALOGO, :ID_PLANTA, :CODLOC, :ANIO_SLP, :TIPO_SLP, :NRO_SLP, :VAR_CENCOS);

            OUT_TOTAL_VALOR = OUT_TOTAL_VALOR + (:COSTO * :CANTIDAD);

            suspend;
          end

          OUT_TOTAL_IGV = OUT_TOTAL_VALOR * 0.18;
          OUT_TOTAL_PRECIO = OUT_TOTAL_VALOR + OUT_TOTAL_IGV;

          if (:VAR_CONTADOR = 1) then
          begin
            VAR_DESCRIPCION_REQ = VAR_DESCRIPCION_REQ || '//' || :VAR_REFERENCIA;
          end
          else
          begin
            VAR_DESCRIPCION_REQ = VAR_DESCRIPCION_REQ || '\' || :VAR_REFERENCIA;
          end

          update LOG_ORDENES
          set TOTAL_VALOR = :OUT_TOTAL_VALOR,
              TOTAL_IGV = :OUT_TOTAL_IGV,
              TOTAL_PRECIO = :OUT_TOTAL_PRECIO,
              DESCRIPCION = :VAR_DESCRIPCION_REQ,
              FLAG_IGV = 1
          where LOG_ORDENES.EMPRESA = :CODEMP and
                LOG_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
                LOG_ORDENES.ANIO = :ANIO_CONVOY and
                LOG_ORDENES.TIPO = 'S' and
                LOG_ORDENES.NRO_ORDEN = :VAR_NRO_ORDEN;

          update OPE_SLP_PROVEEDORES
          set OPE_SLP_PROVEEDORES.OS_UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO,
              OPE_SLP_PROVEEDORES.OS_ANIO = :ANIO_CONVOY,
              OPE_SLP_PROVEEDORES.OS_TIPO = 'S',
              OPE_SLP_PROVEEDORES.OS_NRO_ORDEN = :VAR_NRO_ORDEN
          where OPE_SLP_PROVEEDORES.CODEMP = :CODEMP and
                OPE_SLP_PROVEEDORES.CODLOC = :CODLOC and
                OPE_SLP_PROVEEDORES.ANIO = :ANIO_SLP and
                OPE_SLP_PROVEEDORES.NRO_SLP = :NRO_SLP and
                OPE_SLP_PROVEEDORES.TIPO_SLP = :TIPO_SLP and
                OPE_SLP_PROVEEDORES.ID_PROVEEDOR = :ID_PROVEEDOR and
                OPE_SLP_PROVEEDORES.ROL_PROVEEDOR = :VAR_ROL and
                OPE_SLP_PROVEEDORES.COD_PLANTA = :ID_PLANTA and
                OPE_SLP_PROVEEDORES.MONEDA = :MONEDA and
                OPE_SLP_PROVEEDORES.UND_COSTEO = :UND_COSTEO;

          update OPE_CONVOY
          set OPE_CONVOY.OS_UNIDAD_OPE = :VAR_UNIDAD_NEGOCIO,
              OPE_CONVOY.OS_ANIO = :ANIO_CONVOY,
              OPE_CONVOY.OS_TIPO = 'S',
              OPE_CONVOY.OS_NRO_ORDEN = :VAR_NRO_ORDEN
          where OPE_CONVOY.CODEMP = :CODEMP and
                OPE_CONVOY.CODLOC = :CODLOC and
                OPE_CONVOY.ANIO = :ANIO_CONVOY and
                OPE_CONVOY.ITEM = :ITEM_CONVOY;

          --------------------------------------Fin Generar----------------------------------------
        end
      end
    end
  end

  if (:ACCION = 'A') then ---Si se anula la Orden de Servicio
  begin
    select OPE_CONVOY.COD_PROV_CUST, OPE_CONVOY.ID_ALMACEN, OPE_CONVOY.OS_UNIDAD_OPE, OPE_CONVOY.OS_NRO_ORDEN
    from OPE_CONVOY
    where OPE_CONVOY.CODEMP = :CODEMP and
          OPE_CONVOY.CODLOC = :CODLOC and
          OPE_CONVOY.ANIO = :ANIO_CONVOY and
          OPE_CONVOY.ITEM = :ITEM_CONVOY
    into :ID_PROVEEDOR, :ID_PLANTA, :VAR_UNIDAD_NEGOCIO, :VAR_NRO_ORDEN;

    /**Comentamos esta actualizacion, ya que la anulacion se hace desde un proceso del SIGA. BAVALOS 20.10.25**/
    /*if (:VAR_NRO_ORDEN is not null) then
    begin

      update LOG_ORDENES
      set LOG_ORDENES.ESTADO = 'AN'
      where LOG_ORDENES.EMPRESA = :CODEMP and
            LOG_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
            LOG_ORDENES.ANIO = :ANIO_CONVOY and
            LOG_ORDENES.TIPO = 'S' and
            LOG_ORDENES.NRO_ORDEN = :VAR_NRO_ORDEN;

      delete from LOG_CONFORMIDAD_ORDENES
      where LOG_CONFORMIDAD_ORDENES.EMPRESA = :CODEMP and
            LOG_CONFORMIDAD_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
            LOG_CONFORMIDAD_ORDENES.ANIO = :ANIO_CONVOY and
            LOG_CONFORMIDAD_ORDENES.TIPO = 'S' and
            LOG_CONFORMIDAD_ORDENES.NRO_ORDEN = :VAR_NRO_ORDEN;

    end */

    --Liberar las unidades de transporte
    update OPE_SLP_TRANSPORTE
    set OPE_SLP_TRANSPORTE.ANIO_CONVOY = 0,
        OPE_SLP_TRANSPORTE.ITEM_CONVOY = 0
    where OPE_SLP_TRANSPORTE.CODEMP = :CODEMP and
          OPE_SLP_TRANSPORTE.CODLOCAL = :CODLOC and
          OPE_SLP_TRANSPORTE.ANIO_CONVOY = :ANIO_CONVOY and
          OPE_SLP_TRANSPORTE.ITEM_CONVOY = :ITEM_CONVOY;

    --Anular Convoy
    update OPE_CONVOY
    set OPE_CONVOY.ESTADO = '0',
        OPE_CONVOY.USUA_MOD = :USUARIO,
        OPE_CONVOY.FEC_MOD = current_timestamp
    where OPE_CONVOY.CODEMP = :CODEMP and
          OPE_CONVOY.CODLOC = :CODLOC and
          OPE_CONVOY.ANIO = :ANIO_CONVOY and
          OPE_CONVOY.ITEM = :ITEM_CONVOY;

  end

end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_GENERAR_OS_CUSTODIA IS
'Fecha: 15.12.2023
Autor: Andy Villafana Gonzalez
Comentario: Se crea SP para generar ordenes de custodia
Version: 1.0
---------------------------------------------------------------------------------
Fecha: 20.10.2025
Autor: Brecia Avalos
Comentario: Comentamos la actualizaion del estado de la OS, ya que la anulacion se hace desde un proceso del SIGA.
Version: 1.1
---------------------------------------------------------------------------------';

/* Following GRANT statetements are generated automatically */

GRANT SELECT,UPDATE ON OPE_CONVOY TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON PUB_TABLA_PARAMETROS TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON OPE_SLP_CONVOY TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON PUB_TIPO_SLP TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON COS_CAMPANA TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON PUB_ROLES TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT,INSERT ON OPE_SLP_ROLES TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON OPE_CONVOY_CUSTODIO TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT,INSERT,UPDATE ON OPE_SLP_PROVEEDORES TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT,INSERT,DELETE,UPDATE ON LOG_ORDENES TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT,INSERT,DELETE ON LOG_ORDENES_DET TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON OPE_PLANTAS TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON OPE_PUERTO TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT ON LOG_CATALOGO TO PROCEDURE SP_GENERAR_OS_CUSTODIA;
GRANT SELECT,UPDATE ON OPE_SLP_TRANSPORTE TO PROCEDURE SP_GENERAR_OS_CUSTODIA;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_GENERAR_OS_CUSTODIA TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_LIQ_ORDEN_BROKERAGE (
    IN_COD_ID_TAB_CAB bigint,
    IN_ACCION char(2),
    IN_USUARIO varchar(15))
returns (
    OUT_CODEMP varchar(2),
    OUT_CODLOCAL varchar(2),
    OUT_ANIO integer,
    OUT_TIPO_SLP varchar(1),
    OUT_COD_PROVEEDOR varchar(15),
    OUT_RAZON_SOC varchar(150),
    OUT_MONEDA char(1),
    OUT_FLAG_IGV integer,
    OUT_IND_COSTEO integer,
    OUT_OS_UNID_OPERATIVA varchar(30),
    OUT_OS_ANIO integer,
    OUT_OS_TIPO varchar(1),
    OUT_OS_NRO_ORDEN numeric(18,0),
    OUT_COSTO_REAL_TOTAL numeric(18,6),
    OUT_USUARIO_ATENCION varchar(100),
    OUT_FECHA_ATENCION timestamp,
    OUT_ESTADO integer,
    OUT_USUARIO_MOD varchar(15),
    OUT_FECHA_MOD timestamp,
    OUT_ESTADO_OS varchar(50))
as
declare variable VAR_ITEM integer;
declare variable VAR_PUNTO_VENTA varchar(5);
declare variable VAR_COD_FAMILIA varchar(2);
declare variable VAR_COD_CONCEPTO varchar(3);
declare variable VAR_CANTIDAD numeric(15,2);
declare variable VAR_COSTO_REAL numeric(18,6);
declare variable VAR_COSTO numeric(18,6);
declare variable VAR_TOTAL_IGV numeric(18,6);
declare variable VAR_SUM_COSTO_REAL numeric(18,6);
declare variable VAR_SUM_TOTAL_IGV numeric(18,6);
declare variable VAR_COD_UNIDAD varchar(10);
declare variable VAR_COD_ARTICULO varchar(15);
declare variable VAR_UNIDAD_NEGOCIO varchar(10);
declare variable VAR_USUARIO_LOG varchar(15);
declare variable VAR_DESCRIPCION_OS varchar(150);
declare variable VAR_ANIO_ORDEN integer;
declare variable VAR_NRO_ORDEN integer;
declare variable VAR_DIAS_CREDITO integer;
declare variable VAR_FORMA_PAGO varchar(2);
declare variable VAR_TELEFONO varchar(75);
declare variable VAR_CONTACTO varchar(50);
declare variable VAR_NOM_SLP varchar(20);
declare variable VAR_BL varchar(20);
declare variable VAR_ID_BROKERAGE bigint;
declare variable VAR_ROWS integer;
declare variable VAR_CONTA_REBATE integer;
declare variable VAR_VALOR_IGV decimal(4,2);
declare variable VAR_ESTADO_OS char(2);
declare variable VAR_ID_CENCOS varchar(30);
declare variable VAR_ANIO_SLP integer;
declare variable VAR_NRO_SLP integer;
declare variable VAR_CATALOGO varchar(3);
declare variable VAR_DESCRIPCION_DETALLE varchar(250);
declare variable VAR_PRO_CODIGO varchar(10);
declare variable VAR_OBSERVACIONES varchar(300);
begin

  select OLC.CODEMP, OLC.CODLOCAL, OLC.ANIO, OLC.TIPO_SLP, OLC.COD_PROVEEDOR, PER.RAZON_SOC, OLC.MONEDA, OLC.FLAG_IGV,
         OLC.IND_COSTEO, OLC.OS_UNID_OPERATIVA, OLC.OS_ANIO, OLC.OS_TIPO, OLC.OS_NRO_ORDEN, OLC.COSTO_REAL_TOTAL,
         OLC.USUARIO_ATENCION, OLC.FECHA_ATENCION, OLC.ESTADO, OLC.USUARIO_MOD, OLC.FECHA_MOD,
         coalesce(OS.ESTADO, 'NL'), count(*)
  from OPE_LIQ_CAB OLC
  inner join PUB_PERSONAS PER on OLC.CODEMP = PER.CODEMP and OLC.COD_PROVEEDOR = PER.ID_PERSONA
  left join LOG_ORDENES OS on OLC.CODEMP = OS.EMPRESA and OLC.OS_UNID_OPERATIVA = OS.UNID_OPERATIVA and OLC.OS_ANIO = OS.ANIO and OLC.OS_TIPO = OS.TIPO and OLC.OS_NRO_ORDEN = OS.NRO_ORDEN
  where OLC.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB
  group by OLC.CODEMP, OLC.CODLOCAL, OLC.ANIO, OLC.TIPO_SLP, OLC.COD_PROVEEDOR, PER.RAZON_SOC, OLC.MONEDA, OLC.FLAG_IGV, OLC.IND_COSTEO, OLC.OS_UNID_OPERATIVA, OLC.OS_ANIO, OLC.OS_TIPO, OLC.OS_NRO_ORDEN, OLC.COSTO_REAL_TOTAL, OLC.USUARIO_ATENCION, OLC.FECHA_ATENCION, OLC.ESTADO, OLC.USUARIO_MOD, OLC.FECHA_MOD, OS.ESTADO
  into :OUT_CODEMP, :OUT_CODLOCAL, :OUT_ANIO, :OUT_TIPO_SLP, :OUT_COD_PROVEEDOR, :OUT_RAZON_SOC, :OUT_MONEDA,
       :OUT_FLAG_IGV, :OUT_IND_COSTEO, :OUT_OS_UNID_OPERATIVA, :OUT_OS_ANIO, :OUT_OS_TIPO, :OUT_OS_NRO_ORDEN,
       :OUT_COSTO_REAL_TOTAL, :OUT_USUARIO_ATENCION, :OUT_FECHA_ATENCION, :OUT_ESTADO,
       :OUT_USUARIO_MOD, :OUT_FECHA_MOD, :VAR_ESTADO_OS, :VAR_ROWS;


  select first 1 cast(pfv.valor/100 as decimal(4,2))
  from PUB_FACTORES_VALORES pfv
  where pfv.codfactor = '010101' and pfv.estado = 'A'
  order by pfv.fecha_inicial
  into :VAR_VALOR_IGV;

  if (:OUT_FLAG_IGV = 0 ) then VAR_VALOR_IGV = 0; -- AVILLAFANA 13.11.2023

  VAR_ITEM = 0;
  VAR_CONTA_REBATE = 0;
  VAR_SUM_COSTO_REAL = 0;
  VAR_SUM_TOTAL_IGV = 0;

  --Anular la liquidacion para generar una nueva
  if (:IN_ACCION = 'AN') then
  begin

    update OPE_LIQ_CAB OLC
    set OLC.ESTADO = 4,
        OLC.USUARIO_MOD = :IN_USUARIO,
        OLC.FECHA_MOD = current_timestamp
    where OLC.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB;

    for select OSBF.ID_BROKERAGE
        from OPE_LIQ_CAB OLC
        inner join OPE_LIQ_DET OLD on OLD.ID_OPE_LIQ_CAB = OLC.ID_OPE_LIQ_CAB
        inner join OPE_SLP_BROKERAGE_FACT OSBF on OLD.ID_BROKERAGE = OSBF.ID_BROKERAGE
        where OLC.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB
        into :VAR_ID_BROKERAGE
    do
    begin

        update OPE_SLP_BROKERAGE_FACT OSBF
        set OSBF.ID_OPE_LIQ_CAB = null
        where OSBF.ID_BROKERAGE = :VAR_ID_BROKERAGE;
    
        update OPE_LIQ_DET OLD
        set OLD.USUMOD = :IN_USUARIO,
            OLD.FECMOD = current_timestamp
        where OLD.ID_BROKERAGE = :VAR_ID_BROKERAGE;

    end
    /* Ya no sera necesario esta condicion porque la anulacion se hace directamente en la ventana, validando provisiones. BAVALOS 16.10.25
    if ((:OUT_ESTADO = 1 or :OUT_ESTADO = 3) and (:VAR_ESTADO_OS = 'OK' or :VAR_ESTADO_OS = 'NL' or :VAR_ESTADO_OS = 'AT' or :VAR_ESTADO_OS = 'VB'  )) then     --gchavez 21.03.24, se agrega estado de atendido y aprobado
    begin

      --Se anula las Ordenes de Servicios Generadas

      update LOG_ORDENES
      set LOG_ORDENES.ESTADO = 'AN'
      where LOG_ORDENES.EMPRESA = :OUT_CODEMP and
            LOG_ORDENES.UNID_OPERATIVA = :OUT_OS_UNID_OPERATIVA and
            LOG_ORDENES.ANIO = :OUT_OS_ANIO and
            LOG_ORDENES.TIPO = :OUT_OS_TIPO and
            LOG_ORDENES.NRO_ORDEN = :OUT_OS_NRO_ORDEN;

    end  */
    OUT_ESTADO_OS=  VAR_ESTADO_OS; --gchavez 21.03.24 obtener estado de os
    suspend;

  end

  --GENERAR LA OS DE A LIQUIDACION DE SERVICIOS DE BROKERAGE

  if (:IN_ACCION = 'LQ' and :OUT_ESTADO = 1) then
  begin
    ----Generar Ordenes de Servicio x los costos considerados

    VAR_ROWS = coalesce(VAR_ROWS, 0);
    if (:VAR_ROWS = 1) then
    begin

      --Se genera las Ordenes de Servicios

      select PUB_TABLA_PARAMETROS.DESCRIPCION, PUB_TABLA_PARAMETROS.VALOR_OPCIONAL1, PUB_TIPO_SLP.NOM_SLP
      from PUB_TABLA_PARAMETROS
      inner join PUB_TIPO_SLP on (PUB_TIPO_SLP.TIPO_SLP = PUB_TABLA_PARAMETROS.VALOR_OPCIONAL3)
      where PUB_TABLA_PARAMETROS.EMPRESA = :OUT_CODEMP and
            PUB_TABLA_PARAMETROS.LLAVE = 'UNIDAD_NEGOCIO' and
            PUB_TABLA_PARAMETROS.VALOR_OPCIONAL2 = :OUT_CODLOCAL and
            PUB_TABLA_PARAMETROS.VALOR_OPCIONAL3 = :OUT_TIPO_SLP
      into :VAR_UNIDAD_NEGOCIO, :VAR_USUARIO_LOG, :VAR_NOM_SLP;

      OUT_OS_UNID_OPERATIVA = VAR_UNIDAD_NEGOCIO;

      VAR_ANIO_ORDEN = extract(year from current_date);
      OUT_OS_ANIO = VAR_ANIO_ORDEN;
      OUT_OS_TIPO = 'S';

      select coalesce(max(LOG_ORDENES.NRO_ORDEN), 0)
      from LOG_ORDENES
      where LOG_ORDENES.EMPRESA = :OUT_CODEMP and
            LOG_ORDENES.UNID_OPERATIVA = :VAR_UNIDAD_NEGOCIO and
            LOG_ORDENES.ANIO = :VAR_ANIO_ORDEN and
            LOG_ORDENES.TIPO = 'S'
      into :VAR_NRO_ORDEN;

      VAR_NRO_ORDEN = VAR_NRO_ORDEN + 1;
      OUT_OS_NRO_ORDEN = VAR_NRO_ORDEN;

      --Obtener datos de proveedor
      select PP.RAZON_SOC, PP.DIAS_CREDITO_PAGO, iif(PP.TIPO_PAGO = 1, 'CR', 'CO'), cast(PP.TELEFONO as varchar(25)),
             PP.NOM_REPRESENTANTE
      from PUB_PERSONAS PP
      where PP.CODEMP = :OUT_CODEMP and
            PP.ID_PERSONA = :OUT_COD_PROVEEDOR
      into :OUT_RAZON_SOC, :VAR_DIAS_CREDITO, :VAR_FORMA_PAGO, :VAR_TELEFONO, :VAR_CONTACTO;

      --Inserta Cabecera de Orden
       --Se ingresa el indicador de la clase en 0 , gchavez 19.01.24
      insert into LOG_ORDENES (EMPRESA, UNID_OPERATIVA, ANIO, TIPO, NRO_ORDEN, AREA_REQUERIMIENTO, ANIO_REQUERIMIENTO,
                             NRO_REQUERIMIENTO, ANIO_COTIZACION, ID_COTIZACION, NDOC_COTIZACION, FECHA,
                             RUC_PROVEEDOR, RAZON_PROVEEDOR, FORMA_PAGO, DIAS_CREDITO, MONEDA, TIPO_ENTREGA,
                             USUA_REG, FEC_REG, USUA_MOD, FEC_MOD, TOTAL_VALOR, TOTAL_IGV, TOTAL_PRECIO,
                             DESCRIPCION, VB_LOGISTICA, ORIENTACION, CON_CATALOGO, CON_INDICACIONES, ESTADO,
                             ID_CENCOS, NRO_SLP, TIPO_SLP, CODLOCAL_SLP, ANIO_SLP, CONTACTO, FONO_PROVEEDOR,
                             FECHA_VB_LOG, USUARIO_VB_LOG, RUTA_FIRMA_VB_LOG, TIPO_CLASIFICACION, TIPO_REGISTRO,
                             NRO_ETAPA_SLP, TIPO_CONFORMIDAD, FLAG_IGV, IND_CONFORMIDAD, NIVEL_VB, TASA_IMP,ind_regularizacion)
      values (:OUT_CODEMP, :VAR_UNIDAD_NEGOCIO, :VAR_ANIO_ORDEN, :OUT_OS_TIPO, :VAR_NRO_ORDEN, :VAR_UNIDAD_NEGOCIO,
            :VAR_ANIO_ORDEN, 0, :VAR_ANIO_ORDEN, 0, '0', current_date, :OUT_COD_PROVEEDOR, :OUT_RAZON_SOC,
            :VAR_FORMA_PAGO, :VAR_DIAS_CREDITO, :OUT_MONEDA, 'IN', :IN_USUARIO, current_time,
            :IN_USUARIO, current_time, :VAR_COSTO_REAL * iif(:OUT_IND_COSTEO = 1, 1, :VAR_CANTIDAD),
            :VAR_TOTAL_IGV, :OUT_COSTO_REAL_TOTAL,:VAR_DESCRIPCION_OS, 1, '1', '0', '0', 'OK',:VAR_ID_CENCOS, :VAR_NRO_SLP, :OUT_TIPO_SLP,
            :OUT_CODLOCAL, :OUT_ANIO, :VAR_CONTACTO,:VAR_TELEFONO, current_time,:IN_USUARIO,
            'firma_' || lower(:IN_USUARIO) || '.png',1,1,'','C',:OUT_FLAG_IGV, 1, 9, 18,0);

      for select OLD.ID_BROKERAGE, OSBF.TIPO_SLP, SLP.ANIO, OLD.NRO_SLP, OSBF.PUNTO_VENTA, OLC.MONEDA, OLD.COD_FAMILIA,
                 OLD.COD_CONCEPTO, OLD.CANTIDAD, OLD.COSTO_REAL, OLD.COD_UNIDAD, LC.TIPO_CATALOGO, OSBF.PRO_CODIGO, OLD.COD_ARTICULO,
                 coalesce(OB.BL, 'S/N'), OLD.DESCRIPCION, coalesce(OLD.NRO_BOOKING,'') || ' - ' || coalesce(OLD.DES_MERCADERIA,'') || ' - ' ||
                 coalesce(OLD.DES_LINEA,'') || ' - ' || coalesce(EXTRACT(DAY FROM OLD.FEC_ZARPE),'') || '/' || coalesce(EXTRACT(MONTH FROM OLD.FEC_ZARPE),'') || '/' ||
                 coalesce(EXTRACT(YEAR FROM OLD.FEC_ZARPE),'')  || ' - ' || OLD.DES_PUERTO_DEST || ' - ' || OLD.BL
          from OPE_LIQ_CAB OLC
          inner join OPE_LIQ_DET OLD on OLD.ID_OPE_LIQ_CAB = OLC.ID_OPE_LIQ_CAB
          inner join OPE_SLP_BROKERAGE_FACT OSBF on OLD.ID_BROKERAGE = OSBF.ID_BROKERAGE
          inner join OPE_SLP SLP on SLP.CODEMP = OSBF.CODEMP and SLP.CODLOCAL = OSBF.CODLOC and SLP.ANIO = OSBF.ANIO and SLP.TIPO_SLP = OSBF.TIPO_SLP and SLP.NRO_SLP = OSBF.NRO_SLP
          inner join PUB_TIPO_SLP PTS on (PTS.TIPO_SLP = SLP.TIPO_SLP)
          left join OPE_BOOKING OB on (OB.CODEMP = SLP.CODEMP and OB.CODLOCAL = SLP.CODLOCAL and OB.ANIO = SLP.ANIO_BOOKING and OB.ITEM = SLP.ITEM_BOOKING)
          left join LOG_CATALOGO LC on (LC.EMPRESA = OSBF.CODEMP and LC.COD_FAMILIA = OSBF.COD_FAMILIA and LC.COD_CONCEPTO = OSBF.COD_CONCEPTO)
          where OLC.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB
          into :VAR_ID_BROKERAGE, :OUT_TIPO_SLP, :VAR_ANIO_SLP, :VAR_NRO_SLP, :VAR_PUNTO_VENTA, :OUT_MONEDA, :VAR_COD_FAMILIA,
               :VAR_COD_CONCEPTO, :VAR_CANTIDAD, :VAR_COSTO_REAL, :VAR_COD_UNIDAD, :VAR_CATALOGO, :VAR_PRO_CODIGO, :VAR_COD_ARTICULO,
               :VAR_BL, :VAR_DESCRIPCION_DETALLE, :VAR_OBSERVACIONES
      do
      begin
        VAR_ITEM = VAR_ITEM + 1;
        if (:OUT_IND_COSTEO = 1) then --Si el costeo es por BL
        begin
          VAR_COD_UNIDAD = '63';-- Unidad de BL
          VAR_CANTIDAD = 1;
        end

        VAR_ID_CENCOS = null;

        select count(*)
        from ANT_PRODUCTO_VENTA
        where ANT_PRODUCTO_VENTA.EMPRESA = :OUT_CODEMP and
              ANT_PRODUCTO_VENTA.PUNTO_VENTA = :VAR_PUNTO_VENTA and
              ANT_PRODUCTO_VENTA.PRO_CODIGO = :VAR_PRO_CODIGO and
              ANT_PRODUCTO_VENTA.PRO_DESCRIPCION like '%ADD%' and
              ANT_PRODUCTO_VENTA.PRO_ESTADO = 'S'
        into :VAR_CONTA_REBATE;

        VAR_COSTO = VAR_COSTO_REAL;

        if (VAR_CONTA_REBATE > 0) then
        begin
          --VAR_COSTO_REAL = cast(VAR_COSTO_REAL / (1 + VAR_VALOR_IGV) as numeric(15,2)); Comentado por AVILLAFANA 03.03.2023
          VAR_COSTO_REAL = cast(VAR_COSTO_REAL / (1 + VAR_VALOR_IGV) as numeric(18,6)); ---Aumentamos a 6 decimales. GCHAVEZ 03.04.2024
        end

        VAR_SUM_COSTO_REAL = VAR_SUM_COSTO_REAL + VAR_COSTO_REAL;

        VAR_TOTAL_IGV = VAR_COSTO - VAR_COSTO_REAL; --(VAR_COSTO_REAL * iif(:OUT_IND_COSTEO = 1, 1, VAR_CANTIDAD)) * VAR_VALOR_IGV;

        VAR_SUM_TOTAL_IGV = VAR_SUM_TOTAL_IGV + VAR_TOTAL_IGV;

        --Obtenemos el Centro de Costo
        select CODIGO
        from PUB_TABLA_PARAMETROS
        where EMPRESA = :OUT_CODEMP and
              LLAVE = 'CENCOS_BROKERAGE' and
              VALOR_OPCIONAL1 = :VAR_COD_FAMILIA || :VAR_COD_CONCEPTO and
              --((VALOR_OPCIONAL2 = :VAR_LINEA_NEGOCIO) or (VALOR_OPCIONAL2 = :VAR_TIPO_OPE)) and
              VALOR_OPCIONAL3 = :OUT_CODLOCAL
        into :VAR_ID_CENCOS;

        --Inserta Detalle de Orden
        insert into LOG_ORDENES_DET (EMPRESA, UNID_OPERATIVA, ANIO, TIPO, NRO_ORDEN, ITEM, NRO_REQUERIMIENTO,
                                 ID_COTIZACION, COD_PROD_SERV, DES_PROD_SERV, CANTIDAD, UNIMED, MONEDA, VALOR_VENTA,
                                 TOTAL_VALOR, CANTIDAD_FACTURADA, TIPO_CATALOGO, TIPO_COSTO, ID_CENCOS, NRO_SLP,
                                 TIPO_SLP, CODLOCAL_SLP, ANIO_SLP, CANTIDAD_X_RECIBIR, CANTIDAD_RECIBIDA, OBSERVACIONES)
        values (:OUT_CODEMP, :VAR_UNIDAD_NEGOCIO, :VAR_ANIO_ORDEN, :OUT_OS_TIPO, :VAR_NRO_ORDEN, :VAR_ITEM, 0, 0, :VAR_COD_ARTICULO,
            :VAR_DESCRIPCION_DETALLE, :VAR_CANTIDAD, :VAR_COD_UNIDAD, :OUT_MONEDA, :VAR_COSTO_REAL, :VAR_COSTO_REAL * iif(:OUT_IND_COSTEO = 1, 1, :VAR_CANTIDAD),
            0,:VAR_CATALOGO,0,:VAR_ID_CENCOS,:VAR_NRO_SLP,:OUT_TIPO_SLP,:OUT_CODLOCAL,:VAR_ANIO_SLP, 0,:VAR_CANTIDAD, :VAR_OBSERVACIONES);

        update OPE_SLP_BROKERAGE_FACT OSBF
        set OSBF.OS_UNID_OPERATIVA = :OUT_OS_UNID_OPERATIVA,
            OSBF.OS_ANIO = :OUT_OS_ANIO,
            OSBF.OS_TIPO = :OUT_OS_TIPO,
            OSBF.OS_NRO_ORDEN = :OUT_OS_NRO_ORDEN
        where OSBF.ID_BROKERAGE = :VAR_ID_BROKERAGE;

      end

      if (:OUT_FLAG_IGV = 0) then
        VAR_TOTAL_IGV = 0;
      --OUT_COSTO_REAL_TOTAL = (VAR_COSTO_REAL * iif(:OUT_IND_COSTEO = 1, 1, VAR_CANTIDAD)) + VAR_TOTAL_IGV;

      if (VAR_CONTA_REBATE > 0) then
      begin
        OUT_COSTO_REAL_TOTAL = cast(OUT_COSTO_REAL_TOTAL / (1 + VAR_VALOR_IGV) as numeric(18,6));
      end

      OUT_COSTO_REAL_TOTAL = VAR_SUM_COSTO_REAL + VAR_SUM_TOTAL_IGV;

      VAR_DESCRIPCION_OS = upper(VAR_DESCRIPCION_DETALLE) || '/' || :VAR_NOM_SLP || '-' || right('00000' || :VAR_NRO_SLP, 5) || '-' || :OUT_ANIO || '/BL:' || :VAR_BL;

      update LOG_ORDENES OS
      set OS.TOTAL_VALOR = :VAR_SUM_COSTO_REAL,
          OS.TOTAL_IGV = :VAR_SUM_TOTAL_IGV,
          OS.TOTAL_PRECIO = :OUT_COSTO_REAL_TOTAL,
          OS.DESCRIPCION = :VAR_DESCRIPCION_OS
      where OS.EMPRESA = :OUT_CODEMP and
            OS.UNID_OPERATIVA = :OUT_OS_UNID_OPERATIVA and
            OS.ANIO = :OUT_OS_ANIO and
            OS.TIPO = :OUT_OS_TIPO and
            OS.NRO_ORDEN = :OUT_OS_NRO_ORDEN;

      update OPE_LIQ_CAB OLC
      set OLC.ESTADO = 3,
          OLC.OS_UNID_OPERATIVA = :OUT_OS_UNID_OPERATIVA,
          OLC.OS_ANIO = :OUT_OS_ANIO,
          OLC.OS_TIPO = :OUT_OS_TIPO,
          OLC.OS_NRO_ORDEN = :OUT_OS_NRO_ORDEN,
          OLC.USUARIO_MOD = :IN_USUARIO,
          OLC.FECHA_MOD = current_timestamp
      where OLC.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB;

      update OPE_LIQ_DET OLD
      set OLD.USUMOD = :IN_USUARIO,
          OLD.FECMOD = current_timestamp
      where OLD.ID_OPE_LIQ_CAB = :IN_COD_ID_TAB_CAB;

      suspend;

    end
  end
end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_LIQ_ORDEN_BROKERAGE IS
'Fecha: 16.11.2022
Autor: Eduardo Segura
Version: 1.0
Comentario: Se crea este nuevo procedimiento con el nuevo metodo de liquidacion de brokerage.
-----------------------------------------------------------------------------------------------------------------
Fecha: 03.03.2023
Autor: Andy Villafana
Version: 1.1
Comentario: Se aumenta el numero de decimales de las variables VAR_SUM_COSTO_REAL y VAR_SUM_TOTAL_IGV de 2 a 4.
-----------------------------------------------------------------------------------------------------------------
Fecha: 13.11.2023
Autor: Andy Villafana
Version: 1.2
Comentario: En caso el FLAG_DOMICILIADO es 0, el valor del porcentaje del IGV debe ser 0.
-----------------------------------------------------------------------------------------------------------------------------
Fecha: 22.01.2024
Autor: Gilmar chavez
Version: 1.3
Comentario: Se ingresa el indicador de la clase en 0 en el insert de la orden.
-----------------------------------------------------------------------------------------------------------------------------
Fecha: 03.04.2024
Autor: Gilmar chavez
Version: 1.4
Comentario: Se aumenta los decimales a 6 en el costo real.
-----------------------------------------------------------------------------------------------------------------------------
Fecha: 16.10.2025
Autor: Brecia Avalos
Version: 1.5
Comentario: El input "accion = ''AN''", solo debe actualizar las liquidaciones por rebate, mas no el estado de la orden, ya que,
            no sera necesario esta condicion porque la anulacion se hace directamente en la ventana, validando provisiones.';

/* Following GRANT statetements are generated automatically */

GRANT SELECT,UPDATE ON OPE_LIQ_CAB TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT,INSERT,UPDATE ON LOG_ORDENES TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON PUB_FACTORES_VALORES TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT,UPDATE ON OPE_LIQ_DET TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT,UPDATE ON OPE_SLP_BROKERAGE_FACT TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON PUB_TABLA_PARAMETROS TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON PUB_TIPO_SLP TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON OPE_BOOKING TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON LOG_CATALOGO TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT SELECT ON ANT_PRODUCTO_VENTA TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;
GRANT INSERT ON LOG_ORDENES_DET TO PROCEDURE SP_LIQ_ORDEN_BROKERAGE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_LIQ_ORDEN_BROKERAGE TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_ASIENTO_OS_CONFORMIDAD (
    EMPRESA varchar(2),
    UNIDAD_OPERATIVA varchar(5),
    ANIO integer,
    TIPO varchar(1),
    NRO_ORDEN numeric(18,0),
    ID_ACTA bigint)
returns (
    OUT_CODIGO_ASIENTO_COS varchar(16),
    OUT_FEC_REG timestamp,
    OUT_USUARIO_REG varchar(20),
    OUT_TOTAL_IGV numeric(15,2),
    OUT_RUC_PROVEEDOR varchar(15),
    OUT_RAZON_PROVEEDOR varchar(150),
    OUT_USUA_MOD varchar(20),
    OUT_GLOSA varchar(350),
    OUT_TOTAL_VALOR numeric(15,4),
    OUT_FECHA_ATENDIDO timestamp,
    OUT_MES numeric(2,0),
    OUT_ESTADO varchar(2),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_MONEDA varchar(1),
    OUT_NDOC_COTIZACION varchar(80),
    OUT_DESCRIPCION varchar(350),
    OUT_ID_CENCOS varchar(30),
    OUT_CODLOC varchar(5),
    OUT_NRO_LOTE varchar(20),
    LOCAL_PROVISION char(2),
    OUT_FECHA_ORDEN date,
    OUT_NRO_REQUERIMIENTO numeric(18,0))
as
declare variable VAR_CANTIDAD numeric(16,4) = 0.0;
declare variable VAR_ITEM integer;
declare variable VAR_UNIMED varchar(10);
declare variable VAR_MONEDA varchar(10);
declare variable VAR_VALOR_VENTA numeric(15,2);
declare variable VAR_TOTAL_VALOR numeric(16,2);
declare variable VAR_TC_VEN numeric(8,4);
declare variable VAR_J integer = 0;
declare variable VAR_COSTO_D numeric(18,3);
declare variable VAR_CARGO numeric(18,2);
declare variable VAR_ABONO numeric(18,2);
declare variable VAR_LIBCON varchar(2);
declare variable VAR_LS_NROCOM varchar(16);
declare variable VAR_LI_NROCOM integer;
declare variable VAR_LS_CODIGO varchar(21);
declare variable VAR_CTA varchar(20);
declare variable VAR_CTA_NOMBRE varchar(200);
declare variable VAR_CTA_S_PROVISION varchar(20);
declare variable VAR_CTA_D_PROVISION varchar(20);
declare variable VAR_NOMBRE_CTA_D varchar(200);
declare variable VAR_NOMBRE_CTA_S varchar(200);
declare variable VAR_NOMBRE_CTA varchar(200);
declare variable VAR_CTA_MONEDA varchar(20);
declare variable VAR_LOTE varchar(20);
declare variable VAR_SUMA_CARGO numeric(15,2) = 0;
declare variable VAR_SUMA_ABONO numeric(15,2) = 0;
declare variable VAR_CONT integer = 0;
declare variable VAR_ESPECIE varchar(150);
declare variable VAR_AUXILIAR varchar(16);
declare variable VAR_NRO_LOTE varchar(40);
declare variable VAR_COD_ALMACEN varchar(3);
declare variable VAR_CEN_COSTO_P varchar(1);
declare variable VAR_CTACTE_P varchar(1);
declare variable VAR_FLAG_LOTE_P integer;
declare variable VAR_FLAG_CENTRO_COSTO_P integer;
declare variable VAR_FLAG_CTACTE_P integer;
declare variable VAR_CENTRO_COSTO varchar(1);
declare variable VAR_CTACTE varchar(1);
declare variable VAR_FLAG_CENTRO_COSTO integer;
declare variable VAR_FLAG_CTACTE integer;
declare variable VAR_FLAG_LOTE integer;
declare variable VAR_CODIGO_ESPECIE varchar(15);
declare variable VAR_ALMACEN varchar(3);
declare variable VAR_NOM_CENCOS varchar(80);
declare variable VAR_ORDEN_COMPRA varchar(60);
declare variable VAR_CODLOC_SLP varchar(2);
declare variable VAR_ANIO_SLP integer;
declare variable VAR_TIPO_SLP varchar(1);
declare variable VAR_NRO_SLP integer;
declare variable VAR_TIPO_ORDEN varchar(2);
declare variable VAR_FAMILIA varchar(2);
declare variable VAR_VINCULADA integer;
declare variable UNID_OPERATIVA varchar(15);
declare variable VAR_COD_CONCEPTO varchar(3);
declare variable V_LOCAL_ASIENTO varchar(2);
declare variable V_LIBRO_ASIENTO varchar(2);
declare variable V_ANIO_OR integer;
declare variable V_MES_OR integer;
declare variable VAR_ID_CENCOS_TMP varchar(30);
declare variable VAR_NOM_CENCOS_TMP varchar(80);
declare variable VAR_COD_ARTICULO varchar(10);
declare variable VAR_ARTICULO_ORDEN varchar(9);
declare variable VAR_ALMACEN_ORDEN varchar(3);
declare variable V_TIPO_REGISTRO integer = 0;
declare variable VAR_CODIGO_ORDEN varchar(50);
declare variable VAR_MES_ORDEN integer;
declare variable V_EXISTE_PROVISION integer = 0;
declare variable V_CONTADOR integer;
declare variable VAR_ITEM_ASIENTO varchar(5);
declare variable VAR_ID_CENCOS_CAB varchar(30);
declare variable VAR_NOM_CENCOS_CAB varchar(80);
declare variable VAR_ANIO_ASIENTO integer;
declare variable VAR_MES_ASIENTO numeric(2,0);
declare variable VAR_RESPUESTA integer;
declare variable VAR_TIPO_CONFORMIDAD varchar(1);
declare variable VAR_USUARIO_ATENCION varchar(30);
declare variable VAR_CODIGO_ASIENTO varchar(16);
declare variable VAR_NRO_REQUERIMIENTO numeric(18,0);
declare variable VAR_AREA_REQUERIMIENTO varchar(20);
declare variable VAR_ANIO_REQUERIMIENTO integer;
declare variable VAR_CANTIDAD_ORDENES integer;
declare variable VAR_VALOR_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_ORDEN numeric(16,4);
declare variable VAR_SUMA_CANT_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_X_RECIBIR numeric(16,4);
declare variable VAR_CANTIDAD_RECIBIDA numeric(16,4);
declare variable VAR_TIPO_REQ varchar(1);
declare variable VAR_LLAVE_S varchar(50);
declare variable VAR_LLAVE_D varchar(50);
declare variable VAR_CUENTA_IGV_MP varchar(15);
declare variable VAR_IGV_FLAG char(1);
declare variable VAR_GIRO_NEGOCIO char(1);
declare variable VAR_FACTOR_IGV numeric(15,2);
declare variable VAR_FLAG_IGV integer;
declare variable VAR_TOTAL_IGV_FLAG numeric(15,7);
declare variable VAR_MONTO_IGV_FLAG numeric(15,7);
declare variable VAR_ETAPA_SLP char(1);
declare variable VAR_FEC_ZARPE date;
declare variable VAR_CODIGO_CO varchar(20);
declare variable VAR_ESTADO_REQ varchar(2);
declare variable VAR_DES_CONCEPTO varchar(350);
declare variable VAR_COD_PLANTA integer;
declare variable VAR_DES_PLANTA varchar(40);
declare variable VAR_IND_USO_CTA varchar(2);
begin

  if (TIPO = 'C') then
    VAR_TIPO_ORDEN = 'OC';
  if (TIPO = 'S') then
    VAR_TIPO_ORDEN = 'OS';

  -- obtenemos el libro
  select VALOR
  from PARAMETROS_SISTEMAS
  where EMPRESA = :EMPRESA and
        SISTEMA = '012' and
        LLAVE = 'LIB_ALMACEN'
  into :VAR_LIBCON;

  if (TIPO = 'S') then
  begin
    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = 'LIB_PROV_OS'
    into :VAR_LIBCON;
  end

  /*Obtenemos el indicador tipo de provision para diferenciarlo al tomar la cuenta contable. BAVALOS 04.02.26*/
    SELECT COALESCE(PUB_EMPRESAS.ind_provision, 0)
    FROM PUB_EMPRESAS
    WHERE PUB_EMPRESAS.codemp = :EMPRESA
    INTO :VAR_IND_USO_CTA;

  /*GCHAVEZ 06.06.22 , OBTENEMOS EL FLAG IGV_FLAG 0 = RENUNCIA A LA EXONERACION DE IGV , 1 = NO RENUNCIA ,
  Obtenermos la cuenta contable
  */
  select IGV_FLAG
  from PUB_EMPRESAS
  where CODEMP = :EMPRESA
  into :VAR_IGV_FLAG;
  /*if (VAR_IGV_FLAG = '1') then
  begin
    select CODIGO
    from PUB_TABLA_PARAMETROS
    where EMPRESA = :EMPRESA and
          LLAVE = 'CUENTA_IGV_MP' and
          ITEM = 1
    into :VAR_CUENTA_IGV_MP;

  end*/

  /*$$IBEC$$ --obtenemos la cuenta de provision en soles
  select VALOR
  from PARAMETROS_SISTEMAS
  where EMPRESA = :EMPRESA and
        SISTEMA = '012' and
        LLAVE = 'CTA_PROVISION_S_OC'
  into :VAR_CTA_S_PROVISION;

  --obtenemos la cuenta de provision en dolares
  select VALOR
  from PARAMETROS_SISTEMAS
  where EMPRESA = :EMPRESA and
        SISTEMA = '012' and
        LLAVE = 'CTA_PROVISION_D_OC'
  into :VAR_CTA_D_PROVISION;
 $$IBEC$$*/

  /*Consultamos la orden segun el ID de la acta. BA 02/04/21*/
  --gchavez 10.06.22 , Se obtiene el flag del igv
  for select LOGO.FEC_REG, LOGO.USUA_REG, LOGO.RUC_PROVEEDOR, LOGO.RAZON_PROVEEDOR, LOGO.MONEDA, LOGO.FECHA,
             LOGO.ESTADO, coalesce(LCO.CONCEPTO, LOGO.DESCRIPCION), LOGO.ID_CENCOS, LOGO.TIPO_CONFORMIDAD,
             LCO.USUARIO_ATENCION, LCO.FECHA_ATENCION, LCO.CODIGO_ASIENTO, LOGO.NRO_REQUERIMIENTO,
             LOGO.AREA_REQUERIMIENTO, LOGO.ANIO_REQUERIMIENTO, iif(LOGO.TIPO = 'C', 'P', LOGO.TIPO), LOGO.FLAG_IGV,
             (cast(LOGO.TASA_IMP as numeric(15,4)) / 100)
      from LOG_ORDENES LOGO
      left join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = LOGO.EMPRESA and LCO.UNID_OPERATIVA = LOGO.UNID_OPERATIVA and LCO.ANIO = LOGO.ANIO and LCO.TIPO = LOGO.TIPO and LCO.NRO_ORDEN = LOGO.NRO_ORDEN
      where LOGO.EMPRESA = :EMPRESA and
            LOGO.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
            LOGO.ANIO = :ANIO and
            LOGO.TIPO = :TIPO and
            LOGO.NRO_ORDEN = :NRO_ORDEN and
            LCO.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA
      into :OUT_FEC_REG, :OUT_USUARIO_REG, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, :OUT_MONEDA, OUT_FECHA_ORDEN,
           :OUT_ESTADO, :OUT_DESCRIPCION, :VAR_ID_CENCOS_CAB, :VAR_TIPO_CONFORMIDAD, :VAR_USUARIO_ATENCION,
           :OUT_FECHA_ATENDIDO, :OUT_CODIGO_ASIENTO_COS, :VAR_NRO_REQUERIMIENTO, :VAR_AREA_REQUERIMIENTO,
           :VAR_ANIO_REQUERIMIENTO, :VAR_TIPO_REQ, :VAR_FLAG_IGV, :VAR_FACTOR_IGV
  do
  begin

    --GCHAVEZ 09.06.22 , Obtenemos el factor del igv en decimal
    /*select first 1 (PUB_FACTORES_VALORES.VALOR / 100) --Se obtiene igv mas antiguo. AVILLAFANA 17.10.2022
    from PUB_FACTORES_VALORES
    where PUB_FACTORES_VALORES.CODFACTOR = '010101' and
          PUB_FACTORES_VALORES.ESTADO = 'A' and
          :OUT_FECHA_ORDEN between PUB_FACTORES_VALORES.FECHA_INICIAL and FECHA_FINAL
    ORDER BY PUB_FACTORES_VALORES.FECHA_INICIAL
    into :VAR_FACTOR_IGV;*/

    --RDAM_17022022 - RECONFIGURACION DE CUENTAS DE PROVISION TERCEROS Y VINCULADAS
    select VINCULADA
    from PUB_PERSONAS
    where (CODEMP = :EMPRESA) and
          (ID_PERSONA = :OUT_RUC_PROVEEDOR)
    into :VAR_VINCULADA;

    if (VAR_VINCULADA = 1) then ----Se agrega parametros para cuenta de provisiones de vinculados. RDAMACEND 12.04.2022
    begin
      if (OUT_MONEDA = 'S') then
      begin
        VAR_LLAVE_S = 'CTA_PROVISION_S_ASOC_OC';
      end
      else
      begin
        VAR_LLAVE_D = 'CTA_PROVISION_D_ASOC_OC';
      end
    end
    else
    begin
      if (OUT_MONEDA = 'S') then
      begin
        VAR_LLAVE_S = 'CTA_PROVISION_S_OC';
      end
      else
      begin
        VAR_LLAVE_D = 'CTA_PROVISION_D_OC';
      end
    end

    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = :VAR_LLAVE_S
    into :VAR_CTA_S_PROVISION;

    --obtenemos la cuenta de provision en dolares
    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = :VAR_LLAVE_D
    into :VAR_CTA_D_PROVISION;

    if (OUT_FECHA_ATENDIDO is null) then
    begin
      VAR_ANIO_ASIENTO = extract(year from current_date);
      VAR_MES_ASIENTO = extract(month from current_date);
    end
    else
    begin
      VAR_ANIO_ASIENTO = extract(year from OUT_FECHA_ATENDIDO);
      VAR_MES_ASIENTO = extract(month from OUT_FECHA_ATENDIDO);
    end

    select PC.NOM_CENCOS
    from PUB_CENCOS PC
    where PC.CODGRU_EMP = :EMPRESA and
          PC.ANIO = :VAR_ANIO_ASIENTO and
          -- :ANIO
          PC.ID_CENCOS = :VAR_ID_CENCOS_CAB
    into :VAR_NOM_CENCOS_CAB;

    /*   SE OBTIENE EL AREA DEL TRABAJADOR   */
    select PUB_TRABAJADORES.COD_AREA
    from PUB_TRABAJADORES
    where PUB_TRABAJADORES.CODEMP = :EMPRESA and
          PUB_TRABAJADORES.COD_USUARIO = :OUT_USUARIO_REG
    into :UNID_OPERATIVA;

    select PAE.LOCAL_PROVISION
    from PUB_AREAS_EMPRESA PAE
    where PAE.CODGRU_EMP = :EMPRESA and
          PAE.ANIO = :VAR_ANIO_ASIENTO and
          --:ANIO and
          PAE.ID_AREA = :UNID_OPERATIVA
    into :LOCAL_PROVISION;
    /* FIN DE SCRIPT */

    if (OUT_FECHA_ATENDIDO is null) then
      OUT_FECHA_ATENDIDO = current_time;

    /* Buscamos el tipo de cambio de la operacion*/
    select PUB_TIPCAM.VENTA
    from PUB_TIPCAM
    where (PUB_TIPCAM.MONEDA = 'D') and
          PUB_TIPCAM.FECHA = cast(:OUT_FECHA_ATENDIDO as date) --:OUT_FECHA_ORDEN
    into :VAR_TC_VEN;

    -- sino encuentra tipo de cambio en la fecha de operacion se pone el maximo
    if (VAR_TC_VEN is null) then
    begin
      select first 1 PUB_TIPCAM.VENTA
      from PUB_TIPCAM
      where (PUB_TIPCAM.MONEDA = 'D')
      order by FECHA desc
      into :VAR_TC_VEN;
    end

    --Se obtiene la cuenta en base a la moneda de la OC.
    if (OUT_MONEDA = 'S') then
    begin
      --obtenemos el nombre de la cuenta de provision en soles y sus flags.
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            -- :ANIO and
            P.CTA_COD = :VAR_CTA_S_PROVISION
      into :VAR_NOMBRE_CTA_S, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
    end
    if (OUT_MONEDA = 'D') then
    begin
      --obtenemos el nombre de la cuenta de provision en dolares y sus flag.
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            --:ANIO and
            P.CTA_COD = :VAR_CTA_D_PROVISION
      into :VAR_NOMBRE_CTA_D, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
    end

    --se asignan los valores a los flags.
    VAR_FLAG_CENTRO_COSTO_P = DECODE(VAR_CEN_COSTO_P, 'S', 1, 0);
    VAR_FLAG_CTACTE_P = DECODE(VAR_CTACTE_P, 'S', 1, 0);
    -- FLAG_SLP_P = DECODE(VAR_SLP_P, 'S', 1, 0);
    VAR_FLAG_LOTE_P = DECODE(VAR_FLAG_LOTE_P, 1, 1, 0);

    /* recuperamos la pk de orden de compra */
    VAR_ORDEN_COMPRA = EMPRESA || UNIDAD_OPERATIVA || ANIO || TIPO || lpad(NRO_ORDEN, 4, '0');

    OUT_GLOSA = substring(OUT_DESCRIPCION from 1 for 120);

    --Se obtiene el almacen del detalle de la orden.
    select max(LOGO.COD_ALMACEN)
    from LOG_ORDENES_DET LOGO
    where LOGO.EMPRESA = :EMPRESA and
          LOGO.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
          LOGO.ANIO = :ANIO and
          LOGO.TIPO = :TIPO and
          LOGO.NRO_ORDEN = :NRO_ORDEN
    into VAR_COD_ALMACEN;
    --Fin

    /* obtenemos la localidad por el almacen */
    select COD_LOCAL
    from ALM_ALMACENES
    where COD_ALMACEN = :VAR_COD_ALMACEN and
          EMPRESA = :EMPRESA
    into :OUT_CODLOC;
    --
    /*se obtiene el local atravez de la unidad operativa*/
    select PAE.LOCAL_PROVISION
    from PUB_AREAS_EMPRESA PAE
    where PAE.CODGRU_EMP = :EMPRESA and
          PAE.ANIO = :VAR_ANIO_ASIENTO and
          --:ANIO and
          PAE.ID_AREA = :UNIDAD_OPERATIVA
    into :LOCAL_PROVISION;

    if (LOCAL_PROVISION is null) then
      LOCAL_PROVISION = '01';

    if (OUT_CODLOC is null) then
      OUT_CODLOC = LOCAL_PROVISION;

    OUT_MES = extract(month from OUT_FECHA_ORDEN);

    /* Valida si el codigo de asiento tiene el mismo local del ingreso a almacen,
    sino se genera un nuevo asiento.*/
    if (OUT_CODIGO_ASIENTO_COS is not null and
        trim(OUT_CODIGO_ASIENTO_COS) <> '') then
    begin
      V_LOCAL_ASIENTO = substring(OUT_CODIGO_ASIENTO_COS from 3 for 2);
      V_LIBRO_ASIENTO = substring(OUT_CODIGO_ASIENTO_COS from 5 for 2);
      /*Verificamos que si el a?o y mes de la orden de compra a cambiado*/
      /* recuperamos el a?o y mes de la orden de compra */
      V_ANIO_OR = substring(OUT_CODIGO_ASIENTO_COS from 7 for 4);
      V_MES_OR = substring(OUT_CODIGO_ASIENTO_COS from 11 for 2);

      if (V_MES_OR <> VAR_MES_ASIENTO or V_ANIO_OR <> VAR_ANIO_ASIENTO) then
      begin
        /* eliminamo el asiento contable */
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end

      /* Verifica si el local del asiento es diferente al local del almacen de destino,
      si es asi, elimina el asiento. */
      if (V_LOCAL_ASIENTO <> OUT_CODLOC) then
      begin
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end
      /* Verifica si el valor del parametro LIB_ALMACEN es diferente al libro del asiento contable,
      si es asi, elimina el asiento.*/
      if (V_LIBRO_ASIENTO <> VAR_LIBCON) then
      begin
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end

    end

    VAR_AUXILIAR = OUT_CODIGO_ASIENTO_COS;

    if (OUT_CODIGO_ASIENTO_COS is null) then
    begin

      --obtenemos el nrocom para generar el codigo del asiento
      select NROCOM
      from PRO_CONTROL_NUMERACION_REGS
      where (CODEMP = :EMPRESA) and
            (CODLOC = :OUT_CODLOC) and
            (CODGRU = '000' || LIBCON) and
            (LIBCON = :VAR_LIBCON) and
            (ANIO = :VAR_ANIO_ASIENTO) and
            --ANIO
            (MES = :VAR_MES_ASIENTO) and
            --  OUT_MES
            (TIPONUMERACION = 'M')
      into :VAR_LS_NROCOM;
      if (VAR_LS_NROCOM is null) then
        VAR_LS_NROCOM = '0000';

      -- el estado es siempre C cerrado
      VAR_LI_NROCOM = cast(coalesce(VAR_LS_NROCOM, '0') as numeric(6,0)) + 1;
      VAR_LS_NROCOM = lpad(cast(VAR_LI_NROCOM as varchar(4)), 4, '0');
      VAR_LS_CODIGO = EMPRESA || OUT_CODLOC || VAR_LIBCON || cast(VAR_ANIO_ASIENTO as char(4)) || lpad(VAR_MES_ASIENTO, 2, '0') || VAR_LS_NROCOM;

    end
    else
    begin
      -- regeneramos el asiento
      delete from DIA_DIARIO
      where CODIGO = :OUT_CODIGO_ASIENTO_COS;
      VAR_LS_NROCOM = substring(:OUT_CODIGO_ASIENTO_COS from 13 for 4);
      VAR_LS_CODIGO = :OUT_CODIGO_ASIENTO_COS;

      VAR_MES_ASIENTO = cast(substring(OUT_CODIGO_ASIENTO_COS from 11 for 2) as numeric(2,0));
    end
    --se cambia la campo de fecha de registro del asiento a current_timestamp rbueno 15.04.2021
    insert into DIA_DIARIO (CODIGO, CODEMP, CODLOC, LIBCON, ANIO, MES, NROCOM, FECCON, FECDOC, CONCEPTO, FECMOD,
                            USUARIO, NOMBREPC, ESTADO, USUARIO_MOD, FECREG, TIP_INGRESO, TIPCAM, TABLA)
    values (:VAR_LS_CODIGO, :EMPRESA, :OUT_CODLOC, :VAR_LIBCON, :VAR_ANIO_ASIENTO /*:ANIO*/ ,
                                                                                                   lpad(:VAR_MES_ASIENTO /*OUT_MES*/ , 2, '0'),
                                                                                                   :VAR_LS_NROCOM,
                                                                                                   /*:OUT_FECHA_ORDEN, :OUT_FECHA_ORDEN,*/
                                                                                                   :OUT_FECHA_ATENDIDO,
                                                                                                   :OUT_FECHA_ATENDIDO,
                                                                                                   :OUT_GLOSA,
                                                                                                   current_timestamp,
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   'C',
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   current_timestamp,
                                                                                                   'S', :VAR_TC_VEN,
                                                                                                   'LOG');

    VAR_CONT = VAR_CONT + 1;

    --Verificamos si el proveedor es vinculado o no --- 14/05/2018
    /*select coalesce(PP.VINCULADA, 0)
  from PUB_PERSONAS PP
  where PP.CODEMP = :EMPRESA and
        PP.ID_PERSONA = :OUT_RUC_PROVEEDOR
  into :VAR_VINCULADA;*/ -- Comentado por AVILLAFANA 17.04.2022

    --GCHAVEZ 10.06.22
    VAR_TOTAL_IGV_FLAG = 0;
    VAR_MONTO_IGV_FLAG = 0;

    --Se agrega la variable giro_negocio GCHAVEZ 06.06.22
    for select LOD.ITEM, LOD.UNIMED, LOD.MONEDA, LOD.VALOR_VENTA, iif(:VAR_TIPO_CONFORMIDAD = 'C',
               (LCOD.VALOR * LOD.VALOR_VENTA),
               ((cast(LCOD.VALOR as numeric(16,6)) / 100) * LOD.TOTAL_VALOR)) as PORCENTAJE,
               --coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), COSFA.CTA_COD) VINCULADA,
               /*Se considera la cuenta de PUB_CENCOS. BAVALOS 04.02.26*/
               iif(:VAR_IND_USO_CTA = '0', coalesce(coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), PCE.codcta_costo), COSFA.CTA_COD), COSFA.CTA_COD) VINCULADA,
               CA.DESCRIPCION, CA.COD_FAMILIA, CA.COD_CONCEPTO, coalesce(AA.ARTICULO, LOD.COD_PROD_SERV) COD_ARTICULO,
               LOD.COD_ALMACEN, LOD.NRO_LOTE, LOD.ID_CENCOS, PCE.NOM_CENCOS, LOD.CODLOCAL_SLP, LOD.ANIO_SLP,
               LOD.TIPO_SLP, LOD.NRO_SLP, LOD.COD_ARTICULO, LCOD.VALOR, LOD.CANTIDAD, COSFA.GIRO_NEGOCIO, LOD.ETAPA_SLP,
               OET.FEC_ZARPE, iif(COSFA.FLAG_ACTIVO_FIJO = '1', LOD.CODIGO_CO, null),
               LOD.DES_PROD_SERV, LOD.COD_PLANTA ---AVILLAFANA 30.01.2026
        from LOG_CONFORMIDAD_ORDENES_DET LCOD
        join LOG_CONFORMIDAD_ORDENES LCO on LCO.ID_LOG_CONFORMIDAD_ORDENES = LCOD.ID_LOG_CONFORMIDAD_ORDENES
        join LOG_ORDENES_DET LOD on LOD.EMPRESA = LCO.EMPRESA and LCO.UNID_OPERATIVA = LOD.UNID_OPERATIVA and LCO.ANIO = LOD.ANIO and LCO.TIPO = LOD.TIPO and LCO.NRO_ORDEN = LOD.NRO_ORDEN and LCOD.ITEM = LOD.ITEM
        left join LOG_CATALOGO CA on (CA.EMPRESA = LOD.EMPRESA and CA.COD_ARTICULO = LOD.COD_PROD_SERV and CA.TIPO_CATALOGO = LOD.TIPO_CATALOGO) -- ACV 14/05/2018
        left join LOG_TIPO_CATALOGO LOT on LOT.EMPRESA = CA.EMPRESA and LOT.TIPO_CATALOGO = CA.TIPO_CATALOGO
        left join PUB_CENCOS PCE on PCE.CODGRU_EMP = LOD.EMPRESA and PCE.ANIO = LOD.ANIO and PCE.ID_CENCOS = LOD.ID_CENCOS
        left join PUB_CENCOS_CTAS_COSTOS PC on (PC.CODEMP = LOD.EMPRESA and PC.ANIO = :VAR_ANIO_ASIENTO /*LOD.ANIO -- BA 04/05/22*/ and PC.ID_CENCOS = LOD.ID_CENCOS and PC.COD_FAMILIA = CA.COD_FAMILIA and PC.TIPO_COSTO = LOD.TIPO_COSTO)
        left join COS_FAMILIA_DET_CONCEPTOS COSFA on (COSFA.CODEMP = CA.EMPRESA and COSFA.COD_FAMILIA = CA.COD_FAMILIA and COSFA.COD_CONCEPTO = CA.COD_CONCEPTO) -- JC 05.06.18
        left join ALM_ARTICULO AA on (AA.EMPRESA = LOD.EMPRESA and AA.COD_CATALOGO_ARTICULO = LOD.COD_PROD_SERV and AA.COD_TIPO_CATALOGO = LOD.TIPO_CATALOGO)
        left join OPE_SLP_ETAPA OET on (OET.CODEMP = LOD.EMPRESA and OET.CODLOCAL = LOD.CODLOCAL_SLP and OET.ANIO = LOD.ANIO_SLP and OET.NRO_SLP = LOD.NRO_SLP and OET.TIPO_SLP = LOD.TIPO_SLP and OET.ETAPA = LOD.ETAPA_SLP)
        where LOD.EMPRESA = :EMPRESA and
              LOD.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
              LOD.ANIO = :ANIO and
              LOD.TIPO = :TIPO and
              LOD.NRO_ORDEN = :NRO_ORDEN and
              LCOD.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA
        into :VAR_ITEM, :VAR_UNIMED, :VAR_MONEDA, :VAR_VALOR_VENTA, :VAR_TOTAL_VALOR, :VAR_CTA, :VAR_ESPECIE,
             :VAR_FAMILIA, :VAR_COD_CONCEPTO, VAR_COD_ARTICULO, VAR_ALMACEN_ORDEN, OUT_NRO_LOTE, OUT_ID_CENCOS,
             VAR_NOM_CENCOS, :VAR_CODLOC_SLP, :VAR_ANIO_SLP, :VAR_TIPO_SLP, VAR_NRO_SLP, :VAR_ARTICULO_ORDEN,
             :VAR_VALOR_CONFORMIDAD, :VAR_CANTIDAD_ORDEN, :VAR_GIRO_NEGOCIO, :VAR_ETAPA_SLP, :VAR_FEC_ZARPE,:VAR_CODIGO_CO,
             :VAR_DES_CONCEPTO, :VAR_COD_PLANTA ---AVILLAFANA 30.01.2026
    do
    begin

      select DECRIPCION
      from OPE_PLANTAS
      where COD_PLANTA = :VAR_COD_PLANTA
      into :VAR_DES_PLANTA;

      VAR_SUMA_CANT_CONFORMIDAD = 0;
      VAR_ESPECIE = substring(VAR_ESPECIE from 1 for 120);

      if (VAR_TOTAL_VALOR is null) then
        VAR_TOTAL_VALOR = 0;

      OUT_TOTAL_VALOR = VAR_TOTAL_VALOR;

      if (VAR_MONEDA = 'D') then
      begin
        VAR_VALOR_VENTA = VAR_VALOR_VENTA * VAR_TC_VEN;
      end

      VAR_NRO_LOTE = OUT_NRO_LOTE;

      if (TIPO = 'S' and
          V_TIPO_REGISTRO = 1) then --Ahora las ordenes automaticas tienen requerimientos.
      begin
        VAR_CODIGO_ESPECIE = VAR_ARTICULO_ORDEN;
        VAR_ALMACEN = VAR_ALMACEN_ORDEN;
      end
      else
      begin
        VAR_CODIGO_ESPECIE = VAR_COD_ARTICULO;
        VAR_ALMACEN = VAR_COD_ALMACEN;
      end

      VAR_ID_CENCOS_TMP = OUT_ID_CENCOS;
      VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS;

      --obtenemos la cuenta
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            -- :ANIO and
            P.CTA_COD = :VAR_CTA
      into :VAR_CTA_NOMBRE, :VAR_CENTRO_COSTO, :VAR_CTACTE, :VAR_FLAG_LOTE;

      VAR_FLAG_CENTRO_COSTO = DECODE(VAR_CENTRO_COSTO, 'S', 1, 0);
      VAR_FLAG_CTACTE = DECODE(VAR_CTACTE, 'S', 1, 0);
      -- FLAG_SLP = DECODE(VAR_SLP, 'S', 1, 0);
      VAR_FLAG_LOTE = DECODE(VAR_FLAG_LOTE, 1, 1, 0);

      /*if (VAR_FLAG_LOTE = 0) then
      begin
        VAR_NRO_LOTE = null;--el lote se actualiza desde SP_ALMACEN_DESCARGA.
        VAR_CODIGO_ESPECIE = null;
        VAR_ALMACEN = null;
        --VAR_UNI_MED = null;
      end*/

      if (VAR_NRO_SLP is not null) then
        VAR_LOTE = :VAR_NRO_SLP;

      /*if (VAR_FLAG_CENTRO_COSTO = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end*/

      -- generacion del detalle del asiento para el haber
      if (VAR_MONEDA = 'S') then
      begin
        VAR_CARGO = VAR_TOTAL_VALOR;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_TOTAL_VALOR;
        VAR_ABONO = 0.0;
        VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
        --VAR_SUMA_ABONO = VAR_SUMA_ABONO + OUT_TOTAL_VALOR;
      end
      if (VAR_MONEDA = 'D') then
      begin
        --  var_cargo=var_total_valor* tip_c
        VAR_CARGO = VAR_TOTAL_VALOR * VAR_TC_VEN;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_CARGO;
        VAR_ABONO = 0;
        VAR_COSTO_D = VAR_TOTAL_VALOR;
        -- VAR_SUMA_ABONO = VAR_SUMA_ABONO + (OUT_TOTAL_VALOR * TC_VEN);
      end

      VAR_SUMA_ABONO = VAR_SUMA_ABONO + OUT_TOTAL_VALOR;

      VAR_J = VAR_J + 1;
      VAR_ITEM_ASIENTO = lpad(:VAR_J, 5, '0');
      -- Se agrega los campos de lote, articulo y almacen.
      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, ID_PERSONA, NOMBREPER, TIPIMP, TABLA,
                                  FLAG_NATURALEZA, FLAG_CTACTE, FLAG_CENCOS, CANTIDAD, PRECIO_UNIDAD, NRO_SLP, TIPDOC,
                                  SERDOC, NUMDOC, ID_CENCOS, NRO_LOTE, ARTICULO, COD_ALMACEN, UNIDAD_MEDIDA, NOMBRECTO,
                                  CODLOC_SLP, ANIO_SLP, TIPO_SLP, COD_FAMILIA, COD_CONCEPTO, ETAPA_SLP, FECHA_ZARPE,
                                  CODIGO_ACTIVO)
      values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_LS_CODIGO, :VAR_ITEM_ASIENTO, :VAR_CTA, :OUT_FECHA_ATENDIDO, /* :OUT_FECHA_ORDEN,*/
              :VAR_MONEDA, :VAR_TC_VEN, :VAR_ESPECIE, :VAR_COSTO_D, :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
              :OUT_USUARIO_REG, :VAR_CTA_NOMBRE, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, 'D', 'LOG', 2,
              :VAR_FLAG_CTACTE, :VAR_FLAG_CENTRO_COSTO, :VAR_CANTIDAD, :VAR_VALOR_VENTA, :VAR_LOTE, :VAR_TIPO_ORDEN,
              :UNIDAD_OPERATIVA, :NRO_ORDEN, iif(:VAR_FLAG_CENTRO_COSTO = 1, :VAR_ID_CENCOS_TMP, null),
                                                                                                            iif(:VAR_FLAG_LOTE = 1, :VAR_NRO_LOTE, null),
                                                                                                                                                              iif(:VAR_FLAG_LOTE = 1, :VAR_CODIGO_ESPECIE, null),
                                                                                                                                                                                                                      iif(:VAR_FLAG_LOTE = 1, :VAR_ALMACEN, null),
                                                                                                                                                                                                                      :VAR_UNIMED,
                                                                                                                                                                                                                                       iif(:VAR_FLAG_CENTRO_COSTO = 1, :VAR_NOM_CENCOS_TMP, null),
                                                                                                                                                                                                                                       :VAR_CODLOC_SLP,
                                                                                                                                                                                                                                       :VAR_ANIO_SLP,
                                                                                                                                                                                                                                       :VAR_TIPO_SLP,
                                                                                                                                                                                                                                       :VAR_FAMILIA,
                                                                                                                                                                                                                                       :VAR_COD_CONCEPTO,
                                                                                                                                                                                                                                       :VAR_ETAPA_SLP,
                                                                                                                                                                                                                                       :VAR_FEC_ZARPE,
                                                                                                                                                                                                                                       :VAR_CODIGO_CO);

      /*Insertar informacion en dia_diario_det_ope.AVILLAFANA 30.01.2026*/
      insert into DIA_DIARIO_DET_OPE (CODIGO, MEDIDA, CANTIDAD, PREUNI, COD_PLANTA, NOMBREPLA, COD_FAMILIA,
                                      COD_CONCEPTO, NOMBRE_CONCEPTO, IND_RECLAMO, FEC_REC, FECREG, USUAREG)
      values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_UNIMED, :VAR_CANTIDAD_ORDEN, :VAR_TOTAL_VALOR, :VAR_COD_PLANTA,
              :VAR_DES_PLANTA, :VAR_FAMILIA, :VAR_COD_CONCEPTO, :VAR_DES_CONCEPTO, 0, current_date, current_timestamp,
              :OUT_USUARIO_REG);
      /*Fin insertar informacion 30.01.2026*/

      V_EXISTE_PROVISION = 1;--indica que existe registros provisionados.

      --GCHAVEZ 06.06.22, Sumamos los montos del igv cuando el IGV_FLAG sea 1 y la orden aplica igv
      if (VAR_IGV_FLAG = '1' and
          VAR_FLAG_IGV = 1) then
      begin
        if (VAR_GIRO_NEGOCIO = '1') then
        begin
          VAR_MONTO_IGV_FLAG = VAR_TOTAL_VALOR * VAR_FACTOR_IGV;
          VAR_SUMA_ABONO = VAR_SUMA_ABONO + VAR_MONTO_IGV_FLAG;--gchavez 07.06.22 Se suma el total del abono del igv
          --end

          VAR_CARGO = 0;
          --Se suma al cargo del total del monto del igv
          if (VAR_MONEDA = 'S') then
          begin
            VAR_CARGO = VAR_MONTO_IGV_FLAG;
            VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_MONTO_IGV_FLAG;
            VAR_ABONO = 0.0;
            VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
          end
          if (VAR_MONEDA = 'D') then
          begin

            VAR_CARGO = VAR_MONTO_IGV_FLAG * VAR_TC_VEN;
            VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_CARGO;
            VAR_ABONO = 0;
            VAR_COSTO_D = VAR_MONTO_IGV_FLAG;

          end

          VAR_CUENTA_IGV_MP = :VAR_CTA;-- Para el costo del IGV se considera la misma cuenta de gasto del SKU. AVILLAFANA 16.08.2022

          select coalesce(P.CTA_ACEPCOSTO, 'N'), coalesce(P.FLAG_CTA_LOTE, 0)
          from PUB_PLANCTAS P
          where P.EMPRESA = :EMPRESA and
                P.ANIO = :VAR_ANIO_ASIENTO and
                P.CTA_COD = :VAR_CUENTA_IGV_MP
          into :VAR_CENTRO_COSTO, :VAR_FLAG_LOTE;

          VAR_FLAG_CENTRO_COSTO = DECODE(VAR_CENTRO_COSTO, 'S', 1, 0);
          VAR_FLAG_LOTE = DECODE(VAR_FLAG_LOTE, 1, 1, 0);

          --Se agrega el centro de costo de la cabecera
          if (VAR_FLAG_CENTRO_COSTO = 0) then
          begin
            VAR_ID_CENCOS_TMP = null;
            VAR_NOM_CENCOS_TMP = null;
          end
          else
          begin
            VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
            VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
          end

          VAR_J = VAR_J + 1;

          insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT,
                                      CARGO, ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                      FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO, NRO_LOTE,
                                      ARTICULO, COD_ALMACEN, UNIDAD_MEDIDA, CANTIDAD, PRECIO_UNIDAD, CODIGO_ACTIVO)
          values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CUENTA_IGV_MP,
                                                                               :OUT_FECHA_ORDEN, :VAR_MONEDA,
                                                                               :VAR_TC_VEN, :OUT_GLOSA, :VAR_COSTO_D,
                                                                               :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
                                                                               :OUT_USUARIO_REG, :VAR_NOMBRE_CTA,
                                                                               :OUT_RAZON_PROVEEDOR, 'D', 'LOG',
                                                                               :VAR_FLAG_CTACTE_P,
                                                                               :VAR_FLAG_CENTRO_COSTO_P,
                                                                               :OUT_RUC_PROVEEDOR, :VAR_TIPO_ORDEN,
                                                                               :UNIDAD_OPERATIVA, :NRO_ORDEN,
                                                                               :VAR_ID_CENCOS_TMP, :VAR_NOM_CENCOS_TMP,
                                                                                                                            iif(:VAR_FLAG_LOTE = 1, :VAR_NRO_LOTE, null),
                                                                                                                                                                              iif(:VAR_FLAG_LOTE = 1, :VAR_CODIGO_ESPECIE, null),
                                                                                                                                                                                                                                      iif(:VAR_FLAG_LOTE = 1, :VAR_ALMACEN, null),
                                                                                                                                                                                                                                      :VAR_UNIMED,
                                                                                                                                                                                                                                      :VAR_CANTIDAD_ORDEN,
                                                                                                                                                                                                                                      :VAR_VALOR_VENTA,
                                                                                                                                                                                                                                      :VAR_CODIGO_CO);
        end
      end
      ---

    end

    /*GCHAVEZ 06.06.22 REGISTRA LA PROVICION CONTABLE CUANDO UNA EMPRESA NO RENUNCIA A LA EXONERACION DE IGV , LA ORDEN APLICA IGV
   Y EL TOTAL DEL MONTO DE IGV SEA MAYOR A CERO */

    /*if (VAR_IGV_FLAG = '1' and
        VAR_FLAG_IGV = 1 and
        VAR_TOTAL_IGV_FLAG > 0) then
    begin
      VAR_CARGO = 0;
      --Se suma al cargo del total del monto del igv
      if (VAR_MONEDA = 'S') then
      begin
        VAR_CARGO = VAR_TOTAL_IGV_FLAG;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_TOTAL_IGV_FLAG;
        VAR_ABONO = 0.0;
        VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
      end
      if (VAR_MONEDA = 'D') then
      begin

        VAR_CARGO = VAR_TOTAL_IGV_FLAG * VAR_TC_VEN;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_CARGO;
        VAR_ABONO = 0;
        VAR_COSTO_D = VAR_TOTAL_IGV_FLAG;

      end

      --Se agrega el centro de costo de la cabecera
      if (VAR_FLAG_CENTRO_COSTO_P = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end
      else
      begin
        VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
        VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
      end

      VAR_J = VAR_J + 1;

      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                  FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
      values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CUENTA_IGV_MP,
                                                                           :OUT_FECHA_ORDEN, :VAR_MONEDA, :VAR_TC_VEN,
                                                                           :OUT_GLOSA, :VAR_COSTO_D, :VAR_CARGO,
                                                                           :VAR_ABONO, :OUT_USUARIO_REG,
                                                                           :OUT_USUARIO_REG, :VAR_NOMBRE_CTA,
                                                                           :OUT_RAZON_PROVEEDOR, 'D', 'LOG',
                                                                           :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P,
                                                                           :OUT_RUC_PROVEEDOR, :VAR_TIPO_ORDEN,
                                                                           :UNIDAD_OPERATIVA, :NRO_ORDEN,
                                                                           :VAR_ID_CENCOS_TMP, :VAR_NOM_CENCOS_TMP);
    end*/

    --Si existe algun registro provisionado de la orden de compra/servicio, inserta la cuenta de abono(42).
    if (V_EXISTE_PROVISION = 1) then
    begin
      VAR_J = VAR_J + 1;

      if (VAR_MONEDA = 'S') then
      begin
        VAR_CTA_MONEDA = VAR_CTA_S_PROVISION;
        VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_S;
        VAR_CARGO = 0.0;
        VAR_ABONO = VAR_SUMA_ABONO;
        VAR_COSTO_D = VAR_ABONO / VAR_TC_VEN;
      end

      if (VAR_MONEDA = 'D') then
      begin
        VAR_CTA_MONEDA = VAR_CTA_D_PROVISION;
        VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_D;
        VAR_CARGO = 0.0;
        VAR_ABONO = VAR_SUMA_ABONO * VAR_TC_VEN;
        VAR_COSTO_D = VAR_SUMA_ABONO;
      end

      if (VAR_FLAG_CENTRO_COSTO_P = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end
      else
      begin
        VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
        VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
      end

      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                  FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
      values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CTA_MONEDA,
                                                                           :OUT_FECHA_ATENDIDO,
                                                                           /*:OUT_FECHA_ORDEN,*/ :VAR_MONEDA,
                                                                           :VAR_TC_VEN, :OUT_GLOSA, :VAR_COSTO_D,
                                                                           :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
                                                                           :OUT_USUARIO_REG, :VAR_NOMBRE_CTA,
                                                                           :OUT_RAZON_PROVEEDOR, 'H', 'LOG',
                                                                           :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P,
                                                                           :OUT_RUC_PROVEEDOR, :VAR_TIPO_ORDEN,
                                                                           :UNIDAD_OPERATIVA, :NRO_ORDEN,
                                                                           :VAR_ID_CENCOS_TMP, :VAR_NOM_CENCOS_TMP);

      --Se genera el ajuste por redondeo en caso existiera.
      select count(1)
      from SP_GEN_AJUSTE_ASIENTO(:EMPRESA, :VAR_ANIO_ASIENTO, /* :ANIO,*/ :VAR_LS_CODIGO)
      into V_CONTADOR;
      --Fin
    end
    --Fin JC

    --Se quita los where innecesarios, ya utiliza la pk.
    /*update DIA_DIARIO
  set CARGO = :VAR_SUMA_CARGO,
      ABONO = :VAR_SUMA_ABONO,
      CONCEPTO = :OUT_GLOSA
  where (CODIGO = :VAR_LS_CODIGO);*/

    -- actualizar cabecera del asiento
    select sum(CARGO), sum(ABONO)
    from DIA_DIARIO_DET
    where (CODIGOP = :VAR_LS_CODIGO)
    into :VAR_SUMA_CARGO, :VAR_SUMA_ABONO;

    update DIA_DIARIO
    set CARGO = :VAR_SUMA_CARGO,
        ABONO = :VAR_SUMA_ABONO
    where (CODIGO = :VAR_LS_CODIGO);

    select count(*)
    from SP_PENDIENTE_X_ATENDER(:EMPRESA, :UNIDAD_OPERATIVA, :ANIO, :TIPO, :NRO_ORDEN, :VAR_TIPO_CONFORMIDAD)
    into :VAR_RESPUESTA;

    if (VAR_RESPUESTA = 0) then --si no existen items por registrar
    begin
      --actualizar la orden a atendido

      /*Solo si el estado es diferente a FACTURADO, lo actualizamos a ATENDIDO. BAVALOS 26.01.26*/
      if (OUT_ESTADO <> 'FA') then
        OUT_ESTADO = 'AT';

      update LOG_ORDENES LOGOS
      set LOGOS.CODIGO_ASIENTO_COS = :VAR_LS_CODIGO,
          LOGOS.FLAG_PROVISIONADO = 1,
          LOGOS.ESTADO = :OUT_ESTADO
      where (LOGOS.EMPRESA = :EMPRESA and
            LOGOS.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
            LOGOS.ANIO = :ANIO and
            LOGOS.TIPO = :TIPO and
            LOGOS.NRO_ORDEN = :NRO_ORDEN);
    end
    else
    begin
      update LOG_ORDENES LOGOS
      set LOGOS.CODIGO_ASIENTO_COS = :VAR_LS_CODIGO,
          LOGOS.FLAG_PROVISIONADO = 1
      where (LOGOS.EMPRESA = :EMPRESA and
            LOGOS.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
            LOGOS.ANIO = :ANIO and
            LOGOS.TIPO = :TIPO and
            LOGOS.NRO_ORDEN = :NRO_ORDEN);
    end

    --validaciones para orden, requerimiento y acta rbueno
    select count(*)
    from SP_OBTENER_ORDEN_REQ(:EMPRESA, :VAR_AREA_REQUERIMIENTO, :VAR_ANIO_REQUERIMIENTO, :VAR_TIPO_REQ, :VAR_NRO_REQUERIMIENTO, 1)
    into :VAR_CANTIDAD_ORDENES;

    /*Se verifica si el requerimiento esta ORDENADO para proceder con la actualizacion de estado. NVILLAFANA 04.04.2024*/
    select LR.ESTADO
    from LOG_REQUERIMIENTO LR
    where LR.EMPRESA = :EMPRESA and
          LR.AREA_ORIGEN = :VAR_AREA_REQUERIMIENTO and
          LR.ANIO = :VAR_ANIO_REQUERIMIENTO and
          LR.TIPO1 = :VAR_TIPO_REQ and
          LR.NRO_REQUERIMIENTO = :VAR_NRO_REQUERIMIENTO
    into :VAR_ESTADO_REQ;

    if (VAR_CANTIDAD_ORDENES = 0 and
        VAR_ESTADO_REQ = 'OR') then --si no existen ordenes por atender y su req este Ordenado. Fin correccion de NVILLAFANA 04.04.2024
    begin
      --actualizar el requerimiento a atendido
      update LOG_REQUERIMIENTO LR
      set LR.ESTADO = 'AT',
          LR.FECHA_ATENDIDO = current_timestamp,
          LR.USUARIO_ATENCION = :VAR_USUARIO_ATENCION
      where LR.EMPRESA = :EMPRESA and
            LR.AREA_ORIGEN = :VAR_AREA_REQUERIMIENTO and
            LR.ANIO = :VAR_ANIO_REQUERIMIENTO and
            LR.TIPO1 = :VAR_TIPO_REQ and
            LR.NRO_REQUERIMIENTO = :VAR_NRO_REQUERIMIENTO;
    end

    --inserta el codigo de asiento a la conformidad generada
    update LOG_CONFORMIDAD_ORDENES LCO
    set LCO.CODIGO_ASIENTO = :VAR_LS_CODIGO --,
        --LCO.ESTADO = 2
    where LCO.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA;

    OUT_CODIGO_ASIENTO_COS = VAR_LS_CODIGO;
    if (VAR_AUXILIAR is null) then
    begin
      -- actualizar la tabla de registros del libro contables
      update or insert into PRO_CONTROL_NUMERACION_REGS (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, NROCOM,
                                                         TIPONUMERACION)
      values (:EMPRESA, :OUT_CODLOC, '000' || :VAR_LIBCON, :VAR_LIBCON, :VAR_ANIO_ASIENTO, /*:ANIO,*/ :VAR_MES_ASIENTO,
              /*:OUT_MES,*/ :VAR_LS_NROCOM, 'M')
      matching (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, TIPONUMERACION);
    end

    suspend;
  end
end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD IS
'/*
  * version  fecha       responsable descipcion
  * 1.0     ------      SYSDBA      Proceso que genera asiento contable de conformidad.
  * 1.1     05.01.2022  BAVALOS     Se cambia la variable LO.ANIO en la consulta donde se obtiene el detalle, por la variable :VAR_ANIO_ASIENTO
                                    para obtener las cuentas actuales. */
---------------------------------------------------------------------------------------------------------------------------------
Fecha:17/04/2022
Autor:Richard Damacend
Version: 1.2
Comentario: Se ha considerado las cuentas de provisiones respecto a los proveedores vinculados,, ademas de comentar doble consulta en la
tabla PUB_PERSONAS para validar si el proveedor se encuentra vincualdo o no.
---------------------------------------------------------------------------------------------------------------------------------
Fecha:15/08/2022
Autor:Brecia Avalos
Version: 1.3
Comentario: Se disminuye los decimales en las variables de cargo (var_cargo) y abono (var_abono) a 2 decimales,
                                    y el importe extranjero (var_costo_d) a 3.
---------------------------------------------------------------------------------------------------------------------------------
Fecha:16/08/2022
Autor:Andy Villafana
Version: 1.4
Comentario: Se considera ajustes por la renuncia de exoneracion de IGV.
---------------------------------------------------------------------------------------------------------------------------------
Fecha:11/10/2022
Autor:Brecia Avalos
Version: 1.5
Comentario: La decripcion de la glosa ya no sera de la orden, sino del nuevo campo de concepto por conformidad.
---------------------------------------------------------------------------------------------------------------------------------
Fecha:14/10/2022
Autor:Andy Villafana
Version: 1.6
Comentario: Se obtiene igv mas antiguo (18%), este cambio es temporal porque se va incluir tasa de igv en LOG_ORDENES
---------------------------------------------------------------------------------------------------------------------------------
Fecha:22/11/2022
Autor:Andy Villafana
Version: 1.7
Comentario: Se obtiene tasa de igv de LOG_ORDENES
---------------------------------------------------------------------------------------------------------------------------------
Fecha:10/12/2022
Autor:Andy Villafana
Version: 1.8
Comentario: Se considera codigo de activo fijo en el asiento contable para envia a SAP.
---------------------------------------------------------------------------------------------------------------------------------
Fecha:04/04/2024
Autor:Nicoll Villafana
Version: 1.9
Comentario: Se corrige validacion para actualizar requerimientos con OC/OS atendidas.
---------------------------------------------------------------------------------------------------------------------------------
Fecha: 26/01/2026
Autor: Brecia Avalos
Version: 2.0
Comentario: Solo si el estado es diferente a FACTURADO, lo actualizamos a ATENDIDO.
---------------------------------------------------------------------------------------------------------------------------------
Fecha: 04/02/2026
Autor: Brecia Avalos
Version: 2.0
Comentario: Consideramos indicador que diferencia a las industriales con PLX, para obtener las cuentas contables
            por CECOS o cencepto de costo.';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_EMPRESAS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,UPDATE ON LOG_ORDENES TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,UPDATE ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_CENCOS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_TRABAJADORES TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_AREAS_EMPRESA TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_TIPCAM TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_PLANCTAS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON ALM_ALMACENES TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,INSERT,DELETE,UPDATE ON DIA_DIARIO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,INSERT,UPDATE ON PRO_CONTROL_NUMERACION_REGS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON LOG_CONFORMIDAD_ORDENES_DET TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON LOG_CATALOGO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON LOG_TIPO_CATALOGO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON PUB_CENCOS_CTAS_COSTOS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON COS_FAMILIA_DET_CONCEPTOS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON ALM_ARTICULO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON OPE_SLP_ETAPA TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT ON OPE_PLANTAS TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,INSERT ON DIA_DIARIO_DET TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT INSERT ON DIA_DIARIO_DET_OPE TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT EXECUTE ON PROCEDURE SP_GEN_AJUSTE_ASIENTO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT EXECUTE ON PROCEDURE SP_PENDIENTE_X_ATENDER TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT EXECUTE ON PROCEDURE SP_OBTENER_ORDEN_REQ TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;
GRANT SELECT,UPDATE ON LOG_REQUERIMIENTO TO PROCEDURE SP_ASIENTO_OS_CONFORMIDAD;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_CONFORMIDAD_ORDENES_AUTO;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_GENERAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROCESAR_CIERRE_LOGISTICA;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROCESAR_CONFORMIDADES_JC;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROV_OS_GVENTAS;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO ANALISTAS;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_PROV_OS_EXTORNO_CIERRE (
    EMPRESA varchar(2),
    UNIDAD_OPERATIVA varchar(5),
    ANIO integer,
    TIPO varchar(1),
    NRO_ORDEN numeric(18,0),
    ID_ACTA bigint,
    IN_ANIO_FT integer,
    IN_MES_FT integer)
returns (
    OUT_CODIGO_ASIENTO_COS varchar(16),
    OUT_FEC_REG timestamp,
    OUT_USUARIO_REG varchar(20),
    OUT_TOTAL_IGV numeric(15,2),
    OUT_RUC_PROVEEDOR varchar(15),
    OUT_RAZON_PROVEEDOR varchar(150),
    OUT_USUA_MOD varchar(20),
    OUT_GLOSA varchar(350),
    OUT_TOTAL_VALOR numeric(15,4),
    OUT_FECHA_ATENDIDO timestamp,
    OUT_MES numeric(2,0),
    OUT_ESTADO varchar(2),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_MONEDA varchar(1),
    OUT_NDOC_COTIZACION varchar(80),
    OUT_DESCRIPCION varchar(350),
    OUT_ID_CENCOS varchar(30),
    OUT_CODLOC varchar(5),
    OUT_NRO_LOTE varchar(20),
    LOCAL_PROVISION char(2),
    OUT_FECHA_ORDEN date,
    OUT_NRO_REQUERIMIENTO numeric(18,0))
as
declare variable VAR_CANTIDAD numeric(16,4) = 0.0;
declare variable VAR_ITEM integer;
declare variable VAR_UNIMED varchar(10);
declare variable VAR_MONEDA varchar(10);
declare variable VAR_VALOR_VENTA numeric(15,2);
declare variable VAR_TOTAL_VALOR numeric(16,2);
declare variable VAR_TC_VEN numeric(8,4);
declare variable VAR_J integer = 0;
declare variable VAR_COSTO_D numeric(18,3);
declare variable VAR_CARGO numeric(18,2);
declare variable VAR_ABONO numeric(18,2);
declare variable VAR_LIBCON varchar(2);
declare variable VAR_LS_NROCOM varchar(16);
declare variable VAR_LI_NROCOM integer;
declare variable VAR_LS_CODIGO varchar(21);
declare variable VAR_CTA varchar(20);
declare variable VAR_CTA_NOMBRE varchar(200);
declare variable VAR_CTA_S_PROVISION varchar(20);
declare variable VAR_CTA_D_PROVISION varchar(20);
declare variable VAR_NOMBRE_CTA_D varchar(200);
declare variable VAR_NOMBRE_CTA_S varchar(200);
declare variable VAR_NOMBRE_CTA varchar(200);
declare variable VAR_CTA_MONEDA varchar(20);
declare variable VAR_LOTE varchar(20);
declare variable VAR_SUMA_CARGO numeric(15,2) = 0;
declare variable VAR_SUMA_ABONO numeric(15,3) = 0;
declare variable VAR_CONT integer = 0;
declare variable VAR_ESPECIE varchar(150);
declare variable VAR_AUXILIAR varchar(16);
declare variable VAR_NRO_LOTE varchar(40);
declare variable VAR_COD_ALMACEN varchar(3);
declare variable VAR_CEN_COSTO_P varchar(1);
declare variable VAR_CTACTE_P varchar(1);
declare variable VAR_FLAG_LOTE_P integer;
declare variable VAR_FLAG_CENTRO_COSTO_P integer;
declare variable VAR_FLAG_CTACTE_P integer;
declare variable VAR_CENTRO_COSTO varchar(1);
declare variable VAR_CTACTE varchar(1);
declare variable VAR_FLAG_CENTRO_COSTO integer;
declare variable VAR_FLAG_CTACTE integer;
declare variable VAR_FLAG_LOTE integer;
declare variable VAR_CODIGO_ESPECIE varchar(15);
declare variable VAR_ALMACEN varchar(3);
declare variable VAR_NOM_CENCOS varchar(80);
declare variable VAR_ORDEN_COMPRA varchar(60);
declare variable VAR_CODLOC_SLP varchar(2);
declare variable VAR_ANIO_SLP integer;
declare variable VAR_TIPO_SLP varchar(1);
declare variable VAR_NRO_SLP integer;
declare variable VAR_TIPO_ORDEN varchar(2);
declare variable VAR_FAMILIA varchar(2);
declare variable VAR_VINCULADA integer;
declare variable UNID_OPERATIVA varchar(15);
declare variable VAR_COD_CONCEPTO varchar(3);
declare variable V_LOCAL_ASIENTO varchar(2);
declare variable V_LIBRO_ASIENTO varchar(2);
declare variable V_ANIO_OR integer;
declare variable V_MES_OR integer;
declare variable VAR_ID_CENCOS_TMP varchar(30);
declare variable VAR_NOM_CENCOS_TMP varchar(80);
declare variable VAR_COD_ARTICULO varchar(10);
declare variable VAR_ARTICULO_ORDEN varchar(9);
declare variable VAR_ALMACEN_ORDEN varchar(3);
declare variable V_TIPO_REGISTRO integer = 0;
declare variable VAR_CODIGO_ORDEN varchar(50);
declare variable VAR_MES_ORDEN integer;
declare variable V_EXISTE_PROVISION integer = 0;
declare variable V_CONTADOR integer;
declare variable VAR_ITEM_ASIENTO varchar(5);
declare variable VAR_ID_CENCOS_CAB varchar(30);
declare variable VAR_NOM_CENCOS_CAB varchar(80);
declare variable VAR_ANIO_ASIENTO integer;
declare variable VAR_MES_ASIENTO numeric(2,0);
declare variable VAR_RESPUESTA integer;
declare variable VAR_TIPO_CONFORMIDAD varchar(1);
declare variable VAR_USUARIO_ATENCION varchar(30);
declare variable VAR_CODIGO_ASIENTO varchar(16);
declare variable VAR_NRO_REQUERIMIENTO numeric(18,0);
declare variable VAR_AREA_REQUERIMIENTO varchar(20);
declare variable VAR_ANIO_REQUERIMIENTO integer;
declare variable VAR_CANTIDAD_ORDENES integer;
declare variable VAR_VALOR_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_ORDEN numeric(16,4);
declare variable VAR_SUMA_CANT_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_X_RECIBIR numeric(16,4);
declare variable VAR_CANTIDAD_RECIBIDA numeric(16,4);
declare variable VAR_TIPO_REQ varchar(1);
declare variable VAR_LLAVE_S varchar(50);
declare variable VAR_LLAVE_D varchar(50);
declare variable VAR_CUENTA_IGV_MP varchar(15);
declare variable VAR_IGV_FLAG char(1);
declare variable VAR_GIRO_NEGOCIO char(1);
declare variable VAR_FACTOR_IGV numeric(15,2);
declare variable VAR_FLAG_IGV integer;
declare variable VAR_TOTAL_IGV_FLAG numeric(15,7);
declare variable VAR_MONTO_IGV_FLAG numeric(15,7);
declare variable VAR_ETAPA_SLP varchar(1);
declare variable VAR_FECHA_FT date;
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(15);
declare variable VAR_NUMDOC varchar(20);
declare variable VAR_IND_USO_CTA varchar(2);
declare variable VAR_COD_PLANTA integer;
declare variable VAR_DES_PLANTA varchar(40);
declare variable VAR_DES_CONCEPTO varchar(350);
begin

  if (TIPO = 'C') then
    VAR_TIPO_ORDEN = 'OC';
  if (TIPO = 'S') then
    VAR_TIPO_ORDEN = 'OS';

  -- obtenemos el libro
  select VALOR
  from PARAMETROS_SISTEMAS
  where EMPRESA = :EMPRESA and
        SISTEMA = '012' and
        LLAVE = 'LIB_ALMACEN'
  into :VAR_LIBCON;

  if (TIPO = 'S') then
  begin
    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = 'LIB_PROV_OS'
    into :VAR_LIBCON;
  end

  /*Obtenemos el indicador tipo de provision para diferenciarlo al tomar la cuenta contable. BAVALOS 04.02.26*/
  select coalesce(PUB_EMPRESAS.IND_PROVISION, 0)
  from PUB_EMPRESAS
  where PUB_EMPRESAS.CODEMP = :EMPRESA
  into :VAR_IND_USO_CTA;

  select IGV_FLAG
  from PUB_EMPRESAS
  where CODEMP = :EMPRESA
  into :VAR_IGV_FLAG;
  if (VAR_IGV_FLAG = '1') then
  begin
    select CODIGO
    from PUB_TABLA_PARAMETROS
    where EMPRESA = :EMPRESA and
          LLAVE = 'CUENTA_IGV_MP' and
          ITEM = 1
    into :VAR_CUENTA_IGV_MP;

  end

  for select LOGO.FEC_REG, LOGO.USUA_REG, LOGO.RUC_PROVEEDOR, LOGO.RAZON_PROVEEDOR, LOGO.MONEDA, LOGO.FECHA,
             LOGO.ESTADO, coalesce(LCO.CONCEPTO, LOGO.DESCRIPCION), LOGO.ID_CENCOS, LOGO.TIPO_CONFORMIDAD,
             LCO.USUARIO_ATENCION, LCO.FECHA_ATENCION, LCO.CODIGO_ASIENTO, LOGO.NRO_REQUERIMIENTO,
             LOGO.AREA_REQUERIMIENTO, LOGO.ANIO_REQUERIMIENTO, iif(LOGO.TIPO = 'C', 'P', LOGO.TIPO), LOGO.FLAG_IGV
      from LOG_ORDENES LOGO
      left join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = LOGO.EMPRESA and LCO.UNID_OPERATIVA = LOGO.UNID_OPERATIVA and LCO.ANIO = LOGO.ANIO and LCO.TIPO = LOGO.TIPO and LCO.NRO_ORDEN = LOGO.NRO_ORDEN
      where LOGO.EMPRESA = :EMPRESA and
            LOGO.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
            LOGO.ANIO = :ANIO and
            LOGO.TIPO = :TIPO and
            LOGO.NRO_ORDEN = :NRO_ORDEN and
            LCO.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA
      into :OUT_FEC_REG, :OUT_USUARIO_REG, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, :OUT_MONEDA, OUT_FECHA_ORDEN,
           :OUT_ESTADO, :OUT_DESCRIPCION, :VAR_ID_CENCOS_CAB, :VAR_TIPO_CONFORMIDAD, :VAR_USUARIO_ATENCION,
           :OUT_FECHA_ATENDIDO, :OUT_CODIGO_ASIENTO_COS, :VAR_NRO_REQUERIMIENTO, :VAR_AREA_REQUERIMIENTO,
           :VAR_ANIO_REQUERIMIENTO, :VAR_TIPO_REQ, :VAR_FLAG_IGV
  do
  begin

    /*Obtenemos la factura asociado a la OS. BAVALOS 15.05.24*/
    select first 1 PRO_DOC.FECDOC, PRO_DOC.TIPDOC, PRO_DOC.SERDOC, PRO_DOC.NUMDOC
    from PRO_DOC_DET
    left join PRO_DOC on PRO_DOC.CODIGO = PRO_DOC_DET.CODIGODOC
    where substring(PRO_DOC_DET.CODIGODOC from 1 for 2) = :EMPRESA and
          extract(year from PRO_DOC.FECCON) = :IN_ANIO_FT and
          extract(month from PRO_DOC.FECCON) = :IN_MES_FT and
          PRO_DOC.ID_PERSONA = :OUT_RUC_PROVEEDOR and
          PRO_DOC_DET.OC_ANIO = :ANIO and
          PRO_DOC_DET.OC_UNID_OPERATIVA = :UNIDAD_OPERATIVA and
          PRO_DOC_DET.OC_TIPO = :TIPO and
          PRO_DOC_DET.OC_NRO_ORDEN = :NRO_ORDEN
    order by PRO_DOC.FECDOC desc
    into :VAR_FECHA_FT, :VAR_TIPDOC, :VAR_SERDOC, :VAR_NUMDOC;

    --GCHAVEZ 09.06.22 , Obtenemos el factor del igv en decimal
    select max(PUB_FACTORES_VALORES.VALOR / 100)
    from PUB_FACTORES_VALORES
    where PUB_FACTORES_VALORES.CODFACTOR = '010101' and
          PUB_FACTORES_VALORES.ESTADO = 'A' and
          :OUT_FECHA_ORDEN between PUB_FACTORES_VALORES.FECHA_INICIAL and FECHA_FINAL
    into :VAR_FACTOR_IGV;

    select VINCULADA
    from PUB_PERSONAS
    where (CODEMP = :EMPRESA) and
          (ID_PERSONA = :OUT_RUC_PROVEEDOR)
    into :VAR_VINCULADA;

    if (VAR_VINCULADA = 1) then
    begin
      if (OUT_MONEDA = 'S') then
      begin
        VAR_LLAVE_S = 'CTA_PROVISION_DIFERIDO_D';
      end
      else
      begin
        VAR_LLAVE_D = 'CTA_PROVISION_DIFERIDO_D';
      end
    end
    else
    begin
      if (OUT_MONEDA = 'S') then
      begin
        VAR_LLAVE_S = 'CTA_PROVISION_DIFERIDO_D';
      end
      else
      begin
        VAR_LLAVE_D = 'CTA_PROVISION_DIFERIDO_D';
      end
    end

    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = :VAR_LLAVE_S
    into :VAR_CTA_S_PROVISION;

    --obtenemos la cuenta de provision en dolares
    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :EMPRESA and
          SISTEMA = '012' and
          LLAVE = :VAR_LLAVE_D
    into :VAR_CTA_D_PROVISION;

    if (OUT_FECHA_ATENDIDO is null) then
    begin
      VAR_ANIO_ASIENTO = extract(year from current_date);
      VAR_MES_ASIENTO = extract(month from current_date);
    end
    else
    begin
      VAR_ANIO_ASIENTO = extract(year from OUT_FECHA_ATENDIDO);
      VAR_MES_ASIENTO = extract(month from OUT_FECHA_ATENDIDO);
    end

    select PC.NOM_CENCOS
    from PUB_CENCOS PC
    where PC.CODGRU_EMP = :EMPRESA and
          PC.ANIO = :VAR_ANIO_ASIENTO and
          -- :ANIO
          PC.ID_CENCOS = :VAR_ID_CENCOS_CAB
    into :VAR_NOM_CENCOS_CAB;

    /*   SE OBTIENE EL AREA DEL TRABAJADOR   */
    select PUB_TRABAJADORES.COD_AREA
    from PUB_TRABAJADORES
    where PUB_TRABAJADORES.CODEMP = :EMPRESA and
          PUB_TRABAJADORES.COD_USUARIO = :OUT_USUARIO_REG
    into :UNID_OPERATIVA;

    select PAE.LOCAL_PROVISION
    from PUB_AREAS_EMPRESA PAE
    where PAE.CODGRU_EMP = :EMPRESA and
          PAE.ANIO = :VAR_ANIO_ASIENTO and
          --:ANIO and
          PAE.ID_AREA = :UNID_OPERATIVA
    into :LOCAL_PROVISION;
    /* FIN DE SCRIPT */

    if (VAR_FECHA_FT is null) then
      VAR_FECHA_FT = OUT_FECHA_ATENDIDO;

    if (OUT_FECHA_ATENDIDO is null) then
      OUT_FECHA_ATENDIDO = current_time;

    /* Buscamos el tipo de cambio de la operacion*/
    select PUB_TIPCAM.VENTA
    from PUB_TIPCAM
    where (PUB_TIPCAM.MONEDA = 'D') and
          PUB_TIPCAM.FECHA = :VAR_FECHA_FT -- :OUT_FECHA_ATENDIDO
    into :VAR_TC_VEN;

    /* Buscamos el tipo de cambio de la operacion*/
    select PUB_TIPCAM.VENTA
    from PUB_TIPCAM
    where (PUB_TIPCAM.MONEDA = 'D') and
          PUB_TIPCAM.FECHA = cast(:OUT_FECHA_ATENDIDO as date) --:OUT_FECHA_ORDEN
    into :VAR_TC_VEN;

    -- sino encuentra tipo de cambio en la fecha de operacion se pone el maximo
    if (VAR_TC_VEN is null) then
    begin
      select first 1 PUB_TIPCAM.VENTA
      from PUB_TIPCAM
      where (PUB_TIPCAM.MONEDA = 'D')
      order by FECHA desc
      into :VAR_TC_VEN;
    end

    --Se obtiene la cuenta en base a la moneda de la OC.
    if (OUT_MONEDA = 'S') then
    begin
      --obtenemos el nombre de la cuenta de provision en soles y sus flags.
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            -- :ANIO and
            P.CTA_COD = :VAR_CTA_S_PROVISION
      into :VAR_NOMBRE_CTA_S, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
    end
    if (OUT_MONEDA = 'D') then
    begin
      --obtenemos el nombre de la cuenta de provision en dolares y sus flag.
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            --:ANIO and
            P.CTA_COD = :VAR_CTA_D_PROVISION
      into :VAR_NOMBRE_CTA_D, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
    end

    --se asignan los valores a los flags.
    VAR_FLAG_CENTRO_COSTO_P = DECODE(VAR_CEN_COSTO_P, 'S', 1, 0);
    VAR_FLAG_CTACTE_P = DECODE(VAR_CTACTE_P, 'S', 1, 0);
    -- FLAG_SLP_P = DECODE(VAR_SLP_P, 'S', 1, 0);
    VAR_FLAG_LOTE_P = DECODE(VAR_FLAG_LOTE_P, 1, 1, 0);

    /* recuperamos la pk de orden de compra */
    VAR_ORDEN_COMPRA = EMPRESA || UNIDAD_OPERATIVA || ANIO || TIPO || lpad(NRO_ORDEN, 4, '0');

    OUT_GLOSA = substring(OUT_DESCRIPCION from 1 for 120);

    --Se obtiene el almacen del detalle de la orden.
    select max(LOGO.COD_ALMACEN)
    from LOG_ORDENES_DET LOGO
    where LOGO.EMPRESA = :EMPRESA and
          LOGO.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
          LOGO.ANIO = :ANIO and
          LOGO.TIPO = :TIPO and
          LOGO.NRO_ORDEN = :NRO_ORDEN
    into VAR_COD_ALMACEN;
    --Fin

    /* obtenemos la localidad por el almacen */
    select COD_LOCAL
    from ALM_ALMACENES
    where COD_ALMACEN = :VAR_COD_ALMACEN and
          EMPRESA = :EMPRESA
    into :OUT_CODLOC;
    --
    /*se obtiene el local atravez de la unidad operativa*/
    select PAE.LOCAL_PROVISION
    from PUB_AREAS_EMPRESA PAE
    where PAE.CODGRU_EMP = :EMPRESA and
          PAE.ANIO = :VAR_ANIO_ASIENTO and
          --:ANIO and
          PAE.ID_AREA = :UNIDAD_OPERATIVA
    into :LOCAL_PROVISION;

    if (LOCAL_PROVISION is null) then
      LOCAL_PROVISION = '01';

    if (OUT_CODLOC is null) then
      OUT_CODLOC = LOCAL_PROVISION;

    OUT_MES = extract(month from OUT_FECHA_ORDEN);

    /* Valida si el codigo de asiento tiene el mismo local del ingreso a almacen,
    sino se genera un nuevo asiento.*/
    if (OUT_CODIGO_ASIENTO_COS is not null and
        trim(OUT_CODIGO_ASIENTO_COS) <> '') then
    begin
      V_LOCAL_ASIENTO = substring(OUT_CODIGO_ASIENTO_COS from 3 for 2);
      V_LIBRO_ASIENTO = substring(OUT_CODIGO_ASIENTO_COS from 5 for 2);
      /*Verificamos que si el a?o y mes de la orden de compra a cambiado*/
      /* recuperamos el a?o y mes de la orden de compra */
      V_ANIO_OR = substring(OUT_CODIGO_ASIENTO_COS from 7 for 4);
      V_MES_OR = substring(OUT_CODIGO_ASIENTO_COS from 11 for 2);

      if (V_MES_OR <> VAR_MES_ASIENTO or V_ANIO_OR <> VAR_ANIO_ASIENTO) then
      begin
        /* eliminamo el asiento contable */
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end

      /* Verifica si el local del asiento es diferente al local del almacen de destino,
      si es asi, elimina el asiento. */
      if (V_LOCAL_ASIENTO <> OUT_CODLOC) then
      begin
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end
      /* Verifica si el valor del parametro LIB_ALMACEN es diferente al libro del asiento contable,
      si es asi, elimina el asiento.*/
      if (V_LIBRO_ASIENTO <> VAR_LIBCON) then
      begin
        delete from DIA_DIARIO
        where CODIGO = :OUT_CODIGO_ASIENTO_COS;

        OUT_CODIGO_ASIENTO_COS = null;
      end

    end

    VAR_AUXILIAR = OUT_CODIGO_ASIENTO_COS;

    if (OUT_CODIGO_ASIENTO_COS is null) then
    begin

      --obtenemos el nrocom para generar el codigo del asiento
      select NROCOM
      from PRO_CONTROL_NUMERACION_REGS
      where (CODEMP = :EMPRESA) and
            (CODLOC = :OUT_CODLOC) and
            (CODGRU = '000' || LIBCON) and
            (LIBCON = :VAR_LIBCON) and
            (ANIO = :VAR_ANIO_ASIENTO) and
            --ANIO
            (MES = :VAR_MES_ASIENTO) and
            --  OUT_MES
            (TIPONUMERACION = 'M')
      into :VAR_LS_NROCOM;
      if (VAR_LS_NROCOM is null) then
        VAR_LS_NROCOM = '0000';

      -- el estado es siempre C cerrado
      VAR_LI_NROCOM = cast(coalesce(VAR_LS_NROCOM, '0') as numeric(6,0)) + 1;
      VAR_LS_NROCOM = lpad(cast(VAR_LI_NROCOM as varchar(4)), 4, '0');
      VAR_LS_CODIGO = EMPRESA || OUT_CODLOC || VAR_LIBCON || cast(VAR_ANIO_ASIENTO as char(4)) || lpad(VAR_MES_ASIENTO, 2, '0') || VAR_LS_NROCOM;

    end
    else
    begin
      -- regeneramos el asiento
      delete from DIA_DIARIO
      where CODIGO = :OUT_CODIGO_ASIENTO_COS;
      VAR_LS_NROCOM = substring(:OUT_CODIGO_ASIENTO_COS from 13 for 4);
      VAR_LS_CODIGO = :OUT_CODIGO_ASIENTO_COS;

      VAR_MES_ASIENTO = cast(substring(OUT_CODIGO_ASIENTO_COS from 11 for 2) as numeric(2,0));
    end
    --se cambia la campo de fecha de registro del asiento a current_timestamp rbueno 15.04.2021
    insert into DIA_DIARIO (CODIGO, CODEMP, CODLOC, LIBCON, ANIO, MES, NROCOM, FECCON, FECDOC, CONCEPTO, FECMOD,
                            USUARIO, NOMBREPC, ESTADO, USUARIO_MOD, FECREG, TIP_INGRESO, TIPCAM, TABLA)
    values (:VAR_LS_CODIGO, :EMPRESA, :OUT_CODLOC, :VAR_LIBCON, :VAR_ANIO_ASIENTO /*:ANIO*/ ,
                                                                                                   lpad(:VAR_MES_ASIENTO /*OUT_MES*/ , 2, '0'),
                                                                                                   :VAR_LS_NROCOM,
                                                                                                   /*:OUT_FECHA_ORDEN, :OUT_FECHA_ORDEN,*/
                                                                                                   :OUT_FECHA_ATENDIDO,
                                                                                                   :OUT_FECHA_ATENDIDO,
                                                                                                   :OUT_GLOSA,
                                                                                                   current_timestamp,
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   'C',
                                                                                                   :VAR_USUARIO_ATENCION,
                                                                                                   current_timestamp,
                                                                                                   'S', :VAR_TC_VEN,
                                                                                                   'LOG');

    VAR_CONT = VAR_CONT + 1;
    VAR_TOTAL_IGV_FLAG = 0;
    VAR_MONTO_IGV_FLAG = 0;

    for select LOD.ITEM, LOD.UNIMED, LOD.MONEDA, LOD.VALOR_VENTA, iif(:VAR_TIPO_CONFORMIDAD = 'C',
               (LCOD.VALOR * LOD.VALOR_VENTA),
               ((LCOD.VALOR / 100) * LOD.TOTAL_VALOR)) as PORCENTAJE,
               --coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), COSFA.CTA_COD) VINCULADA,
               /*Se considera la cuenta de PUB_CENCOS. BAVALOS 04.02.26*/
               iif(:VAR_IND_USO_CTA = '0', coalesce(coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), PCE.CODCTA_COSTO), COSFA.CTA_COD), COSFA.CTA_COD) VINCULADA,
               CA.DESCRIPCION, CA.COD_FAMILIA, CA.COD_CONCEPTO, coalesce(AA.ARTICULO, LOD.COD_PROD_SERV) COD_ARTICULO,
               LOD.COD_ALMACEN, LOD.NRO_LOTE, LOD.ID_CENCOS, PCE.NOM_CENCOS, LOD.CODLOCAL_SLP, LOD.ANIO_SLP,
               LOD.TIPO_SLP, LOD.NRO_SLP, LOD.COD_ARTICULO, LCOD.VALOR, LOD.CANTIDAD, COSFA.GIRO_NEGOCIO,
               coalesce(LOD.ETAPA_SLP, ''), LOD.DES_PROD_SERV, LOD.COD_PLANTA ---AVILLAFANA 30.01.2026
        from LOG_CONFORMIDAD_ORDENES_DET LCOD
        join LOG_CONFORMIDAD_ORDENES LCO on LCO.ID_LOG_CONFORMIDAD_ORDENES = LCOD.ID_LOG_CONFORMIDAD_ORDENES
        join LOG_ORDENES_DET LOD on LOD.EMPRESA = LCO.EMPRESA and LCO.UNID_OPERATIVA = LOD.UNID_OPERATIVA and LCO.ANIO = LOD.ANIO and LCO.TIPO = LOD.TIPO and LCO.NRO_ORDEN = LOD.NRO_ORDEN and LCOD.ITEM = LOD.ITEM
        left join LOG_CATALOGO CA on (CA.EMPRESA = LOD.EMPRESA and CA.COD_ARTICULO = LOD.COD_PROD_SERV and CA.TIPO_CATALOGO = LOD.TIPO_CATALOGO) -- ACV 14/05/2018
        left join LOG_TIPO_CATALOGO LOT on LOT.EMPRESA = CA.EMPRESA and LOT.TIPO_CATALOGO = CA.TIPO_CATALOGO
        left join PUB_CENCOS PCE on PCE.CODGRU_EMP = LOD.EMPRESA and PCE.ANIO = LOD.ANIO and PCE.ID_CENCOS = LOD.ID_CENCOS
        left join PUB_CENCOS_CTAS_COSTOS PC on (PC.CODEMP = LOD.EMPRESA and PC.ANIO = :VAR_ANIO_ASIENTO /*LOD.ANIO -- BA 04/05/22*/ and PC.ID_CENCOS = LOD.ID_CENCOS and PC.COD_FAMILIA = CA.COD_FAMILIA and PC.TIPO_COSTO = LOD.TIPO_COSTO)
        left join COS_FAMILIA_DET_CONCEPTOS COSFA on (COSFA.CODEMP = CA.EMPRESA and COSFA.COD_FAMILIA = CA.COD_FAMILIA and COSFA.COD_CONCEPTO = CA.COD_CONCEPTO) -- JC 05.06.18
        left join ALM_ARTICULO AA on (AA.EMPRESA = LOD.EMPRESA and AA.COD_CATALOGO_ARTICULO = LOD.COD_PROD_SERV and AA.COD_TIPO_CATALOGO = LOD.TIPO_CATALOGO)
        where LOD.EMPRESA = :EMPRESA and
              LOD.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
              LOD.ANIO = :ANIO and
              LOD.TIPO = :TIPO and
              LOD.NRO_ORDEN = :NRO_ORDEN and
              LCOD.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA
        into :VAR_ITEM, :VAR_UNIMED, :VAR_MONEDA, :VAR_VALOR_VENTA, :VAR_TOTAL_VALOR, :VAR_CTA, :VAR_ESPECIE,
             :VAR_FAMILIA, :VAR_COD_CONCEPTO, VAR_COD_ARTICULO, VAR_ALMACEN_ORDEN, OUT_NRO_LOTE, OUT_ID_CENCOS,
             VAR_NOM_CENCOS, :VAR_CODLOC_SLP, :VAR_ANIO_SLP, :VAR_TIPO_SLP, VAR_NRO_SLP, :VAR_ARTICULO_ORDEN,
             :VAR_VALOR_CONFORMIDAD, :VAR_CANTIDAD_ORDEN, :VAR_GIRO_NEGOCIO, :VAR_ETAPA_SLP, :VAR_DES_CONCEPTO, :VAR_COD_PLANTA ---AVILLAFANA 30.01.2026
    do
    begin

      select DECRIPCION
      from OPE_PLANTAS
      where COD_PLANTA = :VAR_COD_PLANTA
      into :VAR_DES_PLANTA;

      --GCHAVEZ 06.06.22, Sumamos los montos del igv cuando el IGV_FLAG sea 1 y la orden aplica igv
      if (VAR_IGV_FLAG = '1' and
          VAR_FLAG_IGV = 1) then
      begin
        if (VAR_GIRO_NEGOCIO = '1') then
        begin
          VAR_MONTO_IGV_FLAG = VAR_TOTAL_VALOR * VAR_FACTOR_IGV;
          VAR_TOTAL_IGV_FLAG = VAR_TOTAL_IGV_FLAG + VAR_MONTO_IGV_FLAG;
        end
      end
      ---

      VAR_SUMA_CANT_CONFORMIDAD = 0;
      VAR_ESPECIE = substring(VAR_ESPECIE from 1 for 120);

      if (VAR_TOTAL_VALOR is null) then
        VAR_TOTAL_VALOR = 0;

      OUT_TOTAL_VALOR = VAR_TOTAL_VALOR;

      if (VAR_MONEDA = 'D') then
      begin
        VAR_VALOR_VENTA = VAR_VALOR_VENTA * VAR_TC_VEN;
      end

      VAR_NRO_LOTE = OUT_NRO_LOTE;

      if (TIPO = 'S' and
          V_TIPO_REGISTRO = 1) then --Ahora las ordenes automaticas tienen requerimientos.
      begin
        VAR_CODIGO_ESPECIE = VAR_ARTICULO_ORDEN;
        VAR_ALMACEN = VAR_ALMACEN_ORDEN;
      end
      else
      begin
        VAR_CODIGO_ESPECIE = VAR_COD_ARTICULO;
        VAR_ALMACEN = VAR_COD_ALMACEN;
      end

      VAR_ID_CENCOS_TMP = OUT_ID_CENCOS;
      VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS;

      --obtenemos la cuenta
      select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
      from PUB_PLANCTAS P
      where P.EMPRESA = :EMPRESA and
            P.ANIO = :VAR_ANIO_ASIENTO and
            -- :ANIO and
            P.CTA_COD = :VAR_CTA
      into :VAR_CTA_NOMBRE, :VAR_CENTRO_COSTO, :VAR_CTACTE, :VAR_FLAG_LOTE;

      VAR_FLAG_CENTRO_COSTO = DECODE(VAR_CENTRO_COSTO, 'S', 1, 0);
      VAR_FLAG_CTACTE = DECODE(VAR_CTACTE, 'S', 1, 0);
      -- FLAG_SLP = DECODE(VAR_SLP, 'S', 1, 0);
      VAR_FLAG_LOTE = DECODE(VAR_FLAG_LOTE, 1, 1, 0);

      if (VAR_FLAG_LOTE = 0) then
      begin
        VAR_NRO_LOTE = null;--el lote se actualiza desde SP_ALMACEN_DESCARGA.
        VAR_CODIGO_ESPECIE = null;
        VAR_ALMACEN = null;
        --VAR_UNI_MED = null;
      end

      if (VAR_NRO_SLP is not null) then
        VAR_LOTE = :VAR_NRO_SLP;

      if (VAR_FLAG_CENTRO_COSTO = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end

      -- generacion del detalle del asiento para el haber
      if (VAR_MONEDA = 'S') then
      begin
        VAR_CARGO = VAR_TOTAL_VALOR;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_TOTAL_VALOR;
        VAR_ABONO = 0.0;
        VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
        -- VAR_SUMA_ABONO = VAR_SUMA_ABONO + OUT_TOTAL_VALOR;
      end
      if (VAR_MONEDA = 'D') then
      begin
        --  var_cargo=var_total_valor* tip_c
        VAR_CARGO = VAR_TOTAL_VALOR * VAR_TC_VEN;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_CARGO;
        VAR_ABONO = 0;
        VAR_COSTO_D = VAR_TOTAL_VALOR;
        --   VAR_SUMA_ABONO = VAR_SUMA_ABONO + (OUT_TOTAL_VALOR * VAR_TC_VEN);
      end

      --     VAR_SUMA_ABONO = VAR_SUMA_ABONO + OUT_TOTAL_VALOR;
      VAR_SUMA_ABONO = VAR_SUMA_ABONO + OUT_TOTAL_VALOR + VAR_TOTAL_IGV_FLAG;

      VAR_J = VAR_J + 1;
      VAR_ITEM_ASIENTO = lpad(:VAR_J, 5, '0');

      --var_fecha_ft, :var_tipdoc, :var_serdoc, :var_numdoc
      -- Se agrega los campos de lote, articulo y almacen.
      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, ID_PERSONA, NOMBREPER, TIPIMP, TABLA,
                                  FLAG_NATURALEZA, FLAG_CTACTE, FLAG_CENCOS, CANTIDAD, PRECIO_UNIDAD, NRO_SLP, TIPDOC,
                                  SERDOC, NUMDOC, ID_CENCOS, NRO_LOTE, ARTICULO, COD_ALMACEN, UNIDAD_MEDIDA, NOMBRECTO,
                                  CODLOC_SLP, ANIO_SLP, TIPO_SLP, COD_FAMILIA, COD_CONCEPTO, ETAPA_SLP)
      values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_LS_CODIGO, :VAR_ITEM_ASIENTO, :VAR_CTA, :VAR_FECHA_FT, /* :OUT_FECHA_ORDEN,*/
              :VAR_MONEDA, :VAR_TC_VEN, :VAR_ESPECIE, :VAR_COSTO_D, :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
              :OUT_USUARIO_REG, :VAR_CTA_NOMBRE, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, 'D', 'LOG', 2,
              :VAR_FLAG_CTACTE, :VAR_FLAG_CENTRO_COSTO, :VAR_CANTIDAD, :VAR_VALOR_VENTA, :VAR_LOTE, :VAR_TIPDOC,
              :VAR_SERDOC, :VAR_NUMDOC, :VAR_ID_CENCOS_TMP, :VAR_NRO_LOTE, :VAR_CODIGO_ESPECIE, :VAR_ALMACEN,
              :VAR_UNIMED, :VAR_NOM_CENCOS_TMP, :VAR_CODLOC_SLP, :VAR_ANIO_SLP, :VAR_TIPO_SLP, :VAR_FAMILIA,
              :VAR_COD_CONCEPTO, :VAR_ETAPA_SLP);

      /*Insertar informacion en dia_diario_det_ope.AVILLAFANA 04.02.2026*/
      if (:VAR_IND_USO_CTA = '0') then
      begin
        insert into DIA_DIARIO_DET_OPE (CODIGO, MEDIDA, CANTIDAD, PREUNI, COD_PLANTA, NOMBREPLA, COD_FAMILIA,
                                        COD_CONCEPTO, NOMBRE_CONCEPTO, IND_RECLAMO, FEC_REC, FECREG, USUAREG)
        values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_UNIMED, :VAR_CANTIDAD_ORDEN, :VAR_TOTAL_VALOR,
                :VAR_COD_PLANTA, :VAR_DES_PLANTA, :VAR_FAMILIA, :VAR_COD_CONCEPTO, :VAR_DES_CONCEPTO, 0, current_date,
                current_timestamp, :OUT_USUARIO_REG);
      end
      /*Fin insertar informacion 04.02.2026*/

      V_EXISTE_PROVISION = 1;--indica que existe registros provisionados.

    end

    if (VAR_IGV_FLAG = '1' and
        VAR_FLAG_IGV = 1 and
        VAR_TOTAL_IGV_FLAG > 0) then
    begin
      VAR_CARGO = 0;
      --Se suma al cargo del total del monto del igv
      if (VAR_MONEDA = 'S') then
      begin
        VAR_CARGO = VAR_TOTAL_IGV_FLAG;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_TOTAL_IGV_FLAG;
        VAR_ABONO = 0.0;
        VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
      end
      if (VAR_MONEDA = 'D') then
      begin

        VAR_CARGO = VAR_TOTAL_IGV_FLAG * VAR_TC_VEN;
        VAR_SUMA_CARGO = VAR_SUMA_CARGO + VAR_CARGO;
        VAR_ABONO = 0;
        VAR_COSTO_D = VAR_TOTAL_IGV_FLAG;

      end

      --Se agrega el centro de costo de la cabecera
      if (VAR_FLAG_CENTRO_COSTO_P = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end
      else
      begin
        VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
        VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
      end

      VAR_J = VAR_J + 1;

      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                  FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
      values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CUENTA_IGV_MP,
                                                                           :OUT_FECHA_ORDEN, :VAR_MONEDA, :VAR_TC_VEN,
                                                                           :OUT_GLOSA, :VAR_COSTO_D, :VAR_CARGO,
                                                                           :VAR_ABONO, :OUT_USUARIO_REG,
                                                                           :OUT_USUARIO_REG, :VAR_NOMBRE_CTA,
                                                                           :OUT_RAZON_PROVEEDOR, 'D', 'LOG',
                                                                           :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P,
                                                                           :OUT_RUC_PROVEEDOR, :VAR_TIPDOC, :VAR_SERDOC,
                                                                           :VAR_NUMDOC, :VAR_ID_CENCOS_TMP,
                                                                           :VAR_NOM_CENCOS_TMP);
    end

    --Si existe algun registro provisionado de la orden de compra/servicio, inserta la cuenta de abono(42).
    if (V_EXISTE_PROVISION = 1) then
    begin
      VAR_J = VAR_J + 1;

      if (VAR_MONEDA = 'S') then
      begin
        VAR_CTA_MONEDA = VAR_CTA_S_PROVISION;
        VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_S;
        VAR_CARGO = 0.0;
        VAR_ABONO = VAR_SUMA_ABONO;
        VAR_COSTO_D = VAR_ABONO / VAR_TC_VEN;
      end

      if (VAR_MONEDA = 'D') then
      begin
        VAR_CTA_MONEDA = VAR_CTA_D_PROVISION;
        VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_D;
        VAR_CARGO = 0.0;
        VAR_ABONO = VAR_SUMA_ABONO * VAR_TC_VEN;
        VAR_COSTO_D = VAR_SUMA_ABONO;

      end

      if (VAR_FLAG_CENTRO_COSTO_P = 0) then
      begin
        VAR_ID_CENCOS_TMP = null;
        VAR_NOM_CENCOS_TMP = null;
      end
      else
      begin
        VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
        VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
      end

      insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                  ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                  FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
      values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CTA_MONEDA,
                                                                           :VAR_FECHA_FT,
                                                                           /*:OUT_FECHA_ORDEN,*/ :VAR_MONEDA,
                                                                           :VAR_TC_VEN, :OUT_GLOSA, :VAR_COSTO_D,
                                                                           :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
                                                                           :OUT_USUARIO_REG, :VAR_NOMBRE_CTA,
                                                                           :OUT_RAZON_PROVEEDOR, 'H', 'LOG',
                                                                           :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P,
                                                                           :OUT_RUC_PROVEEDOR, :VAR_TIPDOC, :VAR_SERDOC,
                                                                           :VAR_NUMDOC, :VAR_ID_CENCOS_TMP,
                                                                           :VAR_NOM_CENCOS_TMP);

      --Se genera el ajuste por redondeo en caso existiera.
      select count(1)
      from SP_GEN_AJUSTE_ASIENTO(:EMPRESA, :VAR_ANIO_ASIENTO, /* :ANIO,*/ :VAR_LS_CODIGO)
      into V_CONTADOR;
      --Fin
    end

    -- actualizar cabecera del asiento
    select sum(CARGO), sum(ABONO)
    from DIA_DIARIO_DET
    where (CODIGOP = :VAR_LS_CODIGO)
    into :VAR_SUMA_CARGO, :VAR_SUMA_ABONO;

    update DIA_DIARIO
    set CARGO = :VAR_SUMA_CARGO,
        ABONO = :VAR_SUMA_ABONO
    where (CODIGO = :VAR_LS_CODIGO);

    update LOG_ORDENES LOGOS
    set LOGOS.CODIGO_ASIENTO_COS = :VAR_LS_CODIGO,
        LOGOS.FLAG_PROVISIONADO = 1
    where (LOGOS.EMPRESA = :EMPRESA and
          LOGOS.UNID_OPERATIVA = :UNIDAD_OPERATIVA and
          LOGOS.ANIO = :ANIO and
          LOGOS.TIPO = :TIPO and
          LOGOS.NRO_ORDEN = :NRO_ORDEN);

    --inserta el codigo de asiento a la conformidad generada
    update LOG_CONFORMIDAD_ORDENES LCO
    set LCO.CODIGO_ASIENTO = :VAR_LS_CODIGO --,
        --LCO.ESTADO = 2
    where LCO.ID_LOG_CONFORMIDAD_ORDENES = :ID_ACTA;

    OUT_CODIGO_ASIENTO_COS = VAR_LS_CODIGO;
    if (VAR_AUXILIAR is null) then
    begin
      -- actualizar la tabla de registros del libro contables
      update or insert into PRO_CONTROL_NUMERACION_REGS (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, NROCOM,
                                                         TIPONUMERACION)
      values (:EMPRESA, :OUT_CODLOC, '000' || :VAR_LIBCON, :VAR_LIBCON, :VAR_ANIO_ASIENTO, /*:ANIO,*/ :VAR_MES_ASIENTO,
              /*:OUT_MES,*/ :VAR_LS_NROCOM, 'M')
      matching (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, TIPONUMERACION);
    end

    suspend;
  end
end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_PROV_OS_EXTORNO_CIERRE IS
' /* Procedimiento para provisionar las OS diferidas.
  *
  * Version     Fecha       Responsable     Descipcion
  * 1.0         22.03.23    BAVALOS         El procedimiento provisiona las OS diferidas facturadas.
  --------------------------------------------------------------------------------------------------
  * Version     Fecha       Responsable     Descipcion
  * 1.1         15.05.24    BAVALOS         Obtenemos la factura asociado a la OS.
  --------------------------------------------------------------------------------------------------
  * Version     Fecha       Responsable     Descipcion
  * 1.2         04.02.26    BAVALOS         Consideramos indicador que diferencia a las industriales con PLX,
                                            para obtener las cuentas contables por CECOS o cencepto de costo.
/*';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_EMPRESAS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_TABLA_PARAMETROS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT,UPDATE ON LOG_ORDENES TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT,UPDATE ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_FACTORES_VALORES TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_CENCOS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_TRABAJADORES TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_AREAS_EMPRESA TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_TIPCAM TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_PLANCTAS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON ALM_ALMACENES TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT,INSERT,DELETE,UPDATE ON DIA_DIARIO TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT,INSERT,UPDATE ON PRO_CONTROL_NUMERACION_REGS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON LOG_CONFORMIDAD_ORDENES_DET TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON LOG_CATALOGO TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON LOG_TIPO_CATALOGO TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON PUB_CENCOS_CTAS_COSTOS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON COS_FAMILIA_DET_CONCEPTOS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON ALM_ARTICULO TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT ON OPE_PLANTAS TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT SELECT,INSERT ON DIA_DIARIO_DET TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT INSERT ON DIA_DIARIO_DET_OPE TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;
GRANT EXECUTE ON PROCEDURE SP_GEN_AJUSTE_ASIENTO TO PROCEDURE SP_PROV_OS_EXTORNO_CIERRE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_PROV_OS_EXTORNO_CIERRE TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_PROV_OS_GASTOS_VT (
    IN_EMPRESA varchar(2),
    IN_ANIO integer,
    IN_MES integer,
    IN_PROCESO integer)
returns (
    OUT_UND_OPER_ORDEN varchar(30),
    OUT_ANIO_ORDEN integer,
    OUT_TIPO_ORDEN varchar(1),
    OUT_NRO_ORDEN numeric(18,0),
    OUT_FECHA_ZARPE date,
    OUT_ID_ACTA bigint,
    OUT_ASIENTO_PROV_OS varchar(16),
    UNIDAD_OPERATIVA varchar(30),
    ANIO integer,
    TIPO varchar(1),
    NRO_ORDEN numeric(18,0),
    OUT_CODLOC_SLP varchar(2),
    OUT_ANIO_SLP integer,
    OUT_TIPO_SLP varchar(1),
    OUT_NRO_SLP integer,
    OUT_ETAPA_SLP varchar(1),
    OUT_NOM_SLP varchar(20),
    OUT_DES_CLIENTE varchar(120),
    OUT_ESTADO_ETAPA varchar(1),
    OUT_PROVEEDOR varchar(150),
    OUT_MONEDA_ORDEN varchar(1),
    OUT_TOTAL_VALOR numeric(15,7),
    OUT_TOTAL_IGV numeric(15,7),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_ESTADO_ORDEN varchar(2),
    OUT_DES_ORDEN varchar(200),
    OUT_FECHA_FT date,
    OUT_TIPDOC varchar(2),
    OUT_SERDOC varchar(15),
    OUT_NUMDOC varchar(20),
    OUT_RUC_PROVEEDOR varchar(15))
as
declare variable VAR_MES integer;
declare variable V_CONTADOR integer;
declare variable VAR_ANIO integer;
declare variable VAR_SALDO_SLP decimal(15,2);
declare variable VAR_CTA_PROVISION_DIFERIDO varchar(10);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(4);
declare variable VAR_NUMDOC varchar(15);
declare variable VAR_IND_PROVISION integer;
declare variable VAR_ID_ACTA bigint;
declare variable VAR_RUC_PROVEEDOR varchar(15);
declare variable VAR_TIPO_FACT bigint;
declare variable VAR_VINCULADO integer;
declare variable VAR_CTA_PROVISION varchar(10);
begin
    /*IN_PROCESO = 0, Solo devuelve informacion del filtro.
      IN_PROCESO = 1, Ejecuta la informacion filtrada: provision o extorno. */

    /*Obtenemos el indicador para buscar el tipo de provision que tiene cada empresa.*/
    SELECT COALESCE(PUB_EMPRESAS.ind_provision, 0)
    FROM PUB_EMPRESAS
    WHERE PUB_EMPRESAS.codemp = :in_empresa
    INTO :VAR_IND_PROVISION;

    select VALOR
    from PARAMETROS_SISTEMAS PS
    where PS.EMPRESA = :IN_EMPRESA and
          PS.SISTEMA = '012' and
          PS.LLAVE = 'CTA_PROVISION_DIFERIDO_D'
    into :VAR_CTA_PROVISION_DIFERIDO;

    /*----------------------------PROV OS ATENDIDAS----------------------------------*/
    /*Provisionamos las OS atendidas y sin facturas hasta el mes y a?o de cierre.*/
    if (:VAR_IND_PROVISION = 1) then
    BEGIN
        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEX.fec_carga, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, --OEX.estado,
                   lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes LO
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            WHERE LO.empresa = :in_empresa and
                  LO.estado IN ('VB','AT') and
                  lo.tipo_registro = 1 and
                  lo.total_precio > 0 and
                  DETCOM.incoterm = 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :in_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
    
            UNION
    
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEMB.fecha_embarque, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            join OPE_FORMA_PAGO_POSTEMBARQUE OEMB on (OEMB.ID_OPE_FORMA_PAGO_POSTEMBARQUE = OEX.ID_FORMA_PAGO_POSTEMBARQUE)
            WHERE LO.empresa = :in_empresa and
                  LO.estado IN ('VB','AT') and
                  lo.tipo_registro = 1 and
                  lo.total_precio > 0 and
                  DETCOM.incoterm <> 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :in_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
    
          into :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden
    
        DO
        BEGIN

            if (:IN_PROCESO = 1) then
            BEGIN
                UPDATE log_conformidad_ordenes
                SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
            
                select OUT_CODIGO_ASIENTO_COS
                from SP_ASIENTO_OS_CONFORMIDAD(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                into :OUT_ASIENTO_PROV_OS;
            
                if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                begin
                  select count(*)
                  from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                  into V_CONTADOR;
                end
            END

            suspend;

        END
    END

    if (:VAR_IND_PROVISION = 0) then
    BEGIN
        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_zarpe, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado in ('VB','AT') and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  lo.total_precio > 0 and
                  OTMER.tipo_mercancias = 0 and
                  extract(year from OPE.fec_zarpe) = :in_anio and
                  extract(month from OPE.fec_zarpe) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
            
            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_fin_operacion, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado in ('VB','AT') and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  lo.total_precio > 0 and
                  OTMER.tipo_mercancias <> 0 and
                  extract(year from OPE.fec_fin_operacion) = :in_anio and
                  extract(month from OPE.fec_fin_operacion) = :in_mes and
                  --lo.nro_slp > 0 and
                  /*coalesce(lo.codigo_asiento_cos, 0) = 0 and
                  coalesce(lo.flag_provisionado, 0) = 0 and
                  coalesce(LCO.CODIGO_ASIENTO, '') = '' and*/
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
        INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN
            
            if (:IN_PROCESO = 1) then
            BEGIN
                UPDATE log_conformidad_ordenes
                SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
            
                select OUT_CODIGO_ASIENTO_COS
                from SP_ASIENTO_OS_CONFORMIDAD(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                into :OUT_ASIENTO_PROV_OS;
            
                if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                begin
                  select count(*)
                  from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                  into V_CONTADOR;
                end
            END

            suspend;

        END
    END

    OUT_UND_OPER_ORDEN = NULL;
    OUT_ANIO_ORDEN = NULL;
    OUT_TIPO_ORDEN = NULL;
    OUT_NRO_ORDEN = NULL;
    OUT_FECHA_ZARPE = NULL;
    OUT_ID_ACTA = NULL;
    OUT_ASIENTO_PROV_OS = NULL;
    UNIDAD_OPERATIVA = NULL;
    ANIO = NULL;
    TIPO = NULL;
    NRO_ORDEN = NULL;
    OUT_CODLOC_SLP = NULL;
    OUT_ANIO_SLP = NULL;
    OUT_TIPO_SLP = NULL;
    OUT_NRO_SLP = NULL;
    OUT_ETAPA_SLP = NULL;
    OUT_NOM_SLP = NULL;
    OUT_DES_CLIENTE = NULL;
    OUT_ESTADO_ETAPA = NULL;
    OUT_PROVEEDOR = NULL;
    OUT_MONEDA_ORDEN = NULL;
    OUT_TOTAL_VALOR = NULL;
    OUT_TOTAL_IGV = NULL;
    OUT_TOTAL_PRECIO = NULL;
    OUT_ESTADO_ORDEN = NULL;
    OUT_DES_ORDEN = NULL;
    OUT_FECHA_FT = NULL;
    OUT_TIPDOC = NULL;
    OUT_SERDOC = NULL;
    OUT_NUMDOC = NULL;


    /*----------------------------PROV OS DIFERIDAS MES PASADO----------------------------------*/
    /*Aqui provisionamos las OS facturadas que fueron diferidas en el mes anterior.*/

    if (:VAR_IND_PROVISION = 1) then
    BEGIN
        if (in_mes = 1) then
        begin
            var_anio = :in_anio - 1;
            var_mes = 12;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes - 1;
        end
        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEX.fec_carga, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.RUC_PROVEEDOR, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes LO
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  DETCOM.incoterm = 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :in_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :in_mes and
                  --lo.nro_slp > 0 and
                  LO.flag_provisionado = 2

            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEMB.fecha_embarque, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = lo.EMPRESA and OEX.CODLOCAL = lo.codlocal_slp and OEX.ANIO = lo.anio_slp and OEX.NRO_SLP = lo.nro_slp and OEX.TIPO_SLP = lo.tipo_slp and OEX.ETAPA = lodet.etapa_slp)
            join OPE_FORMA_PAGO_POSTEMBARQUE OEMB on (OEMB.ID_OPE_FORMA_PAGO_POSTEMBARQUE = OEX.ID_FORMA_PAGO_POSTEMBARQUE)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  DETCOM.incoterm <> 1 and
                  EXTRACT(YEAR FROM OEMB.fecha_embarque) = :in_anio and
                  EXTRACT(MONTH FROM OEMB.fecha_embarque) = :in_mes and
                  --lo.nro_slp > 0 and
                  LO.flag_provisionado = 2

        into :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA, :OUT_CODLOC_SLP, :OUT_ANIO_SLP,
             :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE, :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN,
             :OUT_total_valor, :OUT_total_igv, :OUT_total_precio, :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN

            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :var_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :var_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc;

            if (var_numdoc is not null) then
            begin
                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION_DIFERIDO and
                   ddt.tipdoc = :var_tipdoc and
                   ddt.serdoc = :var_serdoc and
                   ddt.numdoc = :var_numdoc
                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                begin
                    if (in_proceso = 1) then
                    BEGIN
                        UPDATE log_conformidad_ordenes
                        SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                        WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;

                        select OUT_CODIGO_ASIENTO_COS
                        from SP_PROV_OS_EXTORNO_CIERRE(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :var_anio, :var_MES)
                        into :OUT_ASIENTO_PROV_OS;
                        
                        if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                        begin
                            select count(*)
                            from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                            into V_CONTADOR;
                        end
                    END
                    suspend;
                end
             end
        END
    END

    if (:VAR_IND_PROVISION = 0) then
    BEGIN

        /*Se considera el mes anterior. AVILLAFANA 04.02.2026*/
        if (in_mes = 1) then
        begin
            var_anio = :in_anio - 1;
            var_mes = 12;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes - 1;
        end


        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_zarpe, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias = 0 and
                  extract(year from OPE.fec_zarpe) = :in_anio and
                  extract(month from OPE.fec_zarpe) = :in_mes and
                  --lo.nro_slp > 0 and
                  LO.flag_provisionado = 2
            
            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_fin_operacion, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias <> 0 and
                  extract(year from OPE.fec_fin_operacion) = :in_anio and
                  extract(month from OPE.fec_fin_operacion) = :in_mes and
                  --lo.nro_slp > 0 and
                  /*coalesce(lo.codigo_asiento_cos, 0) = 0 and
                  coalesce(lo.flag_provisionado, 0) = 0 and
                  coalesce(LCO.CODIGO_ASIENTO, '') = '' and*/
                  LO.flag_provisionado = 2
        INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN
            
            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               /*EXTRACT(YEAR FROM PRO_DOC.feccon) = :in_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :in_mes AND Comentado por AVILLAFANA 04.02.2026*/
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :var_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :var_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc;

            if (var_numdoc is not null) then
            begin
                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION_DIFERIDO and
                   ddt.tipdoc = :var_tipdoc and
                   ddt.serdoc = :var_serdoc and
                   ddt.numdoc = :var_numdoc
                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                BEGIN
                    if (in_proceso = 1) then
                    BEGIN
                        UPDATE log_conformidad_ordenes
                        SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                        WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;

                        select OUT_CODIGO_ASIENTO_COS
                        from SP_PROV_OS_EXTORNO_CIERRE(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :var_ANIO, :var_MES)
                        into :OUT_ASIENTO_PROV_OS;
                        
                        if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                        begin
                            select count(*)
                            from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                            into V_CONTADOR;
                        end
                    END
                    suspend;
                END
            END
        END
    END

    OUT_UND_OPER_ORDEN = NULL;
    OUT_ANIO_ORDEN = NULL;
    OUT_TIPO_ORDEN = NULL;
    OUT_NRO_ORDEN = NULL;
    OUT_FECHA_ZARPE = NULL;
    OUT_ID_ACTA = NULL;
    OUT_ASIENTO_PROV_OS = NULL;
    UNIDAD_OPERATIVA = NULL;
    ANIO = NULL;
    TIPO = NULL;
    NRO_ORDEN = NULL;
    OUT_CODLOC_SLP = NULL;
    OUT_ANIO_SLP = NULL;
    OUT_TIPO_SLP = NULL;
    OUT_NRO_SLP = NULL;
    OUT_ETAPA_SLP = NULL;
    OUT_NOM_SLP = NULL;
    OUT_DES_CLIENTE = NULL;
    OUT_ESTADO_ETAPA = NULL;
    OUT_PROVEEDOR = NULL;
    OUT_MONEDA_ORDEN = NULL;
    OUT_TOTAL_VALOR = NULL;
    OUT_TOTAL_IGV = NULL;
    OUT_TOTAL_PRECIO = NULL;
    OUT_ESTADO_ORDEN = NULL;
    OUT_DES_ORDEN = NULL;
    OUT_FECHA_FT = NULL;
    OUT_TIPDOC = NULL;
    OUT_SERDOC = NULL;
    OUT_NUMDOC = NULL;

    /*----------------------------PROV OS FACTURAS MES FUTURO----------------------------------*/
    /*Aqui provisionamos las OS facturadas que fueron en el mes posterior.*/

    if (:VAR_IND_PROVISION = 1) then
    BEGIN

        if (in_mes = 12) then
        begin
            var_anio = :in_anio + 1;
            var_mes = 1;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes + 1;
        end

        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEX.fec_carga, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.RUC_PROVEEDOR, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes LO
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  DETCOM.incoterm = 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :in_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null

            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEMB.fecha_embarque, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = lo.EMPRESA and OEX.CODLOCAL = lo.codlocal_slp and OEX.ANIO = lo.anio_slp and OEX.NRO_SLP = lo.nro_slp and OEX.TIPO_SLP = lo.tipo_slp and OEX.ETAPA = lodet.etapa_slp)
            join OPE_FORMA_PAGO_POSTEMBARQUE OEMB on (OEMB.ID_OPE_FORMA_PAGO_POSTEMBARQUE = OEX.ID_FORMA_PAGO_POSTEMBARQUE)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  DETCOM.incoterm <> 1 and
                  EXTRACT(YEAR FROM OEMB.fecha_embarque) = :in_anio and
                  EXTRACT(MONTH FROM OEMB.fecha_embarque) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null

        into :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA, :OUT_CODLOC_SLP, :OUT_ANIO_SLP,
             :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE, :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN,
             :OUT_total_valor, :OUT_total_igv, :OUT_total_precio, :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN

            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;
            VAR_VINCULADO = null;
            VAR_TIPO_FACT = null;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc, pro_doc.tipo_facturacion
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :var_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :var_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc, :VAR_TIPO_FACT;

            if (var_numdoc is not null) then
            BEGIN
                
                select coalesce(PP.VINCULADA, 0)
                from PUB_PERSONAS PP
                where (PP.CODEMP = :IN_EMPRESA) and
                      (PP.ID_PERSONA = :OUT_RUC_PROVEEDOR)
                into :VAR_VINCULADO;

                select iif(:OUT_moneda_ORDEN = 'S', iif(:VAR_VINCULADO = '0', TFD.TERCEROS_SOLES, TFD.VINCULADOS_SOLES), iif(:VAR_VINCULADO = '0', TFD.TERCEROS_DOLARES, TFD.VINCULADOS_DOLARES))
                from TIPO_FACTURACION_DET TFD
                where TFD.ID_TIPO_FACTURACION = :VAR_TIPO_FACT and
                      TFD.anio = :in_anio and
                      TFD.LLAVE = 'CTA_X_PAGAR'
                into :VAR_CTA_PROVISION;

                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION and
                   ddt.tipdoc = :var_tipdoc and
                   ddt.serdoc = :var_serdoc and
                   ddt.numdoc = :var_numdoc

                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                begin
                    if (IN_PROCESO = 1) then
                    begin

                        UPDATE log_conformidad_ordenes
                        SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                        WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
                    
                        select OUT_CODIGO_ASIENTO_COS
                        from SP_ASIENTO_OS_CONFORMIDAD(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                        into :OUT_ASIENTO_PROV_OS;
                    
                        if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                        begin
                          select count(*)
                          from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                          into V_CONTADOR;
                        end
                    end
                    suspend;
                end
            END
        END
    END

    if (:VAR_IND_PROVISION = 0) then
    BEGIN

        if (in_mes = 12) then
        begin
            var_anio = :in_anio + 1;
            var_mes = 1;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes + 1;
        end

        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_zarpe, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias = 0 and
                  extract(year from OPE.fec_zarpe) = :in_anio and
                  extract(month from OPE.fec_zarpe) = :in_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
            
            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_fin_operacion, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  lo.tipo_registro = 1 and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias <> 0 and
                  extract(year from OPE.fec_fin_operacion) = :in_anio and
                  extract(month from OPE.fec_fin_operacion) = :in_mes and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null
        INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN
            
            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;
            VAR_VINCULADO = null;
            VAR_TIPO_FACT = null;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc, pro_doc.tipo_facturacion
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :var_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :var_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc, :VAR_TIPO_FACT;

            if (var_numdoc is not null) then
            BEGIN
                
                select coalesce(PP.VINCULADA, 0)
                from PUB_PERSONAS PP
                where (PP.CODEMP = :IN_EMPRESA) and
                      (PP.ID_PERSONA = :OUT_RUC_PROVEEDOR)
                into :VAR_VINCULADO;

                select iif(:OUT_moneda_ORDEN = 'S', iif(:VAR_VINCULADO = '0', TFD.TERCEROS_SOLES, TFD.VINCULADOS_SOLES), iif(:VAR_VINCULADO = '0', TFD.TERCEROS_DOLARES, TFD.VINCULADOS_DOLARES))
                from TIPO_FACTURACION_DET TFD
                where TFD.ID_TIPO_FACTURACION = :VAR_TIPO_FACT and
                      TFD.anio = :in_anio and  
                      TFD.LLAVE = 'CTA_X_PAGAR'
                into :VAR_CTA_PROVISION;

                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION and
                   ddt.tipdoc = :var_tipdoc and
                   ddt.serdoc = :var_serdoc and
                   ddt.numdoc = :var_numdoc

                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                begin
                    if (IN_PROCESO = 1) then
                    begin

                        UPDATE log_conformidad_ordenes
                        SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                        WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
                    
                        select OUT_CODIGO_ASIENTO_COS
                        from SP_ASIENTO_OS_CONFORMIDAD(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                        into :OUT_ASIENTO_PROV_OS;
                    
                        if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                        begin
                          select count(*)
                          from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                          into V_CONTADOR;
                        end
                    end
                    suspend;
                end
            END
        END
    END

END^

SET TERM ; ^

COMMENT ON PROCEDURE SP_PROV_OS_GASTOS_VT IS
'/* Procedimiento para provisionar/diferir las OS de COMEX.
  *
  * Version     Fecha       Responsable     Descipcion
  * 1.0         22.03.23    BAVALOS         Recibimos 3 tipos de procesos: para provisionar, diferir OS facturadas y
                                            provisinar OS facturadas diferidas en el cierre de COMEX.

  * 1.1         13.10.25    BAVALOS         Se cambia consulta principal para obtener las ordenes asociadas a contratos
                                            sin distinguir si son creadas por empresas industriales o logisticas.

  * 1.2         26.01.26    BAVALOS         Solo provisionara las OS ya sean con estado ATENDIDA o FACTURAS, segun proceso.                             sin distinguir si son creadas por empresas industriales o logisticas.

/*';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON PUB_EMPRESAS TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON LOG_ORDENES TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT,UPDATE ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON PUB_TIPO_SLP TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_SLP_DET_COMERCIAL TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_EXPORTACIONES TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_FORMA_PAGO_POSTEMBARQUE TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_GEN_CARGAS_NATURALEZA_IND_2 TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_MERCADERIA TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON OPE_TIPO_MERCADERIA TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON DIA_DIARIO_DET TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_PROV_OS_EXTORNO_CIERRE TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_PROV_OS_GASTOS_VT;
GRANT SELECT ON TIPO_FACTURACION_DET TO PROCEDURE SP_PROV_OS_GASTOS_VT;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_PROV_OS_GASTOS_VT TO PROCEDURE SP_OS_CIERRE_COMERCIAL;
GRANT EXECUTE ON PROCEDURE SP_PROV_OS_GASTOS_VT TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_EXTORNO_OS_CIERRE (
    IN_EMPRESA varchar(2),
    IN_UNIDAD_OPERATIVA varchar(5),
    IN_ANIO_ORDEN integer,
    IN_TIPO varchar(1),
    IN_NRO_ORDEN numeric(18,0),
    IN_ID_ACTA bigint,
    IN_ANIO integer,
    IN_MES integer)
returns (
    OUT_CODIGO_ASIENTO_COS varchar(16),
    OUT_FEC_REG timestamp,
    OUT_USUARIO_REG varchar(20),
    OUT_TOTAL_IGV numeric(15,2),
    OUT_RUC_PROVEEDOR varchar(15),
    OUT_RAZON_PROVEEDOR varchar(150),
    OUT_USUA_MOD varchar(20),
    OUT_GLOSA varchar(350),
    OUT_TOTAL_VALOR numeric(15,4),
    OUT_FECHA_ATENDIDO timestamp,
    OUT_MES numeric(2,0),
    OUT_ESTADO varchar(2),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_MONEDA varchar(1),
    OUT_NDOC_COTIZACION varchar(80),
    OUT_DESCRIPCION varchar(350),
    OUT_ID_CENCOS varchar(30),
    OUT_CODLOC varchar(5),
    OUT_NRO_LOTE varchar(20),
    LOCAL_PROVISION char(2),
    OUT_FECHA_ORDEN date,
    OUT_NRO_REQUERIMIENTO numeric(18,0),
    OUT_FECHA_ZARPE date,
    OUT_ID_ACTA bigint)
as
declare variable VAR_CANTIDAD numeric(16,4) = 0.0;
declare variable VAR_ITEM integer;
declare variable VAR_UNIMED varchar(10);
declare variable VAR_MONEDA varchar(10);
declare variable VAR_VALOR_VENTA numeric(15,2);
declare variable VAR_TOTAL_VALOR numeric(16,2);
declare variable VAR_TC_VEN numeric(8,4);
declare variable VAR_J integer = 0;
declare variable VAR_COSTO_D numeric(18,3);
declare variable VAR_CARGO numeric(18,2);
declare variable VAR_ABONO numeric(18,2);
declare variable VAR_LIBCON varchar(2);
declare variable VAR_LS_NROCOM varchar(16);
declare variable VAR_LI_NROCOM integer;
declare variable VAR_LS_CODIGO varchar(21);
declare variable VAR_CTA varchar(20);
declare variable VAR_CTA_NOMBRE varchar(200);
declare variable VAR_CTA_S_PROVISION varchar(20);
declare variable VAR_CTA_D_PROVISION varchar(20);
declare variable VAR_NOMBRE_CTA_D varchar(200);
declare variable VAR_NOMBRE_CTA_S varchar(200);
declare variable VAR_NOMBRE_CTA varchar(200);
declare variable VAR_CTA_MONEDA varchar(20);
declare variable VAR_LOTE varchar(20);
declare variable VAR_SUMA_CARGO numeric(15,2) = 0;
declare variable VAR_SUMA_ABONO numeric(15,3) = 0;
declare variable VAR_CONT integer = 0;
declare variable VAR_ESPECIE varchar(150);
declare variable VAR_AUXILIAR varchar(16);
declare variable VAR_NRO_LOTE varchar(40);
declare variable VAR_COD_ALMACEN varchar(3);
declare variable VAR_CEN_COSTO_P varchar(1);
declare variable VAR_CTACTE_P varchar(1);
declare variable VAR_FLAG_LOTE_P integer;
declare variable VAR_FLAG_CENTRO_COSTO_P integer;
declare variable VAR_FLAG_CTACTE_P integer;
declare variable VAR_CENTRO_COSTO varchar(1);
declare variable VAR_CTACTE varchar(1);
declare variable VAR_FLAG_CENTRO_COSTO integer;
declare variable VAR_FLAG_CTACTE integer;
declare variable VAR_FLAG_LOTE integer;
declare variable VAR_CODIGO_ESPECIE varchar(15);
declare variable VAR_ALMACEN varchar(3);
declare variable VAR_NOM_CENCOS varchar(80);
declare variable VAR_ORDEN_COMPRA varchar(60);
declare variable VAR_CODLOC_SLP varchar(2);
declare variable VAR_ANIO_SLP integer;
declare variable VAR_TIPO_SLP varchar(1);
declare variable VAR_NRO_SLP integer;
declare variable VAR_TIPO_ORDEN varchar(2);
declare variable VAR_FAMILIA varchar(2);
declare variable VAR_VINCULADA integer;
declare variable UNID_OPERATIVA varchar(15);
declare variable VAR_COD_CONCEPTO varchar(3);
declare variable V_LOCAL_ASIENTO varchar(2);
declare variable V_LIBRO_ASIENTO varchar(2);
declare variable V_ANIO_OR integer;
declare variable V_MES_OR integer;
declare variable VAR_ID_CENCOS_TMP varchar(30);
declare variable VAR_NOM_CENCOS_TMP varchar(80);
declare variable VAR_COD_ARTICULO varchar(10);
declare variable VAR_ARTICULO_ORDEN varchar(9);
declare variable VAR_ALMACEN_ORDEN varchar(3);
declare variable V_TIPO_REGISTRO integer = 0;
declare variable VAR_CODIGO_ORDEN varchar(50);
declare variable VAR_MES_ORDEN integer;
declare variable V_EXISTE_PROVISION integer = 0;
declare variable V_CONTADOR integer;
declare variable VAR_ITEM_ASIENTO varchar(5);
declare variable VAR_ID_CENCOS_CAB varchar(30);
declare variable VAR_NOM_CENCOS_CAB varchar(80);
declare variable VAR_ANIO_ASIENTO integer;
declare variable VAR_MES_ASIENTO numeric(2,0);
declare variable VAR_RESPUESTA integer;
declare variable VAR_TIPO_CONFORMIDAD varchar(1);
declare variable VAR_USUARIO_ATENCION varchar(30);
declare variable VAR_CODIGO_ASIENTO varchar(16);
declare variable VAR_NRO_REQUERIMIENTO numeric(18,0);
declare variable VAR_AREA_REQUERIMIENTO varchar(20);
declare variable VAR_ANIO_REQUERIMIENTO integer;
declare variable VAR_CANTIDAD_ORDENES integer;
declare variable VAR_VALOR_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_ORDEN numeric(16,4);
declare variable VAR_SUMA_CANT_CONFORMIDAD numeric(16,4);
declare variable VAR_CANTIDAD_X_RECIBIR numeric(16,4);
declare variable VAR_CANTIDAD_RECIBIDA numeric(16,4);
declare variable VAR_TIPO_REQ varchar(1);
declare variable VAR_LLAVE_S varchar(50);
declare variable VAR_LLAVE_D varchar(50);
declare variable VAR_CUENTA_IGV_MP varchar(15);
declare variable VAR_IGV_FLAG char(1);
declare variable VAR_GIRO_NEGOCIO char(1);
declare variable VAR_FACTOR_IGV numeric(15,2);
declare variable VAR_FLAG_IGV integer;
declare variable VAR_TOTAL_IGV_FLAG numeric(15,7);
declare variable VAR_MONTO_IGV_FLAG numeric(15,7);
declare variable VAR_ANIO integer;
declare variable VAR_MES integer;
declare variable VAR_FECHA_FT date;
declare variable VAR_FECHA_CONTABLE date;
declare variable VAR_ETAPA_SLP varchar(1);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(15);
declare variable VAR_NUMDOC varchar(20);
declare variable VAR_DES_MES varchar(25);
declare variable VAR_IND_PROVISION integer;
declare variable VAR_IND_ASIENTO integer;
declare variable VAR_COD_PLANTA integer;
declare variable VAR_DES_PLANTA varchar(40);
declare variable VAR_DES_CONCEPTO varchar(350);
declare variable VAR_IND_USO_CTA varchar(2);
begin

    if (IN_TIPO = 'C') then
        VAR_TIPO_ORDEN = 'OC';
    if (IN_TIPO = 'S') then
        VAR_TIPO_ORDEN = 'OS';

    OUT_CODLOC = '01';

    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :IN_EMPRESA and
        SISTEMA = '012' and
        LLAVE = 'LIB_PROV_OS'
    into :VAR_LIBCON;

    /*Obtenemos el indicador tipo de provision para diferenciarlo al tomar la cuenta contable. BAVALOS 04.02.26*/
    SELECT COALESCE(PUB_EMPRESAS.ind_provision, '1'), PUB_EMPRESAS.IGV_FLAG
    FROM PUB_EMPRESAS
    WHERE PUB_EMPRESAS.codemp = :IN_EMPRESA
    INTO :VAR_IND_USO_CTA, :VAR_IGV_FLAG;

    if (VAR_IGV_FLAG = '1') then
    begin
        select CODIGO
        from PUB_TABLA_PARAMETROS
        where EMPRESA = :IN_EMPRESA and
              LLAVE = 'CUENTA_IGV_MP' and
              ITEM = 1
        into :VAR_CUENTA_IGV_MP;
    end

    VAR_ANIO_ASIENTO = :IN_ANIO;
    VAR_MES_ASIENTO = :IN_MES;
    
    select cast(max(PUB_TIPCAM.FECHA) as date)
    from PUB_TIPCAM
    where extract(year from PUB_TIPCAM.FECHA) = :IN_ANIO and
        extract(month from PUB_TIPCAM.FECHA) = :IN_MES
    into :VAR_FECHA_CONTABLE;

    FOR  select LOGO.FEC_REG, LOGO.USUA_REG, LOGO.RUC_PROVEEDOR, LOGO.RAZON_PROVEEDOR, LOGO.MONEDA, LOGO.FECHA, LOGO.ESTADO,
           coalesce(LCO.concepto, LOGO.descripcion), LOGO.ID_CENCOS, LOGO.TIPO_CONFORMIDAD, LCO.USUARIO_ATENCION, LCO.FECHA_ATENCION,
           LCO.CODIGO_ASIENTO, LOGO.NRO_REQUERIMIENTO, LOGO.AREA_REQUERIMIENTO, LOGO.ANIO_REQUERIMIENTO,  iif(LOGO.TIPO = 'C','P',LOGO.TIPO),
           LOGO.flag_igv
    from LOG_ORDENES LOGO
    left join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = LOGO.EMPRESA and LCO.UNID_OPERATIVA = LOGO.UNID_OPERATIVA and LCO.ANIO = LOGO.ANIO and LCO.TIPO = LOGO.TIPO and LCO.NRO_ORDEN = LOGO.NRO_ORDEN
    where LOGO.EMPRESA = :IN_EMPRESA and
          LOGO.UNID_OPERATIVA = :IN_UNIDAD_OPERATIVA and
          LOGO.ANIO = :IN_ANIO_ORDEN and
          LOGO.TIPO = :IN_TIPO and
          LOGO.NRO_ORDEN = :IN_NRO_ORDEN and
          LCO.ID_LOG_CONFORMIDAD_ORDENES = :IN_ID_ACTA
    into :OUT_FEC_REG, :OUT_USUARIO_REG, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, :OUT_MONEDA, OUT_FECHA_ORDEN,
         :OUT_ESTADO, :OUT_DESCRIPCION, :VAR_ID_CENCOS_CAB, :VAR_TIPO_CONFORMIDAD, :VAR_USUARIO_ATENCION,
         :OUT_FECHA_ATENDIDO, :OUT_CODIGO_ASIENTO_COS, :VAR_NRO_REQUERIMIENTO, :VAR_AREA_REQUERIMIENTO, :VAR_ANIO_REQUERIMIENTO, :VAR_TIPO_REQ  ,
         :VAR_FLAG_IGV
    DO
    BEGIN
        
        VAR_FECHA_FT = null;
        VAR_TIPDOC = null;
        VAR_SERDOC = null;
        VAR_NUMDOC = null;
        V_EXISTE_PROVISION = 0;

        select first 1 PRO_DOC.FECDOC, PRO_DOC.TIPDOC, PRO_DOC.SERDOC, PRO_DOC.NUMDOC
        from PRO_DOC_DET
        left join PRO_DOC on PRO_DOC.CODIGO = PRO_DOC_DET.CODIGODOC
        where substring(PRO_DOC_DET.CODIGODOC from 1 for 2) = :IN_EMPRESA and
              EXTRACT(YEAR FROM PRO_DOC.FECDOC) = :in_anio and
              EXTRACT(MONTH FROM PRO_DOC.FECDOC) = :in_mes AND
              PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
              PRO_DOC_DET.OC_ANIO = :IN_ANIO_ORDEN and
              PRO_DOC_DET.OC_UNID_OPERATIVA = :IN_UNIDAD_OPERATIVA and
              PRO_DOC_DET.OC_TIPO = :IN_TIPO and
              PRO_DOC_DET.OC_NRO_ORDEN = :IN_NRO_ORDEN
        order by PRO_DOC.FECDOC desc
        into :VAR_FECHA_FT, :VAR_TIPDOC, :VAR_SERDOC, :VAR_NUMDOC;

        if (VAR_NUMDOC is not null) then
        begin

            if (OUT_CODIGO_ASIENTO_COS is null) then
            begin
                select NROCOM
                from PRO_CONTROL_NUMERACION_REGS
                where (CODEMP = :IN_EMPRESA) and
                      (CODLOC = :OUT_CODLOC) and
                      (CODGRU = '000' || LIBCON) and
                      (LIBCON = :VAR_LIBCON) and
                      (ANIO = :VAR_ANIO_ASIENTO) and
                      (MES = :VAR_MES_ASIENTO) and
                      (TIPONUMERACION = 'M')
                into :VAR_LS_NROCOM;
    
                if (VAR_LS_NROCOM is null) then VAR_LS_NROCOM = '0000';
            
                VAR_LI_NROCOM = cast(coalesce(VAR_LS_NROCOM, '0') as numeric(6,0)) + 1;
                VAR_LS_NROCOM = lpad(cast(VAR_LI_NROCOM as varchar(4)), 4, '0');
                VAR_LS_CODIGO = IN_EMPRESA || OUT_CODLOC || VAR_LIBCON || cast(VAR_ANIO_ASIENTO as char(4)) || lpad(VAR_MES_ASIENTO, 2, '0') || VAR_LS_NROCOM;
                OUT_CODIGO_ASIENTO_COS = VAR_LS_CODIGO;
            end
            else
            begin
                -- regeneramos el asiento
                delete from DIA_DIARIO
                where CODIGO = :OUT_CODIGO_ASIENTO_COS;
                VAR_LS_NROCOM = substring(:OUT_CODIGO_ASIENTO_COS from 13 for 4);
                VAR_LS_CODIGO = :OUT_CODIGO_ASIENTO_COS;
                
                VAR_MES_ASIENTO = cast(substring(OUT_CODIGO_ASIENTO_COS from 11 for 2) as numeric(2,0));
            end

            VAR_AUXILIAR = OUT_CODIGO_ASIENTO_COS;

            if (OUT_FECHA_ATENDIDO is null) then OUT_FECHA_ATENDIDO = current_time;
            if (VAR_FECHA_FT is null) then VAR_FECHA_FT = OUT_FECHA_ATENDIDO;

            insert into DIA_DIARIO (CODIGO, CODEMP, CODLOC, LIBCON, ANIO, MES, NROCOM, FECCON, FECDOC, CONCEPTO, FECMOD, USUARIO,
                                      NOMBREPC, ESTADO, USUARIO_MOD, FECREG, TIP_INGRESO, TIPCAM, TABLA)
            values (:VAR_LS_CODIGO, :IN_EMPRESA, :OUT_CODLOC, :VAR_LIBCON, :VAR_ANIO_ASIENTO , lpad(:VAR_MES_ASIENTO, 2, '0'),
                      :VAR_LS_NROCOM, :VAR_FECHA_CONTABLE, :VAR_FECHA_FT,
                      'DIF GASTOS DE VENTA FACTURADO ' || upper(:IN_UNIDAD_OPERATIVA) || '-' || :IN_NRO_ORDEN || '-' || :IN_ANIO_ORDEN,
                      current_timestamp, 'SYSDBA', null, 'C', null, current_timestamp, 'S', :VAR_TC_VEN, 'OPE');


            select max(PUB_FACTORES_VALORES.VALOR / 100)
            from PUB_FACTORES_VALORES
            where PUB_FACTORES_VALORES.CODFACTOR = '010101' and
                  PUB_FACTORES_VALORES.ESTADO = 'A' and
                  :OUT_FECHA_ORDEN between PUB_FACTORES_VALORES.FECHA_INICIAL and FECHA_FINAL
            into :VAR_FACTOR_IGV;
    
            select VINCULADA
            from PUB_PERSONAS
            where (CODEMP = :IN_EMPRESA) and
                  (ID_PERSONA = :OUT_RUC_PROVEEDOR)
            into :VAR_VINCULADA;
    
            if (VAR_VINCULADA = 1) then
            begin
              if (OUT_MONEDA = 'S') then
              begin
                VAR_LLAVE_S = 'CTA_PROVISION_DIFERIDO_S';
              end
              else
              begin
                VAR_LLAVE_D = 'CTA_PROVISION_DIFERIDO_D';
              end
            end
            else
            begin
              if (OUT_MONEDA = 'S') then
              begin
                VAR_LLAVE_S = 'CTA_PROVISION_DIFERIDO_S';
              end
              else
              begin
                VAR_LLAVE_D = 'CTA_PROVISION_DIFERIDO_D';
              end
            end
    
            select VALOR
            from PARAMETROS_SISTEMAS
            where EMPRESA = :IN_EMPRESA and
                  SISTEMA = '012' and
                  LLAVE = :VAR_LLAVE_S
            into :VAR_CTA_S_PROVISION;
    
            --obtenemos la cuenta de provision en dolares
            select VALOR
            from PARAMETROS_SISTEMAS
            where EMPRESA = :IN_EMPRESA and
                  SISTEMA = '012' and
                  LLAVE = :VAR_LLAVE_D
            into :VAR_CTA_D_PROVISION;

            /* Buscamos el tipo de cambio de la operacion*/
            select PUB_TIPCAM.VENTA
            from PUB_TIPCAM
            where (PUB_TIPCAM.MONEDA = 'D') and
                  PUB_TIPCAM.FECHA = :VAR_FECHA_FT
            into :VAR_TC_VEN;
    
            -- sino encuentra tipo de cambio en la fecha de operacion se pone el maximo
            if (VAR_TC_VEN is null) then
            begin
              select first 1 PUB_TIPCAM.VENTA
              from PUB_TIPCAM
              where (PUB_TIPCAM.MONEDA = 'D')
              order by FECHA desc
              into :VAR_TC_VEN;
            end
    
            --Se obtiene la cuenta en base a la moneda de la OC.
            if (OUT_MONEDA = 'S') then
            begin
              --obtenemos el nombre de la cuenta de provision en soles y sus flags.
              select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
              from PUB_PLANCTAS P
              where P.EMPRESA = :IN_EMPRESA and
                    P.ANIO = :VAR_ANIO_ASIENTO and
                    P.CTA_COD = :VAR_CTA_S_PROVISION
              into :VAR_NOMBRE_CTA_S, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
            end

            if (OUT_MONEDA = 'D') then
            begin
              --obtenemos el nombre de la cuenta de provision en dolares y sus flag.
              select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
              from PUB_PLANCTAS P
              where P.EMPRESA = :IN_EMPRESA and
                    P.ANIO = :VAR_ANIO_ASIENTO and
                    P.CTA_COD = :VAR_CTA_D_PROVISION
              into :VAR_NOMBRE_CTA_D, :VAR_CEN_COSTO_P, :VAR_CTACTE_P, :VAR_FLAG_LOTE_P;
            end
    
            --se asignan los valores a los flags.
            VAR_FLAG_CENTRO_COSTO_P = DECODE(VAR_CEN_COSTO_P, 'S', 1, 0);
            VAR_FLAG_CTACTE_P = DECODE(VAR_CTACTE_P, 'S', 1, 0);
            VAR_FLAG_LOTE_P = DECODE(VAR_FLAG_LOTE_P, 1, 1, 0);
    
            /* recuperamos la pk de orden de compra */
            VAR_ORDEN_COMPRA = IN_EMPRESA || IN_UNIDAD_OPERATIVA || IN_ANIO_ORDEN || IN_TIPO || lpad(IN_NRO_ORDEN, 4, '0');
    
            OUT_GLOSA = substring(OUT_DESCRIPCION from 1 for 120);
    
            OUT_MES = extract(month from OUT_FECHA_ORDEN);
    
            VAR_CONT = VAR_CONT + 1;
            VAR_TOTAL_IGV_FLAG = 0;
            VAR_MONTO_IGV_FLAG = 0;
            VAR_TOTAL_VALOR = 0;
            OUT_TOTAL_VALOR = 0;
            VAR_ABONO = 0;
            VAR_CARGO = 0;
            VAR_COSTO_D = 0;
            VAR_SUMA_ABONO = 0;
            VAR_SUMA_CARGO = 0;
    
            FOR select LOD.ITEM, LOD.UNIMED, LOD.MONEDA, LOD.VALOR_VENTA, iif(:VAR_TIPO_CONFORMIDAD = 'C',
                       (LCOD.VALOR * LOD.VALOR_VENTA),
                       ((LCOD.VALOR / 100) * LOD.TOTAL_VALOR)) as PORCENTAJE,
                       --coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), COSFA.CTA_COD) VINCULADA,
                       /*Se considera la cuenta de PUB_CENCOS. BAVALOS 04.02.26*/
                        iif(:VAR_IND_USO_CTA = '0', coalesce(coalesce(iif(:VAR_VINCULADA = '1', PC.CTA_CARGO_REL, PC.CTA_CARGO), PCE.codcta_costo), COSFA.CTA_COD), COSFA.CTA_COD) VINCULADA,
                       CA.DESCRIPCION, CA.COD_FAMILIA, CA.COD_CONCEPTO, coalesce(AA.ARTICULO, LOD.COD_PROD_SERV) COD_ARTICULO,
                       LOD.COD_ALMACEN, LOD.NRO_LOTE, LOD.ID_CENCOS, PCE.NOM_CENCOS, LOD.CODLOCAL_SLP, LOD.ANIO_SLP,
                       LOD.TIPO_SLP, LOD.NRO_SLP, LOD.COD_ARTICULO, LCOD.VALOR, LOD.CANTIDAD, COSFA.GIRO_NEGOCIO,
                       LOD.ETAPA_SLP, LOD.DES_PROD_SERV, LOD.COD_PLANTA ---AVILLAFANA 30.01.2026
                from LOG_CONFORMIDAD_ORDENES_DET LCOD
                join LOG_CONFORMIDAD_ORDENES LCO on LCO.ID_LOG_CONFORMIDAD_ORDENES = LCOD.ID_LOG_CONFORMIDAD_ORDENES
                join LOG_ORDENES_DET LOD on LOD.EMPRESA = LCO.EMPRESA and LCO.UNID_OPERATIVA = LOD.UNID_OPERATIVA and LCO.ANIO = LOD.ANIO and LCO.TIPO = LOD.TIPO and LCO.NRO_ORDEN = LOD.NRO_ORDEN and LCOD.ITEM = LOD.ITEM
                left join LOG_CATALOGO CA on (CA.EMPRESA = LOD.EMPRESA and CA.COD_ARTICULO = LOD.COD_PROD_SERV and CA.TIPO_CATALOGO = LOD.TIPO_CATALOGO) -- ACV 14/05/2018
                left join LOG_TIPO_CATALOGO LOT on LOT.EMPRESA = CA.EMPRESA and LOT.TIPO_CATALOGO = CA.TIPO_CATALOGO
                left join PUB_CENCOS PCE on PCE.CODGRU_EMP = LOD.EMPRESA and PCE.ANIO = LOD.ANIO and PCE.ID_CENCOS = LOD.ID_CENCOS
                left join PUB_CENCOS_CTAS_COSTOS PC on (PC.CODEMP = LOD.EMPRESA and PC.ANIO = :VAR_ANIO_ASIENTO /*LOD.ANIO -- BA 04/05/22*/ and PC.ID_CENCOS = LOD.ID_CENCOS and PC.COD_FAMILIA = CA.COD_FAMILIA and PC.TIPO_COSTO = LOD.TIPO_COSTO)
                left join COS_FAMILIA_DET_CONCEPTOS COSFA on (COSFA.CODEMP = CA.EMPRESA and COSFA.COD_FAMILIA = CA.COD_FAMILIA and COSFA.COD_CONCEPTO = CA.COD_CONCEPTO) -- JC 05.06.18
                left join ALM_ARTICULO AA on (AA.EMPRESA = LOD.EMPRESA and AA.COD_CATALOGO_ARTICULO = LOD.COD_PROD_SERV and AA.COD_TIPO_CATALOGO = LOD.TIPO_CATALOGO)
                where LOD.EMPRESA = :IN_EMPRESA and
                      LOD.UNID_OPERATIVA = :IN_UNIDAD_OPERATIVA and
                      LOD.ANIO = :IN_ANIO_ORDEN and
                      LOD.TIPO = :IN_TIPO and
                      LOD.NRO_ORDEN = :IN_NRO_ORDEN and
                      LCOD.ID_LOG_CONFORMIDAD_ORDENES = :IN_ID_ACTA
                into :VAR_ITEM, :VAR_UNIMED, :VAR_MONEDA, :VAR_VALOR_VENTA, :VAR_TOTAL_VALOR, :VAR_CTA, :VAR_ESPECIE,
                     :VAR_FAMILIA, :VAR_COD_CONCEPTO, VAR_COD_ARTICULO, VAR_ALMACEN_ORDEN, OUT_NRO_LOTE, OUT_ID_CENCOS,
                     VAR_NOM_CENCOS, :VAR_CODLOC_SLP, :VAR_ANIO_SLP, :VAR_TIPO_SLP, VAR_NRO_SLP, :VAR_ARTICULO_ORDEN,
                     :VAR_VALOR_CONFORMIDAD, :VAR_CANTIDAD_ORDEN, :VAR_GIRO_NEGOCIO, :VAR_ETAPA_SLP,
                     :VAR_DES_CONCEPTO, :VAR_COD_PLANTA ---AVILLAFANA 30.01.2026
            DO
            BEGIN
    
                --Obtener descripcion de planta. AVILLAFANA 30.01.2026
                select DECRIPCION
                from OPE_PLANTAS
                where COD_PLANTA = :VAR_COD_PLANTA
                into :VAR_DES_PLANTA;

                if (VAR_IGV_FLAG = '1' and VAR_FLAG_IGV = 1) then
                begin
                    if (VAR_GIRO_NEGOCIO = '1') then
                    begin
                        VAR_MONTO_IGV_FLAG = VAR_TOTAL_VALOR * VAR_FACTOR_IGV;
                        VAR_TOTAL_IGV_FLAG = VAR_TOTAL_IGV_FLAG + VAR_MONTO_IGV_FLAG;
                    end
                end

                VAR_SUMA_CANT_CONFORMIDAD = 0;
                VAR_ESPECIE = substring(VAR_ESPECIE from 1 for 120);
    
                if (VAR_TOTAL_VALOR is null) then VAR_TOTAL_VALOR = 0;
    
                OUT_TOTAL_VALOR = VAR_TOTAL_VALOR;
    
                if (VAR_MONEDA = 'D') then VAR_VALOR_VENTA = VAR_VALOR_VENTA * VAR_TC_VEN;

                VAR_NRO_LOTE = OUT_NRO_LOTE;
    
                if (IN_TIPO = 'S' and V_TIPO_REGISTRO = 1) then --Ahora las ordenes automaticas tienen requerimientos.
                begin
                    VAR_CODIGO_ESPECIE = VAR_ARTICULO_ORDEN;
                    VAR_ALMACEN = VAR_ALMACEN_ORDEN;
                end
                else
                begin
                    VAR_CODIGO_ESPECIE = VAR_COD_ARTICULO;
                    VAR_ALMACEN = VAR_COD_ALMACEN;
                end
    
                VAR_ID_CENCOS_TMP = OUT_ID_CENCOS;
                VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS;
    
                --obtenemos la cuenta
                select P.CTA_NOM, P.CTA_ACEPCOSTO, P.CTA_ACEPCTACTE, P.FLAG_CTA_LOTE
                from PUB_PLANCTAS P
                where P.EMPRESA = :IN_EMPRESA and
                    P.ANIO = :VAR_ANIO_ASIENTO and
                    P.CTA_COD = :VAR_CTA
                into :VAR_CTA_NOMBRE, :VAR_CENTRO_COSTO, :VAR_CTACTE, :VAR_FLAG_LOTE;
    
                VAR_FLAG_CENTRO_COSTO = DECODE(VAR_CENTRO_COSTO, 'S', 1, 0);
                VAR_FLAG_CTACTE = DECODE(VAR_CTACTE, 'S', 1, 0);
                VAR_FLAG_LOTE = DECODE(VAR_FLAG_LOTE, 1, 1, 0);
    
                if (VAR_FLAG_LOTE = 0) then
                begin
                    VAR_NRO_LOTE = null;
                    VAR_CODIGO_ESPECIE = null;
                    VAR_ALMACEN = null;
                end
    
                if (VAR_NRO_SLP is not null) then VAR_LOTE = :VAR_NRO_SLP;
    
                if (VAR_FLAG_CENTRO_COSTO = 0) then
                begin
                    VAR_ID_CENCOS_TMP = null;
                    VAR_NOM_CENCOS_TMP = null;
                end
    
                -- generacion del detalle del asiento para el haber
                if (VAR_MONEDA = 'S') then
                begin
                    VAR_ABONO = VAR_TOTAL_VALOR;
                    VAR_SUMA_ABONO = VAR_SUMA_ABONO + VAR_TOTAL_VALOR;
                    VAR_CARGO = 0.0;
                    VAR_COSTO_D = VAR_ABONO / VAR_TC_VEN;
                end

                if (VAR_MONEDA = 'D') then
                begin
                    VAR_ABONO = VAR_TOTAL_VALOR * VAR_TC_VEN;
                    VAR_SUMA_ABONO = VAR_SUMA_ABONO + VAR_ABONO;
                    VAR_CARGO = 0;
                    VAR_COSTO_D = VAR_TOTAL_VALOR;
                end
    
                VAR_SUMA_CARGO = VAR_SUMA_CARGO + OUT_TOTAL_VALOR + VAR_TOTAL_IGV_FLAG;
                VAR_J = VAR_J + 1;
                VAR_ITEM_ASIENTO = lpad(:VAR_J, 5, '0');
    
                insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                          ABONO, USUARIO, NOMBREPC, NOMBRECTA, ID_PERSONA, NOMBREPER, TIPIMP, TABLA,
                                          FLAG_NATURALEZA, FLAG_CTACTE, FLAG_CENCOS, CANTIDAD, PRECIO_UNIDAD, NRO_SLP, TIPDOC,
                                          SERDOC, NUMDOC, ID_CENCOS, NRO_LOTE, ARTICULO, COD_ALMACEN, UNIDAD_MEDIDA, NOMBRECTO,
                                          CODLOC_SLP, ANIO_SLP, TIPO_SLP, COD_FAMILIA, COD_CONCEPTO, ETAPA_SLP, FECHA_ZARPE)
                values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_LS_CODIGO, :VAR_ITEM_ASIENTO, :VAR_CTA, :VAR_FECHA_FT, /* :OUT_FECHA_ORDEN,*/
                      :VAR_MONEDA, :VAR_TC_VEN, :VAR_ESPECIE, :VAR_COSTO_D, :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG,
                      :OUT_USUARIO_REG, :VAR_CTA_NOMBRE, :OUT_RUC_PROVEEDOR, :OUT_RAZON_PROVEEDOR, 'H', 'LOG', 2,
                      :VAR_FLAG_CTACTE, :VAR_FLAG_CENTRO_COSTO, :VAR_CANTIDAD, :VAR_VALOR_VENTA, :VAR_LOTE, /* :VAR_TIPO_ORDEN,
                          :UNIDAD_OPERATIVA, :NRO_ORDEN, */ :VAR_TIPDOC, :VAR_SERDOC, :VAR_NUMDOC, :VAR_ID_CENCOS_TMP,
                      :VAR_NRO_LOTE, :VAR_CODIGO_ESPECIE, :VAR_ALMACEN, :VAR_UNIMED, :VAR_NOM_CENCOS_TMP, :VAR_CODLOC_SLP,
                      :VAR_ANIO_SLP, :VAR_TIPO_SLP, :VAR_FAMILIA, :VAR_COD_CONCEPTO, :VAR_ETAPA_SLP, :OUT_FECHA_ZARPE);
    
                /*Insertar informacion en dia_diario_det_ope.AVILLAFANA 30.01.2026*/
                insert into DIA_DIARIO_DET_OPE (CODIGO, MEDIDA, CANTIDAD, PREUNI, COD_PLANTA, NOMBREPLA, COD_FAMILIA,
                                                COD_CONCEPTO, NOMBRE_CONCEPTO, IND_RECLAMO, FEC_REC, FECREG, USUAREG)
                values (:VAR_LS_CODIGO || :VAR_ITEM_ASIENTO, :VAR_UNIMED, :VAR_CANTIDAD_ORDEN, :VAR_TOTAL_VALOR,
                        :VAR_COD_PLANTA, :VAR_DES_PLANTA, :VAR_FAMILIA, :VAR_COD_CONCEPTO, :VAR_DES_CONCEPTO, 0, current_date,
                        current_timestamp, :OUT_USUARIO_REG);
                /*Fin insertar informacion 30.01.2026*/

                V_EXISTE_PROVISION = 1;--indica que existe registros provisionados.

            end
    
            if (VAR_IGV_FLAG = '1' and
                VAR_FLAG_IGV = 1 and
                VAR_TOTAL_IGV_FLAG > 0) then
            begin
                VAR_ABONO = 0;
                --Se suma al cargo del total del monto del igv
                if (VAR_MONEDA = 'S') then
                begin
                    VAR_ABONO = VAR_TOTAL_IGV_FLAG;
                    VAR_SUMA_ABONO = VAR_SUMA_ABONO + VAR_TOTAL_IGV_FLAG;
                    VAR_CARGO = 0.0;
                    VAR_COSTO_D = VAR_ABONO / VAR_TC_VEN;
                end

                if (VAR_MONEDA = 'D') then
                begin
                    VAR_ABONO = VAR_TOTAL_IGV_FLAG * VAR_TC_VEN;
                    VAR_SUMA_ABONO = VAR_SUMA_ABONO + VAR_ABONO;
                    VAR_CARGO = 0;
                    VAR_COSTO_D = VAR_TOTAL_IGV_FLAG;
                end
            
                --Se agrega el centro de costo de la cabecera
                if (VAR_FLAG_CENTRO_COSTO_P = 0) then
                begin
                    VAR_ID_CENCOS_TMP = null;
                    VAR_NOM_CENCOS_TMP = null;
                end
                else
                begin
                    VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
                    VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
                end
            
                VAR_J = VAR_J + 1;
            
                insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                          ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                          FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
                values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CUENTA_IGV_MP,
                        :OUT_FECHA_ORDEN, :VAR_MONEDA, :VAR_TC_VEN, :OUT_GLOSA, :VAR_COSTO_D, :VAR_CARGO,
                        :VAR_ABONO, :OUT_USUARIO_REG, :OUT_USUARIO_REG, :VAR_NOMBRE_CTA, :OUT_RAZON_PROVEEDOR, 'H', 'LOG',
                        :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P, :OUT_RUC_PROVEEDOR, :VAR_TIPDOC, :VAR_SERDOC, :VAR_NUMDOC,
                        :VAR_ID_CENCOS_TMP, :VAR_NOM_CENCOS_TMP);
            end
        end

        --Si existe algun registro provisionado de la orden de compra/servicio, inserta la cuenta de abono(42).
        if (V_EXISTE_PROVISION = 1) then
        begin
            VAR_J = VAR_J + 1;
        
            if (VAR_MONEDA = 'S') then
            begin
                VAR_CTA_MONEDA = VAR_CTA_S_PROVISION;
                VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_S;
                VAR_ABONO = 0.0;
                VAR_CARGO = VAR_SUMA_CARGO;
                VAR_COSTO_D = VAR_CARGO / VAR_TC_VEN;
            end
        
            if (VAR_MONEDA = 'D') then
            begin
                VAR_CTA_MONEDA = VAR_CTA_D_PROVISION;
                VAR_NOMBRE_CTA = VAR_NOMBRE_CTA_D;
                VAR_ABONO = 0.0;
                VAR_CARGO = VAR_SUMA_CARGO * VAR_TC_VEN;
                VAR_COSTO_D = VAR_SUMA_CARGO;
            end
        
            if (VAR_FLAG_CENTRO_COSTO_P = 0) then
            begin
                VAR_ID_CENCOS_TMP = null;
                VAR_NOM_CENCOS_TMP = null;
            end
            else
            begin
                VAR_ID_CENCOS_TMP = VAR_ID_CENCOS_CAB;
                VAR_NOM_CENCOS_TMP = VAR_NOM_CENCOS_CAB;
            end
        
            insert into DIA_DIARIO_DET (CODIGO, CODIGOP, ITEM, COD_CTA, FECDOC, MONEDA, TIPCAM, CONCEPTO, IMPORTE_EXT, CARGO,
                                      ABONO, USUARIO, NOMBREPC, NOMBRECTA, NOMBREPER, TIPIMP, TABLA, FLAG_CTACTE,
                                      FLAG_CENCOS, ID_PERSONA, TIPDOC, SERDOC, NUMDOC, ID_CENCOS, NOMBRECTO)
            values (:VAR_LS_CODIGO || lpad(:VAR_J, 5, '0'), :VAR_LS_CODIGO, lpad(:VAR_J, 5, '0'), :VAR_CTA_MONEDA, :VAR_FECHA_FT,
                    :VAR_MONEDA, :VAR_TC_VEN, :OUT_GLOSA, :VAR_COSTO_D, :VAR_CARGO, :VAR_ABONO, :OUT_USUARIO_REG, :OUT_USUARIO_REG,
                    :VAR_NOMBRE_CTA, :OUT_RAZON_PROVEEDOR, 'D', 'LOG', :VAR_FLAG_CTACTE_P, :VAR_FLAG_CENTRO_COSTO_P, :OUT_RUC_PROVEEDOR,
                    :VAR_TIPDOC, :VAR_SERDOC, :VAR_NUMDOC, :VAR_ID_CENCOS_TMP, :VAR_NOM_CENCOS_TMP);
        
        end
    
        /*Este indicador solo servira para OS diferidos. BA 22/09/22*/
        update LOG_ORDENES LOGOS
        set LOGOS.FLAG_PROVISIONADO = 2
        where (LOGOS.EMPRESA = :IN_EMPRESA and
              LOGOS.UNID_OPERATIVA = :IN_UNIDAD_OPERATIVA and
              LOGOS.ANIO = :IN_ANIO_ORDEN and
              LOGOS.TIPO = :IN_TIPO and
              LOGOS.NRO_ORDEN = :IN_NRO_ORDEN);
    
        OUT_CODIGO_ASIENTO_COS = VAR_LS_CODIGO;

    end

    -- actualizar cabecera del asiento
    select sum(CARGO), sum(ABONO)
    from DIA_DIARIO_DET
    where (CODIGOP = :VAR_LS_CODIGO)
    into :VAR_SUMA_CARGO, :VAR_SUMA_ABONO;
    
    update DIA_DIARIO
    set CARGO = :VAR_SUMA_CARGO,
      ABONO = :VAR_SUMA_ABONO
    where (CODIGO = :VAR_LS_CODIGO);

    --Se genera el ajuste por redondeo en caso existiera.
    select count(1)
    from SP_GEN_AJUSTE_ASIENTO(:IN_EMPRESA, :VAR_ANIO_ASIENTO, /* :ANIO,*/ :VAR_LS_CODIGO)
    into V_CONTADOR;
    --Fin

    -- actualizar la tabla de registros del libro contables
    update or insert into PRO_CONTROL_NUMERACION_REGS (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, NROCOM, TIPONUMERACION)
    values (:IN_EMPRESA, :OUT_CODLOC, '000' || :VAR_LIBCON, :VAR_LIBCON, :VAR_ANIO_ASIENTO, /*:ANIO,*/ :VAR_MES_ASIENTO,
          /*:OUT_MES,*/ :VAR_LS_NROCOM, 'M')
    matching (CODEMP, CODLOC, CODGRU, LIBCON, ANIO, MES, TIPONUMERACION);
    
    suspend;

end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_EXTORNO_OS_CIERRE IS
' /* Procedimiento para provisionar las OS diferidas.
  *
  * Version     Fecha       Responsable     Descipcion
  * 1.0         22.03.23    BAVALOS         El procedimiento provisiona las OS diferidas facturadas.
  --------------------------------------------------------------------------------------------------
  * Version     Fecha       Responsable     Descipcion
  * 1.1         15.05.24    BAVALOS         Obtenemos la factura asociado a la OS.
  --------------------------------------------------------------------------------------------------
  * Version     Fecha       Responsable     Descipcion
  * 1.2         04.02.26    BAVALOS         Consideramos indicador que diferencia a las industriales con PLX,
                                            para obtener las cuentas contables por CECOS o cencepto de costo.
/*';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_EMPRESAS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_TABLA_PARAMETROS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_TIPCAM TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT,UPDATE ON LOG_ORDENES TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT,INSERT,UPDATE ON PRO_CONTROL_NUMERACION_REGS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT,INSERT,DELETE,UPDATE ON DIA_DIARIO TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_FACTORES_VALORES TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_PLANCTAS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON LOG_CONFORMIDAD_ORDENES_DET TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON LOG_CATALOGO TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON LOG_TIPO_CATALOGO TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_CENCOS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON PUB_CENCOS_CTAS_COSTOS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON COS_FAMILIA_DET_CONCEPTOS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON ALM_ARTICULO TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT ON OPE_PLANTAS TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT SELECT,INSERT ON DIA_DIARIO_DET TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT INSERT ON DIA_DIARIO_DET_OPE TO PROCEDURE SP_EXTORNO_OS_CIERRE;
GRANT EXECUTE ON PROCEDURE SP_GEN_AJUSTE_ASIENTO TO PROCEDURE SP_EXTORNO_OS_CIERRE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_EXTORNO_OS_CIERRE TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_EXT_OS_GASTOS_VT (
    IN_EMPRESA varchar(2),
    IN_ANIO integer,
    IN_MES integer,
    IN_PROCESO integer)
returns (
    OUT_UND_OPER_ORDEN varchar(30),
    OUT_ANIO_ORDEN integer,
    OUT_TIPO_ORDEN varchar(1),
    OUT_NRO_ORDEN numeric(18,0),
    OUT_FECHA_ZARPE date,
    OUT_ID_ACTA bigint,
    OUT_ASIENTO_PROV_OS varchar(16),
    UNIDAD_OPERATIVA varchar(30),
    ANIO integer,
    TIPO varchar(1),
    NRO_ORDEN numeric(18,0),
    OUT_CODLOC_SLP varchar(2),
    OUT_ANIO_SLP integer,
    OUT_TIPO_SLP varchar(1),
    OUT_NRO_SLP integer,
    OUT_ETAPA_SLP varchar(1),
    OUT_NOM_SLP varchar(20),
    OUT_DES_CLIENTE varchar(120),
    OUT_ESTADO_ETAPA varchar(1),
    OUT_PROVEEDOR varchar(150),
    OUT_MONEDA_ORDEN varchar(1),
    OUT_TOTAL_VALOR numeric(15,7),
    OUT_TOTAL_IGV numeric(15,7),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_ESTADO_ORDEN varchar(2),
    OUT_DES_ORDEN varchar(200),
    OUT_FECHA_FT date,
    OUT_TIPDOC varchar(2),
    OUT_SERDOC varchar(15),
    OUT_NUMDOC varchar(20),
    OUT_RUC_PROVEEDOR varchar(15))
as
declare variable VAR_MES integer;
declare variable V_CONTADOR integer;
declare variable VAR_ANIO integer;
declare variable VAR_SALDO_SLP decimal(15,2);
declare variable VAR_CTA_S_PROVISION varchar(10);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(4);
declare variable VAR_NUMDOC varchar(15);
declare variable VAR_IND_PROVISION integer;
declare variable VAR_RUC_PROVEEDOR varchar(15);
declare variable VAR_ASIENTO_ATENCION varchar(16);
declare variable VAR_LIBCON varchar(2);
declare variable VAR_VINCULADO integer;
declare variable VAR_TIPO_FACT bigint;
declare variable VAR_CTA_PROVISION varchar(10);
begin
    /*IN_PROCESO = 0, Solo devuelve informacion del filtro.
      IN_PROCESO = 1, Ejecuta la informacion filtrada: provision o extorno. */

    /*Obtenemos el indicador para buscar el tipo de provision que tiene cada empresa.*/
    SELECT COALESCE(PUB_EMPRESAS.ind_provision, 0)
    FROM PUB_EMPRESAS
    WHERE PUB_EMPRESAS.codemp = :in_empresa
    INTO :VAR_IND_PROVISION;

    select VALOR
    from PARAMETROS_SISTEMAS
    where EMPRESA = :IN_EMPRESA and
          SISTEMA = '012' and
          LLAVE = 'LIB_PROV_OS'
    into :VAR_LIBCON;

    /*----------------------------DIF OS FACTURADAS MES FUTURO-------------------------------*/
    /*Aqui buscamos las OS facturas no provisionados, donde su zarpe es aun el mes siguiente.*/

    if (:VAR_IND_PROVISION = 1) then
    BEGIN

        if (in_mes = 12) then
        begin
            var_anio = :in_anio + 1;
            var_mes = 1;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes + 1;
        end
    
        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEX.fec_carga, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes LO
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  DETCOM.incoterm = 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :var_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :var_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null

            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEMB.fecha_embarque, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado, -- OEX.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            join OPE_FORMA_PAGO_POSTEMBARQUE OEMB on (OEMB.ID_OPE_FORMA_PAGO_POSTEMBARQUE = OEX.ID_FORMA_PAGO_POSTEMBARQUE)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  DETCOM.incoterm <> 1 and
                  EXTRACT(YEAR FROM OEMB.fecha_embarque) = :var_anio and
                  EXTRACT(MONTH FROM OEMB.fecha_embarque) = :var_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null

        into :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA, :OUT_CODLOC_SLP, :OUT_ANIO_SLP,
             :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE, :OUT_ESTADO_ETAPA, :VAR_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN,
             :OUT_total_valor, :OUT_total_igv, :OUT_total_precio, :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN

            OUT_FECHA_FT = null;
            OUT_TIPDOC = null;
            OUT_SERDOC = null;
            OUT_NUMDOC = null;

            select first 1 distinct PRO_DOC.FECDOC, PRO_DOC.TIPDOC, PRO_DOC.SERDOC, PRO_DOC.NUMDOC
            from PRO_DOC_DET
            left join PRO_DOC on PRO_DOC.CODIGO = PRO_DOC_DET.CODIGODOC
            where substring(PRO_DOC_DET.CODIGODOC from 1 for 2) = :IN_EMPRESA and
                  EXTRACT(YEAR FROM PRO_DOC.feccon) = :in_anio and
                  EXTRACT(MONTH FROM PRO_DOC.feccon) = :in_mes and
                  PRO_DOC.id_persona = :VAR_RUC_PROVEEDOR AND
                  PRO_DOC_DET.OC_ANIO = :OUT_ANIO_ORDEN and
                  PRO_DOC_DET.OC_UNID_OPERATIVA = :OUT_UND_OPER_ORDEN and
                  PRO_DOC_DET.OC_TIPO = :OUT_TIPO_ORDEN and
                  PRO_DOC_DET.OC_NRO_ORDEN = :OUT_NRO_ORDEN
            order by PRO_DOC.FECDOC desc
            into :OUT_FECHA_FT, :OUT_TIPDOC, :OUT_SERDOC, :OUT_NUMDOC;

            if (OUT_NUMDOC is not null) then
            BEGIN
                if (:IN_PROCESO = 1) then
                BEGIN
                    select OUT_CODIGO_ASIENTO_COS
                     from SP_EXTORNO_OS_CIERRE(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :IN_anio, :IN_MES)
                     into :OUT_ASIENTO_PROV_OS;
                    
                    if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                    begin
                        select count(*)
                        from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                        into V_CONTADOR;
                        

                    end
                END
                suspend;
            END

        END
    END

    if (:VAR_IND_PROVISION = 0) then
    BEGIN
        if (in_mes = 12) then
        begin
            var_anio = :in_anio + 1;
            var_mes = 1;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes + 1;
        end
    
        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_zarpe, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias = 0 and
                  extract(year from OPE.fec_zarpe) = :var_anio and
                  extract(month from OPE.fec_zarpe) = :var_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null   /*and
                  lo.unid_operativa = '1221' and
                  lo.tipo = 'S' and
                  LO.nro_orden = 69*/

            
            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_fin_operacion, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP, OPE.des_cliente, OPE.estado,
                   lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv, lo.total_precio, lo.estado, lo.descripcion
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias <> 0 and
                  extract(year from OPE.fec_fin_operacion) = :var_anio and
                  extract(month from OPE.fec_fin_operacion) = :var_mes and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null  /*and
                  lo.unid_operativa = '1221' and
                  lo.tipo = 'S' and
                  LO.nro_orden = 69 */
        INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :VAR_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden
        DO
        BEGIN

            OUT_FECHA_FT = null;
            OUT_TIPDOC = null;
            OUT_SERDOC = null;
            OUT_NUMDOC = null;

            select first 1 distinct PRO_DOC.FECDOC, PRO_DOC.TIPDOC, PRO_DOC.SERDOC, PRO_DOC.NUMDOC
            from PRO_DOC_DET
            --left join PRO_DOC on PRO_DOC.CODIGO = PRO_DOC_DET.CODIGODOC Comentado por AVILLAFANA 20.01.2026
            join PRO_DOC on (PRO_DOC.CODIGO = PRO_DOC_DET.CODIGODOC and PRO_DOC.CODEMP=:IN_EMPRESA and PRO_DOC.ANIO = :IN_ANIO and PRO_DOC.MES = :IN_MES)--AVILLAFANA 20.01.2026
            where --substring(PRO_DOC_DET.CODIGODOC from 1 for 2) = :IN_EMPRESA and
                  EXTRACT(YEAR FROM PRO_DOC.feccon) = :in_anio and
                  EXTRACT(MONTH FROM PRO_DOC.feccon) = :in_mes AND
                  PRO_DOC.id_persona = :VAR_RUC_PROVEEDOR AND
                  PRO_DOC_DET.OC_ANIO = :OUT_ANIO_ORDEN and
                  PRO_DOC_DET.OC_UNID_OPERATIVA = :OUT_UND_OPER_ORDEN and
                  PRO_DOC_DET.OC_TIPO = :OUT_TIPO_ORDEN and
                  PRO_DOC_DET.OC_NRO_ORDEN = :OUT_NRO_ORDEN
            order by PRO_DOC.FECDOC desc
            into :OUT_FECHA_FT, :OUT_TIPDOC, :OUT_SERDOC, :OUT_NUMDOC;

            if (OUT_NUMDOC is not null) then
            BEGIN
                if (:IN_PROCESO = 1) then
                BEGIN
                    select OUT_CODIGO_ASIENTO_COS
                     from SP_EXTORNO_OS_CIERRE(:in_empresa, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :IN_anio, :IN_MES)
                     into :OUT_ASIENTO_PROV_OS;
                    
                    if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                    begin
                        select count(*)
                        from SP_GEN_CARGAS_NATURALEZA_IND_2(:in_empresa, :OUT_ANIO_ORDEN, :IN_MES, :OUT_ASIENTO_PROV_OS)
                        into V_CONTADOR;
                        

                    end
                END
                suspend;
            END

        END

    END


    OUT_UND_OPER_ORDEN = NULL;
    OUT_ANIO_ORDEN = NULL;
    OUT_TIPO_ORDEN = NULL;
    OUT_NRO_ORDEN = NULL;
    OUT_FECHA_ZARPE = NULL;
    OUT_ID_ACTA = NULL;
    OUT_ASIENTO_PROV_OS = NULL;
    UNIDAD_OPERATIVA = NULL;
    ANIO = NULL;
    TIPO = NULL;
    NRO_ORDEN = NULL;
    OUT_CODLOC_SLP = NULL;
    OUT_ANIO_SLP = NULL;
    OUT_TIPO_SLP = NULL;
    OUT_NRO_SLP = NULL;
    OUT_ETAPA_SLP = NULL;
    OUT_NOM_SLP = NULL;
    OUT_DES_CLIENTE = NULL;
    OUT_ESTADO_ETAPA = NULL;
    OUT_PROVEEDOR = NULL;
    OUT_MONEDA_ORDEN = NULL;
    OUT_TOTAL_VALOR = NULL;
    OUT_TOTAL_IGV = NULL;
    OUT_TOTAL_PRECIO = NULL;
    OUT_ESTADO_ORDEN = NULL;
    OUT_DES_ORDEN = NULL;
    OUT_FECHA_FT = NULL;
    OUT_TIPDOC = NULL;
    OUT_SERDOC = NULL;
    OUT_NUMDOC = NULL;

    /*----------------------------EXT OS FACTURAS Y PROVISIONAS MES PASADO----------------------------------*/
    /*Aqui extornamos las OS facturadas y provisionas en el mes anterior.*/
    if (:VAR_IND_PROVISION = 1) then
    BEGIN
        
        if (in_mes = 1) then
        begin
            var_anio = :in_anio - 1;
            var_mes = 12;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes - 1;
        end

        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEX.fec_carga, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP,
                   OPE.des_cliente, OPE.estado, lo.RUC_PROVEEDOR, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv,
                   lo.total_precio, lo.estado, lo.descripcion, coalesce(LCO.CODIGO_ASIENTO, lo.codigo_asiento_cos)
            from log_ordenes LO
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = OPE.CODEMP and OEX.CODLOCAL = OPE.codlocal and OEX.ANIO = OPE.ANIO and OEX.NRO_SLP = OPE.NRO_SLP and OEX.TIPO_SLP = OPE.TIPO_SLP and OEX.ETAPA = lodet.etapa_slp)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  DETCOM.incoterm = 1 and
                  EXTRACT(YEAR FROM OEX.fec_carga) = :var_anio and
                  EXTRACT(MONTH FROM OEX.fec_carga) = :var_mes and
                  lo.codigo_asiento_cos is not null and
                  lo.flag_provisionado = 1 and
                  LCO.CODIGO_ASIENTO is not null

            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OEMB.fecha_embarque, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP,
                   OPE.des_cliente, OPE.estado, lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv,
                   lo.total_precio, lo.estado, lo.descripcion, coalesce(LCO.CODIGO_ASIENTO, lo.codigo_asiento_cos)
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_SLP_DET_COMERCIAL DETCOM on (DETCOM.CODEMP = OPE.CODEMP and DETCOM.CODLOCAL = OPE.codlocal and DETCOM.ANIO = OPE.ANIO and DETCOM.NRO_SLP = OPE.NRO_SLP and DETCOM.TIPO_SLP = OPE.TIPO_SLP)
            join OPE_EXPORTACIONES OEX on (OEX.CODEMP = lo.EMPRESA and OEX.CODLOCAL = lo.codlocal_slp and OEX.ANIO = lo.anio_slp and OEX.NRO_SLP = lo.nro_slp and OEX.TIPO_SLP = lo.tipo_slp and OEX.ETAPA = lodet.etapa_slp)
            join OPE_FORMA_PAGO_POSTEMBARQUE OEMB on (OEMB.ID_OPE_FORMA_PAGO_POSTEMBARQUE = OEX.ID_FORMA_PAGO_POSTEMBARQUE)
            WHERE LO.empresa = :in_empresa and
                  LO.estado = 'FA' and
                  DETCOM.incoterm <> 1 and
                  EXTRACT(YEAR FROM OEMB.fecha_embarque) = :var_anio and
                  EXTRACT(MONTH FROM OEMB.fecha_embarque) = :var_mes and
                  lo.codigo_asiento_cos is not null and
                  lo.flag_provisionado = 1 and
                  LCO.CODIGO_ASIENTO is not null

        into :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA, :OUT_CODLOC_SLP, :OUT_ANIO_SLP,
             :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE, :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN,
             :OUT_total_valor, :OUT_total_igv, :OUT_total_precio, :OUT_estado_ORDEN, :out_des_orden, :var_asiento_atencion
        DO
        BEGIN

            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;
            var_saldo_slp =  0;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :in_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :in_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc;

             if (var_numdoc is not null) then
            BEGIN

                select coalesce(PP.VINCULADA, 0)
                from PUB_PERSONAS PP
                where (PP.CODEMP = :IN_EMPRESA) and
                      (PP.ID_PERSONA = :OUT_RUC_PROVEEDOR)
                into :VAR_VINCULADO;

                select iif(:OUT_moneda_ORDEN = 'S', iif(:VAR_VINCULADO = '0', TFD.TERCEROS_SOLES, TFD.VINCULADOS_SOLES), iif(:VAR_VINCULADO = '0', TFD.TERCEROS_DOLARES, TFD.VINCULADOS_DOLARES))
                from TIPO_FACTURACION_DET TFD
                where TFD.ID_TIPO_FACTURACION = :VAR_TIPO_FACT and
                      TFD.anio = :IN_ANIO AND
                      TFD.LLAVE = 'CTA_PROVISION'
                into :VAR_CTA_PROVISION;

                select coalesce(sum(ddt.cargo - ddt.abono), 0)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION and
                   ddt.tipdoc = 'O'|| :OUT_TIPO_ORDEN and
                   ddt.serdoc = :OUT_UND_OPER_ORDEN and
                   ddt.numdoc = :OUT_NRO_ORDEN

                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                begin
                    if (IN_PROCESO = 1) then
                    BEGIN
                        select OUT_CODIGO_ASIENTO
                        from SP_GEN_COPIA_VOUCHER(:var_asiento_atencion, :in_anio, :in_mes, :OUT_FECHA_ZARPE, :VAR_LIBCON, 'SYSDBA', 'SYSDBA', 'E')
                        into :OUT_ASIENTO_PROV_OS;
                    END
                    suspend;
                END
            END
        END
    END

    if (:VAR_IND_PROVISION = 0) then
    BEGIN

        if (in_mes = 1) then
        begin
            var_anio = :in_anio - 1;
            var_mes = 12;
        end
        else
        begin
            var_anio = :in_anio;
            var_mes = :in_mes - 1;
        end

        FOR
            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_zarpe, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP,
                   OPE.des_cliente, OPE.estado, lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv,
                   lo.total_precio, lo.estado, lo.descripcion, coalesce(LCO.CODIGO_ASIENTO, lo.codigo_asiento_cos)
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias = 0 and
                  extract(year from OPE.fec_zarpe) = :var_anio and
                  extract(month from OPE.fec_zarpe) = :var_mes and
                  --lo.nro_slp > 0 and
                  lo.codigo_asiento_cos is not null and
                  lo.flag_provisionado = 1 and
                  LCO.CODIGO_ASIENTO is not null
            
            UNION

            select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, OPE.fec_fin_operacion, LCO.id_log_conformidad_ordenes,
                   lodet.codlocal_slp, lodet.anio_slp, lodet.tipo_slp, lodet.nro_slp, lodet.etapa_slp, PTS.NOM_SLP,
                   OPE.des_cliente, OPE.estado, lo.ruc_proveedor, lo.razon_proveedor, lo.moneda, lo.total_valor, lo.total_igv,
                   lo.total_precio, lo.estado, lo.descripcion, coalesce(LCO.CODIGO_ASIENTO, lo.codigo_asiento_cos)
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            join PUB_TIPO_SLP PTS on PTS.codemp = lo.empresa AND PTS.TIPO_SLP = lo.tipo_slp
            join ope_slp OPE ON (OPE.CODEMP = lodet.empresa and OPE.codlocal = lodet.codlocal_slp and OPE.anio = lodet.anio_slp and OPE.nro_slp = lodet.nro_slp and OPE.tipo_slp = lodet.tipo_slp)
            join OPE_MERCADERIA  OMER ON (OMER.codemp = OPE.CODEMP AND OMER.cod_mercaderia = OPE.cod_mercaderia)
            join ope_tipo_mercaderia OTMER ON (OTMER.codemp = OMER.codemp AND OTMER.id = OMER.tip_mercaderia)
            where lo.empresa = :in_empresa and
                  lo.estado = 'FA' and
                  OPE.tipo_servicio_comercial = '1' and
                  OTMER.tipo_mercancias <> 0 and
                  extract(year from OPE.fec_fin_operacion) = :var_anio and
                  extract(month from OPE.fec_fin_operacion) = :var_mes and
                  lo.codigo_asiento_cos is not null and
                  lo.flag_provisionado = 1 and
                  LCO.CODIGO_ASIENTO is not null
        INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_FECHA_ZARPE, :OUT_ID_ACTA,
               :OUT_CODLOC_SLP, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_ETAPA_SLP, :OUT_NOM_SLP, :OUT_DES_CLIENTE,
               :OUT_ESTADO_ETAPA, :OUT_RUC_PROVEEDOR, :OUT_proveedor, :OUT_moneda_ORDEN, :OUT_total_valor, :OUT_total_igv, :OUT_total_precio,
               :OUT_estado_ORDEN, :out_des_orden, :var_asiento_atencion
        DO
        BEGIN
            
            var_tipdoc =  null;
            var_serdoc =  null;
            var_numdoc =  null;
            var_saldo_slp = 0;

            select first 1 distinct pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc, pro_doc.tipo_facturacion
            from  pro_doc
            join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
            where pro_doc.codemp = :in_empresa and
               EXTRACT(YEAR FROM PRO_DOC.feccon) = :in_anio and
               EXTRACT(MONTH FROM PRO_DOC.feccon) = :in_mes AND
               PRO_DOC.id_persona = :OUT_RUC_PROVEEDOR AND
               pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
               pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
               pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
               pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
            into :var_tipdoc, :var_serdoc, :var_numdoc, :VAR_TIPO_FACT;

            if (var_numdoc is not null) then
            BEGIN

                select coalesce(PP.VINCULADA, 0)
                from PUB_PERSONAS PP
                where (PP.CODEMP = :IN_EMPRESA) and
                      (PP.ID_PERSONA = :OUT_RUC_PROVEEDOR)
                into :VAR_VINCULADO;

                select iif(:OUT_moneda_ORDEN = 'S', iif(:VAR_VINCULADO = '0', TFD.TERCEROS_SOLES, TFD.VINCULADOS_SOLES), iif(:VAR_VINCULADO = '0', TFD.TERCEROS_DOLARES, TFD.VINCULADOS_DOLARES))
                from TIPO_FACTURACION_DET TFD
                where TFD.ID_TIPO_FACTURACION = :VAR_TIPO_FACT and
                      TFD.anio = :IN_ANIO AND
                      TFD.LLAVE = 'CTA_PROVISION'
                into :VAR_CTA_PROVISION;

                select coalesce(sum(ddt.cargo - ddt.abono), 0)
                from dia_diario_det ddt
                where ddt.codemp = :in_empresa and
                   --extract(year from ddt.fecdoc) = :OUT_ANIO_ORDEN and
                   ddt.id_persona = :OUT_RUC_PROVEEDOR AND
                   ddt.cod_cta = :VAR_CTA_PROVISION and
                   ddt.tipdoc = 'O'|| :OUT_TIPO_ORDEN and
                   ddt.serdoc = :OUT_UND_OPER_ORDEN and
                   ddt.numdoc = :OUT_NRO_ORDEN

                INTO :var_saldo_slp;
    
                if (abs(var_saldo_slp) > 0) then
                begin
                    if (IN_PROCESO = 1) then
                    BEGIN
                        select OUT_CODIGO_ASIENTO
                        from SP_GEN_COPIA_VOUCHER(:var_asiento_atencion, :in_anio, :in_mes, :OUT_FECHA_ZARPE, :VAR_LIBCON, 'SYSDBA', 'SYSDBA', 'E')
                        into :OUT_ASIENTO_PROV_OS;
                    END
                    suspend;
                END
            END
        END
    END


END^

SET TERM ; ^

COMMENT ON PROCEDURE SP_EXT_OS_GASTOS_VT IS
'/* Procedimiento para provisionar/diferir las OS de COMEX.
  *
  * Version     Fecha       Responsable     Descipcion
  * 1.0         26.01.26    BAVALOS         Extornamos estos 2 procesos: DIF OS FACTURADAS MES FUTURO - ZARPE FEBRERO,
                                            EXT OS FACTURAS Y PROVISIONAS MES PASADO - ZARPE ENERO.
/*';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON PUB_EMPRESAS TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON LOG_ORDENES TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON PUB_TIPO_SLP TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_SLP_DET_COMERCIAL TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_EXPORTACIONES TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_FORMA_PAGO_POSTEMBARQUE TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_EXTORNO_OS_CIERRE TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_GEN_CARGAS_NATURALEZA_IND_2 TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_MERCADERIA TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON OPE_TIPO_MERCADERIA TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON PUB_PERSONAS TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON TIPO_FACTURACION_DET TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT SELECT ON DIA_DIARIO_DET TO PROCEDURE SP_EXT_OS_GASTOS_VT;
GRANT EXECUTE ON PROCEDURE SP_GEN_COPIA_VOUCHER TO PROCEDURE SP_EXT_OS_GASTOS_VT;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_EXT_OS_GASTOS_VT TO PROCEDURE SP_OS_CIERRE_COMERCIAL;
GRANT EXECUTE ON PROCEDURE SP_EXT_OS_GASTOS_VT TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_OS_CIERRE_COMERCIAL (
    IN_EMPRESA varchar(2),
    IN_ANIO integer,
    IN_MES integer,
    IN_TIPO varchar(1),
    IN_PROCESO integer)
returns (
    OUT_UND_OPER_ORDEN varchar(30),
    OUT_ANIO_ORDEN integer,
    OUT_TIPO_ORDEN varchar(1),
    OUT_NRO_ORDEN numeric(18,0),
    OUT_FECHA_ZARPE date,
    OUT_ID_ACTA bigint,
    OUT_ASIENTO_PROV_OS varchar(16),
    UNIDAD_OPERATIVA varchar(30),
    ANIO integer,
    TIPO varchar(1),
    NRO_ORDEN numeric(18,0),
    OUT_CODLOC_SLP varchar(2),
    OUT_ANIO_SLP integer,
    OUT_TIPO_SLP varchar(1),
    OUT_NRO_SLP integer,
    OUT_ETAPA_SLP varchar(1),
    OUT_NOM_SLP varchar(20),
    OUT_DES_CLIENTE varchar(120),
    OUT_ESTADO_ETAPA varchar(1),
    OUT_PROVEEDOR varchar(150),
    OUT_MONEDA_ORDEN varchar(1),
    OUT_TOTAL_VALOR numeric(15,7),
    OUT_TOTAL_IGV numeric(15,7),
    OUT_TOTAL_PRECIO numeric(15,7),
    OUT_ESTADO_ORDEN varchar(2),
    OUT_DES_ORDEN varchar(200),
    OUT_FECHA_FT date,
    OUT_TIPDOC varchar(2),
    OUT_SERDOC varchar(15),
    OUT_NUMDOC varchar(20),
    OUT_RUC_PROVEEDOR varchar(15))
as
declare variable VAR_MES integer;
declare variable V_CONTADOR integer;
declare variable VAR_ANIO integer;
declare variable VAR_SALDO_SLP decimal(15,2);
declare variable VAR_CTA_S_PROVISION varchar(10);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(4);
declare variable VAR_NUMDOC varchar(15);
declare variable VAR_IND_PROVISION integer;
declare variable VAR_ID_ACTA bigint;
declare variable VAR_RUC_PROVEEDOR varchar(15);
begin
    /*IN_PROCESO = 0, Solo devuelve informacion del filtro.
      IN_PROCESO = 1, Ejecuta la informacion filtrada: provision o extorno. */

    /*Provisionamos OS.*/
    if (:in_tipo = 'P') then
    BEGIN
          for select OUT_UND_OPER_ORDEN, OUT_ANIO_ORDEN, OUT_TIPO_ORDEN, OUT_NRO_ORDEN, OUT_FECHA_ZARPE, OUT_ID_ACTA,
                 OUT_ASIENTO_PROV_OS, UNIDAD_OPERATIVA, ANIO, TIPO, NRO_ORDEN, OUT_CODLOC_SLP, OUT_ANIO_SLP, OUT_TIPO_SLP,
                 OUT_NRO_SLP, OUT_ETAPA_SLP, OUT_NOM_SLP, OUT_DES_CLIENTE, OUT_ESTADO_ETAPA, OUT_PROVEEDOR, OUT_MONEDA_ORDEN,
                 OUT_TOTAL_VALOR, OUT_TOTAL_IGV, OUT_TOTAL_PRECIO, OUT_ESTADO_ORDEN, OUT_DES_ORDEN, OUT_FECHA_FT, OUT_TIPDOC,
                 OUT_SERDOC, OUT_NUMDOC, OUT_RUC_PROVEEDOR
          from SP_PROV_OS_GASTOS_VT(:IN_EMPRESA, :IN_ANIO, :IN_MES, :IN_PROCESO)
          into OUT_UND_OPER_ORDEN, OUT_ANIO_ORDEN, OUT_TIPO_ORDEN, OUT_NRO_ORDEN, OUT_FECHA_ZARPE, OUT_ID_ACTA,
                 OUT_ASIENTO_PROV_OS, UNIDAD_OPERATIVA, ANIO, TIPO, NRO_ORDEN, OUT_CODLOC_SLP, OUT_ANIO_SLP, OUT_TIPO_SLP,
                 OUT_NRO_SLP, OUT_ETAPA_SLP, OUT_NOM_SLP, OUT_DES_CLIENTE, OUT_ESTADO_ETAPA, OUT_PROVEEDOR, OUT_MONEDA_ORDEN,
                 OUT_TOTAL_VALOR, OUT_TOTAL_IGV, OUT_TOTAL_PRECIO, OUT_ESTADO_ORDEN, OUT_DES_ORDEN, OUT_FECHA_FT, OUT_TIPDOC,
                 OUT_SERDOC, OUT_NUMDOC, OUT_RUC_PROVEEDOR
          do
          begin
            suspend;
          end
    END

    /*Extornamos OS.*/
    if (:in_tipo = 'E') then
    BEGIN
        for select OUT_UND_OPER_ORDEN, OUT_ANIO_ORDEN, OUT_TIPO_ORDEN, OUT_NRO_ORDEN, OUT_FECHA_ZARPE, OUT_ID_ACTA,
                 OUT_ASIENTO_PROV_OS, UNIDAD_OPERATIVA, ANIO, TIPO, NRO_ORDEN, OUT_CODLOC_SLP, OUT_ANIO_SLP, OUT_TIPO_SLP,
                 OUT_NRO_SLP, OUT_ETAPA_SLP, OUT_NOM_SLP, OUT_DES_CLIENTE, OUT_ESTADO_ETAPA, OUT_PROVEEDOR, OUT_MONEDA_ORDEN,
                 OUT_TOTAL_VALOR, OUT_TOTAL_IGV, OUT_TOTAL_PRECIO, OUT_ESTADO_ORDEN, OUT_DES_ORDEN, OUT_FECHA_FT, OUT_TIPDOC,
                 OUT_SERDOC, OUT_NUMDOC
        from SP_EXT_OS_GASTOS_VT(:IN_EMPRESA, :IN_ANIO, :IN_MES, :IN_PROCESO)
        into OUT_UND_OPER_ORDEN, OUT_ANIO_ORDEN, OUT_TIPO_ORDEN, OUT_NRO_ORDEN, OUT_FECHA_ZARPE, OUT_ID_ACTA,
             OUT_ASIENTO_PROV_OS, UNIDAD_OPERATIVA, ANIO, TIPO, NRO_ORDEN, OUT_CODLOC_SLP, OUT_ANIO_SLP, OUT_TIPO_SLP,
             OUT_NRO_SLP, OUT_ETAPA_SLP, OUT_NOM_SLP, OUT_DES_CLIENTE, OUT_ESTADO_ETAPA, OUT_PROVEEDOR, OUT_MONEDA_ORDEN,
             OUT_TOTAL_VALOR, OUT_TOTAL_IGV, OUT_TOTAL_PRECIO, OUT_ESTADO_ORDEN, OUT_DES_ORDEN, OUT_FECHA_FT, OUT_TIPDOC,
             OUT_SERDOC, OUT_NUMDOC
        do
        begin
            suspend;
        end
    END
END^

SET TERM ; ^

COMMENT ON PROCEDURE SP_OS_CIERRE_COMERCIAL IS
'/* Procedimiento para provisionar/diferir las OS de COMEX.
  *
  * Version     Fecha       Responsable     Descipcion
  * 1.0         22.01.26    BAVALOS         Nuevo proceso de cierre comercial para provisonar y extornas ordenes
                                            de acuerdo a las diferentes casuisticas:
                                            A) PROV OS ATENDIDAS
                                            B) DIF OS FACTURADAS MES FUTURO
                                            A) PROV OS DIFERIDAS MES PASADO
                                            B) EXT OS FACTURAS Y PROVISIONAS MES PASADO
                                            A) PROV OS FACTURAS MES FUTURO

/*';

/* Following GRANT statetements are generated automatically */

GRANT EXECUTE ON PROCEDURE SP_PROV_OS_GASTOS_VT TO PROCEDURE SP_OS_CIERRE_COMERCIAL;
GRANT EXECUTE ON PROCEDURE SP_EXT_OS_GASTOS_VT TO PROCEDURE SP_OS_CIERRE_COMERCIAL;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_OS_CIERRE_COMERCIAL TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_PROVISIONAR_OS_ZARPE_NAVE (
    IN_CODEMP varchar(2),
    IN_ANIO integer,
    IN_COD_NAVE varchar(10),
    IN_COD_VIAJE varchar(10),
    IN_ADUANA_MANIFIESTO varchar(3))
returns (
    OUT_CODLOCAL varchar(2),
    OUT_ANIO_SLP integer,
    OUT_TIPO_SLP varchar(5),
    OUT_NRO_SLP integer,
    OUT_FECHA_ZARPE date,
    OUT_UND_OPER_ORDEN varchar(30),
    OUT_ANIO_ORDEN integer,
    OUT_TIPO_ORDEN varchar(1),
    OUT_NRO_ORDEN numeric(18,0),
    OUT_ID_ACTA bigint,
    OUT_ASIENTO_PROV_OS varchar(16))
as
declare variable VAR_CONTADOR integer;
declare variable VAR_CTA_S_PROVISION varchar(20);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(15);
declare variable VAR_NUMDOC varchar(20);
declare variable VAR_SALDO_SLP decimal(15,2);
declare variable VAR_ANIO integer;
declare variable VAR_MES integer;
declare variable VAR_RUC_PROVEEDOR varchar(15);
begin

    for select OPE_SLP.CODLOCAL, OPE_SLP.ANIO, OPE_SLP.TIPO_SLP, OPE_SLP.NRO_SLP, coalesce(OPE_VIAJE.ATD, OPE_VIAJE.ETD)
        from OPE_BOOKING
        join OPE_SLP on (OPE_SLP.CODEMP = OPE_BOOKING.CODEMP and OPE_SLP.CODLOCAL = OPE_BOOKING.CODLOCAL and OPE_SLP.ANIO_BOOKING = OPE_BOOKING.ANIO and OPE_SLP.ITEM_BOOKING = OPE_BOOKING.ITEM and OPE_SLP.TIPO_SERVICIO_COMERCIAL = '1') --Solo servicios logisticos
        join OPE_VIAJE on (OPE_VIAJE.codemp = OPE_BOOKING.CODEMP and OPE_VIAJE.anio = OPE_BOOKING.ANIO_VIAJE and OPE_VIAJE.cod_nave = OPE_BOOKING.COD_NAVE and OPE_VIAJE.cod_viaje = OPE_BOOKING.COD_VIAJE and OPE_VIAJE.aduana_manifiesto = OPE_BOOKING.COD_ADUANA)
        where OPE_BOOKING.CODEMP = :IN_CODEMP and
            OPE_BOOKING.ANIO_VIAJE = :IN_ANIO and
            OPE_BOOKING.COD_NAVE = :IN_COD_NAVE and
            OPE_BOOKING.COD_VIAJE = :IN_COD_VIAJE and
            OPE_BOOKING.COD_ADUANA = :IN_ADUANA_MANIFIESTO
        into :OUT_CODLOCAL, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_FECHA_ZARPE
    do
    begin
        
        FOR select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, LCO.id_log_conformidad_ordenes
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            where lo.empresa = :IN_CODEMP and
                  lo.estado in ('VB','AT') and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null  AND
                  lodet.codlocal_slp = :OUT_CODLOCAL AND
                  lodet.anio_slp = :OUT_ANIO_SLP AND
                  lodet.tipo_slp = :OUT_TIPO_SLP AND
                  lodet.nro_slp = :OUT_NRO_SLP
            INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA
        DO
        BEGIN
            if (:OUT_ID_ACTA > 0) then
            BEGIN
    
               -- VAR_MES = EXTRACT(YEAR FROM :OUT_FECHA_ZARPE);
    
                UPDATE log_conformidad_ordenes
                SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
    
                select OUT_CODIGO_ASIENTO_COS
                from SP_ASIENTO_OS_CONFORMIDAD(:IN_CODEMP, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                into :OUT_ASIENTO_PROV_OS;
            
                if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                begin
                  select count(*)
                  from SP_GEN_CARGAS_NATURALEZA_IND_2(:IN_CODEMP, :OUT_ANIO_ORDEN, NULL, :OUT_ASIENTO_PROV_OS)
                  into VAR_CONTADOR;
                end
    
                suspend;
            END
        end

        FOR select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, LCO.id_log_conformidad_ordenes, lo.ruc_proveedor
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            where lo.empresa = :IN_CODEMP and
                  lo.estado = 'FA' and
                  LO.flag_provisionado = 2 AND
                  lodet.codlocal_slp = :OUT_CODLOCAL AND
                  lodet.anio_slp = :OUT_ANIO_SLP AND
                  lodet.tipo_slp = :OUT_TIPO_SLP AND
                  lodet.nro_slp = :OUT_NRO_SLP
            INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :VAR_RUC_PROVEEDOR
        DO
        BEGIN
            if (:OUT_ID_ACTA > 0) then
            BEGIN
                select VALOR
                from PARAMETROS_SISTEMAS PS
                where PS.EMPRESA = :IN_CODEMP and
                      PS.SISTEMA = '012' and
                      PS.LLAVE = 'CTA_PROVISION_DIFERIDO_D'
                into :VAR_CTA_S_PROVISION;
    
                select pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc, pro_doc.anio, pro_doc.mes
                from  pro_doc
                join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
                where pro_doc.codemp = :IN_CODEMP and
                      pro_doc.id_persona = :VAR_RUC_PROVEEDOR and
                      pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
                      pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
                      pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
                      pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
                into :var_tipdoc, :var_serdoc, :var_numdoc, :var_anio, :var_mes;
    
                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :IN_CODEMP and
                      ddt.cod_cta = :VAR_CTA_S_PROVISION and
                      ddt.tipdoc = :var_tipdoc and
                      ddt.serdoc = :var_serdoc and
                      ddt.numdoc = :var_numdoc
                INTO :var_saldo_slp;
    
                if (var_saldo_slp > 0) then
                BEGIN
                    select OUT_CODIGO_ASIENTO_COS
                    from SP_PROV_OS_EXTORNO_COMEX(:IN_CODEMP, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :var_anio, :var_mes)
                    into :OUT_ASIENTO_PROV_OS;
                    
                    if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                    begin
                        select count(*)
                        from SP_GEN_CARGAS_NATURALEZA_IND_2(:IN_CODEMP, :OUT_ANIO_ORDEN, null, :OUT_ASIENTO_PROV_OS)
                        into VAR_CONTADOR;
                    end
    
                END
    
                suspend;
            END
        end
    END
end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE IS
'Fecha: 06.11.2025
Autor: Brecia Avalos
Version: 1.1
Comentario: Nuevo SP para provisionar las OS de los contratos asociados, segun el viaje confirmado.
---------------------------------------------------------------------------------------------------';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON OPE_BOOKING TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON OPE_VIAJE TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON LOG_ORDENES TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT,UPDATE ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_GEN_CARGAS_NATURALEZA_IND_2 TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON DIA_DIARIO_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_PROV_OS_EXTORNO_COMEX TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE TO SYSDBA;

SET TERM ^ ;

create or alter procedure SP_PROVISIONAR_OS_ZARPE_NAVE (
    IN_CODEMP varchar(2),
    IN_ANIO integer,
    IN_COD_NAVE varchar(10),
    IN_COD_VIAJE varchar(10),
    IN_ADUANA_MANIFIESTO varchar(3))
returns (
    OUT_CODLOCAL varchar(2),
    OUT_ANIO_SLP integer,
    OUT_TIPO_SLP varchar(5),
    OUT_NRO_SLP integer,
    OUT_FECHA_ZARPE date,
    OUT_UND_OPER_ORDEN varchar(30),
    OUT_ANIO_ORDEN integer,
    OUT_TIPO_ORDEN varchar(1),
    OUT_NRO_ORDEN numeric(18,0),
    OUT_ID_ACTA bigint,
    OUT_ASIENTO_PROV_OS varchar(16))
as
declare variable VAR_CONTADOR integer;
declare variable VAR_CTA_S_PROVISION varchar(20);
declare variable VAR_TIPDOC varchar(2);
declare variable VAR_SERDOC varchar(15);
declare variable VAR_NUMDOC varchar(20);
declare variable VAR_SALDO_SLP decimal(15,2);
declare variable VAR_ANIO integer;
declare variable VAR_MES integer;
declare variable VAR_RUC_PROVEEDOR varchar(15);
begin

    for select OPE_SLP.CODLOCAL, OPE_SLP.ANIO, OPE_SLP.TIPO_SLP, OPE_SLP.NRO_SLP, coalesce(OPE_VIAJE.ATD, OPE_VIAJE.ETD)
        from OPE_BOOKING
        join OPE_SLP on (OPE_SLP.CODEMP = OPE_BOOKING.CODEMP and OPE_SLP.CODLOCAL = OPE_BOOKING.CODLOCAL and OPE_SLP.ANIO_BOOKING = OPE_BOOKING.ANIO and OPE_SLP.ITEM_BOOKING = OPE_BOOKING.ITEM and OPE_SLP.TIPO_SERVICIO_COMERCIAL = '1') --Solo servicios logisticos
        join OPE_VIAJE on (OPE_VIAJE.codemp = OPE_BOOKING.CODEMP and OPE_VIAJE.anio = OPE_BOOKING.ANIO_VIAJE and OPE_VIAJE.cod_nave = OPE_BOOKING.COD_NAVE and OPE_VIAJE.cod_viaje = OPE_BOOKING.COD_VIAJE and OPE_VIAJE.aduana_manifiesto = OPE_BOOKING.COD_ADUANA)
        where OPE_BOOKING.CODEMP = :IN_CODEMP and
            OPE_BOOKING.ANIO_VIAJE = :IN_ANIO and
            OPE_BOOKING.COD_NAVE = :IN_COD_NAVE and
            OPE_BOOKING.COD_VIAJE = :IN_COD_VIAJE and
            OPE_BOOKING.COD_ADUANA = :IN_ADUANA_MANIFIESTO
        into :OUT_CODLOCAL, :OUT_ANIO_SLP, :OUT_TIPO_SLP, :OUT_NRO_SLP, :OUT_FECHA_ZARPE
    do
    begin
        
        FOR select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, LCO.id_log_conformidad_ordenes
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            where lo.empresa = :IN_CODEMP and
                  lo.estado in ('VB','AT') and
                  lo.codigo_asiento_cos is null and
                  lo.flag_provisionado is null and
                  LCO.CODIGO_ASIENTO is null  AND
                  lodet.codlocal_slp = :OUT_CODLOCAL AND
                  lodet.anio_slp = :OUT_ANIO_SLP AND
                  lodet.tipo_slp = :OUT_TIPO_SLP AND
                  lodet.nro_slp = :OUT_NRO_SLP
            INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA
        DO
        BEGIN
            if (:OUT_ID_ACTA > 0) then
            BEGIN
    
               -- VAR_MES = EXTRACT(YEAR FROM :OUT_FECHA_ZARPE);
    
                UPDATE log_conformidad_ordenes
                SET log_conformidad_ordenes.fecha_atencion = :OUT_FECHA_ZARPE
                WHERE log_conformidad_ordenes.id_log_conformidad_ordenes = :OUT_ID_ACTA;
    
                select OUT_CODIGO_ASIENTO_COS
                from SP_ASIENTO_OS_CONFORMIDAD(:IN_CODEMP, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA)
                into :OUT_ASIENTO_PROV_OS;
            
                if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                begin
                  select count(*)
                  from SP_GEN_CARGAS_NATURALEZA_IND_2(:IN_CODEMP, :OUT_ANIO_ORDEN, NULL, :OUT_ASIENTO_PROV_OS)
                  into VAR_CONTADOR;
                end
    
                suspend;
            END
        end

        FOR select lo.unid_operativa, lo.anio, lo.tipo, lo.nro_orden, LCO.id_log_conformidad_ordenes, lo.ruc_proveedor
            from log_ordenes lo
            join log_ordenes_Det lodet on (lodet.empresa = lo.empresa and lodet.unid_operativa = lo.unid_operativa and lodet.anio = lo.anio and lodet.tipo = lo.tipo and lodet.nro_orden = lo.nro_orden)
            join LOG_CONFORMIDAD_ORDENES LCO on LCO.EMPRESA = lo.EMPRESA and LCO.UNID_OPERATIVA = lo.UNID_OPERATIVA and LCO.ANIO = lo.ANIO and LCO.TIPO = lo.TIPO and LCO.NRO_ORDEN = lo.NRO_ORDEN
            where lo.empresa = :IN_CODEMP and
                  lo.estado = 'FA' and
                  LO.flag_provisionado = 2 AND
                  lodet.codlocal_slp = :OUT_CODLOCAL AND
                  lodet.anio_slp = :OUT_ANIO_SLP AND
                  lodet.tipo_slp = :OUT_TIPO_SLP AND
                  lodet.nro_slp = :OUT_NRO_SLP
            INTO :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :VAR_RUC_PROVEEDOR
        DO
        BEGIN
            if (:OUT_ID_ACTA > 0) then
            BEGIN
                select VALOR
                from PARAMETROS_SISTEMAS PS
                where PS.EMPRESA = :IN_CODEMP and
                      PS.SISTEMA = '012' and
                      PS.LLAVE = 'CTA_PROVISION_DIFERIDO_D'
                into :VAR_CTA_S_PROVISION;
    
                select pro_doc.tipdoc, pro_doc.serdoc, pro_doc.numdoc, pro_doc.anio, pro_doc.mes
                from  pro_doc
                join pro_doc_det on (pro_doc_det.codigodoc = pro_doc.codigo)
                where pro_doc.codemp = :IN_CODEMP and
                      pro_doc.id_persona = :VAR_RUC_PROVEEDOR and
                      pro_doc_det.oc_anio = :OUT_ANIO_ORDEN and
                      pro_doc_det.oc_unid_operativa = :OUT_UND_OPER_ORDEN and
                      pro_doc_det.oc_tipo = :OUT_TIPO_ORDEN and
                      pro_doc_det.oc_nro_orden = :OUT_NRO_ORDEN
                into :var_tipdoc, :var_serdoc, :var_numdoc, :var_anio, :var_mes;
    
                select sum(ddt.cargo - ddt.abono)
                from dia_diario_det ddt
                where ddt.codemp = :IN_CODEMP and
                      ddt.cod_cta = :VAR_CTA_S_PROVISION and
                      ddt.tipdoc = :var_tipdoc and
                      ddt.serdoc = :var_serdoc and
                      ddt.numdoc = :var_numdoc
                INTO :var_saldo_slp;
    
                if (var_saldo_slp > 0) then
                BEGIN
                    select OUT_CODIGO_ASIENTO_COS
                    from SP_PROV_OS_EXTORNO_CIERRE(:IN_CODEMP, :OUT_UND_OPER_ORDEN, :OUT_ANIO_ORDEN, :OUT_TIPO_ORDEN, :OUT_NRO_ORDEN, :OUT_ID_ACTA, :var_anio, :var_mes)
                    into :OUT_ASIENTO_PROV_OS;
                    
                    if ((OUT_ASIENTO_PROV_OS is not null) or (OUT_ASIENTO_PROV_OS <> '') ) then
                    begin
                        select count(*)
                        from SP_GEN_CARGAS_NATURALEZA_IND_2(:IN_CODEMP, :OUT_ANIO_ORDEN, null, :OUT_ASIENTO_PROV_OS)
                        into VAR_CONTADOR;
                    end
    
                END
    
                suspend;
            END
        end
    END
end^

SET TERM ; ^

COMMENT ON PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE IS
'Fecha: 06.11.2025
Autor: Brecia Avalos
Version: 1.1
Comentario: Nuevo SP para provisionar las OS de los contratos asociados, segun el viaje confirmado.
---------------------------------------------------------------------------------------------------';

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON OPE_BOOKING TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON OPE_SLP TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON OPE_VIAJE TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON LOG_ORDENES TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON LOG_ORDENES_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT,UPDATE ON LOG_CONFORMIDAD_ORDENES TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_ASIENTO_OS_CONFORMIDAD TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_GEN_CARGAS_NATURALEZA_IND_2 TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PARAMETROS_SISTEMAS TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PRO_DOC TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON PRO_DOC_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT SELECT ON DIA_DIARIO_DET TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;
GRANT EXECUTE ON PROCEDURE SP_PROV_OS_EXTORNO_CIERRE TO PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE SP_PROVISIONAR_OS_ZARPE_NAVE TO SYSDBA;