Esquema de datos, relaciones y diccionario de tablas
El modelo de datos de ayuntamientosmart.com sigue un diseño relacional normalizado (hasta 3NF) adaptado al almacenamiento JSON. Las principales características son:
Todos los registros incluyen automáticamente estos campos de metadatos:
{
"_id": "DEN-2026-00001", // ID único del registro
"_created": "2026-01-10T10:30:00Z", // Fecha de creación
"_modified": "2026-01-10T11:45:00Z", // Última modificación
"_created_by": "usr-123", // Usuario que creó
"_modified_by": "usr-456", // Usuario que modificó
"_version": 3, // Número de versión (para control de concurrencia)
"_hash": "sha256:abc123...", // Hash del contenido
"_deleted": null // Timestamp de eliminación (soft delete)
}La entidad Denuncias almacena todas las denuncias municipales registradas en el sistema.
{
"_id": "DEN-2026-00001",
"tipo": "hechos",
"estado": "registrada",
"numero": "DEN-2026-00001",
"fecha_registro": "2026-01-10T10:30:00Z",
"agente_tramitador": "usr-123",
"denunciante": {
"persona_id": "per-456",
"dni": "ENCRYPTED:abc123...",
"nombre": "María García López",
"fecha_nacimiento": "1985-05-15",
"nacionalidad": "ESP",
"direccion": "ENCRYPTED:def456...",
"telefono": "ENCRYPTED:ghi789...",
"email": "maria@example.com"
},
"hechos": {
"fecha": "2026-01-09",
"hora": "18:30",
"lugar": "Calle Mayor 15, Madrid",
"coordenadas": {
"lat": 40.4168,
"lon": -3.7038
},
"descripcion": "Me sustrajeron el teléfono móvil mientras caminaba..."
},
"denunciados": [
{
"persona_id": "per-789",
"dni": "ENCRYPTED:jkl012...",
"nombre": "Juan Pérez",
"relacion_hechos": "Presunto autor de la sustracción"
}
],
"testigos": [
{
"persona_id": "per-012",
"nombre": "Pedro Sánchez",
"telefono": "ENCRYPTED:mno345..."
}
],
"objetos": [
{
"tipo": "telefono",
"marca": "Apple",
"modelo": "iPhone 14 Pro",
"color": "Azul",
"imei": "123456789012345",
"valor_estimado": 1000.00
}
],
"adjuntos": [
{
"id": "att-001",
"nombre": "foto_danos.jpg",
"tipo": "image/jpeg",
"tamano": 2548672,
"ruta": "/data/{tenant}/adjuntos/2026/01/att-001.jpg",
"hash_sha256": "abc123..."
}
],
"tramitacion": {
"estado_actual": "registrada",
"fecha_notificacion": "2026-01-10T12:00:00Z",
"metodo_notificacion": "email",
"remitida_a": null,
"fecha_archivo": null,
"motivo_archivo": null
},
"firma": {
"firmada": true,
"fecha_firma": "2026-01-10T10:35:00Z",
"usuario_firma": "usr-123",
"hash_documento": "sha256:def456...",
"certificado_digital": false
},
"_created": "2026-01-10T10:30:00Z",
"_modified": "2026-01-10T10:35:00Z",
"_created_by": "usr-123",
"_modified_by": "usr-123",
"_version": 1,
"_hash": "sha256:xyz789...",
"_deleted": null
}| Campo | Tipo | Descripción | Valores |
|---|---|---|---|
| tipo | string | Tipo de denuncia | hechos, perdida, trafico, ruidos, urbanistica |
| estado | string | Estado de tramitación | borrador, registrada, en_investigacion, remitida, archivada, anulada |
| denunciante.dni | string | DNI/NIE cifrado | Cifrado AES-256-GCM |
| hechos.coordenadas | object | Geolocalización del lugar | {lat: float, lon: float} |
| objetos | array | Objetos sustraídos/perdidos | Array de objetos |
Almacena sanciones de tráfico y multas administrativas.
{
"_id": "SAN-2026-00001",
"tipo": "in_situ",
"estado": "notificada",
"numero_boletin": "SAN-2026-00001",
"fecha_imposicion": "2026-01-10T15:30:00Z",
"agente_denunciante": "usr-123",
"vehiculo": {
"matricula": "1234ABC",
"marca": "SEAT",
"modelo": "IBIZA",
"color": "Blanco",
"bastidor": "VF1XXXXXXXXXXXX",
"titular": {
"dni": "ENCRYPTED:abc123...",
"nombre": "José Martínez García",
"direccion": "ENCRYPTED:def456..."
}
},
"conductor": {
"es_titular": true,
"dni": "ENCRYPTED:abc123...",
"nombre": "José Martínez García",
"permiso": "ES987654321",
"clases_permiso": ["B"],
"puntos_disponibles": 12
},
"infraccion": {
"codigo": "3.1",
"descripcion": "Circular en sentido contrario al establecido",
"articulo_ley": "Artículo 29 RGC",
"calificacion": "grave",
"fecha": "2026-01-10",
"hora": "15:15",
"lugar": "Calle Alcalá 100, Madrid",
"coordenadas": {"lat": 40.4200, "lon": -3.6900},
"circunstancias": "Vehículo circulando por carril contrario en calle de sentido único"
},
"sancion": {
"importe": 200.00,
"importe_reducido": 100.00,
"puntos": 4,
"fecha_limite_descuento": "2026-01-30",
"pagada": false,
"fecha_pago": null,
"importe_pagado": null,
"forma_pago": null
},
"notificacion": {
"metodo": "in_situ",
"fecha": "2026-01-10T15:30:00Z",
"firmada_conductor": true,
"negativa_firma": false,
"acuse_recibo": true
},
"alegaciones": {
"presentadas": false,
"fecha_presentacion": null,
"texto": null,
"adjuntos": [],
"resolucion": null,
"fecha_resolucion": null
},
"dgt": {
"enviado": true,
"fecha_envio": "2026-01-10T16:00:00Z",
"numero_boletin_dgt": "DGT123456789",
"acuse_recibo": true
},
"_created": "2026-01-10T15:30:00Z",
"_modified": "2026-01-10T16:00:00Z",
"_created_by": "usr-123",
"_modified_by": "usr-123",
"_version": 2,
"_hash": "sha256:abc123...",
"_deleted": null
}| Campo | Tipo | Descripción | Valores |
|---|---|---|---|
| tipo | string | Tipo de sanción | in_situ, formulada |
| infraccion.calificacion | string | Gravedad | leve, grave, muy_grave |
| sancion.puntos | integer | Puntos a detraer | 0-6 |
| conductor.es_titular | boolean | ¿El conductor es el titular? | true/false |
Registro unificado de todas las personas que interactúan con el sistema.
{
"_id": "per-123",
"dni": "ENCRYPTED:abc123...",
"nombre": "María",
"apellido1": "García",
"apellido2": "López",
"nombre_completo": "María García López",
"fecha_nacimiento": "1985-05-15",
"nacionalidad": "ESP",
"sexo": "F",
"contacto": {
"direccion": "ENCRYPTED:def456...",
"municipio": "Madrid",
"provincia": "Madrid",
"cp": "28001",
"telefono_fijo": "ENCRYPTED:ghi789...",
"telefono_movil": "ENCRYPTED:jkl012...",
"email": "maria@example.com"
},
"documentacion": {
"tipo_documento": "DNI",
"numero_documento": "ENCRYPTED:abc123...",
"fecha_expedicion": "2015-06-01",
"fecha_caducidad": "2025-06-01"
},
"antecedentes": {
"tiene_antecedentes": false,
"denuncias_como_denunciante": 2,
"denuncias_como_denunciado": 0,
"sanciones": 1,
"detenciones": 0
},
"notas": "Persona colaboradora, víctima habitual de hurtos",
"_created": "2025-03-15T09:00:00Z",
"_modified": "2026-01-10T10:30:00Z",
"_created_by": "usr-100",
"_modified_by": "usr-123",
"_version": 5,
"_hash": "sha256:xyz789...",
"_deleted": null
}Usuarios del sistema (agentes, administrativos, mandos).
{
"_id": "usr-123",
"usuario": "agente.garcia",
"password_hash": "$argon2id$v=19$m=65536,t=4,p=3$...",
"email": "garcia@policia.madrid.es",
"perfil": {
"tip": "12345",
"nombre": "Juan",
"apellidos": "García Pérez",
"rango": "Técnico",
"unidad": "AyuntamientoSmart Madrid",
"telefono": "666123456",
"foto": "/uploads/users/usr-123.jpg"
},
"rol": "agente",
"permisos": [
"denuncias.crear",
"denuncias.ver",
"sanciones.crear",
"sanciones.ver",
"vehiculos.consultar"
],
"seguridad": {
"2fa_habilitado": true,
"2fa_secret": "ENCRYPTED:abc123...",
"ultimo_acceso": "2026-01-10T09:00:00Z",
"ip_ultimo_acceso": "192.168.1.50",
"intentos_fallidos": 0,
"bloqueado_hasta": null,
"cambiar_password": false
},
"preferencias": {
"idioma": "es",
"zona_horaria": "Europe/Madrid",
"notificaciones_email": true,
"items_por_pagina": 20
},
"firma_digital": {
"tiene_certificado": true,
"certificado_cn": "Juan García Pérez",
"certificado_issuer": "FNMT-RCM",
"certificado_caducidad": "2027-06-01"
},
"activo": true,
"fecha_alta": "2020-01-15",
"fecha_baja": null,
"_created": "2020-01-15T08:00:00Z",
"_modified": "2026-01-10T09:00:00Z",
"_created_by": "usr-001",
"_modified_by": "usr-123",
"_version": 45,
"_hash": "sha256:def456...",
"_deleted": null
}Log inmutable de todas las operaciones del sistema.
{
"_id": "log-2026-01-10-0001234",
"timestamp": "2026-01-10T10:30:15.547Z",
"usuario": {
"id": "usr-123",
"nombre": "Juan García",
"rol": "agente"
},
"ip": "192.168.1.50",
"modulo": "denuncias",
"accion": "crear",
"registro_id": "DEN-2026-00001",
"datos_antes": null,
"datos_despues": { /* Snapshot del registro creado */ },
"cambios": [
{"campo": "estado", "antes": "borrador", "despues": "registrada"}
],
"hash_anterior": "sha256:abc123...",
"hash_actual": "sha256:def456...",
"metadata": {
"user_agent": "Mozilla/5.0...",
"duracion_ms": 145
}
}