CREATE OR REPLACE PACKAGE BODY NAF47.PKG_FACT_NAF_SOL AS /****************************************************************************** NAME: PKG_FACT_NAF_SOL PURPOSE: REVISIONS: Ver Date Author Description --------- ---------- --------------- ------------------------------------ 1.0 25/05/2016 etajanel 1. Created this package body. 2.0 27/11/2019 Innovare (HHGR/JAGV) 1. Adaptación del paquete para recibir soluciones ******************************************************************************/ FUNCTION ULTIMO_TIPOCAMBIO(Pmoneda varchar2) RETURN NUMBER IS val_tc number; BEGIN select tipo_cambio_venta into val_tc from arcgtc where clase_cambio=Pmoneda and fecha= (select max(fecha) from arcgtc where clase_cambio=Pmoneda); return(val_tc); END; FUNCTION SIGUENTE_CORRELATIVO(PCIA NUMBER,popcion VARCHAR2) RETURN NUMBER IS val_correlativo number; BEGIN SELECT TO_NUMBER(VALOR) + 1 INTO val_correlativo FROM PARAMETROS_VARIOS WHERE MODULO='FA' AND PANTALLA='SSO_FDIN' AND OPCION=popcion AND TO_NUMBER(CIA)=PCIA; UPDATE PARAMETROS_VARIOS SET VALOR = TO_CHAR(val_correlativo) WHERE MODULO='FA' AND PANTALLA='SSO_FDIN' AND OPCION=popcion AND TO_NUMBER(CIA)=PCIA; RETURN(val_correlativo); END; FUNCTION DIFERENCIAL(pcia number, -- Codigo de la compañia pcliente number, -- Codigo del cliente pInstalacion number, -- numero de enlace pnotransaccion number, --numero de orden de trabajo del enlace pValorAct number, -- valor de la nueva transaccion sobre el enlace pCodMoneda VARCHAR2 -- moneda de la nueva transaccion del enlace ) RETURN NUMBER IS CURSOR CUR_TRAN IS SELECT vmensual,codmoneda,DECODE(pcia,1,'01') cod_mondeda from sso_fdin where codempresa = pcia and codcliente=pcliente and instalacion=pinstalacion and notransaccion=pnotransaccion and activo='S' and tiposervicio='ENL' and fecha=(select max(fecha) from sso_fdin where codempresa = pcia and codcliente=pcliente and instalacion=pinstalacion and notransaccion=pnotransaccion and activo='S' and tiposervicio='ENL' ); nValorAnt number; nCodmonedaAnt varchar2(4); nvalorTC number; dfecha_tc date; cCodMoneda_tc varchar2(4); nVal_direrencial number; BEGIN OPEN CUR_TRAN; FETCH CUR_TRAN INTO nValorAnt, nCodmonedaAnt,cCodMoneda_tc; CLOSE CUR_TRAN; IF ncodmonedaAnt != pCodMoneda THEN -- La moneda de la transaccion anterior es diferente a la moneda de la nueva transaccion nvalorTC := Tipo_cambio( cCodMoneda_tc, sysdate, dfecha_tc, 'C'); -- se obtiene el tipo de cambio del sistema NAF IF nCodmonedaAnt='USD' THEN -- La moneda anterior es dolares y la nueva moneda es local nVal_direrencial := NVL(pValorAct,0) - NVL((nValorAnt * nvalorTC),0); ELSE -- La moneda anterior es local y la nueva es dolares nVal_direrencial := NVL(pValorAct,0) - NVL((nValorAnt / nvalorTC),0); END IF; ELSE -- La moneda del servicio anterior es igual a la moneda de la nueva transaccion nVal_direrencial := NVL(pValorAct,0) - NVL(nValorAnt,0); END IF; IF nVal_direrencial < 0 THEN nVal_direrencial := 0; END IF; nVal_direrencial :=round(nVal_direrencial,2); --return nValorAnt; return nVal_direrencial; --RETURN nValorAnt; END; FUNCTION Existe_Cliente(pNO_CIA IN NUMBER, pNO_CLIENTE IN VARCHAR2, pNit VARCHAR2, pNOMBRE VARCHAR2) RETURN BOOLEAN IS v_cliente arccmc.no_cliente%type; BEGIN BEGIN SELECT no_cliente -- Busco el cliente por el codigo de siebel into v_cliente FROM ARCCMC WHERE TO_NUMBER(NO_CIA)=pNO_CIA AND NO_CLIENTE_SIEBEL =pNO_CLIENTE; EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN SELECT no_cliente -- Busco el cliente por el nit into v_cliente FROM ARCCMC WHERE TO_NUMBER(NO_CIA)=pNO_CIA AND CEDULA = replace(substr(trim(pNIT),1,length(trim(pNIT))-1)||'-'||substr(trim(pNIT),length(trim(pNIT)),1),'--','-'); EXCEPTION WHEN NO_DATA_FOUND THEN BEGIN SELECT no_cliente -- Busco el cliente por el nombre into v_cliente FROM ARCCMC WHERE TO_NUMBER(NO_CIA)=pNO_CIA AND NOMBRE =pnombre; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN FALSE; -- EL CLIENTE NO EXISTE END; END; END; RETURN TRUE; -- EL CLIENTE SI EXISTE END; FUNCTION GET_MSG_DESCRIPTION(ID_RESULTADO IN NUMBER) RETURN VARCHAR2 IS --V_desc MSG_PKG_FACT_NAF_SOL.desc_msg%type; V_desc VARCHAR2(1000); BEGIN BEGIN SELECT desc_msg into v_Desc from MSG_PKG_FACT_NAF where id_msg=ID_RESULTADO; EXCEPTION WHEN NO_DATA_FOUND THEN V_desc:='Descripción no esta en la tabla de mensajes'; END; RETURN v_Desc; END; PROCEDURE CREAR_CLIENTE(pNO_CIA IN VARCHAR2, pCOD_CLIENTE_SIEBEL IN VARCHAR2, pGRUPO IN VARCHAR2, pTIPO_CLIENTE IN VARCHAR2, pNOMBRE IN VARCHAR2, pNOMBRE_COMERCIAL IN VARCHAR2, pDIRECCION IN VARCHAR2, pFecha_Ingre IN DATE, pExcento_Imp IN VARCHAR2, pMONEDA_LIMITE IN VARCHAR2, pTELEFONO IN VARCHAR2, pPLAZO IN Number, pCedula IN VARCHAR2, pCLIENTE_NACIONAL IN VARCHAR2, pIND_ACEPTA_RETENCION IN VARCHAR2, pEXENTO_IVA IN VARCHAR2, pTipoPrecio IN VARCHAR2, pCentro IN VARCHAR2, pBALANCEFACTURA VARCHAR2, pNOMBRE_FISCAL VARCHAR2, PDIRECCION_FACTURA VARCHAR2, pFac_ANTICIPADO VARCHAR2, pCOD_CLIENTE_NAF IN OUT NUMBER, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2) IS TmpVar NUMBER; BEGIN id_resultado := 0; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); IF Existe_Cliente(pNO_CIA,pCOD_CLIENTE_SIEBEL,pCedula,pNOMBRE) THEN id_resultado:=2; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); ELSE BEGIN SELECT NVL(MAX(to_number(NO_CLIENTE)),0) + 1 INTO pCOD_CLIENTE_NAF FROM ARCCMC WHERE to_number(NO_CIA)=to_number(pNO_CIA); INSERT INTO ARCCMC(NO_CIA,NO_CLIENTE,GRUPO,TIPO_CLIENTE,NOMBRE,NOMBRE_COMERCIAL,DIRECCION,Fecha_Ingre, Excento_Imp,MONEDA_LIMITE,TELEFONO,PLAZO,Cedula,CLIENTE_NACIONAL,IND_ACEPTA_RETENCION,EXENTO_IVA, TIPOPRECIO,CENTRO,BALANCEFACTURA,NO_CLIENTE_SIEBEL,NOMBRE_LARGO) VALUES(pNO_CIA,pCOD_CLIENTE_NAF,/*pGRUPO*/'01',pTIPO_CLIENTE,pNOMBRE,pNOMBRE_COMERCIAL,pDIRECCION,pFecha_Ingre, pExcento_Imp,pMONEDA_LIMITE,pTELEFONO,pPLAZO,pCedula,pCLIENTE_NACIONAL,pIND_ACEPTA_RETENCION,pEXENTO_IVA, pTipoPrecio,pCentro,pBALANCEFACTURA,pCOD_CLIENTE_SIEBEL,pNOMBRE); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 2; -- Operación Fallida, Código de Cliente duplicado Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||'('||pCOD_CLIENTE_NAF||')'; WHEN OTHERS THEN id_resultado := 3; -- Operación Fallida, Error al insertar en ARCCMC Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; -- Crea de una vez grupo de facturacion 1 ASIGNAR_GRUPOFAC(pNO_CIA, pCOD_CLIENTE_NAF,USER,pNOMBRE_FISCAL ,replace(PDIRECCION_FACTURA,',,',',')); COMMIT; END IF; END; FUNCTION Existe_Cliente_Activo(pNO_CIA IN NUMBER, pNO_CLIENTE IN NUMBER ) RETURN NUMBER IS CURSOR CUR_CLI IS -- Para validar que exista el cliente SELECT no_cliente from arccmc WHERE TO_NUMBER(no_cia)=pNO_CIA and TO_NUMBER(no_cliente)=pNO_CLIENTE and F_CIERRE IS NULL; V_NO_CLIENTE ARCCMC.NO_CLIENTE%TYPE; BEGIN OPEN CUR_CLI; FETCH CUR_CLI into V_NO_CLIENTE; IF CUR_CLI%FOUND THEN CLOSE CUR_CLI; RETURN V_NO_CLIENTE; ELSE CLOSE CUR_CLI; RETURN 0; END IF; END; PROCEDURE ACTUALIZAR_CLIENTE(pNO_CIA IN VARCHAR2, pCOD_CLIENTE IN VARCHAR2, pNOMBRE IN VARCHAR2, pNOMBRE_COMERCIAL IN VARCHAR2, pDIRECCION IN VARCHAR2, pExcento_Imp IN VARCHAR2, pMONEDA_LIMITE IN VARCHAR2, pTELEFONO IN VARCHAR2, pPLAZO IN Number, pCedula IN VARCHAR2, pCLIENTE_NACIONAL IN VARCHAR2, pIND_ACEPTA_RETENCION IN VARCHAR2, pEXENTO_IVA IN VARCHAR2, pNOMBRE_FISCAL VARCHAR2, PDIRECCION_FACTURA VARCHAR2, pFac_ANTICIPADO VARCHAR2, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2) IS BEGIN id_resultado := 0; -- Resultado exitoso Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); IF Existe_Cliente_ACTIVO(pNO_CIA,pCOD_CLIENTE)=TO_NUMBER(pCOD_CLIENTE) THEN UPDATE arccmc set NOMBRE =NVL(pNOMBRE,NOMBRE), NOMBRE_COMERCIAL =NVL(pNOMBRE_COMERCIAL,NOMBRE_COMERCIAL), NOMBRE_LARGO =NVL(pNOMBRE,NOMBRE), DIRECCION =NVL(pDIRECCION,DIRECCION), Excento_Imp =NVL(pExcento_Imp,Excento_Imp), MONEDA_LIMITE =NVL(pMONEDA_LIMITE,MONEDA_LIMITE), TELEFONO =NVL(pTELEFONO,Telefono), PLAZO =NVL(pPLAZO,PLAZO), Cedula =pCedula, CLIENTE_NACIONAL =NVL(pCLIENTE_NACIONAL,CLIENTE_NACIONAL), IND_ACEPTA_RETENCION=NVL(pIND_ACEPTA_RETENCION,IND_ACEPTA_RETENCION), EXENTO_IVA =NVL(pEXENTO_IVA,EXENTO_IVA) WHERE NO_CIA=pNO_CIA AND NO_CLIENTE=pCOD_CLIENTE; -- ACTUALIZA TODOS LOS GRUPOS DE FACTURACION UPDATE sso_fgcf SET NOMBRECLIENTE=pNOMBRE_FISCAL, DIRECCION=replace(PDIRECCION_FACTURA,',,',','), -- de una vez le quito dos comas juntos cuando vienen NIT=replace(substr(trim(pCedula),1,length(trim(pCedula))-1)||'-'||substr(trim(pCedula),length(trim(pCedula)),1),'--','-') where codempresa=pNO_CIA and cod_cliente=pCOD_CLIENTE; COMMIT; ELSE id_resultado := 4; -- El cliente no existe. Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); END IF; END; PROCEDURE BAJA_CLIENTE(pNO_CIA IN VARCHAR2, pNO_CLIENTE IN VARCHAR2, pFECHA_BAJA date, pMOTIVO VARCHAR2, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2) IS BEGIN id_resultado := 0; -- Resultado exitoso Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); UPDATE arccmc set F_CIERRE=pFECHA_BAJA, MOTIVO=pMotivo WHERE NO_CIA = pNO_CIA AND NO_CLIENTE= pNO_CLIENTE; COMMIT; END; PROCEDURE ASIGNAR_GRUPOFAC(pcia number, pcliente number, pUSUARIO_INGRESO VARCHAR2, pNOMBRE_FISCAL VARCHAR2,PDIRECCION_FACTURA VARCHAR2) is BEGIN BEGIN insert into sso_fgcf(CODEMPRESA, COD_CLIENTE, GRUPOFACTURA, NOMBREGRUPO, NOMBRECLIENTE, DIRECCION, NIT, TELEFONO, ENCABEZADOGRUPO, TIPODETALLE, PIEDETALLE, CICLO, EJECUTIVO, TIPOCLIENTE, GRUPOCONTABLE, ACTIVO, LEYENDA, MONEDA_IMPRESION) select no_cia, no_cliente, 1, -- grupofactura 1, -- nombre grupo pNOMBRE_FISCAL, PDIRECCION_FACTURA, cedula, telefono, 'Cobro por servicios correspondientes al mes de <%1>', --ENCABEZADOGRUPO 0, --TIPODETALLE null, --PIEDETALLE 17, -- ciclo substr(pUSUARIO_INGRESO,1,20), -- Ejecutivo DECODE(CLIENTE_NACIONAL,'S','L','I'), -- tipocliente(ESTA CLASIFICACION ES UNICAMENTE L/I) GRUPO, --grupocontable 'S', -- activo 'S', -- leyenda moneda_limite from arccmc where to_number(no_cliente)=pcliente and to_number(no_cia)=pcia and not exists( select * -- crea el grupo de facturacion 1, solamente si no existe para ese cliente from sso_fgcf where cod_cliente=pcliente and codempresa=pcia and grupofactura=1); exception when others then null; END; END; PROCEDURE GENERA_COBRO_INS(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pINSTALACION_NAF NUMBER, pNOTRANSACCION_NAF NUMBER, pTIPOSERVICIO VARCHAR2, pVINSTALACION NUMBER /*Para el uso de soluciones*/ ,pIdSolucion Varchar2 Default Null) IS LC_Solucion Varchar2(400); BEGIN If pIdSolucion Is Not Null Then LC_Solucion := Substr(PIdSolucion, Instr(pIdSolucion, '-')+1); LC_Solucion := '9990'||LC_Solucion; End if; INSERT INTO SSO_FDIN( CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION,CODMONEDA, ORDEN,DESCRIPCION,CANTIDAD,VINSTALACION,NOCUOTAS,TOTALCUOTAS,VMENSUAL,VACUMULADO,TIPOFACTURACION,FECHA, FACTURA,PRODUCTO,COD_CATEGORIA,PROXIMAFACTURA,CICLOFACTURACION,PERIODICIDAD,USUARIO_INGRESO,FECHA_INGRESO,OBSERVACIONES,FINFACTURACION, CODPRODUCTO,CODANCHOBANDA,NO_FACTU,CENTRO,BODEGA,SUBCLIENTE,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI,GEOGRAFIA_PUNTO_FIN, GENERA_COMISION,NO_VENDEDOR,PRODUCTO_INI,PRODUCTO_FIN,ALTA_FACTURACION,FECHA_IMPRESION,PREFACTURADO,ACTIVO,FECHA_BAJA,PUNTO_INICIO, PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,MOTIVO_BAJA,OBSERVACIONES_ADMINISTRATIVAS,OBSERVACIONES_TECNICAS,ENCARGADO_CARTERA,ENCARGADO_BAJA,PERIODO_INICIO,FECHA_INICIO_FACTURACION, FECHA_AUTORIZACION_FACTURACION,HAY_DIFERENCIAL,FECHA_PREAUTORIZACION,FECHA_AUTORIZA_BAJA,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,CODCLIENTE_PADRE,CODEMPRESA_PADRE, ES_SPLIT) SELECT CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO, --INSTALACION, LC_Solucion, NOTRANSACCION,'INS',GRUPOFACTURA,CODTRANSACCION,CODMONEDA, ORDEN,DESCRIPCION,CANTIDAD,pVINSTALACION,NOCUOTAS,TOTALCUOTAS,pVINSTALACION,VACUMULADO,TIPOFACTURACION,FECHA, FACTURA,PRODUCTO,COD_CATEGORIA,PROXIMAFACTURA,CICLOFACTURACION,PERIODICIDAD,USUARIO_INGRESO,FECHA_INGRESO,OBSERVACIONES,FINFACTURACION, CODPRODUCTO,CODANCHOBANDA,NO_FACTU,CENTRO,BODEGA,SUBCLIENTE,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI,GEOGRAFIA_PUNTO_FIN, GENERA_COMISION,NO_VENDEDOR,PRODUCTO_INI,PRODUCTO_FIN,ALTA_FACTURACION,FECHA_IMPRESION,PREFACTURADO,ACTIVO,FECHA_BAJA,PUNTO_INICIO, PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,MOTIVO_BAJA,OBSERVACIONES_ADMINISTRATIVAS,OBSERVACIONES_TECNICAS,ENCARGADO_CARTERA,ENCARGADO_BAJA,PERIODO_INICIO,FECHA_INICIO_FACTURACION, FECHA_AUTORIZACION_FACTURACION,HAY_DIFERENCIAL,FECHA_PREAUTORIZACION,FECHA_AUTORIZA_BAJA,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,CODCLIENTE_PADRE,CODEMPRESA_PADRE, ES_SPLIT FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION_NAF AND NOTRANSACCION=pNOTRANSACCION_NAF AND TIPOSERVICIO=pTIPOSERVICIO AND ACTIVO='S'; exception when no_data_found then null; END; FUNCTION OBTENER_CODANCHOBANDA(pCODEMPRESA NUMBER, pCODPRODUCTO VARCHAR2, pANCHO_BANDA VARCHAR2) RETURN varchar2 IS CURSOR CUR_AB IS select CODANCHOBANDA from ctl_anchobanda where codempresa=pCODEMPRESA and codproducto=pCODPRODUCTO and UPPER(descripcion)=UPPER(pANCHO_BANDA); v_codanchobanda ctl_anchobanda.codanchobanda%type; BEGIN OPEN CUR_AB; FETCH CUR_AB into v_codanchobanda; IF CUR_AB%NOTFOUND THEN select nvl(max(to_number(CODANCHOBANDA)),0)+1 into v_codanchobanda from ctl_anchobanda where codempresa=pCODEMPRESA AND TRIM(TRANSLATE(CODANCHOBANDA,'0123456789', ' ')) IS NULL and codproducto=pCODPRODUCTO; insert into ctl_anchobanda(CODEMPRESA,CODPRODUCTO,CODANCHOBANDA,DESCRIPCION,PRODCODE,ABCODE,ACTIVO,CATEGORIA,PESO) values(pCODEMPRESA,pCODPRODUCTO,v_codanchobanda,pANCHO_BANDA,0,0,'S',0,0); END IF; CLOSE CUR_AB; RETURN v_codanchobanda; END; FUNCTION VALIDA_CAMBIO_PRECIO(pCODEMPRESA NUMBER,pEnlace number,pNoTransaccion number,pCODCLIENTE NUMBER,pTIPOSERVICIO varchar2,pPROXIMAFACTURA DATE) RETURN NUMBER IS v_resultado NUMBER; CURSOR CUR_FPROXIMA_FAC IS SELECT PROXIMAFACTURA FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pEnlace AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO=pTIPOSERVICIO AND ACTIVO='S'; V_PROXIMAFAC_ACTUAL DATE; BEGIN select count(*) into v_resultado from sso_fdin where codempresa=pCODEMPRESA and CODCLIENTE=pCODCLIENTE and instalacion=pEnlace and notransaccion=pNoTransaccion and prefacturado='S' and activo='S'; IF NVL(v_resultado,0) > 0 THEN RETURN(14); --'Operación Fallida, El enlace tiene una prefactura generada, debe reversar o generar la factura previo a esta transacción...' END IF; OPEN CUR_FPROXIMA_FAC; FETCH CUR_FPROXIMA_FAC into V_PROXIMAFAC_ACTUAL; IF CUR_FPROXIMA_FAC%FOUND THEN IF TO_CHAR(V_PROXIMAFAC_ACTUAL,'DD/MM/YYYY') <> TO_CHAR(pPROXIMAFACTURA,'DD/MM/YYYY') THEN --CLOSE CUR_FPROXIMA_FAC; --RETURN(15); null; -- se quito la validacion de la fecha en cambio de precio END IF; ELSE CLOSE CUR_FPROXIMA_FAC; RETURN(7); END IF; CLOSE CUR_FPROXIMA_FAC; RETURN(0); END; PROCEDURE REGISTRO_DE_RESPUESTA(Pid_resultado NUMBER,PDesc_resultado VARCHAR2,PCorrelativo_hist NUMBER) IS BEGIN update arfa_hist_param set id_resultado=Pid_resultado, --desc_resultado=PDesc_resultado desc_resultado=desc_resultado||' - '||PDesc_resultado||' - hora fin:'||to_char(sysdate,'dd/mm/yyyy hh24:mi:ss') where correlativo=PCorrelativo_hist; END; PROCEDURE REGISTRO_DE_TRANSACCION(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pCONTRATO NUMBER, pANEXO NUMBER, pINSTALACION_SIEBEL VARCHAR2, pNOTRANSACCION_SIEBEL VARCHAR2, pTIPOSERVICIO VARCHAR2, pCODTRANSACCION VARCHAR2, pCODMONEDA VARCHAR2, pDESCRIPCION VARCHAR2, pCANTIDAD NUMBER, pVINSTALACION NUMBER, pVMENSUAL NUMBER, pFECHA DATE, pProducto Varchar2, pPROXIMAFACTURA DATE, pUSUARIO_INGRESO VARCHAR2, pFECHA_INGRESO DATE, pCODPRODUCTO VARCHAR2, pCODANCHOBANDA VARCHAR2, pCENTRO VARCHAR2, pBODEGA VARCHAR2, pANCHO_BANDA VARCHAR2, pGEOGRAFIA_VENTA VARCHAR2, pGEOGRAFIA_PUNTO_INI VARCHAR2, pGEOGRAFIA_PUNTO_FIN VARCHAR2, pACTIVO VARCHAR2, pPUNTO_INICIO VARCHAR2, pPUNTO_FINAL VARCHAR2, pPAIS_INICIAL VARCHAR2, pPAIS_FINAL VARCHAR2, pPERIODO_INICIO NUMBER, pSPLIT VARCHAR2, -- P=padre, H=hijo, N= no aplica pINSTALACION_PADRE IN NUMBER, -- Numero de instalacion del padre cuando es split pNOTRANSACCION_PADRE IN NUMBER, --Numero de transaccion del padre cuando es split pCODEMPRESA_PADRE NUMBER, -- Codigo de empresa del padre cuand es split pCODCLIENTE_PADRE NUMBER, -- Codigo del cliente padre cuando es split pCODEMPRESA_NUEVA NUMBER, -- Nueva Empresa para la transaccion de cambio de cliente 'CC=cambio de cliente a enlace' pCODCLIENTE_NUEVO NUMBER, -- Nuevo cliente para la transaccion de cambio de cliente 'CC=cambio de cliente a enlace' pINSTALACION_NAF IN OUT NUMBER, pNOTRANSACCION_NAF IN OUT NUMBER, pId_BUNDLE VARCHAR2, pAplicaDesc varchar2, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2, pFecha_ini_fac in out date, /*Parámetros para el proyecto de Soluciones*/ FechaPactada IN DATE, TipoFactura IN VARCHAR2, NombreSucursal IN VARCHAR2, DireccionLineaUno IN VARCHAR2, DireccionLineaDos IN VARCHAR2, DireccionLineaTres IN VARCHAR2, Pais IN VARCHAR2, Departamento IN VARCHAR2, Municipio IN VARCHAR2, pIDsolucion IN VARCHAR2, DetalleFactura IN VARCHAR2, PagoUnico IN VARCHAR2, Plazo IN NUMBER ) IS BEGIN /*Se invovca el procedimiento standard que se usaba antes de soluciones*/ pkg_fact_naf.REGISTRO_DE_TRANSACCION(pCODEMPRESA, pCODCLIENTE, pCONTRATO, pANEXO, pINSTALACION_SIEBEL, pNOTRANSACCION_SIEBEL, pTIPOSERVICIO, pCODTRANSACCION, pCODMONEDA, pDESCRIPCION, pCANTIDAD, pVINSTALACION, pVMENSUAL, pFECHA, pProducto, pPROXIMAFACTURA, pUSUARIO_INGRESO, pFECHA_INGRESO, pCODPRODUCTO, pCODANCHOBANDA, pCENTRO, pBODEGA, pANCHO_BANDA, pGEOGRAFIA_VENTA, pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN, pACTIVO, pPUNTO_INICIO, pPUNTO_FINAL, pPAIS_INICIAL, pPAIS_FINAL, pPERIODO_INICIO, pSPLIT, -- P=padre, H=hijo, N= no aplica pINSTALACION_PADRE, -- Numero de instalacion del padre cuando es split pNOTRANSACCION_PADRE, --Numero de transaccion del padre cuando es split pCODEMPRESA_PADRe, -- Codigo de empresa del padre cuand es split pCODCLIENTE_PADRE, -- Codigo del cliente padre cuando es split pCODEMPRESA_NUEVA, -- Nueva Empresa para la transaccion de cambio de cliente 'CC=cambio de cliente a enlace' pCODCLIENTE_NUEVO, -- Nuevo cliente para la transaccion de cambio de cliente 'CC=cambio de cliente a enlace' pINSTALACION_NAF, pNOTRANSACCION_NAF, pId_BUNDLE, pAplicaDesc, id_resultado, Desc_resultado, pFecha_ini_fac, pIDsolucion); /*Proceso de la parte de solución*/ If Id_Resultado = 0 Then Begin Insert Into sso_adenda (idsolucion, tipoadenda, activoscrm, activosnaf, codempresa, codcliente, instalacion, tiposervicio, notransaccion) Values (pIDsolucion, TipoFactura, 0, 0, pCODEMPRESA, pCODCLIENTE, pINSTALACION_SIEBEL, pTIPOSERVICIO, pCODTRANSACCION); Exception When dup_val_on_Index Then Update Sso_Adenda SEt tipoAdenda = TipoFactura Where idsolucion = pIDsolucion And codempresa = pCODEMPRESA And codcliente = pCODCLIENTE And instalacion = pINSTALACION_SIEBEL And tiposervicio = pTIPOSERVICIO And notransaccion =pCODTRANSACCION; End; Insert into sso_fdin_det_sol(id_solucion, codempresa, codcliente, instalacion, tiposervicio, notransaccion, tipofactura, nombresucursal, dirección, pais, departamento, municipio, idbundle, detallefactura, pagounico, plazo) Values (pIdSolucion, PCodEmpresa, PCodCliente, pINSTALACION_SIEBEL, pTipoServicio, pCodTransaccion, TipoFactura, NombreSucursal, DireccionLineaUno||DireccionLineaDos||DireccionLineaTres, Pais, Departamento, Municipio, pId_BUNDLE, DetalleFactura, PagoUnico, Plazo); End If; END; -- END DEL PROCEDIMIENTO FUNCTION EXISTE_ENLACE_ACTIVO(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pINSTALACION NUMBER, pNOTRANSACCION NUMBER, pCODTRANSACCION varchar2, pGrupo_fac in out number, pProducto in out number) RETURN BOOLEAN IS tmp_instalacion sso_fdin.instalacion%type; BEGIN BEGIN SELECT INSTALACION,grupofactura,producto INTO tmp_instalacion,pGrupo_Fac,pproducto from sso_fdin WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND ACTIVO=DECODE(pCODTRANSACCION,'REA','N','CB',activo,'S') AND TIPOSERVICIO='ENL'; EXCEPTION WHEN NO_DATA_FOUND THEN return FALSE; -- EL ENLACE NO EXISTE WHEN TOO_MANY_ROWS THEN return TRUE; -- existe mas de un enlace. END; RETURN TRUE; -- SI EXISTE EL ENLACE END; FUNCTION VERIFICA_DET_ERROR(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pINSTALACION NUMBER, pNOTRANSACCION NUMBER, pCODTRANSACCION varchar2, pFECHA_BAJA DATE, Desc_resultado IN OUT VARCHAR2) RETURN NUMBER IS CURSOR CUR_FDIN IS SELECT PROXIMAFACTURA,ACTIVO FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO='ENL' AND ACTIVO='S'; VPROXIMA_fAC DATE; vEstado varchar2(2); CURSOR CUR_ENLACE IS SELECT CODEMPRESA,CODCLIENTE FROM SSO_FDIN WHERE INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO='ENL' AND ACTIVO='S'; CURSOR CUR_ENLACE_notran IS SELECT CODEMPRESA,CODCLIENTE,NOTRANSACCION FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND INSTALACION=pINSTALACION AND TIPOSERVICIO='ENL' AND ACTIVO='S'; vEmpresa sso_fdin.codempresa%type:=0; vcliente sso_fdin.codcliente%type:=0; vnotran number:=0; BEGIN OPEN CUR_FDIN; FETCH CUR_FDIN into VPROXIMA_fAC,vEstado; IF CUR_FDIN%NOTFOUND THEN --NO SE ENCONTRO EL ENLACE CLOSE CUR_FDIN; OPEN CUR_ENLACE; FETCH CUR_ENLACE into vEmpresa,vcliente; CLOSE CUR_ENLACE; IF NVL(vEmpresa,0)>0 AND NVL(vcliente,0)>0 AND (vcliente!=pCODCLIENTE OR vEmpresa!=pCODEMPRESA) THEN Desc_resultado:=GET_MSG_DESCRIPTION(18)||vcliente; --La fecha de baja ingresada no es válida. Se recomienda colocar una fecha posterior a return(18); -- la fecha debe ser MENOR END IF; OPEN CUR_ENLACE_notran; FETCH CUR_ENLACE_notran into vEmpresa,vcliente,vnotran; CLOSE CUR_ENLACE_notran; --Desc_resultado:='RESULTADO:'||vEmpresa||'-'||vcliente||vnotran; --RETURN(100); IF vcliente=pCODCLIENTE and vEmpresa=pCODEMPRESA and vnotran <> pNOTRANSACCION and nvl(vnotran,0) >0 THEN Desc_resultado:=GET_MSG_DESCRIPTION(19)||pNOTRANSACCION||'. Debería tener el número de instalación '||vnotran; --La fecha de baja ingresada no es válida. Se recomienda colocar una fecha posterior a return(19); -- la fecha debe ser MENOR END IF; Desc_resultado:=GET_MSG_DESCRIPTION(7); return(7); -- ENLACES NO EXISTE else -- si encontro el enlace CLOSE CUR_FDIN; IF To_number( To_char(pFECHA_BAJA, 'YYYYMM')) < To_number( To_char( VPROXIMA_fAC, 'YYYYMM') ) AND Trunc(pFECHA_BAJA) != Last_day( Add_months( VPROXIMA_fAC, -1)) THEN Desc_resultado:=GET_MSG_DESCRIPTION(17)||Last_day( Add_months( VPROXIMA_fAC, -1)); --La fecha de baja ingresada no es válida. Se recomienda colocar una fecha posterior a return(17); -- la fecha debe ser MENOR END IF; END IF; RETURN 0; -- SI EXISTE EL ENLACE END; PROCEDURE BAJA_DE_ENLACE(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pINSTALACION NUMBER, pNOTRANSACCION NUMBER, pTIPOSERVICIO VARCHAR2, pCODTRANSACCION VARCHAR2, pFECHA_BAJA DATE, pMOTIVO_BAJA VARCHAR2, pENCARGADO_BAJA VARCHAR2, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2) IS vGrupo_Fac number; v_Correlativo_hist number; vEstado SSO_FDIN.ACTIVO%TYPE; CURSOR CUR_estado IS SELECT ACTIVO FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO='ENL' AND ACTIVO='N'; V_PRODUCTO_CONTABLE number; BEGIN -- MEJORAS BAJA IF pCODTRANSACCION = 'B' THEN id_resultado := VERIFICA_DET_ERROR(pCODEMPRESA,pCODCLIENTE,pINSTALACION,pNOTRANSACCION,pCODTRANSACCION,pFECHA_BAJA,Desc_resultado); IF NVL(id_resultado,0) > 0 THEN GOTO FIN_TRANSACCION; END IF; END IF; IF pCODTRANSACCION = 'CB' THEN OPEN CUR_estado; FETCH CUR_estado into vEstado; IF CUR_estado%FOUND THEN -- CLOSE CUR_estado; id_resultado := 20; --El enlace esta Inactivo debe hacer una reactivacion de enlace Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FIN_TRANSACCION; END IF; CLOSE CUR_estado; END IF; -- FIN DE MEJORAS BAJA id_resultado := 0; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); IF EXISTE_ENLACE_ACTIVO(pCODEMPRESA,pCODCLIENTE,pINSTALACION,pNOTRANSACCION,pCODTRANSACCION,vGrupo_Fac,V_PRODUCTO_CONTABLE) or pCODTRANSACCION='BREA' THEN IF pCODTRANSACCION = 'CB' THEN -- CANCELACION DE BAJA UPDATE SSO_FDIN SET FECHA_BAJA =NULL, FECHA_AUTORIZA_BAJA=NULL, MOTIVO_BAJA =NULL, ENCARGADO_BAJA=NULL, CODTRANSACCION=NVL(ultimo_codtransaccion,'CB'), fecha_cancelacion_baja=SYSDATE --ACTIVO=DECODE(pCODTRANSACCION,'B','S','N'), WHERE CODEMPRESA =pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO=pTIPOSERVICIO --AND TIPOSERVICIO='ENL' AND CODTRANSACCION='B' AND FECHA_BAJA IS NOT NULL; --AND ACTIVO='S'; GOTO FIN_TRANSACCION; END IF; --- SI LLEGO AQUI ES PORQUE NO ES CANCELACION NI REACTIVACION, ES UNA BAJA BEGIN UPDATE SSO_FDIN SET FECHA_BAJA =pFECHA_BAJA, MOTIVO_BAJA =pMOTIVO_BAJA, ENCARGADO_BAJA=pENCARGADO_BAJA, CODTRANSACCION=pCODTRANSACCION, ACTIVO=DECODE(pCODTRANSACCION,'B','S','N'), FECHA_AUTORIZA_BAJA=DECODE(pCODTRANSACCION,'B',SYSDATE,NULL), fecha_baja_programada=pFECHA_BAJA, ultimo_codtransaccion=CODTRANSACCION WHERE CODEMPRESA =pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION AND NOTRANSACCION=pNOTRANSACCION AND TIPOSERVICIO=pTIPOSERVICIO --AND TIPOSERVICIO='ENL' AND ACTIVO='S'; GOTO FIN_TRANSACCION; END; ELSE id_resultado := 7; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||'(cia:'||pCODEMPRESA||' cli:'||pCODCLIENTE||' inst:'||pINSTALACION||' trans:'||pNOTRANSACCION||' tserv:'||pTIPOSERVICIO||')'; --Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||'(ENL: '||pINSTALACION||' NOTRAN: '||pNOTRANSACCION||')'; GOTO FIN_TRANSACCION; END IF; <> if nvl(id_resultado,0)=0 AND pCODTRANSACCION NOT IN ('B','CB')then --rollback; --REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado,v_Correlativo_hist); commit; end if; IF pCODTRANSACCION in ('B','CB') THEN -- mejora bajas IF pCODTRANSACCION='B' and nvl(id_resultado,0)=0 THEN select Desc_resultado||' (ESTADO DEL ENLACE: '||DECODE(ACTIVO,'S','ACTIVO','INACTIVO')||', FECHA BAJA: '||TO_CHAR(pFECHA_BAJA,'DD/MM/YYYY')||', FECHA PROXIMA FAC:'||TO_CHAR(PROXIMAFACTURA,'DD/MM/YYYY')||')' into Desc_resultado from sso_fdin where codempresa=pCODEMPRESA and instalacion=pINSTALACION and notransaccion=pNOTRANSACCION and codcliente=pCODCLIENTE and tiposervicio='ENL'; END IF; -- fin de mejora bajas v_Correlativo_hist:=SEC_HIST_PARAM_FA.NEXTVAL; BEGIN INSERT INTO ARFA_HIST_PARAM (Correlativo,CODEMPRESA,CODCLIENTE,TIPOSERVICIO, CODTRANSACCION,INSTALACION_NAF,NOTRANSACCION_NAF,FECHA, DESCRIPCION,id_resultado,Desc_resultado) VALUES (v_Correlativo_hist,pCODEMPRESA,pCODCLIENTE,pTIPOSERVICIO, pCODTRANSACCION,pINSTALACION,pNOTRANSACCION,pFECHA_BAJA, pMOTIVO_BAJA,id_resultado,Desc_resultado); EXCEPTION WHEN OTHERS THEN NULL; END; COMMIT; END IF; END; FUNCTION VALIDAR_ENLACE(pCODEMPRESA NUMBER, -- codigo de la empresa pCODCLIENTE NUMBER, -- codigo del cliente pINSTALACION NUMBER, -- condigo del enlace pNOTRANSACCION NUMBER, -- codigo de la orden de trabajo(SR de siebel) pTIPOSERVICIO VARCHAR2, -- ('ENL','INS','PRO') pTIPO_VALIDACION NUMBER -- 1=Validar meses facturado y pagadas; 2=Facturas pendientes de pago ) RETURN NUMBER IS v_salida number; v_Fecha date; BEGIN -- Selecciono la fecha de la ultima renovacion SELECT max(fecha) INTO v_Fecha from sso_fdin where instalacion=pINSTALACION and codtransaccion like '%R%'; IF v_Fecha IS NULL THEN select min(fecha) INTO v_Fecha from sso_fdin where instalacion=pINSTALACION and tiposervicio='ENL'; END IF; IF pTIPO_VALIDACION = 1 THEN -- Cantidad de facturas pagadas de este enlace SELECT COUNT(DISTINCT A.NO_FACTU) INTO v_salida FROM arfafe a, ARFAFL b, arccmd c WHERE b.instalacion=pINSTALACION AND a.no_cia=b.no_cia AND a.no_factu=b.no_factu AND A.serie_fisico!='PREF' AND NVL(a.ind_anu_Dev,'X') !='A' AND a.no_factu=c.no_docu AND NVL(c.saldo,0) =0 AND a.fecha_Servicio>=v_Fecha and a.tipo_servicio='ENL'; END IF; IF pTIPO_VALIDACION = 2 THEN -- la cantidad de facturas pendientes de pago SELECT COUNT(DISTINCT A.NO_FACTU) INTO v_salida FROM arfafe a, ARFAFL b, arccmd c WHERE b.instalacion=pINSTALACION AND a.no_cia=b.no_cia AND a.no_factu=b.no_factu AND A.serie_fisico!='PREF' AND NVL(a.ind_anu_Dev,'X') !='A' AND a.no_factu=c.no_docu AND NVL(c.saldo,0) >0 AND a.tipo_servicio='ENL'; END IF; RETURN(NVL(v_salida,0)); END; PROCEDURE INFO_FACTURACION(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, pINSTALACION NUMBER, pNOTRANSACCION NUMBER, pPROXIMAFACTURA IN OUT DATE, pVMENSUAL IN OUT NUMBER, id_resultado IN OUT NUMBER, Desc_resultado IN OUT VARCHAR2 ) IS CURSOR cur_infofac is select proximafactura, vmensual from sso_fdin where codempresa=pCODEMPRESA and codcliente=pCODCLIENTE and instalacion=pINSTALACION and notransaccion=pNOTRANSACCION and tiposervicio='ENL'; BEGIN id_resultado := 0; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); OPEN cur_infofac; FETCH cur_infofac into pPROXIMAFACTURA,pVMENSUAL; IF cur_infofac%NOTFOUND THEN id_resultado := 7; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); END IF; CLOSE cur_infofac; END; FUNCTION VALIDA_EXENTO_IMP(pCODEMPRESA NUMBER, pCODCLIENTE NUMBER, PCLAVE VARCHAR2, --IV=Iva Venta , IC=Iva Compra PMONTO NUMBER ) RETURN NUMBER IS Vexento varchar2(1); VPORC NUMBER; cursor cur_cliente is SELECT EXcENTO_IMP FROM ARCCMC WHERE NO_CIA=pCODEMPRESA AND NO_CLIENTE=pCODCLIENTE AND EXCENTO_IMP='N'; BEGIN OPEN cur_cliente; FETCH cur_cliente into Vexento; IF cur_cliente%NOTFOUND THEN CLOSE cur_cliente; RETURN PMONTO; END IF; CLOSE cur_cliente; BEGIN select nvl(PORCENTAJE,0)/100 INTO VPORC FROM arcghimp WHERE NO_CIA=1 AND CLAVE='IV' AND FEC_DESDE=( select MAX(FEC_DESDE) from arcghimp WHERE NO_CIA=1 AND CLAVE='IV'); EXCEPTION WHEN NO_DATA_FOUND THEN RETURN PMONTO; END; RETURN round((PMONTO + (PMONTO * VPORC)),2) ; END; FUNCTION VALIDA_DIAS_GRACIA(pcia number, pfecha_ini date, pDias_Gracia NUMBER ) RETURN DATE IS V_CONTADOR NUMBER:=0; V_FECHA_CALCULADA DATE:=pfecha_ini; CURSOR CUR_FERIADOS(PDIA DATE) IS SELECT DIA FROM FERIADOS WHERE NO_CIA=Pcia AND ANO=to_number(to_char(pdia,'yyyy')) AND TO_CHAR(DIA,'DDMMYYYY')=to_char(pdia,'DDMMYYYY'); V_esferiado date; BEGIN WHILE V_CONTADOR < pDias_Gracia LOOP IF TRIM(to_char(V_FECHA_CALCULADA,'DAY', 'NLS_DATE_LANGUAGE=SPANISH')) IN ('SÁBADO','DOMINGO') THEN V_FECHA_CALCULADA := V_FECHA_CALCULADA + 1; ELSE OPEN CUR_FERIADOS(V_FECHA_CALCULADA); FETCH CUR_FERIADOS into V_esferiado; IF CUR_FERIADOS%NOTFOUND THEN V_CONTADOR := V_CONTADOR + 1; END IF; CLOSE CUR_FERIADOS; V_FECHA_CALCULADA := V_FECHA_CALCULADA + 1; END IF; END LOOP; V_CONTADOR:=0; WHILE V_CONTADOR = 0 LOOP OPEN CUR_FERIADOS(V_FECHA_CALCULADA); FETCH CUR_FERIADOS into V_esferiado; IF CUR_FERIADOS%FOUND THEN V_FECHA_CALCULADA := V_FECHA_CALCULADA + 1; ELSE V_CONTADOR:=1; -- SE SALE DEL CICLO END IF; CLOSE CUR_FERIADOS; END LOOP; IF TRIM(to_char(V_FECHA_CALCULADA,'DAY', 'NLS_DATE_LANGUAGE=SPANISH'))='SÁBADO' THEN V_FECHA_CALCULADA := V_FECHA_CALCULADA + 2; END IF; RETURN V_FECHA_CALCULADA; END; PROCEDURE CANCELA_ACTIVOS_PAGO_UNICO(PCODEMPRESA IN NUMBER, PCODCLIENTE IN NUMBER, PINSTALACION IN NUMBER, PFECHAFACTURA IN DATE) IS -- CURSOR CPLAZO IS SELECT PAGOUNICO, PLAZO FROM SSO_FDIN_DET_SOL WHERE CODEMPRESA = PCODEMPRESA AND CODCLIENTE = PCODCLIENTE AND INSTALACION = PINSTALACION; -- VPAGOUNICO VARCHAR2(5); VPLAZO NUMBER; -- BEGIN OPEN CPLAZO; FETCH CPLAZO INTO VPAGOUNICO, VPLAZO; CLOSE CPLAZO; -- IF VPAGOUNICO = 'Y' AND VPLAZO = 0 THEN UPDATE SSO_FDIN SET ACTIVO = 'N', FECHA_BAJA = NVL(FECHA_ULTIMA_FAC,TRUNC(SYSDATE)), MOTIVO_BAJA = 'Vencimiento plazo pago único para soluciones.', PROXIMAFACTURA = PFECHAFACTURA WHERE CODEMPRESA = PCODEMPRESA AND CODCLIENTE = PCODCLIENTE AND INSTALACION = PINSTALACION; ELSIF VPAGOUNICO = 'Y' AND VPLAZO > 0 THEN UPDATE SSO_FDIN SET PROXIMAFACTURA = ADD_MONTHS(PFECHAFACTURA,12) WHERE CODEMPRESA = PCODEMPRESA AND CODCLIENTE = PCODCLIENTE AND INSTALACION = PINSTALACION; END IF; -- COMMIT; -- END; -- END; -- PKG_FACT_NAF_SOL; /