Este paquete debe ser ejecutado en BAPY PRODUCCION
CREATE OR REPLACE PACKAGE BODY PKG_DIMO_CEIBO IS
CREATE OR REPLACE PACKAGE BODY PKG_DIMO_CEIBO IS -- Private type declarations --Variable de Historico y tabla para registrar el historico. VR_HISTORICO HISTORICO_CUENTAS%ROWTYPE; TYPE T_HISTORICO IS TABLE OF HISTORICO_CUENTAS%ROWTYPE INDEX BY BINARY_INTEGER; VR_HISTORICOS T_HISTORICO; VC_HISTORICO HISTORICO_CUENTAS%ROWTYPE; -- Private constant declarations CC_DIMO VARCHAR2(4) := 'DIMO'; CC_USUARIO_DIMO VARCHAR2(10) := 'DIMO'; CC_ENT_DIMO_NOV NUMBER := 805; CC_CAPTADOR_DIMO VARCHAR2(2) := '00'; CC_CORRESPONDENCIA_DIMO VARCHAR2(1) := 'I'; CC_TIPO_DATO_LOG CREDITOPY.CEIBO_LOG.TIPO_DATO%TYPE; CC_DELAY_SECONDS NUMBER := 2; -- mantis#2672 Origen bloqueo de Tarjetas 1-Usuario; 2-Entidad CC_BLOQUEO_USUARIO BINARY_INTEGER := 1; CC_BLOQUEO_ENTIDAD BINARY_INTEGER := 2; -- Constantes por tipo de novedad CC_NOVTIP_IMP_PLASTICO_TP NUMBER(3) := 400; CC_ORIGEN_IMP_PLASTICO_TP NUMBER(4) := 13; CC_ESTADO_TP_EN_PROCESO NUMBER(4) := 9; CC_ESTADO_TP_OPERATIVA NUMBER(4) := 1; CC_ESTADO_BLOQ_ENTIDAD NUMBER(4) := 4; CC_ESTADO_BLOQ_USUARIO NUMBER(4) := 5; FORMATO_FECHA CONSTANT CHAR(21) := 'DD/MM/YYYY HH24:MI:SS'; --FORMATO_FECHA_CORTO CONSTANT CHAR(10) := 'DD/MM/YYYY'; --Constantes para JOBS de Fechas estados Cuentas y Tarjetas. JOB_ALTAS CONSTANT VARCHAR2(10) := 'ALTAS-OL'; /* JOB_ALTA_ADICIONAL CONSTANT VARCHAR2(10) := 'ADIC-OL'; JOB_REPOSICION CONSTANT VARCHAR2(10) := 'REPOS-OL'; JOB_REACTIVACION CONSTANT VARCHAR2(10) := 'REACTIV-OL'; JOB_CTAMODIFICACION CONSTANT VARCHAR2(10) := 'CTAMOD-OL'; JOB_DENUNCIAS CONSTANT VARCHAR2(10) := 'DENUN-OL'; */ -- Private variable declarations VR_LOG CEIBO_LOG%ROWTYPE; PV_USUARIO VARCHAR2(16); PV_JOB_NOMBRE VARCHAR2(10); PV_BITACORA_ID CEIBO_LOG.BITACORA_ID%TYPE; PV_LOG_LEN BINARY_INTEGER := 2048; PV_EMISOR_DIMO TARJETAS.EMISOR%TYPE; PV_GRUPO_AFINIDAD CREDITOPY.GRUPOS_AFINIDAD.GRUPO_AFINIDAD%TYPE; PV_PROMOTOR_ID DEBCREDPY.CAPTADORES.CODIGO_CAPTADOR%TYPE; PV_ESTADO_TJ_ALTA CREDITOPY.TARJETAS.ESTADO%TYPE; PV_ID_TIPO_PLASTICO CREDITOPY.TARJETAS_PREPAGA.ID_TIPO_TARJETA_PREPAGA%TYPE; /* PV_RAISE_MSG VARCHAR2(512); PV_NOVEDAD HISTORICO_COMERCIOS.NOVEDAD%TYPE; */ PV_REGLA_ID NOVEDADES_OL_REGLAS.REGLA_ID%TYPE; PV_MENSAJE VARCHAR2(4096); PV_FEC_REG_ALTA DATE; -- Private variable declarations -- Variable de Novedades Cuentas y Tarjetas VR_NOVEDAD_CUENTA NOVEDADES_CUENTAS@OLPY%ROWTYPE; VR_NOVEDAD_TARJETA NOVEDADES_TARJETAS@OLPY%ROWTYPE; -- Variables de Tablas Principales VR_PERSONA DEBCREDPY.PERSONAS%ROWTYPE; VR_CUENTA CUENTAS%ROWTYPE; VR_TARJETA TARJETAS%ROWTYPE; VR_TARJETAS_PREPAGA CREDITOPY.TARJETAS_PREPAGA%ROWTYPE; VR_DIRECCION DIRECCIONES%ROWTYPE; VR_CELULAR DIRECCIONES%ROWTYPE; VR_EMAIL DIRECCIONES%ROWTYPE; VR_SALDO_CUENTA SALDOS_CUENTAS%ROWTYPE; VR_LIMITES LIMITES_CUENTAS@OLPY%ROWTYPE; -- Variables de tablas secundarias. VR_EMISOR_PRODUCTO DEBCREDPY.EMISORES_PRODUCTOS%ROWTYPE; VR_CALENDARIO_CIERRE CALENDARIO_CIERRES%ROWTYPE; VR_CORRESPONDENCIA CODIGOS_CORRESPONDENCIA%ROWTYPE; VR_AFINIDAD GRUPOS_AFINIDAD%ROWTYPE; VR_CIUDAD DEBCREDPY.CIUDADES%ROWTYPE; VR_CARTERA DEBCREDPY.CARTERAS%ROWTYPE; VR_SUCURSAL DEBCREDPY.SUCURSALES_EMISORES%ROWTYPE; VR_EMISOR DEBCREDPY.EMISORES%ROWTYPE; VR_SEXO DEBCREDPY.SEXOS%ROWTYPE; VR_ESTADO_CIVIL DEBCREDPY.ESTADOS_CIVILES%ROWTYPE; VR_OCUPACION DEBCREDPY.OCUPACIONES%ROWTYPE; VR_PROMOTOR DEBCREDPY.CAPTADORES%ROWTYPE; -- Function and procedure implementations FUNCTION fn_get_limite(fn_emisor IN creditopy.CUENTAS.emisor%TYPE, fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_plan IN NUMBER) RETURN NUMBER IS vn_limite NUMBER; /***************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 24/04/2019 Origen: de la consulta de limites utilizada en el formulario Cuenta.jsp del AccesoCabal Propósito: Función que retorna el valor del limite correspondiente a una cuenta teniendo como datos de entrada: el emisor, el numero de cuenta y el plan de venta. Los planes que definen los límites son: - Plan: Normal (Unificado) , Codigo: 1. ** Contado (lineas separadas) ** - Plan: Cuotas , Codigo: 3. - Plan: Adelanto Efectivo , Codigo: 4. - Plan: Salud , Codigo: 9. Observación: los limites no se toman de la tabla creditopy.CUENTAS (Batch) porque las actualizaciones de limites no se impactan hasta el cierre de diaria en el Batch, y el limite utilizado para el calculo del disponible es el del Online ******************************************************************************************************/ BEGIN SELECT limite INTO vn_limite FROM creditopy.limites_cuentas@olpy olc WHERE olc.emisor = fn_emisor AND olc.numero_cuenta = fn_numero_cuenta AND olc.plan_venta = fn_plan; RETURN vn_limite; EXCEPTION WHEN no_data_found THEN vn_limite := 0; RETURN vn_limite; WHEN OTHERS THEN RAISE; END fn_get_limite; FUNCTION fn_get_pagos_ol(fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE) RETURN NUMBER IS vn_pagos_ol NUMBER; /********************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Origen: regla '100261' Propósito: Función que retorna el total de los pagos en línea aún no procesados a la cuenta Se realizara la consulta al OL teniendo como dato de entrada el numero de cuenta. En la regla original los pagos corresponden a los ingresados en linea sin importar que esten o no procesados ya por el cierre. En la version original se toman los no procesados, pero se incluyeron controles adicionales de forma a tomar los que estan procesados siempre que el proceso de carga de pagos a las cuentas en el batch no este finalizado. **********************************************************************************************/ BEGIN SELECT SUM(DECODE(codigo_operacion, 0, DECODE(moneda, 830, -importe, -importe * cotizacion), DECODE(moneda, 830, importe, importe * cotizacion))) INTO vn_pagos_ol FROM creditopy.log_transacc_cr@olpy WHERE nro_cuenta = fn_numero_cuenta AND plan = 6 AND TIPO_AUTORIZACION = 'A' AND ( -- no deben estar en proceso de cierre autextproc IS NULL OR -- si estan en proceso de cierre -- solo se suman mientras no termina el proceso de carga de pagos (autextproc IS NOT NULL AND 0 = nvl((SELECT MAX(1) FROM creditopy.CONTROL_DATOS cd WHERE cd.nombre_proceso = 'PAGOS' AND cd.fecha_proceso >= trunc(autextfch) AND cd.resultado = 1), 0))); RETURN NVL(vn_pagos_ol, 0); EXCEPTION -- cuando hay sum no sale por no_data_found, solo no suma, se puede omitir WHEN OTHERS THEN RAISE; END fn_get_pagos_ol; FUNCTION fn_get_ajustes_ol(fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_codigo_operacion IN creditopy.movimientos_ajustes.codigo_operacion%TYPE) RETURN NUMBER IS vn_ajustes_db_ol NUMBER; vn_ajustes_cr_ol NUMBER; vn_codigo_operacion INTEGER; /******************************************************************************************************* Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Origen: regla '10027' Propósito: Funcion que retorna los registros de los ajustes en línea de la cuenta Se realizara la consulta al OL teniendo como dato de entrada el numero de cuenta. Los ajustes corresponden a movimientos crédito ingresados a la cuenta del tarjetahabiente. Codigo_Operacion = 1 - creditos 0 - debitos La funcion original retornaba los ajustes NO PROCESADOS, pero se incluyo el control de forma a incluir los PROCESADOS de la fecha siempre que el proceso de carga de ajustes en el cierre del batch aun no finalizo. Los ajustes crédito se suman a los pagos, para obtener el total de lo abonado por el tarjehabiente. Los ajustes débito se suman a las compras, para obtener el total de compras del tarjetahabiente. **********************************************************************************************************/ BEGIN vn_codigo_operacion := nvl(fn_codigo_operacion, 0); SELECT NVL(SUM(decode(am.codigo_operacion, 0, am.importe, 0)), 0), NVL(SUM(decode(am.codigo_operacion, 1, am.importe, 0)), 0) INTO vn_ajustes_db_ol, vn_ajustes_cr_ol FROM creditopy.alta_movimientos_ajustes@olpy am WHERE am.numero_cuenta = fn_numero_cuenta AND (nvl(am.procesado, 'N') = 'N' OR (nvl(am.procesado, 'N') = 'S' AND trunc(am.fecha_proceso) >= trunc(SYSDATE) AND -- y no haya sido replicada la tabla CUENTAS: este control -- utiliza una tabla que se registra con un job en el Online 0 = nvl((SELECT COUNT(*) FROM creditopy.CONTROL_MVIEWS@olpy a WHERE trunc(a.fecha_registro) >= trunc(SYSDATE) AND a.mview_name = 'CUENTAS' AND a.last_refresh_date >= am.fecha_proceso), 0))); CASE vn_codigo_operacion WHEN 0 THEN RETURN NVL(vn_ajustes_db_ol, 0); ELSE RETURN NVL(vn_ajustes_cr_ol, 0); END CASE; EXCEPTION WHEN OTHERS THEN --cuando hay sum no sale por no_data_found, solo no suma, se puede omitir RAISE; END fn_get_ajustes_ol; FUNCTION fn_get_disponible_online(fn_emisor IN creditopy.CUENTAS.emisor%TYPE, fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_plan IN NUMBER, fn_flg_ul IN NUMBER DEFAULT NULL, fn_porc_sobregiro IN NUMBER DEFAULT NULL) RETURN NUMBER IS vn_disponible NUMBER; /************************************************************************************************* Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 24/04/2019 Origen: de la consulta de limites utilizada en el formulario Cuenta.jsp del AccesoCabal Propósito: Función que retorna el valor del disponible al contado correspondiente a un número de cuenta. La función llama a el procedimiento creditopy.autorizador_cr.DispPlanesNuevos utilizado en el acceso cabal para obtener los valores de la sección de disponibles. ***************************************************************************************************/ NP_DISPCONTADO NUMBER; NP_DISPPLANES NUMBER; NP_DISPEFECTIVO NUMBER; NP_DISPAGRO NUMBER; NP_DISPTANTOS NUMBER; NP_ESTADO CREDITOPY.LOG_TRANSACC_CR.ESTADOC@OLPY%TYPE; NP_SALDOCIERREML CREDITOPY.LOG_TRANSACC_CR.SALDO_CIERRE_ML@OLPY%TYPE; NP_SALDOCIERREMR CREDITOPY.LOG_TRANSACC_CR.SALDO_CIERRE_MR@OLPY%TYPE; NP_PAGOSML CREDITOPY.LOG_TRANSACC_CR.PAGOS_ML@OLPY%TYPE; NP_PAGOSMR CREDITOPY.LOG_TRANSACC_CR.PAGOS_MR@OLPY%TYPE; NP_FECHACIERRE CREDITOPY.LOG_TRANSACC_CR.FECHA_CIERRE@OLPY%TYPE; NP_FECHAVENCIMIENTO CREDITOPY.LOG_TRANSACC_CR.FECHA_VENCIMIENTO@OLPY%TYPE; NP_PAGOMINIMO CREDITOPY.LOG_TRANSACC_CR.PAGO_MINIMO_ML@OLPY%TYPE; NP_RESERVASCONTADO NUMBER; NP_RESERVASPLANES NUMBER; NP_RESERVASEFECTIVO NUMBER; NP_RESERVASAGRO NUMBER; NP_DISPSALUD NUMBER; NP_RESERVASALUD NUMBER; vn_limite_contado NUMBER; vn_exceso NUMBER; vn_disp_contado NUMBER; BEGIN creditopy.autorizador_cr.DispPlanesNuevos@olpy(fn_numero_cuenta, NP_DISPCONTADO, NP_DISPPLANES, NP_DISPEFECTIVO, NP_DISPAGRO, NP_DISPTANTOS, NP_ESTADO, NP_SALDOCIERREML, NP_SALDOCIERREMR, NP_PAGOSML, NP_PAGOSMR, NP_FECHACIERRE, NP_FECHAVENCIMIENTO, NP_PAGOMINIMO, NP_RESERVASCONTADO, NP_RESERVASPLANES, NP_RESERVASEFECTIVO, NP_RESERVASAGRO, NP_DISPSALUD, NP_RESERVASALUD); CASE fn_plan WHEN 1 THEN vn_disponible := NP_DISPCONTADO; WHEN 3 THEN vn_disponible := NP_DISPPLANES; WHEN 4 THEN vn_disponible := NP_DISPEFECTIVO; WHEN 9 THEN vn_disponible := NP_DISPSALUD; ELSE vn_disponible := 0; END CASE; IF vn_disponible < 0 THEN vn_disponible := 0; END IF; -- calculo el exceso vn_limite_contado := creditopy.pkg_dimo_ceibo.fn_get_limite(fn_emisor, fn_numero_cuenta, 1); vn_exceso := NP_DISPCONTADO - round(vn_limite_contado * fn_porc_sobregiro / 100); IF vn_exceso < 0 THEN vn_disp_contado := 0; ELSE vn_disp_contado := NP_DISPCONTADO; END IF; IF fn_plan = 4 THEN CASE nvl(fn_flg_ul, -1) WHEN 0 THEN -- tiene lineas separadas IF NP_DISPEFECTIVO > NP_DISPCONTADO + NP_DISPPLANES THEN vn_disponible := vn_disp_contado + NP_DISPPLANES; END IF; WHEN 1 THEN -- tiene lineas unificadas IF NP_DISPEFECTIVO > NP_DISPCONTADO THEN vn_disponible := NP_DISPCONTADO; END IF; ELSE NULL; END CASE; END IF; RETURN vn_disponible; EXCEPTION WHEN OTHERS THEN RETURN 0; END fn_get_disponible_online; FUNCTION fn_get_datos_monetarios_ol(fn_emisor IN creditopy.CUENTAS.emisor%TYPE, fn_sucursal IN creditopy.CUENTAS.sucursal_emisor%TYPE, fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_dato IN INTEGER, fn_reservas_ml IN creditopy.CUENTAS.reservas_ml%TYPE, fn_reservas_efectivo_ml IN creditopy.CUENTAS.reservas_efectivo_ml%TYPE, fn_reservas_planes_ml IN creditopy.CUENTAS.reservas_planes_ml%TYPE) RETURN NUMBER IS vn_importe NUMBER; vn_total_pagos NUMBER; vd_ultima_fecha_pago DATE; vn_total_dev_off NUMBER; vn_total_congelada NUMBER; vn_ajcrol NUMBER; vn_ajdbol NUMBER; vn_aut_pend_totales NUMBER; vn_total_cuotas_pen NUMBER; vn_saldo_ultimo_cierre NUMBER; vn_interes_financiero NUMBER; vn_interes_moratorio NUMBER; vn_autorcontado NUMBER; vn_autoradelanto NUMBER; vn_autorplan NUMBER; vn_autorsalud NUMBER; vn_autorunacuotaplan NUMBER; vn_autorplanadelanto NUMBER; vn_autorunacuotaadelanto NUMBER; vn_autorcanceplanes NUMBER; vn_autorintcaplanes NUMBER; vn_autorcancesalud NUMBER; vn_autorintcasalud NUMBER; vn_planespe NUMBER; vn_cargos_decaido NUMBER; vn_tiene_vinculo NUMBER; /******************************************************************************************************* Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 26/06/2019 Origen: complemento de datos de la regla '10020' Propósito: Funcion que retorna los datos monetarios. Implementada para obtener los datos faltantes para el saldo a la fecha que debe incluir los pagos en linea, ajustes credito y debito en linea que aun no fueron procesados. Retorna los valores de acuerdo al valor de fn_dato: 1 - total de pagos online 2 - ajustes credito online 3 - ajustes debito online 4 - indicador de compras y adelantos pendientes; devuelve 1 si tiene autorizaciones de compras contado o de adelanto o de compras en planes *********************************************************************************************************/ BEGIN creditopy.reportes.PR_GET_DATOS_MONETARIOS@olpy(fn_emisor, fn_sucursal, fn_numero_cuenta, fn_reservas_ml, fn_reservas_efectivo_ml, fn_reservas_planes_ml, vn_total_pagos, vd_ultima_fecha_pago, vn_total_dev_off, vn_total_congelada, vn_ajcrol, vn_ajdbol, vn_aut_pend_totales, vn_total_cuotas_pen, vn_saldo_ultimo_cierre, vn_interes_financiero, vn_interes_moratorio, vn_autorcontado, vn_autoradelanto, vn_autorplan, vn_autorsalud, vn_autorunacuotaplan, vn_autorplanadelanto, vn_autorunacuotaadelanto, vn_autorcanceplanes, vn_autorintcaplanes, vn_autorcancesalud, vn_autorintcasalud, vn_planespe, vn_cargos_decaido, vn_tiene_vinculo); CASE fn_dato WHEN 1 THEN vn_importe := vn_total_pagos; WHEN 2 THEN vn_importe := vn_ajcrol; WHEN 3 THEN vn_importe := vn_ajdbol; WHEN 4 THEN IF nvl(vn_autorcontado, 0) != 0 OR nvl(vn_autoradelanto, 0) != 0 OR nvl(vn_autorplan, 0) != 0 THEN vn_importe := 1; ELSE vn_importe := 0; END IF; ELSE vn_importe := 0; END CASE; RETURN vn_importe; EXCEPTION WHEN OTHERS THEN RAISE; END fn_get_datos_monetarios_ol; FUNCTION fn_get_pm_pendiente(fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_pm_facturado IN creditopy.SALDOS_CUENTAS.pago_minimo_ml%TYPE, fn_pagos IN creditopy.CUENTAS.pagos_ml%TYPE) RETURN NUMBER IS vn_pago_min_pendiente NUMBER; BEGIN -- se calcula sobre el pago minimo facturado menos los pagos procesados a la fecha incluyendo -- los pagos en linea y los ajustes credito no procesados -- pago minimo facturado - -- ( el total de pagos a la ultima diaria -- + pagos en linea regla 100261 -- + ajustes cr en linea regla 10027) vn_pago_min_pendiente := fn_pm_facturado - (fn_pagos + creditopy.pkg_dimo_ceibo.fn_get_pagos_ol(fn_numero_cuenta) + creditopy.pkg_dimo_ceibo.fn_get_ajustes_ol(fn_numero_cuenta, 1)); IF vn_pago_min_pendiente < 0 THEN vn_pago_min_pendiente := 0; END IF; RETURN vn_pago_min_pendiente; EXCEPTION WHEN OTHERS THEN --cuando hay sum no sale por no_data_found, solo no suma, se puede omitir RAISE; END fn_get_pm_pendiente; FUNCTION fn_get_ultimo_pago(fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE) RETURN NUMBER IS vn_pagos_ol NUMBER; vn_importe NUMBER; vd_ult_fecha_pago DATE; BEGIN BEGIN -- primero ver si hay pagos en el Online SELECT DECODE(moneda, 830, importe, importe * cotizacion) INTO vn_pagos_ol FROM creditopy.log_transacc_cr@olpy a WHERE nro_cuenta = fn_numero_cuenta AND plan = 6 AND importe != 0 -- por bug del autorizador que se corrije a x hora antes de la captura AND codigo_operacion = 1 AND tipo_autorizacion = 'A' AND fecha = (SELECT MAX(b.fecha) FROM creditopy.log_transacc_cr@olpy b WHERE b.nro_cuenta = a.nro_cuenta AND b.plan = a.plan AND b.importe != 0 -- por bug del autorizador que se corrije a x hora antes de la captura AND b.codigo_operacion = a.codigo_operacion AND b.tipo_autorizacion = a.tipo_autorizacion) AND movextfch = (SELECT MAX(b.movextfch) FROM creditopy.log_transacc_cr@olpy b WHERE b.nro_cuenta = a.nro_cuenta AND b.plan = a.plan AND b.importe != 0 -- por bug del autorizador que se corrije a x hora antes de la captura AND b.codigo_operacion = a.codigo_operacion AND b.tipo_autorizacion = a.tipo_autorizacion AND b.fecha = a.fecha) AND a.idaut = (SELECT MAX(b.idaut) FROM creditopy.log_transacc_cr@olpy b WHERE b.nro_cuenta = a.nro_cuenta AND b.plan = a.plan AND b.importe != 0 -- por bug del autorizador que se corrije a x hora antes de la captura AND b.codigo_operacion = a.codigo_operacion AND b.tipo_autorizacion = a.tipo_autorizacion AND b.fecha = a.fecha AND b.movextfch = a.movextfch); EXCEPTION WHEN no_data_found THEN vn_pagos_ol := 0; WHEN OTHERS THEN RAISE; END; -- si hay pagos en el online ya no necesita ir a buscar en MOVTOS_CUENTAS IF nvl(vn_pagos_ol, 0) > 0 THEN vn_importe := vn_pagos_ol; ELSE -- busca la maxima fecha de pago registrada -- no hay un indice por rubro por cuenta, tampoco un indice por cuenta y fecha de movimiento SELECT MAX(mc.fecha_movimiento) INTO vd_ult_fecha_pago FROM creditopy.movtos_cuentas mc WHERE mc.numero_cuenta = fn_numero_cuenta AND mc.rubro = 500; -- para la maxima fecha busca el ultimo pago procesado (el ultimo nro de talon en la fecha) -- ojo: si realizo varios pagos en una fecha no hay como determinar cual fue el ultimo, -- se toma el ultimo procesado por numero de talon, que es un secuencial al cargar movtos_cuentas SELECT mc.importe_ml INTO vn_importe FROM creditopy.movtos_cuentas mc WHERE mc.numero_cuenta = fn_numero_cuenta AND mc.rubro = 500 AND mc.fecha_movimiento = vd_ult_fecha_pago AND to_number(TRIM(mc.numero_talon)) = (SELECT MAX(to_number(TRIM(b.numero_talon))) FROM creditopy.movtos_cuentas b WHERE mc.EMISOR = b.EMISOR AND mc.SUCURSAL_EMISOR = b.sucursal_emisor AND mc.producto = b.PRODUCTO AND mc.NUMERO_CUENTA = b.numero_cuenta -- and mc.PERIODO_CIERRE = b.periodo_cierre -- bug CAD-838. AR. 20200203 AND mc.FECHA_MOVIMIENTO = b.fecha_movimiento AND mc.RUBRO = b.rubro AND mc.MONEDA = b.moneda); END IF; RETURN nvl(vn_importe, 0); EXCEPTION WHEN no_data_found THEN vn_importe := 0; RETURN vn_importe; WHEN OTHERS THEN RAISE; END fn_get_ultimo_pago; FUNCTION fn_get_fecha_ultimo_pago(fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fd_fecha_ult_pago IN creditopy.CUENTAS.fecha_ultimo_pago%TYPE) RETURN DATE IS vd_fecha_ult_pago DATE; BEGIN SELECT MAX(fecha) INTO vd_fecha_ult_pago FROM creditopy.log_transacc_cr@olpy a WHERE a.nro_cuenta = fn_numero_cuenta AND a.plan = 6 AND a.codigo_operacion = 1 AND a.TIPO_AUTORIZACION = 'A'; IF vd_fecha_ult_pago IS NULL OR vd_fecha_ult_pago < fd_fecha_ult_pago THEN vd_fecha_ult_pago := fd_fecha_ult_pago; END IF; RETURN vd_fecha_ult_pago; EXCEPTION WHEN OTHERS THEN --cuando hay max no sale por no_data_found RAISE; END fn_get_fecha_ultimo_pago; FUNCTION fn_get_fecha_ult_pago_periodo(fn_emisor IN creditopy.CUENTAS.emisor%TYPE, fn_sucursal_emisor IN creditopy.CUENTAS.sucursal_emisor%TYPE, fn_numero_cuenta IN creditopy.CUENTAS.numero_cuenta%TYPE, fn_periodo_cierre IN creditopy.MOVTOS_CUENTAS.periodo_cierre%TYPE) RETURN DATE IS vd_fecha_ult_pago DATE; BEGIN SELECT MAX(MC.FECHA_MOVIMIENTO) INTO vd_fecha_ult_pago FROM CREDITOPY.MOVTOS_CUENTAS MC WHERE MC.EMISOR = FN_EMISOR AND MC.SUCURSAL_EMISOR = FN_SUCURSAL_EMISOR AND MC.PRODUCTO = 1 AND MC.NUMERO_CUENTA = FN_NUMERO_CUENTA AND MC.PERIODO_CIERRE = FN_PERIODO_CIERRE -- Y LOS RUBROS>3000 que no sean ajustes al pm? AND MC.RUBRO = 500; RETURN vd_fecha_ult_pago; EXCEPTION WHEN OTHERS THEN --cuando hay max no sale por no_data_found RAISE; END fn_get_fecha_ult_pago_periodo; FUNCTION fn_get_estado_desc(fn_estado IN creditopy.estados_ctas_tarj.estado%TYPE) RETURN VARCHAR2 IS vc_desc_estado creditopy.estados_ctas_tarj.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 24/04/2019 Propósito: Función que retorna la descripción del estado de una tarjeta o cuenta, teniendo como dato de entrada el id del estado. ******************************************************************************************************/ BEGIN SELECT et.descripcion INTO vc_desc_estado FROM creditopy.estados_ctas_tarj et WHERE et.producto = 1 AND et.estado = fn_estado; RETURN vc_desc_estado; EXCEPTION WHEN no_data_found THEN RETURN ' '; WHEN OTHERS THEN RAISE; END fn_get_estado_desc; FUNCTION fn_get_emisor_desc(fn_emisor IN debcredpy.emisores.emisor%TYPE) RETURN VARCHAR2 IS vc_desc_emisor debcredpy.emisores.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 24/04/2019 Propósito: Función que retorna la descripción de un emisor, teniendo como dato de entrada el id del emisor. ******************************************************************************************************/ BEGIN IF fn_emisor != 0 THEN SELECT e.descripcion INTO vc_desc_emisor FROM debcredpy.emisores e WHERE e.emisor = fn_emisor; ELSE vc_desc_emisor := ' '; END IF; RETURN vc_desc_emisor; EXCEPTION WHEN no_data_found THEN vc_desc_emisor := ' '; RETURN vc_desc_emisor; WHEN OTHERS THEN RAISE; END fn_get_emisor_desc; FUNCTION fn_get_afinidad_desc(fn_emisor IN creditopy.grupos_afinidad.emisor%TYPE, fn_grupo_afinidad IN creditopy.grupos_afinidad.grupo_afinidad%TYPE) RETURN VARCHAR2 IS vc_desc_afinidad creditopy.grupos_afinidad.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Propósito: Función que retorna la descripción de una afinidad, teniendo como dato de entrada el id del grupo afinidad. ******************************************************************************************************/ BEGIN SELECT ga.descripcion INTO vc_desc_afinidad FROM creditopy.grupos_afinidad ga WHERE ga.emisor = fn_emisor AND ga.producto = 1 AND ga.grupo_afinidad = fn_grupo_afinidad; RETURN vc_desc_afinidad; EXCEPTION WHEN no_data_found THEN --PC_SQLERRM := sqlerrm; --PN_SQLCODE := sqlcode; vc_desc_afinidad := ' '; RETURN vc_desc_afinidad; WHEN OTHERS THEN RAISE; END fn_get_afinidad_desc; FUNCTION fn_get_tarjeta_mask(fc_tarjeta IN creditopy.tarjetas.tarjeta%TYPE) RETURN VARCHAR2 IS vc_tarjeta_mask creditopy.tarjetas.tarjeta%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL 0000-XXXX-XXXX-0000 Fecha: 24/04/2019 Propósito: Función que retorna la tarjeta encriptada ******************************************************************************************************/ BEGIN vc_tarjeta_mask := creditopy.fc_cripto2pan(fc_tarjeta); vc_tarjeta_mask := substr(vc_tarjeta_mask, 1, 4) || '-XXXX-XXXX-' || substr(vc_tarjeta_mask, -4); RETURN vc_tarjeta_mask; END fn_get_tarjeta_mask; FUNCTION fn_get_origen_tarjeta(fc_tarjeta IN creditopy.tarjetas.tarjeta%TYPE) RETURN NUMBER IS vn_origen creditopy.imp_tarjetas.cod_origen%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 30/07/2019 Propósito: Función que retorna el codigo del origen de una tarjeta, teniendo como dato de entrada la tarjeta. -- origen de las tarjetas: CODIGOS_PY where TIPO_CODIGO = 1 ORIGEN TARJETA/IMP. TIPO 10 Alta de Cuenta ALTA 11 Alta Adicional ALTA 12 Alta Reactivac.Cuenta ALTA 20 Reposicion REPOS 21 Reposicion por Robo REPOS 22 Reposicion por Extravio REPOS 90 Renovacion RENOV ******************************************************************************************************/ BEGIN SELECT it.cod_origen INTO vn_origen FROM creditopy.imp_tarjetas it WHERE it.tarjeta = fc_tarjeta AND it.cod_origen != 80 AND it.fecha_alta = (SELECT MAX(b.fecha_alta) FROM creditopy.imp_tarjetas b WHERE b.tarjeta = it.tarjeta AND b.cod_origen != 80); RETURN vn_origen; EXCEPTION WHEN no_data_found THEN vn_origen := 0; RETURN vn_origen; WHEN OTHERS THEN RAISE; END fn_get_origen_tarjeta; FUNCTION fn_is_dimo(fn_emisor IN debcredpy.emisores.emisor%TYPE) RETURN NUMBER IS vn_is_dimo NUMBER; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 12/05/2020 Propósito: Función que retorna 1 cuando el emisor es DIMO ******************************************************************************************************/ BEGIN IF fn_emisor != 0 THEN SELECT decode(TRIM(tp.marca), CC_DIMO, 1, 0) INTO vn_is_dimo FROM creditopy.emisores_prepago tp WHERE tp.emisor = fn_emisor; ELSE vn_is_dimo := 0; END IF; RETURN vn_is_dimo; EXCEPTION WHEN no_data_found THEN vn_is_dimo := 0; RETURN vn_is_dimo; WHEN OTHERS THEN RAISE; END fn_is_dimo; FUNCTION fn_is_prepaga(fn_emisor IN debcredpy.emisores.emisor%TYPE) RETURN NUMBER IS vn_is_prepaga NUMBER; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 12/05/2020 Propósito: Función que retorna 1 cuando el emisor es de tarjeta prepaga ******************************************************************************************************/ BEGIN IF fn_emisor != 0 THEN SELECT 1 INTO vn_is_prepaga FROM creditopy.emisores_prepago tp WHERE tp.emisor = fn_emisor --Mantis#2772. AND tp.genera_tarj_fisica_al_alta = 'N'; ELSE vn_is_prepaga := 0; END IF; RETURN vn_is_prepaga; EXCEPTION WHEN no_data_found THEN vn_is_prepaga := 0; RETURN vn_is_prepaga; WHEN OTHERS THEN RAISE; END fn_is_prepaga; FUNCTION fn_is_prepaga_fisica(fi_tarjeta IN creditopy.tarjetas_prepaga.tarjeta%TYPE) RETURN NUMBER IS vn_is_fisica NUMBER; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 23/06/2020 Propósito: Función que retorna 1 cuando la tarjeta prepaga tiene plastico operativo ******************************************************************************************************/ BEGIN IF fi_tarjeta IS NOT NULL THEN SELECT 1 INTO vn_is_fisica FROM creditopy.tarjetas_prepaga tp WHERE tp.tarjeta = fi_tarjeta AND tp.fecha_vig_plastico >= trunc(SYSDATE) AND tp.estado_plastico IN (1, 4, 5, 9); ELSE vn_is_fisica := 0; END IF; RETURN vn_is_fisica; EXCEPTION WHEN no_data_found THEN vn_is_fisica := 0; RETURN vn_is_fisica; WHEN OTHERS THEN RAISE; END fn_is_prepaga_fisica; FUNCTION fn_get_vigencia_tp_virtual(fi_emisor IN debcredpy.emisores_productos.emisor%TYPE, fi_producto IN debcredpy.emisores_productos.producto%TYPE, fi_grupo_afinidad IN debcredpy.emisores_productos.grupo_afinidad%TYPE, fi_cartera IN debcredpy.emisores_productos.cartera%TYPE, fi_fecha_alta IN creditopy.tarjetas.fecha_otorgada%TYPE) RETURN DATE IS fecha_vigencia DATE; BEGIN /* Obtiene la fecha de vigencia para las tarjetas prepaga virtuales a partir del parametro DURACION_TARJETA en la tabla debcredpy.EMISORES_PRODUCTOS. */ SELECT LAST_DAY(add_months(fi_fecha_alta, ep.duracion_tarjeta)) INTO fecha_vigencia FROM debcredpy.emisores_productos ep WHERE ep.emisor = fi_emisor AND ep.producto = fi_producto AND ep.grupo_afinidad = fi_grupo_afinidad AND ep.cartera = fi_cartera AND ep.duracion_tarjeta > 0; RETURN fecha_vigencia; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: duracion de tarjeta virtual no encontrada.'); WHEN OTHERS THEN raise_application_error(-20001, 'USERS_ERROR: duracion de tarjeta virtual con error.'); END fn_get_vigencia_tp_virtual; FUNCTION fn_get_vigencia_tp_fisica(fi_emisor IN creditopy.EMISORES_PREPAGO.emisor%TYPE, fi_tipo_tp IN creditopy.TIPOS_TARJETA_PREPAGA.id_tipo_tarjeta_prepaga%TYPE, fi_fecha_alta IN DATE) RETURN DATE IS fecha_vigencia DATE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 12/06/2020 Propósito: Función que retorna la vigencia de la tarjeta fisica calculada a partir de la fecha de solicitud del plastico. Se utiliza el parametro de duracion del tipo de tarjeta, y si es cero se utiliza el parametro de duracion por emisor. ******************************************************************************************************/ BEGIN SELECT CASE WHEN tp.duracion_tipo_tarjeta > 0 THEN LAST_DAY(add_months(fi_fecha_alta, tp.duracion_tipo_tarjeta)) ELSE LAST_DAY(add_months(fi_fecha_alta, e.duracion_tarjeta_fisica)) END INTO fecha_vigencia FROM creditopy.emisores_prepago e, creditopy.tipos_tarjeta_prepaga tp WHERE e.emisor = fi_emisor AND tp.emisor = e.emisor AND tp.id_tipo_tarjeta_prepaga = fi_tipo_tp; RETURN fecha_vigencia; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: duracion de tarjeta fisica no encontrada.'); WHEN OTHERS THEN raise_application_error(-20001, 'USERS_ERROR: duracion de tarjeta fisica con error.'); END fn_get_vigencia_tp_fisica; FUNCTION fn_datos_plastico_tp(fi_tarjeta IN creditopy.tarjetas_prepaga.tarjeta%TYPE, fi_dato IN VARCHAR2) RETURN VARCHAR IS vc_dato VARCHAR2(30); /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 10/06/2020 Propósito: Función que retorna - para fi_dato 1 : el codigo de tipo de plastico de la tarjeta prepaga fisica 2 : la descripcion abreviada de tipo de plastico de la tarjeta prepaga fisica 3 : el codigo del estado de la tarjeta prepaga fisica 4 : la descripcion del estado de la tarjeta prepaga fisica ******************************************************************************************************/ BEGIN IF fi_tarjeta IS NOT NULL AND fi_dato IS NOT NULL AND nvl(fi_dato, 0) IN (1, 2, 3, 4) THEN CASE WHEN fi_dato IN (1, 2) THEN SELECT decode(fi_dato, 1, rpad(tp.id_tipo_tarjeta_prepaga, 4), 2, t.tipo_tarjeta, '0') INTO vc_dato FROM creditopy.tarjetas_prepaga tp, creditopy.tipos_tarjeta_prepaga t WHERE tp.tarjeta = fi_tarjeta AND t.id_tipo_tarjeta_prepaga = tp.id_tipo_tarjeta_prepaga; WHEN fi_dato IN (3, 4) THEN SELECT decode(fi_dato, 3, rpad(tp.estado_plastico, 4), 4, et.descripcion, '0') INTO vc_dato FROM creditopy.tarjetas_prepaga tp, creditopy.estados_tp_fisica et WHERE tp.tarjeta = fi_tarjeta AND et.estado = tp.estado_plastico; ELSE vc_dato := '0'; END CASE; ELSE vc_dato := '0'; END IF; RETURN TRIM(vc_dato); EXCEPTION WHEN no_data_found THEN vc_dato := '0'; RETURN vc_dato; WHEN OTHERS THEN RAISE; END fn_datos_plastico_tp; FUNCTION fn_get_estado_plastico_desc(fn_estado IN creditopy.estados_ctas_tarj.estado%TYPE) RETURN VARCHAR2 IS vc_desc_estado creditopy.estados_tp_fisica.descripcion%TYPE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 11/06/2020 Propósito: Función que retorna la descripción del estado de una tarjeta fisica. ******************************************************************************************************/ BEGIN SELECT et.descripcion INTO vc_desc_estado FROM creditopy.estados_tp_fisica et WHERE et.estado = fn_estado; RETURN vc_desc_estado; EXCEPTION WHEN no_data_found THEN RETURN ' '; WHEN OTHERS THEN RAISE; END fn_get_estado_plastico_desc; FUNCTION fn_tipo_plastico_tp_desc(fi_id_tipo_tp IN creditopy.tarjetas_prepaga.id_tipo_tarjeta_prepaga%TYPE) RETURN VARCHAR IS vc_tipo_tarjeta_desc creditopy.tipos_tarjeta_prepaga.tipo_tarjeta%TYPE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 12/06/2020 Propósito: la descripcion abreviada de tipo de plastico de una tarjeta ******************************************************************************************************/ BEGIN SELECT t.tipo_tarjeta INTO vc_tipo_tarjeta_desc FROM creditopy.tipos_tarjeta_prepaga t WHERE t.id_tipo_tarjeta_prepaga = fi_id_tipo_tp; RETURN TRIM(vc_tipo_tarjeta_desc); EXCEPTION WHEN no_data_found THEN RETURN ' '; WHEN OTHERS THEN RAISE; END fn_tipo_plastico_tp_desc; FUNCTION fn_get_default_tipo_tp_fisica(fi_emisor IN creditopy.EMISORES_PREPAGO.emisor%TYPE) RETURN NUMBER IS vn_id_tipo_tarjeta_prepaga creditopy.EMISORES_PREPAGO.default_id_tipo_tarj_prepaga%TYPE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 15/06/2020 Propósito: obtener el tipo de tarjeta prepaga fisica por default ******************************************************************************************************/ BEGIN SELECT e.default_id_tipo_tarj_prepaga INTO vn_id_tipo_tarjeta_prepaga FROM creditopy.emisores_prepago e WHERE e.emisor = fi_emisor; RETURN vn_id_tipo_tarjeta_prepaga; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: tipo default de tarjeta fisica no encontrada.'); WHEN OTHERS THEN raise_application_error(-20001, 'USERS_ERROR: tipo default de tarjeta fisica con error.'); END fn_get_default_tipo_tp_fisica; FUNCTION fn_get_estado_gen_tp_fisica(fi_emisor IN creditopy.EMISORES_PREPAGO.emisor%TYPE) RETURN NUMBER IS vn_estado_gen_tarjeta_fisica creditopy.EMISORES_PREPAGO.estado_gen_tarjeta_fisica%TYPE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 15/06/2020 Propósito: obtener el estado al generarse la tarjeta prepaga fisica ******************************************************************************************************/ BEGIN SELECT e.estado_gen_tarjeta_fisica INTO vn_estado_gen_tarjeta_fisica FROM creditopy.emisores_prepago e WHERE e.emisor = fi_emisor; RETURN vn_estado_gen_tarjeta_fisica; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: estado al generar tarjeta fisica no encontrado.'); WHEN OTHERS THEN raise_application_error(-20001, 'USERS_ERROR: estado al generar tarjeta fisica con error.'); END fn_get_estado_gen_tp_fisica; FUNCTION fn_get_tp_ciudad_desc(fi_pais debcredpy.ciudades.pais%TYPE, fi_departamento debcredpy.ciudades.departamento%TYPE, fi_ciudad debcredpy.ciudades.ciudad%TYPE) RETURN VARCHAR2 IS vc_ciudad_desc debcredpy.ciudades.descripcion%TYPE; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 11/06/2020 Propósito: Función que retorna la descripción de la ciudad para una cuenta/tarjeta prepaga. No es valida para TC porque no tiene normalizados los datos de pais/departamento al alta. ******************************************************************************************************/ BEGIN SELECT ci.descripcion INTO vc_ciudad_desc FROM debcredpy.ciudades ci WHERE ci.pais = fi_pais AND ci.departamento = fi_departamento AND ci.ciudad = fi_ciudad; RETURN vc_ciudad_desc; EXCEPTION WHEN no_data_found THEN RETURN ' '; WHEN OTHERS THEN RAISE; END fn_get_tp_ciudad_desc; FUNCTION fn_is_adic_enable(fn_adic_tar_prm IN creditopy.TARJETAS.adicional%TYPE, fn_comp_tar_prm IN creditopy.TARJETAS.componente%TYPE, fc_flg_adicionales IN VARCHAR2, fn_adic_tar_mov IN creditopy.TARJETAS.adicional%TYPE, fn_comp_tar_mov IN creditopy.TARJETAS.componente%TYPE) RETURN NUMBER IS vn_enable NUMBER; BEGIN /* 1 Identificar el componente de la tarjeta pi_tarjeta 2 Si el componente de pi_tarjeta = 1 y pi_flg_adicionales = 1 mostrar los consumos de todas las tarjetas 3 Si el componente de pi_tarjeta = 1 y pi_flg_adicionales = 0 mostrar los consumos de las titulares 4 Si el componente de pi_tarjeta = 2 -- no importa el pi_flg_adicionales mostrar los consumos de esa tarjeta */ vn_enable := 0; IF fn_comp_tar_prm = 1 THEN -- la tarjeta del parametro es una tarjeta titular CASE fc_flg_adicionales WHEN '1' THEN vn_enable := 1; WHEN '0' THEN IF fn_comp_tar_mov = 1 THEN vn_enable := 1; ELSE vn_enable := 0; END IF; ELSE vn_enable := 0; END CASE; ELSE -- la tarjeta del parametro es tarjeta adicional -- habilita si el adicional del parametro es la adicional del movimiento IF fn_adic_tar_prm = fn_adic_tar_mov THEN vn_enable := 1; ELSE vn_enable := 0; END IF; END IF; RETURN vn_enable; EXCEPTION WHEN OTHERS THEN RAISE; END fn_is_adic_enable; FUNCTION fn_get_cantidad_adicionales(fn_numero_cuenta IN creditopy.TARJETAS.numero_cuenta%TYPE) RETURN NUMBER IS vn_cant NUMBER; BEGIN SELECT COUNT(DISTINCT a.documento) INTO vn_cant FROM creditopy.tarjetas a WHERE a.numero_cuenta = fn_numero_cuenta AND a.clase_de_estado IN (1, 4, 5, 11) AND a.componente = 2; RETURN nvl(vn_cant, 0); EXCEPTION WHEN OTHERS THEN RAISE; END fn_get_cantidad_adicionales; FUNCTION fn_get_plan_venta_desc(fn_plan IN creditopy.planes_de_venta.plan_venta%TYPE) RETURN VARCHAR2 IS vc_desc_plan creditopy.planes_de_venta.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 12/05/2019 Propósito: Función que retorna la descripción del plan de venta, teniendo como dato de entrada el id del plan. ******************************************************************************************************/ BEGIN SELECT pv.descripcion INTO vc_desc_plan FROM creditopy.planes_de_venta pv WHERE pv.plan_venta = fn_plan; RETURN vc_desc_plan; EXCEPTION WHEN no_data_found THEN vc_desc_plan := ' '; RETURN vc_desc_plan; WHEN OTHERS THEN RAISE; END fn_get_plan_venta_desc; FUNCTION fn_get_rubro_desc(fn_rubro IN creditopy.rubros.rubro%TYPE, fn_emisor IN creditopy.cuentas.emisor%TYPE) RETURN VARCHAR2 IS vc_desc_rubro creditopy.rubros.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 12/05/2019 Propósito: Función que retorna la descripción del rubro del movimiento, teniendo como dato de entrada el id del rubro. ******************************************************************************************************/ BEGIN vc_desc_rubro := ' '; BEGIN IF creditopy.pkg_dimo_ceibo.fn_is_prepaga(fn_emisor) = 1 THEN SELECT r.descripcion INTO vc_desc_rubro FROM creditopy.rubros_glosa_tp r WHERE r.rubro = fn_rubro; END IF; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := ' '; WHEN OTHERS THEN RAISE; END; IF vc_desc_rubro = ' ' THEN SELECT r.descripcion INTO vc_desc_rubro FROM creditopy.rubros r WHERE r.rubro = fn_rubro; /*else vc_desc_rubro:=' ';*/ -- AR. 03/07/2020 16:00 BUG detectado porque no despliega el concepto de los movimientos facturados. END IF; RETURN vc_desc_rubro; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := ' '; RETURN vc_desc_rubro; WHEN OTHERS THEN RAISE; END fn_get_rubro_desc; FUNCTION fn_get_ramo_desc(fn_emisor_proc IN creditopy.ramos.emisor_procesador%TYPE, fn_ramo IN creditopy.ramos.ramo%TYPE) RETURN VARCHAR2 IS vc_desc_ramo creditopy.ramos.descripcion%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 12/05/2019 Propósito: Función que retorna la descripción del ramo de comercios, teniendo como dato de entrada el id del ramo. ******************************************************************************************************/ BEGIN SELECT ra.descripcion INTO vc_desc_ramo FROM creditopy.ramos ra WHERE ra.emisor_procesador = fn_emisor_proc AND ra.ramo = fn_ramo; RETURN vc_desc_ramo; EXCEPTION WHEN no_data_found THEN vc_desc_ramo := ' '; RETURN vc_desc_ramo; WHEN OTHERS THEN RAISE; END fn_get_ramo_desc; FUNCTION fn_get_cod_ramo_barra(fn_emisor_proc IN creditopy.ramos.emisor_procesador%TYPE, fn_ramo IN creditopy.ramos.ramo%TYPE, fn_comercio IN creditopy.comercios.comercio%TYPE) RETURN NUMBER IS -- datos del ramo del comercio para grafico de consumo, si no es ramo 96, 97 o 98 -- ramo 99 es ramo especial en la 805 y tiene comercios especiales -- 9900030 GUARANICARD -- 9960410 PLANES DECAIDOS -- 9999998 COSUMO EN EL EXT. ON LINE -- se accede a esta funcion solo para los rubros tipo 1 (cupon) y para las autorizaciones -- si el ramo y el comercio vienen en 0 es un consumo en el exterior vn_ramo creditopy.ramos.ramo%TYPE; BEGIN vn_ramo := 0; CASE WHEN fn_emisor_proc = 805 OR fn_emisor_proc = 0 THEN CASE -- los cupones procesados del exterior tienen comercio = 0 WHEN fn_comercio = 0 THEN vn_ramo := 99; -- se toman como consumos las autorizaciones en GuaraniCard y compras en el exterior WHEN fn_comercio IN (9900030, 9999998) THEN vn_ramo := fn_ramo; ELSE IF fn_ramo NOT IN (96, 97, 98, 99) THEN vn_ramo := fn_ramo; ELSE vn_ramo := 0; END IF; END CASE; WHEN fn_emisor_proc = 806 THEN IF fn_ramo NOT IN (96, 97, 98) THEN vn_ramo := fn_ramo; ELSE vn_ramo := 0; END IF; ELSE vn_ramo := 0; END CASE; RETURN vn_ramo; EXCEPTION WHEN no_data_found THEN vn_ramo := 0; RETURN vn_ramo; WHEN OTHERS THEN RAISE; END fn_get_cod_ramo_barra; FUNCTION fn_get_desc_ramo_barra(fn_emisor_proc IN creditopy.ramos.emisor_procesador%TYPE, fn_ramo IN creditopy.ramos.ramo%TYPE, fn_comercio IN creditopy.comercios.comercio%TYPE) RETURN VARCHAR2 IS /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 24/04/2019 Propósito: Función que retorna la descripción del movimiento. ******************************************************************************************************/ -- datos del ramo del comercio para grafico de consumo, si no es ramo 96, 97 o 98 -- ramo 99 es ramo especial en la 805 y tiene comercios especiales -- 9900030 GUARANICARD -- 9960410 PLANES DECAIDOS -- 9999998 COSUMO EN EL EXT. ON LINE -- se accede a esta funcion solo para los rubros tipo 1 (cupon) y para las autorizaciones -- si el ramo y el comercio vienen en 0 es un consumo en el exterior vc_desc_ramo creditopy.ramos.descripcion%TYPE; BEGIN vc_desc_ramo := ' '; CASE WHEN fn_emisor_proc = 805 OR fn_emisor_proc = 0 THEN CASE -- los cupones procesados del exterior tienen comercio = 0 WHEN fn_comercio = 0 THEN vc_desc_ramo := 'COMPRAS EN EL EXTERIOR'; -- se toman como consumos las compras en GuaraniCard y compras en el exterior WHEN fn_comercio = 9900030 THEN vc_desc_ramo := 'GUARANICARD'; WHEN fn_comercio = 9999998 THEN vc_desc_ramo := 'COMPRAS EN EL EXTERIOR'; ELSE IF fn_ramo NOT IN (96, 97, 98, 99) THEN vc_desc_ramo := creditopy.Pkg_Dimo_Ceibo.fn_get_ramo_desc(fn_emisor_proc, fn_ramo); ELSE vc_desc_ramo := ' '; END IF; END CASE; WHEN fn_emisor_proc = 806 THEN IF fn_ramo NOT IN (96, 97, 98) THEN vc_desc_ramo := creditopy.Pkg_Dimo_Ceibo.fn_get_ramo_desc(fn_emisor_proc, fn_ramo); ELSE vc_desc_ramo := ' '; END IF; ELSE vc_desc_ramo := ' '; END CASE; RETURN vc_desc_ramo; EXCEPTION WHEN no_data_found THEN vc_desc_ramo := ' '; RETURN vc_desc_ramo; WHEN OTHERS THEN RAISE; END fn_get_desc_ramo_barra; FUNCTION fn_get_movto_desc(fn_emisor IN creditopy.movtos_cuentas.emisor%TYPE, fn_numero_cuenta IN creditopy.movtos_cuentas.numero_cuenta%TYPE, fn_rubro IN creditopy.movtos_cuentas.rubro%TYPE, fn_codigo_operacion IN creditopy.movtos_cuentas.codigo_operacion%TYPE, fn_moneda IN creditopy.movtos_cuentas.moneda%TYPE, fn_importe IN creditopy.movtos_cuentas.importe_ml%TYPE, fn_fecha_movimiento IN creditopy.movtos_cuentas.fecha_movimiento%TYPE, fn_fecha_proceso IN creditopy.movtos_cuentas.fecha_valor%TYPE, fn_numero_talon IN creditopy.movtos_cuentas.numero_talon%TYPE, fn_numero_comercio IN creditopy.movtos_cuentas.numero_comercio%TYPE, fn_leyenda IN VARCHAR2) RETURN VARCHAR2 IS vc_desc_rubro creditopy.rubros.descripcion%TYPE; VN_RUBRO_PROMO_DTO NUMBER := 3577; vn_buscar_concepto NUMBER; vc_concepto VARCHAR2(35); /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 12/05/2019 Propósito: Función que retorna la descripción del rubro del movimiento, teniendo como dato de entrada el id del rubro. Version adaptada de fn_get_comercio_desc: obtiene los datos del concepto del movimiento de ajuste CR/DB implementado para Tarjetas Prepagas. ******************************************************************************************************/ BEGIN vc_desc_rubro := ' '; IF fn_rubro = VN_RUBRO_PROMO_DTO THEN vc_desc_rubro := 'DTO. PROMO '; IF fn_numero_comercio > 0 THEN vc_desc_rubro := vc_desc_rubro || creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(ceibo_utiles.FN_GET_EMISOR_PROCESADOR(fn_emisor), fn_numero_comercio, fn_emisor); END IF; ELSE BEGIN IF creditopy.pkg_dimo_ceibo.fn_is_prepaga(fn_emisor) = 1 THEN SELECT decode(nvl(TRIM(r.descripcion), ' '), ' ', ru.descripcion, r.descripcion), r.buscar_concepto INTO vc_desc_rubro, vn_buscar_concepto FROM creditopy.rubros ru, creditopy.rubros_glosa_tp r WHERE ru.rubro = fn_rubro AND r.rubro = ru.rubro; ELSE IF TRIM(fn_leyenda) IS NOT NULL THEN vn_buscar_concepto := 1; ELSE vn_buscar_concepto := 0; END IF; END IF; IF vn_buscar_concepto = 1 THEN IF TRIM(fn_leyenda) IS NOT NULL THEN vc_concepto := fn_leyenda; ELSE BEGIN SELECT ma.leyenda INTO vc_concepto FROM creditopy.movimientos_ajustes ma WHERE ma.emisor = fn_emisor AND ma.numero_cuenta = fn_numero_cuenta AND ma.rubro = fn_rubro AND ma.codigo_operacion = fn_codigo_operacion AND ma.tipo_de_moneda = decode(fn_moneda, 830, 1, 840, 2, 2) AND ma.importe = fn_importe AND ma.fecha_movimiento = fn_fecha_movimiento AND ma.fecha_proceso = fn_fecha_proceso AND ma.numero_talon = fn_numero_talon; EXCEPTION WHEN no_data_found THEN vc_concepto := NULL; WHEN OTHERS THEN RAISE; END; END IF; END IF; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := ' '; WHEN OTHERS THEN RAISE; END; END IF; IF vc_desc_rubro = ' ' AND vc_concepto IS NULL THEN SELECT r.descripcion INTO vc_desc_rubro FROM creditopy.rubros r WHERE r.rubro = fn_rubro; END IF; IF vc_concepto IS NULL THEN RETURN vc_desc_rubro; ELSE RETURN vc_concepto; END IF; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := ' '; RETURN vc_desc_rubro; WHEN OTHERS THEN RAISE; END fn_get_movto_desc; FUNCTION fn_get_comercio_desc(fn_emisor_proc IN creditopy.comercios.emisor_procesador%TYPE, fn_comercio IN creditopy.comercios.comercio%TYPE, fn_emisor IN creditopy.cuentas.emisor%TYPE, fn_rubro IN creditopy.rubros.rubro%TYPE DEFAULT NULL, fn_tipo_rubro IN creditopy.rubros.tipo_de_rubro%TYPE DEFAULT NULL, fn_compra_ext IN creditopy.movtos_cuentas.compra_exterior%TYPE DEFAULT NULL, fn_cupon_interno IN creditopy.cupones_internac.cupon%TYPE DEFAULT NULL) RETURN VARCHAR2 IS vc_desc_rubro VARCHAR2(30); vc_desc_comercio VARCHAR2(100); vc_debaut_mensaje creditopy.mensajes_cupon.mensaje%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 01/07/2019 Propósito: Función que retorna la descripción del comercios, teniendo como dato de entrada el id del comercio. Se incluyen casos para mas claridad para la visualizacion del usuario Si es consulta de tarjeta prepaga se incluye glosa mapeada ******************************************************************************************************/ BEGIN vc_desc_rubro := ' '; vc_desc_comercio := ' '; vc_debaut_mensaje := NULL; CASE nvl(fn_rubro, 0) WHEN 0 THEN vc_desc_rubro := ' '; ELSE CASE nvl(fn_tipo_rubro, 0) -- si es una compra o adelanto WHEN 1 THEN -- 1ro) verificamos si es compra en el exterior IF nvl(fn_compra_ext, 0) != 0 THEN BEGIN SELECT TRIM(ci.nombre_fantasia_comercio) || ' ( ' || TRIM(m.simbolo) || ' ' || TRIM(to_char(ci.importe_moneda_origen, '999G999G999D99MI', 'NLS_NUMERIC_CHARACTERS = '',.'' ')) || ' = ' || 'U$s ' || TRIM(to_char(ci.importe_mr, '999G999G999D99MI', 'NLS_NUMERIC_CHARACTERS = '',.'' ')) || '; ' || 'Cambio: G ' || TRIM(to_char(ci.tipo_de_cambio, '999G999G999D99MI', 'NLS_NUMERIC_CHARACTERS = '',.'' ')) || ' )' INTO vc_desc_comercio FROM creditopy.cupones_internac ci, debcredpy.monedas m WHERE CI.CUPON = fn_cupon_interno AND m.producto = ci.producto AND m.codigo_de_moneda = ci.moneda; EXCEPTION WHEN no_data_found THEN vc_desc_comercio := 'COMPRAS EN EL EXTERIOR'; WHEN OTHERS THEN RAISE; END; ELSE -- 2do) si es debito automatico: al nombre del comercio se le agrega el mensaje -- para el usuario, si tiene IF fn_rubro = 1900 THEN vc_desc_rubro := creditopy.Pkg_Dimo_Ceibo.fn_get_rubro_desc(fn_rubro, fn_emisor); vc_desc_comercio := ' '; vc_debaut_mensaje := NULL; BEGIN SELECT md.mensaje INTO vc_debaut_mensaje FROM creditopy.mensajes_cupon md WHERE md.cupon = fn_cupon_interno; EXCEPTION WHEN no_data_found THEN vc_debaut_mensaje := NULL; WHEN OTHERS THEN RAISE; END; END IF; END IF; -- sino es un movimiento de pago o ajuste o cargo ELSE vc_desc_rubro := creditopy.Pkg_Dimo_Ceibo.fn_get_rubro_desc(fn_rubro, fn_emisor); END CASE; END CASE; IF vc_desc_comercio = ' ' AND nvl(fn_comercio, 0) != 0 THEN CASE WHEN fn_emisor_proc = 805 AND nvl(fn_comercio, 0) = 9999998 THEN vc_desc_comercio := 'COMPRAS EN EL EXTERIOR'; ELSE SELECT co.descripcion INTO vc_desc_comercio FROM creditopy.comercios co WHERE co.emisor_procesador = fn_emisor_proc AND co.comercio = fn_comercio; END CASE; END IF; IF vc_desc_rubro != ' ' THEN IF vc_desc_comercio = ' ' THEN vc_desc_comercio := TRIM(vc_desc_rubro); ELSE IF vc_debaut_mensaje IS NULL THEN vc_desc_comercio := TRIM(vc_desc_rubro) || '-' || TRIM(vc_desc_comercio); ELSE vc_desc_comercio := TRIM(vc_desc_comercio) || '-' || TRIM(vc_debaut_mensaje); END IF; END IF; END IF; RETURN vc_desc_comercio; EXCEPTION WHEN no_data_found THEN vc_desc_comercio := ' '; RETURN vc_desc_comercio; WHEN OTHERS THEN RAISE; END fn_get_comercio_desc; FUNCTION fn_get_leyenda_movimiento(fn_emisor IN creditopy.movtos_cuentas.emisor%TYPE, fn_numero_cuenta IN creditopy.movtos_cuentas.numero_cuenta%TYPE, fn_rubro IN creditopy.movtos_cuentas.rubro%TYPE, fn_codigo_operacion IN creditopy.movtos_cuentas.codigo_operacion%TYPE, fn_moneda IN creditopy.movtos_cuentas.moneda%TYPE, fn_importe IN creditopy.movtos_cuentas.importe_ml%TYPE, fn_fecha_movimiento IN creditopy.movtos_cuentas.fecha_movimiento%TYPE, fn_fecha_proceso IN creditopy.movtos_cuentas.fecha_valor%TYPE, fn_numero_talon IN creditopy.movtos_cuentas.numero_talon%TYPE, fn_numero_comercio IN creditopy.movtos_cuentas.numero_comercio%TYPE, fn_leyenda IN VARCHAR2) RETURN VARCHAR2 IS vc_desc_rubro VARCHAR2(300); vn_rubro_especial NUMBER := 0; VN_RUBRO_PROMO_DTO NUMBER := 3577; vn_codigos_py_cuo NUMBER := 14; vn_buscar_leyenda NUMBER := 0; vc_leyenda_ajuste VARCHAR2(300); vc_leyenda VARCHAR2(300); vc_glosa VARCHAR2(300); vr_sicoop_uuid creditopy.sicoop_uuid@olpy%ROWTYPE; v_num_cuenta_origen NUMBER; v_num_cuenta_destino NUMBER; /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 06/08/2020 Propósito: Función que retorna la leyenda de un movimiento de ajuste ingresado por la entidad teniendo como dato de entrada el id del rubro. Obtiene los datos del concepto del movimiento de ajuste CR/DB. OBS: Los ajustes corresponden a los rubros de tipo_de_rubro = 3 - Ajuste, y deben ingresar al proceso a traves de la tabla MOVIMIENTOS_AJUSTES. Tambien pueden quedar registrados en la misma tabla los cargos con tipo_de_rubro = 3 y tipo_de_rubro = 4 - Producto ******************************************************************************************************/ BEGIN vc_desc_rubro := NULL; vc_leyenda := NULL; vn_buscar_leyenda := 0; vn_rubro_especial := 0; vc_glosa := ' '; -- Ver rubros con leyenda especial (valores para procesos): -- no debe utilizarse la leyenda sino la descripcion del rubro BEGIN IF fn_rubro = VN_RUBRO_PROMO_DTO THEN vn_rubro_especial := 1; -- busco el nombre del comercio de la promo IF fn_numero_comercio > 0 THEN BEGIN SELECT co.descripcion INTO vc_desc_rubro FROM creditopy.comercios co WHERE co.comercio = fn_numero_comercio; vc_desc_rubro := 'DTO. PROMO ' || vc_desc_rubro; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := 'DTO. PROMO'; WHEN OTHERS THEN RAISE; END; END IF; ELSE CASE WHEN (upper(substr(fn_leyenda, 4, 5)) = 'CUOTA') THEN vn_rubro_especial := 1; ELSE SELECT 1 INTO vn_rubro_especial FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = vn_codigos_py_cuo AND TRIM(cp.valor) = fn_rubro; END CASE; -- si vn_rubro_especial = 1 armar la glosa de la cuota END IF; EXCEPTION WHEN no_data_found THEN vn_rubro_especial := 0; WHEN OTHERS THEN RAISE; END; IF fn_leyenda IS NULL THEN BEGIN SELECT ma.leyenda INTO vc_leyenda_ajuste FROM creditopy.movimientos_ajustes ma WHERE ma.emisor = fn_emisor AND ma.numero_cuenta = fn_numero_cuenta AND ma.rubro = fn_rubro AND ma.codigo_operacion = fn_codigo_operacion AND ma.tipo_de_moneda = decode(fn_moneda, 830, 1, 840, 2, 2) AND ma.importe = fn_importe AND ma.fecha_movimiento = fn_fecha_movimiento AND ma.fecha_proceso = fn_fecha_proceso AND ma.numero_talon = fn_numero_talon; EXCEPTION WHEN no_data_found THEN vc_leyenda_ajuste := NULL; WHEN OTHERS THEN RAISE; END; ELSE vc_leyenda_ajuste := fn_leyenda; END IF; -- se incluye la busqueda de la glosa en claro para los ajustes ingresados por trxs sicoop IF nvl(vn_rubro_especial, 0) != 1 AND substr(nvl(vc_leyenda_ajuste, ' '), 1, 8) = 'RefDimo.' THEN -- busco los datos de sicoop_uuid vr_sicoop_uuid.numero_auditoria := substr(fn_leyenda, 9, 6); vr_sicoop_uuid.fecha := fn_fecha_movimiento; BEGIN SELECT uuid.rubro, uuid.num_cuenta_origen, uuid.glosa_para_origen, uuid.num_cuenta_destino, uuid.glosa_para_destino INTO vr_sicoop_uuid.rubro, vr_sicoop_uuid.num_cuenta_origen, vr_sicoop_uuid.glosa_para_origen, vr_sicoop_uuid.num_cuenta_destino, vr_sicoop_uuid.glosa_para_destino FROM creditopy.sicoop_uuid@OLPY uuid WHERE uuid.numero_auditoria = vr_sicoop_uuid.numero_auditoria AND uuid.fecha = vr_sicoop_uuid.fecha; EXCEPTION WHEN no_data_found THEN NULL; WHEN OTHERS THEN RAISE; END; -- si es el rubro cargo se deja que la glosa se resuelva como cargo -- sino se despliega la leyenda IF vr_sicoop_uuid.rubro != fn_rubro THEN v_num_cuenta_origen := 0; v_num_cuenta_destino := 0; -- controlar si el movimiento es para la centa origen BEGIN SELECT n.numero_cuenta INTO v_num_cuenta_origen FROM creditopy.tarjetas n WHERE n.tarjeta = fc_pan2cripto(vr_sicoop_uuid.num_cuenta_origen); IF v_num_cuenta_origen = fn_numero_cuenta THEN vc_leyenda := vr_sicoop_uuid.glosa_para_origen; vn_rubro_especial := 1; vn_buscar_leyenda := 0; END IF; EXCEPTION WHEN no_data_found THEN v_num_cuenta_origen := 0; WHEN OTHERS THEN RAISE; END; IF v_num_cuenta_origen = 0 THEN -- controlar si el movimiento es para la centa origen BEGIN SELECT n.numero_cuenta INTO v_num_cuenta_destino FROM creditopy.tarjetas n WHERE n.tarjeta = fc_pan2cripto(vr_sicoop_uuid.num_cuenta_destino); IF v_num_cuenta_destino = fn_numero_cuenta THEN vc_leyenda := vr_sicoop_uuid.glosa_para_destino; vn_rubro_especial := 1; vn_buscar_leyenda := 0; END IF; EXCEPTION WHEN no_data_found THEN v_num_cuenta_destino := 0; WHEN OTHERS THEN RAISE; END; END IF; END IF; END IF; -- si no se obtuvo la leyenda entonces se busca por el rubro y sus condiciones IF nvl(vn_rubro_especial, 0) != 1 THEN -- se revisa si es un emisor prepago y debe buscar la glosa equivalente -- o es emisor TC y tiene parametrizado utilizar la leyenda como descripcion del movimiento BEGIN IF creditopy.pkg_dimo_ceibo.fn_is_prepaga(fn_emisor) = 1 THEN SELECT decode(nvl(TRIM(rg.descripcion), ' '), ' ', ru.descripcion, rg.descripcion), nvl(rg.buscar_concepto, 0) INTO vc_desc_rubro, vn_buscar_leyenda FROM creditopy.rubros ru, creditopy.rubros_glosa_tp rg WHERE ru.rubro = fn_rubro AND rg.rubro = ru.rubro; ELSE SELECT nvl(rg.buscar_concepto, 0) INTO vn_buscar_leyenda FROM creditopy.rubros_glosa_tc rg WHERE rg.emisor = fn_emisor AND (rg.rubro = fn_rubro OR rg.rubro = 0); END IF; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := NULL; vn_buscar_leyenda := 0; WHEN OTHERS THEN RAISE; END; -- si permite usar la leyenda se puede tomar el dato recibido, si no es leyenda especial -- o se busca la leyenda IF vn_buscar_leyenda = 1 THEN IF TRIM(fn_leyenda) IS NOT NULL THEN vc_leyenda := fn_leyenda; ELSE vc_leyenda := nvl(vc_leyenda_ajuste, ' '); END IF; ELSE vc_leyenda_ajuste := NULL; -- fix Release 2.7.9.1 PROD JZ/AR END IF; END IF; -- si hay leyenda se despliega la glosa del rubro + la leyenda -- si no hay leyenda del movimiento ni descripcion equivalente de rubro entonces -- desplegar la descripcion del rubro origen IF nvl(TRIM(vc_desc_rubro), ' ') = ' ' THEN SELECT r.descripcion INTO vc_desc_rubro FROM creditopy.rubros r WHERE r.rubro = fn_rubro; END IF; --if vc_leyenda is null then IF nvl(vc_leyenda_ajuste, ' ') = ' ' THEN vc_glosa := vc_desc_rubro; ELSE --vc_glosa := trim(vc_desc_rubro)||'-'||trim(vc_leyenda); vc_glosa := TRIM(vc_leyenda); END IF; RETURN vc_glosa; EXCEPTION WHEN no_data_found THEN vc_desc_rubro := ' '; RETURN vc_desc_rubro; WHEN OTHERS THEN RAISE; END fn_get_leyenda_movimiento; FUNCTION fn_get_glosa_aut_trxs(fi_tarjeta VARCHAR2, fi_tipo_trxs VARCHAR2, fi_fecha DATE, fi_hora DATE, fi_numero_auditoria NUMBER, fi_nro_ticket NUMBER, fi_emisor_proc NUMBER, fi_comercio NUMBER, fi_emisor NUMBER, fi_acquirer VARCHAR2) RETURN VARCHAR2 IS v_tarjeta VARCHAR2(16); vr_sicoop_uuid creditopy.sicoop_uuid@olpy%ROWTYPE; vc_glosa_transaccion VARCHAR2(1024); /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 18/06/2019 Propósito: Función que retorna la descripción modificada de la red de una transaccion ******************************************************************************************************/ BEGIN -- primero busca la glosa en la transaccion BEGIN v_tarjeta := fc_cripto2pan(fi_tarjeta); SELECT su.glosa_para_origen, su.glosa_para_destino INTO vr_sicoop_uuid.glosa_para_origen, vr_sicoop_uuid.glosa_para_destino FROM creditopy.sicoop_uuid@olpy su WHERE su.numero_auditoria = fi_numero_auditoria AND su.fecha = fi_fecha --and su.nro_ticket_rrn = fi_nro_ticket AND ((nvl(fi_tipo_trxs, ' ') = 'C' AND su.num_cuenta_origen = v_tarjeta) OR (nvl(fi_tipo_trxs, ' ') = 'P' AND su.num_cuenta_destino = v_tarjeta)); CASE nvl(fi_tipo_trxs, ' ') WHEN 'C' THEN -- consumo: la transaccion viene de una autorizacion de compra vc_glosa_transaccion := TRIM(vr_sicoop_uuid.glosa_para_origen); WHEN 'P' THEN -- pago o deposito vc_glosa_transaccion := TRIM(vr_sicoop_uuid.glosa_para_destino); ELSE vc_glosa_transaccion := ' '; END CASE; EXCEPTION WHEN no_data_found THEN vc_glosa_transaccion := ' '; WHEN OTHERS THEN RAISE; END; IF TRIM(vc_glosa_transaccion) IS NULL THEN IF nvl(fi_tipo_trxs, ' ') = 'C' THEN -- busco la descripcion del comercio vc_glosa_transaccion := creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(fi_emisor_proc, fi_comercio, fi_emisor); ELSE /*if nvl(fi_tipo_trxs,' ') = 'C' then vc_glosa_transaccion := 'DEPOSITO '||creditopy.Pkg_Dimo_Ceibo.FN_GET_RED(fi_acquirer); end if;*/ IF nvl(fi_tipo_trxs, ' ') = 'P' THEN IF pkg_dimo_ceibo.fn_is_prepaga(fi_emisor) = 1 THEN vc_glosa_transaccion := 'DEPOSITO ' || creditopy.Pkg_Dimo_Ceibo.FN_GET_RED(nvl(fi_acquirer, 0)); ELSE vc_glosa_transaccion := 'PAGO ' || creditopy.Pkg_Dimo_Ceibo.FN_GET_RED(nvl(fi_acquirer, 0)); END IF; END IF; END IF; END IF; RETURN vc_glosa_transaccion; EXCEPTION WHEN OTHERS THEN RAISE; END fn_get_glosa_aut_trxs; FUNCTION fn_get_red(fn_acquirer IN creditopy.acquirers.acquirer@olpy%TYPE) RETURN VARCHAR2 IS vc_desc_red creditopy.acquirers.descripcion@olpy%TYPE; /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 18/06/2019 Propósito: Función que retorna la descripción modificada de la red de una transaccion ******************************************************************************************************/ BEGIN SELECT decode(h.acquirer, 10000000005, 'EN LINEA', 10000000013, 'EN BOCA DE COBRANZA', 10000000008, 'EN CAJA', REPLACE(h.descripcion, 'PAGOS ')) INTO vc_desc_red FROM creditopy.acquirers@olpy h WHERE h.acquirer = fn_acquirer; RETURN vc_desc_red; EXCEPTION WHEN no_data_found THEN vc_desc_red := ' '; RETURN vc_desc_red; WHEN OTHERS THEN RAISE; END fn_get_red; FUNCTION fn_get_motivo_bloqueo(fn_motivo IN motivos_devolucion.devcod%TYPE) RETURN VARCHAR2 AS vc_resultado VARCHAR2(128); BEGIN SELECT devdesc INTO vc_resultado FROM creditopy.motivos_devolucion md WHERE md.devcod = fn_motivo; RETURN vc_resultado; EXCEPTION WHEN no_data_found THEN RETURN 'NO DEFINIDO'; END; FUNCTION fn_get_ult_rechazo_solicitud(fn_id_solicitud IN solicitudes_recibidas.id_solicitud_recibida%TYPE, fn_codigo_respuesta IN solicitudes_recibidas.codigo_respuesta%TYPE) RETURN VARCHAR2 AS vc_motivo creditopy.solicitudes_motivos_rechazos.motivo_rechazo%TYPE; BEGIN SELECT x.motivo_rechazo resultado INTO vc_motivo FROM creditopy.solicitudes_recibidas sr, creditopy.solicitudes_motivos_rechazos x WHERE sr.id_solicitud_recibida = fn_id_solicitud AND sr.codigo_respuesta != 0 AND x.id_solicitud_recibida = sr.id_solicitud_recibida AND x.regla_id = fn_codigo_respuesta; RETURN vc_motivo; EXCEPTION WHEN no_data_found THEN RETURN 'NO DEFINIDO'; WHEN OTHERS THEN RAISE; END; FUNCTION fn_random RETURN BINARY_INTEGER IS vn_inicio NUMBER; vn_random BINARY_INTEGER; BEGIN vn_inicio := to_char(systimestamp, 'FF'); dbms_random.initialize(vn_inicio); vn_random := dbms_random.random; dbms_random.terminate; RETURN(vn_random); END fn_random; FUNCTION fn_gen_pin(fn_pin IN tarjetas.pin%TYPE DEFAULT NULL) RETURN VARCHAR2 AS vc_pin tarjetas.pin%TYPE; BEGIN IF fn_pin IS NULL THEN vc_pin := rpad(substr(fn_random, -4), 16, 0); ELSE vc_pin := fn_pin; END IF; vc_pin := pcutiles.desf('E', 'ADCF8073FAD1CF55', vc_pin); RETURN vc_pin; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, 'Error al calcular el pin para la tarjeta.'); END fn_gen_pin; FUNCTION fn_getComercioGestionDIMO RETURN NUMBER AS v_cod_comercio_dimo NUMBER; BEGIN SELECT ec.comercio_puente INTO v_cod_comercio_dimo FROM creditopy.emisor_comercios_tarj_puente ec WHERE ec.participante = 115; RETURN v_cod_comercio_dimo; EXCEPTION WHEN no_data_found THEN RETURN - 1; WHEN OTHERS THEN raise_application_error(-20001, 'Error al obtener comercio de gestion DIMO.'); END; FUNCTION fc_getTarjetaPuenteDIMO RETURN VARCHAR2 AS v_tarjeta_puente_DIMO VARCHAR2(16); BEGIN SELECT ec.tarjeta_puente INTO v_tarjeta_puente_DIMO FROM creditopy.emisor_comercios_tarj_puente ec WHERE ec.participante = 115; RETURN v_tarjeta_puente_DIMO; EXCEPTION WHEN no_data_found THEN RETURN - 1; WHEN OTHERS THEN raise_application_error(-20001, 'Error al obtener tarjeta para transferencia DIMO.'); END; FUNCTION fn_emisor_proc_habilitado(fn_emisor IN NUMBER) RETURN NUMBER AS v_emisor_proc NUMBER; v_habil_generico NUMBER; v_habilitado NUMBER; BEGIN v_emisor_proc := CEIBO_UTILES.FN_GET_EMISOR_PROCESADOR(fn_emisor); BEGIN SELECT ep.habilitado_dimo INTO v_habil_generico FROM creditopy.emisor_procesador_dimo ep WHERE ep.emisor_procesador = v_emisor_proc AND ep.emisor = 0; EXCEPTION WHEN no_data_found THEN v_habil_generico := 0; WHEN OTHERS THEN RAISE; END; BEGIN SELECT ep.habilitado_dimo INTO v_habilitado FROM creditopy.emisor_procesador_dimo ep WHERE ep.emisor_procesador = v_emisor_proc AND ep.emisor = fn_emisor; v_habil_generico := 0; -- se desactiva porque prima el flag obtenido EXCEPTION WHEN no_data_found THEN v_habilitado := 0; WHEN OTHERS THEN RAISE; END; IF v_habilitado = 0 THEN v_habilitado := v_habil_generico; END IF; RETURN v_habilitado; EXCEPTION WHEN no_data_found THEN RETURN 0; WHEN OTHERS THEN raise_application_error(-20001, 'Error al obtener procesador habilitado DIMO.'); END; FUNCTION FC_GET_FECHA_LARGA(DP_FECHA IN DATE) RETURN VARCHAR2 AS BEGIN RETURN TO_CHAR(DP_FECHA, FORMATO_FECHA); END FC_GET_FECHA_LARGA; FUNCTION FC_GET_ID_NOVEDAD RETURN VARCHAR2 AS BEGIN RETURN 'Tipo Novedad>' || VR_HISTORICO.NOVTIP || '< Novedad>' || VR_HISTORICO.NOVNRO || '< Fecha Ingreso>' || NVL(TO_CHAR(VR_HISTORICO.NOVFCHING, FORMATO_FECHA), 'NONE') || '< NovGen>' || VR_HISTORICO.NOVGEN || '< Usuario>' || VR_HISTORICO.USUARIO || '<'; END; FUNCTION FC_GET_TIPO_PLASTICO RETURN VARCHAR2 AS VC_TIPO_PLASTICO VARCHAR2(2); PROCEDURE PL_TOO_MANY AS BEGIN SELECT A.TIPO_PLASTICO INTO VC_TIPO_PLASTICO FROM CREDITOPY.TIPO_PLASTICO A, CREDITOPY.GRUPOS_AFINIDAD B WHERE B.EMISOR = A.EMISOR AND B.PRODUCTO = A.PRODUCTO AND B.GRUPO_AFINIDAD = A.GRUPO_AFINIDAD AND SUBSTR(B.DESCRIPCION, 1, 2) = A.TIPO_PLASTICO AND A.EMISOR = VR_AFINIDAD.EMISOR AND A.PRODUCTO = VR_AFINIDAD.PRODUCTO AND A.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD; EXCEPTION WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.FC_GET_TIPO_PLASTICO.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.PRODUCTO:' || VR_AFINIDAD.PRODUCTO || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD || FC_GET_ID_NOVEDAD || SQLERRM); END PL_TOO_MANY; BEGIN SELECT A.TIPO_PLASTICO INTO VC_TIPO_PLASTICO FROM CREDITOPY.TIPO_PLASTICO A WHERE A.EMISOR = VR_AFINIDAD.EMISOR AND A.PRODUCTO = VR_AFINIDAD.PRODUCTO AND A.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD; RETURN VC_TIPO_PLASTICO; EXCEPTION WHEN TOO_MANY_ROWS THEN PL_TOO_MANY; RETURN VC_TIPO_PLASTICO; WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.FC_GET_TIPO_PLASTICO.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.PRODUCTO:' || VR_AFINIDAD.PRODUCTO || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD || FC_GET_ID_NOVEDAD || SQLERRM); END FC_GET_TIPO_PLASTICO; FUNCTION FN_GET_NRO_NOVEDAD RETURN NUMBER AS VN_RESULTADO NUMBER(6); VL_INTENTOS NUMBER := 0; BEGIN VL_INTENTOS := VL_INTENTOS + 1; SELECT CONTADOR_NOVEDADES.NEXTVAL@OLPY INTO VN_RESULTADO FROM DUAL; RETURN VN_RESULTADO; EXCEPTION WHEN OTHERS THEN IF VL_INTENTOS <= 3 THEN VL_INTENTOS := VL_INTENTOS + 1; SELECT CONTADOR_NOVEDADES.NEXTVAL@OLPY INTO VN_RESULTADO FROM DUAL; RETURN VN_RESULTADO; ELSE RAISE_APPLICATION_ERROR(-20100, 'No se pudo recuperar el valor de la secuencia. Error: ' || SQLERRM); END IF; END FN_GET_NRO_NOVEDAD; FUNCTION FC_PARSE_CADENA(CP_CADENA IN CLOB, NP_PARSE IN INTEGER, NP_LEN_DATA IN BINARY_INTEGER) RETURN VARCHAR2 AS VI_INDEX BINARY_INTEGER; BEGIN VI_INDEX := 1 + (NP_LEN_DATA * NP_PARSE - NP_LEN_DATA); RETURN SUBSTR(DBMS_LOB.substr(CP_CADENA, DBMS_LOB.getlength(CP_CADENA), 1), VI_INDEX, NP_LEN_DATA); END FC_PARSE_CADENA; FUNCTION F_FILTRAR_CARACTERES_INVALIDOS(CP_PALABRA_A_FILTRAR IN VARCHAR2) RETURN VARCHAR2 IS VC_RESULTADO VARCHAR2(2049); VC_LISTA_NEGRA VARCHAR2(2049); VC_CARACTER CHAR(1); VC_CAMBIO CHAR(1); VN_POSICION BINARY_INTEGER; -- ¿ÁÉÍÓÚáéíóúÁÉÍÓÚ'?&#-_abcdefghijklmnñopqrstuvwxyzÄËÏÖÜäëïöüÂÊÎÔÛâêîôû VC_CAMBIOS VARCHAR2(512) := '#AEIOUAEIOUAEIOU######ABCEDFGHIJKLMNNOPQRSTUVWXYZAEIOUAEIOUAEIOUAEIOU'; BEGIN VC_RESULTADO := CP_PALABRA_A_FILTRAR; --Filtramos el Nombre Plastico VC_LISTA_NEGRA := FC_GET_BLACKLIST_EMBOZADO(805); FOR VN_INDEX IN 1 .. LENGTH(VC_RESULTADO) LOOP VC_CARACTER := SUBSTR(VC_RESULTADO, VN_INDEX, 1); VN_POSICION := INSTR(VC_LISTA_NEGRA, VC_CARACTER); IF VN_POSICION > 0 THEN VC_CAMBIO := SUBSTR(VC_CAMBIOS, VN_POSICION, 1); VC_RESULTADO := REPLACE(VC_RESULTADO, VC_CARACTER, VC_CAMBIO); END IF; END LOOP; RETURN(vc_resultado); END F_FILTRAR_CARACTERES_INVALIDOS; FUNCTION FC_GET_NOMBRE_PLASTICO(CP_NOMBRES IN DEBCREDPY.PERSONAS.NOMBRES%TYPE, CP_APELLIDOS IN DEBCREDPY.PERSONAS.APELLIDOS%TYPE) RETURN TARJETAS.NOMBRE_PARA_PLASTICO%TYPE AS VC_NOMBRE DEBCREDPY.PERSONAS.NOMBRES%TYPE; VC_APELLIDO DEBCREDPY.PERSONAS.NOMBRES%TYPE; VC_COMODIN DEBCREDPY.PERSONAS.NOMBRES%TYPE; VC_NOMRE_PLASTICO TARJETAS.NOMBRE_PARA_PLASTICO%TYPE; --VC_LISTA_NEGRA VARCHAR2(2048); --VC_CARACTER CHAR(1); BEGIN ----Obtener Nombre para Plastico CEIBO_COMERCIOS.PR_GET_NOMBRES_APELLIDOS(CP_NOMBRES, VC_NOMBRE, VC_COMODIN); CEIBO_COMERCIOS.PR_GET_NOMBRES_APELLIDOS(CP_APELLIDOS, VC_APELLIDO, VC_COMODIN); VC_NOMRE_PLASTICO := UPPER(TRIM(SUBSTR(VC_NOMBRE || ' ' || VC_APELLIDO, 1, 26))); --VC_NOMRE_PLASTICO := fc_filtrar_nompla(VC_NOMRE_PLASTICO); VC_NOMRE_PLASTICO := F_FILTRAR_CARACTERES_INVALIDOS(VC_NOMRE_PLASTICO); --Filtramos el Nombre Plastico /* VC_LISTA_NEGRA := FC_GET_BLACKLIST_EMBOZADO(805); FOR VN_INDEX IN 1 .. LENGTH(VC_NOMRE_PLASTICO) LOOP VC_CARACTER := SUBSTR(VC_NOMRE_PLASTICO,VN_INDEX,1); IF INSTR(VC_LISTA_NEGRA,VC_CARACTER) > 0 THEN --Excepto numeral. IF VC_CARACTER !='#' THEN VC_NOMRE_PLASTICO := REPLACE(VC_NOMRE_PLASTICO,VC_CARACTER,'#'); END IF; END IF; END LOOP; */ RETURN VC_NOMRE_PLASTICO; END; --FUNCTION FD_FECHA_PROCESO(CP_PROCESO IN VARCHAR2 DEFAULT 'NONE') FUNCTION FD_FECHA_PROCESO RETURN DEBCREDPY.FECHAS.FECHA_HOY%TYPE AS VD_FECHA_PROCESO DATE; BEGIN /*Solo existe Fecha Proceso para la 805. AR,ER 201508112302*/ VD_FECHA_PROCESO := CEIBO_SOCIOS.GET_FECHA_PROCESO_MOV(805, VR_HISTORICO.NOVTIP); /* Si la fecha proceso es en el dia, entonces aplicar SYSDATE. Caso contrario mantener la fecha sin hora. De lo contrario, si tomamos la hora y le agregamos a la fecha proceso puede que la posterior activacion figure como anterior a la fecha y hora del proceso. */ IF TRUNC(SYSDATE) = TRUNC(VD_FECHA_PROCESO) THEN VD_FECHA_PROCESO := SYSDATE; END IF; PR_LOGGING('WS', '01', ' FECHA_PROCESO>' || FC_GET_FECHA_LARGA(VD_FECHA_PROCESO)); RETURN VD_FECHA_PROCESO; EXCEPTION WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.FD_FECHA_PROCESO.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD); PR_LOGGING('WS', '01', FC_GET_ID_NOVEDAD || 'Error:' || SQLERRM); RAISE; END FD_FECHA_PROCESO; FUNCTION FN_GET_NEXT_ADICIONAL(NP_NUMERO_CUENTA IN TARJETAS.NUMERO_CUENTA%TYPE) RETURN TARJETAS.ADICIONAL%TYPE AS VN_ADICIONAL TARJETAS.ADICIONAL%TYPE; BEGIN SELECT NVL(MAX(A.ADICIONAL), 0) + 1 INTO VN_ADICIONAL FROM CREDITOPY.TARJETAS A WHERE A.NUMERO_CUENTA = NP_NUMERO_CUENTA; RETURN VN_ADICIONAL; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, 'PKG_DIMO_CEIBO.FD_FECHA_PROCESO.FN_GET_NEXT_ADICIONAL' || ' NP_NUMERO_CUENTA:' || NP_NUMERO_CUENTA || ' ' || FC_GET_ID_NOVEDAD || ' Error:' || SQLERRM); END; FUNCTION FD_GET_NEW_VIGENCIA RETURN DATE AS VD_VIGENCIA DATE; FUNCTION FL_GET_PARAMETROS RETURN VARCHAR2 AS BEGIN RETURN 'Parametros: EMISOR>' || VR_AFINIDAD.EMISOR || '<' || 'PRODUCTO>' || VR_AFINIDAD.PRODUCTO || '<' || 'GRUPO_AFINIDAD>' || VR_AFINIDAD.GRUPO_AFINIDAD || '<' || 'CARTERA>' || VR_CARTERA.CARTERA || '<' || 'FECHA_PROCESO>' || VR_CUENTA.FECHA_ESTADO || '<'; END FL_GET_PARAMETROS; BEGIN VD_VIGENCIA := CEIBO_SOCIOS.GET_VIGENCIA_NUEVA(VR_TARJETA.EMISOR, VR_TARJETA.PRODUCTO, VR_TARJETA.GRUPO_AFINIDAD, VR_CUENTA.CARTERA, VR_CUENTA.FECHA_ESTADO, NULL, NULL); RETURN VD_VIGENCIA; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, 'No se logro obtener una vigencia valida.' || FC_GET_ID_NOVEDAD || '<No se logro obtener una vigencia valida.' || FL_GET_PARAMETROS || ' Error>' || SQLERRM); END; FUNCTION FN_GET_COBOL_CUENTA_DV(CP_CUENTA IN VARCHAR2) RETURN NUMBER AS VC_CUENTA VARCHAR2(12); VC_BASE VARCHAR2(12) := '971397139713'; VN_TOTAL NUMBER(4); VN_FACTOR NUMBER(2); FUNCTION FI_DIGITO_ONE(NP_DIGITO IN NUMBER, NP_INDEX IN NUMBER) RETURN NUMBER AS BEGIN RETURN TO_NUMBER(SUBSTR(LPAD(NP_DIGITO, 2, 0), NP_INDEX, 1)); END FI_DIGITO_ONE; BEGIN VC_CUENTA := LPAD(CP_CUENTA, 12, 0); VN_TOTAL := 0; FOR VI_INDEX IN 1 .. 12 LOOP VN_FACTOR := TO_NUMBER(SUBSTR(VC_CUENTA, VI_INDEX, 1)) * TO_NUMBER(SUBSTR(VC_BASE, VI_INDEX, 1)); VN_TOTAL := VN_TOTAL + FI_DIGITO_ONE(VN_FACTOR, -1); END LOOP; IF VN_TOTAL > 9 THEN VN_TOTAL := FI_DIGITO_ONE(VN_TOTAL, 1) + 1 || 0 - VN_TOTAL; ELSE VN_TOTAL := 10 - VN_TOTAL; END IF; RETURN SUBSTR(LPAD(VN_TOTAL, 2, 0), -1); END FN_GET_COBOL_CUENTA_DV; FUNCTION FR_ULT_PERIODO_CERRADO(NP_EMISOR IN CALENDARIO_CIERRES.EMISOR%TYPE DEFAULT NULL, NP_PRODUCTO IN CALENDARIO_CIERRES.PRODUCTO%TYPE DEFAULT NULL, NP_CIERRE IN CALENDARIO_CIERRES.CIERRE%TYPE DEFAULT NULL, NP_GRUPO_AFINIDAD IN CALENDARIO_CIERRES.GRUPO_AFINIDAD%TYPE DEFAULT NULL) RETURN CREDITOPY.CALENDARIO_CIERRES%ROWTYPE AS VR_ULTIMO_CIERRE CREDITOPY.CALENDARIO_CIERRES%ROWTYPE; BEGIN VR_ULTIMO_CIERRE.EMISOR := NVL(NP_EMISOR, VR_CUENTA.EMISOR); VR_ULTIMO_CIERRE.PRODUCTO := NVL(NP_PRODUCTO, VR_CUENTA.PRODUCTO); VR_ULTIMO_CIERRE.CIERRE := NVL(NP_CIERRE, VR_CUENTA.CIERRE); VR_ULTIMO_CIERRE.PERIODO := CREDITOPY.CEIBO_UTILES.GetUltPeriodoCerrado(VR_ULTIMO_CIERRE.EMISOR, VR_ULTIMO_CIERRE.PRODUCTO, VR_ULTIMO_CIERRE.CIERRE); VR_ULTIMO_CIERRE.GRUPO_AFINIDAD := NVL(NP_GRUPO_AFINIDAD, VR_CUENTA.GRUPO_AFINIDAD); SELECT * INTO VR_ULTIMO_CIERRE FROM CREDITOPY.CALENDARIO_CIERRES@BAPY A WHERE A.EMISOR = VR_ULTIMO_CIERRE.EMISOR AND A.PRODUCTO = VR_ULTIMO_CIERRE.PRODUCTO AND A.CIERRE = VR_ULTIMO_CIERRE.CIERRE AND A.PERIODO = VR_ULTIMO_CIERRE.PERIODO AND A.GRUPO_AFINIDAD = VR_ULTIMO_CIERRE.GRUPO_AFINIDAD; RETURN VR_ULTIMO_CIERRE; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, FC_GET_ID_NOVEDAD || ' VR_ULTIMO_CIERRE.EMISOR:' || VR_ULTIMO_CIERRE.EMISOR || ' VR_ULTIMO_CIERRE.PRODUCTO:' || VR_ULTIMO_CIERRE.PRODUCTO || ' VR_ULTIMO_CIERRE.CIERRE:' || VR_ULTIMO_CIERRE.CIERRE || ' VR_ULTIMO_CIERRE.PERIODO:' || VR_ULTIMO_CIERRE.PERIODO || ' VR_ULTIMO_CIERRE.GRUPO_AFINIDAD:' || VR_ULTIMO_CIERRE.GRUPO_AFINIDAD || ' Error:' || SQLERRM); END FR_ULT_PERIODO_CERRADO; FUNCTION FC_FILTRAR_NOMPLA(CP_NOMBRE_PLASTICO IN VARCHAR2) RETURN VARCHAR2 IS VC_RESULTADO VARCHAR2(26); --VC_LISTA_NEGRA VARCHAR2(2049); --VC_CARACTER CHAR(1); --VC_CAMBIO CHAR(1); --VN_POSICION BINARY_INTEGER; -- ¿ÁÉÍÓÚáéíóúÁÉÍÓÚ'?&#-_abcdefghijklmnñopqrstuvwxyzÄËÏÖÜäëïöüÂÊÎÔÛâêîôû --VC_CAMBIOS VARCHAR2(512) := '#AEIOUAEIOUAEIOU######ABCEDFGHIJKLMNNOPQRSTUVWXYZAEIOUAEIOUAEIOUAEIOU'; BEGIN IF LENGTH(CP_NOMBRE_PLASTICO) > 26 THEN RAISE_APPLICATION_ERROR(-20001, 'El nombre para plastico no debe exceder de 26 caracteres!'); END IF; VC_RESULTADO := UPPER(CP_NOMBRE_PLASTICO); VC_RESULTADO := F_FILTRAR_CARACTERES_INVALIDOS(VC_RESULTADO); /* --Filtramos el Nombre Plastico VC_LISTA_NEGRA := FC_GET_BLACKLIST_EMBOZADO(805); FOR VN_INDEX IN 1 .. LENGTH(VC_RESULTADO) LOOP VC_CARACTER := SUBSTR(VC_RESULTADO,VN_INDEX,1); VN_POSICION := INSTR(VC_LISTA_NEGRA,VC_CARACTER); IF VN_POSICION > 0 THEN VC_CAMBIO := SUBSTR(VC_CAMBIOS,VN_POSICION,1); VC_RESULTADO := REPLACE(VC_RESULTADO,VC_CARACTER,VC_CAMBIO); END IF; END LOOP; */ RETURN(VC_RESULTADO); END FC_FILTRAR_NOMPLA; FUNCTION get_usuario RETURN VARCHAR2 AS BEGIN PV_USUARIO := NVL(PV_USUARIO, CC_USUARIO_DIMO); RETURN PV_USUARIO; END get_usuario; -- ====================================================================== -- -- Autor: Lic. Orlando Ojeda -- Fecha: 30/04/2021 -- Proposito: Obtener el CVV de una tarjeta... -- ====================================================================== -- FUNCTION f_get_cvc_tarjeta(pi_tarjeta IN VARCHAR2) RETURN VARCHAR2 IS v_cvv VARCHAR2(100); BEGIN BEGIN PCUTILES.GET_PAN_CRIPTOKEY; END; SELECT CS.GET_CVC(CEIBO_UTILES.FN_GET_EMISOR_PROCESADOR(T.EMISOR), T.TARJETA, T.FECHA_VIGENCIA, 2) cvv INTO v_cvv FROM tarjetas t WHERE 1 = 1 AND t.tarjeta = pi_tarjeta; RETURN v_cvv; EXCEPTION WHEN OTHERS THEN RETURN NULL; END; -- ====================================================================== -- -- Autor: Lic. Orlando Ojeda -- Fecha: 29/04/2021 -- Proposito: Retornar el valor de la respuesta configurada -- para la pregunta de seguridad y la tarjeta -- ====================================================================== -- FUNCTION f_get_resp_pregunta_vinc_tc(pi_id_pregunta IN NUMBER, pi_tarjeta IN VARCHAR2) RETURN VARCHAR2 AS v_retorno VARCHAR2(3000) := NULL; v_sql_valid VARCHAR2(1000); BEGIN BEGIN SELECT ps.sql_respuesta INTO v_sql_valid FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.id_pregunta = pi_id_pregunta AND ps.estado = 1 -- 1 Activo AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO ; EXECUTE IMMEDIATE v_sql_valid INTO v_retorno USING pi_tarjeta; EXCEPTION WHEN OTHERS THEN NULL; END; RETURN TRIM(v_retorno); EXCEPTION WHEN OTHERS THEN RETURN NULL; END; -- ====================================================================== -- -- Autor: FELICIANO AMARILLA -- Fecha: 29/04/2021 -- Proposito: Retornar el valor de la respuesta configurada -- para la pregunta de seguridad de tu eres tu -- ====================================================================== -- FUNCTION f_get_resp_pregunta_tutu(pi_id_pregunta IN NUMBER, pi_documento IN VARCHAR2) RETURN VARCHAR2 AS v_retorno VARCHAR2(3000) := NULL; v_sql_valid VARCHAR2(4000); BEGIN BEGIN SELECT ps.sql_respuesta INTO v_sql_valid FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.id_pregunta = pi_id_pregunta AND ps.estado = 1 -- 1 Activo AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO ; EXECUTE IMMEDIATE v_sql_valid INTO v_retorno USING pi_documento; EXCEPTION WHEN OTHERS THEN NULL; -- raise_application_error(-20001,sqlerrm||' '|| v_sql_valid ); END; RETURN TRIM(v_retorno); EXCEPTION WHEN OTHERS THEN RETURN NULL; -- v_retorno:=sqlerrm||' '|| v_sql_valid; --return v_retorno; -- creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'PREGUN_TUTU', TO_CHAR(sqlerrm), sysdate, 'DIMO'); -- raise_application_error(-20001,sqlerrm||' '|| v_sql_valid ); END f_get_resp_pregunta_tutu; -- ===================================================================================== -- -- Autor: Lic. Orlando Ojeda -- Fecha: 30/04/2021 -- Proposito: Retornar un valor random relacionado a la pregunta de seguridad de la TC -- ===================================================================================== -- FUNCTION f_valor_random_pregun_vinc_tc(pi_id_pregunta IN NUMBER) RETURN VARCHAR2 AS v_retorno VARCHAR2(3000) := NULL; v_sql VARCHAR2(1000); BEGIN BEGIN SELECT ps.sql_valor_random INTO v_sql FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.id_pregunta = pi_id_pregunta AND ps.estado = 1 -- 1 Activo AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO ; EXECUTE IMMEDIATE v_sql INTO v_retorno; EXCEPTION WHEN OTHERS THEN NULL; END; RETURN TRIM(v_retorno); EXCEPTION WHEN OTHERS THEN RETURN NULL; END; -- ===================================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 07/08/2023 -- Proposito: Retornar un valor random relacionado a la pregunta de seguridad de tu eres tu -- del catastro de Dimo -- ===================================================================================== -- FUNCTION f_valor_random_pregun_tutu(pi_id_pregunta IN NUMBER, pi_dcumento IN VARCHAR2) RETURN VARCHAR2 AS v_retorno VARCHAR2(3000) := NULL; v_sql VARCHAR2(4000); BEGIN BEGIN SELECT ps.sql_valor_random INTO v_sql FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.id_pregunta = pi_id_pregunta AND ps.estado = 1 -- 1 Activo AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO ; EXECUTE IMMEDIATE v_sql INTO v_retorno USING pi_dcumento; EXCEPTION WHEN OTHERS THEN NULL; -- v_retorno:=sqlerrm||' '||v_sql; END; RETURN TRIM(v_retorno); EXCEPTION WHEN OTHERS THEN RETURN NULL; END f_valor_random_pregun_tutu; ------- ------ PROCEDURE set_usuario(PI_USUARIO IN VARCHAR2 DEFAULT NULL) AS BEGIN PV_USUARIO := SUBSTR(NVL(PI_USUARIO, CC_USUARIO_DIMO), 1, 16); END set_usuario; PROCEDURE sp_setearValoresSession IS BEGIN dbms_session.set_nls('NLS_LANGUAGE', chr(39) || 'SPANISH' || chr(39)); dbms_session.set_nls('NLS_TERRITORY', chr(39) || 'SPAIN' || chr(39)); dbms_session.set_nls('NLS_CURRENCY', chr(39) || '?' || chr(39)); dbms_session.set_nls('NLS_ISO_CURRENCY', chr(39) || 'SPAIN' || chr(39)); dbms_session.set_nls('NLS_NUMERIC_CHARACTERS', chr(39) || ',.' || chr(39)); dbms_session.set_nls('NLS_DATE_FORMAT', chr(39) || 'DD/MM/RR' || chr(39)); dbms_session.set_nls('NLS_DATE_LANGUAGE', chr(39) || 'SPANISH' || chr(39)); dbms_session.set_nls('NLS_SORT', chr(39) || 'SPANISH' || chr(39)); END sp_setearValoresSession; PROCEDURE sp_delay(fn_segundos IN NUMBER) AS v_ini DATE; v_fin DATE; BEGIN v_ini := SYSDATE; DBMS_LOCK.SLEEP(nvl(fn_segundos, 1)); -- segundo de delay v_fin := SYSDATE; END sp_delay; PROCEDURE sp_setEmisorDimo AS BEGIN SELECT ep.Emisor INTO PV_EMISOR_DIMO FROM creditopy.emisores_prepago ep WHERE TRIM(ep.marca) = CC_DIMO; EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error(-20001, 'Emisor DIMO no configurado.'); END sp_setEmisorDimo; /*PROCEDURE PR_SET_USUARIO(CP_USUARIO IN VARCHAR2) AS BEGIN PV_USUARIO := CP_USUARIO; END;*/ PROCEDURE PR_LIMPIAR_HISTORICO AS BEGIN --Limpiamos la tabla VR_HISTORICOS. VR_HISTORICOS.DELETE; --Inicializamos Datos constantes en el historico de Cuentas. Se asume que la tarjeta es titular. VR_HISTORICO.USUARIO := CC_USUARIO_DIMO; VR_HISTORICO.DESPLEGAR := 0; VR_HISTORICO.NOVGEN := 0; VR_HISTORICO.NOVTIP := 1; VR_HISTORICO.OPCION := 'NovAltaCuentaTarjetaHandler'; VR_HISTORICO.TITULAR := 1; VR_HISTORICO.NOVFCHING := SYSDATE; VR_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.NOVFCHING; VR_HISTORICO.EMISOR := VR_EMISOR.EMISOR; END PR_LIMPIAR_HISTORICO; PROCEDURE PR_REGISTRAR_HISTORICO AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN FOR IDX IN 1 .. VR_HISTORICOS.COUNT LOOP INSERT INTO HISTORICO_CUENTAS@OLPY VALUES VR_HISTORICOS (IDX); END LOOP; COMMIT; --Limpiamos la tabla VR_HISTORICOS. PR_LIMPIAR_HISTORICO; END PR_REGISTRAR_HISTORICO; PROCEDURE PR_RECHAZAR_NOVEDAD AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN PV_REGLA_ID := SOCIOS_MANTENIMIENTOS.FC_GET_REGLA_ID; PV_MENSAJE := SOCIOS_MANTENIMIENTOS.FC_GET_MENSAJE; --Motivo de Rechazo VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; VR_HISTORICO.CAMPO := 'REGLA_VALIDACION'; IF SQLERRM IS NULL THEN VR_HISTORICO.DATO_ANTERIOR := ' '; ELSE VR_HISTORICO.DATO_ANTERIOR := SUBSTR(SQLERRM, 1, 150); END IF; VR_HISTORICO.DATO_POSTERIOR := 'reglaId:' || PV_REGLA_ID || ' ' || PV_MENSAJE; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; PR_REGISTRAR_HISTORICO; UPDATE HISTORICO_CUENTAS@OLPY HC SET HC.NOVGEN = '3' WHERE HC.NOVTIP = VR_HISTORICO.NOVTIP AND HC.NOVNRO = VR_HISTORICO.NOVNRO AND HC.NOVFCHING = VR_HISTORICO.NOVFCHING; COMMIT; END PR_RECHAZAR_NOVEDAD; PROCEDURE PR_SET_FECHA_COSTO_ALTA AS BEGIN /* FECHA_COSTO. Encuentro que se unifico la rutina en el cobol para altas y reposiciones. El calculo es siempre FECHA_COSTO = last_day(add_months(fecha_otorgada de la nueva tarjeta,12)). Tambien reactivaciones. VR_TARJETA.FECHA_OTORGADA = FECHA PROCESO. Es para previnir la fecha otorgada aun no fue asignada. */ --En las altas, la tarjeta del registro de novedades siempre es nula. VR_TARJETA.FECHA_COSTO := LAST_DAY(ADD_MONTHS(TRUNC(VR_CUENTA.FECHA_ESTADO), 12)); PR_LOGGING('WS', '01', ' FECHA_COSTO>' || FC_GET_FECHA_LARGA(VR_TARJETA.FECHA_COSTO)); PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_SET_FECHA_COSTO_ALTA. FECHA_COSTO:' || FC_GET_FECHA_LARGA(VR_TARJETA.FECHA_COSTO)); EXCEPTION WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_SET_FECHA_COSTO_ALTA. Error:' || SQLERRM); END; PROCEDURE PR_GET_AFINIDAD AS BEGIN SELECT * INTO VR_AFINIDAD FROM CREDITOPY.GRUPOS_AFINIDAD A WHERE A.EMISOR = VR_AFINIDAD.EMISOR AND A.PRODUCTO = 1 AND A.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_AFINIDAD. Afinidad no encontrada.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD); RAISE_APPLICATION_ERROR(-20001, 'La Afinidad no fue encontrada. Emisor:' || VR_AFINIDAD.EMISOR || ' Afinidad:' || VR_AFINIDAD.GRUPO_AFINIDAD); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_AFINIDAD. Error al buscar la Afinidad.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Afinidad. Emisor:' || VR_AFINIDAD.EMISOR || ' Afinidad:' || VR_AFINIDAD.GRUPO_AFINIDAD); END PR_GET_AFINIDAD; PROCEDURE PR_GET_CIUDAD AS BEGIN SELECT * INTO VR_CIUDAD FROM DEBCREDPY.CIUDADES C WHERE C.CIUDAD = VR_CIUDAD.CIUDAD AND C.CODIGO_POSTAL = 2; -- Nueva Clasificacion de Ciudades. ER 202003200651. EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CIUDAD. Ciudad no encontrada.' || ' VR_CIUDAD.CIUDAD:' || VR_CIUDAD.CIUDAD); RAISE_APPLICATION_ERROR(-20001, 'La Ciudad no fue encontrada. Ciudad:' || VR_CIUDAD.CIUDAD); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CIUDAD. Error al buscar la Ciudad.' || ' VR_CIUDAD.CIUDAD:' || VR_CIUDAD.CIUDAD); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Ciudad. Ciudad:' || VR_CIUDAD.CIUDAD); END PR_GET_CIUDAD; PROCEDURE PR_GET_CARTERA AS BEGIN SELECT * INTO VR_CARTERA FROM DEBCREDPY.CARTERAS A WHERE A.EMISOR = VR_CARTERA.EMISOR AND A.CARTERA = VR_CARTERA.CARTERA; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CARTERA.CARTERA NO ENCONTRADA.' || ' VR_CARTERA.EMISOR:' || VR_CARTERA.EMISOR || ' VR_CARTERA.CARTERA:' || VR_CARTERA.CARTERA); RAISE_APPLICATION_ERROR(-20001, 'La cartera no fue encontrada. Emisor:' || VR_CARTERA.EMISOR || ' Cartera:' || VR_CARTERA.CARTERA); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CARTERA.CARTERA ERROR AL BUSCAR.' || ' VR_NOVEDAD_CUENTA.EMISOR_CUENTA:' || VR_CARTERA.EMISOR || ' VR_CARTERA:' || VR_CARTERA.CARTERA); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la cartera ' || VR_CARTERA.CARTERA); END PR_GET_CARTERA; PROCEDURE PR_GET_CORRESPONDENCIA AS BEGIN SELECT * INTO VR_CORRESPONDENCIA FROM CREDITOPY.CODIGOS_CORRESPONDENCIA A WHERE A.EMISOR = VR_CORRESPONDENCIA.EMISOR AND A.CODIGO = VR_CORRESPONDENCIA.CODIGO; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CORRESPONDENCIA. Codigo de Correspondencia no encontrado.' || ' VR_CORRESPONDENCIA.EMISOR:' || VR_CORRESPONDENCIA.EMISOR || ' VR_CORRESPONDENCIA.CODIGO:' || VR_CORRESPONDENCIA.CODIGO); RAISE_APPLICATION_ERROR(-20001, 'El codigo de correspondencia no fue encontrado. Emisor:' || VR_CORRESPONDENCIA.EMISOR || ' Codigo:' || VR_CORRESPONDENCIA.CODIGO); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CORRESPONDENCIA. Error al buscar el Codigo de Correspondencia.' || ' VR_CORRESPONDENCIA.EMISOR:' || VR_CORRESPONDENCIA.EMISOR || ' VR_CORRESPONDENCIA.CODIGO:' || VR_CORRESPONDENCIA.CODIGO); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Codigo de Correspondencia. Emisor:' || VR_CORRESPONDENCIA.EMISOR || ' Afinidad:' || VR_CORRESPONDENCIA.CODIGO); END PR_GET_CORRESPONDENCIA; PROCEDURE PR_GET_SEXO AS BEGIN SELECT * INTO VR_SEXO FROM DEBCREDPY.SEXOS A WHERE A.SEXO = VR_SEXO.SEXO; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_SEXO. Sexo no encontrado.' || ' VR_SEXO.SEXO:' || VR_SEXO.SEXO); RAISE_APPLICATION_ERROR(-20001, 'El Sexo no fue encontrado. Sexo:' || VR_SEXO.SEXO); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_SEXO. Error al buscar el Sexo.' || ' VR_SEXO.SEXO:' || VR_SEXO.SEXO); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Sexo. Sexo:' || VR_SEXO.SEXO); END PR_GET_SEXO; PROCEDURE PR_GET_ESTADO_CIVIL AS BEGIN SELECT * INTO VR_ESTADO_CIVIL FROM DEBCREDPY.ESTADOS_CIVILES A WHERE A.ESTADO_CIVIL = VR_ESTADO_CIVIL.ESTADO_CIVIL; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_ESTADO_CIVIL. Estado Civil no encontrado.' || ' VR_ESTADO_CIVIL.ESTADO_CIVIL:' || VR_ESTADO_CIVIL.ESTADO_CIVIL); RAISE_APPLICATION_ERROR(-20001, 'El Estado Civil no fue encontrado. Sexo:' || VR_ESTADO_CIVIL.ESTADO_CIVIL); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_ESTADO_CIVIL. Error al buscar el Estado Civil.' || ' VR_NOVEDAD_TARJETA.ESTADO_CIVIL:' || VR_ESTADO_CIVIL.ESTADO_CIVIL); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Estado Civil. Estado Civil:' || VR_ESTADO_CIVIL.ESTADO_CIVIL); END PR_GET_ESTADO_CIVIL; PROCEDURE PR_GET_OCUPACION AS BEGIN SELECT * INTO VR_OCUPACION FROM DEBCREDPY.OCUPACIONES A WHERE A.CODIGO_OCUPACION = VR_OCUPACION.CODIGO_OCUPACION; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_OCUPACION. Ocupacion no encontrada.' || ' VR_OCUPACION.CODIGO_OCUPACION:' || VR_OCUPACION.CODIGO_OCUPACION); RAISE_APPLICATION_ERROR(-20001, 'La Ocupacion no fue encontrada. Ocupacion:' || VR_OCUPACION.CODIGO_OCUPACION); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_OCUPACION. Error al buscar la Ocupacion.' || ' VR_OCUPACION.CODIGO_OCUPACION:' || VR_OCUPACION.CODIGO_OCUPACION); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Ocupacion. Ocupacion:' || VR_OCUPACION.CODIGO_OCUPACION); END PR_GET_OCUPACION; PROCEDURE PR_GET_PROMOTOR AS BEGIN SELECT * INTO VR_PROMOTOR FROM DEBCREDPY.CAPTADORES A WHERE A.EMISOR = VR_PROMOTOR.EMISOR AND A.CODIGO_CAPTADOR = VR_PROMOTOR.CODIGO_CAPTADOR; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_PROMOTOR. Promotor no encontrado.' || ' VR_PROMOTOR.EMISOR:' || VR_PROMOTOR.EMISOR || ' VR_PROMOTOR.CODIGO_CAPTADOR:' || VR_PROMOTOR.CODIGO_CAPTADOR); RAISE_APPLICATION_ERROR(-20001, 'El Promotor no fue encontrado.. Emisor:' || VR_PROMOTOR.EMISOR || ' Promotor:' || VR_PROMOTOR.CODIGO_CAPTADOR); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_PROMOTOR. Error al buscar el Promotor.' || ' VR_PROMOTOR.EMISOR:' || VR_PROMOTOR.EMISOR || ' VR_PROMOTOR.CODIGO_CAPTADOR:' || VR_PROMOTOR.CODIGO_CAPTADOR); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Promotor. Emisor:' || VR_PROMOTOR.EMISOR || ' Promotor:' || VR_PROMOTOR.CODIGO_CAPTADOR); END PR_GET_PROMOTOR; PROCEDURE PR_GET_SUCURSAL AS BEGIN SELECT * INTO VR_SUCURSAL FROM DEBCREDPY.SUCURSALES_EMISORES A WHERE A.EMISOR = VR_SUCURSAL.EMISOR AND A.SUCURSAL_EMISOR = VR_SUCURSAL.SUCURSAL_EMISOR; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_SUCURSAL. Sucursal del Emisor no encontrado.' || ' VR_SUCURSAL.EMISOR:' || VR_SUCURSAL.EMISOR || ' VR_SUCURSAL.SUCURSAL_CUENTA:' || VR_SUCURSAL.SUCURSAL_EMISOR); RAISE_APPLICATION_ERROR(-20001, 'La Sucursal del Emisor no fue encontrado.. Emisor:' || VR_SUCURSAL.EMISOR || ' Sucursal:' || VR_SUCURSAL.SUCURSAL_EMISOR); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_SUCURSAL. Error al buscar la Sucursal del Emisor.' || ' VR_NOVEDAD_CUENTA.EMISOR_CUENTA:' || VR_SUCURSAL.EMISOR || ' VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA:' || VR_SUCURSAL.SUCURSAL_EMISOR); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Sucursal del Emisor. Emisor:' || VR_SUCURSAL.EMISOR || ' Sucursal:' || VR_SUCURSAL.SUCURSAL_EMISOR); END PR_GET_SUCURSAL; PROCEDURE PR_GET_EMISOR AS BEGIN SELECT * INTO VR_EMISOR FROM DEBCREDPY.EMISORES A WHERE A.EMISOR = VR_EMISOR.EMISOR; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_EMISOR. Emisor de la Cuenta no encontrado.' || ' VR_EMISOR.EMISOR:' || VR_EMISOR.EMISOR); RAISE_APPLICATION_ERROR(-20001, 'El Emisor de la Cuenta no fue encontrado. Emisor:' || VR_EMISOR.EMISOR); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_EMISOR. Error al buscar el Emisor de la Cuenta.' || ' VR_EMISOR.EMISOR:' || VR_EMISOR.EMISOR); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Emisor de la Cuenta. Emisor:' || VR_EMISOR.EMISOR); END PR_GET_EMISOR; PROCEDURE PR_GET_CIERRE_DIMO AS BEGIN SELECT CC.CIERRE INTO VR_CUENTA.CIERRE FROM CREDITOPY.CIERRES_HABILITADOS CC WHERE CC.EMISOR = VR_AFINIDAD.EMISOR AND CC.PRODUCTO = VR_AFINIDAD.PRODUCTO AND CC.CLASE_TARJETA = 1 AND CC.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD; EXCEPTION WHEN NO_DATA_FOUND THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CIERRE_DIMO. Cierre del Emisor de la Cuenta no encontrado.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD); RAISE_APPLICATION_ERROR(-20001, 'El Cierre del Emisor de la Cuenta no fue encontrado. Emisor:' || VR_AFINIDAD.EMISOR); WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CIERRE_DIMO. Error al buscar el Cierre del Emisor de la Cuenta.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar el Cierre del Emisor de la Cuenta. Emisor:' || VR_AFINIDAD.EMISOR); END PR_GET_CIERRE_DIMO; PROCEDURE PR_GET_EMISOR_PRODUCTO AS BEGIN SELECT * INTO VR_EMISOR_PRODUCTO FROM DEBCREDPY.EMISORES_PRODUCTOS A WHERE A.EMISOR = VR_AFINIDAD.EMISOR AND A.PRODUCTO = VR_AFINIDAD.PRODUCTO AND A.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD AND A.CARTERA = VR_CARTERA.CARTERA; PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_EMISOR_PRODUCTO.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.PRODUCTO:' || VR_AFINIDAD.PRODUCTO || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD || ' VR_CARTERA.CARTERA:' || VR_CARTERA.CARTERA); EXCEPTION WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_EMISOR_PRODUCTO. Error al buscar el Emisor Producto de la Cuenta.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.PRODUCTO:' || VR_AFINIDAD.PRODUCTO || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD || ' VR_CARTERA.CARTERA:' || VR_CARTERA.CARTERA); END; PROCEDURE PR_DATOS_CIERRES AS BEGIN VR_CALENDARIO_CIERRE.PERIODO := CREDITOPY.CEIBO_SOCIOS.GET_PERIODO_ACTUAL(VR_AFINIDAD.EMISOR, VR_AFINIDAD.PRODUCTO, VR_CUENTA.CIERRE); SELECT * INTO VR_CALENDARIO_CIERRE FROM CREDITOPY.CALENDARIO_CIERRES A WHERE A.EMISOR = VR_AFINIDAD.EMISOR AND A.PRODUCTO = VR_AFINIDAD.PRODUCTO AND A.CIERRE = VR_CUENTA.CIERRE AND A.PERIODO = VR_CALENDARIO_CIERRE.PERIODO AND A.GRUPO_AFINIDAD = VR_AFINIDAD.GRUPO_AFINIDAD; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, 'PKG_DIMO_CEIBO.PR_DATOS_CIERRES. Error al buscar el Emisor Producto de la Cuenta.' || ' VR_AFINIDAD.EMISOR:' || VR_AFINIDAD.EMISOR || ' VR_AFINIDAD.PRODUCTO:' || VR_AFINIDAD.PRODUCTO || ' VR_AFINIDAD.GRUPO_AFINIDAD:' || VR_AFINIDAD.GRUPO_AFINIDAD || ' VR_CARTERA.CARTERA:' || VR_CARTERA.CARTERA); END PR_DATOS_CIERRES; PROCEDURE PR_SET_EMISOR_DIMO AS BEGIN BEGIN SELECT EMISOR INTO VR_EMISOR.EMISOR FROM CREDITOPY.EMISORES_PREPAGO EP WHERE TRIM(EP.MARCA) = CC_DIMO; EXCEPTION WHEN NO_DATA_FOUND THEN VR_EMISOR.EMISOR := 999; END; VR_SUCURSAL.EMISOR := VR_EMISOR.EMISOR; VR_SUCURSAL.SUCURSAL_EMISOR := 1; VR_AFINIDAD.EMISOR := VR_EMISOR.EMISOR; --VR_AFINIDAD.GRUPO_AFINIDAD := VR_EMISOR.EMISOR||'001'; VR_AFINIDAD.GRUPO_AFINIDAD := CASE WHEN PV_GRUPO_AFINIDAD IS NULL THEN VR_EMISOR.EMISOR || '001' ELSE PV_GRUPO_AFINIDAD END; VR_CARTERA.EMISOR := VR_EMISOR.EMISOR; VR_CARTERA.CARTERA := 1; VR_CORRESPONDENCIA.EMISOR := VR_EMISOR.EMISOR; VR_CORRESPONDENCIA.CODIGO := CC_CORRESPONDENCIA_DIMO; --'D'; VR_PROMOTOR.EMISOR := VR_EMISOR.EMISOR; --VR_PROMOTOR.CODIGO_CAPTADOR := CC_CAPTADOR_DIMO; --'91'; VR_PROMOTOR.CODIGO_CAPTADOR := PV_PROMOTOR_ID; -- ticket 0002049-Afinidad DIMO. AR. 27/05/2022 16:32:00 p.m. --Limites en Cero para la Cuenta en Dimo. VR_CUENTA.LIMITE_CREDITO := 0; VR_CUENTA.LIMITE_FINANCIACION := 0; END PR_SET_EMISOR_DIMO; PROCEDURE PR_SET_PERSONA_DIMO AS BEGIN --Datos faltantes. VR_PERSONA.ESTADO_CIVIL := VR_ESTADO_CIVIL.ESTADO_CIVIL; VR_PERSONA.CODIGO_OCUPACION := VR_OCUPACION.CODIGO_OCUPACION; VR_PERSONA.IPIN := 'ABCDEF0912345678'; VR_PERSONA.CODIGO_NACIONALIDAD := 0; --Indicado VR_PERSONA.ULT_ACTUALIZACION := SYSDATE; VR_PERSONA.OPERADOR := CC_USUARIO_DIMO; VR_PERSONA.TIPO_NOV := 'A'; END PR_SET_PERSONA_DIMO; PROCEDURE PR_SET_DIRECCION_DIMO(RP_DIRECCION OUT DIRECCIONES%ROWTYPE) AS BEGIN RP_DIRECCION.EMISOR := VR_EMISOR.EMISOR; RP_DIRECCION.SUCURSAL_EMISOR := VR_SUCURSAL.SUCURSAL_EMISOR; RP_DIRECCION.PRODUCTO := 1; RP_DIRECCION.NUMERO_CUENTA := 0; RP_DIRECCION.TIPO_DE_DOCUMENTO := VR_PERSONA.TIPO_DE_DOCUMENTO; RP_DIRECCION.DOCUMENTO := VR_PERSONA.DOCUMENTO; --RP_DIRECCION.TIPO_DE_DIRECCION 1 RP_DIRECCION.PAIS := 1; RP_DIRECCION.DEPARTAMENTO := 0; RP_DIRECCION.CIUDAD := 1; --RP_DIRECCION.CALLE CNEL PANCHITO LOPEZ C/ RUTA 1 RP_DIRECCION.TIENE_EXTENSION := 0; RP_DIRECCION.NUMERO_PUERTA := 0; RP_DIRECCION.APARTAMENTO := 0; RP_DIRECCION.CODIGO_POSTAL := 0; --RP_DIRECCION.TELEFONO NO DEFINIDO --RP_DIRECCION.BARRIO --RP_DIRECCION.ULT_ACTUALIZACION RP_DIRECCION.OPERADOR := CC_USUARIO_DIMO; RP_DIRECCION.TIPO_NOV := 'A'; END PR_SET_DIRECCION_DIMO; PROCEDURE PR_HISTORICO_ALTA_DIMO AS BEGIN --Historico a nivel de Cuentas. VR_HISTORICO.EMISOR := VR_EMISOR.EMISOR; VR_HISTORICO.NOVNRO := FN_GET_NRO_NOVEDAD; VR_HISTORICO.NUMERO_CUENTA := VR_HISTORICO.NOVNRO; VR_CUENTA.FORMULARIO := VR_HISTORICO.NOVNRO; VR_TARJETA.FORMULARIO := VR_HISTORICO.NOVNRO; --Cada parrafo corresponde a un dato a auditar. VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; --Agregamos el GRUPO de AFINIDAD. VR_HISTORICO.CAMPO := 'GRUPO_AFINIDAD'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_AFINIDAD.GRUPO_AFINIDAD || CHR(32) || VR_AFINIDAD.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la Calle. VR_HISTORICO.CAMPO := 'CALLE'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_DIRECCION.CALLE; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la Ciudad. VR_HISTORICO.CAMPO := 'CIUDAD'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_CIUDAD.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la TELEFONO. VR_HISTORICO.CAMPO := 'TELEFONO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_CELULAR.CALLE; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la PAGO_AUTOMATICO. VR_HISTORICO.CAMPO := 'PAGO_AUTOMATICO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := 'Ventanilla'; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la CICLO_NUEVO. VR_HISTORICO.CAMPO := 'CICLO_NUEVO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_CUENTA.CIERRE; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la LIMITE_CREDITO. VR_HISTORICO.CAMPO := 'LIMITE_CREDITO'; VR_HISTORICO.DATO_ANTERIOR := ' '; --2DO--Manejar importes ... VR_HISTORICO.DATO_POSTERIOR := TO_CHAR(VR_CUENTA.LIMITE_CREDITO, '99G999G999'); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la LIMITE_FINANCIACION. VR_HISTORICO.CAMPO := 'LIMITE_FINANCIACION'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := TO_CHAR(VR_CUENTA.LIMITE_FINANCIACION, '99G999G999'); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la LIMITE_ADELANTO. VR_HISTORICO.CAMPO := 'LIMITE_ADELANTO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := TO_CHAR(VR_CUENTA.LIMITE_CREDITO, '99G999G999'); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la CANTIDAD_TARJETAS. VR_HISTORICO.CAMPO := 'CANTIDAD_TARJETAS'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := 1; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la NOVCARTERA. VR_HISTORICO.CAMPO := 'NOVCARTERA'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_CARTERA.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos la CODIGO_CORRESPONDENCIA. VR_HISTORICO.CAMPO := 'CODIGO_CORRESPONDENCIA'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_CORRESPONDENCIA.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Agregamos EMISOR_CUENTA. VR_HISTORICO.CAMPO := 'EMISOR_CUENTA'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_EMISOR.EMISOR || ' ' || VR_EMISOR.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos SUCURSAL_CUENTA. VR_HISTORICO.CAMPO := 'SUCURSAL_CUENTA'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_SUCURSAL.SUCURSAL_EMISOR || ' ' || VR_SUCURSAL.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; -- VR_HISTORICO.TARJETA := VR_NOVEDAD_TARJETA.Novnro; --Agregamos APELLIDOS. VR_HISTORICO.TABLA := 'NOVEDADES_TARJETAS'; VR_HISTORICO.CAMPO := 'CALLE'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_DIRECCION.CALLE; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos NOMBRES. VR_HISTORICO.CAMPO := 'NOMBRES'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_PERSONA.NOMBRES; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos FECHA_NACIMIENTO. VR_HISTORICO.CAMPO := 'FECHA_NACIMIENTO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := TO_CHAR(VR_PERSONA.FECHA_NACIMIENTO, 'DD/MM/YYYY'); --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos SEXO. VR_HISTORICO.CAMPO := 'SEXO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_SEXO.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos ESTADO_CIVIL. VR_HISTORICO.CAMPO := 'ESTADO_CIVIL'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_ESTADO_CIVIL.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos CODIGO_OCUPACION. VR_HISTORICO.CAMPO := 'CODIGO_OCUPACION'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_OCUPACION.DESCRIPCION; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos TIPO_DE_DOCUMENTO. VR_HISTORICO.CAMPO := 'TIPO_DE_DOCUMENTO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := 'Cedula de identidad'; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos DOCUMENTO. VR_HISTORICO.CAMPO := 'DOCUMENTO'; VR_HISTORICO.DATO_ANTERIOR := ' '; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-1-1-1.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); /*VR_HISTORICO.DATO_POSTERIOR := TO_NUMBER(SUBSTR(VR_PERSONA.DOCUMENTO, 4, 12));*/ VR_HISTORICO.DATO_POSTERIOR := SUBSTR(VR_PERSONA.DOCUMENTO, 4, 12); PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-1-1-2.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos NOMBRE_PLASTICO. VR_HISTORICO.CAMPO := 'NOMBRE_PLASTICO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_TARJETA.NOMBRE_PARA_PLASTICO; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; --Agregamos NOVPROM. --VR_HISTORICO.CAMPO := 'NOVPROM'; --VR_HISTORICO.DATO_ANTERIOR := ' '; --VR_HISTORICO.DATO_POSTERIOR := VR_PROMOTOR.DESCRIPCION||'('||VN_VENDEDOR||')'; --Agregamos a la tabla de historicos. --VR_HISTORICOS((VR_HISTORICOS.COUNT+1)) := VR_HISTORICO; PR_REGISTRAR_HISTORICO; END PR_HISTORICO_ALTA_DIMO; PROCEDURE PR_SET_CUENTA_DIMO AS BEGIN --Seteamos los campos de cuentas. VR_CUENTA.EMISOR := VR_EMISOR.EMISOR; VR_CUENTA.SUCURSAL_EMISOR := VR_SUCURSAL.SUCURSAL_EMISOR; VR_CUENTA.PRODUCTO := VR_AFINIDAD.PRODUCTO; VR_CUENTA.NUMERO_CUENTA := 0; VR_CUENTA.TIPO_DE_DOCUMENTO := VR_PERSONA.TIPO_DE_DOCUMENTO; VR_CUENTA.DOCUMENTO := VR_PERSONA.DOCUMENTO; VR_CUENTA.GRUPO_AFINIDAD := VR_AFINIDAD.GRUPO_AFINIDAD; VR_CUENTA.CARTERA := VR_CARTERA.CARTERA; --Siempre sin Descuenta cuota y no tiene UL. Parametros 54 y 55 VR_CUENTA.NUMERO_EMPRESA := 0; VR_CUENTA.ESTADO := 1; VR_CUENTA.CLASE_DE_ESTADO := 1; --Se asigna la fecha de Proceso VR_CUENTA.FECHA_ESTADO := PV_FEC_REG_ALTA; --VR_CUENTA.FECHA_ESTADO := TO_DATE(TO_CHAR(VR_CUENTA.FECHA_ESTADO,'DDMMYYYY')||TO_CHAR(VR_NOV_CUENTA.NOVFCHING,'HH24MISS'),'DDMMYYYYHH24MISS'); /*SE FIJA EL VALOR 3 EN EL CAMPO ENVIAR_RESUMEN PARA IDENTIFICAR LA CUENTA EN GESTION DE REFINANCIACION DE SALDO.- Se comenta a Sol. de Arya Baher ( 07/11/05 ) En base al comentario del cobol y lo conversado con Amalia, se asume que siempre es 1. */ VR_CUENTA.ENVIAR_RESUMEN := 1; VR_CUENTA.TIPO_MONEDA_CREDITO := 1; /*Si es 1, Se paga automaticamente el PM. Si es 2, el total del resumen. Ver PAGOS_AUTOMATICOS. */ VR_CUENTA.PAGO_AUTOMATICO := 2; VR_CUENTA.PORC_DEBITO := 0; VR_CUENTA.PORC_LIMITE_EFECTIVO := 0; VR_CUENTA.PORC_GASTOS_ADM := 0; VR_CUENTA.BONIFICACION_TASAS := 0; --DURACION_TARJETA de debcredpy.EMISORES_PRODUCTOS VR_CUENTA.CODIGO_DE_VINCULO := VR_EMISOR_PRODUCTO.DURACION_TARJETA; --Pendiente. Se ve por defecto VR_CUENTA.CODIGO_DE_ESTADO_FIN := 1; VR_CUENTA.CODIGO_DE_GARANTIA := 0; VR_CUENTA.FECHA_NO_RENOVACION := NULL; VR_CUENTA.PUBLICA_NO_RENOVACION := 0; VR_CUENTA.AUTOMATICO_A_BOLETIN := 0; VR_CUENTA.NUMERO_SOCIO_LEGAJO := 0; VR_CUENTA.PERIODO_CIERRE_DEBE := VR_CALENDARIO_CIERRE.PERIODO; VR_CUENTA.PERIODO_CIERRE_PM := VR_CALENDARIO_CIERRE.PERIODO; VR_CUENTA.RESERVAS_ML := 0; VR_CUENTA.RESERVAS_MR := 0; VR_CUENTA.RESERVAS_EFECTIVO_ML := 0; VR_CUENTA.RESERVAS_EFECTIVO_MR := 0; VR_CUENTA.RESERVAS_PLANES_ML := 0; VR_CUENTA.RESERVAS_PLANES_MR := 0; VR_CUENTA.SALDO_CIERRE_ML := 0; VR_CUENTA.SALDO_CIERRE_MR := 0; VR_CUENTA.EFECTIVO_ML := 0; VR_CUENTA.EFECTIVO_MR := 0; VR_CUENTA.COMPRAS_ML := 0; VR_CUENTA.COMPRAS_MR := 0; VR_CUENTA.PAGOS_ML := 0; VR_CUENTA.PAGOS_MR := 0; VR_CUENTA.RESERVAS_AGROCABAL_ML := 0; VR_CUENTA.RESERVAS_AGROCABAL_MR := 0; VR_CUENTA.COMPRAS_AGROCABAL_ML := 0; VR_CUENTA.COMPRAS_AGROCABAL_MR := 0; VR_CUENTA.FECHA_FORMULARIO := VR_HISTORICO.NOVFCHING; VR_CUENTA.NRO_CONTRI_IMPOSITIVA := 0; --CASE NVL(VR_NOV_CUENTA.RUC,' ') WHEN ' ' THEN 0 ELSE VR_NOV_CUENTA.RUC END; VR_CUENTA.CODIGO_COSTO := 0; VR_CUENTA.UNA_CUOTA := 0; VR_CUENTA.TOTAL_CUOTAS := 0; --Siempre 0 en el alta. VR_CUENTA.ORIGEN_ANULACION := 0; VR_CUENTA.AJUSTES_DB_ML := 0; VR_CUENTA.AJUSTES_DB_MR := 0; VR_CUENTA.AJUSTES_CR_ML := 0; VR_CUENTA.AJUSTES_CR_MR := 0; VR_CUENTA.FECHA_ULTIMO_PAGO := NULL; /*TIPO_DE_CUENTA_EMISOR Solo es 1 o 2. 1 Cta Cte 2 Caja de Ahorro */ VR_CUENTA.TIPO_DE_CUENTA_EMISOR := 0; --NVL(VR_NOV_CUENTA.TIPO_CUENTA,0); /* 1 si TIPO_DE_CUENTA_EMISOR 1 o 2, sino 2 */ VR_CUENTA.TIPO_MONEDA_CTA_EMISOR := CASE VR_CUENTA.TIPO_DE_CUENTA_EMISOR WHEN 1 THEN 1 WHEN 2 THEN 1 ELSE 2 END; VR_CUENTA.NUMERO_CUENTA_EMISOR := 0; --NVL(VR_NOV_CUENTA.NUMERO_CUENTA_DEB,0); -- Se asigna la fecha de Proceso. VR_CUENTA.FECHA_DE_ALTA := TRUNC(PV_FEC_REG_ALTA); VR_CUENTA.TIENE_VINCULO := 0; VR_CUENTA.CTADISCNJ := 0; VR_CUENTA.NUMERO_USUARIO_PY := 0; --no vigente, usado de creditopy.TIPO_PLASTICO */ VR_CUENTA.CLASE_TARJETA_PY := FC_GET_TIPO_PLASTICO; VR_CUENTA.ENCARGADO_DE_CUENTA := 0; --VR_CUENTA.CODIGO_CAPTADOR := CC_CAPTADOR_DIMO; --'91'; VR_CUENTA.CODIGO_CAPTADOR := PV_PROMOTOR_ID; -- ticket 0002049-Afinidad DIMO. AR. 02/03/2022 10:32:00 a.m. VR_CUENTA.INCREMENTO_LIMITE_CREDITO := 0; VR_CUENTA.CODIGO_DE_CORRESPONDENCIA := VR_CORRESPONDENCIA.CODIGO; VR_CUENTA.FACTOR_DE_INCREMENTO := 0; VR_CUENTA.SOBRECUPO := 0; VR_CUENTA.SALDO_A_FACTURAR := 0; VR_CUENTA.SALDO_FACTURADO_NO_VENCIDO := 0; VR_CUENTA.SALDO_FINANCIADO := 0; VR_CUENTA.SALDO_EN_MORA := 0; VR_CUENTA.DIAS_EN_MORA := 0; VR_CUENTA.FECHA_VTO_INC_LIMITE := NULL; VR_CUENTA.DISPONIBLE_SOBRECUPO := 0; VR_CUENTA.PORCENTAJE_SOBRECUPO := 0; VR_CUENTA.ULT_ACTUALIZACION := SYSDATE; VR_CUENTA.OPERADOR := CC_USUARIO_DIMO; VR_CUENTA.TIPO_NOV := 'A'; END; PROCEDURE PR_SET_TARJETA_DIMO AS BEGIN --FECHA-COSTO. Caso 1) para altas de cuenta/tarjeta(tarjetas nuevas en el sistema). VR_TARJETA.FECHA_ESTADO := PV_FEC_REG_ALTA; VR_TARJETA.FECHA_OTORGADA := TRUNC(PV_FEC_REG_ALTA); PR_SET_FECHA_COSTO_ALTA; VR_TARJETA.ORIGEN_ANULACION := 0; VR_TARJETA.EMISOR := VR_CUENTA.EMISOR; VR_TARJETA.SUCURSAL_EMISOR := VR_CUENTA.SUCURSAL_EMISOR; VR_TARJETA.PRODUCTO := VR_CUENTA.PRODUCTO; VR_TARJETA.GRUPO_AFINIDAD := VR_CUENTA.GRUPO_AFINIDAD; VR_TARJETA.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_TARJETA.TIPO_DE_DOCUMENTO := VR_PERSONA.TIPO_DE_DOCUMENTO; VR_TARJETA.DOCUMENTO := VR_PERSONA.DOCUMENTO; VR_TARJETA.ADICIONAL := FN_GET_NEXT_ADICIONAL(VR_TARJETA.NUMERO_CUENTA); --VR_TARJETA.ESTADO := 1; VR_TARJETA.ESTADO := PV_ESTADO_TJ_ALTA; --ticket 0002049-Afinidad DIMO. AR. 01/06/2022 18:38:00 p.m. VR_TARJETA.CLASE_DE_ESTADO := 1; -- Se adiciona la DURACION_TARJETA al mes de FECHA_HOY, y se lleva al lastday del mes/a?o obtenido --VR_TARJETA.FECHA_VIGENCIA := TRUNC(FD_GET_NEW_VIGENCIA); VR_TARJETA.FECHA_VIGENCIA := fn_get_vigencia_tp_virtual(VR_TARJETA.EMISOR, VR_TARJETA.PRODUCTO, VR_TARJETA.GRUPO_AFINIDAD, VR_CUENTA.CARTERA, VR_TARJETA.FECHA_OTORGADA); VR_TARJETA.CODIGO_COSTO := 0; VR_TARJETA.TIPO_MONEDA_COSTO := 1; /* Se comenta. El campo Tarjetas.costo solo tiene 5 enteros y dos decimales mientras que el costo ya alcanza los 6 digitos. Este dato tampoco se utiliza mas. ER,AR 201511182322*/ VR_TARJETA.COSTO := 0; --COD-PARA-COBRAR(=1) VR_TARJETA.ESTADO_DE_COSTO := 1; VR_TARJETA.PIN := 'ABCDEF0987654321'; VR_TARJETA.OFFSET := 0; VR_TARJETA.FECHA_FORMULARIO := VR_HISTORICO.NOVFCHING; VR_TARJETA.COMPONENTE := 1; VR_TARJETA.CODIGO_CAPTADOR := VR_CUENTA.CODIGO_CAPTADOR; --Pendiente. VR_TARJETA.PROCESO_URGENTE := ' '; VR_TARJETA.NO_RENOVACION := ' '; VR_TARJETA.ULT_ACTUALIZACION := VR_HISTORICO.NOVFCHING; VR_TARJETA.OPERADOR := VR_HISTORICO.USUARIO; VR_TARJETA.TIPO_NOV := 'A'; END; PROCEDURE PR_UPD_JOB_NOMBRE(NI_JOBTYPE IN INTEGER DEFAULT NULL, CP_JOB_NAME IN VARCHAR2 DEFAULT NULL) /*Por defecto es de tarjetas.*/ AS VC_JOB_NAME VARCHAR2(10); BEGIN IF CP_JOB_NAME IS NOT NULL THEN VC_JOB_NAME := CP_JOB_NAME; ELSE VC_JOB_NAME := PV_JOB_NOMBRE; END IF; IF NI_JOBTYPE IS NOT NULL AND NI_JOBTYPE = 1 THEN UPDATE CREDITOPY.FECHAS_ESTADO_CTAS A SET A.JOB_NOMBRE = VC_JOB_NAME, A.JOB_USUARIO = VR_HISTORICO.USUARIO WHERE A.EMISOR = VR_TARJETA.EMISOR AND A.SUCURSAL_EMISOR = VR_TARJETA.SUCURSAL_EMISOR AND A.PRODUCTO = VR_TARJETA.PRODUCTO AND A.NUMERO_CUENTA = VR_TARJETA.NUMERO_CUENTA; ELSE UPDATE CREDITOPY.FECHAS_ESTADO_TARJ A SET A.JOB_NOMBRE = VC_JOB_NAME, A.JOB_USUARIO = VR_HISTORICO.USUARIO WHERE A.EMISOR = VR_TARJETA.EMISOR AND A.SUCURSAL_EMISOR = VR_TARJETA.SUCURSAL_EMISOR AND A.PRODUCTO = VR_TARJETA.PRODUCTO AND A.NUMERO_CUENTA = VR_TARJETA.NUMERO_CUENTA AND A.ADICIONAL = VR_TARJETA.ADICIONAL; END IF; PR_LOGGING('WS', '01', 'JOB_NOMBRE ' || VC_JOB_NAME || '< JOB_USUARIO>' || VR_HISTORICO.USUARIO); EXCEPTION WHEN OTHERS THEN PR_LOGGING('WS', '01', 'PR_UPD_JOB_NOMBRE.JOB_NOMBRE ' || VC_JOB_NAME || '< JOB_USUARIO>' || VR_HISTORICO.USUARIO || FC_GET_ID_NOVEDAD || SQLERRM); --No se realiza el raise por que ya esta registrado, solo no se aplico el nombre del proceso. END PR_UPD_JOB_NOMBRE; PROCEDURE PR_SET_NUMERO_CUENTA AS PRAGMA AUTONOMOUS_TRANSACTION; VN_NUMERO_CUENTA CUENTAS.NUMERO_CUENTA%TYPE; VI_EXISTE BINARY_INTEGER; BEGIN LOOP --Actualizamos el secuencial del emisor. UPDATE CREDITOPY.EMISOR_NROCTA_TARJ A SET A.NUMERO_CUENTA = A.NUMERO_CUENTA + 1 WHERE A.EMISOR = VR_EMISOR.EMISOR; --Recuperamos el secuencial del emisor. SELECT A.NUMERO_CUENTA INTO VN_NUMERO_CUENTA FROM CREDITOPY.EMISOR_NROCTA_TARJ A WHERE A.EMISOR = VR_EMISOR.EMISOR; /*#Ojo. AR pide que se tomen los 9 digitos para Probar. VN_NUMERO_CUENTA := SUBSTR(VN_NUMERO_CUENTA,-6); VN_NUMERO_CUENTA := VR_EMISOR.EMISOR||'000'||LPAD(VN_NUMERO_CUENTA,6,0); */ VN_NUMERO_CUENTA := SUBSTR(VN_NUMERO_CUENTA, -9); VN_NUMERO_CUENTA := VR_EMISOR.EMISOR || LPAD(VN_NUMERO_CUENTA, 9, 0); VN_NUMERO_CUENTA := VN_NUMERO_CUENTA || FN_GET_COBOL_CUENTA_DV(VN_NUMERO_CUENTA); SELECT NVL(MAX(1), 0) INTO VI_EXISTE FROM CREDITOPY.CUENTAS A WHERE A.NUMERO_CUENTA = VN_NUMERO_CUENTA; EXIT WHEN VI_EXISTE = 0; END LOOP; VR_CUENTA.NUMERO_CUENTA := VN_NUMERO_CUENTA; PR_LOGGING('WS', '01', 'PKG_DIMO_CEIBO.PR_SET_NUMERO_CUENTA VR_CUENTA.NUMERO_CUENTA:' || VR_CUENTA.NUMERO_CUENTA); COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20001, FC_GET_ID_NOVEDAD || 'PKG_DIMO_CEIBO.PR_SET_NUMERO_CUENTA Error: El Emisor ' || VR_EMISOR.EMISOR || '< no tiene un secuencial registrado.'); WHEN OTHERS THEN ROLLBACK; RAISE_APPLICATION_ERROR(-20001, FC_GET_ID_NOVEDAD || 'PKG_DIMO_CEIBO.PR_SET_NUMERO_CUENTA Emisor ' || VR_EMISOR.EMISOR || ' Error:' || SQLERRM); END; PROCEDURE PR_LIMITES_DIMO AS BEGIN VR_LIMITES.EMISOR := VR_CUENTA.EMISOR; VR_LIMITES.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_LIMITES.LIMITE := 0; VR_LIMITES.PLAN_VENTA := 1; INSERT INTO LIMITES_CUENTAS@OLPY VALUES VR_LIMITES; VR_LIMITES.PLAN_VENTA := 3; INSERT INTO LIMITES_CUENTAS@OLPY VALUES VR_LIMITES; VR_LIMITES.PLAN_VENTA := 4; INSERT INTO LIMITES_CUENTAS@OLPY VALUES VR_LIMITES; END; PROCEDURE PR_SALDO_CUENTA AS VR_ULTIMO_CIERRE CALENDARIO_CIERRES%ROWTYPE; BEGIN VR_ULTIMO_CIERRE := FR_ULT_PERIODO_CERRADO; VR_SALDO_CUENTA.EMISOR := VR_CUENTA.EMISOR; VR_SALDO_CUENTA.SUCURSAL_EMISOR := VR_CUENTA.SUCURSAL_EMISOR; VR_SALDO_CUENTA.PRODUCTO := VR_CUENTA.PRODUCTO; VR_SALDO_CUENTA.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_SALDO_CUENTA.PERIODO_CIERRE := VR_ULTIMO_CIERRE.PERIODO; VR_SALDO_CUENTA.FECHA_CIERRE := VR_ULTIMO_CIERRE.FECHA_CIERRE; VR_SALDO_CUENTA.FECHA_VENCIMIENTO := VR_ULTIMO_CIERRE.FECHA_VENCIMIENTO; VR_SALDO_CUENTA.PAGO_MINIMO_ML := 0; VR_SALDO_CUENTA.PAGO_MINIMO_MR := 0; VR_SALDO_CUENTA.PAGO_CONTADO_ML := 0; VR_SALDO_CUENTA.PAGO_CONTADO_MR := 0; VR_SALDO_CUENTA.SALDO_CAPITAL_ML := 0; VR_SALDO_CUENTA.SALDO_CAPITAL_MR := 0; VR_SALDO_CUENTA.TOTAL_PAGOS_ML := 0; VR_SALDO_CUENTA.TOTAL_PAGOS_MR := 0; VR_SALDO_CUENTA.TOTAL_COMPRAS_ML := 0; VR_SALDO_CUENTA.TOTAL_COMPRAS_MR := 0; VR_SALDO_CUENTA.FECHA_COMPRA_ML := NULL; VR_SALDO_CUENTA.FECHA_COMPRA_MR := NULL; VR_SALDO_CUENTA.ULT_ACTUALIZACION := VR_HISTORICO.NOVFCHING; VR_SALDO_CUENTA.OPERADOR := VR_HISTORICO.USUARIO; VR_SALDO_CUENTA.TIPO_NOV := 'A'; INSERT INTO CREDITOPY.SALDOS_CUENTAS@BAPY VALUES VR_SALDO_CUENTA; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, FC_GET_ID_NOVEDAD || ' Error:' || SQLERRM); END PR_SALDO_CUENTA; PROCEDURE PR_CARGOS_EMISION AS VN_RETORNO NUMBER; VC_GLOSA VARCHAR2(512); BEGIN CEIBO_SOCIOS.PR_GENERAR_CARGO@BAPY(805, VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.TARJETA, VR_HISTORICO.NOVTIP, 63, --COD_PRM, VR_CUENTA.FECHA_ESTADO, VR_HISTORICO.USUARIO, VN_RETORNO, -- out VC_GLOSA); PR_LOGGING('DIMO', 'CARGO', 'PROCESADOR>805< NUMERO_CUENTA>' || VR_TARJETA.NUMERO_CUENTA || '< TARJETA>' || VR_TARJETA.TARJETA || '< NOVTIP>' || VR_HISTORICO.NOVTIP || '< COD_PRM>63< FECHA_PROCESO>' || FC_GET_FECHA_LARGA(VR_CUENTA.FECHA_ESTADO) || '< USUARIO>' || VR_HISTORICO.USUARIO || '< RETORNO>' || VN_RETORNO || '< GLOSA>' || VC_GLOSA || '<'); -- SIEMPRE RETORNA UN VALOR. LAS EXCEPCIONES NO SON ARROJADAS AL SELECT QUE LO INVOCA. Comentario del sp de Amalia. IF VN_RETORNO != 0 THEN PR_LOGGING('DIMO', 'CARGO', FC_GET_ID_NOVEDAD || '< VN_RETORNO>' || VN_RETORNO || '<< VC_GLOSA>' || VC_GLOSA || '<<'); END IF; EXCEPTION WHEN OTHERS THEN PR_LOGGING('DIMO', 'CARGO', FC_GET_ID_NOVEDAD || SQLERRM); --No se realiza el raise por que se definio que el fallo de parametros no debe interrumpir el altaOL. RA,ER END PR_CARGOS_EMISION; PROCEDURE PR_ALTA_PERSONA AS vb_existe_persona NUMBER; BEGIN BEGIN SELECT 1 INTO vb_existe_persona FROM DEBCREDPY.PERSONAS p WHERE P.TIPO_DE_DOCUMENTO = VR_PERSONA.TIPO_DE_DOCUMENTO AND P.DOCUMENTO = VR_PERSONA.DOCUMENTO; EXCEPTION WHEN no_data_found THEN INSERT INTO DEBCREDPY.PERSONAS VALUES VR_PERSONA; WHEN OTHERS THEN RAISE; END; EXCEPTION WHEN OTHERS THEN PR_LOGGING('DIMO', 'CARGO', 'ALTA_PERSONA DOCUMENTO:' || VR_PERSONA.DOCUMENTO || ' Error:' || SQLERRM); END PR_ALTA_PERSONA; PROCEDURE PR_SOLICITUDES(RT_SOLICITUD IN OUT SOLICITUDES_RECIBIDAS%ROWTYPE, RT_SOLICITUD_DATOS IN OUT SOLICITUDES_DATOS%ROWTYPE) /*A.Rodriguez. Version llevada al PKG_DIMO_CEIBO al 15/06/2020. */ /* Autor: Edgar Rojas. Fecha: 10/06/2020 Proposito: Registrar y validar todas las solicitudes de acuerdo al tipo de cada una. Las solicitudes rechazadas igual deben ser registradas. Para ello en ciertos casos, si se deben a motivos de integridad referencial, se asignaran datos para poder registrarse. Los diferentes motivos de rechazos tambien deben ser registrados. Solicitudes manejadas estan registradas en la tabla SOLICITUDES: -------------------------------------------------------------------------------------- ID_SOLICITUD CODIGO_SOLICITUD SOLICITUD -------------------------------------------------------------------------------------- 1 9,10 Pedido Plastico DIMO 2 21,10 Aviso de Viaje DIMO 3 22,00 Reposición de Tarjeta DIMO 4 25,00 Aviso de Viaje Tarjeta de Crédito 5 26,00 Reimpresion de Tarjeta de Crédito 6 29,00 Pedido de Adicional para Tarjeta de Crédito. 7 31,00 Aumento de Línea para Tarjeta de Crédito. 8 33,00 Pedido de Cambio de Ciclo para Tarjeta de Crédito. */ AS PRAGMA AUTONOMOUS_TRANSACTION; VR_TIPO SOLICITUDES%ROWTYPE; VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VR_MOTIVO SM.T_REGLA; VR_MOTIVOS SM.T_MOTIVOS; VR_RECHAZO SOLICITUDES_MOTIVOS_RECHAZOS%ROWTYPE; VR_TARJETA TARJETAS%ROWTYPE; BEGIN DELETE SOLICITUD_RECIBIDA_TMP; DELETE SOLICITUD_DATO_TMP; DELETE SOLICITUD_MOTIVO_RECHAZO_TMP; VR_SOLICITUD := RT_SOLICITUD; VR_DATOS := RT_SOLICITUD_DATOS; VR_SOLICITUD.FECHA_ESTADO := SYSDATE; VR_SOLICITUD.FECHA_REGISTRO := SYSDATE; --Encriptamos la tarjeta para registrar. VR_SOLICITUD.TARJETA := fc_pan2cripto(VR_SOLICITUD.TARJETA); --Obtenemos el dato del emisor. BEGIN SELECT * INTO VR_TARJETA FROM CREDITOPY.TARJETAS T WHERE T.TARJETA = VR_SOLICITUD.TARJETA; VR_SOLICITUD.EMISOR := VR_TARJETA.EMISOR; EXCEPTION WHEN OTHERS THEN VR_SOLICITUD.EMISOR := 0; END; --Obtenemos el Id para las Solicitudes. SELECT SEQ_SOLICITUDES.NEXTVAL INTO VR_SOLICITUD.ID_SOLICITUD_RECIBIDA FROM DUAL; SELECT SEQ_SS_DATOS.NEXTVAL INTO VR_DATOS.ID_SOLICITUD_DATO FROM DUAL; VR_DATOS.ID_SOLICITUD_RECIBIDA := VR_SOLICITUD.ID_SOLICITUD_RECIBIDA; --Obtenemos el Tipo de Solicitud a evaluar. BEGIN SELECT * INTO VR_TIPO FROM CREDITOPY.SOLICITUDES S WHERE S.ID_SOLICITUD = VR_SOLICITUD.ID_SOLICITUD; EXCEPTION WHEN OTHERS THEN SELECT * INTO VR_TIPO FROM CREDITOPY.SOLICITUDES S WHERE S.ID_SOLICITUD = 0; END; --Registramos en las tablas temporales. INSERT INTO TARJETA_TMP VALUES VR_TARJETA; INSERT INTO SOLICITUD_RECIBIDA_TMP VALUES VR_SOLICITUD; INSERT INTO SOLICITUD_DATO_TMP VALUES VR_DATOS; --Aplicamos las reglas de evaluacion. SM.PR_SET_EVALUACION_COMPLETA; --Validar la Novedad SM.PR_VALIDAR_NOVEDAD(VR_TIPO.TIPO_NOVEDAD, VR_NOVEDAD_CUENTA.NOVNRO, VR_NOVEDAD_CUENTA.NOVFCHING, VR_SOLICITUD.USUARIO, VR_SOLICITUD.EMISOR); VR_MOTIVOS := SM.FT_GET_MOTIVOS; --Si tenemos rechazos, aplicamos las adaptaciones. IF VR_MOTIVOS.COUNT > 0 THEN --Registramos los motivos de rechazos. FOR X IN 1 .. VR_MOTIVOS.COUNT LOOP SELECT SEQ_SS_MM_RECHAZOS.NEXTVAL INTO VR_RECHAZO.ID_MOTIVO_RECHAZO FROM DUAL; VR_RECHAZO.ID_SOLICITUD_RECIBIDA := VR_SOLICITUD.ID_SOLICITUD_RECIBIDA; VR_RECHAZO.REGLA_ID := VR_MOTIVOS(X).REGLA_ID; VR_RECHAZO.MOTIVO_RECHAZO := VR_MOTIVOS(X).MENSAJE; INSERT INTO SOLICITUD_MOTIVO_RECHAZO_TMP VALUES VR_RECHAZO; --Registramos en la Tabla Temporal de rechazos END LOOP; --Aplicar las correcciones. FOR R IN (SELECT A.REGLA_ID, A.CORRECCION FROM CREDITOPY.SOLICITUDES_CORRECCIONES A, CREDITOPY.SOLICITUD_MOTIVO_RECHAZO_TMP B, CREDITOPY.SOLICITUD_RECIBIDA_TMP C WHERE C.ID_SOLICITUD_RECIBIDA = B.ID_SOLICITUD_RECIBIDA AND A.ID_SOLICITUD = C.ID_SOLICITUD AND A.REGLA_ID = B.REGLA_ID) LOOP EXECUTE IMMEDIATE R.CORRECCION; END LOOP; --Tomamos los datos corregidos. SELECT * INTO VR_SOLICITUD FROM CREDITOPY.SOLICITUD_RECIBIDA_TMP; SELECT * INTO VR_DATOS FROM CREDITOPY.SOLICITUD_DATO_TMP; ELSE VR_RECHAZO.REGLA_ID := 0; END IF; VR_SOLICITUD.CODIGO_RESPUESTA := VR_RECHAZO.REGLA_ID; --Registramos la Solicitud. INSERT INTO SOLICITUDES_RECIBIDAS VALUES VR_SOLICITUD; INSERT INTO SOLICITUDES_DATOS VALUES VR_DATOS; --Registramos los motivos de rechazos INSERT INTO SOLICITUDES_MOTIVOS_RECHAZOS SELECT * FROM CREDITOPY.SOLICITUD_MOTIVO_RECHAZO_TMP; RT_SOLICITUD := VR_SOLICITUD; RT_SOLICITUD_DATOS := VR_DATOS; COMMIT; END; PROCEDURE PR_ADM_ERROR_SOLICITUD(NP_ID_SOLICITUD_RECIBIDA IN SOLICITUDES_MOTIVOS_RECHAZOS.ID_SOLICITUD_RECIBIDA%TYPE, NP_ID_ESTADO IN SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE, NP_REGLA_ID IN SOLICITUDES_MOTIVOS_RECHAZOS.REGLA_ID%TYPE, CP_MOTIVO_RECHAZO IN SOLICITUDES_MOTIVOS_RECHAZOS.MOTIVO_RECHAZO%TYPE) AS PRAGMA AUTONOMOUS_TRANSACTION; VR_RECHAZO SOLICITUDES_MOTIVOS_RECHAZOS%ROWTYPE; BEGIN --Marcamos la Solicitud Recibida con su respectivo Estado de Rechazo. UPDATE SOLICITUDES_RECIBIDAS SR SET SR.ID_ESTADO = NP_ID_ESTADO, SR.CODIGO_RESPUESTA = NP_REGLA_ID WHERE SR.ID_SOLICITUD_RECIBIDA = NP_ID_SOLICITUD_RECIBIDA; SELECT SEQ_SS_MM_RECHAZOS.NEXTVAL INTO VR_RECHAZO.ID_MOTIVO_RECHAZO FROM DUAL; VR_RECHAZO.ID_SOLICITUD_RECIBIDA := NP_ID_SOLICITUD_RECIBIDA; VR_RECHAZO.REGLA_ID := NP_REGLA_ID; VR_RECHAZO.MOTIVO_RECHAZO := CP_MOTIVO_RECHAZO; INSERT INTO SOLICITUDES_MOTIVOS_RECHAZOS VALUES VR_RECHAZO; COMMIT; END PR_ADM_ERROR_SOLICITUD; PROCEDURE PR_CEIBO_LOG(CP_TIPO_DATO IN VARCHAR2, CP_TD_REGISTRO IN VARCHAR2, CP_DESCRIPCION IN CLOB, DP_FECHA_REGISTRO IN DATE, CP_USUARIO IN VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; /* Procedimiento para registrar logs de ejecucion en creditopy.CEIBO_LOG 24/10/2007 17:42:08 - Amalia R. Procedimiento adaptado por ER para registro de novedades en linea. Necesario para el reporte de novedades. 081120111152. */ VI_PARSE BINARY_INTEGER; PROCEDURE PL_SET_SECUENCIA AS BEGIN SELECT SEQ_CEIBO_LOG.NEXTVAL INTO VR_LOG.TD_SECUENCIA FROM DUAL; EXCEPTION WHEN OTHERS THEN VR_LOG.TD_SECUENCIA := 0; END PL_SET_SECUENCIA; PROCEDURE PL_EXCEPCION AS BEGIN INSERT INTO CREDITOPY.CEIBO_LOG (TIPO_DATO, TD_REGISTRO, TD_SECUENCIA, DESCRIPCION, FECHA, USUARIO, BITACORA_ID) VALUES ('999', '999', VR_LOG.TD_SECUENCIA, VR_LOG.DESCRIPCION, VR_LOG.FECHA, VR_LOG.USUARIO, PV_BITACORA_ID); EXCEPTION WHEN OTHERS THEN IF NVL(VR_LOG.TD_SECUENCIA, 0) = 0 THEN PL_SET_SECUENCIA; END IF; IF VR_LOG.DESCRIPCION IS NULL THEN VR_LOG.DESCRIPCION := SQLERRM; END IF; IF VR_LOG.FECHA IS NULL THEN VR_LOG.FECHA := SYSDATE; END IF; IF VR_LOG.USUARIO IS NULL THEN VR_LOG.USUARIO := 'NONE'; END IF; INSERT INTO CREDITOPY.CEIBO_LOG (TIPO_DATO, TD_REGISTRO, TD_SECUENCIA, DESCRIPCION, FECHA, USUARIO, BITACORA_ID) VALUES ('999', '999', VR_LOG.TD_SECUENCIA, VR_LOG.DESCRIPCION, VR_LOG.FECHA, VR_LOG.USUARIO, PV_BITACORA_ID); END PL_EXCEPCION; FUNCTION FL_GET_DESCRIPCION RETURN VARCHAR2 AS BEGIN RETURN SUBSTR(NVL(CP_DESCRIPCION, 'MENSAJE NULO'), 1, PV_LOG_LEN); EXCEPTION WHEN OTHERS THEN RETURN 'ERROR AL OBTENER MENSAJE.'; END FL_GET_DESCRIPCION; BEGIN VR_LOG.FECHA := NVL(DP_FECHA_REGISTRO, SYSDATE); VR_LOG.USUARIO := substr(CP_USUARIO, 1, 15); VR_LOG.TIPO_DATO := substr(CP_TIPO_DATO, 1, 50); VR_LOG.TD_REGISTRO := substr(CP_TD_REGISTRO, 1, 15); VR_LOG.BITACORA_ID := PV_BITACORA_ID; VI_PARSE := 1; LOOP VR_LOG.DESCRIPCION := FC_PARSE_CADENA(CP_DESCRIPCION, VI_PARSE, PV_LOG_LEN); EXIT WHEN VR_LOG.DESCRIPCION IS NULL; --Obtenemos la secuencia. PL_SET_SECUENCIA; INSERT INTO CREDITOPY.CEIBO_LOG VALUES VR_LOG; VI_PARSE := VI_PARSE + 1; END LOOP; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; IF VR_LOG.USUARIO IS NULL THEN VR_LOG.USUARIO := 'NONE'; END IF; VR_LOG.DESCRIPCION := SQLERRM; PL_EXCEPCION; VR_LOG.DESCRIPCION := FL_GET_DESCRIPCION; PL_EXCEPCION; COMMIT; END PR_CEIBO_LOG; PROCEDURE PR_LOGGING(CP_TIPO IN CEIBO_LOG.TIPO_DATO%TYPE, CP_REGISTRO IN CEIBO_LOG.TD_REGISTRO%TYPE, CP_DESCRIPCION IN CLOB DEFAULT NULL) AS BEGIN PV_USUARIO := get_usuario; PR_CEIBO_LOG(CP_TIPO, CP_REGISTRO, --Comentamos, pues ya tenemos bitacora_id --FC_GET_ID_NOVEDAD||CP_DESCRIPCION, NVL(CP_DESCRIPCION, ' '), SYSDATE, PV_USUARIO); END PR_LOGGING; PROCEDURE spAcreditarTransfPendientes(PI_NUMERO_CUENTA IN NUMBER, PI_TARJETA IN VARCHAR2, PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_CELULAR IN VARCHAR2, -- Numero de Celular Formato 0NNNNNNNNN PI_NOVEDAD IN NUMBER, -- Numero de novedad de alta PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, PO_CNT_TXS OUT NUMBER, PO_LISTA_TXS OUT VARCHAR2) AS PRAGMA AUTONOMOUS_TRANSACTION; VR_CUENTAS creditopy.CUENTAS%ROWTYPE; VR_CUENTA_PUENTE creditopy.CUENTAS%ROWTYPE; VR_ALTA_MOV_AJUSTES creditopy.ALTA_MOVIMIENTOS_AJUSTES@OLPY%ROWTYPE; VD_FECHA_PROCESO DATE; CC_RUBRO_CR NUMBER(4) := 5703; VD_FECHA_SYS DATE; V_COD_COMERCIO_DIMO NUMBER; V_COD_COMERCIO_AUX NUMBER := 9960410; --V_TARJETA VARCHAR2(16); VC_REQ VARCHAR2(512); VC_RES VARCHAR2(512); PROCEDURE inicializar_alta_ajuste AS BEGIN VR_ALTA_MOV_AJUSTES.FECHA_PROCESO := VD_FECHA_PROCESO; VR_ALTA_MOV_AJUSTES.PERIODO_CIERRE := VR_CUENTAS.PERIODO_CIERRE_DEBE; VR_ALTA_MOV_AJUSTES.RUBRO := CC_RUBRO_CR; VR_ALTA_MOV_AJUSTES.TIPO_DE_MONEDA := 1; VR_ALTA_MOV_AJUSTES.OPERADOR := 805; VR_ALTA_MOV_AJUSTES.PROCESADO := 'N'; VR_ALTA_MOV_AJUSTES.SECUENCIA := 1; VR_ALTA_MOV_AJUSTES.EMISOR_RECEPTOR := 0; VR_ALTA_MOV_AJUSTES.NUMERO_TALON := 1; VR_ALTA_MOV_AJUSTES.USUARIO := CC_USUARIO_DIMO; VR_ALTA_MOV_AJUSTES.FECHA_REGISTRO := SYSDATE; VR_ALTA_MOV_AJUSTES.NOVEDAD := PI_NOVEDAD; VR_ALTA_MOV_AJUSTES.USUARIO_ORIGINAL := CC_USUARIO_DIMO; END inicializar_alta_ajuste; BEGIN vd_fecha_proceso := SYSDATE; vd_fecha_sys := SYSDATE; PO_CNT_TXS := 0; PO_LISTA_TXS := CHR(037); BEGIN -- obtener datos de la cuenta de tarjeta puente DIMO SELECT C.* INTO VR_CUENTA_PUENTE FROM creditopy.TARJETAS TP, creditopy.CUENTAS C WHERE tp.tarjeta = fc_getTarjetaPuenteDIMO AND c.numero_cuenta = tp.numero_cuenta; -- obtener datos de la cuenta destino SELECT C.* INTO VR_CUENTAS FROM creditopy.CUENTAS C WHERE c.numero_cuenta = PI_NUMERO_CUENTA; END; inicializar_alta_ajuste; BEGIN V_COD_COMERCIO_DIMO := fn_getComercioGestionDIMO; IF V_COD_COMERCIO_DIMO = -1 THEN V_COD_COMERCIO_DIMO := V_COD_COMERCIO_AUX; END IF; END; --V_TARJETA := fc_pan2cripto(PI_TARJETA); -- seleccionamos las transferencias que corresponden al usuario de DOCUMENTO recibido -- y todavia no se le acreditaron FOR B IN (SELECT t.* FROM creditopy.SICOOP_TRANSFER@OLPY t WHERE lpad(t.documento_destino, 12, 0) = lpad(PI_DOCUMENTO, 12, 0) AND t.telefono_destino = PI_CELULAR AND t.aplicado_destino = 0 ORDER BY t.fecha_transf) LOOP -- datos de la cuenta destino VR_ALTA_MOV_AJUSTES.EMISOR := VR_CUENTAS.Emisor; VR_ALTA_MOV_AJUSTES.SUCURSAL_EMISOR := VR_CUENTAS.Sucursal_Emisor; VR_ALTA_MOV_AJUSTES.PRODUCTO := VR_CUENTAS.Producto; VR_ALTA_MOV_AJUSTES.NUMERO_CUENTA := VR_CUENTAS.Numero_Cuenta; VR_ALTA_MOV_AJUSTES.CODIGO_OPERACION := 1; VR_ALTA_MOV_AJUSTES.FECHA_MOVIMIENTO := trunc(b.fecha_transf); VR_ALTA_MOV_AJUSTES.IMPORTE := b.monto_transferido; VR_ALTA_MOV_AJUSTES.LEYENDA := 'Transf.recibida el ' || to_char(b.fecha_transf, 'dd/mm/yyyy'); -- registrar el movimiento de credito INSERT INTO CREDITOPY.ALTA_MOVIMIENTOS_AJUSTES@OLPY VALUES VR_ALTA_MOV_AJUSTES; -- la transferencia como acreditada UPDATE creditopy.SICOOP_TRANSFER@OLPY BD SET BD.APLICADO_DESTINO = 1, BD.FECHA_APLICADO = SYSDATE, BD.TARJETA_APLICADO = PI_TARJETA WHERE BD.DOCUMENTO_DESTINO = b.documento_destino AND BD.TELEFONO_DESTINO = b.telefono_destino AND BD.APLICADO_DESTINO = 0 AND BD.IDSESION_UUID = b.idsesion_uuid; -- datos de la cuenta de tarjeta puente VR_ALTA_MOV_AJUSTES.EMISOR := VR_CUENTA_PUENTE.Emisor; VR_ALTA_MOV_AJUSTES.SUCURSAL_EMISOR := VR_CUENTA_PUENTE.Sucursal_Emisor; VR_ALTA_MOV_AJUSTES.PRODUCTO := VR_CUENTA_PUENTE.Producto; VR_ALTA_MOV_AJUSTES.NUMERO_CUENTA := VR_CUENTA_PUENTE.Numero_Cuenta; VR_ALTA_MOV_AJUSTES.CODIGO_OPERACION := 0; VR_ALTA_MOV_AJUSTES.LEYENDA := 'Transf.de ' || TRIM(leading '0' FROM substr(b.documento_origen, 4, 12)); -- registrar el movimiento de credito INSERT INTO CREDITOPY.ALTA_MOVIMIENTOS_AJUSTES@OLPY VALUES VR_ALTA_MOV_AJUSTES; COMMIT; -- insertar la txs off-line para otorgar el disponible BEGIN /* original SELECT '02207238058100C1801416'|| FC_CRIPTO2PAN(PI_TARJETA)||'203000'|| LPAD(VR_ALTA_MOV_AJUSTES.IMPORTE,10,0)||'00' ||TO_CHAR(SYSDATE,'MMDDhh24mmss')||LPAD(SEQ_STAN.NEXTVAL@OLPY,6,0)||TO_CHAR(SYSDATE,'hh24mmss') ||TO_CHAR(SYSDATE,'MMDD')||'0100000000011'||'10000000004'|| 'TRANDIMO'||LPAD(V_COD_COMERCIO_DIMO,15,' ')||'010R'||LPAD(1,2,0)||V_COD_COMERCIO_DIMO ||'83021'||'TRAN.PEN.DIMO 1.0 '||'009001007838' as DEVOFFLINE INTO VC_REQ FROM DUAL;*/ -- version del PR_EJEMPLO_DEVOFF 04/10/2020 SELECT '02207238058100C1801416' || FC_CRIPTO2PAN(PI_TARJETA) || '203000' || LPAD(VR_ALTA_MOV_AJUSTES.IMPORTE, 10, 0) || '00' || TO_CHAR(SYSDATE, 'MMDDhh24mmss') || LPAD(SEQ_STAN.NEXTVAL@OLPY, 6, 0) || TO_CHAR(SYSDATE, 'hh24mmss') || TO_CHAR(SYSDATE, 'MMDD') || '0100000000011' || '10000000004' || 'TRANDIMO' || LPAD(V_COD_COMERCIO_DIMO, 15, ' ') || '011R' || LPAD(1, 2, 0) || LPAD(V_COD_COMERCIO_DIMO, 8, 0) || '83021' || 'TRAN.PEN.DIMO 1.0 ' || '009001007838' AS DEVOFFLINE INTO VC_REQ FROM DUAL; --Procesamos la autorizacion VC_RES := AUTORIZADOR_CR.FUNCIONAUTORIZADORCREDITO@OLPY(VC_REQ); END; sp_delay(2); PO_CNT_TXS := PO_CNT_TXS + 1; PO_LISTA_TXS := PO_LISTA_TXS || TRIM(b.idsesion_uuid) || CHR(037); END LOOP; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; IF PO_CNT_TXS = 0 THEN PO_LISTA_TXS := ' '; PO_SQLCODE := 1; PO_SQLERRM := 'No hay transferencia pendiente para el documento.'; END IF; IF PO_SQLCODE = 1 THEN ROLLBACK; ELSE COMMIT; END IF; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; PO_CNT_TXS := 0; PO_LISTA_TXS := ' '; ROLLBACK; END spAcreditarTransfPendientes; PROCEDURE sp_setearGrupoAfinidad(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de tarjeta PI_GRUPO_AFINIDAD IN NUMBER, -- Grupo de afinidad al que va a pertenecer PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS vc_afinidad_m NUMBER := 115002; vc_captador_m VARCHAR2(2) := 'DM'; vc_id_plastico_m NUMBER := 5; vc_id_plastico_std NUMBER := 1; vc_tarjeta VARCHAR2(19); v_doc_tarjeta creditopy.tarjetas.documento%TYPE; v_afinidad_original creditopy.tarjetas.grupo_afinidad%TYPE; v_cant_tarjetas NUMBER; v_mensaje VARCHAR2(30); BEGIN sp_setEmisorDimo; -- se determina si para el documento de este usuario ya existe una tarjeta con la afinidad solicitada -- y que este operativa vc_tarjeta := creditopy.FC_PAN2CRIPTO(PI_NUMERO_TARJETA); vc_id_plastico_std := fn_get_default_tipo_tp_fisica(PV_EMISOR_DIMO); BEGIN SELECT t.documento, t.grupo_afinidad INTO v_doc_tarjeta, v_afinidad_original FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta; SELECT COUNT(*) INTO v_cant_tarjetas FROM creditopy.tarjetas t WHERE t.emisor = PV_EMISOR_DIMO AND t.tarjeta != vc_tarjeta AND t.documento = v_doc_tarjeta AND t.grupo_afinidad = PI_GRUPO_AFINIDAD AND creditopy.estado_ct(t.tarjeta, 'T') IN (0, 1); EXCEPTION WHEN no_data_found THEN v_cant_tarjetas := 0; WHEN OTHERS THEN RAISE; END; -- si no tiene otra tarjeta operativa en la nueva afinidad: se cambia esta tarjeta a la afinidad destino IF v_cant_tarjetas = 0 THEN BEGIN -- obs: por indicacion de Juan Almada las tarjetas de la afinidad 115002 nacen no operativas -- y con el tipo de plastico exclusivo -- si la nueva afinidad es 115002 entonces al confirmar -- debe quedar operativa -- indicar el captador(promotor) exclusivo = 'CM' -- cambiar al tipo de plalstico exclusivo = 5 IF PI_GRUPO_AFINIDAD = vc_afinidad_m THEN UPDATE creditopy.tarjetas u SET u.grupo_afinidad = PI_GRUPO_AFINIDAD, u.codigo_captador = VC_CAPTADOR_M, u.estado = CC_ESTADO_TP_OPERATIVA, u.clase_de_estado = 1, u.fecha_estado = SYSDATE WHERE u.tarjeta = vc_tarjeta; UPDATE creditopy.tarjetas_prepaga u SET u.id_tipo_tarjeta_prepaga = VC_ID_PLASTICO_M WHERE u.tarjeta = vc_tarjeta; v_mensaje := 'Tarjeta confirmada.'; ELSE -- si la afinidad original es 115002 entonces -- se cambia a la nueva afinidad -- se debe dejar operativa la tarjeta -- se debe configurar el tipo de plastico a standard IF v_afinidad_original = vc_afinidad_m THEN UPDATE creditopy.tarjetas u SET u.grupo_afinidad = PI_GRUPO_AFINIDAD, u.codigo_captador = CC_CAPTADOR_DIMO, u.estado = CC_ESTADO_TP_OPERATIVA, u.clase_de_estado = 1, u.fecha_estado = SYSDATE WHERE u.tarjeta = vc_tarjeta; UPDATE creditopy.tarjetas_prepaga u SET u.id_tipo_tarjeta_prepaga = vc_id_plastico_std WHERE u.tarjeta = vc_tarjeta; ELSE -- si no es ninguno de los casos anteriores -- solo cambia a la nueva afinidad UPDATE creditopy.tarjetas u SET u.grupo_afinidad = PI_GRUPO_AFINIDAD WHERE u.tarjeta = vc_tarjeta; END IF; v_mensaje := 'Afinidad cambiada.'; END IF; UPDATE creditopy.cuentas u SET u.grupo_afinidad = PI_GRUPO_AFINIDAD, u.codigo_captador = CASE WHEN PI_GRUPO_AFINIDAD = 115002 THEN vc_captador_m ELSE CC_CAPTADOR_DIMO END WHERE u.numero_cuenta = (SELECT t.numero_cuenta FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta); END; ELSE -- si ya tiene una tarjeta en la afinidad destino -- anular esta cuenta/tarjeta -- pasar el saldo actual a la tarjeta operativa standard: pendiente, descontinuado para 115002 BEGIN UPDATE creditopy.tarjetas u SET u.estado = 17, u.clase_de_estado = 16, u.fecha_estado = SYSDATE WHERE u.tarjeta = vc_tarjeta; UPDATE creditopy.cuentas u SET u.estado = 70, u.clase_de_estado = 16, u.fecha_estado = SYSDATE WHERE u.numero_cuenta = (SELECT t.numero_cuenta FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta); END; v_mensaje := 'Tarjeta anulada.'; END IF; -- se actualiza el cambio de estado en el Online. 06/06/2022. AR. INSERT INTO cambios_de_estado@olpy ct SELECT t.tarjeta, t.estado, t.fecha_estado, 0 FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta; INSERT INTO cambios_de_estado@olpy ct SELECT t.numero_cuenta, t.estado, t.fecha_estado, 0 FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta; COMMIT; OPEN po_cursor FOR SELECT substr(t.documento, 4, 12) AS documento, -- PAN de la tarjeta creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, t.grupo_afinidad AS afinidad, t.codigo_captador AS id_promotor, t.estado AS estado, tp.id_tipo_tarjeta_prepaga AS id_tipo_tarjeta, v_mensaje AS accion FROM creditopy.tarjetas t, creditopy.tarjetas_prepaga tp WHERE t.tarjeta = vc_tarjeta AND tp.tarjeta = t.tarjeta; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_setearGrupoAfinidad; PROCEDURE spConfigurarAfinidadDimo(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de tarjeta PI_GRUPO_AFINIDAD IN NUMBER, -- Grupo de afinidad al que va a pertenecer PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /**************************************************************************************************** Autor: Amalia Rodriguez. Procedimiento para dar de alta una tarjeta indicando su grupo de afinidad especifico. ticket 0002049-Afinidad DIMO. AR. 27/05/2022 16:32:00 p.m. Fecha: 27/05/2022 16:32:00 p.m. Propósito: Procedimiento que devuelve un cursor con los datos de las tarjetas prepagas DIMOs por grupo de afinidad si no tienen plastico solicitado. Se tiene como dato de entrada el grupo de afinidad a revisar PARAMETROS DE ENTRADA: pi_afinidad_dimo: codigo de grupo afinidad de Dimo ******************************************************************************************************/ vc_tarjeta VARCHAR2(19); v_grupo_afinidad creditopy.tarjetas.grupo_afinidad%TYPE; v_id_tipo_plastico creditopy.tipos_tarjeta_prepaga.id_tipo_tarjeta_prepaga%TYPE; vc_afinidad_m NUMBER := 115002; vc_captador_m VARCHAR2(2) := 'DM'; vc_tipo_plastico_m NUMBER := 5; vc_tipo_plastico_std NUMBER := 1; vn_tipo_direccion_email direcciones.tipo_de_direccion%TYPE := 6; vn_tipo_direccion_cel direcciones.tipo_de_direccion%TYPE := 7; BEGIN -- inicializaciones sp_setEmisorDimo; vc_tarjeta := creditopy.fc_pan2cripto(PI_NUMERO_TARJETA); vc_tipo_plastico_std := fn_get_default_tipo_tp_fisica(PV_EMISOR_DIMO); -- control de consistencia BEGIN SELECT t.grupo_afinidad INTO v_grupo_afinidad FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: No se puede encontrar la tarjeta indicada.'); WHEN OTHERS THEN RAISE; END; IF PI_GRUPO_AFINIDAD = vc_afinidad_m AND PI_GRUPO_AFINIDAD = v_grupo_afinidad THEN -- si se confirma el grupo de afinidad 115002 entonces se activa la tarjeta -- BEGIN UPDATE creditopy.tarjetas u SET u.estado = CC_ESTADO_TP_OPERATIVA, u.clase_de_estado = 1, u.fecha_estado = SYSDATE, u.codigo_captador = vc_captador_m WHERE u.tarjeta = vc_tarjeta; -- se actualiza el cambio de estado en el Online. 06/06/2022. AR. INSERT INTO cambios_de_estado@olpy ct SELECT t.tarjeta, t.estado, t.fecha_estado, 0 FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta; COMMIT; END; ELSE sp_setearGrupoAfinidad(PI_NUMERO_TARJETA, PI_GRUPO_AFINIDAD, PO_SQLCODE, PO_SQLERRM, po_cursor); END IF; OPEN po_cursor FOR SELECT -- Numero del documento de identidad substr(t.documento, 4, 12) AS documento, -- PAN de la tarjeta creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, -- tipo medio: VIRTUAL / FISICA decode(creditopy.pkg_dimo_ceibo.fn_is_prepaga_fisica(t.tarjeta), 1, 'FISICA', 'VIRTUAL') AS tipo_medio, -- nombre que aparece en el plastico de la tarjeta t.nombre_para_plastico AS nombre_usuario, -- id del estado de la tarjeta creditopy.estado_ct(t.tarjeta, 'T') AS estado, -- descripcion del estado de la tarjeta creditopy.pkg_dimo_ceibo.fn_get_estado_desc(creditopy.estado_ct(t.tarjeta, 'T')) AS desc_estado, tp.id_tipo_tarjeta_prepaga AS id_tipo_tarjeta_prepaga, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 2) AS tipo_tarjeta_prepaga, tp.estado_plastico AS estado_tarjeta_fisica, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 4) AS desc_estado_tarjeta_fisica, t.grupo_afinidad AS id_grupo_afinidad, ga.descripcion AS desc_afinidad, dc.calle AS celular, de.calle AS email, t.tarjeta AS tarjeta FROM creditopy.tarjetas t, creditopy.grupos_afinidad ga, creditopy.tarjetas_prepaga tp, creditopy.direcciones dc, creditopy.direcciones de WHERE t.tarjeta = vc_tarjeta -- Encriptada. 06/06/2022. AR. --AND t.estado IN (0,1) -- Sin considerar el estado. 06/06/2022. AR. AND t.fecha_vigencia > trunc(SYSDATE) AND ga.emisor = t.emisor AND ga.grupo_afinidad = t.grupo_afinidad AND tp.tarjeta = t.tarjeta AND dc.emisor = t.emisor AND dc.sucursal_emisor = t.sucursal_emisor AND dc.producto = t.producto AND dc.numero_cuenta = t.numero_cuenta AND dc.tipo_de_documento = t.tipo_de_documento AND dc.documento = t.documento AND dc.tipo_de_direccion = vn_tipo_direccion_cel AND de.emisor = t.emisor AND de.sucursal_emisor = t.sucursal_emisor AND de.producto = t.producto AND de.numero_cuenta = t.numero_cuenta AND de.tipo_de_documento = t.tipo_de_documento AND de.documento = t.documento AND de.tipo_de_direccion = vn_tipo_direccion_email ORDER BY documento; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END spConfigurarAfinidadDimo; PROCEDURE sp_RegistroDimoPorAfinidad(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_EMAIL IN VARCHAR2, -- Correo Electronico. SICOOP debe aplicar control de formato PI_CELULAR IN VARCHAR2, -- Numero de Celular Formato 0NNNNNNNNN PI_NOMBRES IN VARCHAR2, -- Nombres de la Persona PI_APELLIDOS IN VARCHAR2, -- Apellidos de la Persona PI_FECHA_NACIMIENTO IN DATE, -- Fecha de Nacimiento de la Persona. PI_CODIGO_SEXO IN NUMBER, -- 1 Femenino, 2 Masculino,0 Nulo PI_GRUPO_AFINIDAD IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /**************************************************************************************************** Autor: Amalia Rodriguez. Procedimiento para dar de alta una tarjeta indicando su grupo de afinidad especifico. ticket 0002049-Afinidad DIMO. AR. 27/05/2022 16:32:00 p.m. Fecha: 27/05/2022 16:32:00 p.m. Propósito: Reutilizar el sp_registroDimo seteando previamente valores para el grupo de afinidad al alta de acuerdo a las indicaciones de Juan Almada: -- las tarjetas de la afinidad 115002 no nacen operativas -- el tipo de plastico no se permite seleccionar, se relaciona al tipo de plastico 5 PARAMETROS DE ENTRADA: * todos los parametros originales del sp_registroDImo + pi_afinidad_dimo: codigo de grupo afinidad de Dimo ******************************************************************************************************/ BEGIN PR_LOGGING('DIMO', 'ALTAS-DIMO', 'LLEGO PKG_DIMO_CEIBO.sp_RegistroDimoPorAfinidad. INICIO.' || ' DOCUMENTO:' || PI_DOCUMENTO || ' AFINIDAD: ' || PI_GRUPO_AFINIDAD); PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_RegistroDimoPorAfinidad. INICIO.' || ' DOCUMENTO:' || PI_DOCUMENTO || ' AFINIDAD: ' || PI_GRUPO_AFINIDAD); sp_setEmisorDimo; PV_GRUPO_AFINIDAD := PI_GRUPO_AFINIDAD; CASE PV_GRUPO_AFINIDAD WHEN 115002 THEN PV_PROMOTOR_ID := 'DM'; PV_ESTADO_TJ_ALTA := 0; -- no activada PV_ID_TIPO_PLASTICO := 5; -- plastico predefinido ELSE PV_PROMOTOR_ID := CC_CAPTADOR_DIMO; PV_ESTADO_TJ_ALTA := CC_ESTADO_TP_OPERATIVA; PV_ID_TIPO_PLASTICO := fn_get_default_tipo_tp_fisica(PV_EMISOR_DIMO); END CASE; creditopy.PKG_DIMO_CEIBO.sp_RegistroDimo(PI_DOCUMENTO, PI_EMAIL, PI_CELULAR, PI_NOMBRES, PI_APELLIDOS, PI_FECHA_NACIMIENTO, PI_CODIGO_SEXO, PO_SQLCODE, PO_SQLERRM, PO_CURSOR); EXCEPTION WHEN OTHERS THEN RAISE; END sp_RegistroDimoPorAfinidad; PROCEDURE sp_registrodimo(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_EMAIL IN VARCHAR2, -- Correo Electronico. SICOOP debe aplicar control de formato PI_CELULAR IN VARCHAR2, -- Numero de Celular Formato 0NNNNNNNNN PI_NOMBRES IN VARCHAR2, -- Nombres de la Persona PI_APELLIDOS IN VARCHAR2, -- Apellidos de la Persona PI_FECHA_NACIMIENTO IN DATE, -- Fecha de Nacimiento de la Persona. PI_CODIGO_SEXO IN NUMBER, -- 1 Femenino, 2 Masculino,0 Nulo PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 8.1- Registro cliente nuevo Dimo y nueva cuenta para una tarjeta prepaga Adaptado del PKG_SICOOP_DIMO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 12/05/2020. */ /* Autor: Edgar Rojas. Fecha: 23/04/2020 11:02 Proposito: Registro cliente nuevo Dimo y nueva cuenta para una tarjeta prepaga Al registrarse a la app DIMO, se crea una cuenta nueva correspondiente a la tarjeta prepaga, y queda disponible para utilizar con saldo 0. NO GENERA PLASTICO NI PIN, aunque la documentacion indique que es opciona. No tiene parametros que definan si se genera plastico ni pin por tanto, solo es Virtual. Cumple con el 3.2 Sobre la tarjeta prepaga:generacion y renovacion a)Pueden emitirse tarjetas: solo relacionadas a un documento, con nombre del usuario. b)El alta de una tarjeta prepaga relacionada al documento del usuario GENERA UNA CUENTA, Y LA PRIMERA TARJETA PARA EL USUARIO. -------------------------------------------------------------------------------------------- NRA: no impide que pueda realizar otras altas. Genera la cuenta tarjeta sin importar si ya tiene otra cuenta. -------------------------------------------------------------------------------------------- f) Se puede indicar una cantidad máxima de tarjetas por cuenta. Esto es parametrizable. g) No se habilita la generacion de tarjetas adicionales para otro documento, la relacion es que todas las tarjetas de una cuenta son de un mismo documento. h) Los saldos siempre son administrados por cuenta y se debe poder definir un limite de uso por tarjeta. i) El plazo de vigencia es diferencial (5 anios). Esto es parametrizable. j) Se debe poder aplicar cargos en la emision. Esto es parametrizable. k) El cargo de emision se aplican por tarjeta/cuenta. Esto es parametrizable. l) El cargo por la emision debe poder aplicarse en los distintos pasos de la emision y con montos parametrizables. Los pasos donde pueden aplicarse son actualmente: ¿ Al momento de generar la cuenta/tarjeta por un alta, o ¿ Al renovar la tarjeta, o ¿ Al activar la tarjeta Si no hay parametrizacion de monto entonces no se aplica el cargo. Sobre la aplicacion del cargo en la emision referenciar el item 3.5. Sobre la aplicacion de los cargos y la facturacion de los mismos. --------------------------------------------------------------------- NRA: No hay parametros al momento del desarrollo. ER 202004231311. --------------------------------------------------------------------- m) La tarjeta que nace con la cuenta es una tarjeta virtual. Esta tarjeta virtual puede ser activada por el usuario o puede quedar Operativa, se manejará por un parámetro. Debe poder transaccionar en forma inmediata. o) El embozado es opcional en la generación. Debe quedar un indicador que la tarjeta no tiene plástico. Referencia: API_TARJETAHABIENTE_15abril2020.xlsx Hoja 8.1- Crear tar-cuenta DIMO Las prepagas deben poder darse de alta y utilizarse EN TODO MOMENTO: Utilizar en todo momento tambien incluye poder operar por lo tanto DEBE SER VIRTUAL para este procedimiento. Prevenir para cuando las Novedades On Line es solo Otorgar o Denegar. Esta prestacion se analizara posterior al lunes 27. Falta el tema de Cargos Pendientes Temas Pendientes para el Alta 2. Parámetros nuevos exclusivos para tarjeta pre-paga Indicador de emisor de tarjetas prepagas. Indicador de cantidad máxima de tarjetas por cuenta. Indicador de estado de una tarjeta virtual a su generación. Si nace operativa o se deja para que el usuario la active o no. Indicador de operaciones que puede realizar la tarjeta virtual y cuales solo si cuenta con el plástico. Indicador de cantidad de reintentos para aplicar cargos programados no cubiertos. Cargos a aplicar por transacción, como originatario de la transacción o destinatario */ -- variables de input y output originales CP_MESSAGE_CODE VARCHAR2(20); --Codigo especifico de mensaje. CP_MESSAGE VARCHAR2(2064); --Mensaje asociado a messageCode NP_NOVEDAD NUMBER(16); --Codigo de resultado de la Novedad. NP_NUMERO_CUENTA NUMBER(13); --Numero de Cuenta de la tarjeta. NP_NUMERO_TARJETA_NUEVA VARCHAR2(16); --Numero de la Tarjeta --2472: Revision de los errores de Registro (OTP) --Se amplio de 25 a 26. ER 202208170932 CP_NOMBRE_PLASTICO VARCHAR2(26); -- variables para aplicacion de trasnferencias pendientes v_sqlcode NUMBER; v_sqlerrm VARCHAR2(2064); vn_cnt_txs NUMBER; vc_lista_txs VARCHAR2(2064); v_flg_con_tranf VARCHAR2(1); BEGIN PR_LOGGING('DIMO', --'WS', 'ALTAS-DIMO', --'01', 'PKG_DIMO_CEIBO.sp_registrodimo. INICIO.' || ' DOCUMENTO:' || PI_DOCUMENTO); --||' NP_ID_REQUEST:' || NP_ID_REQUEST|| --' CP_CODIGO_PARTICIPANTE:' || CP_CODIGO_PARTICIPANTE|| --' CP_CANAL:' || CP_CANAL); --Los datos del Header Request son registrados en el Ceibo Log y en el Historico de Cuentas. --Se da de alta la Cuenta Tarjeta Prepaga con Limites Cuentas en cero para todos los planes. --Se modifico que el Calculo de Disponibles CP_MESSAGE_CODE := '0'; CP_MESSAGE := 'Ok.'; /* NP_NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; NP_NUMERO_TARJETA_NUEVA := FC_CRIPTO2PAN(VR_TARJETA.TARJETA); CP_NOMBRE_PLASTICO := VR_TARJETA.NOMBRE_PARA_PLASTICO; */ --Primer punto, todos los procedimientos de NOVEDADES_ONLINE_PCI se deben traer aqui:Es mejor separar todo del CEIBO Tarjetas. --Esto fue lo acordadro. --Consideraciones y Ventajas: --1. De acuerdo al Nivel del Proceso: Sino es Full: es solo Otorgar o Denegar. -- 1.1 Debemos proceder normalmente en el Batch. -- 1.2 Registrar la nueva cuenta y tarjeta en la tabla auxiliar del OL. -- 1.3 La replicacion quedara a cargo de la Diaria. --2. Para aplicar nuevas reglas, se usaran las tablas de novedades en el Batch. --3. Es mejor el manejo de errores en este paquete. --4. No es necesario completar NovedadesCuentas ni NovedadesTarjetas del OL. /**************************************************************************************************/ --Proceso Normal. --Limpiar el Historico (matriz donde se registraran todos los datos a registrar en el Historico@olpy) --Asignar los datos por defecto en las tablas Principales y Secundarias --Realizar los Geteres: Obtener todos los datos de tablas secundarias. --Tomar los parametros de entrada en las tablas Principales. --Setear los Tipos de Direcciones: Direccion (por defecto datos de Cabal), Correo Electronico y Numero de Celular. --Contiuamos tomando los datos personales. --Fin de toma de los Parametros. --Obtener los datos para el Historico. --Se registra en el Historico@olpy --Se cargan en las tablas de Temporales de Cuentas, Tarjetas, Personas, ... del Batch. --Se ejecutan las reglas de validacion. --Se registra el resultado en el Historico@olpy --Si se Aprueba, se hace el commit en el WebService. --Si se rechaza, se hace el rollback en el WebService. --De acuerdo al Nivel del Proceso, el WebService replica o no los cambios. /**************************************************************************************************/ --LIMPIAR EL HISTORICO PR_LIMPIAR_HISTORICO; --Incializamos ciertas Variables. PV_JOB_NOMBRE := JOB_ALTAS; VR_PERSONA := NULL; VR_CUENTA := NULL; VR_TARJETA := NULL; VR_DIRECCION := NULL; VR_EMAIL := NULL; VR_CELULAR := NULL; VR_TARJETAS_PREPAGA := NULL; PV_FEC_REG_ALTA := SYSDATE; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 1.' || ' DOCUMENTO:' || PI_DOCUMENTO); --Asignar los datos por defecto en las tablas Principales y Secundarias VR_CIUDAD.CIUDAD := 1; VR_OCUPACION.CODIGO_OCUPACION := 9999; VR_ESTADO_CIVIL.ESTADO_CIVIL := 9; PR_SET_EMISOR_DIMO; VR_PERSONA.TIPO_DE_DOCUMENTO := 1; VR_PERSONA.DOCUMENTO := LPAD(VR_EMISOR.EMISOR, 3, 0) || LPAD(PI_DOCUMENTO, 12, 0); PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 2.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); --Nombres y Apellidos VR_PERSONA.NOMBRES := SUBSTR(PI_NOMBRES, 1, 25); VR_PERSONA.APELLIDOS := SUBSTR(PI_APELLIDOS, 1, 25); VR_PERSONA.FECHA_NACIMIENTO := PI_FECHA_NACIMIENTO; VR_PERSONA.SEXO := PI_CODIGO_SEXO; --#1 Set Persona. PR_SET_PERSONA_DIMO; VR_SEXO.SEXO := PI_CODIGO_SEXO; --Realizar los Geteres... PR_GET_AFINIDAD; PR_GET_CIUDAD; PR_GET_CARTERA; PR_GET_CORRESPONDENCIA; PR_GET_SEXO; PR_GET_ESTADO_CIVIL; PR_GET_OCUPACION; PR_GET_PROMOTOR; PR_GET_EMISOR; PR_GET_SUCURSAL; PR_GET_EMISOR_PRODUCTO; PR_GET_CIERRE_DIMO; PR_DATOS_CIERRES; --Tomar los parametros de entrada en las tablas Principales. --#2 Set Cuenta PR_SET_CUENTA_DIMO; --# Set Tarjeta --Nombre Para Plastico VR_TARJETA.NOMBRE_PARA_PLASTICO := FC_GET_NOMBRE_PLASTICO(VR_PERSONA.NOMBRES, VR_PERSONA.APELLIDOS); PR_SET_TARJETA_DIMO; --Setear los Tipos de Direcciones --El tipo 1 es por defecto. --Direccion PR_SET_DIRECCION_DIMO(VR_DIRECCION); VR_DIRECCION.TIPO_DE_DIRECCION := 1; VR_DIRECCION.BARRIO := 'Catedral'; VR_DIRECCION.CALLE := 'CABALLERO 728'; VR_DIRECCION.TELEFONO := '(59521) 4147000'; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); --Email PR_SET_DIRECCION_DIMO(VR_EMAIL); VR_EMAIL.TIPO_DE_DIRECCION := 6; VR_EMAIL.BARRIO := 'Catedral'; VR_EMAIL.CALLE := PI_EMAIL; VR_EMAIL.TELEFONO := PI_CELULAR; --Celular PR_SET_DIRECCION_DIMO(VR_CELULAR); VR_CELULAR.TIPO_DE_DIRECCION := 7; VR_CELULAR.BARRIO := 'Catedral'; VR_CELULAR.CALLE := PI_CELULAR; VR_CELULAR.TELEFONO := PI_CELULAR; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-1.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); --Registramos el Historico. PR_HISTORICO_ALTA_DIMO; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-1-1.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); NP_NOVEDAD := VR_HISTORICO.NOVNRO; --Evaluar las reglas del Alta Dimo. --Para eso debemos Registrar en las tablas temporales. INSERT INTO PERSONA_TMP VALUES VR_PERSONA; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-1-2.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); INSERT INTO CUENTA_TMP VALUES VR_CUENTA; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-2.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); INSERT INTO TARJETA_TMP VALUES VR_TARJETA; INSERT INTO DIRECCION_TMP VALUES VR_DIRECCION; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 3-3.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); INSERT INTO DIRECCION_TMP VALUES VR_EMAIL; INSERT INTO DIRECCION_TMP VALUES VR_CELULAR; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 4.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); --Validar la Novedad SOCIOS_MANTENIMIENTOS.PR_VALIDAR_NOVEDAD(100, VR_HISTORICO.NOVNRO, VR_HISTORICO.NOVFCHING, VR_HISTORICO.USUARIO, 805); --Obtenemos el Numero de Cuenta y Tarjeta PR_SET_NUMERO_CUENTA; --TARJETA PCUTILES.GET_PAN_CRIPTOKEY; PCUTILES.PR_INIT_BIN_EMISORES; --En pinNew se guarda la tarjeta en claro por si es posible el alta. CEIBO_EMISORES.PR_GEN_NEW_TARJETA(805, VR_TARJETA.EMISOR, VR_TARJETA.PRODUCTO, VR_HISTORICO.USUARIO, VR_TARJETA.PIN, VR_TARJETA.TARJETA); --Asingamos el Numero de Cuenta a las demas tablas. VR_TARJETA.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_DIRECCION.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_EMAIL.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_CELULAR.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_LIMITES.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; VR_SALDO_CUENTA.NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; --Registramos PR_ALTA_PERSONA; --Datos TARJETAS VR_TARJETA.PIN := fn_gen_pin(''); PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 5.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); -- insertamos datos de tarjetas prepagas VR_TARJETAS_PREPAGA.TARJETA := VR_TARJETA.TARJETA; --VR_TARJETAS_PREPAGA.ID_TIPO_TARJETA_PREPAGA := fn_get_default_tipo_tp_fisica(VR_TARJETA.EMISOR);--CC_TIPO_TARJETA_PREPAGA; VR_TARJETAS_PREPAGA.ID_TIPO_TARJETA_PREPAGA := PV_ID_TIPO_PLASTICO; -- ticket 0002049-Afinidad DIMO. AR. 02/03/2022 10:32:00 a.m. VR_TARJETAS_PREPAGA.ESTADO_PLASTICO := fn_get_estado_gen_tp_fisica(VR_TARJETA.EMISOR); --CC_ESTADO_PLASTICO; VR_TARJETAS_PREPAGA.FECHA_ESTADO := VR_TARJETA.FECHA_ESTADO; VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO := VR_TARJETA.FECHA_OTORGADA - 1; VR_TARJETAS_PREPAGA.FECHA_ULT_ACTUALIZACION := VR_TARJETA.ULT_ACTUALIZACION; VR_TARJETAS_PREPAGA.CONTADOR_DE_IMPRESION := 0; VR_TARJETAS_PREPAGA.FECHA_VIG_PIN := VR_TARJETA.FECHA_OTORGADA - 1; INSERT INTO CREDITOPY.CUENTAS VALUES VR_CUENTA; INSERT INTO CREDITOPY.TARJETAS VALUES VR_TARJETA; INSERT INTO DIRECCIONES VALUES VR_DIRECCION; INSERT INTO DIRECCIONES VALUES VR_EMAIL; INSERT INTO DIRECCIONES VALUES VR_CELULAR; INSERT INTO CREDITOPY.TARJETAS_PREPAGA VALUES VR_TARJETAS_PREPAGA; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'PKG_DIMO_CEIBO.sp_registrodimo. LOG 6.' || ' VR_PERSONA.DOCUMENTO:' || VR_PERSONA.DOCUMENTO); NP_NUMERO_CUENTA := VR_CUENTA.NUMERO_CUENTA; NP_NUMERO_TARJETA_NUEVA := FC_CRIPTO2PAN(VR_TARJETA.TARJETA); CP_NOMBRE_PLASTICO := VR_TARJETA.NOMBRE_PARA_PLASTICO; --Actualizamos el nombre del job en estados de cuentas. PR_UPD_JOB_NOMBRE(1); --Actualizamos el nombre del job en estados de tarjetas. PR_UPD_JOB_NOMBRE; --4974 PR_CARGOS_EMISION; PR_LIMITES_DIMO; PR_SALDO_CUENTA; COMMIT; /*begin CREDITOPY.NOVEDADES_ONLINE_PCI.PR_REFRESCAR_VISTAS @OLPY('ALTAS-OL'); end;*/ BEGIN spacreditartransfpendientes(VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.TARJETA, PI_DOCUMENTO, PI_CELULAR, NP_NOVEDAD, v_sqlcode, v_sqlerrm, vn_cnt_txs, vc_lista_txs); IF v_sqlcode != 0 AND v_sqlcode != 1 THEN PR_LOGGING('DIMO', 'TRANS_PEND', 'TRANSFER PENDIENTES:' || PI_DOCUMENTO || ' Error:' || v_sqlerrm); END IF; IF nvl(vn_cnt_txs, 0) > 0 THEN v_flg_con_tranf := '1'; ELSE v_flg_con_tranf := '0'; END IF; EXCEPTION WHEN OTHERS THEN v_flg_con_tranf := '0'; vc_lista_txs := ' '; v_sqlcode := SQLCODE; v_sqlerrm := SQLERRM; END; PR_LOGGING('DIMO', 'ALTAS-DIMO', 'Alta OK:' || PI_DOCUMENTO || ';Numero_Cuenta:' || NP_NUMERO_CUENTA); PR_LOGGING('DIMO', 'ALTAS-DIMO', 'Nivel Bloqueo:' || CEIBO_SOCIOS.GET_NIVEL_BLOQUEO(805, 1) || ';Numero_Cuenta:' || NP_NUMERO_CUENTA); OPEN po_cursor FOR SELECT NP_NOVEDAD AS codigo_novedad, --Codigo de resultado de la Novedad. NP_NUMERO_CUENTA AS numero_cuenta, --Numero de Cuenta de la tarjeta. NP_NUMERO_TARJETA_NUEVA AS numero_tarjeta, --Numero de la Tarjeta CP_NOMBRE_PLASTICO AS nombre_plastico_normalizado, --El nombre que se utiliza para imprimir el plastico, luego de la limpieza de caracteres. v_flg_con_tranf AS transf_acreditadas, vc_lista_txs AS lista_uuid_transf FROM dual; PO_SQLCODE := CP_MESSAGE_CODE; --Codigo especifico de mensaje. PO_SQLERRM := CP_MESSAGE; --Mensaje asociado a messageCode EXCEPTION WHEN OTHERS THEN PR_RECHAZAR_NOVEDAD; CP_MESSAGE_CODE := SQLCODE; CP_MESSAGE := SQLERRM; PO_SQLCODE := CP_MESSAGE_CODE; --Codigo especifico de mensaje. PO_SQLERRM := CP_MESSAGE; --Mensaje asociado a messageCode ROLLBACK; END sp_registrodimo; PROCEDURE sp_InitNovedades(PI_NOVEDAD_CUENTA IN OUT NOVEDADES_CUENTAS@OLPY%ROWTYPE, PI_NOVEDAD_TARJETA IN OUT NOVEDADES_TARJETAS@OLPY%ROWTYPE) AS BEGIN PI_NOVEDAD_CUENTA.NOVTIP := NULL; PI_NOVEDAD_CUENTA.NOVNRO := NULL; PI_NOVEDAD_CUENTA.NOVFCHING := NULL; PI_NOVEDAD_CUENTA.NUMERO_CUENTA := NULL; PI_NOVEDAD_CUENTA.NUMERO_EMPRESA := NULL; PI_NOVEDAD_CUENTA.GRUPO_AFINIDAD := NULL; PI_NOVEDAD_CUENTA.NOVPROM := NULL; PI_NOVEDAD_CUENTA.TIPO_DE_DIRECCION := NULL; PI_NOVEDAD_CUENTA.CALLE := NULL; PI_NOVEDAD_CUENTA.NUMERO_PUERTA := NULL; PI_NOVEDAD_CUENTA.APARTAMENTO := NULL; PI_NOVEDAD_CUENTA.CIUDAD := NULL; PI_NOVEDAD_CUENTA.CODIGO_POSTAL := NULL; PI_NOVEDAD_CUENTA.TELEFONO := NULL; PI_NOVEDAD_CUENTA.CODIGO_DE_VINCULO := NULL; PI_NOVEDAD_CUENTA.CODIGO_DE_ESTADO_FIN := NULL; PI_NOVEDAD_CUENTA.CODIGO_DE_GARANTIA := NULL; PI_NOVEDAD_CUENTA.TIPO_CUENTA := NULL; PI_NOVEDAD_CUENTA.EMISOR := NULL; PI_NOVEDAD_CUENTA.SUCURSAL_EMISOR := NULL; PI_NOVEDAD_CUENTA.NUMERO_CUENTA_DEB := NULL; PI_NOVEDAD_CUENTA.PAGO_AUTOMATICO := NULL; PI_NOVEDAD_CUENTA.NUMERO_SOCIO_LEGAJO := NULL; PI_NOVEDAD_CUENTA.BONIFICACION_TASAS := NULL; PI_NOVEDAD_CUENTA.RUC := NULL; PI_NOVEDAD_CUENTA.CICLO_ANTERIOR := NULL; PI_NOVEDAD_CUENTA.CICLO_NUEVO := NULL; PI_NOVEDAD_CUENTA.CODIGO_COSTO := NULL; PI_NOVEDAD_CUENTA.LIMITE_CREDITO := NULL; PI_NOVEDAD_CUENTA.LIMITE_FINANCIACION := NULL; PI_NOVEDAD_CUENTA.NOVRENOV := NULL; PI_NOVEDAD_CUENTA.NOVANUORG := NULL; PI_NOVEDAD_CUENTA.NOVANUBOL := NULL; PI_NOVEDAD_CUENTA.NOVANUDEB := NULL; PI_NOVEDAD_CUENTA.NUMERO_TICKET := NULL; PI_NOVEDAD_CUENTA.NOVGEN := NULL; PI_NOVEDAD_CUENTA.FECHA_PROCESO := NULL; PI_NOVEDAD_CUENTA.USUARIO := NULL; PI_NOVEDAD_CUENTA.NOVNROSEC := NULL; PI_NOVEDAD_CUENTA.NOVMOTDEV := NULL; PI_NOVEDAD_CUENTA.CANTIDAD_TARJETAS := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_A := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_B := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_C := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_E := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_F := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_G := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_H := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_K := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_L := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_M := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_N := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_O := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_P := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_Q := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_R := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_S := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_T := NULL; PI_NOVEDAD_CUENTA.NOVPARAM_U := NULL; PI_NOVEDAD_CUENTA.NOVCARTERA := NULL; PI_NOVEDAD_CUENTA.EMISOR_CUENTA := NULL; PI_NOVEDAD_CUENTA.SUCURSAL_CUENTA := NULL; PI_NOVEDAD_CUENTA.LIMITE_ADELANTO := NULL; PI_NOVEDAD_CUENTA.CODIGO_CORRESPONDENCIA := NULL; PI_NOVEDAD_CUENTA.CUOTAS_REFINAN := NULL; PI_NOVEDAD_CUENTA.TASA_REFINAN := NULL; PI_NOVEDAD_CUENTA.BLOQUEA_REFINAN := NULL; PI_NOVEDAD_CUENTA.CARGO_REFINAN := NULL; PI_NOVEDAD_CUENTA.IMPORTE_REFINAN := NULL; PI_NOVEDAD_CUENTA.CUPONGEN := NULL; PI_NOVEDAD_CUENTA.AUTGEN := NULL; PI_NOVEDAD_CUENTA.BIN := NULL; PI_NOVEDAD_CUENTA.PRODUCTO := NULL; PI_NOVEDAD_CUENTA.BARRIO := NULL; PI_NOVEDAD_CUENTA.LIMITE_PLAN_SALUD := NULL; PI_NOVEDAD_CUENTA.ESTADO_OL := NULL; PI_NOVEDAD_CUENTA.FECHA_ESTADO_OL := NULL; PI_NOVEDAD_CUENTA.FILE_ID := NULL; PI_NOVEDAD_CUENTA.REGLA_VALIDACION := NULL; PI_NOVEDAD_CUENTA.BITACORA_ID := NULL; PI_NOVEDAD_CUENTA.NUEVO_ESTADO_OL := NULL; PI_NOVEDAD_CUENTA.NUEVA_FECHA_ESTADO_OL := NULL; PI_NOVEDAD_CUENTA.FECHA_PROCESO_OL := NULL; PI_NOVEDAD_CUENTA.EMAIL := NULL; PI_NOVEDAD_CUENTA.ENVIO_EMAIL := NULL; PI_NOVEDAD_CUENTA.CELULAR := NULL; PI_NOVEDAD_CUENTA.ENVIO_SMS := NULL; PI_NOVEDAD_TARJETA.NOVTIP := NULL; PI_NOVEDAD_TARJETA.NOVNRO := NULL; PI_NOVEDAD_TARJETA.NOVFCHING := NULL; PI_NOVEDAD_TARJETA.NUMERO_CUENTA := NULL; PI_NOVEDAD_TARJETA.TARJETA := NULL; PI_NOVEDAD_TARJETA.APELLIDOS := NULL; PI_NOVEDAD_TARJETA.NOMBRES := NULL; PI_NOVEDAD_TARJETA.FECHA_NACIMIENTO := NULL; PI_NOVEDAD_TARJETA.SEXO := NULL; PI_NOVEDAD_TARJETA.ESTADO_CIVIL := NULL; PI_NOVEDAD_TARJETA.CODIGO_OCUPACION := NULL; PI_NOVEDAD_TARJETA.TIPO_DE_DOCUMENTO := NULL; PI_NOVEDAD_TARJETA.DOCUMENTO := NULL; PI_NOVEDAD_TARJETA.NOVRENOV := NULL; PI_NOVEDAD_TARJETA.NOVANUORG := NULL; PI_NOVEDAD_TARJETA.NOVANUBOL := NULL; PI_NOVEDAD_TARJETA.NOVANUDEB := NULL; PI_NOVEDAD_TARJETA.NOVSEC := NULL; PI_NOVEDAD_TARJETA.NOVNROSEC := NULL; PI_NOVEDAD_TARJETA.NOVGEN := NULL; PI_NOVEDAD_TARJETA.FECHA_PROCESO := NULL; PI_NOVEDAD_TARJETA.PIN_NEW := NULL; PI_NOVEDAD_TARJETA.NOMBRE_PLASTICO := NULL; PI_NOVEDAD_TARJETA.NOVPARAM_I := NULL; PI_NOVEDAD_TARJETA.NOVPARAM_J := NULL; PI_NOVEDAD_TARJETA.NOVPROM := NULL; PI_NOVEDAD_TARJETA.NOVMOTDEV := NULL; PI_NOVEDAD_TARJETA.EMISOR_CUENTA := NULL; PI_NOVEDAD_TARJETA.SUCURSAL_CUENTA := NULL; PI_NOVEDAD_TARJETA.NUEVO_ESTADO := NULL; PI_NOVEDAD_TARJETA.NRO_DENUNCIA := NULL; PI_NOVEDAD_TARJETA.ADICIONAL := NULL; PI_NOVEDAD_TARJETA.ESTADO_OL := NULL; PI_NOVEDAD_TARJETA.FECHA_ESTADO_OL := NULL; PI_NOVEDAD_TARJETA.TARJETA_NUEVA := NULL; PI_NOVEDAD_TARJETA.CODIGO_ORIGEN := NULL; PI_NOVEDAD_TARJETA.REGLA_VALIDACION := NULL; PI_NOVEDAD_TARJETA.FECHA_PROCESO_OL := NULL; PI_NOVEDAD_TARJETA.FECHA_VIGENCIA := NULL; PI_NOVEDAD_TARJETA.FECHA_VIGENCIA_NUEVA := NULL; PI_NOVEDAD_TARJETA.NUEVO_ESTADO_OL := NULL; PI_NOVEDAD_TARJETA.NUEVA_FECHA_ESTADO_OL := NULL; END sp_InitNovedades; PROCEDURE sp_get_tarjeta(PI_TARJETA IN CREDITOPY.TARJETAS.TARJETA%TYPE, PR_TARJETAS OUT CREDITOPY.TARJETAS%ROWTYPE) AS BEGIN SELECT * INTO PR_TARJETAS FROM CREDITOPY.TARJETAS A WHERE A.TARJETA = PI_TARJETA; EXCEPTION WHEN NO_DATA_FOUND THEN PR_REFLOG_PLSQL('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_TARJETA. La tarjeta no fue encontrada.' || ' PI_TARJETA:' || PI_TARJETA, SYSDATE); RAISE_APPLICATION_ERROR(-20001, 'La tarjeta no fue encontrada. Tarjeta:' || CREDITOPY.FC_CRIPTO2PAN(PI_TARJETA)); WHEN OTHERS THEN PR_REFLOG_PLSQL('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_TARJETA. Error al buscar la Tarjeta.' || ' PI_TARJETA:' || PI_TARJETA, SYSDATE); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Tarjeta. Tarjeta:' || CREDITOPY.FC_CRIPTO2PAN(PI_TARJETA)); END sp_get_tarjeta; PROCEDURE sp_get_tarjeta_prepaga(PI_TARJETA IN CREDITOPY.TARJETAS.TARJETA%TYPE, PR_TARJETAS_PREPAGA OUT CREDITOPY.TARJETAS_PREPAGA%ROWTYPE) AS BEGIN SELECT * INTO PR_TARJETAS_PREPAGA FROM CREDITOPY.TARJETAS_PREPAGA A WHERE A.TARJETA = PI_TARJETA; EXCEPTION WHEN NO_DATA_FOUND THEN PR_CEIBO_LOG(CC_TIPO_DATO_LOG, 'GET_TARJ_PRE', 'PKG_DIMO_CEIBO.PR_GET_TARJETA_PREPAGA. La tarjeta no fue encontrada.' || ' PI_TARJETA:' || PI_TARJETA, SYSDATE, CC_USUARIO_DIMO); RAISE_APPLICATION_ERROR(-20001, 'La tarjeta PREPAGA no fue encontrada. Tarjeta:' || CREDITOPY.FC_CRIPTO2PAN(PI_TARJETA)); WHEN OTHERS THEN PR_CEIBO_LOG(CC_TIPO_DATO_LOG, 'GET_TARJ_PRE', 'PKG_DIMO_CEIBO.PR_GET_TARJETA_PREPAGA. Error al buscar la Tarjeta.' || ' PI_TARJETA:' || PI_TARJETA, SYSDATE, CC_USUARIO_DIMO); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Tarjeta Prepaga. Tarjeta:' || CREDITOPY.FC_CRIPTO2PAN(PI_TARJETA)); END sp_get_tarjeta_prepaga; PROCEDURE sp_get_cuenta(PI_NUMERO_CUENTA IN CREDITOPY.CUENTAS.NUMERO_CUENTA%TYPE, PR_CUENTAS OUT CREDITOPY.CUENTAS%ROWTYPE) AS BEGIN SELECT * INTO PR_CUENTAS FROM CREDITOPY.CUENTAS A WHERE A.NUMERO_CUENTA = PI_NUMERO_CUENTA; EXCEPTION WHEN NO_DATA_FOUND THEN PR_REFLOG_PLSQL('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CUENTA. La cuenta no fue encontrada.' || ' PI_NUMERO_CUENTA:' || PI_NUMERO_CUENTA, SYSDATE); RAISE_APPLICATION_ERROR(-20001, 'La cuenta no fue encontrada. Cuenta:' || PI_NUMERO_CUENTA); WHEN OTHERS THEN PR_REFLOG_PLSQL('WS', '01', 'PKG_DIMO_CEIBO.PR_GET_CUENTA. Error al buscar la Cuenta.' || ' PI_NUMERO_CUENTA:' || PI_NUMERO_CUENTA, SYSDATE); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar la Cuenta. Cuenta:' || PI_NUMERO_CUENTA); END sp_get_cuenta; PROCEDURE sp_gen_cargos_de_novedad(PI_TARJETA IN CREDITOPY.TARJETAS.TARJETA%TYPE, PI_TIPO_NOVEDAD IN CREDITOPY.NOVEDADES_CARGOS_TP.TIPO_NOVEDAD%TYPE, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS VN_CARGO_ID CREDITOPY.CODIGOS_CARGOS_GESTION_TP.CARGO_ID%TYPE; VC_DESC_CORTA CREDITOPY.CODIGOS_CARGOS_GESTION_TP.DESC_CORTA%TYPE; VN_RUBRO CREDITOPY.CARGOS_GESTION_PREPAGA.RUBRO%TYPE; VN_IMPORTE NUMBER; VN_CANT_CUOTAS NUMBER; BEGIN -- identificar cuantos cargos se tienen definidos para la novedad FOR nov_cargos IN (SELECT * FROM CREDITOPY.NOVEDADES_CARGOS_TP N WHERE N.TIPO_NOVEDAD = PI_TIPO_NOVEDAD) LOOP FOR cargos IN (SELECT CG.CARGO_ID, CC.DESC_CORTA, CG.IMPORTE, CG.CANTIDAD_CUOTAS, CG.RUBRO, CG.APLICA_DESDE, CC.MODO_APLICACION, -- impresion tarjeta fisica TP.CONTADOR_DE_IMPRESION --- ojo en que momento estoy tratando de registrar el cargo FROM CREDITOPY.TARJETAS T, CREDITOPY.TARJETAS_PREPAGA TP, CREDITOPY.CODIGOS_CARGOS_GESTION_TP CC, CREDITOPY.CARGOS_GESTION_PREPAGA CG WHERE T.TARJETA = PI_TARJETA AND TP.TARJETA = T.TARJETA AND CC.CARGO_ID = nov_cargos.CARGO_ID AND CG.CARGO_ID = CC.CARGO_ID AND CG.GRUPO_AFINIDAD = T.GRUPO_AFINIDAD AND CG.ID_TIPO_TARJETA_PREPAGA = TP.ID_TIPO_TARJETA_PREPAGA AND CG.CANTIDAD_CUOTAS > 0 AND CG.IMPORTE > 0) LOOP VN_CARGO_ID := cargos.cargo_id; VC_DESC_CORTA := cargos.desc_corta; VN_RUBRO := cargos.rubro; -- se analiza la aplicación de acuerdo al proceso --Impresion de tarjeta fisica CASE PI_TIPO_NOVEDAD WHEN CC_NOVTIP_IMP_PLASTICO_TP THEN IF cargos.contador_de_impresion + 1 > cargos.aplica_desde THEN VN_IMPORTE := cargos.importe; VN_CANT_CUOTAS := cargos.cantidad_cuotas; ELSE VN_IMPORTE := 0; VN_CANT_CUOTAS := 0; END IF; ELSE VN_IMPORTE := cargos.importe; VN_CANT_CUOTAS := cargos.cantidad_cuotas; END CASE; -- AQUI INVOCAR AL PROCEDIMIENTO QUE REGISTRA EL CARGO END LOOP; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN PR_CEIBO_LOG(CC_TIPO_DATO_LOG, 'GET_CARGO', 'PKG_DIMO_CEIBO.PR_GET_DETALLE_CARGO. No hay parametro del cargo. Tipo Novedad:' || PI_TIPO_NOVEDAD, SYSDATE, CC_USUARIO_DIMO); RAISE_APPLICATION_ERROR(-20001, 'No hay parametro del cargo. Tipo Novedad:' || PI_TIPO_NOVEDAD); WHEN OTHERS THEN PR_CEIBO_LOG(CC_TIPO_DATO_LOG, 'GET_CARGO', 'PKG_DIMO_CEIBO.PR_GET_DETALLE_CARGO. Error al buscar parametro del cargo. Tipo Novedad:' || PI_TIPO_NOVEDAD, SYSDATE, CC_USUARIO_DIMO); RAISE_APPLICATION_ERROR(-20001, 'Error al buscar parametro del cargo. Tipo Novedad:' || PI_TIPO_NOVEDAD); END sp_gen_cargos_de_novedad; PROCEDURE sp_resguarda_datos_historico AS BEGIN -- resguardo los datos de la novedad antes de registrar y limpiar VC_HISTORICO.NOVNRO := VR_HISTORICO.NOVNRO; VC_HISTORICO.NOVTIP := VR_HISTORICO.NOVTIP; VC_HISTORICO.NOVFCHING := VR_HISTORICO.NOVFCHING; VC_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.FECHA_REGISTRO; VC_HISTORICO.NUMERO_CUENTA := VR_HISTORICO.NUMERO_CUENTA; VC_HISTORICO.TARJETA := VR_HISTORICO.TARJETA; VC_HISTORICO.TITULAR := VR_HISTORICO.TITULAR; VC_HISTORICO.OPCION := VR_HISTORICO.OPCION; VC_HISTORICO.TABLA := VR_HISTORICO.TABLA; VC_HISTORICO.USUARIO := VR_HISTORICO.USUARIO; VC_HISTORICO.DESPLEGAR := VR_HISTORICO.DESPLEGAR; VC_HISTORICO.EMISOR := VR_HISTORICO.EMISOR; VC_HISTORICO.NOVSEC := VR_HISTORICO.NOVSEC; VC_HISTORICO.NOVGEN := VR_HISTORICO.NOVGEN; END sp_resguarda_datos_historico; PROCEDURE sp_registrar_hist_novedad AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN FOR IDX IN 1 .. VR_HISTORICOS.COUNT LOOP INSERT INTO HISTORICO_CUENTAS@OLPY VALUES VR_HISTORICOS (IDX); END LOOP; COMMIT; VR_HISTORICOS.DELETE; END sp_registrar_hist_novedad; PROCEDURE sp_rechazar_novedad AS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN PV_REGLA_ID := SOCIOS_MANTENIMIENTOS.FC_GET_REGLA_ID; PV_MENSAJE := SOCIOS_MANTENIMIENTOS.FC_GET_MENSAJE; --Motivo de Rechazo VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; VR_HISTORICO.CAMPO := 'REGLA_VALIDACION'; IF SQLERRM IS NULL THEN VR_HISTORICO.DATO_ANTERIOR := ' '; ELSE VR_HISTORICO.DATO_ANTERIOR := SUBSTR(SQLERRM, 1, 150); END IF; VR_HISTORICO.DATO_POSTERIOR := 'reglaId:' || PV_REGLA_ID || ' ' || PV_MENSAJE; --Agregamos a la tabla de historicos. VR_HISTORICOS((VR_HISTORICOS.COUNT + 1)) := VR_HISTORICO; sp_registrar_hist_novedad; UPDATE HISTORICO_CUENTAS@OLPY HC SET HC.NOVGEN = '3' WHERE HC.NOVTIP = VR_HISTORICO.NOVTIP AND HC.NOVNRO = VR_HISTORICO.NOVNRO AND HC.NOVFCHING = VR_HISTORICO.NOVFCHING; COMMIT; END sp_rechazar_novedad; PROCEDURE sp_rechazar_solicitud(PI_ID_SOLICITUD IN SOLICITUDES_RECIBIDAS.ID_SOLICITUD_RECIBIDA%TYPE, PI_REGLA_ID IN SOLICITUDES_MOTIVOS_RECHAZOS.REGLA_ID%TYPE, PI_MOTIVO_RECHAZO IN SOLICITUDES_MOTIVOS_RECHAZOS.MOTIVO_RECHAZO%TYPE) AS PRAGMA AUTONOMOUS_TRANSACTION; VR_MOTIVOS_RECHAZOS CREDITOPY.SOLICITUDES_MOTIVOS_RECHAZOS%ROWTYPE; BEGIN SELECT SEQ_SS_MM_RECHAZOS.NEXTVAL INTO VR_MOTIVOS_RECHAZOS.ID_MOTIVO_RECHAZO FROM DUAL; VR_MOTIVOS_RECHAZOS.ID_SOLICITUD_RECIBIDA := PI_ID_SOLICITUD; VR_MOTIVOS_RECHAZOS.REGLA_ID := PI_REGLA_ID; VR_MOTIVOS_RECHAZOS.MOTIVO_RECHAZO := PI_MOTIVO_RECHAZO; INSERT INTO CREDITOPY.SOLICITUDES_MOTIVOS_RECHAZOS VALUES VR_MOTIVOS_RECHAZOS; UPDATE CREDITOPY.SOLICITUDES_RECIBIDAS u SET U.CODIGO_RESPUESTA = -1 WHERE u.ID_SOLICITUD_RECIBIDA = PI_ID_SOLICITUD; COMMIT; END sp_rechazar_solicitud; PROCEDURE sp_solicitudesUsuario(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* Autor: Edgar Rojas. Fecha: 11/06/2020 16:50 Proposito: Consulta el estado de las solicitudes remitidas por los socios/clientes de DIMO. Adaptado del sp_SeguimientosSolicitud por: Amalia Rodriguez Fecha: 29/09/2020 Mejora: Se accede a todas las solicitudes de un usuario por su documento */ VR_SOLICITUD_RECIBIDA CREDITOPY.SOLICITUDES_RECIBIDAS%ROWTYPE; BEGIN VR_SOLICITUD_RECIBIDA.Documento := lpad(PI_DOCUMENTO, 12, '0'); /*SELECT * INTO VR_SOLICITUD_RECIBIDA FROM SOLICITUDES_RECIBIDAS SR WHERE LPAD(SR.DOCUMENTO,12,'0') = VR_SOLICITUD_RECIBIDA.DOCUMENTO;*/ OPEN po_cursor FOR -- solicitudes aprobadas SELECT sr.id_solicitud_recibida AS id_solicitud_recibida, c.solicitud AS solicitud, --c.descripcion as descripcion_solicitud, 'Aprobada' AS resultado, to_char(sr.fecha_registro, 'DD/MM/YYYY HH24:MI:SS') AS fecha_solicitud, b.descripcion AS descripcion_estado_solicitud, to_char(sr.fecha_estado, 'DD/MM/YYYY HH24:MI:SS') AS fecha_estado_solicitud, sr.novedad AS codigo_novedad, creditopy.fc_cripto2pan(sr.tarjeta) AS numero_tarjeta FROM creditopy.solicitudes_recibidas sr, creditopy.solicitudes c, creditopy.solicitudes_estados b WHERE lpad(sr.documento, 12, '0') = vr_solicitud_recibida.documento AND sr.codigo_respuesta = 0 AND sr.id_solicitud = c.id_solicitud AND sr.id_solicitud = b.id_solicitud AND sr.id_estado = b.id_estado UNION ALL -- solicitudes rechazadas SELECT sr.id_solicitud_recibida AS id_solicitud_recibida, c.solicitud AS solicitud, --c.descripcion as descripcion_solicitud, '(' || x.regla_id || ') ' || x.motivo_rechazo AS resultado, to_char(sr.fecha_registro, 'DD/MM/YYYY HH24:MI:SS') AS fecha_solicitud, b.descripcion AS descripcion_estado_solicitud, to_char(sr.fecha_estado, 'DD/MM/YYYY HH24:MI:SS') AS fecha_estado_solicitud, sr.novedad AS codigo_novedad, creditopy.fc_cripto2pan(sr.tarjeta) AS numero_tarjeta FROM creditopy.solicitudes_recibidas sr, creditopy.solicitudes c, creditopy.solicitudes_estados b, creditopy.solicitudes_motivos_rechazos x WHERE lpad(sr.documento, 12, '0') = vr_solicitud_recibida.documento AND sr.codigo_respuesta > 0 AND sr.id_solicitud = c.id_solicitud AND sr.id_solicitud = b.id_solicitud AND sr.id_estado = b.id_estado AND sr.id_solicitud_recibida = x.id_solicitud_recibida ORDER BY id_solicitud_recibida DESC, resultado; po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END sp_solicitudesUsuario; PROCEDURE sp_pedidoImpresionTarjetaDimo(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de la Tarjeta que debe ser Impresa PI_PAIS IN NUMBER, -- Codigo de pais. Se obtuvo de la lista de ciudades. PI_DEPARTAMENTO IN NUMBER, -- Codigo de departamento. Se obtuvo de la lista de ciudades. PI_CIUDAD IN NUMBER, -- Codigo de la ciudad de entrega. Se obtuvo de la lista de ciudades. PI_DIRECCION IN VARCHAR2, -- Direccion de envio de la tarjeta PI_NOMBRE_APELLIDO_CONTACTO IN VARCHAR2, -- Nombre del contacto PI_TELEFONO_CONTACTO IN VARCHAR2, -- Telefono del contacto PI_MAIL_CONTACTO IN VARCHAR2, -- Direccion de correo del contacto PI_ID_TIPO_TARJETA IN NUMBER, -- Numero de Id del tipo de tarjeta PI_NOMBRE_PLASTICO IN VARCHAR2, -- El nombre que se utiliza para imprimir el plastico PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 9.1- Pedido de plastico tarjeta DIMO (El usuario quiere el plastico) y especifica lugar entrega Adaptado del PKG_SICOOP_DIMO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 10/06/2020. */ /* Autor: Edgar Rojas. Fecha:18/03/2020 Proposito: El usuario no imprimió su tarjeta y requiere la tarjeta física. Pedido de plastico (El usuario quiere el plastico) y especifica lugar entrega. Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 9-Pedido de plastico */ VN_IS_PREPAGA NUMBER := 0; VC_TARJETA VARCHAR2(19); VC_NOMBRE_PARA_PLASTICO creditopy.TARJETAS.nombre_para_plastico%TYPE; VN_ORI_ESTADO_PLASTICO creditopy.TARJETAS_PREPAGA.estado_plastico%TYPE; VN_ESTADO_PLASTICO creditopy.TARJETAS_PREPAGA.estado_plastico%TYPE; VD_FECHA_VIG_PLASTICO DATE; VN_ID_TIPO_TARJETA creditopy.TARJETAS_PREPAGA.id_tipo_tarjeta_prepaga%TYPE; VR_IMP_TARJETA creditopy.IMP_TARJETAS%ROWTYPE; VD_FECHA_ULT_ACTUALIZACION DATE := SYSDATE; /*-- variables para el cargo VN_CARGO_ID CREDITOPY.CARGOS_GESTION_PREPAGA.CARGO_ID%TYPE; VC_CARGO_DESC_CORTA CREDITOPY.CODIGOS_CARGOS_GESTION_TP.DESC_CORTA%TYPE; VN_CARGO_IMPORTE CREDITOPY.CARGOS_GESTION_PREPAGA.IMPORTE%TYPE:=0; VN_CARGO_CANTIDAD_CUOTAS CREDITOPY.CARGOS_GESTION_PREPAGA.CANTIDAD_CUOTAS%TYPE; VN_CARGO_RUBRO CREDITOPY.CARGOS_GESTION_PREPAGA.RUBRO%TYPE; */ -- variables para la solicitud VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VN_IMPRIME_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 2; VN_IMPRIME_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 3; BEGIN --#1ro Registrar los datos del historico --#2do Registrar la solicitud de seguimiento correspondiente -- si ok: -- #3ro Registrar la impresion de tarjeta y el historico -- #4to Registrar el costo de impresion del plastico -- sino -- marcar en el historico la novedad como rechazada -- registrar el rechazo en la solicitud de seguimiento -- se valida que sea una tarjeta prepaga antes de continuar BEGIN SELECT creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) INTO vn_is_prepaga FROM creditopy.tarjetas t WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_NUMERO_TARJETA); EXCEPTION -- no puede darse por valido si es no_data_found porque debio pasar por -- las validaciones previas WHEN no_data_found THEN raise_application_error(-20001, 'Tarjeta invalida.'); WHEN OTHERS THEN RAISE; END; -- FALTA VALIDAR LOS DATOS DE ENTRADA!!! --Datos de la tarjeta -- obtener tarjeta encriptada VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; VR_TARJETAS_PREPAGA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); sp_get_tarjeta_prepaga(VC_TARJETA, VR_TARJETAS_PREPAGA); -- obtener datos de la cuenta sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Obtener la numero de novedad. VR_NOVEDAD_CUENTA.NOVNRO := FN_GET_NRO_NOVEDAD; VR_NOVEDAD_CUENTA.NOVFCHING := VD_FECHA_ULT_ACTUALIZACION; -- datos de IMP_TARJETAS VR_IMP_TARJETA.FECHA_ALTA := TRUNC(VD_FECHA_ULT_ACTUALIZACION); VR_IMP_TARJETA.TARJETA := VC_TARJETA; VR_IMP_TARJETA.TIPO_CODIGO := 1; VR_IMP_TARJETA.COD_ORIGEN := CC_ORIGEN_IMP_PLASTICO_TP; VR_IMP_TARJETA.TIPO_NOVEDAD := CC_NOVTIP_IMP_PLASTICO_TP; VR_IMP_TARJETA.FORMULARIO := VR_NOVEDAD_CUENTA.NOVNRO; VR_IMP_TARJETA.FECHA_FORMULARIO := VD_FECHA_ULT_ACTUALIZACION; VR_IMP_TARJETA.USUARIO_ALTA := CC_USUARIO_DIMO; -- Datos nuevos del plastico --VC_NOMBRE_PARA_PLASTICO := PI_NOMBRE_PLASTICO; --VC_NOMBRE_PARA_PLASTICO := VR_TARJETA.NOMBRE_PARA_PLASTICO;-- SE FUERZA TOMAR EL DATO NORMALIZADO DE TARJETAS HG/AR 01/07/2020 10:20 --Filtro de Nombre Plastio ingresado por el Usuario. --ER 202006301425. VC_NOMBRE_PARA_PLASTICO := FC_FILTRAR_NOMPLA(PI_NOMBRE_PLASTICO); --VC_NOMBRE_PARA_PLASTICO := FC_FILTRAR_NOMPLA(VC_NOMBRE_PARA_PLASTICO); VN_ID_TIPO_TARJETA := PI_ID_TIPO_TARJETA; VD_FECHA_VIG_PLASTICO := creditopy.PKG_DIMO_CEIBO.fn_get_vigencia_tp_fisica(VR_TARJETA.EMISOR, VN_ID_TIPO_TARJETA, VR_IMP_TARJETA.FECHA_ALTA); VN_ORI_ESTADO_PLASTICO := VR_TARJETAS_PREPAGA.ESTADO_PLASTICO; VN_ESTADO_PLASTICO := CC_ESTADO_TP_EN_PROCESO; -- datos de TARJETAS_PREPAGA VR_TARJETAS_PREPAGA.FECHA_SOLIC_PLASTICO := VR_IMP_TARJETA.FECHA_ALTA; VR_TARJETAS_PREPAGA.FORMULARIO_SOLIC_PLASTICO := VR_IMP_TARJETA.FORMULARIO; VR_TARJETAS_PREPAGA.FECHA_ESTADO := VR_TARJETAS_PREPAGA.FECHA_SOLIC_PLASTICO; VR_TARJETAS_PREPAGA.FECHA_ULT_ACTUALIZACION := VD_FECHA_ULT_ACTUALIZACION; VR_TARJETAS_PREPAGA.ID_TIPO_TARJETA_PREPAGA := VN_ID_TIPO_TARJETA; VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO := VD_FECHA_VIG_PLASTICO; VR_TARJETAS_PREPAGA.ESTADO_PLASTICO := VN_ESTADO_PLASTICO; VR_TARJETAS_PREPAGA.CONTADOR_DE_IMPRESION := VR_TARJETAS_PREPAGA.CONTADOR_DE_IMPRESION + 1; -- datos de TARJETAS VR_TARJETA.NOMBRE_PARA_PLASTICO := VC_NOMBRE_PARA_PLASTICO; -- 08/07/2020. AR. Se debe ajustar la vigencia de la tarjeta virtual IF VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO > VR_TARJETA.FECHA_VIGENCIA THEN VR_TARJETA.FECHA_VIGENCIA := VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO; END IF; --Registramos los datos para la solicitud de impresion del plastico VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_PLASTICO_DIMO; VR_SOLICITUD.ID_ESTADO := VN_IMPRIME_OK; VR_SOLICITUD.NOVEDAD := VR_IMP_TARJETA.FORMULARIO; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); VR_DATOS.PAIS := PI_PAIS; VR_DATOS.DEPARTAMENTO := PI_DEPARTAMENTO; VR_DATOS.CIUDAD := PI_CIUDAD; VR_DATOS.DIRECCION := PI_DIRECCION; VR_DATOS.NOMBRE_APELLIDO_CONTACTO := PI_NOMBRE_APELLIDO_CONTACTO; VR_DATOS.TELEFONO_CONTACTO := PI_TELEFONO_CONTACTO; VR_DATOS.EMAIL_CONTACTO := PI_MAIL_CONTACTO; VR_DATOS.ID_TIPO_TARJETA_PREPAGA := PI_ID_TIPO_TARJETA; --VR_DATOS.NOMBRE_PARA_PLASTICO := PI_NOMBRE_PLASTICO; VR_DATOS.NOMBRE_PARA_PLASTICO := VC_NOMBRE_PARA_PLASTICO; -- Utilizo este dato para validar vigencia y el estado de la tarjeta fisica VR_DATOS.CICLO_ACTUAL := VN_ORI_ESTADO_PLASTICO; VR_DATOS.FECHA_FINAL := VD_FECHA_VIG_PLASTICO; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO = VN_IMPRIME_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN --Actualizamos los datos en TARJETAS y TARJETAS_PREPAGA UPDATE TARJETAS T SET T.NOMBRE_PARA_PLASTICO = VR_TARJETA.NOMBRE_PARA_PLASTICO, T.FECHA_VIGENCIA = VR_TARJETA.FECHA_VIGENCIA, -- 08/07/2020. AR. Se debe ajustar la vigencia de la tarjeta virtual T.ULT_ACTUALIZACION = VD_FECHA_ULT_ACTUALIZACION, T.OPERADOR = VR_IMP_TARJETA.USUARIO_ALTA WHERE T.TARJETA = VR_TARJETA.TARJETA; UPDATE TARJETAS_PREPAGA TP SET TP.ID_TIPO_TARJETA_PREPAGA = VR_TARJETAS_PREPAGA.ID_TIPO_TARJETA_PREPAGA, TP.FECHA_SOLIC_PLASTICO = VR_TARJETAS_PREPAGA.FECHA_SOLIC_PLASTICO, TP.FORMULARIO_SOLIC_PLASTICO = VR_TARJETAS_PREPAGA.FORMULARIO_SOLIC_PLASTICO, TP.ESTADO_PLASTICO = VR_TARJETAS_PREPAGA.ESTADO_PLASTICO, TP.FECHA_ESTADO = VR_TARJETAS_PREPAGA.FECHA_ESTADO, TP.FECHA_VIG_PLASTICO = VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO, TP.CONTADOR_DE_IMPRESION = VR_TARJETAS_PREPAGA.CONTADOR_DE_IMPRESION, TP.FECHA_ULT_ACTUALIZACION = VD_FECHA_ULT_ACTUALIZACION WHERE TP.TARJETA = VR_TARJETAS_PREPAGA.TARJETA; --Registrar en ImpTarjetas para su impresion. INSERT INTO IMP_TARJETAS VALUES VR_IMP_TARJETA; --Actualizamos los datos de direccion de envio TIPO_DE_DIRECCION = 1 UPDATE CREDITOPY.DIRECCIONES D SET D.CALLE = VR_DATOS.DIRECCION, D.PAIS = VR_DATOS.PAIS, D.DEPARTAMENTO = VR_DATOS.DEPARTAMENTO, D.CIUDAD = VR_DATOS.CIUDAD, D.BARRIO = ' ', D.TELEFONO = VR_DATOS.TELEFONO_CONTACTO WHERE D.NUMERO_CUENTA = VR_TARJETA.NUMERO_CUENTA AND D.TIPO_DE_DIRECCION = 1; --Registramos el cargo por la impresion -- Si el usuario tiene el disponible se registra para la actualizacion del saldo -- y el correspondiente movimiento de ajuste -- sino se deja en un modulo de cargos pendientes de aplicar por falta de disponible END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_IMPRIME_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_pedidoImpresionTarjetaDimo; PROCEDURE sp_tiposTarjetaPrepaga(PI_EMISOR IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 9.1a-Obtener tipos de tarjeta fisica */ /**************************************************************************************************** Autor: Hugo Gonzalez. Fecha: 10/06/2019 Propósito: Procedimiento que devuelve un cursor con los datos de los tipod de plastico de las tarjetas prepagas. ******************************************************************************************************/ BEGIN OPEN po_cursor FOR SELECT emisor, tipo_tarjeta, id_tipo_tarjeta_prepaga id_tipo_tarjeta FROM creditopy.TIPOS_TARJETA_PREPAGA WHERE emisor = pi_emisor AND desplegar = 1; po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END sp_tiposTarjetaPrepaga; PROCEDURE sp_ciudades(PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cur_departamentos OUT SYS_REFCURSOR, po_cur_ciudades OUT SYS_REFCURSOR) AS /* 9.3 - Obtener ciudades */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 25/05/2020 Propósito: Función que retorna la lista de ciudades requerimientos de cuenta/tarjeta prepaga. No es valida para TC porque no tiene normalizados los datos de pais/departamento al alta. ******************************************************************************************************/ BEGIN OPEN po_cur_departamentos FOR SELECT d.departamento AS id, d.descripcion AS descripcion FROM debcredpy.departamentos d WHERE d.pais = 1 ORDER BY d.pais, d.departamento; OPEN po_cur_ciudades FOR SELECT c.ciudad AS id, c.descripcion AS descripcion, c.departamento AS id_Departamento FROM debcredpy.ciudades c WHERE c.pais = 1 AND c.codigo_postal = 2 -- 2 = Igual a Nuevo set de Ciudades actualizadas ORDER BY c.pais, c.departamento, c.ciudad; /* Open po_cursor for select ci.pais AS pais, ci.departamento AS departamento, ci.ciudad AS ciudad, ci.descripcion AS ciudad_descripcion, d.descripcion AS departamento_descripcion from debcredpy.ciudades ci left join debcredpy.departamentos d on d.pais = ci.pais and d.departamento = ci.departamento where ci.codigo_postal = 2 order by ci.descripcion, d.descripcion; */ PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_Ciudades; PROCEDURE sp_paises( PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 21.2 - Obtener países */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 24/08/2020 Propósito: Función que retorna la lista de paises parametrizados. ******************************************************************************************************/ BEGIN OPEN po_cursor FOR SELECT p.pais AS pais, p.descripcion AS pais_descripcion FROM debcredpy.paises p ORDER BY p.descripcion; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END; PROCEDURE sp_activarPlasticoDimo(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de la Tarjeta fisica que se desea activar PI_CVV IN VARCHAR2, -- CVV de la tarjeta para verificacion PI_PIN_TARJETA IN VARCHAR2, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 9.4 - Activar tarjeta fisica DIMO Adaptado del PKG_SICOOP_CEIBO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 22/06/2020 */ /* Autor : Edgar Rojas. Fecha : 19/06/2020 12:50 Proposito : Activar el plastico DIMO impreso recibido por el Usuario. Referencia: No existe aun */ VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_ACTIVAR_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 56; VN_ACTIVAR_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 57; BEGIN --Datos DIMO PV_USUARIO := get_usuario; --Datos de la Tarjeta -- obtener tarjeta encriptada VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; VR_TARJETAS_PREPAGA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); sp_get_tarjeta_prepaga(VC_TARJETA, VR_TARJETAS_PREPAGA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Registramos los datos para la activacion del plastico VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_ACTIVAR_P_DIMO; VR_SOLICITUD.ID_ESTADO := VN_ACTIVAR_OK; VR_SOLICITUD.NOVEDAD := 0; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := PV_USUARIO; --CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); --Utilizamos estos campos para controlar el CVV mediante las reglas de la Novedad. CREDITOPY.PCUTILES.GET_PAN_CRIPTOKEY; CREDITOPY.PCUTILES.PR_INIT_BIN_EMISORES; VR_DATOS.PAIS := PI_CVV; VR_DATOS.DEPARTAMENTO := CS.GET_CVC(CEIBO_UTILES.FN_GET_EMISOR_PROCESADOR(VR_TARJETA.EMISOR), VR_TARJETAS_PREPAGA.TARJETA, VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO, 2); PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); --Calcular el CVV y registrarlo en los datos para su control. IF VR_SOLICITUD.ID_ESTADO = VN_ACTIVAR_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN VR_TARJETA.PIN := RPAD(PI_PIN_TARJETA, 16, 0); VR_TARJETA.PIN := PCUTILES.DESF('E', 'ADCF8073FAD1CF55', VR_TARJETA.PIN); UPDATE TARJETAS T SET T.PIN = VR_TARJETA.PIN, T.OPERADOR = substr(PV_USUARIO, 8), T.ULT_ACTUALIZACION = SYSDATE WHERE T.TARJETA = VR_TARJETA.TARJETA; UPDATE TARJETAS_PREPAGA TP SET TP.ESTADO_PLASTICO = CC_ESTADO_TP_OPERATIVA, TP.FECHA_VIG_PIN = VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO, TP.FECHA_ULT_ACTUALIZACION = SYSDATE WHERE TP.TARJETA = VR_TARJETA.TARJETA; END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_ACTIVAR_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_activarPlasticoDimo; PROCEDURE sp_modificarPinDimo(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de la Tarjeta PI_PIN_TARJETA IN VARCHAR2, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 10.2 - Modificación del PIN de tarjeta física DIMO Adaptado del PKG_SICOOP_CEIBO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 22/06/2020 */ /* Autor : Edgar Rojas. Fecha : 18/06/2020 09:50 Proposito : Operaciones TP - Actualización de PIN personalizado. Referencia: API_TARJETAHABIENTE. google Drive Hoja 10.2 - Modificación del PIN de tarjeta física DIMO */ VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VR_TARJETA TARJETAS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_MOD_PIN_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 54; VN_MOD_PIN_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 55; BEGIN --Datos DIMO PV_USUARIO := get_usuario; --Datos de la Tarjeta -- obtener tarjeta encriptada VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; VR_TARJETAS_PREPAGA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); sp_get_tarjeta_prepaga(VC_TARJETA, VR_TARJETAS_PREPAGA); --Registramos los datos para la activacion del plastico VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_ACTUALIZAR_PIN; VR_SOLICITUD.ID_ESTADO := VN_MOD_PIN_OK; VR_SOLICITUD.NOVEDAD := 0; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := PV_USUARIO; --CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); IF PI_PIN_TARJETA IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'El Pin no ha sido ingresado.'); END IF; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO = VN_MOD_PIN_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN VR_TARJETA.PIN := RPAD(PI_PIN_TARJETA, 16, 0); VR_TARJETA.PIN := PCUTILES.DESF('E', 'ADCF8073FAD1CF55', VR_TARJETA.PIN); UPDATE TARJETAS T SET T.PIN = VR_TARJETA.PIN, T.OPERADOR = SUBSTR(PV_USUARIO, 1, 8), T.ULT_ACTUALIZACION = SYSDATE WHERE T.TARJETA = VR_TARJETA.TARJETA; UPDATE TARJETAS_PREPAGA TP SET TP.FECHA_VIG_PIN = VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO, TP.FECHA_ULT_ACTUALIZACION = SYSDATE WHERE TP.TARJETA = VR_TARJETAS_PREPAGA.TARJETA; END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_MOD_PIN_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_modificarPinDimo; PROCEDURE sp_modificarPinTC(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de la Tarjeta PI_PIN_TARJETA IN VARCHAR2, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 10.2 - Modificación del PIN de tarjeta de credito Adaptado del sp_modificacionPinDIMO. A.Rodriguez. 16/11/2020 */ VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VR_TARJETA TARJETAS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_MOD_PIN_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 73; VN_MOD_PIN_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 74; BEGIN --Datos DIMO PV_USUARIO := get_usuario; --Datos de la Tarjeta -- obtener tarjeta encriptada VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); --Registramos los datos para la activacion del plastico VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_ACTUALIZAR_PIN_TC; VR_SOLICITUD.ID_ESTADO := VN_MOD_PIN_OK; VR_SOLICITUD.NOVEDAD := 0; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := PV_USUARIO; --CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); IF PI_PIN_TARJETA IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'El Pin no ha sido ingresado.'); END IF; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO = VN_MOD_PIN_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN VR_TARJETA.PIN := RPAD(PI_PIN_TARJETA, 16, 0); VR_TARJETA.PIN := PCUTILES.DESF('E', 'ADCF8073FAD1CF55', VR_TARJETA.PIN); UPDATE TARJETAS T SET T.PIN = VR_TARJETA.PIN, T.OPERADOR = SUBSTR(PV_USUARIO, 1, 8), T.ULT_ACTUALIZACION = SYSDATE WHERE T.TARJETA = VR_TARJETA.TARJETA; END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_MOD_PIN_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_modificarPinTC; PROCEDURE sp_modificacionPinDimo(PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de la Tarjeta PI_PIN_TARJETA IN VARCHAR2, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 10.2 - Modificación del PIN de tarjeta Se adapta de forma que se utilice el mismo end-point y se deriva al procedimiento correspondiente a DIMO o a TC. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 16/11/2020 */ VC_TARJETA VARCHAR2(19); VN_EMISOR NUMBER; BEGIN -- obtener datos DIMO PV_USUARIO := get_usuario; -- validar parametros de entrada no nulos IF PI_NUMERO_TARJETA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); ELSE IF PI_PIN_TARJETA IS NULL THEN RAISE_APPLICATION_ERROR(-20001, 'El Pin no ha sido ingresado.'); END IF; END IF; VC_TARJETA := creditopy.FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- verificar si el emisor de la tarjeta es un emisor PREPAGO o no BEGIN SELECT t.emisor INTO VN_EMISOR FROM creditopy.tarjetas t WHERE t.tarjeta = VC_TARJETA; EXCEPTION WHEN OTHERS THEN RAISE; END; -- cambio de PIN DIMO / TC CASE WHEN creditopy.pkg_dimo_ceibo.fn_is_prepaga(VN_EMISOR) = 1 THEN sp_modificarPinDIMO(PI_NUMERO_TARJETA, -- Numero de la Tarjeta PI_PIN_TARJETA, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE, PO_SQLERRM, po_cursor); WHEN creditopy.pkg_dimo_ceibo.fn_is_prepaga(VN_EMISOR) = 0 THEN sp_modificarPinTC(PI_NUMERO_TARJETA, -- Numero de la Tarjeta PI_PIN_TARJETA, -- PIN indicado por el usuario para la tarjeta, encriptado PO_SQLCODE, PO_SQLERRM, po_cursor); ELSE RAISE_APPLICATION_ERROR(-20001, 'USERS_ERROR: operacion not valid.'); END CASE; IF PO_SQLCODE != 0 THEN PO_SQLCODE := -1; END IF; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END sp_modificacionPinDimo; PROCEDURE sp_tarjetasdimo(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_SOLO_DIMO IN NUMBER, -- Bandera que indica si se deberia devolve: 1-solo las dimo y 2-otras prepagas PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 11.1 - Consulta lista TPs DIMOs por usuario */ /**************************************************************************************************** Autor: Amalia Rodriguez. Adaptacion del original de obtención de lista TC de PKG_MICABAL. Fecha: 13/05/2019 Propósito: Procedimiento que devuelve un cursor con los datos de las tarjetas prepagas en base una serie de condiciones. Se tiene como dato de entrada el numero de documento del tarjetahabiente. PARAMETROS DE ENTRADA: pi_documento: un numero de documento rellenado con 0 a la izquierda con 12 de longitud total ******************************************************************************************************/ BEGIN IF pi_documento IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: document is null.'); END IF; IF pi_solo_dimo IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: flag dimo is null.'); END IF; OPEN po_cursor FOR SELECT -- Numero del documento de identidad substr(t.documento, 4, 12) AS documento, -- esta funcion dice cual es el procesador (cabal o panal) del emisor: retorna el id del procesador creditopy.ceibo_utiles.fn_get_emisor_procesador(t.emisor) AS procesador, -- descripcion del procesador creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(creditopy.ceibo_utiles.fn_get_emisor_procesador(t.emisor)) AS desc_procesador, -- id del emisor t.emisor AS emisor, -- descripcion del emisor creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(t.emisor) AS desc_emisor, -- número de cuenta t.numero_cuenta AS numero_cuenta, creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, -- mascara del número de la tarjeta desencriptada creditopy.pkg_dimo_ceibo.fn_get_tarjeta_mask(t.tarjeta) AS tar_mask, -- tipo medio: VIRTUAL / FISICA decode(creditopy.pkg_dimo_ceibo.fn_is_prepaga_fisica(t.tarjeta), 1, 'FISICA', 'VIRTUAL') AS tipo_medio, -- nombre que aparece en el plastico de la tarjeta t.nombre_para_plastico AS nombre_usuario, -- descripcion si la tarjeta es del titular o es una adicional t.componente AS componente, -- siempre devuelve solo titulares 'TITULAR' AS tipo_tarjeta, -- fc_tjtp identifica cual es la ultima emitida para la cuenta correspondiendo esa tarjeta a la PRINCIPAL CASE WHEN t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta) THEN 'PRINCIPAL' ELSE 'NO PRINCIPAL' END AS tj_principal, -- la fecha de entrega de la tarjeta << de emision, generacion to_char(t.fecha_otorgada, 'DD/MM/YYYY') AS fecha_otorgada, -- adicional (para identificar la tarjeta en consulta se usa numero_cuenta + adicional) t.adicional AS adicional, -- la fecha de vencimiento de la tarjeta virtual to_char(t.fecha_vigencia, 'DD/MM/YYYY') AS fecha_vigencia, -- vencimiento de la tarjeta formato MMYY to_char(t.fecha_vigencia, 'MMYY') AS vencimiento_tar, -- id del estado de la tarjeta creditopy.estado_ct(t.tarjeta, 'T') AS estado, -- descripcion del estado de la tarjeta creditopy.pkg_dimo_ceibo.fn_get_estado_desc(creditopy.estado_ct(t.tarjeta, 'T')) AS desc_estado, -- ultimo periodo cerrado sc.periodo_cierre AS ultimo_periodo_cerrado, -- monto del disponible normal (o contado), el unico que utiliza la prepaga -- este disponible se muestra a nivel de cuentas, creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 1) AS disponible_normal, --periodo actual to_char(add_months(to_date(ve.periodo_cierre, 'yyyymm'), 1), 'yyyymm') AS periodo_actual_tarjeta, -- indicador de que la tarjeta es una renovacion decode(creditopy.pkg_dimo_ceibo.fn_get_origen_tarjeta(t.tarjeta), 90, 1, 0) AS flg_renovacion, -- indicador de tarjeta DIMO creditopy.pkg_dimo_ceibo.fn_is_dimo(t.emisor) AS es_dimo, ct.cierre AS cierre, t.tarjeta AS tarjeta, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 1) AS id_tipo_tarjeta_prepaga, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 2) AS tipo_tarjeta_prepaga, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 3) AS estado_tarjeta_fisica, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 4) AS desc_estado_tarjeta_fisica -- ticket 0002049-Afinidad DIMO. AR. 27/05/2022 12:15:57 p.m. , t.grupo_afinidad AS id_grupo_afinidad, creditopy.pkg_dimo_ceibo.fn_get_afinidad_desc(t.emisor, t.grupo_afinidad) AS desc_afinidad FROM creditopy.tarjetas t, creditopy.cuentas ct, creditopy.variables_entorno ve, creditopy.saldos_cuentas sc, debcredpy.emisores e, creditopy.calendario_cierres cc, debcredpy.emisores_productos ep WHERE substr(t.documento, 4, 12) = lpad(PI_DOCUMENTO, 12, '0') -- se muestran solo los emisores prepago AND ((PI_SOLO_DIMO = 1 AND creditopy.pkg_dimo_ceibo.fn_is_dimo(t.emisor) = 1) OR (PI_SOLO_DIMO = 0 AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) = 1)) -- muestra las operativas, bloqueadas -- las DIMO no entran en atraso AND ((creditopy.estado_ct(t.tarjeta, 'T') IN (0, 1, 4, 5) --t.clase_de_estado IN (1,4,5) --,11) -- AR. 15/10/2020 AND t.fecha_vigencia > trunc(SYSDATE)) OR -- se incluyen las no operativas pero con saldo al ultimo cierre porque tienen saldo -- solo se toma la ultima (t.clase_de_estado != 1 --NOT IN (1,11) -- AR. 15/10/2020 AND ct.saldo_cierre_ml != 0 AND t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta)) OR -- se incluyen las no operativas incluso sin saldo porque puede solicitar desbloquear y reponer -- solo se toma la ultima (creditopy.estado_ct(t.tarjeta, 'T') IN (4, 5) AND ct.saldo_cierre_ml = 0 AND t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta))) -- solo desplegar las tarjetas donde el usuario es el titular AND t.componente = 1 AND ct.numero_cuenta = t.numero_cuenta -- la cuenta de las tarjetas tiene que estar operativa, no anulada AND creditopy.estado_ct(ct.numero_cuenta, 'C') = 1 -- AR. 15/10/2020 AND ve.emisor = ct.emisor AND ve.producto = ct.producto AND ve.cierre = ct.cierre AND ve.grupo_afinidad = ct.grupo_afinidad AND sc.emisor = ct.emisor AND sc.sucursal_emisor = ct.sucursal_emisor AND sc.producto = ct.producto AND sc.numero_cuenta = ct.numero_cuenta AND sc.periodo_cierre = ve.periodo_cierre -- no incluir las tarjetas de emisores CABAL AND t.emisor NOT IN (99, 108, 120) -- solo los emisores que estamos procesando a la fecha AND e.emisor = t.emisor AND e.base_pago_minimo = 'A' AND cc.emisor = ct.emisor AND cc.producto = ct.producto AND cc.cierre = ct.cierre AND cc.periodo = to_char(add_months(to_date(sc.periodo_cierre, 'yyyymm'), 1), 'YYYYMM') AND cc.grupo_afinidad(+) = ct.grupo_afinidad AND ep.emisor = ct.emisor AND ep.producto = ct.producto AND ep.grupo_afinidad = ct.grupo_afinidad AND ep.cartera = ct.cartera ORDER BY procesador, to_date(fecha_vigencia, 'DD/MM/YYYY') DESC, numero_cuenta; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_tarjetasdimo; PROCEDURE sp_tarjetasDimoPorAfinidad(PI_AFINIDAD_DIMO IN NUMBER, -- grupo de afinidad que se desea listar PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /**************************************************************************************************** Autor: Amalia Rodriguez. Adaptacion del original de obtención de lista de tarjetas Dimo por documento. ticket 0002049-Afinidad DIMO. AR. 27/05/2022 16:32:00 p.m. Fecha: 27/05/2022 16:32:00 p.m. Propósito: Procedimiento que devuelve un cursor con los datos de las tarjetas prepagas DIMOs por grupo de afinidad si no tienen plastico solicitado. Se tiene como dato de entrada el grupo de afinidad a revisar PARAMETROS DE ENTRADA: pi_afinidad_dimo: codigo de grupo afinidad de Dimo ******************************************************************************************************/ v_afinidad_ok NUMBER; vb_todos NUMBER; vn_tipo_direccion_email direcciones.tipo_de_direccion%TYPE := 6; vn_tipo_direccion_cel direcciones.tipo_de_direccion%TYPE := 7; BEGIN sp_setEmisorDimo; v_afinidad_ok := 0; IF pi_afinidad_dimo IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: Afinidad is null.'); ELSE BEGIN SELECT 1 INTO v_afinidad_ok FROM creditopy.grupos_afinidad ga WHERE ga.emisor = PV_EMISOR_DIMO AND ga.grupo_afinidad = PI_AFINIDAD_DIMO; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'USERS_ERROR: Afinidad no es de DIMO.'); WHEN OTHERS THEN RAISE; END; END IF; -- por si sea un parametro a futuro CASE PI_AFINIDAD_DIMO WHEN 115002 THEN vb_todos := 0; ELSE vb_todos := 1; END CASE; OPEN po_cursor FOR SELECT -- Numero del documento de identidad substr(t.documento, 4, 12) AS documento, -- PAN de la tarjeta creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, -- mascara del número de la tarjeta desencriptada creditopy.pkg_dimo_ceibo.fn_get_tarjeta_mask(t.tarjeta) AS tar_mask, -- tipo medio: VIRTUAL / FISICA decode(creditopy.pkg_dimo_ceibo.fn_is_prepaga_fisica(t.tarjeta), 1, 'FISICA', 'VIRTUAL') AS tipo_medio, -- nombre que aparece en el plastico de la tarjeta t.nombre_para_plastico AS nombre_usuario, -- la fecha de entrega de la tarjeta << de emision, generacion to_char(t.fecha_otorgada, 'DD/MM/YYYY') AS fecha_otorgada, -- la fecha de vencimiento de la tarjeta virtual to_char(t.fecha_vigencia, 'DD/MM/YYYY') AS fecha_vigencia, -- id del estado de la tarjeta creditopy.estado_ct(t.tarjeta, 'T') AS estado, -- descripcion del estado de la tarjeta creditopy.pkg_dimo_ceibo.fn_get_estado_desc(creditopy.estado_ct(t.tarjeta, 'T')) AS desc_estado, t.tarjeta AS tarjeta, tp.id_tipo_tarjeta_prepaga AS id_tipo_tarjeta_prepaga, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 2) AS tipo_tarjeta_prepaga, tp.estado_plastico AS estado_tarjeta_fisica, creditopy.pkg_dimo_ceibo.fn_datos_plastico_tp(t.tarjeta, 4) AS desc_estado_tarjeta_fisica, t.grupo_afinidad AS id_grupo_afinidad, ga.descripcion AS desc_afinidad, dc.calle AS celular, de.calle AS email FROM creditopy.tarjetas t, creditopy.grupos_afinidad ga, creditopy.tarjetas_prepaga tp, creditopy.direcciones dc, creditopy.direcciones de WHERE -- se muestran solo las dimo t.emisor = PV_EMISOR_DIMO -- muestra las operativas, bloqueadas -- las DIMO no entran en atraso AND t.grupo_afinidad = PI_AFINIDAD_DIMO AND creditopy.estado_ct(t.tarjeta, 'T') IN (0, 1) AND t.fecha_vigencia > trunc(SYSDATE) AND ga.emisor = t.emisor AND ga.grupo_afinidad = t.grupo_afinidad AND tp.tarjeta = t.tarjeta AND ((vb_todos = 0 AND tp.estado_plastico = 0) -- aun no se imprime, para la afinidad 115002 OR vb_todos = 1) AND dc.emisor = t.emisor AND dc.sucursal_emisor = t.sucursal_emisor AND dc.producto = t.producto AND dc.numero_cuenta = t.numero_cuenta AND dc.tipo_de_documento = t.tipo_de_documento AND dc.documento = t.documento AND dc.tipo_de_direccion = vn_tipo_direccion_cel AND de.emisor = t.emisor AND de.sucursal_emisor = t.sucursal_emisor AND de.producto = t.producto AND de.numero_cuenta = t.numero_cuenta AND de.tipo_de_documento = t.tipo_de_documento AND de.documento = t.documento AND de.tipo_de_direccion = vn_tipo_direccion_email ORDER BY numero_tarjeta; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_tarjetasDimoPorAfinidad; PROCEDURE sp_modificacionEmailDIMO(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_EMAIL IN VARCHAR2, -- Correo Electronico, en la app se debe aplicar control de formato PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_UPD_EMAIL_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 69; VN_UPD_EMAIL_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 70; VN_TIPO_DIRECCION_EMAIL DIRECCIONES.TIPO_DE_DIRECCION%TYPE := 6; BEGIN -- obtener emisor DIMO sp_setEmisorDimo; PV_USUARIO := get_usuario; --Datos de la Tarjeta/Cuenta operativa FOR R IN ( SELECT t.tarjeta FROM creditopy.TARJETAS t, creditopy.CUENTAS c WHERE substr(t.documento, 4, 12) = lpad(PI_DOCUMENTO, 12, '0') AND t.emisor = PV_EMISOR_DIMO AND c.numero_cuenta = t.numero_cuenta AND creditopy.estado_ct(c.numero_cuenta, 'C') = 1)LOOP -- obtener datos de la tarjeta VC_TARJETA := R.TARJETA; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); VR_CUENTA := NULL; sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Datos de la Solicitud VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_UPD_EMAIL_DIMO; VR_SOLICITUD.ID_ESTADO := VN_UPD_EMAIL_OK; VR_SOLICITUD.TARJETA := fc_cripto2pan(VC_TARJETA); VR_SOLICITUD.USUARIO := PV_USUARIO; --CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := PI_DOCUMENTO; VR_DATOS.EMAIL := PI_EMAIL; --Datos de la Novedad VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; VR_NOVEDAD_TARJETA.NOVFCHING := SYSDATE; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO = VN_UPD_EMAIL_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN -- actualizar el EMAIL del usuario UPDATE DIRECCIONES D SET D.CALLE = PI_EMAIL, D.OPERADOR = SUBSTR(PV_USUARIO, 1, 8), D.TIPO_NOV = 'M' WHERE D.EMISOR = VR_CUENTA.EMISOR AND D.SUCURSAL_EMISOR = VR_CUENTA.SUCURSAL_EMISOR AND D.PRODUCTO = VR_CUENTA.PRODUCTO AND D.NUMERO_CUENTA = VR_CUENTA.NUMERO_CUENTA AND D.TIPO_DE_DOCUMENTO = VR_CUENTA.TIPO_DE_DOCUMENTO AND D.DOCUMENTO = VR_CUENTA.DOCUMENTO AND D.TIPO_DE_DIRECCION = VN_TIPO_DIRECCION_EMAIL; END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; END LOOP; IF VC_TARJETA IS NULL THEN raise_application_error(-20001, 'El documento no tiene tarjeta con cuenta operativa.'); END IF; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_UPD_EMAIL_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_modificacionEmailDIMO; PROCEDURE sp_modificacionCelularDIMO(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_CELULAR IN VARCHAR2, -- Numero de Celular Formato 0NNNNNNNNN PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VR_DIRECCION DIRECCIONES%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_UPD_CELULAR_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 71; VN_UPD_CELULAR_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 72; VN_TIPO_DIRECCION_CEL DIRECCIONES.TIPO_DE_DIRECCION%TYPE := 7; BEGIN -- obtener emisor DIMO sp_setEmisorDimo; PV_USUARIO := get_usuario; --Datos de la Tarjeta/Cuenta operativa FOR R IN ( SELECT t.tarjeta FROM creditopy.TARJETAS t, creditopy.CUENTAS c WHERE substr(t.documento, 4, 12) = lpad(PI_DOCUMENTO, 12, '0') AND t.emisor = PV_EMISOR_DIMO AND c.numero_cuenta = t.numero_cuenta AND creditopy.estado_ct(c.numero_cuenta, 'C') = 1)LOOP VC_TARJETA := R.TARJETA; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); VR_CUENTA := NULL; sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Datos de la Solicitud VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_UPD_CELULAR_DIMO; VR_SOLICITUD.ID_ESTADO := VN_UPD_CELULAR_OK; VR_SOLICITUD.TARJETA := fc_cripto2pan(VC_TARJETA); VR_SOLICITUD.USUARIO := PV_USUARIO; --CC_USUARIO_DIMO; VR_SOLICITUD.DOCUMENTO := PI_DOCUMENTO; VR_DATOS.TELEFONO := PI_CELULAR; --Datos de la Novedad VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; VR_NOVEDAD_TARJETA.NOVFCHING := SYSDATE; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO = VN_UPD_CELULAR_OK AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN -- actualizar el celular del usuario UPDATE DIRECCIONES D SET D.CALLE = PI_CELULAR, D.TELEFONO = PI_CELULAR, D.OPERADOR = SUBSTR(PV_USUARIO, 1, 8), D.TIPO_NOV = 'M' WHERE D.EMISOR = VR_CUENTA.EMISOR AND D.SUCURSAL_EMISOR = VR_CUENTA.SUCURSAL_EMISOR AND D.PRODUCTO = VR_CUENTA.PRODUCTO AND D.NUMERO_CUENTA = VR_CUENTA.NUMERO_CUENTA AND D.TIPO_DE_DOCUMENTO = VR_CUENTA.TIPO_DE_DOCUMENTO AND D.DOCUMENTO = VR_CUENTA.DOCUMENTO AND D.TIPO_DE_DIRECCION = VN_TIPO_DIRECCION_CEL; END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; END LOOP; -- obtener datos de la tarjeta IF VC_TARJETA IS NULL THEN raise_application_error(-20001, 'El documento no tiene tarjeta con cuenta operativa.'); END IF; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := VN_UPD_CELULAR_RECHA; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END sp_modificacionCelularDIMO; PROCEDURE sp_datosTarjetaDimo_v1(PI_EMISOR IN NUMBER, -- Codigo de la entidad emisora de la tarjeta en consulta PI_SUFIJO_TARJETA IN VARCHAR2, -- Ultimos 10 digitos de la tarjeta PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 12 - Consulta Datos TP DIMO -- 2021/02/19 Descontinuado por tiempos de respuesta excedidos. La busqueda desencriptando -- la tarjeta no es recomendada. */ /**************************************************************************************************** Autor: Amalia Rodriguez. Fecha: 10/09/2019 Propósito: Dados el codigo de la entidad y los 10 ultimos numeros de una tarjeta, debe obtener los datos de la tarjeta: el numero de TC, numero de CI, y nombre del usuario Se obtienen los datos de tarjeta DIMO, vigente y operativa. PARAMETROS DE ENTRADA: pi_emisor : codigo del emisor pi_sufijo_tarjeta : ultimos 10 digitos de la tarjeta en consulta ******************************************************************************************************/ vc_tarjeta VARCHAR2(16); vn_is_prepaga NUMBER; vc_documento VARCHAR2(12); vc_nombre VARCHAR2(25); vc_estado VARCHAR2(15); BEGIN IF pi_emisor IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: entidad is null.'); ELSE IF pkg_dimo_ceibo.fn_is_prepaga(pi_emisor) != 1 THEN raise_application_error(-20001, 'USERS_ERROR: entidad no es prepaga.'); END IF; IF pkg_dimo_ceibo.fn_is_dimo(PI_EMISOR) != 1 THEN raise_application_error(-20001, 'USERS_ERROR: entidad no es DIMO.'); END IF; END IF; IF pi_sufijo_tarjeta IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); END IF; -- obtener una tarjeta vigente, operativa para el emisor indicado SELECT creditopy.fc_cripto2pan(t.tarjeta), creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor), substr(t.documento, 4, 12), t.nombre_para_plastico, CASE WHEN creditopy.estado_ct(t.tarjeta, 'T') = 1 THEN 'OPERATIVA' ELSE 'NO HABILITADA' END INTO vc_tarjeta, vn_is_prepaga, vc_documento, vc_nombre, vc_estado FROM creditopy.tarjetas t, debcredpy.emisores e WHERE e.emisor = PI_EMISOR -- no incluir las tarjetas de emisores CABAL AND e.emisor NOT IN (99, 108, 120) -- solo los emisores que estamos procesando a la fecha AND e.base_pago_minimo = 'A' AND t.emisor = e.emisor -- es prepaga DIMO AND creditopy.pkg_dimo_ceibo.fn_is_dimo(t.emisor) = 1 -- vigente AND t.fecha_vigencia >= trunc(SYSDATE) -- operativa AND creditopy.estado_ct(t.tarjeta, 'T') = 1 AND substr(creditopy.fc_cripto2pan(t.tarjeta), 7, 10) = PI_SUFIJO_TARJETA; OPEN po_cursor FOR SELECT vc_tarjeta AS TARJETA, vc_documento AS DOCUMENTO, vc_nombre AS NOMBRE_USUARIO --,vn_is_prepaga as ES_PREPAGA --,vc_estado as ESTADO FROM dual; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN NO_DATA_FOUND THEN OPEN po_cursor FOR SELECT ' ' AS TARJETA, 0 AS ES_PREPAGA, ' ' AS DOCUMENTO, ' ' AS NOMBRE_USUARIO, ' ' AS ESTADO FROM dual; PO_SQLCODE := -1; PO_SQLERRM := 'No existe tarjeta operativa para el dato.'; WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_datosTarjetaDimo_v1; PROCEDURE sp_datosTarjetaDimo(PI_EMISOR IN NUMBER, -- Codigo de la entidad emisora de la tarjeta en consulta PI_SUFIJO_TARJETA IN VARCHAR2, -- Ultimos 10 digitos de la tarjeta PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 12 - Consulta Datos TP DIMO */ /**************************************************************************************************** Autor: Amalia Rodriguez. Fecha: 10/09/2019 Propósito: Dados el codigo de la entidad y los 10 ultimos numeros de una tarjeta, debe obtener los datos de la tarjeta: el numero de TC, numero de CI, y nombre del usuario Se obtienen los datos de tarjeta DIMO, vigente y operativa. Se llega a la tarjeta tomando los bines del emisor y armando el string bin + pi_sufijo_tarjeta PARAMETROS DE ENTRADA: pi_emisor : codigo del emisor pi_sufijo_tarjeta : ultimos 10 digitos de la tarjeta en consulta ******************************************************************************************************/ vc_tarjeta VARCHAR2(16); vn_is_prepaga NUMBER; vc_documento VARCHAR2(12); vc_nombre VARCHAR2(25); vc_estado VARCHAR2(15); is_found NUMBER; BEGIN IF pi_emisor IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: entidad is null.'); ELSE IF pkg_dimo_ceibo.fn_is_prepaga(pi_emisor) != 1 THEN raise_application_error(-20001, 'USERS_ERROR: entidad no es prepaga.'); END IF; IF pkg_dimo_ceibo.fn_is_dimo(PI_EMISOR) != 1 THEN raise_application_error(-20001, 'USERS_ERROR: entidad no es DIMO.'); END IF; END IF; IF pi_sufijo_tarjeta IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); END IF; -- obtener una tarjeta vigente, operativa para el emisor indicado is_found := 0; FOR b IN (SELECT p.emisor, --p.bin_id, substr(fc_cripto2pan(bi.bin), 1, bi.longitud) d_bin, bi.longitud FROM debcredpy.emisores e, debcredpy.procesadores_prods p, creditopy.bin_emisores bi WHERE e.emisor = PI_EMISOR -- no incluir las tarjetas de emisores CABAL AND e.emisor NOT IN (99, 108, 120) -- solo los emisores que estamos procesando a la fecha AND e.base_pago_minimo = 'A' -- es prepaga DIMO AND creditopy.pkg_dimo_ceibo.fn_is_dimo(e.emisor) = 1 AND p.emisor = e.emisor AND bi.bin_id = p.bin_id) LOOP vc_tarjeta := b.d_bin || PI_SUFIJO_TARJETA; BEGIN SELECT creditopy.fc_cripto2pan(t.tarjeta), substr(t.documento, 4, 12), t.nombre_para_plastico, 1 /*, creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor), , case when creditopy.estado_ct(t.tarjeta,'T') = 1 then 'OPERATIVA' else 'NO HABILITADA' end*/ INTO vc_tarjeta, vc_documento, vc_nombre, is_found FROM creditopy.tarjetas t WHERE t.emisor = b.emisor AND t.tarjeta = fc_pan2cripto(vc_tarjeta) -- operativa AND creditopy.estado_ct(t.tarjeta, 'T') = 1 -- vigente AND t.fecha_vigencia >= trunc(SYSDATE); EXIT WHEN nvl(is_found, 0) = 1; EXCEPTION WHEN no_data_found THEN is_found := 0; WHEN OTHERS THEN RAISE; END; END LOOP; -- IF nvl(is_found, 0) = 1 THEN OPEN po_cursor FOR SELECT vc_tarjeta AS TARJETA, vc_documento AS DOCUMENTO, vc_nombre AS NOMBRE_USUARIO --,vn_is_prepaga as ES_PREPAGA --,vc_estado as ESTADO FROM dual; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; ELSE OPEN po_cursor FOR SELECT ' ' AS TARJETA, ' ' AS DOCUMENTO, ' ' AS NOMBRE_USUARIO --,0 as ES_PREPAGA --,' ' as ESTADO FROM dual; PO_SQLCODE := -1; PO_SQLERRM := 'No existe tarjeta operativa para el dato.'; END IF; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_datosTarjetaDimo; PROCEDURE sp_consultaemisortarjeta(PI_NUMERO_TARJETA IN VARCHAR2, -- PAN de la tarjeta PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS vn_existe_emisor NUMBER(4); /* 14- Consulta emisor tarjeta */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 27/05/2020 Propósito: Procedimiento que devuelve un cursor con los datos del emisor si es una tarjeta de Cabal. Se tiene como dato de entrada el numero de tarjeta. Si no existe debe retonar el not found, no un cursor vacío. PARAMETROS DE ENTRADA: pi_numero_tarjeta: tarjeta a consultar ******************************************************************************************************/ BEGIN IF PI_NUMERO_TARJETA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); END IF; -- si no esta parametrizado el emisor debe informar fin anormal BEGIN SELECT 1 INTO vn_existe_emisor FROM creditopy.tarjetas t WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_NUMERO_TARJETA); EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'Tarjeta no corresponde a un emisor procesado.'); WHEN OTHERS THEN RAISE; END; -- obtener los datos del emisor OPEN po_cursor FOR SELECT t.emisor AS emisor, decode(nvl(ep.marca, 'TC'), CC_DIMO, 1, 'TC', 2, 3) AS es_dimo FROM creditopy.tarjetas t LEFT OUTER JOIN creditopy.emisores_prepago ep ON t.emisor = ep.emisor WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_NUMERO_TARJETA); PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_consultaemisortarjeta; PROCEDURE sp_ConsultaDatosTxsEmisor(PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS vn_existe_emisor NUMBER(4); /* 14.1-Consulta datos para txs de un emisor */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 27/05/2020 Propósito: Procedimiento que devuelve un cursor con los datos para el registro del comercio o tarjeta puente cuando el originante o el destinatario no es una tarjeta de Cabal. Se tiene como dato de entrada el numero del emisor. Si el emisor no está parametrizado debe retonar el not found. PARAMETROS DE ENTRADA: pi_emisor: código del emisor a consultar ******************************************************************************************************/ BEGIN -- si no esta parametrizado el emisor debe informar fin anormal BEGIN SELECT COUNT(*) INTO vn_existe_emisor FROM creditopy.emisor_comercios_tarj_puente ect; EXCEPTION WHEN OTHERS THEN RAISE; END; -- obtener los datos del emisor para transaccionar OPEN po_cursor FOR SELECT ect.participante AS emisor, decode(nvl(ep.marca, 'TC'), CC_DIMO, 1, 'TC', 2, 3) AS es_dimo, ect.comercio_puente AS cod_comercio_puente, CASE WHEN ect.tarjeta_puente IS NULL THEN NULL ELSE creditopy.fc_cripto2pan(ect.tarjeta_puente) END AS tarjeta_puente, ect.comercio_adel_vent AS cod_comercio_adelanto, lpad(ect.emisor_receptor_pago, 3, 0) || lpad(ect.sucursal_receptor_pago, 3, 0) AS receptor_pago, t.nombre_para_plastico AS nombre_tarjeta_puente, o.descripcion AS desc_comercio_puente FROM creditopy.emisor_comercios_tarj_puente ect LEFT OUTER JOIN creditopy.emisores_prepago ep ON ect.participante = ep.emisor LEFT JOIN creditopy.tarjetas t ON ect.tarjeta_puente = t.tarjeta LEFT JOIN creditopy.comercios o ON ect.comercio_puente = o.comercio; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_ConsultaDatosTxsEmisor; PROCEDURE sp_tarjetascredito(PI_DOCUMENTO IN VARCHAR2, -- Documento de Identidad PI_EMISOR IN NUMBER DEFAULT NULL, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 15.1 - Consulta lista tarjetas TC */ /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Propósito: Procedimiento que devuelve un cursor con los datos de las tarjetas de creditos cumpliendo una serie de condiciones. Se tiene como dato de entrada el numero de documento del tarjetahabiente. OBS: Se toma la consulta utilizada en Micabal. PARAMETROS DE ENTRADA: pi_documento: un numero de documento rellenado con 0 a la izquierda con 12 de longitud total ******************************************************************************************************/ BEGIN IF pi_documento IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: document is null.'); END IF; OPEN po_cursor FOR SELECT -- Numero del documento de identidad substr(t.documento, 4, 12) AS documento, -- esta funcion dice cual es el procesador (cabal o panal) del emisor: retorna el id del procesador creditopy.ceibo_utiles.FN_GET_EMISOR_PROCESADOR(t.emisor) AS procesador, -- descripcion del procesador creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(creditopy.ceibo_utiles.FN_GET_EMISOR_PROCESADOR(t.emisor)) AS desc_procesador, -- id del emisor t.emisor AS emisor, -- descripcion del emisor creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(t.emisor) AS desc_emisor, -- id de la afinidad ct.grupo_afinidad AS grupo_afinidad, -- descripcion de la afinidad creditopy.pkg_dimo_ceibo.fn_get_afinidad_desc(ct.emisor, ct.grupo_afinidad) AS desc_grupo_af, -- número de cuenta t.numero_cuenta AS numero_cuenta, -- tarjeta desencriptada creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, -- tarjeta enmascarada creditopy.pkg_dimo_ceibo.fn_get_tarjeta_mask(t.tarjeta) AS tar_mask, -- tarjeta encriptada t.tarjeta AS tar_cripto, -- nombre que aparece en el plastico de la tarjeta t.nombre_para_plastico AS nombre_usuario, -- descripcion si la tarjeta es del titular o es una adicional t.componente AS componente, -- siempre devuelve solo titulares decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- fc_tjtp identifica cual es la ultima emitida para la cuenta correspondiendo esa tarjeta a la PRINCIPAL CASE WHEN t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta) THEN 'PRINCIPAL' ELSE 'NO PRINCIPAL' END AS tj_principal, -- la fecha de entrega de la tarjeta << de emision, generacion to_char(t.fecha_otorgada, 'DD/MM/YYYY') AS fecha_otorgada, -- adicional (para identificar la tarjeta en consulta se usa numero_cuenta + adicional) t.adicional AS adicional, -- la fecha de vencimiento del plastico to_char(t.fecha_vigencia, 'DD/MM/YYYY') AS fecha_vigencia, -- vencimiento de la tarjeta formato MMYY TO_CHAR(t.fecha_vigencia, 'MMYY') AS vencimiento_tar, -- id del estado de la tarjeta creditopy.ESTADO_CT(t.tarjeta, 'T') AS estado, -- descripcion del estado de la tarjeta creditopy.pkg_dimo_ceibo.fn_get_estado_desc(creditopy.ESTADO_CT(t.tarjeta, 'T')) AS desc_estado, -- si la cuenta esta congelada, devuelve "Cta.Congelada" CASE WHEN ct.tiene_vinculo = 1 THEN 'Cta.CONGELADA' ELSE 'Cta.ACTIVA' END AS congelada, -- A deuda al cierre ol.saldo_cierre_ml AS deuda_al_cierre, -- ultimo periodo cerrado sc.periodo_cierre AS ultimo_periodo_cerrado, -- fecha vencimiento pago minimo TO_CHAR(sc.fecha_vencimiento, 'DD/MM/YYYY') AS fecha_vencimiento_pago_minimo, -- importe pago minimo, sc.pago_minimo_ml AS importe_pm_facturado, -- Saldo a la fecha es la deuda a la fecha emulada del AccesoCabal: -- es el saldo actual calculado sobre el saldo al ultimo cierre de facturación -- menos los pagos y ajustes crédito, incluyendo los pagos y ajustes del online, -- mas los consumos (compras+ajustes db + adelantos) del periodo actual y los ajustes debito -- del online, sin incluir las reservas round(ol.saldo_cierre_ml -- menos todos los creditos (pagos procesados, pagos en linea y ajustes credito en linea) - (ol.pagos_ml + creditopy.pkg_dimo_ceibo.fn_get_pagos_ol(t.numero_cuenta) + creditopy.pkg_dimo_ceibo.fn_get_ajustes_ol(ct.numero_cuenta, 1)) -- mas los consumos del mes y los ajustes debito en linea + (ol.compras_ml + ol.efectivo_ml + creditopy.pkg_dimo_ceibo.fn_get_ajustes_ol(ct.numero_cuenta, 0))) AS deuda_a_la_fecha, -- -- pagos del periodo a la fecha: el total de pagos realizado por el tarjetahabiente -- se calcula realizando la sumatoria de: -- los pagos que se encuentran en el BACTH -- + los pagos del dia registrados en el ONLINE -- + los ajuste crédito registrados en el ONLINE. (ct.pagos_ml + creditopy.pkg_dimo_ceibo.fn_get_pagos_ol(t.numero_cuenta) + creditopy.pkg_dimo_ceibo.fn_get_ajustes_ol(t.numero_cuenta, 1)) AS pagos, -- importe del ultimo pago creditopy.pkg_dimo_ceibo.fn_get_ultimo_pago(t.numero_cuenta) AS importe_ultimo_pago, -- fecha de ultimo pago to_char(creditopy.pkg_dimo_ceibo.fn_get_fecha_ultimo_pago(t.numero_cuenta, ct.fecha_ultimo_pago), 'DD/MM/YYYY') AS fecha_ultimo_pago, -- el monto del limite credito normal (plan_venta = 1) (o limite contado para los que tienen linea separada) (total) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 1) AS limite_credito_total_olpy, -- el monto del limite planes (compras en cuotas) (plan_venta = 3) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 3) AS limite_planes_olpy, -- el monto del limite de adelanto (efectivo) (plan_venta = 4) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 4) AS limite_adelanto_olpy, -- el monto del limite del plan salud (plan_venta = 9) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 9) AS limite_salud_olpy, -- monto del disponible normal (o contado para los que tienen linea separada) (total) -- este disponible se muestra a nivel de cuentas, -- no se estan mostrando los disponibles individuales para tarjetas adicionales creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 1) AS disponible_normal, -- obtiene la cantidad de adicionales que tiene para esta tarjeta creditopy.pkg_dimo_ceibo.fn_get_cantidad_adicionales(t.numero_cuenta) AS cant_adicionales, -- importe pago minimo pendiente creditopy.pkg_dimo_ceibo.fn_get_pm_pendiente(t.numero_cuenta, sc.pago_minimo_ml, ol.pagos_ml) AS importe_pago_minimo, -- dias en mora a la ultima diaria CASE WHEN creditopy.pkg_dimo_ceibo.fn_get_pm_pendiente(t.numero_cuenta, sc.pago_minimo_ml, ol.pagos_ml) > 0 THEN ct.dias_en_mora ELSE 0 END AS dias_en_mora, TO_CHAR(sc.fecha_cierre, 'DD/MM/YYYY') AS fecha_emision_pago_minimo, TO_CHAR(cc.fecha_cierre, 'DD/MM/YYYY') AS fecha_emision_pago_min_sig, TO_CHAR(cc.fecha_vencimiento, 'DD/MM/YYYY') AS fecha_vencimiento_pago_min_sig, -- indicadores para mensajes CASE WHEN creditopy.pkg_dimo_ceibo.fn_get_datos_monetarios_ol(ct.emisor, ct.sucursal_emisor, ct.numero_cuenta, 4, ol.reservas_ml, ol.reservas_efectivo_ml, ol.reservas_planes_ml) != 0 THEN 1 ELSE 0 END AS con_autorizaciones_pendientes, CASE WHEN nvl(ep.porc_sobregiro_cont, 0) != 0 THEN 1 ELSE 0 END AS con_sobregiro, -- indicador de que la tarjeta es una renovacion decode(creditopy.pkg_dimo_ceibo.fn_get_origen_tarjeta(t.tarjeta), 90, 1, 0) AS flg_renovacion, -- separacion de limites y disponibles por lineas: -- si tiene linea unificada no se despliegan limite planes (compras en cuotas) -- ni su linea disponible planes decode(ct.numero_empresa, 1, 1, 0) AS is_linea_unificada, -- monto del disponible planes (o compras en cuotas, para los que tienen linea separada) creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 3) AS disponible_plan, -- monto del disponible de adelantos creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 4, decode(ct.numero_empresa, 1, 1, 0), nvl(ep.porc_sobregiro_cont, 0)) AS disponible_adelanto, -- Plan Salud: si no tiene parametrizado no se despliegan el limite del plan salud -- ni su linea disponible nvl((SELECT 1 FROM creditopy.emisores_planes_am WHERE emisor = ct.emisor AND plan_amortizable = 9), 0) AS tiene_plan_salud, creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 9) AS disponible_plan_salud, round(creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 1) * nvl(ep.porc_sobregiro_cont, 0) / 100) AS importe_sobregiro --periodo actual , to_char(add_months(to_date(ve.periodo_cierre, 'yyyymm'), 1), 'yyyymm') AS periodo_actual_tarjeta, ct.cierre AS cierre, (SELECT CASE WHEN MAX(1) IS NULL THEN 'N' ELSE 'S' END FROM creditopy.dimo_tc_vinculadas dtc WHERE dtc.tarjeta = t.tarjeta AND dtc.estado = 1 -- Vinculado... ) vinculada_dimo FROM creditopy.tarjetas t, creditopy.cuentas ct, -- se utiliza la visa del Online para minimizar los tiempos de inconsistencia en el cierre diario creditopy.cuentas@olpy ol, creditopy.variables_entorno ve, creditopy.saldos_cuentas sc, debcredpy.emisores e, creditopy.calendario_cierres cc, debcredpy.emisores_productos ep WHERE substr(t.documento, 4, 12) = lpad(pi_documento, 12, '0') /* DIMO: se ajusta a desplegar solo las tarjetas titulares vigentes y con estados operativos o bloqueado por el usuario o que tengan saldo facturado al ultimo cierre -- muestra las operativas, bloqueadas o atrasadas vigentes and ((t.clase_de_estado in (1,4,5,11) and t.fecha_vigencia > trunc(sysdate)) or -- se incluyen las no operativas pero con saldo al ultimo cierre porque facturan aun -- solo se toma la ultima (t.clase_de_estado not in (1,11) and ct.saldo_cierre_ml != 0 and t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta)) or -- se incluyen las no operativas incluso sin saldo porque puede solicitar desbloquear y reponer -- solo se toma la ultima (t.clase_de_estado in (4,5) and ct.saldo_cierre_ml = 0 and t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta)) ) -- solo desplegar las tarjetas donde el usuario es el titular and t.componente = 1 */ AND t.emisor = decode(nvl(PI_EMISOR, 0), 0, t.emisor, PI_EMISOR) --and CEIBO_UTILES.FN_GET_EMISOR_PROCESADOR(t.emisor) = 805 -- no incluir las tarjetas de emisores CABAL --and t.emisor not in (99, 108, 120) AND 1 = fn_emisor_proc_habilitado(t.emisor) -- siempre que tenga vigencia valida AND t.fecha_vigencia >= trunc(SYSDATE) AND ct.numero_cuenta = t.numero_cuenta -- se lista si es la tarjeta principal AND (t.tarjeta = creditopy.fc_tjtp(t.numero_cuenta) -- Ticket 0000467. OOJEDA -- -- o es la anterior emitida para el Titular de la Cta. OR (t.documento = ct.documento AND t.adicional = (SELECT MAX(TA.ADICIONAL) ADICIONAL_ANTERIOR FROM TARJETAS TA WHERE TA.NUMERO_CUENTA = T.NUMERO_CUENTA AND TA.TIPO_DE_DOCUMENTO = T.TIPO_DE_DOCUMENTO AND TA.DOCUMENTO = T.DOCUMENTO AND TA.TARJETA != creditopy.fc_tjtp(t.numero_cuenta)))) -- y si la cuenta esta activa (estados operativa o con atraso) -- o tenga saldo facturado al ultimo cierre AND (ct.clase_de_estado IN (1, 11) OR (ct.clase_de_estado NOT IN (1, 11) AND ct.saldo_cierre_ml != 0)) -- y que este operativa, bloqueada a pedido del usuario o con atraso -- o tenga saldo facturado al ultimo cierre AND (t.clase_de_estado IN (1, 5, 11) OR (t.clase_de_estado NOT IN (1, 11) AND ct.saldo_cierre_ml != 0)) AND ol.numero_cuenta = ct.numero_cuenta AND ve.emisor = ct.emisor AND ve.producto = ct.producto AND ve.cierre = ct.cierre AND ve.grupo_afinidad = ct.grupo_afinidad AND sc.EMISOR = ct.emisor AND sc.SUCURSAL_EMISOR = ct.sucursal_emisor AND sc.PRODUCTO = ct.Producto AND sc.NUMERO_CUENTA = ct.numero_cuenta AND sc.periodo_cierre = ve.periodo_cierre -- no incluir las tarjetas prepago AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) = 0 -- solo los emisores que estamos procesando a la fecha AND e.emisor = t.emisor AND e.base_pago_minimo = 'A' AND cc.emisor = ct.emisor AND cc.producto = ct.producto AND cc.cierre = ct.cierre AND cc.periodo = to_char(add_months(to_date(sc.periodo_cierre, 'yyyymm'), 1), 'YYYYMM') AND cc.grupo_afinidad(+) = ct.grupo_afinidad AND ep.emisor = ct.emisor AND ep.producto = ct.producto AND ep.grupo_afinidad = ct.grupo_afinidad AND ep.cartera = ct.cartera ORDER BY procesador, t.adicional, -- Ticket 0000467. OOJEDA -- to_date(fecha_vigencia, 'DD/MM/YYYY') DESC, numero_cuenta; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_tarjetasCredito; PROCEDURE sp_ConsultaExtracto(PI_NUMERO_CUENTA IN NUMBER, -- Documento de Identidad PI_PERIODO IN NUMBER, -- Periodo inicial PI_PERIODO_ACTUAL IN NUMBER, -- Periodo actual PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 15.3 - Consulta datos de extractos */ /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Propósito: Procedimiento que devuelve un cursor con los datos de los extractos de facturacion del rango de periodo indicado hasta el actual. OBS: Se toma la consulta utilizada en Micabal. PARAMETROS DE ENTRADA: pi_numero_cuenta: un numero de cuenta para obtener los extractos pi_periodo: periodo yyyymm de 12 meses atras del emisor de la cuenta pi_periodo_actual: periodo yyyymm vigente del emisor de la cuenta ******************************************************************************************************/ BEGIN IF PI_NUMERO_CUENTA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: cuenta is null.'); END IF; IF PI_PERIODO IS NULL OR PI_PERIODO_ACTUAL IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: periodo is null.'); END IF; OPEN po_cursor FOR SELECT substr(RI.PERIODO, 1, 4) AS anio, substr(RI.PERIODO, 5, 2) AS mes, to_char(RI.FECHA_CIERRE, 'DD/MM/YYYY') AS FECHA_EMISION, SC.PAGO_MINIMO_ML AS PAGO_MINIMO, to_char(SC.FECHA_VENCIMIENTO, 'DD/MM/YYYY') AS FECHA_VTO_PAGO_MINIMO, CASE -- si el periodo es el ultimo facturado (anterior al actual) se debe tomar de pagos a la fecha WHEN SC.PERIODO_CIERRE = to_char(add_months(to_date(pi_periodo_actual, 'YYYYMM'), -1), 'YYYYMM') THEN (ct.pagos_ml + creditopy.pkg_dimo_ceibo.fn_get_pagos_ol(ct.numero_cuenta) + creditopy.pkg_dimo_ceibo.fn_get_ajustes_ol(ct.numero_cuenta, 1)) ELSE SC.TOTAL_PAGOS_ML END AS MONTO_PAGO, CASE -- siempre buscar los pagos del periodo del row -- si el periodo es el ultimo facturado (anterior al actual) -- se debe tomar la ultima fecha de los pagos del periodo actual WHEN SC.PERIODO_CIERRE = to_char(add_months(to_date(pi_periodo_actual, 'YYYYMM'), -1), 'YYYYMM') THEN NVL(to_char(creditopy.pkg_dimo_ceibo.fn_get_fecha_ultimo_pago(CT.NUMERO_CUENTA, creditopy.pkg_dimo_ceibo.fn_get_fecha_ult_pago_periodo(ct.emisor, ct.sucursal_emisor, ct.numero_cuenta, pi_periodo_actual)), 'DD/MM/YYYY'), ' ') ELSE NVL(to_char(creditopy.pkg_dimo_ceibo.fn_get_fecha_ult_pago_periodo(ct.emisor, ct.sucursal_emisor, ct.numero_cuenta, to_number(to_char(add_months(to_date(SC.PERIODO_CIERRE, 'YYYYMM'), 1), 'YYYYMM'))), 'DD/MM/YYYY'), ' ') END AS FECHA_PAGO, decode(NVL(RI.NRO_ORDEN_IMP, 0), 0, 0, 1) AS FLAG_EXTRACTO, RI.EMISOR AS EMISOR, creditopy.ceibo_utiles.FN_GET_EMISOR_PROCESADOR(RI.EMISOR) AS PROCESADOR FROM CREDITOPY.RESUMENES_IMP RI, CREDITOPY.CUENTAS CT, CREDITOPY.SALDOS_CUENTAS SC -- periodo en consulta WHERE RI.NUMERO_CUENTA = pi_numero_cuenta AND RI.PERIODO >= pi_periodo --- formato YYYYMM y calcular los 12 ultimos AND CT.NUMERO_CUENTA = RI.NUMERO_CUENTA -- no incluir las cuentas prepago AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(ct.emisor) = 0 AND SC.EMISOR = RI.EMISOR AND SC.SUCURSAL_EMISOR = RI.SUCURSAL_EMISOR AND SC.PRODUCTO = 1 AND SC.NUMERO_CUENTA = RI.NUMERO_CUENTA AND SC.PERIODO_CIERRE = RI.PERIODO ORDER BY RI.PERIODO DESC; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_ConsultaExtracto; PROCEDURE sp_adicionalTC(PI_NUMERO_CUENTA IN VARCHAR2, -- Numero de cuenta de las adicionales a consultar PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 16.1 Consulta lista de adicionales por numero de cuenta de TC */ /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez Fecha: 24/04/2019 Propósito: Procedimiento que devuelve un cursor con los datos de las tarjetas de creditos adicionales cumpliendo una serie de condiciones. Se tiene como dato de entrada el numero de documento del tarjetahabiente. OBS: Se toma la consulta utilizada en Micabal. PARAMETROS DE ENTRADA: pi_numero_cuenta: un numero de cuenta para obetener las adicionales ******************************************************************************************************/ BEGIN IF PI_NUMERO_CUENTA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: numero cuenta is null.'); END IF; OPEN po_cursor FOR SELECT -- Numero del documento de identidad substr(t.documento, 4, 12) AS documento, -- esta funcion dice cual es el procesador (cabal o panal) del emisor: retorna el id del procesador creditopy.ceibo_utiles.FN_GET_EMISOR_PROCESADOR(t.emisor) AS procesador, -- descripcion del procesador creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(creditopy.ceibo_utiles.FN_GET_EMISOR_PROCESADOR(t.emisor)) AS desc_procesador, -- id del emisor t.emisor AS emisor, -- descripcion del emisor creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(t.emisor) AS desc_emisor, -- id de la afinidad ct.grupo_afinidad AS grupo_afinidad, -- descripcion de la afinidad creditopy.pkg_dimo_ceibo.fn_get_afinidad_desc(ct.emisor, ct.grupo_afinidad) AS desc_grupo_af, -- número de cuenta t.numero_cuenta AS numero_cuenta, -- numero de tarjeta creditopy.fc_cripto2pan(t.tarjeta) AS numero_tarjeta, -- numero de tarjeta con mascara en el siguiente formato 0000-XXXX-XXXX-0000 creditopy.pkg_dimo_ceibo.fn_get_tarjeta_mask(t.tarjeta) AS tar_mask, -- número de la tarjeta encriptada t.tarjeta AS tar_cripto, -- nombre que aparece en el plastico de la tarjeta t.nombre_para_plastico AS nombre_usuario, -- la fecha de entrega de la tarjeta << de emision, generacion t.fecha_otorgada AS fecha_otorgada, -- adicional (para identificar la tarjeta en consulta se usa numero_cuenta + adicional) t.adicional AS adicional, -- la fecha de vencimiento del plastico to_char(t.fecha_vigencia, 'DD/MM/YYYY') AS fecha_vigencia, -- vencimiento de la tarjeta formato MMYY TO_CHAR(t.fecha_vigencia, 'MMYY') AS vencimiento_tar, -- id del estado de la tarjeta creditopy.ESTADO_CT(t.tarjeta, 'T') AS estado, -- descripcion del estado de la tarjeta creditopy.pkg_dimo_ceibo.fn_get_estado_desc(creditopy.ESTADO_CT(t.tarjeta, 'T')) AS desc_estado, -- si la cuenta esta congelada, devuelve "Cta.Congelada" CASE WHEN ct.tiene_vinculo = 1 THEN 'Cta.CONGELADA' ELSE 'Cta.ACTIVA' END AS congelada, -- el monto del limite credito normal (plan_venta = 1) (o limite contado para los que tienen linea separada) (total) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 1) AS limite_credito_total_olpy, -- el monto del limite planes (compras en cuotas) (plan_venta = 3) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 3) AS limite_planes_olpy, -- el monto del limite de adelanto (efectivo) (plan_venta = 4) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 4) AS limite_adelanto_olpy, -- el monto del limite del plan salud (plan_venta = 9) creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 9) AS limite_salud_olpy, -- monto del disponible normal (o contado para los que tienen linea separada) (total) -- este disponible se muestra a nivel de cuentas, no se estan mostrando los disponibles individuales para tarjetas adicionales creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 1) AS disponible_normal, -- indicador de que la tarjeta es una renovacion decode(creditopy.pkg_dimo_ceibo.fn_get_origen_tarjeta(t.tarjeta), 90, 1, 0) AS flg_renovacion, -- separacion de limites y disponibles por lineas: -- si tiene linea unificada no se despliegan limite planes (compras en cuotas) -- ni su linea disponible planes decode(ct.numero_empresa, 1, 1, 0) AS is_linea_unificada, -- monto del disponible planes (o compras en cuotas, para los que tienen linea separada) creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 3) AS disponible_plan, -- monto del disponible de adelantos creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 4, decode(ct.numero_empresa, 1, 1, 0), nvl(ep.porc_sobregiro_cont, 0)) AS disponible_adelanto, -- Plan Salud: si no tiene parametrizado no se despliegan el limite del plan salud -- ni su linea disponible nvl((SELECT 1 FROM creditopy.emisores_planes_am WHERE emisor = ct.emisor AND plan_amortizable = 9), 0) AS tiene_plan_salud, creditopy.pkg_dimo_ceibo.fn_get_disponible_online(ct.emisor, ct.numero_cuenta, 9) AS disponible_plan_salud, -- se incluye el indicador de sobregiro y el importe para las adicionales CASE WHEN nvl(ep.porc_sobregiro_cont, 0) != 0 THEN 1 ELSE 0 END AS con_sobregiro, round(creditopy.pkg_dimo_ceibo.fn_get_limite(t.emisor, t.numero_cuenta, 1) * nvl(ep.porc_sobregiro_cont, 0) / 100) AS importe_sobregiro FROM creditopy.tarjetas t, creditopy.cuentas ct, creditopy.variables_entorno ve, creditopy.saldos_cuentas sc, debcredpy.emisores_productos ep WHERE t.numero_cuenta = pi_numero_cuenta AND t.clase_de_estado IN (1, 4, 5, 11) AND t.componente = 2 -- solo se desplegan las tarjetas adicionales AND ct.numero_cuenta = t.numero_cuenta -- no incluir las tarjetas prepago AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) = 0 AND ve.emisor = ct.emisor AND ve.producto = ct.producto AND ve.cierre = ct.cierre AND ve.grupo_afinidad = ct.grupo_afinidad AND sc.EMISOR = ct.emisor AND sc.SUCURSAL_EMISOR = ct.sucursal_emisor AND sc.PRODUCTO = ct.Producto AND sc.NUMERO_CUENTA = ct.numero_cuenta AND sc.periodo_cierre = ve.periodo_cierre -- no incluir las tarjetas de emisores CABAL AND t.emisor NOT IN (99, 108, 120) -- no incluir las tarjetas prepago AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) = 0 AND ep.emisor = ct.emisor AND ep.producto = ct.producto AND ep.grupo_afinidad = ct.grupo_afinidad AND ep.cartera = ct.cartera ORDER BY t.numero_cuenta, substr(t.documento, 4, 12), t.fecha_otorgada, t.fecha_vigencia; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_adicionalTC; PROCEDURE sp_movimientosdimo(PI_EMISOR IN VARCHAR2, -- Identificador del emisor PI_PERIODO_ACTUAL_TARJETA IN VARCHAR2, -- Periodo actual de la tarjeta PI_CIERRE IN VARCHAR2, -- Ultimo Periodo de cierre PI_NUMERO_TARJETA IN VARCHAR2, -- PAN tarjeta PI_NUMERO_CUENTA IN VARCHAR2, -- Numero de cuenta de la tarjeta PI_ADICIONAL IN VARCHAR2, -- Adicional PI_FLG_ADICIONAL IN VARCHAR2, -- Boolean que indica si se obtienen movimientos de tarjetas adicionales PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 17.1 - Consulta movimientos TPs DIMO */ -- FALTA INCORPORAR RUBROS_GLOSA_TP /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 29/04/2019 Propósito: Procedimiento que devuelve... pi_flg_adicionales valores 0 - no icluye los movimientos de las adicionales 1 - incluye los movimientos de las adicionales Cursor: - idramo, descramo: no se informan los ramos: 96 ADQUISICION CARTERA 97 REFINANCIACIONES 98 CUOTIZACION - cred: valores posibles de codigo_operacion codigo_operacion = 0 - compras (debito al usuario) ó 1 - devoluciones (credito al usuario) ****************************************************************************************************/ vn_componente_tar_param NUMBER; vr_tarjeta creditopy.tarjetas%ROWTYPE; vc_tarjeta creditopy.tarjetas.tarjeta%TYPE; vb_is_periodo_actual NUMBER; v_fecha_saldo DATE; v_periodo_anterior NUMBER; v_saldo_inicio_periodo NUMBER; BEGIN vc_tarjeta := creditopy.fc_pan2cripto(pi_numero_tarjeta); IF cs.GET_PERIODO_ACTUAL(PI_EMISOR, 1, PI_CIERRE) = PI_PERIODO_ACTUAL_TARJETA THEN vb_is_periodo_actual := 1; ELSE vb_is_periodo_actual := 0; END IF; -- se valida existencia de la tarjeta antes de consultar BEGIN SELECT t.* INTO vr_tarjeta FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta AND t.emisor = pi_emisor AND t.numero_cuenta = pi_numero_cuenta AND t.adicional = pi_adicional; EXCEPTION -- no puede darse por valido si es no_data_found porque debio pasar por -- las validaciones previas WHEN no_data_found THEN raise_application_error(-20001, 'Tarjeta invalida.'); WHEN OTHERS THEN RAISE; END; vn_componente_tar_param := vr_tarjeta.componente; -- obtener el saldo anterior de la cuenta v_periodo_anterior := to_char(add_months(to_date(PI_PERIODO_ACTUAL_TARJETA, 'YYYYMM'), -1), 'YYYYMM'); BEGIN SELECT sc.fecha_cierre, sc.pago_contado_ml * -1 INTO v_fecha_saldo, v_saldo_inicio_periodo FROM creditopy.SALDOS_CUENTAS sc WHERE sc.emisor = vr_tarjeta.emisor AND sc.sucursal_emisor = vr_tarjeta.sucursal_emisor AND sc.producto = vr_tarjeta.producto AND sc.numero_cuenta = vr_tarjeta.numero_cuenta AND sc.periodo_cierre = v_periodo_anterior; EXCEPTION WHEN no_data_found THEN v_fecha_saldo := to_date(PI_PERIODO_ACTUAL_TARJETA || '01', 'YYYYMMDD'); v_saldo_inicio_periodo := 0; WHEN OTHERS THEN RAISE; END; OPEN po_cursor FOR SELECT cuenta, tarjeta, fecha_movimiento_date, fecha_movimiento, nombre_comercio, cupon, autorizacion, importe, moneda, fecha_proceso, adicional, tipo_tarjeta, estado_mov, idRamo, descRamo, cred, talon, orden, SUM(simporte) over(PARTITION BY cuenta ORDER BY orden) - simporte saldo_ant, SUM(simporte) over(PARTITION BY cuenta ORDER BY orden) saldo_act FROM (SELECT vr_tarjeta.numero_cuenta AS cuenta, vr_tarjeta.tarjeta AS tarjeta, v_fecha_saldo AS fecha_movimiento_date, to_char(v_fecha_saldo, 'DD/MM/YYYY') AS fecha_movimiento, 'Saldo inicial' AS nombre_comercio, 0 AS cupon, 0 AS autorizacion, 0 AS importe, ' ' AS moneda, ' ' AS fecha_proceso, 1 AS adicional, 'TITULAR' AS tipo_tarjeta, ' ' AS estado_mov, 0 AS idRamo, ' ' AS descRamo, 1 AS cred, 0 AS talon, v_saldo_inicio_periodo AS simporte, 0 orden FROM dual UNION ALL SELECT fila.*, decode(cred, 1, -importe, importe) simporte, rownum orden FROM ( /* 1. consulta de AUTORIZACIONES PROCESADAS DEL BATCH no cuponadas, tomada de la regla 10014 */ SELECT a.numero_cuenta AS cuenta, a.tarjeta AS tarjeta, /*a.fecha as fecha_movimiento_date, to_char(a.fecha,'DD/MM/YYYY') as fecha_movimiento,*/ to_date(to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS') AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS') AS fecha_movimiento, /*-- descripcion del comercio creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(o.emisor_procesador,o.comercio,a.emisor) as nombre_comercio,*/ -- glosa de la transaccion creditopy.Pkg_Dimo_Ceibo.fn_get_glosa_aut_trxs(a.tarjeta, 'C', -- consumo a.fecha, a.hora, substr(lpad(a.numero_ticket, 15, 0), -6), a.numero_ticket, o.emisor_procesador, o.comercio, a.emisor, a.autorizante) AS nombre_comercio, nvl(a.numero_ticket, 0) AS cupon, a.numero_autorizacion AS autorizacion, a.monto_compra AS importe, e.descripcion AS moneda, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Reserva' AS estado_mov, -- datos del ramo del comercio para grafico de consumo creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(o.emisor_procesador, o.ramo, o.comercio) AS idramo, creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(o.emisor_procesador, o.ramo, o.comercio) AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, 0 AS talon FROM creditopy.autorizaciones a, creditopy.comercios o, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.acquirers h, creditopy.tarjetas t WHERE a.numero_cuenta = pi_numero_cuenta -- las autorizaciones no procesadas solo se muestran en el periodo actual AND vb_is_periodo_actual = 1 AND CASE autorizante WHEN 'Incoming' THEN 9999998 ELSE a.numero_comercio END = o.comercio AND a.producto >= -1 AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda_compra AND d.plan_venta = a.plan_venta AND h.acquirer = CASE autorizante WHEN 'Incoming' THEN '490000' ELSE autorizante END AND a.baja IN (' ', '0') AND t.tarjeta = a.tarjeta -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL /* 2. consulta de MOVIMIENTOS DEL PERIODO ACTUAL Se obtiene de la regla 10973 para consulta al bapy, que esta compuesta de 4 consultas pero se utilizan solo la 1 y la 2, porque el interes y el IVA se suman en la cuota correspondiente. La consulta del IVA es solo para los cargos que hayan aplicado en la diaria y ya se visualizan. Se consulta por numero_cuenta, la principal ve todo lo que se le va a facturar, incluidas las transacciones de sus adicionales porque hacen a su deuda */ SELECT -- 2.1 Movimientos facturados: -- Los movimientos se facturan con un rubro que se despliega en el nombre del comercio -- Los consumos ingresan con un rubro y para ese caso se debe incluir el nombre -- del comercio (compra o debito automático) -- Los consumos en el extranjero se despliegan XXXXXXX <<< definir igual que en los extractos -- Para cuotas decaidas anticipadamente, se suman al importe el interes y el IVA b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del comercio (consumos) o -- descripcion del rubro con el que se factura (pagos, cargos) -- y el concepto para los ajustes (tipo_de_rubro = 3) que tengan leyenda (concepto) /*case when ru.tipo_de_rubro = 1 then creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc( nvl(o.emisor_procesador,0), a.numero_comercio, a.emisor, a.rubro, ru.tipo_de_rubro, a.compra_exterior, a.numero_cupon_interno) else creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento( a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, a.moneda, a.importe_ml, a.fecha_movimiento, a.fecha_valor, a.numero_talon, a.numero_comercio, '') end as nombre_comercio,*/ CASE WHEN ru.tipo_de_rubro = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_glosa_aut_trxs(cu.tarjeta_externa, 'C', -- consumo cu.fecha_cupon, NULL, substr(lpad(cu.numero_cupon, 15, 0), -6), cu.numero_cupon, o.emisor_procesador, o.comercio, t.emisor, ' ') ELSE creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, a.moneda, a.importe_ml, a.fecha_movimiento, a.fecha_valor, a.numero_talon, a.numero_comercio, ' ') END AS nombre_comercio, -- numero de cupon y autorizacion solo importan cuando es un consumo CASE WHEN a.numero_comercio > 0 THEN a.numero_cupon ELSE 0 END AS cupon, CASE WHEN a.numero_comercio > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, CASE WHEN ru.tipo_de_rubro = 1 AND a.son > 1 THEN a.importe_ml + nvl(c.importe_producto, 0) + nvl(c.importe_impuesto, 0) ELSE a.importe_ml END AS importe, e.descripcion AS moneda, to_char(a.fecha_valor, 'DD/MM/YYYY') AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Procesado' AS estado_mov, -- datos del ramo del comercio para grafico de consumo -- si es un consumo solo se despliega el ramo cuando es la cuota 1, por ser la compra inicial CASE WHEN ru.tipo_de_rubro = 1 AND a.van = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(nvl(o.emisor_procesador, 0), nvl(o.ramo, 0), nvl(o.comercio, 0)) ELSE 0 END AS idramo, CASE WHEN ru.tipo_de_rubro = 1 AND a.van = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(nvl(o.emisor_procesador, 0), nvl(o.ramo, 0), nvl(o.comercio, 0)) ELSE ' ' END AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movtos_cuentas a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.comercios o, creditopy.movs_prods_imps c, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.periodo_cierre = pi_periodo_actual_tarjeta AND a.cierre = pi_cierre AND a.numero_cuenta = pi_numero_cuenta AND b.emisor = a.emisor AND b.sucursal_emisor = a.sucursal_emisor AND b.producto = a.producto AND b.numero_cuenta = a.numero_cuenta AND ru.rubro = a.rubro AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda AND cu.cupon(+) = CASE WHEN a.numero_comercio > 0 THEN a.numero_cupon_interno ELSE -1 END AND o.comercio(+) = CASE WHEN a.numero_comercio > 0 THEN a.numero_comercio ELSE -1 END AND a.prods_imps = c.prods_imps(+) AND t.numero_cuenta = a.numero_cuenta -- los cargos de la cuenta se registran con adicional = 1 pero -- deben desplegarse referenciando a la tarjeta principal AND t.adicional = CASE WHEN a.adicional = 1 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) ELSE a.adicional END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL SELECT -- 2.2. IVA de los movimientos facturados. Se ajusta para que no incluya las compras en planes -- que hayan decaido antes de la facturacion, ya que los movimientos de cuotas totalizan -- el importe de la amortizacion (cuota) más intereses e iva sobre el interes b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura 'I.V.A.' AS nombre_comercio, -- numero de cupon y autorizacion solo importan cuando es un consumo 0 AS cupon, 0 AS autorizacion, a.importe_ml AS importe, e.descripcion AS moneda, to_char(a.fecha_valor, 'DD/MM/YYYY') AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Procesado IVA' AS estado_mov, -- no se debe incluir datos del ramo del comercio para los intereses 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movtos_cuentas a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.movs_prods_imps c, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.periodo_cierre = pi_periodo_actual_tarjeta AND a.cierre = pi_cierre AND a.numero_cuenta = pi_numero_cuenta AND b.emisor = a.emisor AND b.sucursal_emisor = a.sucursal_emisor AND b.producto = a.producto AND b.numero_cuenta = a.numero_cuenta AND ru.rubro = a.rubro AND ru.tipo_de_rubro != 1 -- no se toman los IVA de rubros de compras en planes (cupones en cuotas) AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda -- solo si tienen IVA calculado AND a.prods_imps = c.prods_imps AND nvl(c.importe_impuesto, 0) != 0 -- en esta columna estan los interese calculados de cuotas de planes AND t.numero_cuenta = a.numero_cuenta -- los cargos de la cuenta se registran con adicional = 1 pero -- deben desplegarse referenciando a la tarjeta principal AND t.adicional = CASE WHEN a.adicional = 1 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) ELSE a.adicional END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL SELECT -- 2.3 Movimientos en proceso de cierre diario aun no facturados: corresponden a -- ajustes credito o debito y que ingresan con un rubro. -- Incluye los descuentos por promocion en cuyo caso se relaciona a un consumo -- y debe indicar el comercio y cupon al que se aplica -- Algunos ajustes corresponden a cargos que se en cuotas e ingresan como ajustes -- en cuyo caso se debe indicar las cuotas b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura y el nombre del comercio para los consumos creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, decode(a.tipo_de_moneda, 1, 830, 840), a.importe, a.fecha_movimiento, a.fecha_proceso, a.numero_talon, nvl(cu.comercio_cabal, 0), a.leyenda) AS nombre_comercio, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_cupon ELSE to_number(TRIM(a.numero_talon)) END AS cupon, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, a.importe AS importe, e.descripcion AS moneda, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'En Proceso' AS estado_mov, -- los ajustes no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movimientos_ajustes a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.tarjetas t WHERE b.emisor = pi_emisor AND b.cierre = pi_cierre AND b.numero_cuenta = pi_numero_cuenta AND a.emisor = b.emisor AND a.sucursal_emisor = b.sucursal_emisor AND a.producto = b.producto AND a.periodo_cierre = pi_periodo_actual_tarjeta AND nvl(a.procesado, 'N') != 'S' AND a.numero_cuenta = b.numero_cuenta AND a.rubro = ru.rubro AND e.producto = a.producto AND e.codigo_de_moneda = decode(a.tipo_de_moneda, 1, 830, 840) -- obtener los datos del cupon cuando es descuento por promo (rubro3577) AND cu.cupon(+) = CASE WHEN a.rubro = 3577 THEN to_number(substr(a.leyenda, 2, 13)) ELSE -1 END -- obtener la tarjeta (cuenta+adicional) a la que se aplica el ajuste AND t.numero_cuenta = a.numero_cuenta AND t.adicional = CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR substr(a.leyenda, 4, 5) = 'Cuota' THEN to_number(substr(a.leyenda, 1, 2)) WHEN a.rubro = 3577 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = nvl(cu.tarjeta_externa, creditopy.fc_tjtp(a.numero_cuenta))) ELSE (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL /* -- no corresponde PLANES para PREPAGAS 3. consulta de PLANES pendientes de facturar (cuota e interes) union all -- 3.2 planes pagos (planes sin interes) pendientes de facturacion union all*/ /* 4. Consultas ONLINE: autorizaciones, pagos y ajustes */ SELECT -- 4.1 consulta de AUTORIZACIONES de COMPRA pendientes del Online tomada de la regla 10014 a.nro_cuenta AS cuenta, a.nro_tarjeta AS tarjeta, /*a.fecha as fecha_movimiento_date, to_char(a.fecha,'DD/MM/YYYY') as fecha_movimiento,*/ to_date(to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS') AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS') AS fecha_movimiento, /*-- descripcion del comercio creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(c.emisor_procesador,c.comercio,a.emisor) as nombre_comercio,*/ -- glosa de la transaccion creditopy.Pkg_Dimo_Ceibo.fn_get_glosa_aut_trxs(a.nro_tarjeta, 'C', -- consumo a.fecha, a.hora, a.numero_auditoria, a.nro_ticket, c.emisor_procesador, c.comercio, a.emisor, a.acquiring_institution) AS nombre_comercio, nvl(to_number(a.nro_ticket), 0) AS cupon, a.nro_autorizacion AS autorizacion, a.importe AS importe, e.descripcion AS moneda, --to_char(a.autextfch,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Tx OnLine' AS estado_mov, -- datos del ramo del comercio para grafico de consumo creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(c.emisor_procesador, c.ramo, c.comercio) AS idramo, creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(c.emisor_procesador, c.ramo, c.comercio) AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, 0 AS talon FROM creditopy.log_transacc_cr@olpy a, creditopy.comercios c, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.ramos r, creditopy.tarjetas t WHERE a.emisor = pi_emisor -- las autorizaciones en linea solo se muestran en el periodo actual AND vb_is_periodo_actual = 1 AND a.nro_cuenta = pi_numero_cuenta AND a.nro_comercio = c.comercio AND a.TX_INTERNA NOT IN ('OFF COMP', 'OFF DEV') -- no incluir off-line AND a.producto >= -1 AND d.plan_venta >= -1 AND d.plan_venta = a.plan AND nvl(a.tipo_autorizacion, 'R') = 'A' AND a.autextproc IS NULL AND r.emisor_procesador = c.emisor_procesador AND r.ramo = c.ramo AND t.tarjeta = a.nro_tarjeta AND e.producto = t.producto AND e.codigo_de_moneda = a.moneda -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL SELECT -- 4.2 PAGOS de la fecha: los pagos entran a la cuenta, aunque se registren con una tarjeta -- se obtiene de la CONSULTA1 de la regla 10974 a.nro_cuenta AS cuenta, a.nro_tarjeta AS tarjeta, /*a.fecha as fecha_movimiento_date, to_char(a.fecha,'DD/MM/YYYY') as fecha_movimiento,*/ to_date(to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS'), 'DD/MM/YYYY HH24:MI:SS') AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') || ' ' || to_char(a.hora, 'HH24:MI:SS') AS fecha_movimiento, /*-- descripcion de la red de pago adquiriente 'DEPOSITO '||creditopy.Pkg_Dimo_Ceibo.FN_GET_RED(a.acquiring_institution) as nombre_comercio,*/ -- glosa de la transaccion creditopy.Pkg_Dimo_Ceibo.fn_get_glosa_aut_trxs(a.nro_tarjeta, 'P', -- pago/deposito a.fecha, a.hora, a.numero_auditoria, a.nro_ticket, 0, a.nro_comercio, a.emisor, a.acquiring_institution) AS nombre_comercio, 0 AS cupon, a.nro_autorizacion AS autorizacion, a.importe AS importe, e.descripcion AS moneda, --to_char(a.autextfch,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Deposito OnLine' AS estado_mov, -- los pagos no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, 0 AS talon FROM creditopy.log_transacc_cr@olpy a, debcredpy.monedas e, creditopy.tarjetas t WHERE a.emisor = pi_emisor -- los pagos en linea solo se muestran en el periodo actual AND vb_is_periodo_actual = 1 AND a.nro_cuenta = pi_numero_cuenta AND a.producto = 1 AND a.plan = 6 AND tx_interna IN ('PAGO', 'REVERSO') AND importe > 0 AND a.tipo_autorizacion = 'A' AND -- consideraciones para pagos -- no deben estar en proceso de cierre (autextproc IS NULL OR -- si estan en proceso de cierre -- solo se incluyen mientras no termina el proceso de carga de pagos (autextproc IS NOT NULL AND 1 = nvl((SELECT MAX(1) FROM creditopy.CONTROL_DATOS cd WHERE cd.nombre_proceso = 'PAGOS' AND cd.fecha_proceso >= trunc(autextfch) AND cd.resultado = 0), 0))) AND t.tarjeta = a.nro_tarjeta AND e.producto = t.producto AND e.codigo_de_moneda = a.moneda -- si es la titular muestra los pagos de todas las tarjetas, sino solo los de la tarjeta AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, '1', -- pi_flg_adicional: debe desplegar los pagos aunque entraron con otra tarjeta t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL SELECT -- 4.3 los MOVIMIENTOS DE AJUSTES que se cargaron a la cuenta -- se obtiene de la CONSULTA2 de la regla 10974 b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura y el nombre del comercio para los consumos creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, decode(a.tipo_de_moneda, 1, 830, 840), a.importe, a.fecha_movimiento, a.fecha_proceso, a.numero_talon, nvl(cu.comercio_cabal, 0), a.leyenda) AS nombre_comercio, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_cupon ELSE to_number(nvl(a.numero_talon, '0')) END AS cupon, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, a.importe AS importe, e.descripcion AS moneda, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Ajuste OnLine' AS estado_mov, -- los ajustes no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, to_number(to_char(a.fecha_proceso, 'yyyymmddhh24miss')) AS talon FROM creditopy.alta_movimientos_ajustes@olpy a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.tarjetas t WHERE b.emisor = pi_emisor -- los ajustes en linea solo se muestran en el periodo actual AND vb_is_periodo_actual = 1 AND b.cierre = pi_cierre AND b.numero_cuenta = pi_numero_cuenta AND a.emisor = b.emisor AND a.sucursal_emisor = b.sucursal_emisor AND a.producto = b.producto AND a.periodo_cierre <= pi_periodo_actual_tarjeta AND -- consideraciones para ajustes del online -- no deben estar en proceso de cierre (nvl(a.procesado, 'N') != 'S' OR -- si estan en proceso de cierre -- solo se incluyen mientras no termina el proceso de carga de ajustes (nvl(a.procesado, 'N') = 'S' AND 1 = nvl((SELECT MAX(1) FROM creditopy.CONTROL_DATOS cd WHERE cd.nombre_proceso = 'AJUSTES' AND cd.fecha_proceso >= trunc(a.fecha_proceso) AND cd.resultado = 0), 0))) AND a.numero_cuenta = b.numero_cuenta AND a.rubro = ru.rubro AND e.producto = a.producto AND e.codigo_de_moneda = decode(a.tipo_de_moneda, 1, 830, 840) AND cu.cupon(+) = CASE WHEN a.rubro = 3577 THEN to_number(substr(a.leyenda, 2, 13)) ELSE -1 END -- obtener la tarjeta (cuenta+adicional) a la que se aplica el ajuste AND t.numero_cuenta = a.numero_cuenta AND t.adicional = CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR upper(substr(a.leyenda, 4, 5)) = 'CUOTA' THEN to_number(substr(a.leyenda, 1, 2)) WHEN a.rubro = 3577 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = nvl(cu.tarjeta_externa, creditopy.fc_tjtp(a.numero_cuenta))) ELSE (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) ORDER BY fecha_movimiento_date, cupon, autorizacion, talon) fila ORDER BY orden); PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_movimientosdimo; PROCEDURE sp_movimientosTC(PI_EMISOR IN VARCHAR2, -- Identificador del emisor PI_PERIODO_ACTUAL_TARJETA IN VARCHAR2, -- Periodo actual de la tarjeta PI_CIERRE IN VARCHAR2, -- Ultimo Periodo de cierre PI_NUMERO_TARJETA IN VARCHAR2, -- PAN tarjeta PI_NUMERO_CUENTA IN VARCHAR2, -- Numero de cuenta de la tarjeta PI_ADICIONAL IN VARCHAR2, -- Adicional PI_FLG_ADICIONAL IN VARCHAR2, -- Boolean que indica si se obtienen movimientos de tarjetas adicionales PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 17.2 - Consulta movimientos TC */ /**************************************************************************************************** Autor: Juan Carlos Soto / Amalia Rodriguez - PKG_MICABAL Fecha: 29/04/2019 Propósito: Procedimiento que devuelve.. pi_flg_adicionales valores 0 - no icluye los movimientos de las adicionales 1 - incluye los movimientos de las adicionales Cursor: - idramo, descramo: no se informan los ramos: 96 ADQUISICION CARTERA 97 REFINANCIACIONES 98 CUOTIZACION - cred: valores posibles de codigo_operacion codigo_operacion = 0 - compras (debito al usuario) ó 1 - devoluciones (credito al usuario) ****************************************************************************************************/ vn_componente_tar_param NUMBER; vc_tarjeta creditopy.tarjetas.tarjeta%TYPE; BEGIN vc_tarjeta := creditopy.fc_pan2cripto(pi_numero_tarjeta); -- se valida existencia de la tarjeta antes de consultar -- solo emisor de tarjeta de credito BEGIN SELECT t.componente INTO vn_componente_tar_param FROM creditopy.tarjetas t WHERE t.tarjeta = vc_tarjeta AND t.emisor = pi_emisor -- solo habilita emisor de tarjeta de credito AND creditopy.pkg_dimo_ceibo.fn_is_prepaga(t.emisor) = 0 AND t.numero_cuenta = pi_numero_cuenta AND t.adicional = pi_adicional; EXCEPTION -- no puede darse por valido si es no_data_found porque debio pasar por -- las validaciones previas WHEN no_data_found THEN raise_application_error(-20001, 'Tarjeta invalida.'); WHEN OTHERS THEN RAISE; END; OPEN po_cursor FOR SELECT fila.*, rownum orden FROM ( /* 1. consulta de AUTORIZACIONES PROCESADAS DEL BATCH no cuponadas, tomada de la regla 10014 */ SELECT a.numero_cuenta AS cuenta, a.tarjeta AS tarjeta, a.fecha AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del comercio creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(o.emisor_procesador, o.comercio, a.emisor) AS nombre_comercio, nvl(a.numero_ticket, 0) AS cupon, a.numero_autorizacion AS autorizacion, a.monto_compra AS importe, e.descripcion AS moneda, d.descripcion AS plan_venta, CASE WHEN a.cantidad_cuotas > 1 THEN ' (' || a.cantidad_cuotas || ' Cuotas)' ELSE ' ' END AS cuotas, --to_char(a.fecha_negocio,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Reserva' AS estado_mov, -- datos del ramo del comercio para grafico de consumo creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(o.emisor_procesador, o.ramo, o.comercio) AS idramo, creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(o.emisor_procesador, o.ramo, o.comercio) AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, 0 AS talon FROM creditopy.autorizaciones a, creditopy.comercios o, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.acquirers h, creditopy.tarjetas t WHERE a.numero_cuenta = pi_numero_cuenta AND CASE autorizante WHEN 'Incoming' THEN 9999998 ELSE a.numero_comercio END = o.comercio AND a.producto >= -1 AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda_compra AND d.plan_venta = a.plan_venta AND h.acquirer = CASE autorizante WHEN 'Incoming' THEN '490000' ELSE autorizante END AND a.baja IN (' ', '0') AND t.tarjeta = a.tarjeta -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL /* 2. consulta de MOVIMIENTOS DEL PERIODO ACTUAL Se obtiene de la regla 10973 para consulta al bapy, que esta compuesta de 4 consultas pero se utilizan solo la 1 y la 2, porque el interes y el IVA se suman en la cuota correspondiente. La consulta del IVA es solo para los cargos que hayan aplicado en la diaria y ya se visualizan. Se consulta por numero_cuenta, la principal ve todo lo que se le va a facturar, incluidas las transacciones de sus adicionales porque hacen a su deuda */ SELECT -- 2.1 Movimientos facturados: -- Los movimientos se facturan con un rubro que se despliega en el nombre del comercio -- Los consumos ingresan con un rubro y para ese caso se debe incluir el nombre -- del comercio (compra o debito automático) -- Los consumos en el extranjero se despliegan XXXXXXX <<< definir igual que en los extractos -- Para cuotas decaidas anticipadamente, se suman al importe el interes y el IVA b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del comercio (consumos) o -- descripcion del rubro con el que se factura (pagos, cargos) -- y el concepto para los ajustes (tipo_de_rubro = 3) que tengan leyenda (concepto) CASE WHEN ru.tipo_de_rubro = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(nvl(o.emisor_procesador, 0), a.numero_comercio, a.emisor, a.rubro, ru.tipo_de_rubro, a.compra_exterior, a.numero_cupon_interno) ELSE creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, a.moneda, a.importe_ml, a.fecha_movimiento, a.fecha_valor, a.numero_talon, a.numero_comercio, NULL) END AS nombre_comercio, -- numero de cupon y autorizacion solo importan cuando es un consumo CASE WHEN a.numero_comercio > 0 THEN a.numero_cupon ELSE 0 END AS cupon, CASE WHEN a.numero_comercio > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, CASE WHEN ru.tipo_de_rubro = 1 AND a.son > 1 THEN a.importe_ml + nvl(c.importe_producto, 0) + nvl(c.importe_impuesto, 0) ELSE a.importe_ml END AS importe, e.descripcion AS moneda, -- plan solo importa cuando es un consumo (el tipo_de_rubro debe ser 1) CASE WHEN a.son > 1 OR ru.tipo_de_rubro = 1 THEN -- << por que pregunte por son > 1??? creditopy.Pkg_Dimo_Ceibo.fn_get_plan_venta_desc(cu.plan_venta) ELSE ' ' END AS plan_venta, CASE WHEN a.son > 1 --or ru.tipo_de_rubro = 1 THEN ' (Cuota ' || a.van || '/' || a.son || ')' ELSE ' ' END AS cuotas, to_char(a.fecha_valor, 'DD/MM/YYYY') AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Procesado' AS estado_mov, -- datos del ramo del comercio para grafico de consumo -- si es un consumo solo se despliega el ramo cuando es la cuota 1, por ser la compra inicial CASE WHEN ru.tipo_de_rubro = 1 AND a.van = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(nvl(o.emisor_procesador, 0), nvl(o.ramo, 0), nvl(o.comercio, 0)) ELSE 0 END AS idramo, CASE WHEN ru.tipo_de_rubro = 1 AND a.van = 1 THEN creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(nvl(o.emisor_procesador, 0), nvl(o.ramo, 0), nvl(o.comercio, 0)) ELSE ' ' END AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA -- en esta consulta se condiciona cuando es una cuota de una compra, -- (no se aplica para cargos en cuotas) y se informa el capital amortizado, -- el interes y el IVA CASE WHEN ru.tipo_de_rubro = 1 AND a.son > 1 THEN 1 ELSE 0 END AS flg_detalle_cuota, a.importe_ml AS cuota_amortizacion, nvl(c.importe_producto, 0) AS cuota_interes, nvl(c.importe_impuesto, 0) AS cuota_IVA, CASE WHEN ru.tipo_de_rubro = 1 AND a.son > 1 THEN CASE WHEN a.rubro = 1100 THEN 0 ELSE 1 END ELSE 0 END AS flg_interes_plan, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movtos_cuentas a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.comercios o, creditopy.movs_prods_imps c, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.periodo_cierre = pi_periodo_actual_tarjeta AND a.cierre = pi_cierre AND a.numero_cuenta = pi_numero_cuenta AND b.emisor = a.emisor AND b.sucursal_emisor = a.sucursal_emisor AND b.producto = a.producto AND b.numero_cuenta = a.numero_cuenta AND ru.rubro = a.rubro AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda AND cu.cupon(+) = CASE WHEN a.numero_comercio > 0 THEN a.numero_cupon_interno ELSE -1 END AND o.comercio(+) = CASE WHEN a.numero_comercio > 0 THEN a.numero_comercio ELSE -1 END AND a.prods_imps = c.prods_imps(+) AND t.numero_cuenta = a.numero_cuenta -- los cargos de la cuenta se registran con adicional = 1 pero -- deben desplegarse referenciando a la tarjeta principal AND t.adicional = CASE WHEN a.adicional = 1 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) ELSE a.adicional END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL SELECT -- 2.2. IVA de los movimientos facturados. Se ajusta para que no incluya las compras en planes -- que hayan decaido antes de la facturacion, ya que los movimientos de cuotas totalizan -- el importe de la amortizacion (cuota) más intereses e iva sobre el interes b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura 'I.V.A.' AS nombre_comercio, -- numero de cupon y autorizacion solo importan cuando es un consumo 0 AS cupon, 0 AS autorizacion, a.importe_ml AS importe, e.descripcion AS moneda, -- plan solo importa cuando es un consumo (el tipo_de_rubro debe ser 1) ' ' AS plan_venta, CASE WHEN a.son > 1 THEN ' (Cuota ' || a.van || '/' || a.son || ')' ELSE ' ' END AS cuotas, to_char(a.fecha_valor, 'DD/MM/YYYY') AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Procesado IVA' AS estado_mov, -- no se debe incluir datos del ramo del comercio para los intereses 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movtos_cuentas a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.movs_prods_imps c, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.periodo_cierre = pi_periodo_actual_tarjeta AND a.cierre = pi_cierre AND a.numero_cuenta = pi_numero_cuenta AND b.emisor = a.emisor AND b.sucursal_emisor = a.sucursal_emisor AND b.producto = a.producto AND b.numero_cuenta = a.numero_cuenta AND ru.rubro = a.rubro AND ru.tipo_de_rubro != 1 -- no se toman los IVA de rubros de compras en planes (cupones en cuotas) AND e.producto = a.producto AND e.codigo_de_moneda = a.moneda -- solo si tienen IVA calculado AND a.prods_imps = c.prods_imps AND nvl(c.importe_impuesto, 0) != 0 -- en esta columna estan los interese calculados de cuotas de planes AND t.numero_cuenta = a.numero_cuenta -- los cargos de la cuenta se registran con adicional = 1 pero -- deben desplegarse referenciando a la tarjeta principal AND t.adicional = CASE WHEN a.adicional = 1 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) ELSE a.adicional END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL SELECT -- 2.3 Movimientos en proceso de cierre diario aun no facturados: corresponden a -- ajustes credito o debito y que ingresan con un rubro. -- Incluye los descuentos por promocion en cuyo caso se relaciona a un consumo -- y debe indicar el comercio y cupon al que se aplica -- Algunos ajustes corresponden a cargos que se en cuotas e ingresan como ajustes -- en cuyo caso se debe indicar las cuotas b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura y el nombre del comercio para los consumos creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, decode(a.tipo_de_moneda, 1, 830, 840), a.importe, a.fecha_movimiento, a.fecha_proceso, a.numero_talon, nvl(cu.comercio_cabal, 0), a.leyenda) AS nombre_comercio, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_cupon ELSE to_number(TRIM(a.numero_talon)) END AS cupon, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, a.importe AS importe, e.descripcion AS moneda, ' ' AS plan_venta, CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR upper(substr(a.leyenda, 4, 5)) = 'CUOTA' THEN CASE WHEN substr(a.leyenda, 16, 2) > 1 THEN ' (Cuota ' || substr(a.leyenda, 10, 2) || '/' || substr(a.leyenda, 16, 2) || ')' ELSE ' ' END ELSE ' ' END AS cuotas, --to_char(a.fecha_proceso,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'En Proceso' AS estado_mov, -- los ajustes no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, to_number(TRIM(a.numero_talon)) AS talon FROM creditopy.movimientos_ajustes a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.tarjetas t WHERE b.emisor = pi_emisor AND b.cierre = pi_cierre AND b.numero_cuenta = pi_numero_cuenta AND a.emisor = b.emisor AND a.sucursal_emisor = b.sucursal_emisor AND a.producto = b.producto AND a.periodo_cierre = pi_periodo_actual_tarjeta AND nvl(a.procesado, 'N') != 'S' AND a.numero_cuenta = b.numero_cuenta AND a.rubro = ru.rubro AND e.producto = a.producto AND e.codigo_de_moneda = decode(a.tipo_de_moneda, 1, 830, 840) AND cu.cupon(+) = CASE WHEN a.rubro = 3577 THEN to_number(substr(a.leyenda, 2, 13)) ELSE -1 END -- obtener la tarjeta (cuenta+adicional) a la que se aplica el ajuste AND t.numero_cuenta = a.numero_cuenta AND t.adicional = CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR substr(a.leyenda, 4, 5) = 'Cuota' THEN to_number(substr(a.leyenda, 1, 2)) WHEN a.rubro = 3577 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = nvl(cu.tarjeta_externa, creditopy.fc_tjtp(a.numero_cuenta))) ELSE (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL /* 3. consulta de PLANES pendientes de facturar (cuota e interes) */ SELECT -- 3.1 planes amortizables amortizables (con intereses) pendientes de facturacion -- al importe de la cuota se le suman los intereses y el IVA pa.numero_cuenta AS cuenta, pa.tarjeta_ext AS tarjeta, pa.fecha_cupon AS fecha_movimiento_date, to_char(pa.fecha_cupon, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del comercio TRIM(c.descripcion) AS nombre_comercio, nvl(pa.numero_de_cupon, 0) AS cupon, cu.numero_autorizacion AS autorizacion, --pa.cuota_am as importe, pa.cuota_am + pa.interes_am AS importe, e.descripcion AS moneda, d.descripcion AS plan_venta, CASE WHEN pa.cuotas_son > 1 THEN ' (Cuota ' || pa.cuotas_van || '/' || pa.cuotas_son || ')' ELSE ' ' END AS cuotas, -- las cuotas a facturar no tienen fecha de proceso ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Plan a facturar' AS estado_mov, -- datos del ramo del comercio para grafico de consumo, si no es ramo 96, 97 o 98 -- solo despliega el ramo para la primera cuota, por ser consumo del mes CASE WHEN c.ramo NOT IN (96, 97, 98) --and pa.cuotas_van = 1 THEN c.ramo ELSE 0 END AS idramo, CASE WHEN c.ramo NOT IN (96, 97, 98) --and pa.cuotas_van = 1 THEN r.descripcion ELSE ' ' END AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, 1, 0) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA -- en esta consulta se informa el capital amortizado y el interes, -- en este estadio, antes de facturar, no hay IVA aplicado, ya que -- eso se calcula en base a los parametros al facturar 1 AS flg_detalle_cuota, pa.cuota_am AS cuota_amortizacion, pa.interes_am AS cuota_interes, 0 AS cuota_IVA, 1 AS flg_interes_plan, 0 AS talon FROM creditopy.planes_amortizables pa, creditopy.comercios c, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.ramos r, creditopy.cupones cu, creditopy.tarjetas t WHERE pa.numero_cuenta = pi_numero_cuenta AND pa.marca_vigente = 1 AND pa.numero_comercio = c.comercio AND d.plan_venta = pa.plan_amortizable AND e.producto = pa.producto AND e.codigo_de_moneda = decode(pa.tipo_de_moneda, 1, 830, 40) AND r.emisor_procesador = c.emisor_procesador AND r.ramo = c.ramo AND cu.cupon = pa.numero_cupon_interno AND t.tarjeta = pa.tarjeta_ext -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL SELECT -- 3.2 planes pagos (planes sin interes) pendientes de facturacion pp.numero_cuenta AS cuenta, pp.tarjeta_ext AS tarjeta, pp.fecha_cupon AS fecha_movimiento_date, to_char(pp.fecha_cupon, 'DD/MM/YYYY') AS fecha_movimiento, TRIM(c.descripcion) AS nombre_comercio, -- descripcion del comercio nvl(pp.numero_de_cupon, 0) AS cupon, cu.numero_autorizacion AS autorizacion, pp.importe_cuota AS importe, e.descripcion AS moneda, d.descripcion AS plan_venta, CASE WHEN pp.cuotas_son > 1 THEN ' (Cuota ' || pp.cuotas_van || '/' || pp.cuotas_son || ')' ELSE ' ' END AS cuotas, -- las cuotas a facturar no tienen fecha de proceso ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Plan a facturar' AS estado_mov, -- datos del ramo del comercio para grafico de consumo, si no es ramo 96, 97 o 98 -- solo despliega el ramo para la primera cuota, por ser consumo del mes CASE WHEN c.ramo NOT IN (96, 97, 98) --and pp.cuotas_van = 1 THEN c.ramo ELSE 0 END AS idramo, CASE WHEN c.ramo NOT IN (96, 97, 98) --and pp.cuotas_van = 1 THEN r.descripcion ELSE ' ' END AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, 1, 0) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, 0 AS talon FROM creditopy.planes_pagos pp, creditopy.comercios c, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.ramos r, creditopy.cupones cu, creditopy.tarjetas t WHERE pp.numero_cuenta = pi_numero_cuenta AND pp.marca_vigente = 1 AND pp.numero_comercio = c.comercio AND d.plan_venta = pp.plan_pago AND e.producto = pp.producto AND e.codigo_de_moneda = decode(pp.tipo_de_moneda, 1, 830, 40) AND r.emisor_procesador = c.emisor_procesador AND r.ramo = c.ramo AND cu.cupon = pp.numero_cupon_interno AND t.tarjeta = pp.tarjeta_ext -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) UNION ALL /* 4. Consultas ONLINE: autorizaciones, pagos y ajustes */ SELECT -- 4.1 consulta de AUTORIZACIONES de COMPRA pendientes del Online tomada de la regla 10014 a.nro_cuenta AS cuenta, a.nro_tarjeta AS tarjeta, a.fecha AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del comercio creditopy.Pkg_Dimo_Ceibo.fn_get_comercio_desc(c.emisor_procesador, c.comercio, a.emisor) AS nombre_comercio, nvl(to_number(a.nro_ticket), 0) AS cupon, a.nro_autorizacion AS autorizacion, a.importe AS importe, e.descripcion AS moneda, d.descripcion AS plan_venta, CASE WHEN a.cuotas > 1 THEN ' (' || a.cuotas || ' Cuotas)' ELSE ' ' END AS cuotas, --to_char(a.autextfch,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Tx OnLine' AS estado_mov, -- datos del ramo del comercio para grafico de consumo creditopy.Pkg_Dimo_Ceibo.fn_get_cod_ramo_barra(c.emisor_procesador, c.ramo, c.comercio) AS idramo, creditopy.Pkg_Dimo_Ceibo.fn_get_desc_ramo_barra(c.emisor_procesador, c.ramo, c.comercio) AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, 0 AS talon FROM creditopy.log_transacc_cr@olpy a, creditopy.comercios c, creditopy.planes_de_venta d, debcredpy.monedas e, creditopy.ramos r, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.nro_cuenta = pi_numero_cuenta AND a.nro_comercio = c.comercio AND a.TX_INTERNA NOT IN ('OFF COMP', 'OFF DEV') -- no incluir off-line AND a.producto >= -1 AND d.plan_venta >= -1 AND d.plan_venta = a.plan AND nvl(a.tipo_autorizacion, 'R') = 'A' AND a.autextproc IS NULL AND r.emisor_procesador = c.emisor_procesador AND r.ramo = c.ramo AND t.tarjeta = a.nro_tarjeta AND e.producto = t.producto AND e.codigo_de_moneda = a.moneda -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL SELECT -- 4.2 PAGOS de la fecha: los pagos entran a la cuenta, aunque se registren con una tarjeta -- se obtiene de la CONSULTA1 de la regla 10974 a.nro_cuenta AS cuenta, a.nro_tarjeta AS tarjeta, a.fecha AS fecha_movimiento_date, to_char(a.fecha, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion de la red de pago adquiriente decode(a.TX_INTERNA, 'PAGO', 'SU PAGO ', 'REVERSO', 'Rev PAGO ', a.TX_INTERNA) || creditopy.Pkg_Dimo_Ceibo.FN_GET_RED(a.acquiring_institution) AS nombre_comercio, 0 AS cupon, a.nro_autorizacion AS autorizacion, a.importe AS importe, e.descripcion AS moneda, ' ' AS plan_venta, ' ' AS cuotas, --to_char(a.autextfch,'DD/MM/YYYY') as fecha_proceso, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Pagos OnLine' AS estado_mov, -- los pagos no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional de cuotas con interes e IVA 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, 0 AS talon FROM creditopy.log_transacc_cr@olpy a, debcredpy.monedas e, creditopy.tarjetas t WHERE a.emisor = pi_emisor AND a.nro_cuenta = pi_numero_cuenta --and a.TX_INTERNA IN ('OFF COMP', 'OFF DEV') -- no se requiere controlar porque se filtran solo 'PAGO' AND a.producto = 1 AND a.plan = 6 AND tx_interna IN ('PAGO', 'REVERSO') AND importe > 0 AND a.tipo_autorizacion = 'A' AND -- consideraciones para pagos -- no deben estar en proceso de cierre (autextproc IS NULL OR -- si estan en proceso de cierre -- solo se incluyen mientras no termina el proceso de carga de pagos (autextproc IS NOT NULL AND 1 = nvl((SELECT MAX(1) FROM creditopy.CONTROL_DATOS cd WHERE cd.nombre_proceso = 'PAGOS' AND cd.fecha_proceso >= trunc(autextfch) AND cd.resultado = 0), 0))) AND t.tarjeta = a.nro_tarjeta AND e.producto = t.producto AND e.codigo_de_moneda = a.moneda -- si es la titular muestra los pagos de todas las tarjetas, sino solo los de la tarjeta AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, '1', -- pi_flg_adicional: debe desplegar los pagos aunque entraron con otra tarjeta t.adicional, -- de la tarjeta del movimiento t.componente) -- de la tarjeta del movimiento UNION ALL SELECT -- 4.3 los MOVIMIENTOS DE AJUSTES que se cargaron a la cuenta -- se obtiene de la CONSULTA2 de la regla 10974 b.numero_cuenta AS cuenta, t.tarjeta AS tarjeta, a.fecha_movimiento AS fecha_movimiento_date, to_char(a.fecha_movimiento, 'DD/MM/YYYY') AS fecha_movimiento, -- descripcion del rubro con el que se factura y el nombre del comercio para los consumos creditopy.pkg_dimo_ceibo.fn_get_leyenda_movimiento(a.emisor, a.numero_cuenta, a.rubro, a.codigo_operacion, decode(a.tipo_de_moneda, 1, 830, 840), a.importe, a.fecha_movimiento, a.fecha_proceso, a.numero_talon, nvl(cu.comercio_cabal, 0), a.leyenda) AS nombre_comercio, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_cupon ELSE to_number(nvl(a.numero_talon, '0')) END AS cupon, CASE WHEN cu.comercio_cabal > 0 THEN cu.numero_autorizacion ELSE 0 END AS autorizacion, a.importe AS importe, e.descripcion AS moneda, ' ' AS plan_venta, CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR upper(substr(a.leyenda, 4, 5)) = 'CUOTA' THEN CASE WHEN substr(a.leyenda, 16, 2) > 1 THEN ' (Cuota ' || substr(a.leyenda, 10, 2) || '/' || substr(a.leyenda, 16, 2) || ')' ELSE ' ' END ELSE ' ' END AS cuotas, ' ' AS fecha_proceso, -- datos de la tarjeta del movimiento t.adicional AS adicional, decode(t.componente, 1, 'TITULAR', 'ADICIONAL') AS tipo_tarjeta, -- tipo de movimiento desplegado 'Ajuste OnLine' AS estado_mov, -- los ajustes no son consumos, no incluir datos del ramo del comercio 0 AS idramo, ' ' AS descramo, -- operaciones credito decode(creditopy.Pkg_Dimo_Ceibo.fn_is_prepaga(t.emisor), 1, decode(a.codigo_operacion, 1, 0, 1), a.codigo_operacion) AS cred, -- flag indicador de consulta adicional 0 AS flg_detalle_cuota, 0 AS cuota_amortizacion, 0 AS cuota_interes, 0 AS cuota_IVA, 0 AS flg_interes_plan, to_number(to_char(a.fecha_proceso, 'yyyymmddhh24miss')) AS talon FROM creditopy.alta_movimientos_ajustes@olpy a, creditopy.cuentas b, creditopy.rubros ru, debcredpy.monedas e, creditopy.cupones cu, creditopy.tarjetas t WHERE b.emisor = pi_emisor AND b.cierre = pi_cierre AND b.numero_cuenta = pi_numero_cuenta AND a.emisor = b.emisor AND a.sucursal_emisor = b.sucursal_emisor AND a.producto = b.producto AND a.periodo_cierre = pi_periodo_actual_tarjeta AND -- consideraciones para ajustes del online -- no deben estar en proceso de cierre (nvl(a.procesado, 'N') != 'S' OR -- si estan en proceso de cierre -- solo se incluyen mientras no termina el proceso de carga de ajustes (nvl(a.procesado, 'N') = 'S' AND 1 = nvl((SELECT MAX(1) FROM creditopy.CONTROL_DATOS cd WHERE cd.nombre_proceso = 'AJUSTES' AND cd.fecha_proceso >= trunc(a.fecha_proceso) AND cd.resultado = 0), 0))) AND a.numero_cuenta = b.numero_cuenta AND a.rubro = ru.rubro AND e.producto = a.producto AND e.codigo_de_moneda = decode(a.tipo_de_moneda, 1, 830, 840) AND cu.cupon(+) = CASE WHEN a.rubro = 3577 THEN to_number(substr(a.leyenda, 2, 13)) ELSE -1 END -- obtener la tarjeta (cuenta+adicional) a la que se aplica el ajuste AND t.numero_cuenta = a.numero_cuenta AND t.adicional = CASE WHEN 1 = (SELECT 1 FROM creditopy.codigos_py cp WHERE cp.tipo_codigo = 14 AND TRIM(cp.valor) = a.rubro) OR upper(substr(a.leyenda, 4, 5)) = 'CUOTA' THEN to_number(substr(a.leyenda, 1, 2)) WHEN a.rubro = 3577 THEN (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = nvl(cu.tarjeta_externa, creditopy.fc_tjtp(a.numero_cuenta))) ELSE (SELECT tj.adicional FROM creditopy.tarjetas tj WHERE tj.tarjeta = creditopy.fc_tjtp(a.numero_cuenta)) END -- muestra solo txs de la tarjeta o incluye las adicionales: esta -- condicion se evalua con el pi_flg_adicional y el pi_adicional AND 1 = creditopy.Pkg_Dimo_Ceibo.fn_is_adic_enable(pi_adicional, vn_componente_tar_param, pi_flg_adicional, t.adicional, -- de la tarjeta del movimiento t.componente) ORDER BY fecha_movimiento_date, cupon, autorizacion, talon) fila; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_movimientosTC; PROCEDURE sp_costosOperacionalesDimo(PI_CODIGO_EF IN NUMBER, PI_TIPO_CUENTA_ORIGEN IN VARCHAR2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 19.1- Info. COSTOS OPERACIONALES de TXS DIMO */ /**************************************************************************************************** Autor: Amalia Rodriguez. Fecha: 07/09/2020 Propósito: Procedimiento que devuelve un cursor con los datos de los costos a aplicar de acuerdo al tipo de cuenta de origen. Permite informar a un usuario los costos vigentes de las transacciones. Se consulta por el codigo del participante y el tipo de cuenta seleccionados para consultar. PARAMETROS DE ENTRADA: PI_CODIGO_EF Corresponde al codigo del participante de la cuenta seleccionada. PI_TIPO_CUENTA_ORIGEN Corresponde al tipo de cuenta que se quiere consultar, y los valores son los de tipoCuentaOrigen del SICOOP. ALL para consultar todas las parametrizadas. *****************************************************************************************************/ vn_tipo_ok NUMBER; BEGIN -- se valida codigo ef originante IF PI_CODIGO_EF IS NULL THEN raise_application_error(-20001, 'Codigo de participante origen invalido.'); END IF; -- se valida tipo de cuenta origen IF upper(nvl(PI_TIPO_CUENTA_ORIGEN, 'all')) != 'ALL' THEN BEGIN SELECT 1 INTO vn_tipo_ok FROM creditopy.SICOOP_TIPO_CUENTA t WHERE t.tipo_cuenta = PI_TIPO_CUENTA_ORIGEN AND t.tipo_ori_des = 'O'; EXCEPTION -- no puede darse por valido si es no_data_found porque debio pasar por -- las validaciones previas WHEN no_data_found THEN raise_application_error(-20001, 'Tipo de cuenta origen invalida.'); WHEN OTHERS THEN RAISE; END; END IF; OPEN po_cursor FOR SELECT ct.id_cargo_tran AS COSTO_ID, ct.descripcion_cargo AS COSTO_DESCRIPCION, cr.rango_monto_desde AS MONTO_DESDE, cr.rango_monto_hasta AS MONTO_HASTA, cr.tipo_cargo_originante AS TIPO_CARGO_ORIGINANTE, CASE WHEN cr.tipo_cargo_originante = 'FEE' THEN cr.cargo_originante ELSE 0 END AS IMPORTE_CARGO_ORIGINANTE, CASE WHEN cr.tipo_cargo_originante = '%' THEN cr.porcentaje_originante ELSE 0 END AS TASA_CARGO_ORIGINANTE, cr.tipo_cargo_destinatario AS TIPO_CARGO_DESTINATARIO, CASE WHEN cr.tipo_cargo_destinatario = 'FEE' THEN cr.cargo_destinatario ELSE 0 END AS IMPORTE_CARGO_DESTINATARIO, CASE WHEN cr.tipo_cargo_originante = '%' THEN cr.Porcentaje_destinatario ELSE 0 END AS TASA_CARGO_DESTINATARIO, i.valor_impuesto AS APLICAR_IVA, ct.canal AS CANAL, ct.pagador AS PAGADOR, m.tipo_transaccion AS TIPO_TRANSACCION, m.cod_servicio AS COD_SERVICIO, cs.descripcion AS DESCRIPCION_SERVICIO, ct.codigo_ef_originante AS EF_ORIGINANTE, nvl(ct.emisor_cabal_originante, 0) AS EMISOR_CABAL_ORIGINANTE, CASE WHEN ct.emisor_cabal_originante IS NOT NULL THEN creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(ct.emisor_cabal_originante) ELSE ' ' END AS DESC_EMI_CABAL_ORIGINANTE, m.tipo_cuenta_origen AS TIPO_CUENTA_ORIGEN, tco.descripcion AS DESC_TIPO_CUENTA_ORIGEN, ct.codigo_ef_destinatario AS EF_DESTINATARIO, nvl(ct.emisor_cabal_destinatario, 0) AS EMISOR_CABAL_DESTINATARIO, CASE WHEN ct.emisor_cabal_destinatario IS NOT NULL THEN creditopy.pkg_dimo_ceibo.fn_get_emisor_desc(ct.emisor_cabal_destinatario) ELSE ' ' END AS DESC_EMI_CABAL_DESTINATARIO, m.tipo_cuenta_destino AS TIPO_CUENTA_DESTINO, tcd.descripcion AS DESC_TIPO_CUENTA_DESTINO, ct.fecha_vigencia_desde AS FECHA_VIGENCIA_DESDE, ct.fecha_vigencia_hasta AS FECHA_VIGENCIA_HASTA, ct.pagador AS PAGADOR FROM creditopy.CARGOS_POR_TRANSAC_DIMO ct, creditopy.CARGOS_POR_TRANSAC_DIMO_RANGO cr, creditopy.SICOOP_LISTA_TRANSAC_MENSAJE m, creditopy.SICOOP_CODIGOS_DE_SERVICIO cs, creditopy.SICOOP_TIPO_CUENTA tco, creditopy.SICOOP_TIPO_CUENTA tcd, creditopy.IMPUESTOS i WHERE ct.codigo_ef_originante = decode(nvl(PI_CODIGO_EF, 0), 0, ct.codigo_ef_originante, PI_CODIGO_EF) AND (ct.codigo_ef_originante != 0 OR (nvl(PI_CODIGO_EF, 0) = 0 AND ct.codigo_ef_originante = 0 AND NOT EXISTS (SELECT 1 FROM creditopy.CARGOS_POR_TRANSAC_DIMO e WHERE e.codigo_ef_originante != 0 AND e.id_tran_mensaje = ct.id_tran_mensaje AND e.cargo_activo = 'S'))) AND m.id_tran_mensaje = ct.id_tran_mensaje AND m.tipo_cuenta_origen = decode(upper(nvl(PI_TIPO_CUENTA_ORIGEN, 'ALL')), 'ALL', m.tipo_cuenta_origen, PI_TIPO_CUENTA_ORIGEN) AND cr.id_cargo_tran = ct.id_cargo_tran -- solo se despliegan los cargos vigentes AND trunc(SYSDATE) BETWEEN ct.fecha_vigencia_desde AND ct.fecha_vigencia_hasta -- en la version 1 se liberan los cargos del originante -- se despliegan los cargos que sean cubiertos por el orginante o esten subsidiados AND ct.pagador IN ('ORIGINANTE', 'SUBSIDIADO') -- y tengan importe o porcentaje > 0 -- 11/05/2021 OOJEDA. Se comenta condicion para que los datos puedan ser retornados --and (cr.cargo_originante != 0 or cr.porcentaje_originante != 0) AND ct.cargo_activo = 'S' -- 11/05/2021 OOJEDA. Se agrega condicion de cargo activo AND cs.cod_servicio = m.cod_servicio AND tco.tipo_cuenta = m.tipo_cuenta_origen AND tcd.tipo_cuenta = m.tipo_cuenta_destino AND i.codigo_impuesto = ct.codigo_impuesto ORDER BY ct.descripcion_cargo, ct.id_cargo_tran, cr.id_cargo_tran_rango; po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END sp_CostosOperacionalesDimo; /* 19.2- Info. CARGO INDIVIDUAL APLICADOS A TXS DE DIMO */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 27/05/2020 Propósito: Procedimiento que devuelve un cursor con los datos del cargo que se aplica a la transacción. Si hay mas de una fila debe retornar error por duplicacion. Si hay no cargo parametrizado debe retonar el not found. ******************************************************************************************************/ /* PROCEDURE sp_CargoTxsDimo(PI_CANAL IN VARCHAR2, PI_TIPO_TRANSACCION IN VARCHAR2, PI_COD_SERVICIO IN VARCHAR2, PI_EF_ORIGINANTE IN NUMBER, PI_CUENTA_ORIGINANTE IN VARCHAR2, PI_TIPO_CUENTA_ORIGEN IN VARCHAR2, PI_EF_DESTINATARIO IN NUMBER, PI_CUENTA_DESTINATARIO IN VARCHAR2, PI_TIPO_CUENTA_DESTINO IN VARCHAR2, PI_MONTO_TRANSACCION IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS v_fecha_tran DATE; VR_CARGO_X_TR creditopy.Cargos_Por_Transac_Dimo%ROWTYPE; v_min_loop NUMBER := 3; v_max_loop NUMBER := 6; v_loop NUMBER; V_CANT_TRANSAC NUMBER := 0; CURSOR c_cargo(c_id_tran_men creditopy.Cargos_Por_Transac_Dimo.id_tran_mensaje%TYPE, c_canal creditopy.Cargos_Por_Transac_Dimo.canal%TYPE, c_ef_ori creditopy.Cargos_Por_Transac_Dimo.codigo_ef_originante%TYPE, c_emi_ori creditopy.Cargos_Por_Transac_Dimo.emisor_cabal_originante%TYPE, c_ef_dest creditopy.Cargos_Por_Transac_Dimo.codigo_ef_destinatario%TYPE, c_emi_dest creditopy.Cargos_Por_Transac_Dimo.emisor_cabal_destinatario%TYPE, c_fec_tran creditopy.Cargos_Por_Transac_Dimo.fecha_vigencia_desde%TYPE) IS SELECT id_cargo_tran FROM creditopy.Cargos_Por_Transac_Dimo a WHERE a.id_tran_mensaje = c_id_tran_men AND a.canal = c_canal AND a.codigo_ef_originante = c_ef_ori AND a.emisor_cabal_originante = c_emi_ori AND a.codigo_ef_destinatario = c_ef_dest AND a.emisor_cabal_destinatario = c_emi_dest AND a.cargo_activo = 'S' AND c_fec_tran BETWEEN a.fecha_vigencia_desde AND a.fecha_vigencia_hasta; v_costo_id NUMBER; V_COSTO_DESCRIPCION creditopy.Cargos_Por_Transac_Dimo.descripcion_cargo%TYPE := ' '; V_MONTO_CARGO_ORIGINANTE NUMBER := 0; V_MONTO_CARGO_DESTINATARIO NUMBER := 0; V_IVA NUMBER := 0; V_RUBRO NUMBER := 0; --Buscamos la cantidad de transacciones para el id_cargo en un periodo FUNCTION FN_GET_CANTIDAD_TRX(pi_id_cargo IN NUMBER) RETURN NUMBER IS V_CANT NUMBER := 0; BEGIN SELECT (CANTIDAD) CANT INTO V_CANT FROM ACUM_TRANSAC_CUENTA a WHERE A.PERIODO = to_char(V_FECHA_TRAN, 'yyyymm') AND A.CUENTA = PI_CUENTA_ORIGINANTE AND a.id_cargo_tran = pi_id_cargo; -- and a.tipo_operacion=PI_TIPO_TRANSACCION; RETURN V_CANT; EXCEPTION WHEN NO_DATA_FOUND THEN V_CANT := 0; RETURN V_CANT; WHEN OTHERS THEN --RAISE; V_CANT := 0; RETURN V_CANT; END FN_GET_CANTIDAD_TRX; FUNCTION fn_get_emisor_cabal(VN_TARJETA IN VARCHAR2) RETURN NUMBER IS vn_emisor NUMBER; BEGIN SELECT t.emisor INTO vn_emisor FROM creditopy.tarjetas t WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_CUENTA_ORIGINANTE); RETURN vn_emisor; EXCEPTION WHEN NO_DATA_FOUND THEN vn_emisor := 0; RETURN vn_emisor; WHEN OTHERS THEN RAISE; END fn_get_emisor_cabal; PROCEDURE buscar_un_id_cargo AS BEGIN OPEN c_cargo(VR_CARGO_X_TR.Id_Tran_Mensaje, VR_CARGO_X_TR.Canal, VR_CARGO_X_TR.Codigo_Ef_Originante, VR_CARGO_X_TR.Emisor_Cabal_Originante, VR_CARGO_X_TR.Codigo_Ef_Destinatario, VR_CARGO_X_TR.Emisor_Cabal_Destinatario, v_fecha_tran); LOOP FETCH c_cargo INTO v_costo_id; EXIT WHEN c_cargo%NOTFOUND; --dbms_output.put_line (v_costo_id); IF c_cargo%ROWCOUNT > 1 THEN raise_application_error(-20001, 'Cargo duplicado.'); END IF; END LOOP; CLOSE c_cargo; EXCEPTION WHEN OTHERS THEN RAISE; END buscar_un_id_cargo; BEGIN -- obtener el id_tran_mensaje de la transaccion BEGIN SELECT m.id_tran_mensaje INTO VR_CARGO_X_TR.Id_Tran_Mensaje FROM creditopy.Sicoop_Lista_Transac_Mensaje m WHERE m.tipo_transaccion = nvl(PI_TIPO_TRANSACCION, '-1') AND m.cod_servicio = nvl(PI_COD_SERVICIO, '-1') AND m.tipo_cuenta_origen = nvl(PI_TIPO_CUENTA_ORIGEN, '-1') AND m.tipo_cuenta_destino = nvl(PI_TIPO_CUENTA_DESTINO, '-1') AND m.disponible_para_cargo_tran = 1; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, 'Servicio no existe.'); END; --buscar el cargo para los datos especificos de participante/emisor v_fecha_tran := SYSDATE; VR_CARGO_X_TR.Canal := PI_CANAL; VR_CARGO_X_TR.Codigo_Ef_Originante := PI_EF_ORIGINANTE; VR_CARGO_X_TR.Codigo_Ef_Destinatario := PI_EF_DESTINATARIO; -- obtener el emisor_cabal de la cuenta originante y cuenta destinatario VR_CARGO_X_TR.Emisor_Cabal_Originante := fn_get_emisor_cabal(PI_CUENTA_ORIGINANTE); VR_CARGO_X_TR.Emisor_Cabal_Destinatario := fn_get_emisor_cabal(PI_CUENTA_DESTINATARIO); v_costo_id := 0; buscar_un_id_cargo; -- si no hay cargo para participante/emisor origen y destino espeficos se -- debe buscar el comodin que responda a los datos IF v_costo_id = 0 THEN v_loop := v_max_loop; WHILE v_costo_id = 0 LOOP CASE v_loop WHEN 6 THEN VR_CARGO_X_TR.Emisor_Cabal_Destinatario := 0; WHEN 5 THEN VR_CARGO_X_TR.Codigo_Ef_Destinatario := 0; WHEN 4 THEN VR_CARGO_X_TR.Emisor_Cabal_Originante := 0; WHEN 3 THEN VR_CARGO_X_TR.Codigo_Ef_Originante := 0; ELSE NULL; END CASE; buscar_un_id_cargo; v_loop := v_loop - 1; IF v_costo_id != 0 OR v_loop < v_min_loop THEN EXIT; END IF; END LOOP; END IF; IF v_costo_id != 0 THEN VR_CARGO_X_TR.Id_Cargo_Tran := v_costo_id; V_CANT_TRANSAC := FN_GET_CANTIDAD_TRX(V_COSTO_ID); SELECT -- ct.id_cargo_tran as COSTO_ID, m.desc_tran_mensaje AS COSTO_DESCRIPCION, CASE WHEN cr.tipo_cargo_originante = 'FEE' THEN cr.cargo_originante + decode(i.valor_impuesto, 0, 0, round((cr.cargo_originante * i.valor_impuesto / 100))) ELSE round(PI_MONTO_TRANSACCION * cr.porcentaje_originante / 100) + decode(i.valor_impuesto, 0, 0, round(round(PI_MONTO_TRANSACCION * cr.porcentaje_originante / 100) * i.valor_impuesto / 100)) END AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, i.valor_impuesto AS IVA, ct.rubro_cargo AS RUBRO INTO -- V_COSTO_ID, V_COSTO_DESCRIPCION, V_MONTO_CARGO_ORIGINANTE, V_MONTO_CARGO_DESTINATARIO, V_IVA, V_RUBRO FROM creditopy.CARGOS_POR_TRANSAC_DIMO ct, creditopy.CARGOS_POR_TRANSAC_DIMO_RANGO cr, creditopy.SICOOP_LISTA_TRANSAC_MENSAJE m, creditopy.IMPUESTOS i WHERE ct.id_cargo_tran = VR_CARGO_X_TR.Id_Cargo_Tran AND m.id_tran_mensaje = ct.id_tran_mensaje AND ct.pagador != 'SUBSIDIADO' AND cr.id_cargo_tran = ct.id_cargo_tran AND nvl(CT.CANTIDAD_EXONERADA, 0) <= V_CANT_TRANSAC AND PI_MONTO_TRANSACCION BETWEEN cr.rango_monto_desde AND cr.rango_monto_hasta AND i.codigo_impuesto = ct.codigo_impuesto; END IF; OPEN po_cursor FOR SELECT V_COSTO_ID AS COSTO_ID, V_COSTO_DESCRIPCION AS COSTO_DESCRIPCION, V_MONTO_CARGO_ORIGINANTE AS MONTO_CARGO_ORIGINANTE, V_MONTO_CARGO_DESTINATARIO AS MONTO_CARGO_DESTINATARIO, V_IVA AS IVA, V_RUBRO AS RUBRO FROM dual; PO_SQLCODE := SQLCODE; PO_SQLERRM := CASE WHEN v_costo_id = 0 THEN 'Sin cargo.' ELSE SQLERRM END; EXCEPTION WHEN NO_DATA_FOUND THEN OPEN po_cursor FOR SELECT V_COSTO_ID AS COSTO_ID, ' ' AS COSTO_DESCRIPCION, 0 AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, 0 AS IVA, 0 AS RUBRO FROM dual; PO_SQLCODE := 0; PO_SQLERRM := 'Sin cargo.'; WHEN OTHERS THEN OPEN po_cursor FOR SELECT 0 AS COSTO_ID, ' ' AS COSTO_DESCRIPCION, 0 AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, 0 AS IVA, 0 AS RUBRO FROM dual; PO_SQLCODE := 0; PO_SQLERRM := SQLERRM; END sp_CargoTxsDimo; */ PROCEDURE spBloqueoTarjetaPrepaga(PI_NUMERO_TARJETA IN VARCHAR2, PI_ORIGEN_PEDIDO IN NUMBER, -- 1-Usuario; 2-Entidad PI_MOTIVO_BLOQUEO IN NUMBER, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC IN VARCHAR2, PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_NEW_ESTADO NUMBER(4); VN_NEW_CLASE_DE_ESTADO NUMBER(4); VN_IS_BLOQ_USUARIO NUMBER(1); VN_BLOQ_USU_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 46; VN_BLOQ_USU_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 47; VN_BLOQ_ENT_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 50; VN_BLOQ_ENT_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 51; BEGIN --Datos DIMO PV_USUARIO := get_usuario; PV_USUARIO := NVL(PI_USUARIO_NOVEDAD, PV_USUARIO); --Datos de la Tarjeta VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Datos de la Solicitud CASE PI_ORIGEN_PEDIDO WHEN 1 THEN VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_BLOQUEO_USU_DIMO; VR_SOLICITUD.ID_ESTADO := VN_BLOQ_USU_OK; VN_IS_BLOQ_USUARIO := 1; WHEN 2 THEN VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_BLOQUEO_ENT_DIMO; VR_SOLICITUD.ID_ESTADO := VN_BLOQ_ENT_OK; VN_IS_BLOQ_USUARIO := 0; ELSE raise_application_error(-20001, 'USERS_ERROR: origen bloqueo is null.'); END CASE; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := PV_USUARIO; --PI_USUARIO_NOVEDAD; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); VR_DATOS.CODIGO_MOTIVO_BLOQUEO := PI_MOTIVO_BLOQUEO; VR_DATOS.OTROS_MOTIVOS_BLOQUEO := PI_OTROS_MOTIVO_DESC; --Datos del nuevo estado SELECT e.estado, e.clase_de_estado INTO VN_NEW_ESTADO, VN_NEW_CLASE_DE_ESTADO FROM creditopy.estados_ctas_tarj e WHERE e.estado = decode(VN_IS_BLOQ_USUARIO, 1, CC_ESTADO_BLOQ_USUARIO, CC_ESTADO_BLOQ_ENTIDAD); --Datos de la Novedad VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; VR_NOVEDAD_TARJETA.NUEVO_ESTADO := VN_NEW_ESTADO; VR_NOVEDAD_TARJETA.NOVFCHING := SYSDATE; --Utilizamos estos campos para controlar el nuevo estado VR_DATOS.PAIS := VN_NEW_ESTADO; VR_DATOS.CIUDAD := PI_ORIGEN_PEDIDO; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO IN (VN_BLOQ_USU_OK, VN_BLOQ_ENT_OK) AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_TARJETA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); -- se resguarda el estado IF VR_TARJETA.CLASE_DE_ESTADO != 11 AND VR_TARJETA.CLASE_DE_ESTADO != 5 THEN UPDATE TARJETAS T SET T.ORIGEN_ANULACION = T.ESTADO WHERE T.TARJETA = VR_TARJETA.TARJETA; END IF; -- actualizar el estado de TARJETAS UPDATE TARJETAS T SET T.ESTADO = VN_NEW_ESTADO, T.CLASE_DE_ESTADO = VN_NEW_CLASE_DE_ESTADO, T.FECHA_ESTADO = VR_NOVEDAD_TARJETA.NOVFCHING, T.ULT_ACTUALIZACION = VR_NOVEDAD_TARJETA.NOVFCHING, T.OPERADOR = SUBSTR(PV_USUARIO, 1, 8) --rpad(PI_USUARIO_NOVEDAD,8) WHERE T.TARJETA = VR_TARJETA.TARJETA; -- actualizar TARJETAS_PREPAGA solo si esta operativa o -- si es bloqueo de la entidad y esta bloqueada a pedido del usuario UPDATE TARJETAS_PREPAGA TP SET TP.ESTADO_PLASTICO = VN_NEW_ESTADO, TP.FECHA_ULT_ACTUALIZACION = VR_NOVEDAD_TARJETA.NOVFCHING WHERE TP.TARJETA = VR_TARJETA.TARJETA AND TP.FECHA_VIG_PLASTICO >= TRUNC(SYSDATE) AND (TP.ESTADO_PLASTICO = 1 OR (VN_NEW_ESTADO = 4 AND TP.ESTADO_PLASTICO = 5)); END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := CASE WHEN VN_IS_BLOQ_USUARIO = 1 THEN VN_BLOQ_USU_RECHA ELSE VN_BLOQ_ENT_RECHA END; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END spBloqueoTarjetaPrepaga; PROCEDURE spDesbTarUsuarioDIMO(PI_NUMERO_TARJETA IN VARCHAR2, PI_ENTIDAD_NOVEDAD IN NUMBER, -- entidad del usuario que procesa la novedad PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 24- Bloqueo y desbloqueo de tarjeta TC Adaptado del PKG_SICOOP_DIMO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 03/06/2020 */ /* Autor: Edgar Rojas. Fecha: 19/03/2020 Proposito: Operaciones DIMO - Desbloqueo. Bloqueo y desbloqueo de una tarjeta a solicitud del usuario. La novedad se ejecuta con el emisor y usuario recibido, por tanto se puede disponibilizar desde un endpoint especifico. Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 20-Bloqueo-Desbloqueo */ BEGIN -- FALTA VALIDAR LOS DATOS DE ENTRADA -- Limpiamos la tabla VR_HISTORICOS. VR_HISTORICOS.DELETE; -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); -- obtener datos de la tarjeta sp_get_tarjeta(FC_PAN2CRIPTO(PI_NUMERO_TARJETA), VR_TARJETA); -- obtener datos de la cuenta sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); --Obtener la numero de novedad. VR_NOVEDAD_CUENTA.NOVNRO := FN_GET_NRO_NOVEDAD; -- NP_NOVEDAD; VR_NOVEDAD_CUENTA.NOVTIP := 15; VR_NOVEDAD_CUENTA.NOVFCHING := SYSDATE; VR_NOVEDAD_CUENTA.NUMERO_CUENTA := NULL; VR_NOVEDAD_TARJETA.NOVTIP := 15; VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; --FC_PAN2CRIPTO(PI_NUMERO_TARJETA); --Datos constantes en el historico de Cuentas. Se asume que la tarjeta es titular. VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_HISTORICO.DESPLEGAR := 0; VR_HISTORICO.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_HISTORICO.NOVSEC := 1; VR_HISTORICO.NOVGEN := 2; VR_HISTORICO.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; --NP_RESPUESTA; VR_HISTORICO.NOVTIP := VR_NOVEDAD_CUENTA.NOVTIP; VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.NOVFCHING; VR_HISTORICO.OPCION := 'NovDesbloqueoAdmTarjetaHandler'; VR_HISTORICO.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_HISTORICO.TARJETA := VR_TARJETA.TARJETA; VR_HISTORICO.EMISOR := VR_TARJETA.EMISOR; VR_HISTORICO.TITULAR := CASE WHEN VR_TARJETA.COMPONENTE = 1 THEN 1 ELSE 2 END; VR_CUENTA.ESTADO := ESTADO_CT(VR_CUENTA.NUMERO_CUENTA, 'C'); --mantis#2672 VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_TARJETA.CLASE_DE_ESTADO := CC_BLOQUEO_USUARIO; VR_NOVEDAD_CUENTA.NOVNROSEC := 1; --NP_FORMULARIO; VR_NOVEDAD_CUENTA.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_NOVEDAD_CUENTA.BIN := SUBSTR(PI_NUMERO_TARJETA, 1, 6); -- asumio long de bin = 6 VR_NOVEDAD_CUENTA.PRODUCTO := 1; VR_NOVEDAD_CUENTA.EMISOR_CUENTA := VR_TARJETA.EMISOR; VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA := VR_TARJETA.SUCURSAL_EMISOR; VR_NOVEDAD_TARJETA.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; VR_NOVEDAD_TARJETA.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_NOVEDAD_TARJETA.NOVANUORG := NULL; VR_NOVEDAD_TARJETA.NOVMOTDEV := NULL; VR_NOVEDAD_TARJETA.NOVSEC := 1; VR_NOVEDAD_TARJETA.NOVNROSEC := VR_NOVEDAD_CUENTA.NOVNROSEC; VR_NOVEDAD_TARJETA.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_NOVEDAD_TARJETA.EMISOR_CUENTA := VR_NOVEDAD_CUENTA.EMISOR_CUENTA; VR_NOVEDAD_TARJETA.SUCURSAL_CUENTA := VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA; --Historico a nivel de Cuentas. VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; --#Estado de la Cuenta antes del Desbloqueo VR_HISTORICO.CAMPO := 'ESTADO_CUENTA'; VR_CUENTA.ESTADO := ESTADO_CT(VR_TARJETA.NUMERO_CUENTA, 'C'); VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := '(' || VR_CUENTA.ESTADO || ') ' || FC_GET_ESTADO(VR_CUENTA.ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Tarjeta antes del Desbloqueo VR_HISTORICO.CAMPO := 'ESTADO_TARJETA'; VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_HISTORICO.DATO_ANTERIOR := '(' || VR_TARJETA.ESTADO || ') ' || FC_GET_ESTADO(VR_TARJETA.ESTADO); VR_HISTORICO.DATO_POSTERIOR := '(' || VR_NOVEDAD_TARJETA.NUEVO_ESTADO || ') ' || FC_GET_ESTADO(VR_NOVEDAD_TARJETA.NUEVO_ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; VR_HISTORICO.TABLA := 'NOVEDADES_TARJETAS'; --#Origen del bloqueo Entidad o Usuario VR_HISTORICO.CAMPO := 'NOVANUORG'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := 'Usuario'; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Formulario VR_HISTORICO.CAMPO := 'NOVNROSEC'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_NOVEDAD_CUENTA.NOVNROSEC; --NP_FORMULARIO; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; --Para poder evaluar la novedad. VR_CUENTA.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_CUENTA.OPERADOR := TRIM(SUBSTR(UPPER(PI_USUARIO_NOVEDAD), 1, 8)); --TRIM(SUBSTR(UPPER(CP_USUARIO_ENTIDAD),1,8)); VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 1; INSERT INTO TARJETA_TMP (EMISOR, SUCURSAL_EMISOR, PRODUCTO, NUMERO_CUENTA, DOCUMENTO, TARJETA, ESTADO, FECHA_VIGENCIA --mantis#2672 , ESTADO_DE_COSTO, CLASE_DE_ESTADO) VALUES (VR_TARJETA.EMISOR, VR_TARJETA.SUCURSAL_EMISOR, VR_TARJETA.PRODUCTO, VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.DOCUMENTO, VR_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_TARJETA.FECHA_VIGENCIA, --mantis#2672 VR_TARJETA.ESTADO, VR_TARJETA.CLASE_DE_ESTADO); INSERT INTO CUENTA_TMP (EMISOR, OPERADOR) VALUES (VR_CUENTA.EMISOR, VR_CUENTA.OPERADOR); --Validar la Novedad SM.PR_VALIDAR_NOVEDAD(304, VR_NOVEDAD_CUENTA.NOVNRO, VR_NOVEDAD_CUENTA.NOVFCHING, VR_CUENTA.OPERADOR, --CP_USUARIO_ENTIDAD, VR_CUENTA.EMISOR); --NP_ENTIDAD_ID); --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_CUENTA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); VR_NOVEDAD_TARJETA.NUEVO_ESTADO := NULL; INSERT INTO NOVEDADES_CUENTAS@OLPY VALUES VR_NOVEDAD_CUENTA; INSERT INTO NOVEDADES_TARJETAS@OLPY VALUES VR_NOVEDAD_TARJETA; COMMIT; /* open po_cursor for select VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD from dual; */ po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; OPEN po_cursor FOR SELECT VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD, 0 AS ID_SOLICITUD, 0 AS CODIGO_RESPUESTA, ' ' AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; sp_rechazar_novedad; ROLLBACK; END; PROCEDURE spBloqTarUsuarioDimo(PI_NUMERO_TARJETA IN VARCHAR2, PI_MOTIVO_BLOQUEO IN NUMBER, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC IN VARCHAR2, PI_ENTIDAD_NOVEDAD IN NUMBER, -- entidad del usuario que procesa la novedad PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 24- SOLO Bloqueo de tarjeta TC por parte de Usuarios (hoy usan la aplicacion DIMO o HomeBanking de las entidades). Adaptado del PKG_SICOOP_DIMO. */ /* Autor: Edgar Rojas. Fecha: 06/01/2023 Proposito: Operaciones DIMO - Bloqueo. Bloqueo de una tarjeta a solicitud del usuario. La novedad se ejecuta con el emisor y usuario recibido, por tanto se puede disponibilizar desde un endpoint especifico. Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 20-Bloqueo-Desbloqueo */ BEGIN -- FALTA VALIDAR LOS DATOS DE ENTRADA -- Limpiamos la tabla VR_HISTORICOS. VR_HISTORICOS.DELETE; -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); -- obtener datos de la tarjeta sp_get_tarjeta(FC_PAN2CRIPTO(PI_NUMERO_TARJETA), VR_TARJETA); -- obtener datos de la cuenta sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); --Obtener la numero de novedad. VR_NOVEDAD_CUENTA.NOVNRO := FN_GET_NRO_NOVEDAD; VR_NOVEDAD_CUENTA.NOVTIP := 14; VR_NOVEDAD_CUENTA.NOVFCHING := SYSDATE; VR_NOVEDAD_CUENTA.NUMERO_CUENTA := NULL; VR_NOVEDAD_TARJETA.NOVTIP := 14; VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 5; VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; --FC_PAN2CRIPTO(PI_NUMERO_TARJETA); --Datos constantes en el historico de Cuentas. -- Se asume que la tarjeta es titular. VR_HISTORICO.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_HISTORICO.DESPLEGAR := 0; VR_HISTORICO.EMISOR := PI_ENTIDAD_NOVEDAD; --VR_TARJETA.EMISOR; VR_HISTORICO.NOVSEC := 1; VR_HISTORICO.NOVGEN := 2; VR_HISTORICO.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; --NP_RESPUESTA; VR_HISTORICO.NOVTIP := VR_NOVEDAD_CUENTA.NOVTIP; VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.NOVFCHING; VR_HISTORICO.OPCION := 'NovBloqueoAdmTarjetaHandler'; VR_HISTORICO.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_HISTORICO.TARJETA := VR_TARJETA.TARJETA; VR_HISTORICO.TITULAR := CASE WHEN VR_TARJETA.COMPONENTE = 1 THEN 1 ELSE 2 END; VR_NOVEDAD_CUENTA.NOVNROSEC := 1; --NP_FORMULARIO; VR_NOVEDAD_CUENTA.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_NOVEDAD_CUENTA.BIN := SUBSTR(PI_NUMERO_TARJETA, 1, 6); -- asumio long de bin = 6 VR_NOVEDAD_CUENTA.PRODUCTO := 1; VR_NOVEDAD_CUENTA.EMISOR_CUENTA := VR_TARJETA.EMISOR; VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA := VR_TARJETA.SUCURSAL_EMISOR; VR_NOVEDAD_TARJETA.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; VR_NOVEDAD_TARJETA.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_NOVEDAD_TARJETA.NOVANUORG := CC_BLOQUEO_USUARIO; VR_NOVEDAD_TARJETA.NOVMOTDEV := PI_MOTIVO_BLOQUEO; VR_NOVEDAD_TARJETA.NOVSEC := 1; VR_NOVEDAD_TARJETA.NOVNROSEC := VR_NOVEDAD_CUENTA.NOVNROSEC; VR_NOVEDAD_TARJETA.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_NOVEDAD_TARJETA.EMISOR_CUENTA := VR_NOVEDAD_CUENTA.EMISOR_CUENTA; VR_NOVEDAD_TARJETA.SUCURSAL_CUENTA := VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA; --Historico a nivel de Cuentas. VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; --#Formulario VR_HISTORICO.CAMPO := 'NOVNROSEC'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_NOVEDAD_CUENTA.NOVNROSEC; --NP_FORMULARIO; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Cuenta antes del Bloqueo VR_HISTORICO.CAMPO := 'ESTADO_CUENTA'; VR_CUENTA.ESTADO := ESTADO_CT(VR_TARJETA.NUMERO_CUENTA, 'C'); VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := '(' || VR_CUENTA.ESTADO || ') ' || fn_get_estado_desc(VR_CUENTA.ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Tarjeta antes del bloqueo VR_HISTORICO.CAMPO := 'ESTADO_TARJETA'; VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_HISTORICO.DATO_ANTERIOR := '(' || VR_TARJETA.ESTADO || ') ' || fn_get_estado_desc(VR_TARJETA.ESTADO); VR_HISTORICO.DATO_POSTERIOR := '(' || VR_NOVEDAD_TARJETA.NUEVO_ESTADO || ') ' || fn_get_estado_desc(VR_NOVEDAD_TARJETA.NUEVO_ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Historico a nivel de Tarjetas. VR_HISTORICO.TABLA := 'NOVEDADES_TARJETAS'; --#Origen del bloqueo Entidad o Usuario VR_HISTORICO.CAMPO := 'NOVANUORG'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := 'Usuario'; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Motivo del bloqueo. VR_HISTORICO.CAMPO := 'NOVMOTDEV'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := fn_get_motivo_bloqueo(PI_MOTIVO_BLOQUEO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; IF PI_OTROS_MOTIVO_DESC IS NOT NULL THEN --#Motivo del bloqueo. VR_HISTORICO.CAMPO := 'OTROMOTIVO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := PI_OTROS_MOTIVO_DESC; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; END IF; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; --Cuando el usuario bloquea, solo bloquea su tarjeta VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 5; --Para poder evaluar la novedad. VR_CUENTA.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_CUENTA.OPERADOR := TRIM(SUBSTR(UPPER(PI_USUARIO_NOVEDAD), 1, 8)); --TRIM(SUBSTR(UPPER(CP_USUARIO_ENTIDAD),1,8)); INSERT INTO TARJETA_TMP (EMISOR, NUMERO_CUENTA, TARJETA, ESTADO, FECHA_VIGENCIA) VALUES (VR_TARJETA.EMISOR, VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_TARJETA.FECHA_VIGENCIA); INSERT INTO CUENTA_TMP (EMISOR, OPERADOR) VALUES (VR_CUENTA.EMISOR, VR_CUENTA.OPERADOR); --Validar la Novedad SM.PR_VALIDAR_NOVEDAD(305, VR_NOVEDAD_CUENTA.NOVNRO, VR_NOVEDAD_CUENTA.NOVFCHING, VR_CUENTA.OPERADOR, --CP_USUARIO_ENTIDAD, VR_CUENTA.EMISOR); -- NP_ENTIDAD_ID); --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_CUENTA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); --Registramos la novedad para procesarse en el Batch. INSERT INTO NOVEDADES_CUENTAS@OLPY VALUES VR_NOVEDAD_CUENTA; INSERT INTO NOVEDADES_TARJETAS@OLPY VALUES VR_NOVEDAD_TARJETA; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; COMMIT; /* open po_cursor for select VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD from dual; PO_SQLCODE := sqlcode; PO_SQLERRM := sqlerrm; */ po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; OPEN po_cursor FOR SELECT VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD, 0 AS ID_SOLICITUD, 0 AS CODIGO_RESPUESTA, ' ' AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; sp_rechazar_novedad; ROLLBACK; END; PROCEDURE spDesbloqueoTarjetaPrepaga(PI_NUMERO_TARJETA IN VARCHAR2, PI_ORIGEN_PEDIDO IN NUMBER, -- 1-Usuario; 2-Entidad PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS VR_SOLICITUD SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS SOLICITUDES_DATOS%ROWTYPE; VC_TARJETA VARCHAR2(19); VN_NEW_ESTADO NUMBER(4); VN_NEW_CLASE_DE_ESTADO NUMBER(4); VN_NEW_ESTADO_FISICA NUMBER(4); VN_IS_DBLOQ_USUARIO NUMBER(1); VN_DBLOQ_USU_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 48; VN_DBLOQ_USU_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 49; VN_DBLOQ_ENT_OK SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 52; VN_DBLOQ_ENT_RECHA SOLICITUDES_RECIBIDAS.ID_ESTADO%TYPE := 53; BEGIN --Datos DIMO PV_USUARIO := get_usuario; PV_USUARIO := NVL(PI_USUARIO_NOVEDAD, PV_USUARIO); --Datos de la Tarjeta VC_TARJETA := FC_PAN2CRIPTO(PI_NUMERO_TARJETA); -- obtener datos de la tarjeta VR_TARJETA := NULL; VR_TARJETAS_PREPAGA := NULL; sp_get_tarjeta(VC_TARJETA, VR_TARJETA); sp_get_tarjeta_prepaga(VC_TARJETA, VR_TARJETAS_PREPAGA); -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); --Datos de la Solicitud CASE PI_ORIGEN_PEDIDO WHEN 1 THEN VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_DESBLOQ_USU_DIMO; VR_SOLICITUD.ID_ESTADO := VN_DBLOQ_USU_OK; VN_IS_DBLOQ_USUARIO := 1; WHEN 2 THEN VR_SOLICITUD.ID_SOLICITUD := SOLICITUD_DESBLOQ_ENT_DIMO; VR_SOLICITUD.ID_ESTADO := VN_DBLOQ_ENT_OK; VN_IS_DBLOQ_USUARIO := 0; ELSE raise_application_error(-20001, 'USERS_ERROR: origen desbloqueo is null.'); END CASE; VR_SOLICITUD.TARJETA := PI_NUMERO_TARJETA; VR_SOLICITUD.USUARIO := PV_USUARIO; --PI_USUARIO_NOVEDAD; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(VR_TARJETA.DOCUMENTO, 4, 12)); --Datos del nuevo estado IF VR_TARJETA.FECHA_VIGENCIA < TRUNC(SYSDATE) THEN -- vencio la tarjeta virtual VN_NEW_ESTADO := 8; ELSE VN_NEW_ESTADO := VR_TARJETA.ORIGEN_ANULACION; VR_TARJETA.ORIGEN_ANULACION := 0; END IF; SELECT e.clase_de_estado INTO VN_NEW_CLASE_DE_ESTADO FROM creditopy.estados_ctas_tarj e WHERE e.estado = VN_NEW_ESTADO; IF VR_TARJETAS_PREPAGA.FECHA_VIG_PLASTICO >= TRUNC(SYSDATE) THEN IF VR_TARJETAS_PREPAGA.ESTADO_PLASTICO = 5 THEN VN_NEW_ESTADO_FISICA := VN_NEW_ESTADO; ELSE IF VN_IS_DBLOQ_USUARIO = 1 THEN VN_NEW_ESTADO_FISICA := VR_TARJETAS_PREPAGA.ESTADO_PLASTICO; ELSE VN_NEW_ESTADO_FISICA := VN_NEW_ESTADO; END IF; END IF; ELSE IF VR_TARJETAS_PREPAGA.ESTADO_PLASTICO = 5 THEN VN_NEW_ESTADO_FISICA := 8; ELSE VN_NEW_ESTADO_FISICA := VR_TARJETAS_PREPAGA.ESTADO_PLASTICO; END IF; END IF; --Datos de la Novedad VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; VR_NOVEDAD_TARJETA.NUEVO_ESTADO := VN_NEW_ESTADO; VR_NOVEDAD_TARJETA.NOVFCHING := SYSDATE; --Utilizamos estos campos para controlar el nuevo estado --VR_DATOS.PAIS := PI_ORIGEN_PEDIDO; VR_DATOS.PAIS := VN_NEW_ESTADO; VR_DATOS.CIUDAD := PI_ORIGEN_PEDIDO; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); IF VR_SOLICITUD.ID_ESTADO IN (VN_DBLOQ_USU_OK, VN_DBLOQ_ENT_OK) AND VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_TARJETA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); -- actualizar el estado de TARJETAS UPDATE TARJETAS T SET T.ESTADO = VN_NEW_ESTADO, T.CLASE_DE_ESTADO = VN_NEW_CLASE_DE_ESTADO, T.FECHA_ESTADO = VR_NOVEDAD_TARJETA.NOVFCHING, T.ORIGEN_ANULACION = VR_TARJETA.ORIGEN_ANULACION, T.ULT_ACTUALIZACION = VR_NOVEDAD_TARJETA.NOVFCHING, T.OPERADOR = SUBSTR(PV_USUARIO, 1, 8) --rpad(PI_USUARIO_NOVEDAD,8) WHERE T.TARJETA = VR_TARJETA.TARJETA; -- actualizar TARJETAS_PREPAGA vigente, solo si fue impresa y activada UPDATE TARJETAS_PREPAGA TP SET TP.ESTADO_PLASTICO = VN_NEW_ESTADO_FISICA, TP.FECHA_ULT_ACTUALIZACION = VR_NOVEDAD_TARJETA.NOVFCHING WHERE TP.TARJETA = VR_TARJETA.TARJETA AND TP.FECHA_VIG_PLASTICO >= TRUNC(SYSDATE) AND TP.ESTADO_PLASTICO NOT IN (0, 9); END IF; COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA != 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := fn_get_ult_rechazo_solicitud(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.CODIGO_RESPUESTA); ELSE po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, 0, nvl(VR_SOLICITUD.NOVEDAD, 0)) AS CODIGO_NOVEDAD, VR_SOLICITUD.ID_SOLICITUD_RECIBIDA AS ID_SOLICITUD, VR_SOLICITUD.CODIGO_RESPUESTA AS CODIGO_RESPUESTA, decode(VR_SOLICITUD.CODIGO_RESPUESTA, 0, ' ', PO_SQLERRM) AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; IF VR_SOLICITUD.ID_SOLICITUD_RECIBIDA IS NOT NULL THEN VR_SOLICITUD.ID_ESTADO := CASE WHEN VN_IS_DBLOQ_USUARIO = 1 THEN VN_DBLOQ_USU_RECHA ELSE VN_DBLOQ_ENT_RECHA END; PR_ADM_ERROR_SOLICITUD(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, VR_SOLICITUD.ID_ESTADO, SQLCODE, SQLERRM); END IF; ROLLBACK; OPEN po_cursor FOR SELECT nvl(VR_NOVEDAD_CUENTA.NOVNRO, 0) AS CODIGO_NOVEDAD, nvl(VR_SOLICITUD.ID_SOLICITUD_RECIBIDA, 0) AS ID_SOLICITUD, po_sqlcode AS CODIGO_RESPUESTA, po_sqlerrm AS GLOSA_RESPUESTA FROM dual; END spDesbloqueoTarjetaPrepaga; PROCEDURE sp_bloqueoDesbloqueoDIMO(PI_TIPO_OPERACION IN NUMBER, -- Bandera para saber si la operacion es 1-bloquear, 2-desbloquear. PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de tarjeta PI_ORIGEN_PEDIDO IN NUMBER, -- 1- Decisión del usuario 2- Decisión de la Entidad PI_MOTIVO_PEDIDO IN NUMBER, -- Codigo del motivo del pedido - REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC IN VARCHAR2, -- Descripcion de motivo otros PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS vn_emisor creditopy.tarjetas.emisor%TYPE; /* 20- Bloqueo y desbloqueo de tarjeta DIMO */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 23/06/2020 Propósito: Procedimiento que permite bloquear/desbloquear una tarjeta DIMO a pedido del usuario. El procedimiento puede ser invocado para el bloqueo a solicitud de la entidad. ****************************************************************************************************/ BEGIN -- obtener datos DIMO PV_USUARIO := get_usuario; -- validar parametros de entrada no nulos IF PI_NUMERO_TARJETA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); ELSE -- validar que el emisor de la tarjeta sea un emisor PREPAGO BEGIN SELECT t.emisor INTO vn_emisor FROM creditopy.tarjetas t WHERE t.tarjeta = fc_pan2cripto(PI_NUMERO_TARJETA); IF creditopy.pkg_dimo_ceibo.fn_is_prepaga(vn_emisor) = 0 THEN raise_application_error(-20001, 'USERS_ERROR: la tarjeta no es prepaga.'); END IF; EXCEPTION WHEN OTHERS THEN RAISE; END; END IF; IF NVL(PI_ORIGEN_PEDIDO, 0) != 1 AND NVL(PI_ORIGEN_PEDIDO, 0) != 2 THEN raise_application_error(-20001, 'USERS_ERROR: origen pedido invalid.'); END IF; IF NVL(PI_MOTIVO_PEDIDO, 0) = 0 THEN IF nvl(PI_TIPO_OPERACION, 0) = 1 THEN raise_application_error(-20001, 'USERS_ERROR: motivo pedido invalid.'); END IF; END IF; -- bloqueo/desbloqueo CASE nvl(PI_TIPO_OPERACION, 0) WHEN 1 THEN spBloqueoTarjetaPrepaga(PI_NUMERO_TARJETA, PI_ORIGEN_PEDIDO, -- 1-Usuario; 2-Entidad PI_MOTIVO_PEDIDO, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC, PV_USUARIO, --CC_USUARIO_DIMO, PO_SQLCODE, PO_SQLERRM, po_cursor); WHEN 2 THEN spDesbloqueoTarjetaPrepaga(PI_NUMERO_TARJETA, PI_ORIGEN_PEDIDO, -- 1-Usuario; 2-Entidad PV_USUARIO, --CC_USUARIO_DIMO, PO_SQLCODE, PO_SQLERRM, po_cursor); ELSE RAISE_APPLICATION_ERROR(-20001, 'USERS_ERROR: operacion not valid.'); END CASE; IF PO_SQLCODE != 0 THEN PO_SQLCODE := -1; END IF; EXCEPTION WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; END sp_bloqueoDesbloqueoDIMO; PROCEDURE sp_motivosBloqueoDevoluc(PI_ORIGEN_PEDIDO IN NUMBER, -- 1- Decisión del usuario 2- Decisión de la Entidad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 20.1- Motivos de Bloqueo y devolucion */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 23/06/2020 Propósito: Procedimiento lista los motivos de bloqueo y devolucion de tarjetas. Permite compatibilizar la carga de motivos respetando la tabla utilizada por las tarjetas de credito. ****************************************************************************************************/ BEGIN IF PI_ORIGEN_PEDIDO IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: origen is null.'); ELSE IF PI_ORIGEN_PEDIDO NOT IN (1, 2) THEN raise_application_error(-20001, 'USERS_ERROR: valor de origen incorrecto.'); END IF; END IF; OPEN po_cursor FOR SELECT m.id_motivo AS id_motivo, m.devcod AS motivo_pedido, m.descripcion AS desc_motivo, m.origen_pedido AS origen_pedido, m.cargar_glosa AS flg_cargar_glosa FROM creditopy.Motivos_Bloqueo_Devoluc m WHERE m.origen_pedido = decode(PI_ORIGEN_PEDIDO, 1, 1, m.origen_pedido) ORDER BY m.id_motivo; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_motivosBloqueoDevoluc; PROCEDURE spBloqueoTarjeta(PI_NUMERO_TARJETA IN VARCHAR2, PI_ORIGEN_PEDIDO IN NUMBER, -- 1-Usuario; 2-Entidad PI_MOTIVO_BLOQUEO IN NUMBER, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC IN VARCHAR2, PI_ENTIDAD_NOVEDAD IN NUMBER, -- entidad del usuario que procesa la novedad PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 24- Bloqueo y desbloqueo de tarjeta TC Adaptado del PKG_SICOOP_DIMO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 29/05/2020 */ /* Autor: Edgar Rojas. Fecha: 19/03/2020 Proposito: Operaciones DIMO - Bloqueo. Bloqueo y desbloqueo de una tarjeta a solicitud del usuario. La novedad se ejecuta con el emisor y usuario recibido, por tanto se puede disponibilizar desde un endpoint especifico. Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 20-Bloqueo-Desbloqueo */ BEGIN -- FALTA VALIDAR LOS DATOS DE ENTRADA -- Limpiamos la tabla VR_HISTORICOS. VR_HISTORICOS.DELETE; -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); -- obtener datos de la tarjeta sp_get_tarjeta(FC_PAN2CRIPTO(PI_NUMERO_TARJETA), VR_TARJETA); -- obtener datos de la cuenta sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); --Obtener la numero de novedad. VR_NOVEDAD_CUENTA.NOVNRO := FN_GET_NRO_NOVEDAD; VR_NOVEDAD_CUENTA.NOVTIP := 14; VR_NOVEDAD_CUENTA.NOVFCHING := SYSDATE; VR_NOVEDAD_CUENTA.NUMERO_CUENTA := NULL; VR_NOVEDAD_TARJETA.NOVTIP := 14; IF PI_ORIGEN_PEDIDO = 1 THEN VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 5; ELSE VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 4; END IF; VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; --FC_PAN2CRIPTO(PI_NUMERO_TARJETA); --Datos constantes en el historico de Cuentas. -- Se asume que la tarjeta es titular. VR_HISTORICO.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_HISTORICO.DESPLEGAR := 0; VR_HISTORICO.EMISOR := PI_ENTIDAD_NOVEDAD; --VR_TARJETA.EMISOR; VR_HISTORICO.NOVSEC := 1; VR_HISTORICO.NOVGEN := 2; VR_HISTORICO.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; --NP_RESPUESTA; VR_HISTORICO.NOVTIP := VR_NOVEDAD_CUENTA.NOVTIP; VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.NOVFCHING; VR_HISTORICO.OPCION := 'NovBloqueoAdmTarjetaHandler'; VR_HISTORICO.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_HISTORICO.TARJETA := VR_TARJETA.TARJETA; VR_HISTORICO.TITULAR := CASE WHEN VR_TARJETA.COMPONENTE = 1 THEN 1 ELSE 2 END; VR_NOVEDAD_CUENTA.NOVNROSEC := 1; --NP_FORMULARIO; VR_NOVEDAD_CUENTA.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_NOVEDAD_CUENTA.BIN := SUBSTR(PI_NUMERO_TARJETA, 1, 6); -- asumio long de bin = 6 VR_NOVEDAD_CUENTA.PRODUCTO := 1; VR_NOVEDAD_CUENTA.EMISOR_CUENTA := VR_TARJETA.EMISOR; VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA := VR_TARJETA.SUCURSAL_EMISOR; VR_NOVEDAD_TARJETA.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; VR_NOVEDAD_TARJETA.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_NOVEDAD_TARJETA.NOVANUORG := PI_ORIGEN_PEDIDO; VR_NOVEDAD_TARJETA.NOVMOTDEV := PI_MOTIVO_BLOQUEO; VR_NOVEDAD_TARJETA.NOVSEC := 1; VR_NOVEDAD_TARJETA.NOVNROSEC := VR_NOVEDAD_CUENTA.NOVNROSEC; VR_NOVEDAD_TARJETA.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_NOVEDAD_TARJETA.EMISOR_CUENTA := VR_NOVEDAD_CUENTA.EMISOR_CUENTA; VR_NOVEDAD_TARJETA.SUCURSAL_CUENTA := VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA; --Historico a nivel de Cuentas. VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; --#Formulario VR_HISTORICO.CAMPO := 'NOVNROSEC'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_NOVEDAD_CUENTA.NOVNROSEC; --NP_FORMULARIO; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Cuenta antes del Bloqueo VR_HISTORICO.CAMPO := 'ESTADO_CUENTA'; VR_CUENTA.ESTADO := ESTADO_CT(VR_TARJETA.NUMERO_CUENTA, 'C'); VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := '(' || VR_CUENTA.ESTADO || ') ' || fn_get_estado_desc(VR_CUENTA.ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Tarjeta antes del bloqueo VR_HISTORICO.CAMPO := 'ESTADO_TARJETA'; VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_HISTORICO.DATO_ANTERIOR := '(' || VR_TARJETA.ESTADO || ') ' || fn_get_estado_desc(VR_TARJETA.ESTADO); VR_HISTORICO.DATO_POSTERIOR := '(' || VR_NOVEDAD_TARJETA.NUEVO_ESTADO || ') ' || fn_get_estado_desc(VR_NOVEDAD_TARJETA.NUEVO_ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --Historico a nivel de Tarjetas. VR_HISTORICO.TABLA := 'NOVEDADES_TARJETAS'; --#Origen del bloqueo Entidad o Usuario VR_HISTORICO.CAMPO := 'NOVANUORG'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := CASE PI_ORIGEN_PEDIDO WHEN 1 THEN 'Usuario' WHEN 2 THEN 'Emisor' ELSE 'No determinado' END; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Motivo del bloqueo. VR_HISTORICO.CAMPO := 'NOVMOTDEV'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := fn_get_motivo_bloqueo(PI_MOTIVO_BLOQUEO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; IF PI_OTROS_MOTIVO_DESC IS NOT NULL THEN --#Motivo del bloqueo. VR_HISTORICO.CAMPO := 'OTROMOTIVO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := PI_OTROS_MOTIVO_DESC; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; END IF; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; --Para poder evaluar la novedad. VR_CUENTA.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_CUENTA.OPERADOR := TRIM(SUBSTR(UPPER(PI_USUARIO_NOVEDAD), 1, 8)); --TRIM(SUBSTR(UPPER(CP_USUARIO_ENTIDAD),1,8)); INSERT INTO TARJETA_TMP (EMISOR, NUMERO_CUENTA, TARJETA, ESTADO, FECHA_VIGENCIA) VALUES (VR_TARJETA.EMISOR, VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_TARJETA.FECHA_VIGENCIA); INSERT INTO CUENTA_TMP (EMISOR, OPERADOR) VALUES (VR_CUENTA.EMISOR, VR_CUENTA.OPERADOR); --Validar la Novedad SM.PR_VALIDAR_NOVEDAD(301, VR_NOVEDAD_CUENTA.NOVNRO, VR_NOVEDAD_CUENTA.NOVFCHING, VR_CUENTA.OPERADOR, --CP_USUARIO_ENTIDAD, VR_CUENTA.EMISOR); -- NP_ENTIDAD_ID); --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_CUENTA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); --Registramos la novedad para procesarse en el Batch. INSERT INTO NOVEDADES_CUENTAS@OLPY VALUES VR_NOVEDAD_CUENTA; INSERT INTO NOVEDADES_TARJETAS@OLPY VALUES VR_NOVEDAD_TARJETA; --Procedemos a Bloquear las demas Tarjetas -- Solo si es la Principal, se bloquean todas las demas tarjetas Operativas de la Cuenta. IF FC_TJTP(VR_TARJETA.NUMERO_CUENTA) = VR_TARJETA.TARJETA AND VR_NOVEDAD_TARJETA.NUEVO_ESTADO = 4 THEN FOR TARJETAS_OPERATIVAS IN (SELECT FC_CRIPTO2PAN(T.TARJETA) TARJETA, T.NOMBRE_PARA_PLASTICO NOMBRE_PLASTICO, ESTADO_CT(T.TARJETA, 'T') ESTADO_OL, T.TARJETA CRIPTO FROM TARJETAS T WHERE T.NUMERO_CUENTA = VR_TARJETA.NUMERO_CUENTA AND T.FECHA_VIGENCIA > SYSDATE AND 1 = CASE WHEN T.TARJETA = VR_TARJETA.TARJETA THEN 0 ELSE 1 END ) LOOP IF TARJETAS_OPERATIVAS.ESTADO_OL IN (0, 1, 5, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69) THEN --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (TARJETAS_OPERATIVAS.CRIPTO, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_CUENTA.NOVFCHING, CREDITOPY.SEQ_ESTADOS.NEXTVAL@OLPY); --#Tarjetas Operativas de la Cuenta Bloqueadas por Bloqueo de la Principal. VR_HISTORICO.CAMPO := 'ADIC_BLOQUEADAS'; VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := TARJETAS_OPERATIVAS.TARJETA || ' (' || VR_TARJETA.ESTADO || ') ' || FC_GET_ESTADO(VR_TARJETA.ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Nombres de Plastico de Tarjetas Operativas de la Cuenta Bloqueadas por Bloqueo de la Principal. VR_HISTORICO.CAMPO := 'NOMBRE_PLASTICO'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := TARJETAS_OPERATIVAS.NOMBRE_PLASTICO; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; END IF; END LOOP; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; END IF; COMMIT; /* open po_cursor for select VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD from dual; PO_SQLCODE := sqlcode; PO_SQLERRM := sqlerrm; */ po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; OPEN po_cursor FOR SELECT VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD, 0 AS ID_SOLICITUD, 0 AS CODIGO_RESPUESTA, ' ' AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; sp_rechazar_novedad; ROLLBACK; END spBloqueoTarjeta; PROCEDURE spDesbloqueoTarjeta(PI_NUMERO_TARJETA IN VARCHAR2, PI_ORIGEN_PEDIDO IN NUMBER, -- 1-Usuario; 2-Entidad PI_ENTIDAD_NOVEDAD IN NUMBER, -- entidad del usuario que procesa la novedad PI_USUARIO_NOVEDAD IN VARCHAR2, -- usuario que procesa la novedad PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 24- Bloqueo y desbloqueo de tarjeta TC Adaptado del PKG_SICOOP_DIMO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 03/06/2020 */ /* Autor: Edgar Rojas. Fecha: 19/03/2020 Proposito: Operaciones DIMO - Desbloqueo. Bloqueo y desbloqueo de una tarjeta a solicitud del usuario. La novedad se ejecuta con el emisor y usuario recibido, por tanto se puede disponibilizar desde un endpoint especifico. Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 20-Bloqueo-Desbloqueo */ BEGIN -- FALTA VALIDAR LOS DATOS DE ENTRADA -- Limpiamos la tabla VR_HISTORICOS. VR_HISTORICOS.DELETE; -- Inicializar registros de novedades. sp_InitNovedades(VR_NOVEDAD_CUENTA, VR_NOVEDAD_TARJETA); -- obtener datos de la tarjeta sp_get_tarjeta(FC_PAN2CRIPTO(PI_NUMERO_TARJETA), VR_TARJETA); -- obtener datos de la cuenta sp_get_cuenta(VR_TARJETA.NUMERO_CUENTA, VR_CUENTA); --Obtener la numero de novedad. VR_NOVEDAD_CUENTA.NOVNRO := FN_GET_NRO_NOVEDAD; -- NP_NOVEDAD; VR_NOVEDAD_CUENTA.NOVTIP := 15; VR_NOVEDAD_CUENTA.NOVFCHING := SYSDATE; VR_NOVEDAD_CUENTA.NUMERO_CUENTA := NULL; VR_NOVEDAD_TARJETA.NOVTIP := 15; VR_NOVEDAD_TARJETA.TARJETA := VR_TARJETA.TARJETA; --FC_PAN2CRIPTO(PI_NUMERO_TARJETA); --Datos constantes en el historico de Cuentas. Se asume que la tarjeta es titular. VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_HISTORICO.DESPLEGAR := 0; VR_HISTORICO.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_HISTORICO.NOVSEC := 1; VR_HISTORICO.NOVGEN := 2; VR_HISTORICO.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; --NP_RESPUESTA; VR_HISTORICO.NOVTIP := VR_NOVEDAD_CUENTA.NOVTIP; VR_HISTORICO.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_HISTORICO.FECHA_REGISTRO := VR_HISTORICO.NOVFCHING; VR_HISTORICO.OPCION := 'NovDesbloqueoAdmTarjetaHandler'; VR_HISTORICO.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_HISTORICO.TARJETA := VR_TARJETA.TARJETA; VR_HISTORICO.EMISOR := VR_TARJETA.EMISOR; VR_HISTORICO.TITULAR := CASE WHEN VR_TARJETA.COMPONENTE = 1 THEN 1 ELSE 2 END; VR_CUENTA.ESTADO := ESTADO_CT(VR_CUENTA.NUMERO_CUENTA, 'C'); --mantis#2672 VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_TARJETA.CLASE_DE_ESTADO := PI_ORIGEN_PEDIDO; --Evaluar el nuevo estado de la Tarjeta si se Desbloquea ----Debemos registrar en el Historico. IF VR_CUENTA.ESTADO = 1 THEN IF VR_TARJETA.FECHA_VIGENCIA > SYSDATE THEN IF ESTADO_CT(VR_TARJETA.TARJETA, 'T') = VR_TARJETA.ESTADO THEN VR_NOVEDAD_TARJETA.NUEVO_ESTADO := CASE WHEN VR_TARJETA.ORIGEN_ANULACION = 0 THEN 0 ELSE VR_CUENTA.ESTADO END; ELSE VR_NOVEDAD_TARJETA.NUEVO_ESTADO := VR_TARJETA.ESTADO; END IF; ELSE VR_NOVEDAD_TARJETA.NUEVO_ESTADO := 8; END IF; ELSE VR_NOVEDAD_TARJETA.NUEVO_ESTADO := VR_CUENTA.ESTADO; END IF; VR_NOVEDAD_CUENTA.NOVNROSEC := 1; --NP_FORMULARIO; VR_NOVEDAD_CUENTA.USUARIO := PI_USUARIO_NOVEDAD; --CP_USUARIO_ENTIDAD; VR_NOVEDAD_CUENTA.BIN := SUBSTR(PI_NUMERO_TARJETA, 1, 6); -- asumio long de bin = 6 VR_NOVEDAD_CUENTA.PRODUCTO := 1; VR_NOVEDAD_CUENTA.EMISOR_CUENTA := VR_TARJETA.EMISOR; VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA := VR_TARJETA.SUCURSAL_EMISOR; VR_NOVEDAD_TARJETA.NOVNRO := VR_NOVEDAD_CUENTA.NOVNRO; VR_NOVEDAD_TARJETA.NOVFCHING := VR_NOVEDAD_CUENTA.NOVFCHING; VR_NOVEDAD_TARJETA.NOVANUORG := NULL; VR_NOVEDAD_TARJETA.NOVMOTDEV := NULL; VR_NOVEDAD_TARJETA.NOVSEC := 1; VR_NOVEDAD_TARJETA.NOVNROSEC := VR_NOVEDAD_CUENTA.NOVNROSEC; VR_NOVEDAD_TARJETA.NUMERO_CUENTA := VR_TARJETA.NUMERO_CUENTA; VR_NOVEDAD_TARJETA.EMISOR_CUENTA := VR_NOVEDAD_CUENTA.EMISOR_CUENTA; VR_NOVEDAD_TARJETA.SUCURSAL_CUENTA := VR_NOVEDAD_CUENTA.SUCURSAL_CUENTA; --Historico a nivel de Cuentas. VR_HISTORICO.TABLA := 'NOVEDADES_CUENTAS'; --#Estado de la Cuenta antes del Desbloqueo VR_HISTORICO.CAMPO := 'ESTADO_CUENTA'; VR_CUENTA.ESTADO := ESTADO_CT(VR_TARJETA.NUMERO_CUENTA, 'C'); VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := '(' || VR_CUENTA.ESTADO || ') ' || FC_GET_ESTADO(VR_CUENTA.ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Estado de la Tarjeta antes del Desbloqueo VR_HISTORICO.CAMPO := 'ESTADO_TARJETA'; VR_TARJETA.ESTADO := ESTADO_CT(VR_TARJETA.TARJETA, 'T'); VR_HISTORICO.DATO_ANTERIOR := '(' || VR_TARJETA.ESTADO || ') ' || FC_GET_ESTADO(VR_TARJETA.ESTADO); VR_HISTORICO.DATO_POSTERIOR := '(' || VR_NOVEDAD_TARJETA.NUEVO_ESTADO || ') ' || FC_GET_ESTADO(VR_NOVEDAD_TARJETA.NUEVO_ESTADO); --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; VR_HISTORICO.TABLA := 'NOVEDADES_TARJETAS'; --#Origen del bloqueo Entidad o Usuario VR_HISTORICO.CAMPO := 'NOVANUORG'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := CASE PI_ORIGEN_PEDIDO WHEN 1 THEN 'Usuario' WHEN 2 THEN 'Emisor' ELSE 'No determinado' END; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; --#Formulario VR_HISTORICO.CAMPO := 'NOVNROSEC'; VR_HISTORICO.DATO_ANTERIOR := ' '; VR_HISTORICO.DATO_POSTERIOR := VR_NOVEDAD_CUENTA.NOVNROSEC; --NP_FORMULARIO; --Agregamos a la tabla de historicos. VR_HISTORICOS(VR_HISTORICOS.COUNT + 1) := VR_HISTORICO; sp_resguarda_datos_historico; sp_registrar_hist_novedad; VR_HISTORICO := VC_HISTORICO; --Para poder evaluar la novedad. VR_CUENTA.EMISOR := PI_ENTIDAD_NOVEDAD; --NP_ENTIDAD_ID; VR_CUENTA.OPERADOR := TRIM(SUBSTR(UPPER(PI_USUARIO_NOVEDAD), 1, 8)); --TRIM(SUBSTR(UPPER(CP_USUARIO_ENTIDAD),1,8)); INSERT INTO TARJETA_TMP (EMISOR, SUCURSAL_EMISOR, PRODUCTO, NUMERO_CUENTA, DOCUMENTO, TARJETA, ESTADO, FECHA_VIGENCIA --mantis#2672 , ESTADO_DE_COSTO, CLASE_DE_ESTADO) VALUES (VR_TARJETA.EMISOR, VR_TARJETA.SUCURSAL_EMISOR, VR_TARJETA.PRODUCTO, VR_TARJETA.NUMERO_CUENTA, VR_TARJETA.DOCUMENTO, VR_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_TARJETA.FECHA_VIGENCIA, --mantis#2672 VR_TARJETA.ESTADO, VR_TARJETA.CLASE_DE_ESTADO); INSERT INTO CUENTA_TMP (EMISOR, OPERADOR) VALUES (VR_CUENTA.EMISOR, VR_CUENTA.OPERADOR); --Validar la Novedad SM.PR_VALIDAR_NOVEDAD(302, VR_NOVEDAD_CUENTA.NOVNRO, VR_NOVEDAD_CUENTA.NOVFCHING, VR_CUENTA.OPERADOR, --CP_USUARIO_ENTIDAD, VR_CUENTA.EMISOR); --NP_ENTIDAD_ID); --Registramos en Cambios de Estado. INSERT INTO CREDITOPY.CAMBIOS_DE_ESTADO@OLPY VALUES (VR_NOVEDAD_TARJETA.TARJETA, VR_NOVEDAD_TARJETA.NUEVO_ESTADO, VR_NOVEDAD_CUENTA.NOVFCHING, creditopy.seq_estados.nextval@OLPY); VR_NOVEDAD_TARJETA.NUEVO_ESTADO := NULL; INSERT INTO NOVEDADES_CUENTAS@OLPY VALUES VR_NOVEDAD_CUENTA; INSERT INTO NOVEDADES_TARJETAS@OLPY VALUES VR_NOVEDAD_TARJETA; COMMIT; /* open po_cursor for select VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD from dual; */ po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; OPEN po_cursor FOR SELECT VR_NOVEDAD_CUENTA.NOVNRO AS CODIGO_NOVEDAD, 0 AS ID_SOLICITUD, 0 AS CODIGO_RESPUESTA, ' ' AS GLOSA_RESPUESTA FROM dual; -- Se incluye un dummy para evitar bloque/desbloqueo en la misma hora sp_delay(CC_DELAY_SECONDS); EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; sp_rechazar_novedad; ROLLBACK; END spDesbloqueoTarjeta; PROCEDURE sp_bloqueoDesbloqueoTC(PI_TIPO_OPERACION IN NUMBER, -- Bandera para saber si la operacion es 1-bloquear, 2-desbloquear. PI_NUMERO_TARJETA IN VARCHAR2, -- Numero de tarjeta PI_ORIGEN_PEDIDO IN NUMBER, -- 1- Decisión del usuario 2- Decisión de la Entidad PI_MOTIVO_PEDIDO IN NUMBER, -- Codigo del motivo del pedido - REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC IN VARCHAR2, -- Descripcion de motivo otros PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS vn_emisor creditopy.tarjetas.emisor%TYPE; /* 24- Bloqueo y desbloqueo de tarjeta TC Adaptado del PKG_SICOOP_CEIBO. Ajustes a invocacion para el backend DIMO: A.Rodriguez. 29/05/2020 */ /* Autor: Edgar Rojas. Fecha: 19/03/2020 Proposito: Operaciones DIMO - Bloqueo, desbloqueo. Bloqueo y desbloqueo de una tarjeta a solicitud del usuario. La novedad se ejecuta con el emisor 805 (variable CC_ENT_DIMO_NOV) y el usuario 'DIMO' (variable CC_USUARIO_DIMO) Referencia: API_SICOOP-CEIBO(postrevision).xlsx. Hoja 20-Bloqueo-Desbloqueo */ BEGIN -- validar parametros de entrada no nulos IF PI_NUMERO_TARJETA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: tarjeta is null.'); ELSE -- validar que el emisor de la tarjeta no sea un emisor PREPAGO BEGIN SELECT t.emisor INTO vn_emisor FROM creditopy.tarjetas t WHERE t.tarjeta = fc_pan2cripto(PI_NUMERO_TARJETA); IF creditopy.pkg_dimo_ceibo.fn_is_prepaga(vn_emisor) = 1 THEN raise_application_error(-20001, 'USERS_ERROR: la tarjeta no es de credito.'); END IF; EXCEPTION WHEN OTHERS THEN RAISE; END; END IF; IF NVL(PI_ORIGEN_PEDIDO, 0) != 1 AND NVL(PI_ORIGEN_PEDIDO, 0) != 2 THEN raise_application_error(-20001, 'USERS_ERROR: origen pedido invalid.'); END IF; IF NVL(PI_MOTIVO_PEDIDO, 0) = 0 THEN IF nvl(PI_TIPO_OPERACION, 0) = 1 THEN raise_application_error(-20001, 'USERS_ERROR: motivo pedido invalid.'); END IF; END IF; --Validacion de Entidad Procesadora IF vn_emisor = 40 THEN --Panal: 806 CC_USUARIO_DIMO := 'DIMO_P'; CC_ENT_DIMO_NOV := 806; END IF; -- bloqueo/desbloqueo CASE nvl(PI_TIPO_OPERACION, 0) WHEN 1 THEN IF PI_ORIGEN_PEDIDO = 2 THEN spBloqueoTarjeta(PI_NUMERO_TARJETA, PI_ORIGEN_PEDIDO, -- 1-Usuario; 2-Entidad PI_MOTIVO_PEDIDO, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC, CC_ENT_DIMO_NOV, CC_USUARIO_DIMO, PO_SQLCODE, PO_SQLERRM, po_cursor); ELSE spBloqTarUsuarioDimo(PI_NUMERO_TARJETA, PI_MOTIVO_PEDIDO, --REGLA_WEB 13647 PI_OTROS_MOTIVO_DESC, CC_ENT_DIMO_NOV, -- entidad del usuario que procesa la novedad CC_USUARIO_DIMO, -- usuario que procesa la novedad PO_SQLCODE, PO_SQLERRM, po_cursor); END IF; WHEN 2 THEN IF PI_ORIGEN_PEDIDO = 2 THEN spDesbloqueoTarjeta(PI_NUMERO_TARJETA, PI_ORIGEN_PEDIDO, -- 1-Usuario; 2-Entidad CC_ENT_DIMO_NOV, CC_USUARIO_DIMO, PO_SQLCODE, PO_SQLERRM, po_cursor); ELSE spDesbTarUsuarioDIMO(PI_NUMERO_TARJETA, CC_ENT_DIMO_NOV, CC_USUARIO_DIMO, PO_SQLCODE, PO_SQLERRM, po_cursor); END IF; ELSE RAISE_APPLICATION_ERROR(-20001, 'USERS_ERROR: operacion not valid.'); END CASE; IF PO_SQLCODE != 0 THEN PO_SQLCODE := -1; END IF; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_bloqueoDesbloqueoTC; PROCEDURE sp_ObtenerCierreEmisor(PI_EMISOR IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 33.2 - Obtener cierres-emisor */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 24/08/2020 Propósito: Función que retorna datos de los cierres habilitados para un emisor. ******************************************************************************************************/ vb_existe NUMBER; BEGIN IF PI_EMISOR IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: Emisor is null.'); ELSE BEGIN SELECT 1 INTO vb_existe FROM debcredpy.emisores e WHERE e.emisor = PI_EMISOR AND e.base_pago_minimo = 'A'; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'Emisor invalido.'); WHEN OTHERS THEN RAISE; END; END IF; OPEN po_cursor FOR SELECT C.CIERRE, CC.PERIODO PERIODO_ACTUAL, -- YYYYMM TO_CHAR(MAX(CC.FECHA_VENCIMIENTO), 'DD/MM/YYYY') FECHA_VENCIMIENTO FROM creditopy.CIERRES C, creditopy.CIERRES_HABILITADOS B, creditopy.CALENDARIO_CIERRES CC WHERE c.EMISOR = PI_EMISOR AND c.PRODUCTO = 1 AND B.EMISOR = C.EMISOR AND B.PRODUCTO = C.PRODUCTO AND B.CIERRE = C.CIERRE AND CC.EMISOR = C.EMISOR AND CC.PRODUCTO = C.PRODUCTO AND CC.CIERRE = C.CIERRE AND CC.PERIODO = CS.GET_PERIODO_ACTUAL(C.EMISOR, C.PRODUCTO, C.CIERRE) GROUP BY C.CIERRE, CC.PERIODO ORDER BY C.CIERRE; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_ObtenerCierreEmisor; PROCEDURE sp_comercioPrepago(PI_CODIGO_COMERCIO IN NUMBER, PI_VALIDA_CREDITO_TP IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /* 35 - Datos de comercio */ /**************************************************************************************************** Autor: Amalia Rodriguez Fecha: 24/08/2020 Propósito: Función que retorna datos del comercio. Uso: APP DIMO Comercios. ******************************************************************************************************/ v_emisor_pago_prepaga NUMBER := 114; vb_existe NUMBER; v_estado NUMBER; BEGIN IF PI_CODIGO_COMERCIO IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: comercio is null.'); ELSE BEGIN SELECT 1, c.codigo_baja INTO vb_existe, v_estado FROM creditopy.comercios c WHERE c.comercio = PI_CODIGO_COMERCIO AND c.codigo_baja = 1; IF v_estado != 1 THEN raise_application_error(-20001, 'Comercio no habilitado.'); END IF; EXCEPTION WHEN no_data_found THEN raise_application_error(-20001, 'No existe el comercio.'); WHEN OTHERS THEN RAISE; END; END IF; OPEN po_cursor FOR SELECT c.comercio AS codigo_comercio, c.descripcion AS nombre_comercio, c.codigo_baja AS codigo_estado, cp.descripcion AS estado, c.ruc AS ruc, c.razon_social AS razon_social, c.pagador AS codigo_pagador, p.descripcion AS desc_pagador, -- número de cuenta c.cuenta AS numero_de_cuenta, -- tarjeta si tiene credito con prepaga comercio CASE WHEN c.pagador = v_emisor_pago_prepaga THEN creditopy.fc_tjtp(c.cuenta) ELSE ' ' END AS TARJETA, -- mascara del número de la tarjeta desencriptada CASE WHEN c.pagador = v_emisor_pago_prepaga THEN creditopy.pkg_dimo_ceibo.fn_get_tarjeta_mask(fc_tjtp(c.cuenta)) ELSE ' ' END AS tar_mask, decode(c.pagador, v_emisor_pago_prepaga, 1, 0) AS tiene_cr_con_prepaga FROM creditopy.comercios c, creditopy.codigos_py cp, creditopy.pagadores p WHERE c.comercio = PI_CODIGO_COMERCIO AND cp.tipo_codigo = c.cod_codigo_baja AND cp.codigo = c.codigo_baja AND p.emisor_procesador = c.emisor_procesador AND p.pagador = c.pagador AND ((nvl(PI_VALIDA_CREDITO_TP, 0) = 1 AND c.pagador = v_emisor_pago_prepaga) OR (nvl(PI_VALIDA_CREDITO_TP, 0) = 0)); PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_comercioPrepago; PROCEDURE sp_alta_gestion_reversos(pi_id_session_uuid VARCHAR2, pi_motivo_inicial VARCHAR2 DEFAULT NULL, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS -- variables para la solicitud VR_SOLICITUD CREDITOPY.SOLICITUDES_RECIBIDAS%ROWTYPE; VR_DATOS CREDITOPY.SOLICITUDES_DATOS%ROWTYPE; --v_uuid varchar2(100) := '61fcc7309f680aa6d0466bde4212c7c97532c7e3'; vuuid creditopy.sicoop_uuid.idsesion_uuid@olpy%TYPE; vnumero_auditoria creditopy.sicoop_uuid.numero_auditoria@olpy%TYPE; vfecha creditopy.sicoop_uuid.fecha@olpy%TYPE; vr_log_transacc_cr log_transacc_cr@olpy%ROWTYPE; vid_solicitud creditopy.solicitudes.id_solicitud%TYPE := 19; vid_estado creditopy.solicitudes_estados.id_estado%TYPE := 64; vdatos_hist VARCHAR2(1) := 'N'; vexception EXCEPTION; vexception_mensaje VARCHAR2(500); BEGIN BEGIN SELECT uuid.idsesion_uuid, uuid.numero_auditoria, uuid.fecha INTO vuuid, vnumero_auditoria, vfecha FROM creditopy.sicoop_uuid@olpy uuid WHERE uuid.idsesion_uuid = pi_id_session_uuid; EXCEPTION WHEN no_data_found THEN vuuid := NULL; vnumero_auditoria := 0; vexception_mensaje := 'UUID no existe'; RAISE vexception; --raise_application_error(-20000,'UUID no existe'); WHEN OTHERS THEN raise_application_error(-20000, 'Error al buscar UUID:' || SQLERRM); END; vr_log_transacc_cr := NULL; BEGIN SELECT * INTO vr_log_transacc_cr FROM creditopy.log_transacc_cr@olpy l WHERE l.numero_auditoria = vnumero_auditoria AND l.nro_autorizacion = nvl((SELECT MIN(ll.nro_autorizacion) FROM creditopy.log_transacc_cr@olpy ll WHERE ll.numero_auditoria = l.numero_auditoria), 0); vdatos_hist := 'N'; EXCEPTION WHEN no_data_found THEN vr_log_transacc_cr := NULL; WHEN OTHERS THEN raise_application_error(-20000, 'Error al buscar transaccion en log_transacc_cr' || SQLERRM); END; IF vr_log_transacc_cr.nro_tarjeta IS NULL THEN BEGIN SELECT * INTO vr_log_transacc_cr FROM creditopy.log_transacc_cr_hist@olpy l WHERE l.numero_auditoria = vnumero_auditoria AND l.nro_autorizacion = nvl((SELECT MIN(ll.nro_autorizacion) FROM creditopy.log_transacc_cr_hist@olpy ll WHERE ll.numero_auditoria = l.numero_auditoria AND ll.fecha BETWEEN (l.fecha - 2) AND l.fecha), 0); vdatos_hist := 'S'; EXCEPTION WHEN no_data_found THEN vr_log_transacc_cr := NULL; WHEN OTHERS THEN raise_application_error(-20000, 'Error al buscar transaccion en log_transacc_cr_hist' || SQLERRM); END; END IF; IF vr_log_transacc_cr.nro_tarjeta IS NULL THEN vexception_mensaje := 'No se encuentra datos en log_transacc_cr'; RAISE vexception; --raise_application_error(-20000,'No se encuentra datos en log_transacc_cr'||sqlerrm); END IF; --Registramos los datos para la solicitud de impresion del plastico VR_SOLICITUD.ID_SOLICITUD := vid_solicitud; VR_SOLICITUD.ID_ESTADO := vid_estado; --VR_SOLICITUD.NOVEDAD := VR_IMP_TARJETA.FORMULARIO; VR_SOLICITUD.TARJETA := vr_log_transacc_cr.nro_tarjeta; VR_SOLICITUD.USUARIO := 'CABAL'; VR_SOLICITUD.DOCUMENTO := TRIM(LEADING '0' FROM SUBSTR(vr_log_transacc_cr.nro_documento, 4, 12)); VR_DATOS.nro_tarjeta := vr_log_transacc_cr.nro_tarjeta; VR_DATOS.nro_autorizacion := vr_log_transacc_cr.nro_autorizacion; VR_DATOS.fecha := vr_log_transacc_cr.fecha; VR_DATOS.hora := vr_log_transacc_cr.hora; VR_DATOS.importe := vr_log_transacc_cr.importe; VR_DATOS.plan := vr_log_transacc_cr.plan; VR_DATOS.cuotas := vr_log_transacc_cr.cuotas; VR_DATOS.codigo_operacion := vr_log_transacc_cr.codigo_operacion; VR_DATOS.Documento := vr_log_transacc_cr.nro_documento; VR_DATOS.nro_cuenta := vr_log_transacc_cr.nro_cuenta; VR_DATOS.tipo_autorizacion := vr_log_transacc_cr.tipo_autorizacion; VR_DATOS.baja := vr_log_transacc_cr.baja; VR_DATOS.marca_transf := vr_log_transacc_cr.marca_transf; VR_DATOS.nro_res := vr_log_transacc_cr.nro_res; VR_DATOS.nro_res_interno := vr_log_transacc_cr.nro_res_interno; VR_DATOS.res_interno := vr_log_transacc_cr.res_interno; VR_DATOS.autextfch := vr_log_transacc_cr.autextfch; VR_DATOS.autextproc := vr_log_transacc_cr.autextproc; VR_DATOS.movextproc := vr_log_transacc_cr.movextproc; VR_DATOS.tx_interna := vr_log_transacc_cr.tx_interna; VR_DATOS.numero_auditoria := vr_log_transacc_cr.numero_auditoria; VR_DATOS.is_log_transacc_cr_hist := vdatos_hist; VR_DATOS.idsesion_uuid := vuuid; VR_DATOS.motivo_inicial := pi_motivo_inicial; PR_SOLICITUDES(VR_SOLICITUD, VR_DATOS); COMMIT; IF VR_SOLICITUD.CODIGO_RESPUESTA = 0 THEN po_sqlcode := VR_SOLICITUD.CODIGO_RESPUESTA; po_sqlerrm := SQLERRM; ELSE po_sqlcode := -1; po_sqlerrm := SQLERRM; END IF; OPEN po_cursor FOR SELECT po_sqlcode, po_sqlerrm FROM dual; EXCEPTION WHEN vexception THEN po_sqlcode := -1; po_sqlerrm := vexception_mensaje; OPEN po_cursor FOR SELECT po_sqlcode, po_sqlerrm FROM dual; WHEN OTHERS THEN po_sqlcode := SQLCODE; po_sqlerrm := SQLERRM; OPEN po_cursor FOR SELECT po_sqlcode, po_sqlerrm FROM dual; END; /* *Author : HGONZALEZ *Created : 20/11/2020 22:50:00 p.m. *Purpose : Consulta de factura para su correspondiente descarga. */ PROCEDURE sp_ConsultaFacturaDimo(PI_NUMERO_CUENTA IN NUMBER, -- Numero de cuenta PI_PERIODO IN NUMBER, -- Periodo inicial PI_PERIODO_ACTUAL IN NUMBER, -- Periodo actual PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) AS /**************************************************************************************************** PARAMETROS DE ENTRADA: pi_numero_cuenta: un numero de cuenta para obtener los extractos pi_periodo: periodo yyyymm de 12 meses atras del emisor de la cuenta pi_periodo_actual: periodo yyyymm vigente del emisor de la cuenta ******************************************************************************************************/ BEGIN IF PI_NUMERO_CUENTA IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: cuenta is null.'); END IF; IF PI_PERIODO IS NULL OR PI_PERIODO_ACTUAL IS NULL THEN raise_application_error(-20001, 'USERS_ERROR: periodo is null.'); END IF; OPEN po_cursor FOR SELECT SUBSTR(A.PERIODO, 1, 4) ANIO, A.EMISOR, A.FECHA_REGISTRO FECHA_EMISION, 1 FLAG_FACTURA, SUBSTR(A.PERIODO, -2) MES, 805 PROCESADOR, A.TOTAL_CARGOS MONTO_FACTURA, A.TOTAL_IVA_10 + A.TOTAL_IVA_5 IVA --mantis#3668 Mejoras en el Frontend de DIMO para Facturacion Electronica --,A.FACTURA , A.FACTURA_LEYENDA FACTURA, A.DOCUMENTO, A.NOMBRE_RAZON_SOCIAL FROM camello.FACTURAS_USUARIOS A WHERE A.NUMERO_CUENTA = PI_NUMERO_CUENTA AND A.PERIODO BETWEEN PI_PERIODO AND PI_PERIODO_ACTUAL; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN PR_LOGGING('DIMO', 'facturasDIMO', 'PKG_DIMO_CEIBO.sp_ConsultaFacturaDimo. Parametros.' || ' PI_NUMERO_CUENTA:' || PI_NUMERO_CUENTA || ' PI_PERIODO: ' || PI_PERIODO || ' PI_PERIODO_ACTUAL: ' || PI_PERIODO_ACTUAL || SQLERRM); PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; END sp_ConsultaFacturaDimo; -- ====================================================================== -- -- Autor: Lic. Orlando Ojeda -- Fecha: 29/04/2021 -- Proposito: Obtener las preguntas de Seguridad para el -- proceso de vinculacion de las tarjetas de Credito -- ====================================================================== -- PROCEDURE sp_obtener_pregutas_vinc_tc(pi_documento IN VARCHAR2, pi_tarjeta_cripto IN VARCHAR2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_id_vinc_proceso OUT NUMBER, po_cur_preguntas OUT SYS_REFCURSOR, po_cur_respuestas OUT SYS_REFCURSOR) IS v_aux NUMBER := 0; v_id_proceso NUMBER := 0; v_cont_preg_opciones NUMBER := 0; v_resp_correcta VARCHAR2(3000); v_resp_random VARCHAR2(3000); FUNCTION fi_get_id_respuesta_random(pi_id_vinc_proceso IN NUMBER, pi_id_pregunta IN NUMBER) RETURN NUMBER AS v_id_resp_retorno NUMBER := 0; v_cont NUMBER := 0; BEGIN LOOP v_id_resp_retorno := round(dbms_random.value * 100); SELECT COUNT(1) INTO v_cont FROM creditopy.dimo_tc_vinc_proceso_preguntas dvp WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso AND dvp.id_pregunta = pi_id_pregunta AND dvp.id_respuesta = v_id_resp_retorno; EXIT WHEN V_CONT = 0; END LOOP; RETURN v_id_resp_retorno; END; BEGIN -- ================================================ -- -- Preproceso. Validaciones -- ================================================ -- -- * Buscamos si la tarjeta existe SELECT COUNT(1) INTO v_aux FROM creditopy.tarjetas t WHERE t.tarjeta = pi_tarjeta_cripto AND substr(t.documento, 4, 12) = lpad(pi_documento, 12, '0'); IF v_aux = 0 THEN raise_application_error(-20001, 'La tarjeta seleccionada no existe'); END IF; -- * Buscamos si la tarjeta ya no se encuentra vinculada a DIMO SELECT COUNT(1) INTO v_aux FROM creditopy.dimo_tc_vinculadas dtc WHERE dtc.tarjeta = pi_tarjeta_cripto AND dtc.estado = 1 -- Vinculado... ; IF v_aux > 0 THEN raise_application_error(-20001, 'La tarjeta seleccionada ya se encuentra vinculada a DIMO'); END IF; -- * Buscamos si no existe un proceso de vinculacion previo SELECT COUNT(1) INTO v_id_proceso FROM creditopy.DIMO_TC_VINC_PROCESO vp WHERE vp.documento = pi_documento AND vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0; -- Si no hay ningun proceso previo de vinculacion... IF v_id_proceso = 0 THEN BEGIN -- Dar de alta Nuevo Proceso de Vinculacion -- ================================================= -- -- Registramos el inicio del proceso de vinculacion -- ================================================= -- SELECT creditopy.seq_dimo_tc_vinc_proc.nextval INTO v_id_proceso FROM dual; INSERT INTO creditopy.DIMO_TC_VINC_PROCESO (id_vinc_proceso, documento, tarjeta, estado, fecha_hora_ins) VALUES (v_id_proceso, pi_documento, pi_tarjeta_cripto, 0, -- 0 Estado Inicial SYSDATE); -- ======================================================== -- -- Generamos el detalle de opciones de respuestas posibles... -- ======================================================== -- FOR pp IN (SELECT ps.id_pregunta, ps.opciones_s_n, nvl(ps.opciones_cant, 0) opciones_cant FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.estado = 1 AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO ORDER BY ps.orden, ps.id_pregunta) LOOP v_resp_correcta := f_get_resp_pregunta_vinc_tc(pp.id_pregunta, pi_tarjeta_cripto); IF (v_resp_correcta IS NULL) THEN raise_application_error(-20001, 'No se pudo obtener la respuesta verdadera de una de las preguntas. IdPregunta: ' || pp.id_pregunta); END IF; v_aux := fi_get_id_respuesta_random(v_id_proceso, pp.id_pregunta); -- Insertamos la respuesta verdadera INSERT INTO creditopy.dimo_tc_vinc_proceso_preguntas (id_vinc_proceso, id_pregunta, id_respuesta, valor_respuesta) VALUES (v_id_proceso, pp.id_pregunta, v_aux, CASE WHEN pp.opciones_s_n = 'S' THEN v_resp_correcta ELSE NULL END); -- Si se deben tener multiples opciones de respuesta... IF pp.opciones_s_n = 'S' THEN -- Insertamos las respuestas random FOR idx_pregunta IN 1 .. pp.opciones_cant -- Desde 1 hasta la cantidad configurada por cada pregunta... LOOP v_cont_preg_opciones := 0; v_aux := 0; -- Obtenemos las respuestas posibles siempre que sean diferentes a la respuesta original LOOP v_cont_preg_opciones := nvl(v_cont_preg_opciones, 0) + 1; v_resp_random := f_valor_random_pregun_vinc_tc(pp.id_pregunta); -- Verificamos si ya no existe una opcion con el mismo valor SELECT COUNT(1) INTO v_aux FROM creditopy.dimo_tc_vinc_proceso_preguntas dtp WHERE dtp.id_vinc_proceso = v_id_proceso AND dtp.id_pregunta = pp.id_pregunta AND dtp.valor_respuesta = v_resp_random; -- Control para evitar loop infinito... IF v_cont_preg_opciones > 100 THEN v_resp_random := NULL; END IF; EXIT WHEN v_aux = 0 OR v_resp_random IS NULL; END LOOP; -- Solo insertamos si se pudo obtener un valor random valido IF (v_resp_random IS NULL) THEN raise_application_error(-20001, 'No se pudieron obtener las opciones de resp. de una de las preguntas. IdPregunta: ' || pp.id_pregunta || ' . ContadorIntentos: ' || v_cont_preg_opciones); END IF; v_aux := fi_get_id_respuesta_random(v_id_proceso, pp.id_pregunta); -- INSERT INTO creditopy.dimo_tc_vinc_proceso_preguntas (id_vinc_proceso, id_pregunta, id_respuesta, valor_respuesta) VALUES (v_id_proceso, pp.id_pregunta, v_aux, v_resp_random); END LOOP; END IF; END LOOP; END; -- Fin dar de alta nuevo Proceso de Vinculacion ELSE -- * Obtenemos el Id Proceso vigente SELECT MAX(vp.id_vinc_proceso) INTO v_id_proceso FROM creditopy.DIMO_TC_VINC_PROCESO vp WHERE vp.documento = pi_documento AND vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0; -- * Actualizamos la cantidad de intentos del proceso de vinculacion... UPDATE creditopy.DIMO_TC_VINC_PROCESO vp SET vp.cant_solicitudes = nvl(vp.cant_solicitudes, 0) + 1 WHERE vp.id_vinc_proceso = v_id_proceso; -- * Damos de baja los otros pendientes (si es que existen) UPDATE creditopy.DIMO_TC_VINC_PROCESO vp SET vp.estado = 3 -- Baja WHERE vp.documento = pi_documento AND vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0 AND vp.id_vinc_proceso != v_id_proceso; END IF; po_id_vinc_proceso := v_id_proceso; -- Retornamos las preguntas y las opciones OPEN po_cur_preguntas FOR SELECT ps.id_pregunta, ps.label, ps.hint, ps.opciones_s_n FROM creditopy.dimo_tc_preguntas_seguridad ps JOIN (SELECT dtcp.id_pregunta, COUNT(1) cantidad FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = v_id_proceso GROUP BY dtcp.id_pregunta) resp ON resp.id_pregunta = ps.id_pregunta WHERE ps.estado = 1 AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO ORDER BY ps.orden, ps.id_pregunta; OPEN po_cur_respuestas FOR SELECT dtcp.id_pregunta, dtcp.id_respuesta, dtcp.valor_respuesta FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp JOIN creditopy.dimo_tc_preguntas_seguridad ps ON ps.id_pregunta = dtcp.id_pregunta AND ps.opciones_s_n = 'S' AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO WHERE dtcp.id_vinc_proceso = v_id_proceso ORDER BY dtcp.id_pregunta, dbms_random.value; COMMIT; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN po_id_vinc_proceso := -1; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'PREGUN_VINC_TC', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; END; --- --- -- ====================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 02/08/2023 -- Proposito: Obtener las preguntas de Seguridad para el -- catastro de Dimo de tu eres tu -- ====================================================================== -- -- ====================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 02/08/2023 -- Proposito: Obtener las preguntas de Seguridad para el -- catastro de Dimo de tu eres tu -- ====================================================================== -- PROCEDURE sp_obtener_pregutas_tu_tu(pi_documento IN VARCHAR2, -- pi_tarjeta_cripto in varchar2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_id_vinc_proceso OUT NUMBER, po_cur_preguntas OUT SYS_REFCURSOR, po_cur_respuestas OUT SYS_REFCURSOR) IS v_aux NUMBER := 0; v_id_proceso NUMBER := 0; v_cont_preg_opciones NUMBER := 0; v_resp_correcta VARCHAR2(3000); v_resp_random VARCHAR2(3000); FUNCTION fi_get_id_respuesta_random(pi_id_vinc_proceso IN NUMBER, pi_id_pregunta IN NUMBER) RETURN NUMBER AS v_id_resp_retorno NUMBER := 0; v_cont NUMBER := 0; BEGIN LOOP v_id_resp_retorno := round(dbms_random.value * 100); SELECT COUNT(1) INTO v_cont FROM creditopy.dimo_tc_vinc_proceso_preguntas dvp WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso AND dvp.id_pregunta = pi_id_pregunta AND dvp.id_respuesta = v_id_resp_retorno; EXIT WHEN V_CONT = 0; END LOOP; RETURN v_id_resp_retorno; END; BEGIN -- ================================================ -- -- Preproceso. Validaciones -- ================================================ -- -- Verificamos la cantidad de intentos que hizo la persona para responder las preguntas SELECT COUNT(1) INTO v_aux FROM creditopy.DIMO_TC_VINC_PROCESO vp WHERE vp.documento = pi_documento AND tarjeta IS NULL and vp.origen='TUTU'; -- Proceso tu eres tu IF nvl(v_aux, 0) > 2 THEN raise_application_error(-20001, 'Ya no quedan intentos para responder las preguntas'); END IF; v_aux:=0; -- * Buscamos si la persona posee alguna tc activa operativa SELECT count(*) cant_tc into v_aux FROM CREDITOPY.CUENTAS CUENTAS, DEBCREDPY.PERSONAS PERSONAS2, DEBCREDPY.Emisores e, CREDITOPY.TARJETAS t, CREDITOPY.clases_estados cl, CREDITOPY.Estados_Ctas_Tarj et WHERE PERSONAS2.DOCUMENTO = CUENTAS.DOCUMENTO AND PERSONAS2.TIPO_DE_DOCUMENTO IN (1, 2, 3, 4, 5, 6, 7, 8, 9) AND CUENTAS.SUCURSAL_EMISOR < 9999 AND CUENTAS.PRODUCTO = 1 AND CUENTAS.EMISOR <> 115 AND TRIM(SUBSTR(PERSONAS2.documento, 4)) = TRIM(to_char(pi_documento , '000000000000')) AND e.emisor = cuentas.emisor AND t.numero_cuenta = cuentas.numero_cuenta and et.estado=t.estado and et.clase_de_estado=cl.clase_de_estado and t.estado=1 and t.clase_de_estado=1; IF nvl(v_aux,0) = 0 THEN raise_application_error(-20020, 'No existe ninguna TC asociada al nro de documento'); END IF; -- * Buscamos si la tarjeta ya no se encuentra vinculada a DIMO /* select count(1) into v_aux from creditopy.dimo_tc_vinculadas dtc where dtc.tarjeta = pi_tarjeta_cripto and dtc.estado = 1 -- Vinculado... ;*/ v_aux := 0; /*if v_aux > 0 then raise_application_error(-20001,'La tarjeta seleccionada ya se encuentra vinculada a DIMO'); end if;*/ -- * Buscamos si no existe un proceso de vinculacion previo SELECT COUNT(1) INTO v_id_proceso FROM creditopy.DIMO_TC_VINC_PROCESO vp WHERE vp.documento = pi_documento -- and vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0 and vp.origen='TUTU'; -- Proceso tu eres tu -- v_id_proceso:=0; -- Si no hay ningun proceso previo de vinculacion... IF v_id_proceso = 0 THEN BEGIN -- Dar de alta Nuevo Proceso de Vinculacion -- ================================================= -- -- Registramos el inicio del proceso de vinculacion -- ================================================= -- SELECT creditopy.seq_dimo_tc_vinc_proc.nextval INTO v_id_proceso FROM dual; INSERT INTO creditopy.DIMO_TC_VINC_PROCESO (id_vinc_proceso, documento, -- tarjeta, estado, fecha_hora_ins, ORIGEN) VALUES (v_id_proceso, pi_documento, --pi_tarjeta_cripto, 0, -- 0 Estado Inicial SYSDATE, 'TUTU'); -- ======================================================== -- -- Generamos el detalle de opciones de respuestas posibles... -- ======================================================== -- FOR pp IN (SELECT ps.id_pregunta, ps.opciones_s_n, nvl(ps.opciones_cant, 0) opciones_cant FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE ps.estado = 1 AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO ORDER BY ps.orden, ps.id_pregunta) LOOP v_resp_correcta := f_get_resp_pregunta_tutu(pp.id_pregunta, pi_documento); IF (v_resp_correcta IS NULL) THEN raise_application_error(-20001, 'No se pudo obtener la respuesta verdadera de una de las preguntas. IdPregunta: ' || pp.id_pregunta); END IF; v_aux := fi_get_id_respuesta_random(v_id_proceso, pp.id_pregunta); -- Insertamos la respuesta verdadera INSERT INTO creditopy.dimo_tc_vinc_proceso_preguntas (id_vinc_proceso, id_pregunta, id_respuesta, valor_respuesta) VALUES (v_id_proceso, pp.id_pregunta, v_aux, CASE WHEN pp.opciones_s_n = 'S' THEN v_resp_correcta ELSE NULL END); -- Si se deben tener multiples opciones de respuesta... IF pp.opciones_s_n = 'S' THEN -- Insertamos las respuestas random FOR idx_pregunta IN 1 .. pp.opciones_cant -- Desde 1 hasta la cantidad configurada por cada pregunta... LOOP v_cont_preg_opciones := 0; v_aux := 0; -- Obtenemos las respuestas posibles siempre que sean diferentes a la respuesta original LOOP v_cont_preg_opciones := nvl(v_cont_preg_opciones, 0) + 1; v_resp_random := f_valor_random_pregun_tutu(pp.id_pregunta, pi_documento); -- Verificamos si ya no existe una opcion con el mismo valor SELECT COUNT(1) INTO v_aux FROM creditopy.dimo_tc_vinc_proceso_preguntas dtp WHERE dtp.id_vinc_proceso = v_id_proceso AND dtp.id_pregunta = pp.id_pregunta AND dtp.valor_respuesta = v_resp_random; -- Control para evitar loop infinito... IF v_cont_preg_opciones > 100 THEN v_resp_random := NULL; END IF; EXIT WHEN v_aux = 0 OR v_resp_random IS NULL; END LOOP; -- Solo insertamos si se pudo obtener un valor random valido IF (v_resp_random IS NULL) THEN raise_application_error(-20001, 'No se pudieron obtener las opciones de resp. de una de las preguntas. IdPregunta: ' || pp.id_pregunta || ' . ContadorIntentos: ' || v_cont_preg_opciones); END IF; v_aux := fi_get_id_respuesta_random(v_id_proceso, pp.id_pregunta); -- INSERT INTO creditopy.dimo_tc_vinc_proceso_preguntas (id_vinc_proceso, id_pregunta, id_respuesta, valor_respuesta) VALUES (v_id_proceso, pp.id_pregunta, v_aux, v_resp_random); END LOOP; END IF; END LOOP; END; -- Fin dar de alta nuevo Proceso de Vinculacion ELSE -- * Obtenemos el Id Proceso vigente SELECT MAX(vp.id_vinc_proceso) INTO v_id_proceso FROM creditopy.DIMO_TC_VINC_PROCESO vp WHERE vp.documento = pi_documento --and vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0 AND VP.ORIGEN='TUTU'; -- v_id_proceso:=1; -- * Actualizamos la cantidad de intentos del proceso de vinculacion... UPDATE creditopy.DIMO_TC_VINC_PROCESO vp SET vp.cant_solicitudes = nvl(vp.cant_solicitudes, 0) + 1 WHERE vp.id_vinc_proceso = v_id_proceso AND VP.ORIGEN='TUTU'; -- * Damos de baja los otros pendientes (si es que existen) UPDATE creditopy.DIMO_TC_VINC_PROCESO vp SET vp.estado = 3 -- Baja WHERE vp.documento = pi_documento -- and vp.tarjeta = pi_tarjeta_cripto AND vp.estado = 0 AND vp.id_vinc_proceso != v_id_proceso AND VP.ORIGEN='TUTU'; END IF; po_id_vinc_proceso := v_id_proceso; -- Retornamos las preguntas y las opciones OPEN po_cur_preguntas FOR SELECT ps.id_pregunta, ps.label, ps.hint, ps.opciones_s_n FROM creditopy.dimo_tc_preguntas_seguridad ps JOIN (SELECT dtcp.id_pregunta, COUNT(1) cantidad FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = v_id_proceso GROUP BY dtcp.id_pregunta) resp ON resp.id_pregunta = ps.id_pregunta WHERE ps.estado = 1 AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO ORDER BY ps.orden, ps.id_pregunta; OPEN po_cur_respuestas FOR SELECT dtcp.id_pregunta, dtcp.id_respuesta, dtcp.valor_respuesta FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp JOIN creditopy.dimo_tc_preguntas_seguridad ps ON ps.id_pregunta = dtcp.id_pregunta AND ps.opciones_s_n = 'S' AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO WHERE dtcp.id_vinc_proceso = v_id_proceso ORDER BY dtcp.id_pregunta, dbms_random.value; COMMIT; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN if SQLCODE =(-20020) then po_id_vinc_proceso := -99; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN --'PREGUN_VINC_TC' creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'PREGUN_TUTU', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; else po_id_vinc_proceso := -1; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN --'PREGUN_VINC_TC' creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'PREGUN_TUTU', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; end if; END sp_obtener_pregutas_tu_tu; --- -- -- ============================================================================== -- -- Autor: Lic. Orlando Ojeda -- Fecha: 29/04/2021 -- Proposito: Registrar las respuestas a las preguntas de Seguridad y -- vincular la tarjeta a DIMO en caso exitoso. -- -- Observaciones: -- Las respuestas enviadas en el prm "pi_clob_respuetas" deben venir con en el sgte. formato -- [ID_PREGUNTA1]:[ID_RESPUESTA1/VALOR_RESPUESTA1][;][ID_PREGUNTA2]:[ID_RESPUESTA2/VALOR_RESPUESTA2][;] [... n] -- Donde: [;] Es el separador entre cada pregunta/respuesta -- Ejemplo: [1]:[123123123][;][2]:[12123123][;][3]:[312312312] -- ============================================================================== -- PROCEDURE sp_procesar_respuestas_vinc_tc(pi_id_vinc_proceso IN NUMBER, pi_clob_respuestas IN CLOB, -- String concatenado con todas las respuestas po_retorno OUT NUMBER, -- 0 = OK / != 0 NO OK po_retorno_msg OUT VARCHAR2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2) AS v_contador_resp_total NUMBER := 0; v_contador_resp_ok NUMBER := 0; v_clob_resultado CLOB := ''; v_dimo_vinc_proces_row creditopy.dimo_tc_vinc_proceso%ROWTYPE; v_dimo_pregunta_segu_row creditopy.dimo_tc_preguntas_seguridad%ROWTYPE; v_id_seq_vinc NUMBER := 0; v_resp_correcta VARCHAR2(3000); v_resp_enviada VARCHAR2(3000); VR_EVENTO fide_eventos_ceibo%ROWTYPE; FUNCTION GET_ID_EVENTO RETURN VARCHAR2 AS BEGIN RETURN 'FECHA_PROCESO:' || TO_CHAR(VR_EVENTO.FECHA_PROCESO, 'DD/MM/YYYY') || ' ' || 'CODIGO_EVENTO:' || VR_EVENTO.CODIGO_EVENTO || ' ' || 'ID_VINC_PROCESO:' || V_DIMO_VINC_PROCES_ROW.ID_VINC_PROCESO || ' ' || 'TARJETA:' || V_DIMO_VINC_PROCES_ROW.TARJETA || ' ' || 'DOCUMENTO:' || VR_EVENTO.DOCUMENTO || ' ' || 'CODIGO_RETORNO:' || VR_EVENTO.CODIGO_RETORNO || ' ' || 'TEXT_RETORNO:' || VR_EVENTO.TEXT_RETORNO || ' ' || 'PEDIDO_INICIO_TS:' || TO_CHAR(VR_EVENTO.PEDIDO_INICIO_TS) || ' ' || 'PEDIDO_FIN_TS:' || TO_CHAR(VR_EVENTO.TEXT_RETORNO); END; PROCEDURE PL_SERVICIO_GUARDAR(CP_TABLA_ORIGEN IN VARCHAR2, NP_ID_ORIGEN IN NUMBER, CP_UUID IN VARCHAR2 DEFAULT NULL) AS BEGIN VR_EVENTO.PEDIDO_INICIO_TS := SYSTIMESTAMP; VR_EVENTO.Documento := v_dimo_vinc_proces_row.documento; vr_evento.importe := 0; vr_evento.codigo_evento := 'VINCULAR_TC'; OPERAC_SICOOP.PKG_OD.PR_GUARDAR_EVENTOS_CEIBO@SICOOP(DP_FECHA_PROCESO => VR_EVENTO.FECHA_PROCESO, CP_DOCUMENTO => VR_EVENTO.DOCUMENTO, CP_TABLA_ORIGEN => CP_TABLA_ORIGEN, NP_MONTO_OPERACION => VR_EVENTO.IMPORTE, NP_ID_ORIGEN => NP_ID_ORIGEN, CP_UUID => CP_UUID, CP_CODIGO_EVENTO => VR_EVENTO.CODIGO_EVENTO, CP_CODIGO_RETORNO => VR_EVENTO.CODIGO_RETORNO, CP_TEXT_RETORNO => VR_EVENTO.TEXT_RETORNO); VR_EVENTO.PEDIDO_FIN_TS := SYSTIMESTAMP; PR_CEIBO_LOG('PKG_DIMO_CEIBO', 'PL_SERVICIO_GUARDAR', 'Evento informado. EventoId:' || GET_ID_EVENTO, SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN PR_CEIBO_LOG('PKG_DIMO_CEIBO', 'PL_SERVICIO_GUARDAR', 'Error al Informar el evento. EventoId:' || GET_ID_EVENTO || ' ' || SQLERRM, SYSDATE, 'DIMO'); END; BEGIN -- ============================================== -- -- Obtenemos los datos del Proceso de Vinculacion -- ============================================== -- BEGIN SELECT dvp.* INTO v_dimo_vinc_proces_row FROM creditopy.dimo_tc_vinc_proceso dvp WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso; -- * Validamos el estado de la vinculacion, debe estar en 0 = Iniciado IF v_dimo_vinc_proces_row.estado != 0 THEN raise_application_error(-20001, 'El estado del proceso de vinculacion de TC ha sido ' || CASE WHEN v_dimo_vinc_proces_row.estado = 1 THEN 'Finalizado previamente' WHEN v_dimo_vinc_proces_row.estado = 2 THEN 'Rechazado previamente' WHEN v_dimo_vinc_proces_row.estado = 3 THEN 'Dado de Baja' ELSE 'no reconocido' END); END IF; -- * Validamos si la tarjeta ya no este vinculada SELECT COUNT(1) INTO v_id_seq_vinc FROM creditopy.dimo_tc_vinculadas dtc WHERE dtc.tarjeta = v_dimo_vinc_proces_row.tarjeta AND dtc.estado = 1 -- Vinculado... ; IF v_id_seq_vinc > 0 THEN raise_application_error(-20001, 'La tarjeta ya se encuentra vinculada a DIMO'); END IF; -- Obtenemos la cantidad de respuestas que deben ser respondidas... SELECT COUNT(1) INTO v_contador_resp_total FROM (SELECT dtcp.id_pregunta FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = pi_id_vinc_proceso GROUP BY dtcp.id_vinc_proceso, dtcp.id_pregunta); EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error(-20001, ' No existe el Id ProcesoVinculacion ' || pi_id_vinc_proceso); WHEN OTHERS THEN RAISE; END; -- ==================================== -- -- Procesamos las respuestas envidas -- ==================================== -- v_contador_resp_ok := 0; -- Obtenemos en un select la Lista de Preguntas/Respuestas FOR respuestas IN (SELECT TRIM(substr(resp.pregunta, 2, length(resp.pregunta) - 2)) id_pregunta, TRIM(substr(resp.respuesta, 2, length(resp.respuesta) - 2)) respuesta FROM (SELECT creditopy.f_split_valor(TRIM(registro), ':', 1) pregunta, creditopy.f_split_valor(TRIM(registro), ':', 2) respuesta FROM (SELECT column_value AS registro FROM TABLE(creditopy.f_split_clob(pi_clob_respuestas, '[;]'))) WHERE registro IS NOT NULL) resp) LOOP v_resp_correcta := ''; v_resp_enviada := ''; -- * Obtenemos la config de la pregunta y su valor valido para la comparacion.. BEGIN SELECT ps.* INTO v_dimo_pregunta_segu_row FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE to_char(ps.id_pregunta) = respuestas.id_pregunta AND PS.DESTINO_CONSULTA = 'VTC' --DESTINO ; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, ' No existe el Id Pregunta ' || respuestas.id_pregunta); END; -- * Obtenemos el VALOR VALIDO de la Respuesta v_resp_correcta := f_get_resp_pregunta_vinc_tc(respuestas.id_pregunta, v_dimo_vinc_proces_row.tarjeta); -- * Obtenemos el VALOR ENVIADO para Responder pregunta de seguridad -- Si el Pregunta esta configurada como CON opciones multiples IF v_dimo_pregunta_segu_row.opciones_s_n = 'S' THEN -- Se envia el ID de Respuesta.. SELECT MAX(dtcp.valor_respuesta) INTO v_resp_enviada FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = pi_id_vinc_proceso AND dtcp.id_pregunta = respuestas.id_pregunta AND TO_CHAR(dtcp.id_respuesta) = TO_CHAR(respuestas.respuesta); ELSE -- Se envia el VALOR en si v_resp_enviada := respuestas.respuesta; END IF; /* -- Se comenta condicion por que se encontro que el PL no toma bien los RAISE dentro de un Loop -- if v_resp_correcta is null then po_retorno_msg := 'No se pudo obtener la respuesta correcta p/ comparacion, de una de las preguntas. IdPregunta: '|| respuestas.id_pregunta; raise_application_error(-20001, 'No se pudo obtener la respuesta correcta p/ comparacion, de una de las preguntas. IdPregunta: '|| respuestas.id_pregunta ); end if; */ -- * Si llegamos hasta aqui, comparamos las respuestas... IF v_resp_correcta = v_resp_enviada THEN v_contador_resp_ok := v_contador_resp_ok + 1; END IF; v_clob_resultado := v_clob_resultado || 'IdPregunta: ' || v_dimo_pregunta_segu_row.id_pregunta || ';' || CHR(9) || 'Label: ' || v_dimo_pregunta_segu_row.label || ';' || CHR(9) || 'Respuesta: ' || v_resp_enviada || ';' || CHR(9) || 'Resultado: ' || CASE WHEN v_resp_correcta = v_resp_enviada THEN 'Correcto' ELSE 'Incorrecto' END || CHR(13); END LOOP; -- fin loop respuestas enviadas UPDATE creditopy.dimo_tc_vinc_proceso dvp SET dvp.estado = CASE WHEN v_contador_resp_total = v_contador_resp_ok THEN 1 ELSE 2 END, dvp.fecha_hora_resp = SYSDATE, dvp.respuestas_enviadas = v_clob_resultado WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso; IF v_contador_resp_ok = v_contador_resp_total THEN -- ================================================= -- -- Insertamos la tarjeta como vinculada -- ================================================= -- SELECT creditopy.seq_dimo_tc_vinc.nextval INTO v_id_seq_vinc FROM dual; INSERT INTO creditopy.DIMO_TC_VINCULADAS (id_registro, tarjeta, fecha_hora_vinculacion, id_vinc_proceso, estado, detalle_preguntas) VALUES (v_id_seq_vinc, v_dimo_vinc_proces_row.tarjeta, SYSDATE, v_dimo_vinc_proces_row.id_vinc_proceso, 1, v_clob_resultado); -- ================================================================= -- -- PROCEDIMIENTO PARA INSERTAR LA TCO EN D_CUENTA@SICOOP... Arturo Sosa -- ================================================================= -- BEGIN PR_INSERT_TCO_CUENTAS_V1(P_DOCUMENTO => v_dimo_vinc_proces_row.documento, P_TARJETA_ENCR => v_dimo_vinc_proces_row.tarjeta); END; po_retorno := 0; po_retorno_msg := 'OK'; pl_servicio_guardar('DIMO_TC_VINC_PROCESO', v_dimo_vinc_proces_row.id_vinc_proceso, NULL); ELSE po_retorno := 1; po_retorno_msg := 'No se han respondido correctamente las preguntas de seguridad'; END IF; COMMIT; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN po_retorno := -1; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'RESP_VINC_TC', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; END; /* PROCEDURE PR_INSERT_TCO_CUENTAS_V1(P_DOCUMENTO IN VARCHAR2, P_TARJETA_ENCR IN VARCHAR2) IS BEGIN DECLARE PO_DOCUMENTO VARCHAR2(40); PO_TARJETA_DESEN VARCHAR2(40); BEGIN PO_DOCUMENTO := P_DOCUMENTO; PO_TARJETA_DESEN:= CREDITOPY.FC_CRIPTO2PAN(P_TARJETA_ENCR); --RECUPERAR EL CLIENTE_ID SELECT dc.CLIENTE_ID INTO PO_DOCUMENTO FROM DIMO_SICOOP.D_CLIENTE@SICOOP dc WHERE dc.CI = P_DOCUMENTO; --HACER EL INSERT INSERT INTO DIMO_SICOOP.D_CUENTA@SICOOP (CUENTA_ID, CLIENTE_ID, PARTICIPANTE_ID, NRO_CUENTA, TIPO_CUENTA, NRO_CONTRATO, MONEDA, ENABLED, LAST_USER, LAST_TIME, CUENTA_MADRE_FLAG, CODIGO_NOVEDAD, FAVORITO) VALUES(DIMO_SICOOP.S_D_CUENTA.nextval@SICOOP, PO_DOCUMENTO, 1, PO_TARJETA_DESEN, 'TCO', '0', 'GUA', 1, 'administrador', SYSDATE(), 0, NULL, 0); COMMIT; EXCEPTION WHEN OTHERS THEN PO_DOCUMENTO := 'ALGO REVIENTA'; PO_TARJETA_DESEN := SQLCODE; END; END PR_INSERT_TCO_CUENTAS_V1;*/ ----- --- -- ============================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 03/08/2023 -- Proposito: Registrar las respuestas a las preguntas de Seguridad del -- catastro de Dimo, tu eres tu. -- -- Observaciones: -- Las respuestas enviadas en el prm "pi_clob_respuetas" deben venir con en el sgte. formato -- [ID_PREGUNTA1]:[ID_RESPUESTA1/VALOR_RESPUESTA1][;][ID_PREGUNTA2]:[ID_RESPUESTA2/VALOR_RESPUESTA2][;] [... n] -- Donde: [;] Es el separador entre cada pregunta/respuesta -- Ejemplo: [1]:[123123123][;][2]:[12123123][;][3]:[312312312] -- ============================================================================== -- PROCEDURE sp_procesar_respuestas_tu_tu(pi_id_vinc_proceso IN NUMBER, pi_clob_respuestas IN CLOB, -- String concatenado con todas las respuestas po_retorno OUT NUMBER, -- 0 = OK / != 0 NO OK po_retorno_msg OUT VARCHAR2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2) AS v_contador_resp_total NUMBER := 0; v_contador_resp_ok NUMBER := 0; v_clob_resultado CLOB := ''; v_dimo_vinc_proces_row creditopy.dimo_tc_vinc_proceso%ROWTYPE; v_dimo_pregunta_segu_row creditopy.dimo_tc_preguntas_seguridad%ROWTYPE; v_id_seq_vinc NUMBER := 0; v_resp_correcta VARCHAR2(3000); v_resp_enviada VARCHAR2(3000); VR_EVENTO fide_eventos_ceibo%ROWTYPE; FUNCTION GET_ID_EVENTO RETURN VARCHAR2 AS BEGIN RETURN 'FECHA_PROCESO:' || TO_CHAR(VR_EVENTO.FECHA_PROCESO, 'DD/MM/YYYY') || ' ' || 'CODIGO_EVENTO:' || VR_EVENTO.CODIGO_EVENTO || ' ' || 'ID_VINC_PROCESO:' || V_DIMO_VINC_PROCES_ROW.ID_VINC_PROCESO || ' ' || 'TARJETA:' || V_DIMO_VINC_PROCES_ROW.TARJETA || ' ' || 'DOCUMENTO:' || VR_EVENTO.DOCUMENTO || ' ' || 'CODIGO_RETORNO:' || VR_EVENTO.CODIGO_RETORNO || ' ' || 'TEXT_RETORNO:' || VR_EVENTO.TEXT_RETORNO || ' ' || 'PEDIDO_INICIO_TS:' || TO_CHAR(VR_EVENTO.PEDIDO_INICIO_TS) || ' ' || 'PEDIDO_FIN_TS:' || TO_CHAR(VR_EVENTO.TEXT_RETORNO); END; PROCEDURE PL_SERVICIO_GUARDAR(CP_TABLA_ORIGEN IN VARCHAR2, NP_ID_ORIGEN IN NUMBER, CP_UUID IN VARCHAR2 DEFAULT NULL) AS BEGIN VR_EVENTO.PEDIDO_INICIO_TS := SYSTIMESTAMP; VR_EVENTO.Documento := v_dimo_vinc_proces_row.documento; vr_evento.importe := 0; vr_evento.codigo_evento := 'PREGUNTAS_TUTU'; OPERAC_SICOOP.PKG_OD.PR_GUARDAR_EVENTOS_CEIBO@SICOOP(DP_FECHA_PROCESO => VR_EVENTO.FECHA_PROCESO, CP_DOCUMENTO => VR_EVENTO.DOCUMENTO, CP_TABLA_ORIGEN => CP_TABLA_ORIGEN, NP_MONTO_OPERACION => VR_EVENTO.IMPORTE, NP_ID_ORIGEN => NP_ID_ORIGEN, CP_UUID => CP_UUID, CP_CODIGO_EVENTO => VR_EVENTO.CODIGO_EVENTO, CP_CODIGO_RETORNO => VR_EVENTO.CODIGO_RETORNO, CP_TEXT_RETORNO => VR_EVENTO.TEXT_RETORNO); VR_EVENTO.PEDIDO_FIN_TS := SYSTIMESTAMP; PR_CEIBO_LOG('PKG_DIMO_CEIBO', 'PL_SERVICIO_GUARDAR', 'Evento informado. EventoId:' || GET_ID_EVENTO, SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN PR_CEIBO_LOG('PKG_DIMO_CEIBO', 'PL_SERVICIO_GUARDAR', 'Error al Informar el evento. EventoId:' || GET_ID_EVENTO || ' ' || SQLERRM, SYSDATE, 'DIMO'); END; BEGIN -- ============================================== -- -- Obtenemos los datos del Proceso de Vinculacion -- ============================================== -- BEGIN SELECT dvp.* INTO v_dimo_vinc_proces_row FROM creditopy.dimo_tc_vinc_proceso dvp WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso; -- * Validamos el estado de la vinculacion, debe estar en 0 = Iniciado IF v_dimo_vinc_proces_row.estado != 0 THEN raise_application_error(-20001, 'El estado del proceso de vinculacion de TC ha sido ' || CASE WHEN v_dimo_vinc_proces_row.estado = 1 THEN 'Finalizado previamente' WHEN v_dimo_vinc_proces_row.estado = 2 THEN 'Rechazado previamente' WHEN v_dimo_vinc_proces_row.estado = 3 THEN 'Dado de Baja' ELSE 'no reconocido' END); END IF; -- * Validamos si la tarjeta ya no este vinculada SELECT COUNT(1) INTO v_id_seq_vinc FROM creditopy.dimo_tc_vinculadas dtc WHERE dtc.tarjeta = v_dimo_vinc_proces_row.tarjeta AND dtc.estado = 1 -- Vinculado... ; IF v_id_seq_vinc > 0 THEN raise_application_error(-20001, 'La tarjeta ya se encuentra vinculada a DIMO'); END IF; -- Obtenemos la cantidad de respuestas que deben ser respondidas... SELECT COUNT(1) INTO v_contador_resp_total FROM (SELECT dtcp.id_pregunta FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = pi_id_vinc_proceso GROUP BY dtcp.id_vinc_proceso, dtcp.id_pregunta); EXCEPTION WHEN NO_DATA_FOUND THEN raise_application_error(-20001, ' No existe el Id ProcesoVinculacion ' || pi_id_vinc_proceso); WHEN OTHERS THEN RAISE; END; -- ==================================== -- -- Procesamos las respuestas envidas -- ==================================== -- v_contador_resp_ok := 0; -- Obtenemos en un select la Lista de Preguntas/Respuestas FOR respuestas IN (SELECT TRIM(substr(resp.pregunta, 2, length(resp.pregunta) - 2)) id_pregunta, TRIM(substr(resp.respuesta, 2, length(resp.respuesta) - 2)) respuesta FROM (SELECT creditopy.f_split_valor(TRIM(registro), ':', 1) pregunta, creditopy.f_split_valor(TRIM(registro), ':', 2) respuesta FROM (SELECT column_value AS registro FROM TABLE(creditopy.f_split_clob(pi_clob_respuestas, '[;]'))) WHERE registro IS NOT NULL) resp) LOOP v_resp_correcta := ''; v_resp_enviada := ''; -- * Obtenemos la config de la pregunta y su valor valido para la comparacion.. BEGIN SELECT ps.* INTO v_dimo_pregunta_segu_row FROM creditopy.dimo_tc_preguntas_seguridad ps WHERE to_char(ps.id_pregunta) = respuestas.id_pregunta AND PS.DESTINO_CONSULTA = 'TUTU' --DESTINO ; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001, ' No existe el Id Pregunta ' || respuestas.id_pregunta); END; -- * Obtenemos el VALOR VALIDO de la Respuesta v_resp_correcta := f_get_resp_pregunta_tutu(respuestas.id_pregunta, v_dimo_vinc_proces_row.documento); -- * Obtenemos el VALOR ENVIADO para Responder pregunta de seguridad -- Si el Pregunta esta configurada como CON opciones multiples IF v_dimo_pregunta_segu_row.opciones_s_n = 'S' THEN -- Se envia el ID de Respuesta.. SELECT MAX(dtcp.valor_respuesta) INTO v_resp_enviada FROM creditopy.dimo_tc_vinc_proceso_preguntas dtcp WHERE dtcp.id_vinc_proceso = pi_id_vinc_proceso AND dtcp.id_pregunta = respuestas.id_pregunta AND TO_CHAR(dtcp.id_respuesta) = TO_CHAR(respuestas.respuesta); ELSE -- Se envia el VALOR en si v_resp_enviada := respuestas.respuesta; END IF; /* -- Se comenta condicion por que se encontro que el PL no toma bien los RAISE dentro de un Loop -- if v_resp_correcta is null then po_retorno_msg := 'No se pudo obtener la respuesta correcta p/ comparacion, de una de las preguntas. IdPregunta: '|| respuestas.id_pregunta; raise_application_error(-20001, 'No se pudo obtener la respuesta correcta p/ comparacion, de una de las preguntas. IdPregunta: '|| respuestas.id_pregunta ); end if; */ -- * Si llegamos hasta aqui, comparamos las respuestas... IF v_resp_correcta = v_resp_enviada THEN v_contador_resp_ok := v_contador_resp_ok + 1; END IF; v_clob_resultado := v_clob_resultado || 'IdPregunta: ' || v_dimo_pregunta_segu_row.id_pregunta || ';' || CHR(9) || 'Label: ' || v_dimo_pregunta_segu_row.label || ';' || CHR(9) || 'Respuesta: ' || v_resp_enviada || ';' || CHR(9) || 'Resultado: ' || CASE WHEN v_resp_correcta = v_resp_enviada THEN 'Correcto' ELSE 'Incorrecto' END || CHR(13); END LOOP; -- fin loop respuestas enviadas UPDATE creditopy.dimo_tc_vinc_proceso dvp SET dvp.estado = CASE WHEN v_contador_resp_total = v_contador_resp_ok THEN 1 ELSE 2 END, dvp.fecha_hora_resp = SYSDATE, dvp.respuestas_enviadas = v_clob_resultado WHERE dvp.id_vinc_proceso = pi_id_vinc_proceso; IF v_contador_resp_ok = v_contador_resp_total THEN -- ================================================= -- -- Insertamos la tarjeta como vinculada -- ================================================= -- SELECT creditopy.seq_dimo_tc_vinc.nextval INTO v_id_seq_vinc FROM dual; --insertar en tabla de dimo_catastros_completados /*insert into creditopy.DIMO_TC_VINCULADAS ( id_registro, tarjeta, fecha_hora_vinculacion, id_vinc_proceso, estado, detalle_preguntas ) values ( v_id_seq_vinc, v_dimo_vinc_proces_row.tarjeta, sysdate, v_dimo_vinc_proces_row.id_vinc_proceso, 1, v_clob_resultado );*/ po_retorno := 0; po_retorno_msg := 'OK'; pl_servicio_guardar('DIMO_TC_VINC_PROCESO', v_dimo_vinc_proces_row.id_vinc_proceso, NULL); ELSE po_retorno := 1; po_retorno_msg := 'No se han respondido correctamente las preguntas de seguridad'; END IF; COMMIT; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; EXCEPTION WHEN OTHERS THEN po_retorno := -1; PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN creditopy.pkg_dimo_ceibo.pr_ceibo_log('DIMO', 'RESP_VINC_TC', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; END sp_procesar_respuestas_tu_tu; ----- ------ -- ====================================================================== -- -- Autor: Edgar Rojas -- Fecha: 19/05/2021 -- Proposito: Obtener datos de la tarjeta -- ====================================================================== -- PROCEDURE PR_DATOS_TARJETA(CP_TARJETA IN VARCHAR2, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, PO_DATOS_TARJETAS OUT SYS_REFCURSOR) AS VC_CRIPTO TARJETAS.TARJETA%TYPE; BEGIN VC_CRIPTO := FC_PAN2CRIPTO(CP_TARJETA); OPEN PO_DATOS_TARJETAS FOR SELECT T.EMISOR, T.SUCURSAL_EMISOR, T.NUMERO_CUENTA, T.ADICIONAL, T.DOCUMENTO, T.FECHA_OTORGADA, T.FECHA_VIGENCIA, T.NOMBRE_PARA_PLASTICO FROM TARJETAS T WHERE T.TARJETA = VC_CRIPTO; PO_SQLCODE := 0; PO_SQLERRM := 'La consulta fue realizada.'; EXCEPTION WHEN OTHERS THEN PO_SQLCODE := SQLCODE; PO_SQLERRM := SQLERRM; BEGIN PR_CEIBO_LOG('PKG_DIMO_CEIBO', 'PR_DATOS_TARJETA', TO_CHAR(SQLERRM), SYSDATE, 'DIMO'); EXCEPTION WHEN OTHERS THEN NULL; END; END; -- ====================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 17/08/2023 -- Proposito: Retornar la fecha de la ultima compra con TC -- ====================================================================== -- FUNCTION FN_RETORNA_ULTIMA_COMPRA(P_DOCUMENTO IN NUMBER) RETURN DATE IS V_FECHA DATE; is_found NUMBER; BEGIN is_found := 0; BEGIN SELECT MAX(to_date((to_char(tc.FECHA, 'dd/mm/yyyy') || to_char(tc.hora, ' hh24:mi')), 'dd/mm/yyyy hh24:mi')) fecha INTO V_FECHA FROM creditopy.log_transacc_cr@olpy tc WHERE TRIM(SUBSTR(tc.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO, '000000000000')) AND tc.codigo_operacion = 0 AND tc.emisor <> 115 AND tc.tipo_autorizacion = 'A' ORDER BY 1 DESC; IF V_FECHA IS NULL THEN RAISE no_data_found; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN -- SI NO SE ENCUENTRA SE BUSCA EN EL HISTORICO BEGIN SELECT MAX(to_date((to_char(th.FECHA, 'dd/mm/yyyy') || to_char(th.hora, ' hh24:mi')), 'dd/mm/yyyy hh24:mi')) fecha INTO V_FECHA FROM creditopy.log_transacc_cr_hist@olpy th WHERE TRIM(SUBSTR(th.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO /*'4040440'*/, '000000000000')) AND th.codigo_operacion = 0 AND th.tipo_autorizacion = 'A' AND th.emisor <> 115 --and th.fecha>sysdate-30 AND th.MOVEXTFCH > SYSDATE - 30 ORDER BY 1 DESC; EXCEPTION WHEN NO_DATA_FOUND THEN V_FECHA := NULL; END; -- WHEN OTHERS THEN -- V_FECHA := SYSDATE + 2; END; /* for b in (SELECT MAX(to_date((tc.FECHA||to_char(tc.hora,' hh24:mi')),'dd/mm/yyyy hh24:mi')) fecha FROM creditopy.log_transacc_cr@olpy tc WHERE TRIM(SUBSTR(tc.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO , '000000000000')) and tc.codigo_operacion=0 and tc.emisor<>115 and tc.tipo_autorizacion='A' ORDER BY 1 DESC ) loop --vc_tarjeta := b.d_bin||PI_SUFIJO_TARJETA; begin exit when nvl(is_found,0) = 1; exception when no_data_found then is_found := 0; when others then raise; end; end loop;*/ RETURN V_FECHA; END FN_RETORNA_ULTIMA_COMPRA; -- ====================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 22/08/2023 -- Proposito: Retornar el importe de la ultima compra con TC -- ====================================================================== -- FUNCTION FN_RETORNA_IMPORTE_UC(P_DOCUMENTO IN NUMBER) RETURN NUMBER IS V_IMPORTE NUMBER := 0; is_found NUMBER; -- V_MAX_FEC DATE:=CREDITOPY.PKG_DIMO_CEIBO.FN_RETORNA_ULTIMA_COMPRA(P_DOCUMENTO); v_fec VARCHAR2(10); v_hora VARCHAR2(5); BEGIN BEGIN SELECT to_char(x.FEC_ULT, 'DD/MM/YYYY') fecha, to_char(x.FEC_ULT, 'hh24:mi') HORA INTO v_fec, v_hora FROM (SELECT CREDITOPY.PKG_DIMO_CEIBO.FN_RETORNA_ULTIMA_COMPRA(P_DOCUMENTO) FEC_ULT FROM DUAL) x; EXCEPTION WHEN OTHERS THEN v_fec := NULL; v_hora := NULL; END; is_found := 0; IF v_fec IS NULL THEN V_IMPORTE := NULL; ELSE BEGIN SELECT tc.importe INTO V_IMPORTE FROM creditopy.log_transacc_cr@olpy tc WHERE TRIM(SUBSTR(tc.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO, '000000000000')) AND tc.codigo_operacion = 0 AND tc.emisor <> 115 AND tc.tipo_autorizacion = 'A' AND TRIM(TO_CHAR(tc.FECHA, 'DD/MM/YYYY')) = TRIM(v_fec) AND TRIM(to_char(tc.hora, 'hh24:mi')) = TRIM(v_hora) ORDER BY 1 DESC; EXCEPTION WHEN NO_DATA_FOUND THEN -- SI NO SE ENCUENTRA SE BUSCA EN EL HISTORICO BEGIN SELECT th.importe -- MAX(to_date((th.FECHA || to_char(th.hora, ' hh24:mi')), -- 'dd/mm/yyyy hh24:mi')) fecha INTO V_IMPORTE FROM creditopy.log_transacc_cr_hist@olpy th WHERE TRIM(SUBSTR(th.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO /*'4040440'*/, '000000000000')) AND th.codigo_operacion = 0 AND th.tipo_autorizacion = 'A' AND th.emisor <> 115 --and th.fecha>sysdate-30 AND th.MOVEXTFCH > SYSDATE - 30 AND TRIM(TO_CHAR(th.FECHA, 'DD/MM/YYYY')) = TRIM(v_fec) AND TRIM(to_char(th.hora, 'hh24:mi')) = TRIM(v_hora) ORDER BY 1 DESC; EXCEPTION WHEN NO_DATA_FOUND THEN V_IMPORTE := NULL; END; -- WHEN OTHERS THEN -- V_FECHA := SYSDATE + 2; END; END IF; RETURN V_IMPORTE; END FN_RETORNA_IMPORTE_UC; -- ====================================================================== -- -- Autor: Feliciano Amarilla -- Fecha: 23/08/2023 -- Proposito: Retornar el COMERCIO de la ultima compra con TC -- ====================================================================== -- FUNCTION FN_RETORNA_COMERCIO_UC(P_DOCUMENTO IN NUMBER) RETURN VARCHAR2 IS V_COMERCIO creditopy.comercios.descripcion%TYPE; is_found NUMBER; -- V_MAX_FEC DATE:=CREDITOPY.PKG_DIMO_CEIBO.FN_RETORNA_ULTIMA_COMPRA(P_DOCUMENTO); v_fec VARCHAR2(10); v_hora VARCHAR2(5); BEGIN BEGIN SELECT to_char(x.FEC_ULT, 'DD/MM/YYYY') fecha, to_char(x.FEC_ULT, 'hh24:mi') HORA INTO v_fec, v_hora FROM (SELECT CREDITOPY.PKG_DIMO_CEIBO.FN_RETORNA_ULTIMA_COMPRA(P_DOCUMENTO) FEC_ULT FROM DUAL) x; EXCEPTION WHEN OTHERS THEN v_fec := NULL; v_hora := NULL; END; is_found := 0; IF v_fec IS NULL THEN V_COMERCIO := NULL; ELSE BEGIN SELECT C.DESCRIPCION INTO V_COMERCIO FROM creditopy.log_transacc_cr@olpy tc, creditopy.comercios c WHERE TRIM(SUBSTR(tc.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO, '000000000000')) AND tc.codigo_operacion = 0 AND tc.emisor <> 115 AND tc.tipo_autorizacion = 'A' AND TRIM(TO_CHAR(tc.FECHA, 'DD/MM/YYYY')) = TRIM(v_fec) AND TRIM(to_char(tc.hora, 'hh24:mi')) = TRIM(v_hora) AND tc.nro_comercio = C.COMERCIO ORDER BY 1 DESC; EXCEPTION WHEN NO_DATA_FOUND THEN -- SI NO SE ENCUENTRA SE BUSCA EN EL HISTORICO BEGIN SELECT C.DESCRIPCION -- MAX(to_date((th.FECHA || to_char(th.hora, ' hh24:mi')), -- 'dd/mm/yyyy hh24:mi')) fecha INTO V_COMERCIO FROM creditopy.log_transacc_cr_hist@olpy th, creditopy.comercios c WHERE TRIM(SUBSTR(th.nro_documento, 4)) = TRIM(to_char(P_DOCUMENTO /*'4040440'*/, '000000000000')) AND th.codigo_operacion = 0 AND th.tipo_autorizacion = 'A' AND th.emisor <> 115 --and th.fecha>sysdate-30 AND th.MOVEXTFCH > SYSDATE - 30 AND TRIM(TO_CHAR(th.FECHA, 'DD/MM/YYYY')) = TRIM(v_fec) AND TRIM(to_char(th.hora, 'hh24:mi')) = TRIM(v_hora) AND tH.nro_comercio = C.COMERCIO ORDER BY 1 DESC; EXCEPTION WHEN NO_DATA_FOUND THEN V_COMERCIO := NULL; END; -- WHEN OTHERS THEN -- V_FECHA := SYSDATE + 2; END; END IF; RETURN V_COMERCIO; END FN_RETORNA_COMERCIO_UC; ------------------------ ----------------------- /* Info. CARGO INDIVIDUAL APLICADOS A TXS DE DEBITOS */ /**************************************************************************************************** Autor: Feliciano Amarilla Fecha: 25/09/2023 Propósito: Procedimiento que devuelve los datos del cargo que se aplica a la transacción ******************************************************************************************************/ PROCEDURE PR_RETORNA_CARGO_DEBITO(PI_FECHA_OPERACION IN DATE, PI_CANAL IN VARCHAR2, --CEIBO (POS, ATM,)/ SICOOP PI_CUENTA_ORIGINANTE IN VARCHAR2, --CEIBO / SICOOP PI_EF_ORIGINANTE IN NUMBER, --CEIBO / SICOOP PI_MONTO_TRANSACCION IN NUMBER, --CEIBO / SICOOP PI_TIPO_TRANSACCION IN VARCHAR2 DEFAULT NULL, -- SICOOP PI_COD_SERVICIO IN VARCHAR2 DEFAULT NULL, -- SICOOP PI_TIPO_CUENTA_ORIGEN IN VARCHAR2 DEFAULT NULL, -- SICOOP PI_EF_DESTINATARIO IN NUMBER DEFAULT NULL, -- SICOOP PI_CUENTA_DESTINATARIO IN VARCHAR2 DEFAULT NULL, -- SICOOP PI_TIPO_CUENTA_DESTINO IN VARCHAR2 DEFAULT NULL, -- SICOOP PI_EMISOR IN NUMBER, --CEIBO / SICOOP PI_AFINIDAD IN NUMBER, --CEIBO / SICOOP PI_CARTERA IN NUMBER, --CEIBO / SICOOP PI_RAMO_COMERCIO IN NUMBER DEFAULT NULL, --CEIBO PI_COD_COMERCIO IN NUMBER DEFAULT NULL, --CEIBO PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, P_PAGADOR OUT VARCHAR2, --P_APLICACION_DEL_CARGO OUT VARCHAR2, P_MONTO_CARGO OUT NUMBER, P_RUBRO_CARGO OUT NUMBER, -- P_CODIGO_IMPUESTO OUT NUMBER, P_ID_CARGO OUT NUMBER, P_ID_RANGO OUT NUMBER, P_GLOSA_PARA_USUARIO OUT VARCHAR2, PO_CURSOR OUT SYS_REFCURSOR) AS V_FECHA_TRAN DATE; VR_CARGO_X_TR CREDITOPY.CARGOS_POR_TRANSAC_DIMO%ROWTYPE; V_TAB_AUX CREDITOPY.CARGOS_POR_TRANSAC_DIMO%ROWTYPE; V_MIN_LOOP NUMBER := 3; V_MAX_LOOP NUMBER := 8; V_MIN_LOOP_CEIBO NUMBER := 3; V_MAX_LOOP_CEIBO NUMBER := 8; V_LOOP NUMBER; V_CANT_TRANSAC NUMBER := 0; CURSOR cur_cargos is SELECT * FROM creditopy.Cargos_Por_Transac_Dimo a WHERE canal = PI_CANAL AND a.cargo_activo = 'S' AND nvl(PI_FECHA_OPERACION,sysdate) BETWEEN a.fecha_vigencia_desde AND a.fecha_vigencia_hasta ORDER BY prioridad, id_cargo_tran; V_COSTO_ID NUMBER; V_id_rango NUMBER; V_COSTO_DESCRIPCION CREDITOPY.CARGOS_POR_TRANSAC_DIMO.DESCRIPCION_CARGO%TYPE := ' '; V_PAGADOR VARCHAR2(1000); V_MONTO_CARGO_ORIGINANTE NUMBER := 0; V_MONTO_CARGO_DESTINATARIO NUMBER := 0; V_IVA NUMBER := 0; V_RUBRO NUMBER := 0; FUNCTION FN_GET_CUENTA (P_TARJETA IN VARCHAR2) RETURN NUMBER AS v_CUENTA_IN NUMBER; BEGIN SELECT MAX (T.numero_cuenta) CUENTA INTO v_CUENTA_IN FROM creditopy.tarjetas t WHERE t.tarjeta = creditopy.fc_pan2cripto(P_TARJETA); -- and c.numero_cuenta= t.numero_cuenta; RETURN v_CUENTA_IN; END; FUNCTION FN_GET_EMISOR_CABAL(VN_TARJETA IN VARCHAR2) RETURN NUMBER IS VN_EMISOR NUMBER; BEGIN SELECT T.EMISOR INTO VN_EMISOR FROM CREDITOPY.TARJETAS T WHERE T.TARJETA = CREDITOPY.FC_PAN2CRIPTO(PI_CUENTA_ORIGINANTE); RETURN VN_EMISOR; EXCEPTION WHEN NO_DATA_FOUND THEN VN_EMISOR := 0; RETURN VN_EMISOR; WHEN OTHERS THEN RAISE; END FN_GET_EMISOR_CABAL; --Buscamos la cantidad de transacciones para el id_cargo en un periodo FUNCTION FN_GET_CANTIDAD_TRX(pi_id_cargo IN NUMBER) RETURN NUMBER IS V_CANT NUMBER := 0; V_CUENTA NUMBER; BEGIN IF LENGTH(PI_CUENTA_ORIGINANTE)=16 THEN V_CUENTA:=FN_GET_CUENTA(PI_CUENTA_ORIGINANTE); ELSE V_CUENTA:=PI_CUENTA_ORIGINANTE; END IF; SELECT (CANTIDAD) CANT INTO V_CANT FROM ACUM_TRANSAC_CUENTA a WHERE A.PERIODO = to_char(V_FECHA_TRAN, 'yyyymm') AND A.CUENTA = V_CUENTA--enviar cuenta AND a.id_cargo_tran = pi_id_cargo; -- and a.tipo_operacion=PI_TIPO_TRANSACCION; RETURN V_CANT; EXCEPTION WHEN NO_DATA_FOUND THEN V_CANT := 0; RETURN V_CANT; WHEN OTHERS THEN --RAISE; V_CANT := 0; RETURN V_CANT; END FN_GET_CANTIDAD_TRX; FUNCTION fn_get_afinidad RETURN NUMBER IS v_afinidad NUMBER; BEGIN SELECT c.grupo_afinidad INTO v_afinidad FROM creditopy.tarjetas t, creditopy.cuentas c WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_CUENTA_ORIGINANTE) and c.numero_cuenta= t.numero_cuenta; RETURN v_afinidad; EXCEPTION WHEN NO_DATA_FOUND THEN v_afinidad := 0; RETURN v_afinidad; WHEN OTHERS THEN RAISE; END fn_get_afinidad; FUNCTION fn_get_cartera RETURN NUMBER IS v_cartera NUMBER; BEGIN SELECT c.cartera INTO v_cartera FROM creditopy.tarjetas t, creditopy.cuentas c WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_CUENTA_ORIGINANTE) and c.numero_cuenta= t.numero_cuenta; RETURN v_cartera; EXCEPTION WHEN NO_DATA_FOUND THEN v_cartera := 0; RETURN v_cartera; WHEN OTHERS THEN RAISE; END fn_get_cartera; PROCEDURE buscar_un_id_cargo AS BEGIN V_COSTO_ID := 0; for c in cur_cargos loop for t in (SELECT 1 FROM dual l WHERE 1=1 and ( V_TAB_AUX.EMISOR_CABAL_DESTINATARIO=c.EMISOR_CABAL_DESTINATARIO or nvl(c.EMISOR_CABAL_DESTINATARIO,0) =0) and ( V_TAB_AUX.CODIGO_EF_DESTINATARIO=c.CODIGO_EF_DESTINATARIO or nvl(c.CODIGO_EF_DESTINATARIO,0) =0) and ( V_TAB_AUX.CARTERA_CABAL_ORIGINANTE=c.CARTERA_CABAL_ORIGINANTE or nvl(c.CARTERA_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.AFINIDAD_CABAL_ORIGINANTE=c.AFINIDAD_CABAL_ORIGINANTE or nvl(c.AFINIDAD_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.EMISOR_CABAL_ORIGINANTE=c.EMISOR_CABAL_ORIGINANTE or nvl(c.EMISOR_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.CODIGO_EF_ORIGINANTE=c.CODIGO_EF_ORIGINANTE or nvl(c.CODIGO_EF_ORIGINANTE,0) =0) and ( V_TAB_AUX.ID_TRAN_MENSAJE=c.ID_TRAN_MENSAJE or nvl(c.ID_TRAN_MENSAJE,0) =0)) loop if nvl(V_COSTO_ID,0)=0 then V_COSTO_ID:=c.id_cargo_tran; PR_LOGGING('CARGO_DIMO', '01', 'encontro un cargo PARAMETROS RECIBIDOS.' || ' V_COSTO_ID:' ||V_COSTO_ID || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); end if; end loop; end loop; EXCEPTION WHEN OTHERS THEN RAISE; END buscar_un_id_cargo; PROCEDURE buscar_un_id_cargo_ceibo AS BEGIN V_COSTO_ID := 0; for c in cur_cargos loop for t in (SELECT 1 FROM dual l WHERE 1=1 and ( V_TAB_AUX.COD_COMERCIO=c.COD_COMERCIO or nvl(c.COD_COMERCIO,0) =0) and ( V_TAB_AUX.RAMO_COMERCIO=c.RAMO_COMERCIO or nvl(c.RAMO_COMERCIO,0) =0) and ( V_TAB_AUX.CARTERA_CABAL_ORIGINANTE=c.CARTERA_CABAL_ORIGINANTE or nvl(c.CARTERA_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.AFINIDAD_CABAL_ORIGINANTE=c.AFINIDAD_CABAL_ORIGINANTE or nvl(c.AFINIDAD_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.EMISOR_CABAL_ORIGINANTE=c.EMISOR_CABAL_ORIGINANTE or nvl(c.EMISOR_CABAL_ORIGINANTE,0) =0) and ( V_TAB_AUX.CODIGO_EF_ORIGINANTE=c.CODIGO_EF_ORIGINANTE or nvl(c.CODIGO_EF_ORIGINANTE,0) =0)) -- and ( V_TAB_AUX.ID_TRAN_MENSAJE=c.ID_TRAN_MENSAJE or nvl(c.ID_TRAN_MENSAJE,0) =0)) loop if nvl(V_COSTO_ID,0)=0 then V_COSTO_ID:=c.id_cargo_tran; PR_LOGGING('CARGO_DIMO', '02',-- puede ser atm ceibo o atm qr sicoop 'encontro un cargo PARAMETROS RECIBIDOS.' || ' V_COSTO_ID:' ||V_COSTO_ID || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); end if; end loop; end loop; EXCEPTION WHEN OTHERS THEN RAISE; END buscar_un_id_cargo_ceibo; BEGIN ---CUANDO LA PETICION VIENE DE CEIBO IF UPPER(PI_CANAL) IN ('POS', 'ATM') THEN PR_LOGGING('CARGO_DIMO', '02', 'llego al principal PARAMETROS RECIBIDOS.' || ' PI_CANAL:' ||PI_CANAL || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); -- NULL; --BUSCAR EL CARGO PARA LOS DATOS ESPECIFICOS DE PARTICIPANTE/EMISOR V_FECHA_TRAN := NVL(PI_FECHA_OPERACION, SYSDATE); VR_CARGO_X_TR.CANAL := PI_CANAL; VR_CARGO_X_TR.CODIGO_EF_ORIGINANTE := PI_EF_ORIGINANTE; VR_CARGO_X_TR.EMISOR_CABAL_ORIGINANTE := PI_EMISOR; VR_CARGO_X_TR.AFINIDAD_CABAL_ORIGINANTE := PI_AFINIDAD; VR_CARGO_X_TR.CARTERA_CABAL_ORIGINANTE := PI_CARTERA; VR_CARGO_X_TR.RAMO_COMERCIO := PI_RAMO_COMERCIO; VR_CARGO_X_TR.COD_COMERCIO := PI_COD_COMERCIO; V_TAB_AUX.CANAL:=PI_CANAL; V_TAB_AUX.COD_COMERCIO:= VR_CARGO_X_TR.COD_COMERCIO; V_TAB_AUX.RAMO_COMERCIO := VR_CARGO_X_TR.RAMO_COMERCIO; V_TAB_AUX.CARTERA_CABAL_ORIGINANTE := VR_CARGO_X_TR.CARTERA_CABAL_ORIGINANTE; V_TAB_AUX.AFINIDAD_CABAL_ORIGINANTE := VR_CARGO_X_TR.AFINIDAD_CABAL_ORIGINANTE; V_TAB_AUX.EMISOR_CABAL_ORIGINANTE := VR_CARGO_X_TR.EMISOR_CABAL_ORIGINANTE; V_TAB_AUX.CODIGO_EF_ORIGINANTE := VR_CARGO_X_TR.CODIGO_EF_ORIGINANTE ; -- V_TAB_AUX.CANAL :=VR_CARGO_X_TR.CANAL; V_COSTO_ID := 0; BUSCAR_UN_ID_CARGO_CEIBO; IF V_COSTO_ID != 0 THEN VR_CARGO_X_TR.ID_CARGO_TRAN := V_COSTO_ID; V_CANT_TRANSAC := FN_GET_CANTIDAD_TRX(V_COSTO_ID); SELECT --CT.ID_CARGO_TRAN AS COSTO_ID, -- M.DESC_TRAN_MENSAJE AS COSTO_DESCRIPCION, CT.DESCRIPCION_CARGO AS COSTO_DESCRIPCION, CASE WHEN CR.TIPO_CARGO_ORIGINANTE = 'FEE' THEN CR.CARGO_ORIGINANTE + DECODE(I.VALOR_IMPUESTO, 0, 0, ROUND((CR.CARGO_ORIGINANTE * I.VALOR_IMPUESTO / 100))) ELSE ROUND(PI_MONTO_TRANSACCION * CR.PORCENTAJE_ORIGINANTE / 100) + DECODE(I.VALOR_IMPUESTO, 0, 0, ROUND(ROUND(PI_MONTO_TRANSACCION * CR.PORCENTAJE_ORIGINANTE / 100) * I.VALOR_IMPUESTO / 100)) END AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, I.VALOR_IMPUESTO AS IVA, CT.RUBRO_CARGO AS RUBRO, CT.PAGADOR, cr.id_cargo_tran_rango INTO --V_COSTO_ID, V_COSTO_DESCRIPCION, V_MONTO_CARGO_ORIGINANTE, V_MONTO_CARGO_DESTINATARIO, V_IVA, V_RUBRO, V_PAGADOR, V_id_rango FROM CREDITOPY.CARGOS_POR_TRANSAC_DIMO CT, CREDITOPY.CARGOS_POR_TRANSAC_DIMO_RANGO CR, --CREDITOPY.SICOOP_LISTA_TRANSAC_MENSAJE M, CREDITOPY.IMPUESTOS I WHERE CT.ID_CARGO_TRAN = VR_CARGO_X_TR.ID_CARGO_TRAN -- AND M.ID_TRAN_MENSAJE = CT.ID_TRAN_MENSAJE AND CT.PAGADOR != 'SUBSIDIADO' AND CR.ID_CARGO_TRAN = CT.ID_CARGO_TRAN AND CT.CANTIDAD_EXONERADA <= V_CANT_TRANSAC AND PI_MONTO_TRANSACCION BETWEEN CR.RANGO_MONTO_DESDE AND CR.RANGO_MONTO_HASTA AND I.CODIGO_IMPUESTO = CT.CODIGO_IMPUESTO; END IF; ELSE --CUANDO PROVIENE DE SICOOP -- OBTENER EL ID_TRAN_MENSAJE DE LA TRANSACCION PR_LOGGING('CARGO_DIMO', '01', 'llego al principal PARAMETROS RECIBIDOS.' || ' PI_CANAL:' ||PI_CANAL || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); BEGIN SELECT M.ID_TRAN_MENSAJE INTO VR_CARGO_X_TR.ID_TRAN_MENSAJE FROM CREDITOPY.SICOOP_LISTA_TRANSAC_MENSAJE M WHERE M.TIPO_TRANSACCION = NVL(PI_TIPO_TRANSACCION, '-1') AND M.COD_SERVICIO = NVL(PI_COD_SERVICIO, '-1') AND M.TIPO_CUENTA_ORIGEN = NVL(PI_TIPO_CUENTA_ORIGEN, '-1') AND M.TIPO_CUENTA_DESTINO = NVL(PI_TIPO_CUENTA_DESTINO, '-1') AND M.DISPONIBLE_PARA_CARGO_TRAN = 1; EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, 'Servicio no existe.'); END; --BUSCAR EL CARGO PARA LOS DATOS ESPECIFICOS DE PARTICIPANTE/EMISOR V_FECHA_TRAN := NVL(PI_FECHA_OPERACION, SYSDATE); VR_CARGO_X_TR.CANAL := PI_CANAL; VR_CARGO_X_TR.CODIGO_EF_ORIGINANTE := PI_EF_ORIGINANTE; VR_CARGO_X_TR.CODIGO_EF_DESTINATARIO := PI_EF_DESTINATARIO; -- OBTENER EL EMISOR_CABAL DE LA CUENTA ORIGINANTE Y CUENTA DESTINATARIO VR_CARGO_X_TR.EMISOR_CABAL_ORIGINANTE := FN_GET_EMISOR_CABAL(PI_CUENTA_ORIGINANTE); VR_CARGO_X_TR.EMISOR_CABAL_DESTINATARIO := FN_GET_EMISOR_CABAL(PI_CUENTA_DESTINATARIO); VR_CARGO_X_TR.AFINIDAD_CABAL_ORIGINANTE := fn_get_afinidad; VR_CARGO_X_TR.CARTERA_CABAL_ORIGINANTE := fn_get_cartera; V_COSTO_ID := 0; V_TAB_AUX.CANAL:=PI_CANAL; V_TAB_AUX.EMISOR_CABAL_DESTINATARIO:=VR_CARGO_X_TR.EMISOR_CABAL_DESTINATARIO ; V_TAB_AUX.CODIGO_EF_DESTINATARIO:=VR_CARGO_X_TR.CODIGO_EF_DESTINATARIO ; V_TAB_AUX.CARTERA_CABAL_ORIGINANTE:=VR_CARGO_X_TR.CARTERA_CABAL_ORIGINANTE ; V_TAB_AUX.AFINIDAD_CABAL_ORIGINANTE:= VR_CARGO_X_TR.AFINIDAD_CABAL_ORIGINANTE ; V_TAB_AUX.EMISOR_CABAL_ORIGINANTE:=VR_CARGO_X_TR.EMISOR_CABAL_ORIGINANTE ; V_TAB_AUX.CODIGO_EF_ORIGINANTE:= VR_CARGO_X_TR.CODIGO_EF_ORIGINANTE; V_TAB_AUX.ID_TRAN_MENSAJE:=VR_CARGO_X_TR.ID_TRAN_MENSAJE; BUSCAR_UN_ID_CARGO; IF v_costo_id != 0 THEN VR_CARGO_X_TR.Id_Cargo_Tran := v_costo_id; V_CANT_TRANSAC := FN_GET_CANTIDAD_TRX(V_COSTO_ID); SELECT -- ct.id_cargo_tran as COSTO_ID, m.desc_tran_mensaje AS COSTO_DESCRIPCION, CASE WHEN cr.tipo_cargo_originante = 'FEE' THEN cr.cargo_originante + decode(i.valor_impuesto, 0, 0, round((cr.cargo_originante * i.valor_impuesto / 100))) ELSE round(PI_MONTO_TRANSACCION * cr.porcentaje_originante / 100) + decode(i.valor_impuesto, 0, 0, round(round(PI_MONTO_TRANSACCION * cr.porcentaje_originante / 100) * i.valor_impuesto / 100)) END AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, i.valor_impuesto AS IVA, ct.rubro_cargo AS RUBRO INTO -- V_COSTO_ID, V_COSTO_DESCRIPCION, V_MONTO_CARGO_ORIGINANTE, V_MONTO_CARGO_DESTINATARIO, V_IVA, V_RUBRO FROM creditopy.CARGOS_POR_TRANSAC_DIMO ct, creditopy.CARGOS_POR_TRANSAC_DIMO_RANGO cr, creditopy.SICOOP_LISTA_TRANSAC_MENSAJE m, creditopy.IMPUESTOS i WHERE ct.id_cargo_tran = VR_CARGO_X_TR.Id_Cargo_Tran AND m.id_tran_mensaje = ct.id_tran_mensaje AND ct.pagador != 'SUBSIDIADO' AND cr.id_cargo_tran = ct.id_cargo_tran AND nvl(CT.CANTIDAD_EXONERADA, 0) <= V_CANT_TRANSAC AND PI_MONTO_TRANSACCION BETWEEN cr.rango_monto_desde AND cr.rango_monto_hasta AND i.codigo_impuesto = ct.codigo_impuesto; END IF; END IF; OPEN PO_CURSOR FOR SELECT V_COSTO_ID AS COSTO_ID, V_COSTO_DESCRIPCION AS COSTO_DESCRIPCION, V_MONTO_CARGO_ORIGINANTE AS MONTO_CARGO_ORIGINANTE, V_MONTO_CARGO_DESTINATARIO AS MONTO_CARGO_DESTINATARIO, V_IVA AS IVA, V_RUBRO AS RUBRO FROM DUAL; PO_SQLCODE := SQLCODE; PO_SQLERRM := CASE WHEN V_COSTO_ID = 0 THEN 'Sin cargo.' ELSE SQLERRM END; P_PAGADOR := V_PAGADOR; --P_APLICACION_DEL_CARGO:=V_COSTO_DESCRIPCION; P_GLOSA_PARA_USUARIO := V_COSTO_DESCRIPCION; P_MONTO_CARGO := V_MONTO_CARGO_ORIGINANTE; P_RUBRO_CARGO := V_RUBRO; --P_CODIGO_IMPUESTO:=V_IVA; P_ID_CARGO := V_COSTO_ID; P_ID_RANGO := V_id_rango; PO_SQLCODE := SQLCODE; PO_SQLERRM := CASE WHEN V_COSTO_ID = 0 THEN 'Sin cargo.' ELSE SQLERRM END; EXCEPTION WHEN NO_DATA_FOUND THEN -- IF pi_canal IN ('ATM', 'POS') THEN P_PAGADOR := 0; --P_APLICACION_DEL_CARGO:=V_COSTO_DESCRIPCION; P_GLOSA_PARA_USUARIO := 0; P_MONTO_CARGO := 0; P_RUBRO_CARGO := 0; P_ID_RANGO := 0; P_ID_CARGO := V_COSTO_ID; --se pide que se retorne igual el id_cargo --ELSE OPEN PO_CURSOR FOR SELECT nvl(v_costo_id,0) AS COSTO_ID, ' ' AS COSTO_DESCRIPCION, 0 AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, 0 AS IVA, 0 AS RUBRO FROM DUAL; PO_SQLCODE := 0; PO_SQLERRM := 'Sin cargo.'; --END IF; WHEN OTHERS THEN --IF pi_canal IN ('ATM', 'POS') THEN P_PAGADOR := 0; --P_APLICACION_DEL_CARGO:=V_COSTO_DESCRIPCION; P_GLOSA_PARA_USUARIO := -1; P_MONTO_CARGO := -1; P_RUBRO_CARGO := -1; P_ID_CARGO := -1; --ELSE OPEN PO_CURSOR FOR SELECT 0 AS COSTO_ID, ' ' AS COSTO_DESCRIPCION, 0 AS MONTO_CARGO_ORIGINANTE, 0 AS MONTO_CARGO_DESTINATARIO, 0 AS IVA, 0 AS RUBRO FROM DUAL; --END IF; PO_SQLCODE := 0; PO_SQLERRM := SQLERRM; END PR_RETORNA_CARGO_DEBITO; ----------------------- ------------------------ ----------------------- ------------------------ /* INFO. PROCEDIMIENTO PARA ENCAPSULAR PETICION DE CARGOS DE DEBITOS DE CEIBO */ /**************************************************************************************************** AUTOR: FELICIANO AMARILLA FECHA: 02/10/2023 PROPÓSITO: PROCEDIMIENTO QUE DEVUELVE LOS DATOS DEL CARGO PARA CEIBO ******************************************************************************************************/ PROCEDURE PR_RETORNA_CARGO_DEB_CEIBO(PI_FECHA_OPERACION IN DATE, PI_CANAL IN VARCHAR2, --CEIBO (POS, ATM,)/ SICOOP PI_EMISOR IN NUMBER, PI_AFINIDAD IN NUMBER, PI_CARTERA IN NUMBER, PI_CUENTA_ORIGINANTE IN VARCHAR2, --CEIBO / SICOOP PI_EF_ORIGINANTE IN NUMBER, --CEIBO / SICOOP PI_MONTO_TRANSACCION IN NUMBER, --CEIBO / SICOOP PI_RAMO_COMERCIO IN NUMBER, --CEIBO PI_COD_COMERCIO IN NUMBER, --CEIBO P_MONTO_CARGO OUT NUMBER, P_RUBRO_CARGO OUT NUMBER, P_ID_CARGO OUT NUMBER, P_ID_RANGO OUT NUMBER) IS V_SQLCODE NUMBER; V_SQLERRM VARCHAR2(4000); V_PAGADOR VARCHAR2(4000); V_MONTO_CARGO NUMBER; V_RUBRO_CARGO NUMBER; V_GLOSA_PARA_USUARIO VARCHAR2(4000); V_ID_CARGO NUMBER; V_ID_RANGO NUMBER; V_CURSOR SYS_REFCURSOR; BEGIN PR_LOGGING('CARGO_DIMO', '02', 'PKG_DIMO_CEIBO.PR_RETORNA_CARGO_DEB_CEIBO. PARAMETROS RECIBIDOS.' || ' PI_CANAL: ' ||PI_CANAL || ' PI_EMISOR: ' ||PI_EMISOR || ' PI_AFINIDAD: ' ||PI_AFINIDAD || ' PI_CARTERA: ' ||PI_CARTERA || ' PI_CUENTA_ORIGINANTE: ' ||PI_CUENTA_ORIGINANTE || ' PI_EF_ORIGINANTE: ' ||PI_EF_ORIGINANTE || ' PI_MONTO_TRANSACCION: ' ||PI_MONTO_TRANSACCION || ' PI_RAMO_COMERCIO: ' ||PI_RAMO_COMERCIO || ' PI_COD_COMERCIO: ' ||PI_COD_COMERCIO || ' FIN'); PKG_DIMO_CEIBO.PR_RETORNA_CARGO_DEBITO(PI_FECHA_OPERACION => PI_FECHA_OPERACION, PI_CANAL => PI_CANAL, --CEIBO (POS, ATM,)/ SICOOP PI_CUENTA_ORIGINANTE => PI_CUENTA_ORIGINANTE, --CEIBO / SICOOP PI_EF_ORIGINANTE => PI_EF_ORIGINANTE, --CEIBO / SICOOP PI_MONTO_TRANSACCION => PI_MONTO_TRANSACCION, --CEIBO / SICOOP PI_TIPO_TRANSACCION => NULL, -- SICOOP PI_COD_SERVICIO => NULL, -- SICOOP PI_TIPO_CUENTA_ORIGEN => NULL, -- SICOOP PI_EF_DESTINATARIO => NULL, -- SICOOP PI_CUENTA_DESTINATARIO => NULL, -- SICOOP PI_TIPO_CUENTA_DESTINO => NULL, -- SICOOP PI_EMISOR => PI_EMISOR, --CEIBO / SICOOP PI_AFINIDAD => PI_AFINIDAD, --CEIBO / SICOOP PI_CARTERA => PI_CARTERA, --CEIBO / SICOOP PI_RAMO_COMERCIO => PI_RAMO_COMERCIO, --CEIBO PI_COD_COMERCIO => PI_COD_COMERCIO, --CEIBO PO_SQLCODE => V_SQLCODE, PO_SQLERRM => V_SQLERRM, P_PAGADOR => V_PAGADOR, --P_APLICACION_DEL_CARGO OUT VARCHAR2, P_MONTO_CARGO => V_MONTO_CARGO, P_RUBRO_CARGO => V_RUBRO_CARGO, -- P_CODIGO_IMPUESTO OUT NUMBER, P_ID_CARGO => V_ID_CARGO, P_ID_RANGO => V_ID_RANGO, P_GLOSA_PARA_USUARIO => V_GLOSA_PARA_USUARIO, PO_CURSOR => V_CURSOR); --P_PAGADOR :=V_PAGADOR ; P_MONTO_CARGO := V_MONTO_CARGO; P_RUBRO_CARGO := V_RUBRO_CARGO; P_ID_CARGO := V_ID_CARGO; P_ID_RANGO := V_ID_RANGO; --P_GLOSA_PARA_USUARIO := V_GLOSA_PARA_USUARIO; END PR_RETORNA_CARGO_DEB_CEIBO; ----------------- ----------------------- ------------------------ /* INFO. PROCEDIMIENTO PARA ACUMULAR TRANSACCIONES DE DEBITOS */ /**************************************************************************************************** AUTOR: FELICIANO AMARILLA FECHA: 10/10/2023 PROPÓSITO: PROCEDIMIENTO PARA ACUMULAR TRANSACCIONES DE DEBITOS ******************************************************************************************************/ PROCEDURE PR_ACUMULAR_TRX_DEBITO(PI_ID_CARGO IN NUMBER, PI_CUENTA IN VARCHAR2, --CEIBO / SICOOP pi_fecha_operacion IN DATE, -- Se respeta la fecha de operacion para establecer el periodo pi_signo_operacion IN VARCHAR2 --- Si es negativo - corresponde a un reverso ) IS PRAGMA AUTONOMOUS_TRANSACTION; V_SQLCODE NUMBER; V_SQLERRM VARCHAR2(4000); V_ID_ACUM NUMBER; V_TIPO_OPERACION VARCHAR2(100); V_TOTAL NUMBER; V_CANT_REVERSO NUMBER; V_TOTAL_REVERSO NUMBER; vr_Regitro ACUM_TRANSAC_CUENTA%ROWTYPE; V_CANAL VARCHAR2(20); V_PERIODO NUMBER; V_CODIGO_EF NUMBER; V_EMISOR NUMBER; V_CUENTA NUMBER; V_CANTIDAD NUMBER; PROCEDURE PL_ACTUALIZAR AS BEGIN vr_Regitro.CANTIDAD := vr_Regitro.CANTIDAD + v_cantidad; vr_Regitro.FECHA_ACTUALIZACION := SYSTIMESTAMP; -- vr_Regitro.Total:=vr_Regitro.Total+v_total; -- vr_Regitro.Cant_Reverso:=vr_Regitro.Cant_Reverso+v_cant_reverso; -- vr_Regitro.Total_Reverso:=vr_Regitro.Total_Reverso+v_total_reverso; UPDATE ACUM_TRANSAC_CUENTA a SET A.CANTIDAD = vr_Regitro.CANTIDAD, A.FECHA_ACTUALIZACION = vr_Regitro.FECHA_ACTUALIZACION --a.total=vr_Regitro.Total, -- a.cant_reverso=vr_Regitro.Cant_Reverso, -- a.total_reverso=vr_Regitro.Total_Reverso WHERE A.PERIODO = V_PERIODO AND A.CUENTA = V_CUENTA AND a.id_cargo_tran = pi_id_cargo; COMMIT; EXCEPTION WHEN OTHERS THEN ROLLBACK; END; FUNCTION FN_GET_CUENTA (P_TARJETA IN VARCHAR2) RETURN NUMBER AS v_CUENTA_IN NUMBER; BEGIN SELECT MAX (T.numero_cuenta) CUENTA INTO v_CUENTA_IN FROM creditopy.tarjetas t WHERE t.tarjeta = creditopy.fc_pan2cripto(P_TARJETA); -- and c.numero_cuenta= t.numero_cuenta; RETURN v_CUENTA_IN; END; PROCEDURE pl_insert AS BEGIN SELECT ACUM_TRANSAC_CUENTA_SEQ.NEXTVAL seq INTO V_ID_ACUM FROM dual; vr_Regitro.ID_ACUM := V_ID_ACUM; -- vr_Regitro.CANAL := V_CANAL; vr_Regitro.PERIODO := V_PERIODO; -- vr_Regitro.CODIGO_EF := V_CODIGO_EF; -- vr_Regitro.EMISOR := V_EMISOR; vr_Regitro.CUENTA := V_CUENTA; vr_Regitro.CANTIDAD := v_cantidad; vr_Regitro.FECHA_ACTUALIZACION := SYSTIMESTAMP; vr_Regitro.Id_Cargo_Tran := pi_id_cargo; --vr_Regitro.Tipo_Operacion:=pi_tipo_operacion; --vr_Regitro.Total:=v_total; -- vr_Regitro.Cant_Reverso:=v_cant_reverso; --vr_Regitro.Total_Reverso:=v_total_reverso; INSERT INTO ACUM_TRANSAC_CUENTA VALUES vr_Regitro; COMMIT; EXCEPTION WHEN OTHERS THEN PL_ACTUALIZAR; END; BEGIN IF LENGTH(PI_CUENTA)=16 THEN V_CUENTA := FN_GET_CUENTA(PI_CUENTA); ELSE V_CUENTA := PI_CUENTA; END IF; IF pi_signo_operacion = '-' THEN -- V_CANAL := pi_canal; V_PERIODO := to_char(pi_fecha_operacion, 'yyyymm'); --periodo actual -- V_CODIGO_EF :=PI_EF_ORIGINANTE; -- V_EMISOR := PI_EMISOR; --V_CUENTA := PI_CUENTA; V_CANTIDAD := -1; -- V_TIPO_OPERACION := pi_tipo_operacion; -- V_TOTAL := pi_monto*-1; -- V_CANT_REVERSO := 1; -- V_TOTAL_REVERSO := pi_monto; ELSE -- V_CANAL := pi_canal; V_PERIODO := to_char(pi_fecha_operacion, 'yyyymm'); --periodo actual -- V_CODIGO_EF :=PI_EF_ORIGINANTE; -- V_EMISOR := PI_EMISOR; --V_CUENTA := PI_CUENTA; V_CANTIDAD := 1; --pi_cantidad; --V_TIPO_OPERACION := pi_tipo_operacion; --V_TOTAL := pi_monto; --V_CANT_REVERSO := 0; -- V_TOTAL_REVERSO := 0; END IF; -- begin SELECT * INTO vr_Regitro FROM ACUM_TRANSAC_CUENTA a WHERE A.PERIODO = V_PERIODO AND A.CUENTA = V_CUENTA AND A.ID_CARGO_TRAN = PI_ID_CARGO FOR UPDATE; PL_ACTUALIZAR; COMMIT; EXCEPTION WHEN NO_DATA_FOUND THEN pl_insert; WHEN OTHERS THEN ROLLBACK; END PR_ACUMULAR_TRX_DEBITO; ----------------- ----------------- ----------------------- ------------------------ /* INFO. PROCEDIMIENTO PARA SETEAR ACEPTACION DE CONDICIONES DE COMERCIOS */ /**************************************************************************************************** AUTOR: FELICIANO AMARILLA FECHA: 30/10/2023 PROPÓSITO: PROCEDIMIENTO PARA SETEAR ACEPTACION DE CONDICIONES DE COMERCIOSOS ******************************************************************************************************/ PROCEDURE PR_SET_CONDICIONES_COMERCIOS(P_COD_COMERCIO IN NUMBER, P_USUARIO IN VARCHAR2, P_CODRETORNO OUT NUMBER, P_MSGRETORNO OUT VARCHAR2, P_SQLCODE OUT NUMBER, P_SQLERRN OUT VARCHAR2) IS V_ID_REG NUMBER; BEGIN BEGIN SELECT ID_COND_COMERCIO INTO V_ID_REG FROM CREDITOPY.DOCUMENTOS_COMERCIOS WHERE COD_COMERCIO = P_COD_COMERCIO; IF V_ID_REG IS NOT NULL THEN UPDATE CREDITOPY.DOCUMENTOS_COMERCIOS SET FECHA_UPD = SYSDATE WHERE COD_COMERCIO = P_COD_COMERCIO; -- COMMIT; END IF; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; INSERT INTO CREDITOPY.DOCUMENTOS_COMERCIOS (ID_COND_COMERCIO, COD_COMERCIO, USER_COMERCIO, FECHA_ACEPT, --FECHA_UPD, ID_TIPO_DOC) VALUES (SEQ_DOCUMENTOS_COMERCIOS.NEXTVAL, P_COD_COMERCIO, P_USUARIO, SYSDATE, --FECHA_UPD, --ID_TIPO_DOC 1); END; P_CODRETORNO := 0; P_MSGRETORNO := 'OK'; COMMIT; P_SQLCODE := SQLCODE; P_SQLERRN := SQLERRM; EXCEPTION WHEN OTHERS THEN P_CODRETORNO := -1; P_MSGRETORNO := 'Error en pr_set_condiciones_comercios'; P_SQLCODE := SQLCODE; P_SQLERRN := SQLERRM; END PR_SET_CONDICIONES_COMERCIOS; ----------------- ------ /* INFO. PROCEDIMIENTO PARA ENCAPSULAR PETICION DE CARGOS DE DEBITOS DE DIMO */ /**************************************************************************************************** AUTOR: FELICIANO AMARILLA FECHA: 02/10/2023 PROPÓSITO: PROCEDIMIENTO QUE DEVUELVE LOS DATOS DEL CARGO PARA DIMO ******************************************************************************************************/ PROCEDURE sp_CargoTxsDimo(--PI_FECHA_OPERACION IN DATE, PI_CANAL IN VARCHAR2, PI_TIPO_TRANSACCION IN VARCHAR2, PI_COD_SERVICIO IN VARCHAR2, PI_EF_ORIGINANTE IN NUMBER, PI_CUENTA_ORIGINANTE IN VARCHAR2, PI_TIPO_CUENTA_ORIGEN IN VARCHAR2, PI_EF_DESTINATARIO IN NUMBER, PI_CUENTA_DESTINATARIO IN VARCHAR2, PI_TIPO_CUENTA_DESTINO IN VARCHAR2, PI_MONTO_TRANSACCION IN NUMBER, PO_SQLCODE OUT NUMBER, PO_SQLERRM OUT VARCHAR2, po_cursor OUT SYS_REFCURSOR) IS V_SQLCODE NUMBER; V_SQLERRM VARCHAR2(4000); V_PAGADOR VARCHAR2(4000); V_MONTO_CARGO NUMBER; V_RUBRO_CARGO NUMBER; V_GLOSA_PARA_USUARIO VARCHAR2(4000); V_ID_CARGO NUMBER; V_ID_RANGO NUMBER; V_CURSOR SYS_REFCURSOR; V_EMISOR_CABAL_ORIGINANTE NUMBER; V_AFINIDAD_CABAL_ORIGINANTE NUMBER; V_CARTERA_CABAL_ORIGINANTE NUMBER; FUNCTION FN_GET_EMISOR_CABAL(VN_TARJETA IN VARCHAR2) RETURN NUMBER IS VN_EMISOR NUMBER; BEGIN SELECT T.EMISOR INTO VN_EMISOR FROM CREDITOPY.TARJETAS T WHERE T.TARJETA = CREDITOPY.FC_PAN2CRIPTO(PI_CUENTA_ORIGINANTE); RETURN VN_EMISOR; EXCEPTION WHEN NO_DATA_FOUND THEN VN_EMISOR := 0; RETURN VN_EMISOR; WHEN OTHERS THEN RAISE; END FN_GET_EMISOR_CABAL; FUNCTION fn_get_afinidad RETURN NUMBER IS v_afinidad NUMBER; BEGIN SELECT c.grupo_afinidad INTO v_afinidad FROM creditopy.tarjetas t, creditopy.cuentas c WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_CUENTA_ORIGINANTE) and c.numero_cuenta= t.numero_cuenta; RETURN v_afinidad; EXCEPTION WHEN NO_DATA_FOUND THEN v_afinidad := 0; RETURN v_afinidad; WHEN OTHERS THEN RAISE; END fn_get_afinidad; FUNCTION fn_get_cartera RETURN NUMBER IS v_cartera NUMBER; BEGIN SELECT c.cartera INTO v_cartera FROM creditopy.tarjetas t, creditopy.cuentas c WHERE t.tarjeta = creditopy.fc_pan2cripto(PI_CUENTA_ORIGINANTE) and c.numero_cuenta= t.numero_cuenta; RETURN v_cartera; EXCEPTION WHEN NO_DATA_FOUND THEN v_cartera := 0; RETURN v_cartera; WHEN OTHERS THEN RAISE; END fn_get_cartera; BEGIN PR_LOGGING('CARGO_DIMO', '01', 'PKG_DIMO_CEIBO.sp_CargoTxsDimo. PARAMETROS RECIBIDOS.' || ' PI_CANAL:' ||PI_CANAL || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); -- VR_CARGO_X_TR.Emisor_Cabal_Destinatario := fn_get_emisor_cabal(PI_CUENTA_DESTINATARIO); V_EMISOR_CABAL_ORIGINANTE := fn_get_emisor_cabal(PI_CUENTA_ORIGINANTE); V_AFINIDAD_CABAL_ORIGINANTE := fn_get_afinidad; V_CARTERA_CABAL_ORIGINANTE := fn_get_cartera; --PKG_DIMO_CEIBO_feli.PR_RETORNA_CARGO_DEBITO_v2 PKG_DIMO_CEIBO.PR_RETORNA_CARGO_DEBITO (PI_FECHA_OPERACION => SYSDATE, PI_CANAL => PI_CANAL, --CEIBO (POS, ATM,)/ SICOOP PI_CUENTA_ORIGINANTE => PI_CUENTA_ORIGINANTE, --CEIBO / SICOOP PI_EF_ORIGINANTE => PI_EF_ORIGINANTE, --CEIBO / SICOOP PI_MONTO_TRANSACCION => PI_MONTO_TRANSACCION, --CEIBO / SICOOP PI_TIPO_TRANSACCION => PI_TIPO_TRANSACCION, -- SICOOP PI_COD_SERVICIO => PI_COD_SERVICIO, -- SICOOP PI_TIPO_CUENTA_ORIGEN => PI_TIPO_CUENTA_ORIGEN, -- SICOOP PI_EF_DESTINATARIO => PI_EF_DESTINATARIO, -- SICOOP PI_CUENTA_DESTINATARIO => PI_CUENTA_DESTINATARIO, -- SICOOP PI_TIPO_CUENTA_DESTINO => PI_TIPO_CUENTA_DESTINO, -- SICOOP PI_EMISOR => V_EMISOR_CABAL_ORIGINANTE, --CEIBO / SICOOP PI_AFINIDAD => V_AFINIDAD_CABAL_ORIGINANTE, --CEIBO / SICOOP PI_CARTERA => V_CARTERA_CABAL_ORIGINANTE, --CEIBO / SICOOP PI_RAMO_COMERCIO => NULL, --CEIBO PI_COD_COMERCIO => NULL, --CEIBO PO_SQLCODE =>PO_SQLCODE, -- V_SQLCODE, PO_SQLERRM =>PO_SQLERRM, -- V_SQLERRM, P_PAGADOR => V_PAGADOR, --P_APLICACION_DEL_CARGO OUT VARCHAR2, P_MONTO_CARGO => V_MONTO_CARGO, P_RUBRO_CARGO => V_RUBRO_CARGO, -- P_CODIGO_IMPUESTO OUT NUMBER, P_ID_CARGO => V_ID_CARGO, P_ID_RANGO => V_ID_RANGO, P_GLOSA_PARA_USUARIO => V_GLOSA_PARA_USUARIO, PO_CURSOR => PO_CURSOR); --P_PAGADOR :=V_PAGADOR ; --P_MONTO_CARGO := V_MONTO_CARGO; --P_RUBRO_CARGO := V_RUBRO_CARGO; --P_ID_CARGO := V_ID_CARGO; --P_ID_RANGO := V_ID_RANGO; --P_GLOSA_PARA_USUARIO := V_GLOSA_PARA_USUARIO; EXCEPTION WHEN OTHERS THEN PR_LOGGING('CARGO_DIMO', '01', 'ERROR EN PKG_DIMO_CEIBO.sp_CargoTxsDimo. PARAMETROS RECIBIDOS.' || ' PI_CANAL:' ||PI_CANAL || ' PI_TIPO_TRANSACCION:' ||PI_TIPO_TRANSACCION || ' PI_COD_SERVICIO:' ||PI_COD_SERVICIO || ' PI_EF_ORIGINANTE:' ||PI_EF_ORIGINANTE || ' PI_CUENTA_ORIGINANTE:' ||PI_CUENTA_ORIGINANTE || ' PI_TIPO_CUENTA_ORIGEN:' ||PI_TIPO_CUENTA_ORIGEN || ' PI_EF_DESTINATARIO:' ||PI_EF_DESTINATARIO || ' PI_CUENTA_DESTINATARIO:' ||PI_CUENTA_DESTINATARIO || ' PI_TIPO_CUENTA_DESTINO:' ||PI_TIPO_CUENTA_DESTINO || ' PI_MONTO_TRANSACCION:' ||PI_MONTO_TRANSACCION || 'FIN'); END sp_CargoTxsDimo; ----------- /* INFO. PROCEDIMIENTO PARA CAMBIAR EL NUMERO DE TICKET */ /**************************************************************************************************** AUTOR: OCTAVIO VILLASANTI FECHA: 19/07/2024 PROPÓSITO: PROCEDIMIENTO QUE ACTUALIZA EL NUMERO DE TICKET EN LA TABLA UUID Y OLPY **************************************************************************************************** */ PROCEDURE pr_actualizar_ticket_sicoop(cp_ticket in VARCHAR2, cp_uid_session in VARCHAR2, np_codigo out number, cp_descripcion out VARCHAR2) IS vc_tarjeta VARCHAR2(20); vc_ticket VARCHAR2(16); BEGIN -- Buscar en SICOOP_UUID SELECT NUM_CUENTA_ORIGEN, NRO_TICKET_RRN INTO vc_tarjeta, vc_ticket FROM SICOOP_UUID@OLPY WHERE IDSESION_UUID = cp_uid_session; --Encriptar tarjeta vc_tarjeta := fc_pan2cripto(vc_tarjeta); -- Actualizar LOG_TRANSACC_CR UPDATE LOG_TRANSACC_CR@OLPY SET NRO_TICKET = cp_ticket WHERE NRO_TARJETA = vc_tarjeta AND NRO_TICKET = vc_ticket; -- Verificar si se actualizo LOG_TRANSACC_CR IF SQL%ROWCOUNT = 0 THEN np_codigo := 2; cp_descripcion := 'No se actualizo el registro en LOG_TRANSACC_CR.'; ROLLBACK; RETURN; END IF; -- Actualizar SICOOP_UUID UPDATE SICOOP_UUID@OLPY SET NRO_TICKET_RRN = cp_ticket WHERE IDSESION_UUID = cp_uid_session AND NRO_TICKET_RRN = vc_ticket; -- Verificar si se actualizo SICOOP_UUID IF SQL%ROWCOUNT = 0 THEN np_codigo := 3; cp_descripcion := 'No se actualizo el registro en SICOOP_UUID.'; ROLLBACK; RETURN; END IF; -- Confirmar las transacciones COMMIT; np_codigo := 0; cp_descripcion := 'Operacion completada correctamente. Codigo de salida: 0'; EXCEPTION WHEN NO_DATA_FOUND THEN np_codigo := 1; cp_descripcion := 'No se encontraron registros para este UUID.'; WHEN TOO_MANY_ROWS THEN np_codigo := 4; cp_descripcion := 'Existe mas de un registro para este UUID.'; WHEN OTHERS THEN np_codigo := SQLCODE; cp_descripcion := SQLERRM; ROLLBACK; END; ----------- BEGIN -- Initialization --sp_setearValoresSession; PV_BITACORA_ID := GET_PROCESO_ID; PV_USUARIO := NVL(PV_USUARIO, CC_USUARIO_DIMO); END PKG_DIMO_CEIBO;