Proyecto

General

Perfil

Acciones

feature #843

cerrada

feature #818: Conciliacion - Conciliacion Vpos

feature #840: Procedimiento que Inserta los Datos a Conciliar

Procedimiento de Inserción

Añadido por Alcides Alarcón hace 13 días. Actualizado hace 13 días.

Estado:
cerrado
Prioridad:
normal
Asignado a:
Fecha de inicio:
11/06/2026
Fecha fin:
% Realizado:

100%

Tiempo estimado:

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;

Acciones

Exportar a: Atom PDF