En una frase: el modelo de datos que entregó Mapfre y el esquema del middleware (MW) parten de filosofías opuestas —Mapfre guarda el consentimiento completo; el MW no lo guarda y solo lo despacha—. No es un conflicto de columnas: es una decisión de arquitectura que conviene cerrar con Mapfre antes de avanzar.
Mapfre ya respondió varias consultas (identificador, comprobante, idempotencia) y entregó su modelo y su paquete PL/SQL. Quedan cuatro decisiones de arquitectura y cuatro observaciones técnicas sobre el modelo y el paquete, más las consultas abiertas al final de este documento.
Mapfre respondió el levantamiento técnico y adjuntó su modelo de datos de OneTrust
(seis tablas en su base prdman). Por nuestro lado ya existe el esquema Oracle del MW.
Al ponerlos lado a lado aparece una diferencia de fondo en qué persiste cada uno.
Seis tablas y un paquete PL/SQL. Guarda el consentimiento y su evidencia.
A9009072_MCL — registro de consentimientos (con receipt, versión de propósito, respuesta y estado de revocación)A9009082_MCL — cola de sincronización hacia OneTrustG2999731 / G2999728 — propósitos y sus versionesG2999761 / G2999733 — puntos de recolección y su relación con cada propósitodc_k_onetrust_mcl — paquete con las consultas de catálogo y las altasOcho tablas + paquetes PL/SQL. No guarda el consentimiento: lo despacha.
outbox) de mensajes a despachar, con reintentos y arrendamientoFuente del lado MW: esquema Oracle del repositorio (directorio de DDL del middleware). Detalle de rutas en el anexo.
De las seis tablas de Mapfre, hoy solo hay una relación confirmada: el catálogo de propósitos alimenta la pantalla del satélite, que lo usa para mostrar al usuario la lista de propósitos a consentir. En cambio, cómo el registro de consentimientos y la cola de sincronización se relacionan con el middleware —ambos al mismo nivel— está sin definir, y es el centro de la reconciliación.
G…) alimenta la pantalla del satélite.
Cómo el registro y la cola de Mapfre (A…) se relacionan con el middleware —ambos al mismo nivel— y
quién despacha finalmente a OneTrust son las preguntas abiertas.Actualización (25 de junio): Mapfre respondió varias de estas preguntas —quién despacha, el retorno del comprobante, el tratamiento del RUT y la lectura del catálogo—. El estado vigente de cada definición está en la sección 6; el diagrama conserva el planteo inicial de la reconciliación.
| Dimensión | Middleware (MW) | Modelo Mapfre |
|---|---|---|
| Estado del consentimiento | No lo guarda. Viaja dentro del cuerpo del mensaje de salida. | Lo guarda completo en registro_consentimientos. |
| Fuente de verdad | OneTrust. La lectura se resuelve contra OneTrust en tiempo real. | Conserva copia local para trazabilidad (Ley 21.719). |
| Receipt de OneTrust | No se persiste; queda en caché temporal de idempotencia. | Se persiste en txt_evidencia_receipt_jwt. |
| Identificador del titular | RUT cifrado con la herramienta de Mapfre (cifrado reversible). No se guarda en claro ni como hash. | RUT en claro (tip_docum/cod_docum); es la clave primaria de sus tablas de negocio. |
| Propósitos y versiones | No se modelan. | Catálogo versionado propio; lo lee el satélite. |
| Concepto | Modelo Mapfre | Middleware | Veredicto |
|---|---|---|---|
| Consentimiento del titular | A9009072 (tabla completa) | dentro del cuerpo del mensaje de salida | filosofía distinta |
| Cola de envío a OneTrust | A9009082 cola_sync_onetrust (resumen de trabajo interno) | outbox_mensajes (despacha) | despacha el MW |
| Revocación | estado en la fila (mca_enviado=REVOCADO) | cadena de eventos enlazados | representación distinta |
| Receipt de OneTrust | txt_evidencia_receipt_jwt | el worker lo recibe y lo copia a las tablas de Mapfre | retorno definido |
| Identificador del titular | RUT en claro (PK de negocio) | RUT cifrado con la herramienta de Mapfre (reversible) | cifrado reversible |
| Catálogo de propósitos | G2999731 + G2999728 (lo lee el satélite) | no se modela | relación confirmada |
| Idempotencia | OneTrust no la ofrece; registra por actualización-o-alta | idempotencia_respuestas (control propio) | queda en el MW |
| Auditoría · tasa · claves API | no aparece | resuelto en el MW | solo MW |
Con el modelo y el paquete PL/SQL a la vista, los puntos se separan en dos planos: las decisiones de arquitectura, que definen quién hace qué, y las observaciones técnicas sobre el paquete que Mapfre entregó.
A9009082 cola_sync_onetrust con estado y reintentos;
el MW tiene su bandeja de salida con la misma función. Dos colas de envío resiliente al mismo destino
son redundancia o un malentendido de responsabilidad. Hay que definir quién despacha a OneTrust:
el MW a través de su bandeja de salida, o Mapfre a través de su cola.txt_evidencia_receipt_jwt, pero OneTrust lo emite al despachar —de forma asíncrona, después del
202—. El MW hoy no lo persiste ni lo devuelve; solo lo retiene en caché con vencimiento.
Falta definir cómo llega ese comprobante al registro: respuesta de una consulta posterior, notificación de
retorno, o una vía nueva.mca_enviado a REVOCADO y fija la fecha de expiración—.
El MW la diseñó como una cadena de eventos enlazados. Son dos representaciones del mismo hecho; hay que elegir
una para que el envío a OneTrust y la trazabilidad local coincidan.Al revisar el DDL y el paquete dc_k_onetrust_mcl aparecen cuatro puntos que conviene plantear,
sobre todo si el middleware llegara a escribir a través de ese paquete.
max(cod_consentimiento) + 1. Ante dos altas simultáneas, ambas pueden tomar el mismo número y
chocar contra la clave primaria. Lo habitual es resolverlo con una secuencia de base de datos.commit y, ante un error, hace rollback y devuelve el mensaje como texto. Eso le quita
al middleware el control de la transacción: el MW necesita escribir el registro y su auditoría en la misma
unidad de trabajo, y un commit interno lo impide.p_ins_pto_collect
arma la fila y confirma, pero no ejecuta la inserción —los otros cuatro altas sí lo hacen—. Conviene avisarlo
para que lo corrijan de su lado.SELECT/INSERT/UPDATE/DELETE a
public sobre las seis tablas, incluida la de registro de consentimientos. Tratándose de datos
personales bajo la Ley 21.719, conviene acotarlo a un rol de aplicación dedicado y separar el acceso de
lectura del de escritura.Respondido por Mapfre (23 y 25 de junio):
txt_evidencia_receipt_jwt.G2999728); no es un token que el middleware deba validar. El mecanismo de firma y la
llave pública siguen pendientes del corporativo.Definiciones de arquitectura confirmadas por Mapfre (25 de junio):
A9009082 cola_sync_onetrust del lado de Mapfre es un resumen de trabajo interno,
no un despachador: no hay dos envíos en competencia.Lo que aún queda pendiente de definición:
Esquema de datos de OneTrust que entregó Mapfre (base prdman): catálogo de propósitos
(G2999731) y sus versiones (G2999728), puntos de recolección (G2999761)
y su relación con cada propósito (G2999733), registro de consentimientos (A9009072)
y cola de sincronización hacia OneTrust (A9009082).
prdman). Es el insumo que este documento interpreta.Objetos Oracle del MW citados en este documento, para el equipo técnico interno.
Bandeja de salida y su paquete de operaciones —encolar, tomar pendientes con arrendamiento, marcar enviado o descartado—.
ddl/01_mmw_cns_outbox_mensajes.sql · ddl/08_mmw_cns_k_outbox.sql · ddl/14_mmw_cns_k_outbox_body.sql
Reserva de idempotencia con respuesta en caché y vencimiento.
ddl/02_mmw_cns_idempotencia_respuestas.sql · ddl/09_mmw_cns_k_idempotencia.sql · ddl/15_mmw_cns_k_idempotencia_body.sql
Auditoría inmutable y pares petición/respuesta saneados.
ddl/05_mmw_cns_auditoria_log.sql · ddl/06_mmw_cns_auditoria_req_resp.sql
Identidad de negocio del consentimiento (id_consentimiento) y hash del sujeto, añadidos en el delta 16.
ddl/16_mmw_cns_outbox_identity.sql · ddl/18_mmw_cns_k_outbox_delta_t8x.sql
El diagrama entidad-relación completo de estas tablas está en el anexo F.
Junto al modelo, Mapfre entregó el paquete dc_k_onetrust_mcl: consultas de catálogo
(propósitos, versiones y puntos de recolección activos) y altas para el registro de consentimientos, la cola de
sincronización y el propio catálogo. Es el insumo de la sección 5.2.
docs/cliente/dc_k_onetrust_mcl.pck · docs/cliente/tablas.sql · docs/cliente/Relacional_Onetrust.pdf
Contenido literal de tablas.sql tal como lo entregó Mapfre (base prdman, esquema TRON2000), sin modificaciones. Las observaciones sobre permisos y diseño están en la sección 5.2.
-- Generado por Oracle SQL Developer Data Modeler 24.3.1.351.0831
-- en: 2026-06-25 11:12:13 CLT
-- sitio: Oracle Database 21c
-- tipo: Oracle Database 21c
-- predefined type, no DDL - MDSYS.SDO_GEOMETRY
-- predefined type, no DDL - XMLTYPE
-- REgistro de concentimientos
CREATE TABLE A9009072_MCL
(
cod_consentimiento NUMBER NOT NULL ,
cod_cia NUMBER NOT NULL ,
cod_usuario VARCHAR2 (50) NOT NULL ,
cod_punto_recoleccion NUMBER NOT NULL ,
cod_punto_proposito NUMBER NOT NULL ,
cod_ver_proposito NUMBER NOT NULL ,
respuesta VARCHAR2 (500) NOT NULL ,
tip_docum VARCHAR2 (10) ,
cod_docum VARCHAR2 (20) ,
ip_origen VARCHAR2 (50) ,
sistema_origen VARCHAR2 (255) NOT NULL ,
tipo_canal VARCHAR2 (255) NOT NULL ,
user_agent VARCHAR2 (500) ,
txt_evidencia_receipt_jwt VARCHAR2 (3000) ,
hash_evidencia VARCHAR2 (128) ,
fec_consentimiento DATE ,
fec_expiracion DATE ,
mca_enviado CHAR (20) NOT NULL ,
fec_actu DATE NOT NULL ,
cod_user VARCHAR2 (50) NOT NULL
)
;
COMMENT ON TABLE A9009072_MCL IS 'REgistro de concentimientos'
;
COMMENT ON COLUMN A9009072_MCL.cod_consentimiento IS 'Codigo del consentimiento que se esta guardando'
;
COMMENT ON COLUMN A9009072_MCL.cod_cia IS 'compañia ya que esto relaciona al sector que puede vehiculos, generales, vida'
;
COMMENT ON COLUMN A9009072_MCL.cod_usuario IS 'usuario del punto de coleccion quien ingresa el registro'
;
COMMENT ON COLUMN A9009072_MCL.cod_punto_recoleccion IS 'codigode punto de recoleccion'
;
COMMENT ON COLUMN A9009072_MCL.cod_punto_proposito IS 'codigo de punto de proposito'
;
COMMENT ON COLUMN A9009072_MCL.cod_ver_proposito IS 'codigo de la version del proposito'
;
COMMENT ON COLUMN A9009072_MCL.respuesta IS 'Esto corresponde a la respuesta del servicio, sie s afrimativa un 200 o 201 y si es negativa puede ser un 401 o 500 o etc'
;
COMMENT ON COLUMN A9009072_MCL.tip_docum IS 'corresponde al tipo de documeto del tercero RUT, COG, etc'
;
COMMENT ON COLUMN A9009072_MCL.cod_docum IS 'corresponde al valor del tipo de documento'
;
COMMENT ON COLUMN A9009072_MCL.ip_origen IS 'ip origen de donde proviene el consentimiento'
;
COMMENT ON COLUMN A9009072_MCL.sistema_origen IS '-- sistema que ejecutó la lógica(VIDA_CONDUCTOR, VEHICULOS_FLEXIBLES, ETC)'
;
COMMENT ON COLUMN A9009072_MCL.tipo_canal IS 'negocio (WEB, APP, etc.)'
;
COMMENT ON COLUMN A9009072_MCL.user_agent IS 'usuario de agente'
;
COMMENT ON COLUMN A9009072_MCL.txt_evidencia_receipt_jwt IS 'corresponde al response del servicio en el casod e crear un consentimiento, la respuesta del json del atributo receipt'
;
COMMENT ON COLUMN A9009072_MCL.hash_evidencia IS 'corresponde a una evidencia que se recepcionno correctamente'
;
COMMENT ON COLUMN A9009072_MCL.fec_consentimiento IS 'la fecha de la creaciondel consentimiento'
;
COMMENT ON COLUMN A9009072_MCL.fec_expiracion IS 'fecha de revocacion del concentimiento'
;
COMMENT ON COLUMN A9009072_MCL.mca_enviado IS 'posibles valores
-- ACTIVO
-- REVOCADO
-- EXPIRADO'
;
COMMENT ON COLUMN A9009072_MCL.fec_actu IS 'fecha del registro'
;
COMMENT ON COLUMN A9009072_MCL.cod_user IS 'ussauriode base de datos quien crea el registro'
;
CREATE INDEX A9009072_MCL_IDX ON A9009072_MCL
(
cod_consentimiento ASC ,
cod_cia ASC ,
tipo_canal ASC
)
;
ALTER TABLE A9009072_MCL
ADD CONSTRAINT registro_consentimientos_PK PRIMARY KEY ( cod_consentimiento ) ;
-- Envio de consentimiento asincrono
CREATE TABLE A9009082_MCL
(
cod_sync NUMBER NOT NULL ,
cod_consentimiento NUMBER NOT NULL ,
estado_sync VARCHAR2 (30) NOT NULL ,
fec_ultimo_intento DATE ,
respuesta_ot VARCHAR2 (2000) NOT NULL ,
fec_primer_intento DATE NOT NULL ,
codigo_error VARCHAR2 (100) ,
fec_actu DATE ,
cod_user VARCHAR2 (50)
)
;
COMMENT ON TABLE A9009082_MCL IS 'Envio de consentimiento asincrono'
;
COMMENT ON COLUMN A9009082_MCL.cod_sync IS 'identificador unico de l valor asincrono'
;
COMMENT ON COLUMN A9009082_MCL.cod_consentimiento IS 'codigo del concentimiento'
;
COMMENT ON COLUMN A9009082_MCL.estado_sync IS 'posibles valores
-- PENDIENTE
-- ENVIANDO
-- OK
-- ERROR
-- REINTENTO'
;
COMMENT ON COLUMN A9009082_MCL.fec_ultimo_intento IS 'fecha del ultimo intento de envio'
;
COMMENT ON COLUMN A9009082_MCL.respuesta_ot IS 'respuesta de la orden de trabajo del intento'
;
COMMENT ON COLUMN A9009082_MCL.fec_primer_intento IS 'fecha del primer intento de envio'
;
COMMENT ON COLUMN A9009082_MCL.codigo_error IS 'codigo del error, posible valor html 200,201,400,500, etc'
;
COMMENT ON COLUMN A9009082_MCL.fec_actu IS 'fecha de creacion del registro'
;
COMMENT ON COLUMN A9009082_MCL.cod_user IS 'codigo del usuario quein creo el registro'
;
CREATE INDEX A9009082_MCL_IDX ON A9009082_MCL
(
cod_consentimiento ASC ,
estado_sync ASC
)
;
ALTER TABLE A9009082_MCL
ADD CONSTRAINT cola_sync_onetrust_PK PRIMARY KEY ( cod_sync ) ;
-- Version de cada proposito
CREATE TABLE G2999728_MCL
(
cod_ver_proposito NUMBER NOT NULL ,
cod_proposito NUMBER NOT NULL ,
nom_version_proposito VARCHAR2 (50) NOT NULL ,
txt_legal_version VARCHAR2 (600) NOT NULL ,
txt_detalle_legal VARCHAR2 (3000) NOT NULL ,
-- Metadatos de informacion del consentimiento y propositos que son entregados
-- por negocio
requestInformation CLOB NOT NULL ,
fec_ini DATE NOT NULL ,
fec_fin DATE NOT NULL ,
mca_estado CHAR (1) NOT NULL ,
fec_actu DATE NOT NULL ,
cod_user VARCHAR2 (50) NOT NULL
)
;
COMMENT ON TABLE G2999728_MCL IS 'Version de cada proposito'
;
COMMENT ON COLUMN G2999728_MCL.cod_ver_proposito IS 'identificador de la version del proposito'
;
COMMENT ON COLUMN G2999728_MCL.cod_proposito IS 'codigo del proposito'
;
COMMENT ON COLUMN G2999728_MCL.nom_version_proposito IS 'nombre de la version del proposito'
;
COMMENT ON COLUMN G2999728_MCL.txt_legal_version IS 'texto del area legal para el proposito'
;
COMMENT ON COLUMN G2999728_MCL.txt_detalle_legal IS 'detalle del texto legal del proposito'
;
COMMENT ON COLUMN G2999728_MCL.requestInformation IS 'Metadatos de informacion del consentimiento y propositos que son entregados por negocio'
;
COMMENT ON COLUMN G2999728_MCL.fec_ini IS 'fecha de inicio de vigencia de la version'
;
COMMENT ON COLUMN G2999728_MCL.fec_fin IS 'fecha de fin de vigencia de la version'
;
COMMENT ON COLUMN G2999728_MCL.mca_estado IS 'estado S activo N inactivo'
;
COMMENT ON COLUMN G2999728_MCL.fec_actu IS 'fecha de actualizacion'
;
COMMENT ON COLUMN G2999728_MCL.cod_user IS 'codigo del ussuario de base de datos quien ingreso el registro'
;
CREATE INDEX G2999728_MCL_IDX ON G2999728_MCL
(
cod_proposito ASC ,
cod_ver_proposito ASC
)
;
ALTER TABLE G2999728_MCL
ADD CONSTRAINT proposito_version_PK PRIMARY KEY ( cod_ver_proposito ) ;
-- Tabla que guardara los propositos, para el registro de consentimientos
CREATE TABLE G2999731_MCL
(
cod_proposito NUMBER NOT NULL ,
cod_cia NUMBER NOT NULL ,
cod_proposito_codigo VARCHAR2 (100) ,
nom_proposito VARCHAR2 (255) NOT NULL ,
mca_estado CHAR (1) NOT NULL ,
fec_actu DATE NOT NULL ,
cod_user VARCHAR2 (50) NOT NULL
)
;
COMMENT ON TABLE G2999731_MCL IS 'Tabla que guardara los propositos, para el registro de consentimientos'
;
COMMENT ON COLUMN G2999731_MCL.cod_proposito IS 'Llave primaria de Propositos'
;
COMMENT ON COLUMN G2999731_MCL.cod_cia IS 'compañia ya que esto relaciona al sector que puede vehiculos, generales, vida'
;
COMMENT ON COLUMN G2999731_MCL.cod_proposito_codigo IS 'identificador del proposito alfanumerico'
;
COMMENT ON COLUMN G2999731_MCL.nom_proposito IS 'nombre del proposito'
;
COMMENT ON COLUMN G2999731_MCL.mca_estado IS 'estado del propositos S activo N inactivo'
;
COMMENT ON COLUMN G2999731_MCL.fec_actu IS 'fecha de actualizacion'
;
COMMENT ON COLUMN G2999731_MCL.cod_user IS 'ussuario quien creo el registro'
;
CREATE INDEX G2999731_MCL_IDX ON G2999731_MCL
(
cod_proposito ASC ,
cod_cia ASC ,
mca_estado ASC
)
;
ALTER TABLE G2999731_MCL
ADD CONSTRAINT propositos_PK PRIMARY KEY ( cod_proposito ) ;
-- Tabla de puntos de coleccion por cada proposito
CREATE TABLE G2999733_MCL
(
cod_punto_proposito NUMBER NOT NULL ,
cod_cia NUMBER NOT NULL ,
cod_punto_recolecicon NUMBER NOT NULL ,
cod_proposito NUMBER NOT NULL ,
obligatorio NUMBER NOT NULL ,
txt_link_canal VARCHAR2 (500) ,
nom_link VARCHAR2 (255) ,
mca_estado CHAR (1) NOT NULL ,
fec_actu DATE NOT NULL ,
cod_user VARCHAR2 (50) NOT NULL
)
;
COMMENT ON TABLE G2999733_MCL IS 'Tabla de puntos de coleccion por cada proposito'
;
COMMENT ON COLUMN G2999733_MCL.cod_punto_proposito IS 'llave primaria del registro'
;
COMMENT ON COLUMN G2999733_MCL.cod_cia IS 'compañia ya que esto relaciona al sector que puede vehiculos, generales, vida'
;
COMMENT ON COLUMN G2999733_MCL.cod_punto_recolecicon IS 'corresponde al punto de colleccion o sea el link especifico donde va este consentimiento'
;
COMMENT ON COLUMN G2999733_MCL.cod_proposito IS 'indentificador del proposito'
;
COMMENT ON COLUMN G2999733_MCL.obligatorio IS 'identifica si es obligatorio'
;
COMMENT ON COLUMN G2999733_MCL.txt_link_canal IS 'url la cual controla el poposito'
;
COMMENT ON COLUMN G2999733_MCL.nom_link IS 'nombre del link del proposito'
;
COMMENT ON COLUMN G2999733_MCL.mca_estado IS 'estado S Activo N inactivo'
;
COMMENT ON COLUMN G2999733_MCL.fec_actu IS 'fecha de actualizacion'
;
COMMENT ON COLUMN G2999733_MCL.cod_user IS 'usuario quien creo el registro'
;
CREATE INDEX G2999733_MCL_IDX ON G2999733_MCL
(
cod_punto_proposito ASC ,
cod_cia ASC ,
cod_proposito ASC
)
;
ALTER TABLE G2999733_MCL
ADD CONSTRAINT punto_proposito_PK PRIMARY KEY ( cod_punto_proposito ) ;
-- Tabla de Puntos de collecion
CREATE TABLE G2999761_MCL
(
cod_punto_coleccion_id NUMBER NOT NULL ,
cod_cia NUMBER NOT NULL ,
nom_punto_recoleccion VARCHAR2 (255) NOT NULL ,
desc_punto_recoleccion VARCHAR2 (500) ,
canal VARCHAR2 (50) NOT NULL ,
origen VARCHAR2 (100) NOT NULL ,
url_politica VARCHAR2 (500) ,
mca_estado CHAR (1) NOT NULL ,
fec_actu DATE NOT NULL ,
cod_user VARCHAR2 (50) NOT NULL
)
;
COMMENT ON TABLE G2999761_MCL IS 'Tabla de Puntos de collecion'
;
COMMENT ON COLUMN G2999761_MCL.cod_punto_coleccion_id IS 'identificador unico de punto de coleccion'
;
COMMENT ON COLUMN G2999761_MCL.cod_cia IS 'compañia ya que esto relaciona al sector que puede vehiculos, generales, vida'
;
COMMENT ON COLUMN G2999761_MCL.nom_punto_recoleccion IS 'nombre del puento de coleccion'
;
COMMENT ON COLUMN G2999761_MCL.desc_punto_recoleccion IS 'descripcion del punto de coleccion'
;
COMMENT ON COLUMN G2999761_MCL.canal IS 'canal de origen'
;
COMMENT ON COLUMN G2999761_MCL.origen IS 'origendel punto de colecicon'
;
COMMENT ON COLUMN G2999761_MCL.url_politica IS 'url del punto de coleccion de politica'
;
COMMENT ON COLUMN G2999761_MCL.mca_estado IS 'estados S activo y N inactivo'
;
COMMENT ON COLUMN G2999761_MCL.fec_actu IS 'fecha del registro'
;
COMMENT ON COLUMN G2999761_MCL.cod_user IS 'ussuario de base de datos quien creo el registro'
;
CREATE INDEX G2999761_MCL_IDX ON G2999761_MCL
(
cod_punto_coleccion_id ASC ,
cod_cia ASC ,
canal ASC ,
origen ASC
)
;
ALTER TABLE G2999761_MCL
ADD CONSTRAINT punto_coleccion_PK PRIMARY KEY ( cod_punto_coleccion_id ) ;
ALTER TABLE G2999728_MCL
ADD CONSTRAINT propo_ver_propo_FK FOREIGN KEY
(
cod_proposito
)
REFERENCES G2999731_MCL
(
cod_proposito
)
;
ALTER TABLE G2999733_MCL
ADD CONSTRAINT propo_x_collec_FK FOREIGN KEY
(
cod_punto_recolecicon
)
REFERENCES G2999761_MCL
(
cod_punto_coleccion_id
)
;
ALTER TABLE G2999733_MCL
ADD CONSTRAINT propositos_FK FOREIGN KEY
(
cod_proposito
)
REFERENCES G2999731_MCL
(
cod_proposito
)
;
ALTER TABLE A9009072_MCL
ADD CONSTRAINT reg_consen_propo_ver_FK FOREIGN KEY
(
cod_ver_proposito
)
REFERENCES G2999728_MCL
(
cod_ver_proposito
)
;
ALTER TABLE A9009072_MCL
ADD CONSTRAINT reg_consen_pto_colec_FK FOREIGN KEY
(
cod_punto_recoleccion
)
REFERENCES G2999761_MCL
(
cod_punto_coleccion_id
)
;
-- Informe de Resumen de Oracle SQL Developer Data Modeler:
--
-- CREATE TABLE 6
-- CREATE INDEX 6
-- ALTER TABLE 11
-- CREATE VIEW 0
-- ALTER VIEW 0
-- CREATE PACKAGE 0
-- CREATE PACKAGE BODY 0
-- CREATE PROCEDURE 0
-- CREATE FUNCTION 0
-- CREATE TRIGGER 0
-- ALTER TRIGGER 0
-- CREATE COLLECTION TYPE 0
-- CREATE STRUCTURED TYPE 0
-- CREATE STRUCTURED TYPE BODY 0
-- CREATE CLUSTER 0
-- CREATE CONTEXT 0
-- CREATE DATABASE 0
-- CREATE DIMENSION 0
-- CREATE DIRECTORY 0
-- CREATE DISK GROUP 0
-- CREATE ROLE 0
-- CREATE ROLLBACK SEGMENT 0
-- CREATE SEQUENCE 0
-- CREATE MATERIALIZED VIEW 0
-- CREATE MATERIALIZED VIEW LOG 0
-- CREATE SYNONYM 0
-- CREATE TABLESPACE 0
-- CREATE USER 0
--
-- DROP TABLESPACE 0
-- DROP DATABASE 0
--
-- REDACTION POLICY 0
--
-- ORDS DROP SCHEMA 0
-- ORDS ENABLE SCHEMA 0
-- ORDS ENABLE OBJECT 0
--
-- ERRORS 0
-- WARNINGS 0
create or replace synonym A9009072
for TRON2000.A9009072_MCL;
create or replace synonym A9009082
for TRON2000.A9009082_MCL;
create or replace synonym G2999728
for TRON2000.G2999728_MCL;
create or replace synonym G2999731
for TRON2000.G2999731_MCL;
create or replace synonym G2999733
for TRON2000.G2999733_MCL;
create or replace synonym G2999761
for TRON2000.G2999761_MCL;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.A9009072_MCL TO public;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.A9009082_MCL TO public;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.G2999728_MCL TO public;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.G2999731_MCL TO public;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.G2999733_MCL TO public;
GRANT DELETE,INSERT,SELECT,UPDATE,REFERENCES ON TRON2000.G2999761_MCL TO public;
Contenido literal de dc_k_onetrust_mcl.pck tal como lo entregó Mapfre, sin modificaciones. Las observaciones sobre el identificador, el control transaccional y el defecto del alta están en la sección 5.2.
create or replace package dc_k_onetrust_mcl as
g_estado_activo constant varchar2(1) := 'S';
procedure p_sel_propositos(p_cursor out sys_refcursor);
procedure p_sel_pto_collecion_proposito(p_cod_proposito in g2999733.cod_proposito%type,
p_cursor out sys_refcursor);
procedure p_sel_pto_collecion(p_cod_pto_collecion in g2999761.cod_punto_coleccion_id%type,
p_cursor out sys_refcursor);
procedure p_ins_reg_consentimientos(p_cod_cia in A9009072.cod_cia %type,
p_cod_usuario in A9009072.cod_usuario %type,
p_cod_punto_recoleccion in A9009072.cod_punto_recoleccion %type,
p_cod_punto_proposito in A9009072.cod_punto_proposito %type,
p_cod_ver_proposito in A9009072.cod_ver_proposito %type,
p_respuesta in A9009072.respuesta %type,
p_tip_docum in A9009072.tip_docum %type,
p_cod_docum in A9009072.cod_docum %type,
p_ip_origen in A9009072.ip_origen %type,
p_sistema_origen in A9009072.sistema_origen %type,
p_tipo_canal in A9009072.tipo_canal %type,
p_user_agent in A9009072.user_agent %type,
p_txt_evidencia_receipt_jwt in A9009072.txt_evidencia_receipt_jwt %type,
p_hash_evidencia in A9009072.hash_evidencia %type,
p_fec_consentimiento in A9009072.fec_consentimiento %type,
p_fec_expiracion in A9009072.fec_expiracion %type,
p_msg out varchar2);
procedure p_ins_reg_cons_asc(p_cod_consentimiento in a9009082.cod_consentimiento%type,
p_estado_sync in a9009082.estado_sync %type,
p_fec_ultimo_intento in a9009082.fec_ultimo_intento%type,
p_respuesta_ot in a9009082.respuesta_ot %type,
p_fec_primer_intento in a9009082.fec_primer_intento%type,
p_codigo_error in a9009082.codigo_error %type,
p_msg out varchar2);
procedure p_ins_propositos(p_cod_cia in G2999731.cod_cia%type,
p_cod_proposito_codigo in G2999731.cod_proposito_codigo%type,
p_nom_proposito in G2999731.nom_proposito%type,
p_msg out varchar2);
procedure p_ins_ver_proposito(p_cod_proposito in g2999728.cod_proposito %type,
p_nom_version_proposito in g2999728.nom_version_proposito%type,
p_txt_legal_version in g2999728.txt_legal_version %type,
p_txt_detalle_legal in g2999728.txt_detalle_legal %type,
p_requestInformation in g2999728.requestInformation %type,
p_fec_ini in g2999728.fec_ini %type,
p_fec_fin in g2999728.fec_fin %type,
p_msg out varchar2);
procedure p_ins_colect_proposito(p_cod_cia in g2999733.cod_cia %type,
p_cod_punto_recolecicon in g2999733.cod_punto_recolecicon%type,
p_cod_proposito in g2999733.cod_proposito %type,
p_obligatorio in g2999733.obligatorio %type,
p_txt_link_canal in g2999733.txt_link_canal %type,
p_nom_link in g2999733.nom_link %type,
p_msg out varchar2);
procedure p_ins_pto_collect(p_cod_cia in G2999761.cod_cia %type,
p_nom_punto_recoleccion in G2999761.nom_punto_recoleccion %type,
p_desc_punto_recoleccion in G2999761.desc_punto_recoleccion%type,
p_canal in G2999761.canal %type,
p_origen in G2999761.origen %type,
p_url_politica in G2999761.url_politica %type,
p_msg out varchar2);
end dc_k_onetrust_mcl;
/
create or replace package body dc_k_onetrust_mcl as
procedure p_sel_propositos(p_cursor out sys_refcursor) as
begin
open p_cursor for
select * from g2999731 pro where pro.mca_estado = g_estado_activo;
end p_sel_propositos;
procedure p_sel_pto_collecion_proposito(p_cod_proposito in g2999733.cod_proposito%type,
p_cursor out sys_refcursor) as
begin
open p_cursor for
select *
from g2999733 pc
where pc.cod_proposito = p_cod_proposito
and pc.mca_estado = g_estado_activo;
end p_sel_pto_collecion_proposito;
procedure p_sel_pto_collecion(p_cod_pto_collecion in g2999761.cod_punto_coleccion_id%type,
p_cursor out sys_refcursor) as
begin
open p_cursor for
select *
from g2999761 pc
where pc.cod_punto_coleccion_id = p_cod_pto_collecion
and pc.mca_estado = g_estado_activo;
end p_sel_pto_collecion;
procedure p_sel_version_proposito(p_cod_proposito in g2999728.cod_proposito%type,
p_cursor out sys_refcursor) as
begin
open p_cursor for
select *
from g2999728 vp
where vp.cod_proposito = p_cod_proposito
and vp.mca_estado = g_estado_activo;
end p_sel_version_proposito;
procedure p_ins_reg_consentimientos(p_cod_cia in A9009072.cod_cia %type,
p_cod_usuario in A9009072.cod_usuario %type,
p_cod_punto_recoleccion in A9009072.cod_punto_recoleccion %type,
p_cod_punto_proposito in A9009072.cod_punto_proposito %type,
p_cod_ver_proposito in A9009072.cod_ver_proposito %type,
p_respuesta in A9009072.respuesta %type,
p_tip_docum in A9009072.tip_docum %type,
p_cod_docum in A9009072.cod_docum %type,
p_ip_origen in A9009072.ip_origen %type,
p_sistema_origen in A9009072.sistema_origen %type,
p_tipo_canal in A9009072.tipo_canal %type,
p_user_agent in A9009072.user_agent %type,
p_txt_evidencia_receipt_jwt in A9009072.txt_evidencia_receipt_jwt %type,
p_hash_evidencia in A9009072.hash_evidencia %type,
p_fec_consentimiento in A9009072.fec_consentimiento %type,
p_fec_expiracion in A9009072.fec_expiracion %type,
p_msg out varchar2) as
ln_cod_consentimiento A9009072.cod_consentimiento%type;
lrA9009072 A9009072%rowtype;
begin
begin
select (nvl(max(cc.cod_consentimiento), 0) + 1) id_cons
into ln_cod_consentimiento
from A9009072 cc;
exception
when others then
ln_cod_consentimiento := 1;
end;
lrA9009072.Cod_Consentimiento := ln_cod_consentimiento;
lrA9009072.Cod_Cia := p_cod_cia;
lrA9009072.Cod_Usuario := p_cod_usuario;
lrA9009072.Cod_Punto_Recoleccion := p_cod_punto_recoleccion;
lrA9009072.Cod_Punto_Proposito := p_cod_punto_proposito;
lrA9009072.Cod_Ver_Proposito := p_cod_ver_proposito;
lrA9009072.Respuesta := p_respuesta;
lrA9009072.Tip_Docum := p_tip_docum;
lrA9009072.Cod_Docum := p_cod_docum;
lrA9009072.Ip_Origen := p_ip_origen;
lrA9009072.Sistema_Origen := p_sistema_origen;
lrA9009072.Tipo_Canal := p_tipo_canal;
lrA9009072.User_Agent := p_user_agent;
lrA9009072.Txt_Evidencia_Receipt_Jwt := p_txt_evidencia_receipt_jwt;
lrA9009072.Hash_Evidencia := p_hash_evidencia;
lrA9009072.Fec_Consentimiento := p_fec_consentimiento;
lrA9009072.Fec_Expiracion := p_fec_expiracion;
lrA9009072.Fec_Actu := sysdate;
lrA9009072.Cod_User := user;
insert into A9009072 values lrA9009072;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_reg_consentimientos;
procedure p_ins_reg_cons_asc(p_cod_consentimiento in a9009082.cod_consentimiento%type,
p_estado_sync in a9009082.estado_sync %type,
p_fec_ultimo_intento in a9009082.fec_ultimo_intento%type,
p_respuesta_ot in a9009082.respuesta_ot %type,
p_fec_primer_intento in a9009082.fec_primer_intento%type,
p_codigo_error in a9009082.codigo_error %type,
p_msg out varchar2) as
ln_cod_sync a9009082.cod_sync%type;
lra9009082 a9009082%rowtype;
begin
begin
select (nvl(max(cc.cod_sync), 0) + 1) id_cons
into ln_cod_sync
from a9009082 cc;
exception
when others then
ln_cod_sync := 1;
end;
lra9009082.cod_sync := ln_cod_sync;
lra9009082.cod_consentimiento := p_cod_consentimiento;
lra9009082.estado_sync := p_estado_sync;
lra9009082.fec_ultimo_intento := p_fec_ultimo_intento;
lra9009082.respuesta_ot := p_respuesta_ot;
lra9009082.fec_primer_intento := p_fec_primer_intento;
lra9009082.codigo_error := p_codigo_error;
lra9009082.fec_actu := sysdate;
lra9009082.cod_user := user;
insert into a9009082 values lra9009082;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_reg_cons_asc;
procedure p_ins_propositos(p_cod_cia in G2999731.cod_cia%type,
p_cod_proposito_codigo in G2999731.cod_proposito_codigo%type,
p_nom_proposito in G2999731.nom_proposito%type,
p_msg out varchar2) as
ln_cod_proposito G2999731.Cod_Proposito%type;
lrG2999731 G2999731%rowtype;
begin
begin
select (nvl(max(cc.Cod_Proposito), 0) + 1) id_cons
into ln_cod_proposito
from G2999731 cc;
exception
when others then
ln_cod_proposito := 1;
end;
lrG2999731.Cod_Proposito := ln_cod_proposito;
lrG2999731.Cod_Cia := p_cod_cia;
lrG2999731.Cod_Proposito_Codigo := p_cod_proposito_codigo;
lrG2999731.Nom_Proposito := p_nom_proposito;
lrG2999731.Mca_Estado := g_estado_activo;
lrG2999731.Fec_Actu := sysdate;
lrG2999731.Cod_User := user;
insert into G2999731 values lrG2999731;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_propositos;
procedure p_ins_ver_proposito(p_cod_proposito in g2999728.cod_proposito %type,
p_nom_version_proposito in g2999728.nom_version_proposito%type,
p_txt_legal_version in g2999728.txt_legal_version %type,
p_txt_detalle_legal in g2999728.txt_detalle_legal %type,
p_requestInformation in g2999728.requestInformation %type,
p_fec_ini in g2999728.fec_ini %type,
p_fec_fin in g2999728.fec_fin %type,
p_msg out varchar2) as
ln_cod_ver_proposito G2999728.Cod_Ver_Proposito%type;
lrG2999728 G2999728%rowtype;
begin
begin
select (nvl(max(cc.Cod_Ver_Proposito), 0) + 1) id_cons
into ln_cod_ver_proposito
from G2999728 cc;
exception
when others then
ln_cod_ver_proposito := 1;
end;
lrG2999728.cod_ver_proposito := ln_cod_ver_proposito;
lrG2999728.cod_proposito := p_cod_proposito;
lrG2999728.nom_version_proposito := p_nom_version_proposito;
lrG2999728.txt_legal_version := p_txt_legal_version;
lrG2999728.txt_detalle_legal := p_txt_detalle_legal;
lrG2999728.requestInformation := p_requestInformation;
lrG2999728.fec_ini := p_fec_ini;
lrG2999728.fec_fin := p_fec_fin;
lrG2999728.mca_estado := g_estado_activo;
lrG2999728.fec_actu := sysdate;
lrG2999728.cod_user := user;
insert into G2999728 values lrG2999728;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_ver_proposito;
procedure p_ins_colect_proposito(p_cod_cia in g2999733.cod_cia %type,
p_cod_punto_recolecicon in g2999733.cod_punto_recolecicon%type,
p_cod_proposito in g2999733.cod_proposito %type,
p_obligatorio in g2999733.obligatorio %type,
p_txt_link_canal in g2999733.txt_link_canal %type,
p_nom_link in g2999733.nom_link %type,
p_msg out varchar2) as
ln_cod_punto_proposito G2999733.Cod_Punto_Proposito%type;
lrG2999733 G2999733%rowtype;
begin
begin
select (nvl(max(cc.Cod_Punto_Proposito), 0) + 1) id_cons
into ln_cod_punto_proposito
from G2999733 cc;
exception
when others then
ln_cod_punto_proposito := 1;
end;
lrG2999733.cod_punto_proposito := ln_cod_punto_proposito;
lrG2999733.cod_cia := p_cod_cia;
lrG2999733.cod_punto_recolecicon := p_cod_punto_recolecicon;
lrG2999733.cod_proposito := p_cod_proposito;
lrG2999733.obligatorio := p_obligatorio;
lrG2999733.txt_link_canal := p_txt_link_canal;
lrG2999733.nom_link := p_nom_link;
lrG2999733.mca_estado := g_estado_activo;
lrG2999733.fec_actu := sysdate;
lrG2999733.cod_user := user;
insert into G2999733 values lrG2999733;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_colect_proposito;
procedure p_ins_pto_collect(p_cod_cia in G2999761.cod_cia %type,
p_nom_punto_recoleccion in G2999761.nom_punto_recoleccion %type,
p_desc_punto_recoleccion in G2999761.desc_punto_recoleccion%type,
p_canal in G2999761.canal %type,
p_origen in G2999761.origen %type,
p_url_politica in G2999761.url_politica %type,
p_msg out varchar2) as
lrG2999761 G2999761%rowtype;
ln_cod_punto_coleccion_id G2999761.Cod_Punto_Coleccion_Id%type;
begin
begin
select (nvl(max(cc.Cod_Punto_Coleccion_Id), 0) + 1) id_cons
into ln_cod_punto_coleccion_id
from G2999761 cc;
exception
when others then
ln_cod_punto_coleccion_id := 1;
end;
lrG2999761.cod_punto_coleccion_id := ln_cod_punto_coleccion_id;
lrG2999761.cod_cia := p_cod_cia;
lrG2999761.nom_punto_recoleccion := p_nom_punto_recoleccion;
lrG2999761.desc_punto_recoleccion := p_desc_punto_recoleccion;
lrG2999761.canal := p_canal;
lrG2999761.origen := p_origen;
lrG2999761.url_politica := p_url_politica;
lrG2999761.mca_estado := g_estado_activo;
lrG2999761.fec_actu := sysdate;
lrG2999761.cod_user := user;
commit;
p_msg := 'OK';
exception
when others then
rollback;
p_msg := replace(replace(dbms_utility.format_error_backtrace,
chr(10),
null),
chr(13),
null) || ', ' || dbms_utility.format_error_stack;
end p_ins_pto_collect;
end dc_k_onetrust_mcl;
/
Contraparte visual de las referencias del anexo B: el modelo de datos propio del middleware (schema Oracle
OV) con sus ocho tablas operacionales, columnas, tipos y claves. La única clave foránea física enlaza
la caché de idempotencia con la bandeja de salida; la auditoría se correlaciona por trace_id (sin clave
foránea); los valores de estado y política se gobiernan contra mmw_cns_dominios (anotados en cada
columna). Las columnas en verde corresponden al delta 16, pendiente de ratificación del DBA.
OV), generado a partir de las definiciones DDL del repositorio (directorio ddl/). Descargar en PNG de alta resolución.Cuatro lecturas del mismo flujo, de menor a mayor acoplamiento con el modelo de Mapfre. Cada una responde una pregunta distinta: qué quiso construir el middleware, qué lo obliga a tocar la realidad de Mapfre, qué le falta al modelo de Mapfre frente a OneTrust y cómo se reconcilian ambos. En todos, el recuadro azul del lado de OneTrust marca el concepto central: el consentimiento se envía y se registra como una sola transacción —un receipt con la lista de propósitos—. La separación por propósito (una fila por propósito) ocurre en las tablas de Mapfre, no en OneTrust; lo que OneTrust haga internamente queda fuera de estos diagramas.
La intención original del middleware. El MW recibe los propósitos ya resueltos por el satélite —nunca los define ni los consulta—, los persiste en su Outbox, los despacha a OneTrust con resiliencia y conserva el receipt en su propia auditoría. El modelo de datos de Mapfre no interviene.
La misma intención, conectada a Mapfre en los dos extremos: el satélite obtiene los propósitos del catálogo (G2999731/G2999733) y, tras el despacho, el resultado se escribe de vuelta de forma desagregada —una fila por propósito— en A9009072 y A9009082. El paquete de N propósitos se rompe en N filas porque el modelo de Mapfre es granular.
El flujo apoyado solo en el modelo de Mapfre (package dc_k_onetrust_mcl + tablas), con sus vacíos e incongruencias frente a OneTrust resaltados en rojo: registra una fila por propósito sin identificador de evento (OneTrust espera un receipt con un array de propósitos), el package no incluye lógica de despacho (la cola A9009082 queda inerte), requestInformation se almacena por versión-de-propósito en lugar de por punto de recogida, no hay tabla de topics para los canales, y persisten defectos de implementación (el INSERT ausente en p_ins_pto_collect, claves por MAX()+1, commit por procedimiento y GRANT a público).
La visión reconciliada del capítulo 6: conviven la cola de Mapfre (A9009082, como espejo de estado) y el Outbox del MW (el despachador real). El MW envía a OneTrust y luego refleja el resultado, desagregado, en las tablas de Mapfre.
A9009082 como espejo de estado y el Outbox del MW como despachador real. Descargar PNG.