Crm-offer-client-scheduler-service

De Plataforma COA Crowd
Saltar a: navegación, buscar

Este servicio es el encargado de llevar a cabo la carga de datos para oferta diaria para Fisa, este proceso se encarga de extraer datos de big query y enviarlos por medio de Kafka al topico crm-preloaded-client para ser consumidos por los jobs de flink a fin de ser gestionada una oferta para cada cliente seleccionado.

Dependencias

Base de Datos

Este servicio hace uso del proyecto ws-producto-mx del cual utiliza las base de datos BUO_FISA, BUR_Fisa, Cobranza y CRM_PLATFORM.
De las cuales su uso es:

BUO_FISA

De esta base de datos se extraen todos los datos relacionados sobre los contratos utilizando las tablas evolucion_diaria_contratos y productos.

BUR_Fisa

De esta base de datos se extrae informacion sobre montos de los contratos haciendo uso de la tabla riesgos_contratos.

Cobranza

De esta base de datos se extraen los movimientos realizados sobre cada uno de los contratos que cumplen con los criterios de busqueda, estos movimientos son extraidos de la tabla movimientos.

CRM_PLATFORM

Esta base de datos se usa para monitorear la tabla finantial_closure_tracking en busca de registros que cumplen las condiciones para disparar el proceso de extraccion de informacion.

Especificaciones de Negocio

Informacion de Salida

La informacion que se envia del servicio al topico de Kafka tiene la siguiente estructura:

{
    tenantId: FISA,
    clientId: BUO_FISA.evolucion_diaria_contratos.cliente,
    customerStatus: [
     Obj{customerStatus}
    ],
    lifeCycle: [
     Obj{lifeCycle}
    ],
    transaction: [
     Obj{transaction}
    ]
} Donde tenantId sera un valor fijo y el resto de informacion sera mapeado en base a la informacion de las tablas como se detalla a continuacion:

Mapeo de Informacion

customerStatus lifeCycle transaction
{
    cliente : BUO_FISA.evolucion_diaria_contratos.cliente,
    contractID : BUO_FISA.evolucion_diaria_contratos.contrato,
    contractType : BUO_FISA.evolucion_diaria_contratos.tipo_contrato,
    openDate : BUO_FISA.evolucion_diaria_contratos.fecha_disposicion,
    closeDate : BUO_FISA.evolucion_diaria_contratos.fecha_liq,
    propietary : BUO_FISA.evolucion_diaria_contratos.propietario,
    segment : BUO_FISA.evolucion_diaria_contratos.segmento,
    productType : BUO_FISA.evolucion_diaria_contratos.tipo_producto,
    productId : BUO_FISA.evolucion_diaria_contratos.producto,
    category : BUO_FISA.evolucion_diaria_contratos.categoria,
    branchId : BUO_FISA.evolucion_diaria_contratos.sucursal,
    paymentFrequency : BUO_FISA.evolucion_diaria_contratos.frecuencia_pago,
    paymentTerms : BUO_FISA.evolucion_diaria_contratos.no_pagos,
    salerId : BUO_FISA.evolucion_diaria_contratos.vendedor,
    saleGroup : BUO_FISA.evolucion_diaria_contratos.grupo_ventas,
    cycle : BUO_FISA.evolucion_diaria_contratos.ciclo,
    customerScore : BUO_FISA.evolucion_diaria_contratos.calificacion_cliente,
    creditLimit : BUO_FISA.evolucion_diaria_contratos.limite_credito,
    daysPastDue : BUO_FISA.evolucion_diaria_contratos.dias_vencidos,
    numberOfPayments : BUO_FISA.evolucion_diaria_contratos.no_ult_pago,
    dpdMaximum : BUO_FISA.evolucion_diaria_contratos.maximo_retraso,
    outstandingBalance : BUO_FISA.evolucion_diaria_contratos.capital_insoluto,
    creditAmount : [VER DEFINICION EN PARTE INFERIOR],
    status : BUO_FISA.evolucion_diaria_contratos.status,
    paymentAmount : BUO_FISA.evolucion_diaria_contratos.monto_pago,
    interestRate : BUO_FISA.evolucion_diaria_contratos.tasa,
    noUltPagoAnt : BUO_FISA.evolucion_diaria_contratos(no_ult_pago is null then 0 else no_ult_pago -1),
    diaPago : extract(day from BUO_FISA.evolucion_diaria_contratos.fecha_prox_pago),
    fechaUltimaDisposicion : BUO_FISA.evolucion_diaria_contratos.fecha_ult_disposicion,
    fechaUltimoMovimiento : BUO_FISA.evolucion_diaria_contratos.fecha_ult_mov,
    isMobile : BUO_FISA.productos(descripcion like '%CELU%' then true else false)
}
creditAmount: por cada contrato se toma el valor maximo entre BUR_Fisa.riesgos_contratos.monto y BUR_Fisa.riesgos_contratos.monto_colocado, con la excepcion de que cuando el contrato no es encontrado en BUR_Fisa.riesgos_contratos entonces se tomara el valor maximo para el contrato del campo BUO_FISA.evolucion_diaria_contratos.monto_colocado.
{
    cliente : BUO_FISA.evolucion_diaria_contratos.cliente,
    contractID : Cobranza.movimientos.contrato,
    applicationDate : Cobranza.movimientos.fecha_hora,
    applicantId : Cobranza.movimientos.operador,
    branchId : Cobranza.movimientos.sucursal_origen,
    transactionCode : Cobranza.movimientos.codigo,
    reference : Cobranza.movimientos.referencia,
    conceptAmount : Cobranza.movimientos.monto_concepto,
    conceptIva : Cobranza.movimientos.iva_concepto,
    capitalAmoun : Cobranza.movimientos.monto_capital
}

