Módulo Bancario — Documentación de Base de Datos

Módulo encargado de gestionar los formularios XLS de los bancos, parametrizar el mapeo de variables y generar los archivos pre-llenados con los datos del informe de tasación.


Flujo general

Informe de tasación (catched_fields)
    ↓
Servicio resuelve semantic_field → field concreto del formato
    ↓
Inyecta valores en named ranges del XLS base (bank_template activo)
    ↓
Formulario de revisión — producción confirma o corrige valores
    ↓
XLS final generado → se guarda en report_bank_exports

Tablas

banks — Catálogo de bancos

Registro único por institución financiera. Independiente de los formatos o versiones de su formulario.

CampoDescripciónTipoNullable
idIdentificador único del bancoINTEGER (PK)
nameNombre del bancoVARCHAR(255)

Ejemplos:

idname
1Scotiabank
2Banreservas
3APAP
4BHD

bank_templates — Versiones del formulario XLS por banco

Cada vez que un banco actualiza su formato, se sube un nuevo template. El activo es el que usarán todos los informes nuevos. Los anteriores quedan en historial para poder regenerar informes viejos con el formato que correspondía en ese momento.

CampoDescripciónTipoNullable
idIdentificador único del templateINTEGER (PK)
bank_idBanco al que pertenece este templateINTEGER (FK → banks)
nameEtiqueta descriptiva de la versiónVARCHAR(255)
xls_pathRuta al archivo XLS base en storageVARCHAR(500)
versionNúmero de versión correlativo por bancoINTEGER
activeSi es el template vigente para nuevos informesBOOLEAN
uploaded_byUsuario que subió este templateINTEGER (FK → users)
uploaded_atFecha y hora de cargaTIMESTAMP

Ejemplo — historial Scotiabank:

idbank_idnameversionactive
11Formato enero 20251false
21Formato agosto 20252false
31Formato marzo 20263true

Al subir el template v3, el sistema desactiva automáticamente el v2. Los informes generados antes siguen referenciando el v2 en su report_bank_exports.


bank_variable_groups — Grupos de variables relacionadas

Agrupa named ranges que forman una unidad lógica dentro del formulario. Hay dos patrones principales que justifican un grupo:

  • radio — varias celdas mutuamente excluyentes donde solo una se marca con X o 1 (ej: quién habita el inmueble)
  • indexed — variables repetitivas con sufijo numérico que corresponden a una lista (ej: comparables 1, 2, 3…)
  • single — agrupación visual/semántica sin lógica especial
CampoDescripciónTipoNullable
idIdentificador único del grupoINTEGER (PK)
bank_template_idTemplate al que pertenece este grupoINTEGER (FK → bank_templates)
nameNombre descriptivo del grupoVARCHAR(255)
group_typeTipo de comportamiento del grupoENUM(radio, indexed, single)

Ejemplos:

idbank_template_idnamegroup_type
13Quién habita el inmuebleradio
23Uso del inmuebleradio
33Comparable 1indexed
43Comparable 2indexed
53Datos generalessingle

bank_variable_mappings — Mapeo de cada named range

Corazón del módulo. Define exactamente qué valor va en cada named range del XLS y cómo obtenerlo. El mapeo se define una vez por banco y funciona para todos los formatos de Passos porque apunta a semantic_fields, no a un field concreto.

CampoDescripciónTipoNullable
idIdentificador único del mapeoINTEGER (PK)
bank_template_idTemplate al que perteneceINTEGER (FK → bank_templates)
group_idGrupo al que pertenece (si aplica)INTEGER (FK → bank_variable_groups)
named_rangeNombre exacto de la variable en el XLSVARCHAR(255)
source_typeDe dónde viene el valorENUM(field, static, comparable)
semantic_field_idCampo semántico del informe que provee el valorINTEGER (FK → semantic_fields)
static_valueValor fijo a inyectar (si source_type = static)VARCHAR(255)
radio_match_valueValor del field que activa este named range con X/1VARCHAR(255)
comparable_indexÍndice 0-based del comparable (si source_type = comparable)INTEGER
comparable_fieldAtributo del comparable a usar (ubicacion, precio, area…)VARCHAR(100)

Ejemplos de mapeos:

named_rangesource_typesemantic_field_idstatic_valueradio_match_valuecomparable_indexcomparable_field
nombre_clientefield1 (nombre_propietario)
area_construccionfield8 (area_construccion)
habitado_propietariofield12 (habitado_por)Propietario
habitado_inquilinofield12 (habitado_por)Inquilino
habitado_familiafield12 (habitado_por)Familia
nombre_bancostaticScotiabank
comp1_ubicacioncomparable0ubicacion
comp1_preciocomparable0precio
comp2_ubicacioncomparable1ubicacion

