feature #843
cerradafeature #818: Conciliacion - Conciliacion Vpos
feature #840: Procedimiento que Inserta los Datos a Conciliar
Procedimiento de Inserción
100%
Descripción
El procedimiento se encuentra listo, pero con datos en duro.
-- DROP FUNCTION conciliacion.fn_conciliacion__legacy_bancard();
CREATE OR REPLACE FUNCTION conciliacion.fn_conciliacion__legacy_bancard()
RETURNS void
LANGUAGE plpgsql
AS $function$
DECLARE
_rec_resultado RECORD;
_rec RECORD;
BEGIN
WITH q_lista AS (
SELECT tm.tenant_id, -- Tupi
7757551 AS persona_id, -- Tupi
6 AS entidad_id, -- Tupi
7744031 AS persona_procesadora_id, -- Bancard.
1 AS entidad_procesadora_id, -- Bancard.
1 AS medio_id, -- Tarjeta cre/(deb.
2 AS contrato_entidad_comercio_id,
3 AS pasarela_estado_id, -- 3 = Operación APROBADA.
2 AS pasarela_motivo_id, -- 2 = Conciliación
JSONB_BUILD_OBJECT(
'vpcod', v.vpcod,
'carrito_id', v.mi_carrito
) AS referencia,
NULL AS nro_cupon_promocional,
CURRENT_TIMESTAMP AS vence_en, -- la BD lo configura según el medio de pago.
tm.moneda_id, -- Las PK coinciden.
TRIM(v.amount)::NUMERIC(10, 2) AS importe,
0 AS importe_iva,
0 AS importe_descuento_cupon,
0 AS importe_descuento_medio,
0 AS importe_descuento_iva,
'Compra aprobada por VPOS en Legacy.' AS descripcion,
v.vpdate,
------------------------------
v.vpcod AS id_vpos,
v.process_id,
v.token,
v.response,
v.response_details,
v.extended_response_description,
v.currency,
v.authorization_number,
v.ticket_number,
v.response_code,
v.response_description,
v.customer_ip,
v.card_source,
v.card_country,
v."version",
TRIM(v.risk_index)::SMALLINT AS risk_index,
v.vpcodmd5
FROM tmp.vpos v
INNER JOIN base.tenant_moneda tm ON 'TUPI' = tm.tenant_id
AND v.currency = tm.moneda_id
WHERE TRIM(v.response) = 'S'
AND TRIM(v.response_code) = '00'
AND TRIM(v.vpstatus) = 'aprobado'
AND tm.es_activo IS TRUE
AND NOT EXISTS (
SELECT *
FROM procesamiento.pasarela p
WHERE p.referencia = JSONB_BUILD_OBJECT (
'vpcod', v.vpcod,
'carrito_id', v.mi_carrito
)
)
), q_total AS (
SELECT JSONB_AGG(
JSONB_BUILD_OBJECT(
'moneda_id', qx.moneda_id,
'total_pasarelas', qx.total_pasarelas
)
) AS moneda_totales
FROM (
SELECT q.moneda_id AS moneda_id,
SUM(q.importe) AS total_pasarelas
FROM q_lista q
GROUP BY 1
) qx
), q_ins_pasarela AS (
INSERT INTO procesamiento.pasarela AS p (
tenant_id,
persona_id,
entidad_id,
persona_procesadora_id,
entidad_procesadora_id,
medio_id,
contrato_entidad_comercio_id,
pasarela_estado_id,
pasarela_motivo_id,
referencia,
nro_cupon_promocional,
vence_en,
moneda_id,
importe,
importe_iva,
importe_descuento_cupon,
importe_descuento_medio,
importe_descuento_iva,
descripcion
)
SELECT q.tenant_id,
q.persona_id,
q.entidad_id,
q.persona_procesadora_id,
q.entidad_procesadora_id,
q.medio_id,
q.contrato_entidad_comercio_id,
q.pasarela_estado_id,
q.pasarela_motivo_id,
q.referencia,
q.nro_cupon_promocional,
q.vence_en,
q.moneda_id, -- coincide PYG
q.importe,
q.importe_iva,
q.importe_descuento_cupon,
q.importe_descuento_medio,
q.importe_descuento_iva,
q.descripcion
FROM q_lista q
ORDER BY q.vpdate
RETURNING p.tenant_id,
p.persona_id,
p.entidad_id,
p.persona_procesadora_id,
p.entidad_procesadora_id,
p.medio_id,
p.contrato_entidad_comercio_id,
p.pasarela_id,
p.referencia
), q_ins_pasarela_tarjeta AS (
INSERT INTO procesamiento.pasarela_tarjeta AS pt (
tenant_id,
persona_id,
entidad_id,
persona_procesadora_id,
entidad_procesadora_id,
medio_id,
contrato_entidad_comercio_id,
pasarela_id,
nombre_plataforma
)
SELECT q.tenant_id,
q.persona_id,
q.entidad_id,
q.persona_procesadora_id,
q.entidad_procesadora_id,
q.medio_id,
q.contrato_entidad_comercio_id,
q.pasarela_id,
'ECOMMERCE' AS nombre_plataforma
FROM q_ins_pasarela q
ORDER BY q.pasarela_id
RETURNING pt.pasarela_id
), q_ins_pasarela_operacion AS (
INSERT INTO procesamiento.pasarela_operacion AS po (
tenant_id,
persona_id,
entidad_id,
persona_procesadora_id,
entidad_procesadora_id,
medio_id,
contrato_entidad_comercio_id,
pasarela_id,
operacion_tipo_id,
traza_id,
error_id,
referencia,
es_exitosa,
mensaje,
fecha,
validacion,
obs
)
SELECT q1.tenant_id,
q1.persona_id,
q1.entidad_id,
q1.persona_procesadora_id,
q1.entidad_procesadora_id,
q1.medio_id,
q1.contrato_entidad_comercio_id,
q1.pasarela_id,
ot.operacion_tipo_id,
NULL::BIGINT AS traza_id,
NULL::BIGINT AS error_id,
JSONB_BUILD_OBJECT(
'shop_process_id', q0.process_id,
'ticket_number', q0.ticket_number,
'token', q0.token
) AS referencia,
TRUE AS es_exitosa,
NULL::TEXT AS mensaje,
q0.vpdate AS fecha,
NULL::VARBIT AS validacion,
'Procesado y aprobado en el ECOMMERCE.' AS obs
FROM q_lista q0
INNER JOIN q_ins_pasarela q1 ON q0.tenant_id = q1.tenant_id
AND q0.persona_id = q1.persona_id
AND q0.entidad_id = q1.entidad_id
AND q0.persona_procesadora_id = q1.persona_procesadora_id
AND q0.entidad_procesadora_id = q1.entidad_procesadora_id
AND q0.medio_id = q1.medio_id
AND q0.contrato_entidad_comercio_id = q1.contrato_entidad_comercio_id
AND q0.referencia = q1.referencia
INNER JOIN procesamiento.operacion_tipo ot ON q1.tenant_id = ot.tenant_id
AND 'CFCON' = ot.codigo -- CFCON = CONFIRMACIÓN
ORDER BY pasarela_id
RETURNING po.tenant_id,
po.persona_id,
po.entidad_id,
po.persona_procesadora_id,
po.entidad_procesadora_id,
po.medio_id,
po.contrato_entidad_comercio_id,
po.pasarela_id,
po.pasarela_operacion_id
), q_ins_pasarela_operacion_tarjeta AS (
INSERT INTO procesamiento.pasarela_operacion_tarjeta AS pot (
tenant_id,
persona_id,
entidad_id,
persona_procesadora_id,
entidad_procesadora_id,
medio_id,
contrato_entidad_comercio_id,
pasarela_id,
pasarela_operacion_id,
respuesta,
respuesta_detalle,
respuesta_extendida,
nro_autorizacion,
iva_nro_boleta,
origen,
ip_cliente,
pais,
"version",
indicador_riesgo
)
SELECT q2.tenant_id,
q2.persona_id,
q2.entidad_id,
q2.persona_procesadora_id,
q2.entidad_procesadora_id,
q2.medio_id,
q2.contrato_entidad_comercio_id,
q2.pasarela_id,
q2.pasarela_operacion_id,
CONCAT('Response: ', q3.response, ', Code: ', q3.response_code) AS respuesta,
CONCAT('Description: ', q3.response_description, ', Details: ', q3.response_details) AS respuesta_detalle,
q3.extended_response_description AS respuesta_extendida,
q3.authorization_number AS nro_autorizacion,
--q3.ticket_number AS nro_ticket, -- va como referencias en la otra tabla
NULL::TEXT /*v.iva_ticket_number*/ AS iva_nro_boleta,
q3.card_source AS origen,
q3.customer_ip AS ip_cliente,
q3.card_country AS pais,
q3."version",
q3.risk_index AS indicador_riesgo
FROM q_ins_pasarela q1
INNER JOIN q_ins_pasarela_operacion q2 ON q1.tenant_id = q2.tenant_id
AND q1.persona_id = q2.persona_id
AND q1.entidad_id = q2.entidad_id
AND q1.persona_procesadora_id = q2.persona_procesadora_id
AND q1.entidad_procesadora_id = q2.entidad_procesadora_id
AND q1.medio_id = q2.medio_id
AND q1.contrato_entidad_comercio_id = q2.contrato_entidad_comercio_id
AND q1.pasarela_id = q2.pasarela_id
INNER JOIN q_lista q3 ON q1.tenant_id = q3.tenant_id
AND q1.persona_id = q3.persona_id
AND q1.entidad_id = q3.entidad_id
AND q1.persona_procesadora_id = q3.persona_procesadora_id
AND q1.entidad_procesadora_id = q3.entidad_procesadora_id
AND q1.medio_id = q3.medio_id
AND q1.contrato_entidad_comercio_id = q3.contrato_entidad_comercio_id
AND q1.referencia = q3.referencia
ORDER BY q2.tenant_id,
q2.persona_id,
q2.entidad_id,
q2.persona_procesadora_id,
q2.entidad_procesadora_id,
q2.medio_id,
q2.contrato_entidad_comercio_id,
q2.pasarela_id,
q2.pasarela_operacion_id
RETURNING pot.tenant_id,
pot.persona_id,
pot.entidad_id,
pot.persona_procesadora_id,
pot.entidad_procesadora_id,
pot.medio_id,
pot.contrato_entidad_comercio_id,
pot.pasarela_id,
pot.pasarela_operacion_id
)
SELECT q0.cant AS cant_lista,
q1.cant AS cant_pasarela,
q2.cant AS cant_pasarela_tarjeta,
q3.cant AS cant_operacion_confirmacion,
q4.cant AS cant_operacion_confirmacion_tarjeta
INTO _rec_resultado
FROM (
SELECT COUNT(*) AS cant
FROM q_lista
) q0,
(
SELECT COUNT(*) AS cant
FROM q_ins_pasarela
) q1,
(
SELECT COUNT(*) AS cant
FROM q_ins_pasarela_tarjeta
) q2,
(
SELECT COUNT(*) AS cant
FROM q_ins_pasarela_operacion
) q3,
(
SELECT COUNT(*) AS cant
FROM q_ins_pasarela_operacion_tarjeta
) q4;
IF _rec_resultado.cant_lista IS DISTINCT FROM _rec_resultado.cant_pasarela_tarjeta THEN
RAISE EXCEPTION 'La cantidad de filas seleccionadas de LCY no coincide con la cantidad de pasarelas creadas p/tarjeta cre/deb.';
END IF;
RAISE LOG e'Resultado de filas a conciliar:
Inserción en PACO
-----------------
- Operaciones válidas seleccionadas: % fila(s).
- Pasarelas: % fila(s).
- Pasarelas-tarjetas: % fila(s).
- Operaciones de confirmación: % fila(s).
- Operaciones de confirmación de tajetas: % fila(s).',
_rec_resultado.cant_lista,
_rec_resultado.cant_pasarela,
_rec_resultado.cant_pasarela_tarjeta,
_rec_resultado.cant_operacion_confirmacion,
_rec_resultado.cant_operacion_confirmacion_tarjeta;
SELECT p.referencia
INTO _rec
FROM procesamiento.pasarela p
INNER JOIN procesamiento.pasarela_tarjeta pt ON p.tenant_id = pt.tenant_id
AND p.persona_id = pt.persona_id
AND p.entidad_id = pt.entidad_id
AND p.persona_procesadora_id = pt.persona_procesadora_id
AND p.entidad_procesadora_id = pt.entidad_procesadora_id
AND p.medio_id = pt.medio_id
AND p.contrato_entidad_comercio_id = pt.contrato_entidad_comercio_id
AND p.pasarela_id = pt.pasarela_id
INNER JOIN procesamiento.pasarela_operacion po ON p.tenant_id = po.tenant_id
AND p.persona_id = po.persona_id
AND p.entidad_id = po.entidad_id
AND p.persona_procesadora_id = po.persona_procesadora_id
AND p.entidad_procesadora_id = po.entidad_procesadora_id
AND p.medio_id = po.medio_id
AND p.contrato_entidad_comercio_id = po.contrato_entidad_comercio_id
AND p.pasarela_id = po.pasarela_id
INNER JOIN procesamiento.operacion_tipo ot ON po.tenant_id = ot.tenant_id
AND po.operacion_tipo_id = ot.operacion_tipo_id
INNER JOIN procesamiento.pasarela_operacion_tarjeta pot ON po.tenant_id = pot.tenant_id
AND po.persona_id = pot.persona_id
AND po.entidad_id = pot.entidad_id
AND po.persona_procesadora_id = pot.persona_procesadora_id
AND po.entidad_procesadora_id = pot.entidad_procesadora_id
AND po.medio_id = pot.medio_id
AND po.contrato_entidad_comercio_id = pot.contrato_entidad_comercio_id
AND po.pasarela_id = pot.pasarela_id
AND po.pasarela_operacion_id = pot.pasarela_operacion_id
WHERE p.tenant_id = 'TUPI'
AND ot.codigo = 'CFCON' -- CFCON = CONFIRMACIÓN
AND NOT EXISTS (
SELECT *
FROM tmp.vpos v
INNER JOIN base.tenant_moneda tm ON 'TUPI' = tm.tenant_id
AND v.currency = tm.moneda_id
WHERE TRIM(v.response) = 'S'
AND TRIM(v.response_code) = '00'
AND TRIM(v.vpstatus) = 'aprobado'
AND tm.es_activo IS TRUE
AND p.importe = v.amount::NUMERIC(10, 2)
AND p.referencia = JSONB_BUILD_OBJECT (
'vpcod', v.vpcod,
'carrito_id', v.mi_carrito
)
AND po.referencia = JSONB_BUILD_OBJECT(
'shop_process_id', v.process_id,
'ticket_number', v.ticket_number,
'token', v.token
)
AND pot.nro_autorizacion = v.authorization_number
)
ORDER BY p.pasarela_id
LIMIT 1;
IF FOUND THEN
RAISE EXCEPTION
USING MESSAGE = 'Inconsistencia en el proceso de creación de operaciones de cobranza con tarjetas.',
DETAIL = FORMAT('La referencia insertada no coincide con los datos temporales -> referencia: %s',
_rec.referencia),
HINT = 'Verifique la fila de la tabla temporal.';
END IF;
END;
$function$
;
-- Permissions
ALTER FUNCTION conciliacion.fn_conciliacion__legacy_bancard() OWNER TO postgres;
GRANT ALL ON FUNCTION conciliacion.fn_conciliacion__legacy_bancard() TO public;
GRANT ALL ON FUNCTION conciliacion.fn_conciliacion__legacy_bancard() TO postgres;
Actualizado por Alcides Alarcón hace 13 días
- Estado cambiado de nuevo a progreso
- % Realizado cambiado de 0 a 100
Actualizado por Alcides Alarcón hace 13 días
- Estado cambiado de progreso a revision
Actualizado por Alcides Alarcón hace 13 días
- Estado cambiado de revision a cerrado
Actualizado por Alcides Alarcón hace 13 días
Varios TRGs fueron modificados/corregidos para permitir la inserción.
Actualizado por Alcides Alarcón hace 13 días
- Estado cambiado de cerrado a revision
Actualizado por Alcides Alarcón hace 13 días
- Estado cambiado de revision a cerrado