CREATE OR REPLACE PACKAGE BODY NAF47.PKG_FACT_NAF AS /****************************************************************************** NAME: PKG_FACT_NAF PURPOSE: REVISIONS: Ver Date Author Description --------- ---------- --------------- ------------------------------------ 1.0 25/05/2016 etajanel 1. Created this package body. ******************************************************************************/ 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.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) IS BEGIN 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,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, pIdSolucion Varchar2 Default Null) IS ndias_prop number; --nMonto_Prop number; dfecha_facturacion date; vCliente number; V_diferencial number; CURSOR cur_cli is SELECT NO_CLIENTE FROM ARCCMC WHERE TO_NUMBER(NO_CIA)=pCODEMPRESA AND TO_NUMBER(NO_CLIENTE)=pCODCLIENTE; CURSOR cur_grupo_cli is SELECT grupo FROM ARCCMC WHERE TO_NUMBER(NO_CIA)=pCODEMPRESA AND TO_NUMBER(NO_CLIENTE)=pCODCLIENTE; CURSOR CUR_ENL IS SELECT INSTALACION FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION_SIEBEL=pINSTALACION_SIEBEL AND NOTRANSACCION_SIEBEL=pNOTRANSACCION_SIEBEL AND TIPOSERVICIO=pTIPOSERVICIO; --INICIO MODIFICACION 2019/01/24 MMONTENEGROP, SE AGREGA MONEDA Y VMENSUAL CURSOR CUR_FPROXIMA_FAC IS SELECT PROXIMAFACTURA,DESCRIPCION,ANCHO_BANDA, CODMONEDA, VMENSUAL,fecha_ini_fac FROM SSO_FDIN WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION_NAF AND NOTRANSACCION=pNOTRANSACCION_NAF AND TIPOSERVICIO=pTIPOSERVICIO AND ACTIVO=DECODE(pCODTRANSACCION,'REA','N','S'); --FINAL DE MODIFICACION 2019/01/24 CURSOR CUR_PRODUCTO IS SELECT DESCRIPCION FROM CTL_PRODUCTO WHERE CODEMPRESA=pCODEMPRESA AND CODPRODUCTO=PCODPRODUCTO AND ACTIVO='S'; venlace number:=0; NOTRANSACCION_BAJA NUMBER; vGrupo_Fac number; v_monto_mensual number; v_monto_mensual_ins number; V_FECHA_PROXIMAF DATE; V_FECHA_ACTUAL DATE; v_descpricion_fact sso_fdin.descripcion%type; v_descri_producto ctl_producto.descripcion%type; V_ANCHO_BANDA sso_fdin.ancho_banda%type; v_codanchobanda sso_fdin.codanchobanda%type; v_Correlativo_hist number; vEXISTE_INS_PENDIENTE_COBRO NUMBER; pFechaProp DATE; pFechaEnlace DATE; --Modificacion 2019/01/24 mmontenegrop, se agregan 2 variables para precio y moneda de reactivacion (ultima facturacion) v_precio_rea number; v_moneda_rea varchar2(5); --Fin modificacion 2019/01/24 V_PRODUCTO_CONTABLE SSO_FCTA.TIPOPRODUCTO%TYPE; v_grupo arccmc.grupo%type; BEGIN v_Correlativo_hist:=SEC_HIST_PARAM_FA.NEXTVAL; BEGIN INSERT INTO ARFA_HIST_PARAM (Correlativo,CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,TIPOSERVICIO,CODTRANSACCION,CODMONEDA, DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,Producto,PROXIMAFACTURA,USUARIO_INGRESO,FECHA_INGRESO,CODPRODUCTO, CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI,GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL, PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,SPLIT,INSTALACION_PADRE,NOTRANSACCION_PADRE,CODEMPRESA_PADRE,CODCLIENTE_PADRE,CODEMPRESA_NUEVA,CODCLIENTE_NUEVO, INSTALACION_NAF,NOTRANSACCION_NAF,id_resultado,Desc_resultado,Id_BUNDLE,AplicaDesc) VALUES(v_Correlativo_hist,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,pINSTALACION_PADRE,pNOTRANSACCION_PADRE,pCODEMPRESA_PADRE,pCODCLIENTE_PADRE,pCODEMPRESA_NUEVA,pCODCLIENTE_NUEVO,pINSTALACION_NAF, pNOTRANSACCION_NAF,id_resultado,Desc_resultado||'Hora ini:'||to_char(sysdate,'dd/mm/yyyy hh24:mi:ss'),pId_BUNDLE,pAplicaDesc); EXCEPTION WHEN OTHERS THEN NULL; END; commit; IF NVL(pINSTALACION_NAF,0) = 0 THEN id_resultado := 9; --Operación Fallida, El numero de enlace no puede ser nulo... Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FINALIZAR_TRANSACCION; END IF; IF NVL(pCODPRODUCTO,'x') = 'x' THEN id_resultado := 10; --Operación Fallida, El código de producto no puede ser nulo... Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FINALIZAR_TRANSACCION; END IF; IF Existe_Cliente_Activo(pCODEMPRESA_NUEVA,pCODCLIENTE_NUEVO)=0 AND pCODTRANSACCION = 'CC' THEN -- VALIDA QUE EXISTA EL CLIENTE DESTINO EN CC(Sesion y traspaso) id_resultado:=12; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||' ( empresa:'||pCODEMPRESA_NUEVA||' , Cliente:'||pCODCLIENTE_NUEVO||' )'; GOTO FINALIZAR_TRANSACCION; END IF; IF NVL(pVMENSUAL,0) <= 0 THEN id_resultado := 13; --Operación Fallida, El precio debe ser mayor a cero... Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FINALIZAR_TRANSACCION; END IF; IF pCODTRANSACCION = 'CP' THEN id_resultado:=VALIDA_CAMBIO_PRECIO(pCODEMPRESA,pInstalacion_NAF,pNoTransaccion_NAF,pCODCLIENTE,pTIPOSERVICIO,pPROXIMAFACTURA); IF nvl(id_resultado,0)>0 THEN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FINALIZAR_TRANSACCION; END IF; END IF; IF pCODTRANSACCION IN ('A','U','D','TU','TUR','TR','T','CAP','TD','TDR','UR','DR','RA','CP','REA') THEN OPEN cur_grupo_cli; FETCH cur_grupo_cli into v_grupo; CLOSE cur_grupo_cli; SELECT NVL(MAX(TIPOPRODUCTO),0) INTO V_PRODUCTO_CONTABLE from sso_fcta where codempresa=pCODEMPRESA and tipocliente=v_grupo and codproducto=pCODPRODUCTO; IF nvl(V_PRODUCTO_CONTABLE,0)=0 THEN id_resultado := 21; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); GOTO FINALIZAR_TRANSACCION; END IF; END IF; IF pCODTRANSACCION = 'AB' THEN UPDATE SSO_FDIN SET ID_BUNDLE = PID_BUNDLE WHERE CODEMPRESA=pCODEMPRESA AND CODCLIENTE=PCODCLIENTE AND INSTALACION=pINSTALACION_NAF AND NOTRANSACCION=pNOTRANSACCION_NAF AND TIPOSERVICIO='ENL' AND ACTIVO='S'; id_resultado := 0; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado,v_Correlativo_hist); COMMIT; GOTO FINALIZAR_TRANSACCION; END IF; -- Busca el codigo del ancho de banda basada en la descripcion del ancho de banda v_codanchobanda:=OBTENER_CODANCHOBANDA(pCODEMPRESA,pCODPRODUCTO,pANCHO_BANDA); --pPROXIMAFACTURA:=SYSDATE; -- ESTO ES SOLO PARA LA DEMO IF pCODTRANSACCION = 'A' THEN -- CUANDO SE IMPLEMENTE LOS DIAS DE GRACIA SOLO SE DEBE CAMBIAR LOS DIAS POR EL '0' V_FECHA_PROXIMAF:=VALIDA_DIAS_GRACIA(pCODEMPRESA,pPROXIMAFACTURA,6); pfecha_ini_fac:=V_FECHA_PROXIMAF; --IF TO_CHAR(V_FECHA_PROXIMAF,'MMYYYY')!=TO_CHAR(pPROXIMAFACTURA,'MMYYYY') THEN -- CAMBIO DE MES CON LOS 6 DIAS DE GRACIA IF TO_CHAR(V_FECHA_PROXIMAF,'DD')='01' THEN --dfecha_facturacion:=last_Day(V_FECHA_PROXIMAF)+1; dfecha_facturacion:=V_FECHA_PROXIMAF; ELSE dfecha_facturacion:=last_Day(V_FECHA_PROXIMAF)+1; END IF; --END IF; ELSE -- ES UNA TRANSACCION POSTVENTA V_FECHA_PROXIMAF:=pPROXIMAFACTURA; --pfecha_ini_fac:=V_FECHA_PROXIMAF; pfecha_ini_fac:=null; --agregado para validar diferencial con nuevo procedimiento pFechaProp:=pPROXIMAFACTURA; IF TO_CHAR(V_FECHA_PROXIMAF,'DD')='01' THEN dfecha_facturacion:=V_FECHA_PROXIMAF; ELSE dfecha_facturacion:=last_Day(V_FECHA_PROXIMAF)+1; END IF; OPEN CUR_FPROXIMA_FAC; FETCH CUR_FPROXIMA_FAC into V_FECHA_ACTUAL,v_descpricion_fact,V_ANCHO_BANDA, v_moneda_rea, v_precio_rea,pfecha_ini_fac; IF CUR_FPROXIMA_FAC%FOUND AND pCODTRANSACCION!='REA'THEN dfecha_facturacion := V_FECHA_ACTUAL; END IF; CLOSE CUR_FPROXIMA_FAC; v_descpricion_fact:=REPLACE(v_descpricion_fact,V_ANCHO_BANDA,pANCHO_BANDA); END IF; id_resultado := 0; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); -- esta funcion regresa el monto con su respectivo impuesto si el cliente no es exento de impuesto. v_monto_mensual:=VALIDA_EXENTO_IMP(pCODEMPRESA,pCODCLIENTE,'IV',pVMENSUAL); v_monto_mensual_ins:=VALIDA_EXENTO_IMP(pCODEMPRESA,pCODCLIENTE,'IV',pVINSTALACION); IF pAplicaDesc='0' THEN --Se contruye la descripcion IF TRIM(pANCHO_BANDA)='0' THEN v_descpricion_fact:='('||pINSTALACION_NAF||') '||', '||pDESCRIPCION||', '||pPUNTO_INICIO; ELSE v_descpricion_fact:='('||pINSTALACION_NAF||') '||pANCHO_BANDA||', '||pDESCRIPCION||', '||pPUNTO_INICIO; END IF; v_descpricion_fact:=replace(v_descpricion_fact,',,',','); -- se lequitan dos comas juntas cuando vienen ELSE -- se pone la descripcion que digitaron en Siebel v_descpricion_fact:=pDESCRIPCION; END IF; -- A=ALTA, y no es Hijo IF pCODTRANSACCION = 'A' AND ( pSPLIT !='H' ) THEN OPEN cur_cli; FETCH cur_cli into vCliente; CLOSE cur_cli; IF vCliente = pCODCLIENTE THEN -- SI EXISTE EL CLIENTE OPEN CUR_ENL; FETCH CUR_ENL into venlace; CLOSE CUR_ENL; IF (nvl(venlace,0)=0) THEN -- El enlace no existe por lo tanto se procede a la creacion del mismo. pNOTRANSACCION_NAF:=SIGUENTE_CORRELATIVO(1,'NOTRANSACCION'); -- se comentariza porque al principio aqui se generaba el correlativo, ahora ya viene en el registro -- pINSTALACION_NAF:=SIGUENTE_CORRELATIVO(1,'INSTALACION'); BEGIN INSERT INTO SSO_FDIN (CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,ES_SPLIT,Id_BUNDLE,fecha_ini_fac) VALUES(pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_NAF,pNOTRANSACCION_NAF,pTIPOSERVICIO,1,pCODTRANSACCION, pCODMONEDA,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,v_monto_mensual,pFECHA,dfecha_facturacion,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_NAF, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,DECODE(pSplit,'H','S','P','S',pSplit),pId_BUNDLE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; IF TO_CHAR(V_FECHA_PROXIMAF,'DD')>1 THEN -- SE INSERTA EL PROPORCIONAL -- La cantidad de dias proporcionales ndias_prop:=to_char(last_Day(pPROXIMAFACTURA),'DD')- TO_CHAR(pPROXIMAFACTURA,'DD') + 1; --nMonto_Prop:=v_monto_mensual/to_char(last_Day(pPROXIMAFACTURA),'DD') * ndias_prop; -- inserta el proporcional BEGIN INSERT INTO SSO_FDIN (CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,ES_SPLIT,Id_BUNDLE,fecha_ini_fac) VALUES(pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_NAF,pNOTRANSACCION_NAF,'PRO',1,pCODTRANSACCION, pCODMONEDA,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,v_monto_mensual,pFECHA,V_FECHA_PROXIMAF,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_NAF, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,DECODE(pSplit,'H','S','P','S',pSplit),pId_BUNDLE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; END IF; --IF TO_CHAR(pPROXIMAFACTURA,'DD')>1 THEN IF NVL(pVINSTALACION,0) > 0 THEN pkg_fact_naf_sol.GENERA_COBRO_INS(pCODEMPRESA,pCODCLIENTE,pINSTALACION_NAF,pNOTRANSACCION_NAF,pTIPOSERVICIO,v_monto_mensual_ins, pIdSolucion); END IF; --ASIGNAR_GRUPOFAC(pCODEMPRESA, pCODCLIENTE , pUSUARIO_INGRESO); IF NVL(id_resultado,-1) = 0 THEN --REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado,v_Correlativo_hist); REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado||' ( FECHA INST:'||pFecha_ini_fac||')',v_Correlativo_hist); COMMIT; END IF; ELSE --(nvl(venlace,0)=0) THEN id_resultado:=8; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); END IF;--IF (nvl(venlace,0)=0) THEN ELSE id_resultado:=4; Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); END IF;--IF vCliente = pCODCLIENTE THEN END IF; -- pCODTRANSACCION = 'A' AND ( pSPLIT !='H' ) THEN IF ( NVL(pSPLIT,'X') ='H') AND (pCODTRANSACCION IN ('A')) THEN -- Si trae H es parte de un split y ademas es un hijo BEGIN INSERT INTO SSO_FDIN (CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,CODEMPRESA_PADRE,CODCLIENTE_PADRE, ES_SPLIT,Id_BUNDLE,fecha_ini_fac) VALUES(pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_PADRE,pNOTRANSACCION_PADRE,pTIPOSERVICIO,1,pCODTRANSACCION, pCODMONEDA,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,v_monto_mensual,pFECHA,dfecha_facturacion,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_PADRE, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,pCODEMPRESA_PADRE,pCODCLIENTE_PADRE, DECODE(pSplit,'H','S','P','S',pSplit),pId_BUNDLE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; IF TO_CHAR(V_FECHA_PROXIMAF,'DD')>1 THEN -- SE INSERTA EL PROPORCIONAL -- La cantidad de dias proporcionales ndias_prop:=to_char(last_Day(pPROXIMAFACTURA),'DD')- TO_CHAR(pPROXIMAFACTURA,'DD') + 1; --nMonto_Prop:=v_monto_mensual/to_char(last_Day(pPROXIMAFACTURA),'DD') * ndias_prop; -- inserta el proporcional BEGIN INSERT INTO SSO_FDIN (CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,CODEMPRESA_PADRE,CODCLIENTE_PADRE, ES_SPLIT,Id_BUNDLE,fecha_ini_fac) VALUES(pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_PADRE,pNOTRANSACCION_PADRE,'PRO',1,pCODTRANSACCION, pCODMONEDA,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,v_monto_mensual,pFECHA,V_FECHA_PROXIMAF,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_PADRE, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,pCODEMPRESA_PADRE,pCODCLIENTE_PADRE, DECODE(pSplit,'H','S','P','S',pSplit),pId_BUNDLE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; END IF; IF NVL(pVINSTALACION,0) > 0 THEN GENERA_COBRO_INS(pCODEMPRESA,pCODCLIENTE,pINSTALACION_PADRE,pNOTRANSACCION_PADRE,pTIPOSERVICIO,v_monto_mensual_ins); END IF; --ASIGNAR_GRUPOFAC(pCODEMPRESA, pCODCLIENTE , pUSUARIO_INGRESO); IF id_resultado=0 THEN --REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado,v_Correlativo_hist); REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado||' ( FECHA INST:'||pFecha_ini_fac||')',v_Correlativo_hist); COMMIT; END IF; END IF; --IF ( NVL(pSPLIT,'X') ='H') AND (pCODTRANSACCION IN ('A')) THEN -- Si trae H es parte de un split y ademas es un hijo IF pCODTRANSACCION = 'CC' THEN --CAMBIO DE CLIENTE NOTRANSACCION_BAJA:=pNOTRANSACCION_NAF; pNOTRANSACCION_NAF:=SIGUENTE_CORRELATIVO(pCODEMPRESA,'NOTRANSACCION'); 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,FECHA_ULTIMA_FAC,fecha_ini_fac) SELECT pCODEMPRESA_NUEVA,pCODCLIENTE_NUEVO,CONTRATO,ANEXO,INSTALACION, pNOTRANSACCION_NAF,TIPOSERVICIO,GRUPOFACTURA/*1*/,pCODTRANSACCION,CODMONEDA, ORDEN,DESCRIPCION,CANTIDAD,VINSTALACION,NOCUOTAS, TOTALCUOTAS,VMENSUAL,VACUMULADO,TIPOFACTURACION,SYSDATE, FACTURA,PRODUCTO,COD_CATEGORIA,PROXIMAFACTURA,CICLOFACTURACION, PERIODICIDAD,pUSUARIO_INGRESO,SYSDATE,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,pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL, CODCLIENTE_PADRE,CODEMPRESA_PADRE,ES_SPLIT,FECHA_ULTIMA_FAC,fecha_ini_fac FROM SSO_FDIN WHERE codempresa=pCODEMPRESA AND codcliente=pCODCLIENTE AND instalacion=pINSTALACION_NAF --AND notransaccion=pNOTRANSACCION_NAF AND notransaccion=NOTRANSACCION_BAJA AND activo='S' AND tiposervicIo='ENL'; IF id_resultado=0 THEN --ASIGNAR_GRUPOFAC(pCODEMPRESA_NUEVA, pCODCLIENTE_NUEVO, pUSUARIO_INGRESO); --COMMIT; REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado||'( FECHA INST:'||pFecha_ini_fac||')',v_Correlativo_hist); BAJA_DE_ENLACE(pCODEMPRESA,pCODCLIENTE,pINSTALACION_NAF,NOTRANSACCION_BAJA,'ENL','B'||pCODTRANSACCION, SYSDATE,'BAJA POR TRANSACCION: '||pCODTRANSACCION,pUSUARIO_INGRESO,id_resultado,Desc_resultado); END IF; END IF; IF pCODTRANSACCION IN ('U','D','TU','TUR','TR','T','CAP','TD','TDR','UR','DR','RA','CP','REA') THEN --U=UPGRADE, D=DOWNGRADE, TU=TRASLADO CON UPGRADE,TUR=TRASLADO CON UPGRADE Y RENOVACION --TR=TRASLADO CON RENOVACION, T=TRASALADO DE ENLACE, CAP=CAMBIO DE PRODUCTO --TD=TRASLADO CON DOWNGRADE, TDR=TRASLADO CON DOWNGRADE Y RENOVACION, UR=UPGRADE CON RENOVACION --DR=DOWNGRADE CON RENOVACION, RA='RENOVACION DE ANEXO', CP=CAMBIO DE PRECIO --REA=REACTIVACION DE ENLACE, AB=ALTA BUNDLE IF EXISTE_ENLACE_ACTIVO(pCODEMPRESA,pCODCLIENTE,pINSTALACION_NAF,pNOTRANSACCION_NAF,pCODTRANSACCION,vGrupo_Fac,V_PRODUCTO_CONTABLE) THEN NOTRANSACCION_BAJA:=pNOTRANSACCION_NAF; pNOTRANSACCION_NAF:=SIGUENTE_CORRELATIVO(pCODEMPRESA,'NOTRANSACCION'); --Se agrega If para diferenciar las postventas de la reactivacion if pCODTRANSACCION !='REA' then DIFERENCIAL_ENVIO_AUTO(pCODEMPRESA, -- Codigo de la compañia pCODCLIENTE, -- Codigo del cliente pINSTALACION_NAF, -- numero de enlace NOTRANSACCION_BAJA, --numero de orden de trabajo del enlace v_monto_mensual, -- valor de la nueva transaccion sobre el enlace pCODMONEDA, -- moneda de la nueva transaccion del enlace V_diferencial, -- monto del diferencial pFechaProp, -- fecha nueva del proporcional pFechaEnlace); --pfecha_ini_fac:=dfecha_facturacion; --Asignamos la moneda a la nueva variable v_moneda_rea := pCODMONEDA; else v_monto_mensual := v_precio_rea; --pCODMONEDA := v_moneda_rea; pFechaEnlace :=dfecha_facturacion; IF TO_CHAR(V_FECHA_PROXIMAF,'DD')='01' THEN V_diferencial:=0; ELSE V_diferencial:=v_precio_rea; pFechaProp := V_FECHA_PROXIMAF; END IF; end if; IF pCODTRANSACCION IN ('DR','TDR','RA','TUR','UR','TR') THEN pfecha_ini_fac:=pFechaEnlace; END IF; IF pCODTRANSACCION IN ('TUR','UR','TR') AND nvl(V_diferencial,0) > 0 THEN pfecha_ini_fac:=pFechaProp; END IF; BEGIN INSERT INTO SSO_FDIN(CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,Id_BUNDLE,fecha_ini_fac) VALUES( pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_NAF,pNOTRANSACCION_NAF,pTIPOSERVICIO,vGrupo_Fac,pCODTRANSACCION, /*pCODMONEDA*/v_moneda_rea,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,v_monto_mensual,pFECHA,pFechaEnlace/*dfecha_facturacion*/,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_NAF, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,pId_BUNDLE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado); WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; IF id_resultado=0 THEN -- Si todo va bien se procede con la baja y proporcional cuando aplica /*V_diferencial:=DIFERENCIAL(pCODEMPRESA, -- Codigo de la compañia pCODCLIENTE, -- Codigo del cliente pINSTALACION_NAF, -- numero de Enlace NOTRANSACCION_BAJA, --numero de orden de trabajo del enlace v_monto_mensual, -- valor de la nueva transaccion sobre el enlace pCODMONEDA -- moneda de la nueva transaccion del enlace ); */ --IF ( TO_CHAR(V_FECHA_PROXIMAF,'DD')>1 and V_diferencial > 0 AND pCODTRANSACCION NOT IN('CP')) THEN -- SE INSERTA EL PROPORCIONAL IF ( nvl(V_diferencial,0) > 0 AND pCODTRANSACCION NOT IN('CP')) THEN -- SE INSERTA EL PROPORCIONAL -- La cantidad de dias proporcionales ndias_prop:=to_char(last_Day(pPROXIMAFACTURA),'DD')- TO_CHAR(pPROXIMAFACTURA,'DD') + 1; -- inserta el proporcional BEGIN INSERT INTO SSO_FDIN(CODEMPRESA,CODCLIENTE,CONTRATO,ANEXO,INSTALACION,NOTRANSACCION,TIPOSERVICIO,GRUPOFACTURA,CODTRANSACCION, CODMONEDA,DESCRIPCION,CANTIDAD,VINSTALACION,VMENSUAL,FECHA,PROXIMAFACTURA,USUARIO_INGRESO, FECHA_INGRESO,CODPRODUCTO,CODANCHOBANDA,CENTRO,BODEGA,ANCHO_BANDA,GEOGRAFIA_VENTA,GEOGRAFIA_PUNTO_INI, GEOGRAFIA_PUNTO_FIN,ACTIVO,PUNTO_INICIO,PUNTO_FINAL,PAIS_INICIAL,PAIS_FINAL,PERIODO_INICIO,ORDEN, PRODUCTO,CICLOFACTURACION,INSTALACION_SIEBEL,NOTRANSACCION_SIEBEL,CODEMPRESA_PADRE,CODCLIENTE_PADRE,fecha_ini_fac) VALUES(pCODEMPRESA,pCODCLIENTE,pCONTRATO,pANEXO,pINSTALACION_NAF,pNOTRANSACCION_NAF,'PRO',vGrupo_Fac,pCODTRANSACCION, /*pCODMONEDA*/v_moneda_rea,v_descpricion_fact,pCANTIDAD,v_monto_mensual_ins,V_diferencial,pFECHA,pFechaProp/*V_FECHA_PROXIMAF*/,pUSUARIO_INGRESO, pFECHA_INGRESO,pCODPRODUCTO,v_codanchobanda,pCENTRO,pBODEGA,substr(pANCHO_BANDA,1,20),pGEOGRAFIA_VENTA,pGEOGRAFIA_PUNTO_INI, pGEOGRAFIA_PUNTO_FIN,pACTIVO,pPUNTO_INICIO,pPUNTO_FINAL,pPAIS_INICIAL,pPAIS_FINAL,pPERIODO_INICIO,pINSTALACION_NAF, /*pProducto*/V_PRODUCTO_CONTABLE,'U',pINSTALACION_SIEBEL,pNOTRANSACCION_SIEBEL,pCODEMPRESA_PADRE,pCODCLIENTE_PADRE,pfecha_ini_fac); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN id_resultado := 5; -- Registro duplicado en sso_fdin Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; WHEN OTHERS THEN id_resultado := 6; -- Operación Fallida, Error al insertar en SSO_FDIN Desc_resultado:=GET_MSG_DESCRIPTION(id_resultado)||SQLERRM; END; END IF;--IF TO_CHAR(pPROXIMAFACTURA,'DD')>1 END IF; --IF id_resultado=0 IF id_resultado=0 THEN -- EL COMMIT SE HACE EN LA BAJA SI ES EXITOSO. IF NVL(pVINSTALACION,0) > 0 THEN SELECT COUNT(*) INTO vEXISTE_INS_PENDIENTE_COBRO FROM SSO_FDIN WHERE CODEMPRESA =pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION_NAF AND NOTRANSACCION=NOTRANSACCION_BAJA AND TIPOSERVICIO='INS' AND NVL(VACUMULADO,0)0 THEN UPDATE SSO_FDIN SET FECHA_BAJA =SYSDATE, MOTIVO_BAJA ='BAJA POR TRANSACCION: '||pCODTRANSACCION, ENCARGADO_BAJA=pUSUARIO_INGRESO, --CODTRANSACCION=DECODE(pCODTRANSACCION,'B',CODTRANSACCION,pCODTRANSACCION), CODTRANSACCION='B'||pCODTRANSACCION, ACTIVO='N', FECHA_AUTORIZA_BAJA=SYSDATE WHERE CODEMPRESA =pCODEMPRESA AND CODCLIENTE=pCODCLIENTE AND INSTALACION=pINSTALACION_NAF AND NOTRANSACCION=NOTRANSACCION_BAJA AND TIPOSERVICIO='INS' AND NVL(VACUMULADO,0)> if nvl(id_resultado,0)>0 then rollback; REGISTRO_DE_RESPUESTA(id_resultado,Desc_resultado,v_Correlativo_hist); commit; 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; END; -- PKG_FACT_NAF; /