Lógica radio: el servicio lee el valor de habitado_por del informe. Si es “Propietario”, escribe X en habitado_propietario y deja vacíos los demás del grupo.


semantic_fields — Vocabulario canónico de Passos

Identidades estables que representan conceptos del informe independientemente del formato. Un mismo concepto (ej: área de construcción) puede existir como field #47 en Unidad Funcional y como field #183 en Solar y Mejoras — ambos apuntan al mismo semantic_field.

CampoDescripciónTipoNullable
idIdentificador únicoINTEGER (PK)
keyClave legible en snake_caseVARCHAR(100)
descriptionDescripción del dato que representaVARCHAR(255)

Ejemplos:

idkeydescription
1nombre_propietarioNombre completo del propietario del inmueble
2cedula_propietarioCédula o documento de identidad del propietario
3direccion_inmuebleDirección física completa del inmueble tasado
4municipioMunicipio donde se ubica el inmueble
5provinciaProvincia donde se ubica el inmueble
6valor_tasadoValor comercial final de la tasación
7valor_tasado_letrasValor comercial en letras
8area_construccionÁrea total de construcción en m²
9area_terrenoÁrea total del terreno en m²
10antiguedadAntigüedad del inmueble en años
11estado_conservacionEstado de conservación del inmueble
12habitado_porQuién habita actualmente el inmueble
13uso_inmuebleUso actual del inmueble (residencial, comercial…)
14certificado_matriculaNúmero de certificado de matrícula del título
15nombre_tasadorNombre del tasador responsable del informe
16numero_servicioNúmero de servicio del informe
17fecha_inspeccionFecha en que se realizó la inspección
18fecha_informeFecha de emisión del informe

field_semantic_field — Mapeo fields concretos ↔ semántica

Tabla pivote que conecta los fields de cada formato de Passos con su semantic_field. Se llena al parametrizar cada formato. Los fields que no tienen equivalente bancario simplemente no se registran aquí.

CampoDescripciónTipoNullable
idIdentificador únicoINTEGER (PK)
field_idCampo concreto del formato PassosINTEGER (FK → fields)
semantic_field_idConcepto semántico que representaINTEGER (FK → semantic_fields)

Ejemplo — cómo el servicio resuelve en runtime:

Informe tipo "Solar y Mejoras" necesita inyectar "area_construccion" en Scotiabank

1. bank_variable_mappings → semantic_field_id = 8 (area_construccion)
2. field_semantic_field → busca field_id donde semantic_field_id = 8
                          Y ese field pertenece al report_type del informe
3. Resultado → field #183 del formato Solar y Mejoras
4. catched_fields → busca el valor capturado para field #183 en este informe
5. Inyecta ese valor en el named range del XLS

report_bank_exports — Historial de formularios generados

Registra cada vez que se genera un formulario bancario para un informe. Guarda qué versión del template se usó, quién lo generó y dónde está el archivo resultante.

CampoDescripciónTipoNullable
idIdentificador únicoINTEGER (PK)
report_idInforme de tasaciónINTEGER (FK → reports)
bank_idBanco para el que se generóINTEGER (FK → banks)
bank_template_idVersión exacta del XLS usadoINTEGER (FK → bank_templates)
generated_xls_pathRuta al archivo XLS con datos inyectadosVARCHAR(500)
generated_byUsuario que generó el formularioINTEGER (FK → users)
generated_atFecha y hora de generaciónTIMESTAMP

Un mismo informe puede tener múltiples exports del mismo banco (si se regenera tras correcciones) y exports de diferentes bancos (si el cliente necesita Scotiabank y Banreservas simultáneamente).


Relaciones clave

banks ──< bank_templates ──< bank_variable_mappings >── bank_variable_groups
                                      │
                                      ↓
                              semantic_fields >──< fields  (via field_semantic_field)
                                      
reports >──< report_bank_exports >── bank_templates

Notas de implementación

  • El mapeo (bank_variable_mappings) se define por bank_template_id, no por bank_id, porque distintas versiones del mismo banco podrían tener named ranges diferentes.
  • Si el banco cambia un named range entre versiones, se actualiza el mapeo del nuevo template. El template viejo y su mapeo permanecen intactos para historial.
  • Los semantic_fields son globales al sistema — no pertenecen a ningún banco ni formato específico.
  • field_semantic_field puede tener múltiples registros por semantic_field_id (uno por cada formato de Passos que tenga ese campo). El servicio filtra por el report_type del informe activo para saber cuál usar.