Reglas De Extraccion

El modelo:

{
    tenantId: FISA,
    clientId: BUO_FISA.evolucion_diaria_contratos.cliente,
    customerStatus: [
     Obj{customerStatus}
    ],
    lifeCycle: [
     Obj{lifeCycle}
    ],
    transaction: [
     Obj{transaction}
    ]
}

tiene una jerarquia donde customerStatus es informacion que explicitamente debera existir y cumplir con las condiciones, de no ser asi no es informacion candidata para oferta diaria, los datos lifeCycle y transaction pueden o no existir, estos no son obligatorios.

Validaciones para recopilacion de informacion:
customerStatus:

Se seleccionan aquellos clientes y sus respectivos contratos donde BUO_FISA.evolucion_diaria_contratos.fecha_informacion sea igual a la fecha deseada de extraccion (regularmente dia vencido) con BUO_FISA.evolucion_diaria_contratos.dias_vencidos >= -29 y <=0 y BUO_FISA.evolucion_diaria_contratos.status in ('D','C')

lifeCycle:

Tomando como base los distintos clientes obtenidos en customerStatus se filtrara el campo BUO_FISA.evolucion_diaria_contratos.cliente donde este debera existir en los clientes dentro de customerStatus, el siguiente filtro sera donde  BUO_FISA.evolucion_diaria_contratos.fecha_informacion sea igual a la fecha deseada de extraccion (regularmente dia vencido) y BUO_FISA.evolucion_diaria_contratos.status in ('V','P')

transaction:

Tomando como base los contratos obtenidos en customerStatus y lifeCycle se filtrara el campo Cobranza.movimientos.contrato donde este debera exisitir en los contratos dentro de customerStatus y lifeCycle, el siguiente y ultimo filtro sera validar que el campo Cobranza.movimientos.contrato.fecha_hora sea igual a la fecha deseada de extraccion (regularmente dia vencido)

Accionamiento de Scheduler

Su accionamiento se desarrolla mediante una expresion cron la cual se define dentro de la propiedad scheduler.crmofferclient.monthly.cron dentro del properties del proyecto, el valor actual se encuentra establecido como 0 15 3 ? * * lo cual se traduce como "todos los dias a las 3:15 am", una vez disparado el cron este se encarga de buscar dentro de la tabla CRM_PLATFORM.finantial_closure_tracking el registro con el valor fecha en closure_date mas reciente el cual su valor fisa_status tenga valor null, una vez que se encuentre este registro se procede a actualizar el valor del campo fisa_status en LOADING para fecha obtenida en closure_date acto seguido se comienza la ejecucion asyncrona de extraccion de informacion.

CRM_PLATFORM.finantial_closure_tracking
closure_date DATE
created_at TIMESTAMP
updated_at TIMESTAMP
status STRING
fisa_status STRING
aef_status STRING
Nota: El valor debe ser enviado dentro del properties al despliegue esto debido a que se intento enviar mediante secrets y esto en algun punto interfiere con la interpretacion del mismo secret.

Endpoints