Appearance
Modelo de Datos y Esquema de Base de Datos — ITECEL ADM
Última actualización: 2026-09-27
Estado: Documento Vivo / Datos
Fuente: Migraciones canónicas del repositorio (supabase/migrations/) y mapeo forense de integración. Cero conexiones a producción en este turno.
Índice
- Diagrama Entidad-Relación (ERD) Principal
- Catálogo Resumen de Tablas y Políticas RLS
- Tablas con Verificación Pendiente y Scripts de Solo Lectura
- Modelo Comercial: Matriz de Precios (Tier × Ciclo) y Enums
1. Diagrama Entidad-Relación (ERD) Principal
2. Catálogo Resumen de Tablas y Políticas RLS
Todas las políticas RLS descritas provienen de las migraciones formales en supabase/migrations/ (especialmente 20260913_rls_real_phase4a.sql, 20260914_..., 20260920_..., 20260922_..., 20260923_... y 20260926_...).
| Tabla | Propósito Principal | Modelo RLS Vigente |
|---|---|---|
condos | Entidad raíz de cada condominio. | SELECT: Superadmin, Admin del condominio, Comité, Residente de una unidad del condominio. INSERT/UPDATE/DELETE: Superadmin y Admin del condominio. |
sections | Agrupaciones físicas (torres/bloques). | Hereda RLS por condo_id: Admin total, Residente/Comité solo lectura. |
housing_units | Catálogo de viviendas y contactos. | SELECT: Superadmin, Admin, Comité (todo el condominio); Residente (solo su propia unidad). INSERT/UPDATE/DELETE: Exclusivo Admin del condominio y Superadmin. Trigger de límite de viviendas por tier (P0003). |
suppliers | Proveedores de servicios y bienes. | SELECT/INSERT/UPDATE/DELETE: Admin y Superadmin. Comité solo lectura. Residente bloqueado. |
bank_accounts | Cuentas bancarias y fondos de reserva. | SELECT/INSERT/UPDATE/DELETE: Admin y Superadmin. Comité solo lectura. Residente bloqueado. |
debt_templates | Plantillas de cobro recurrente. | Admin y Superadmin total. Residente bloqueado. |
generated_debts | Adeudos individuales por vivienda. | SELECT: Admin, Comité; Residente únicamente adeudos de su propia unit_id.MUTACIÓN: Exclusivo Admin y Superadmin. |
payment_records | Recibos de cobro y pagos aplicados. | SELECT: Admin, Comité; Residente únicamente recibos de su propia unit_id.MUTACIÓN: Exclusivo Admin y Superadmin. |
expenses | Facturas y comprobantes de egreso. | SELECT: Admin, Comité. Residente bloqueado. MUTACIÓN: Exclusivo Admin y Superadmin. |
bank_movements | Kardex bancario (ingresos y egresos). | SELECT: Admin, Comité. Residente bloqueado. MUTACIÓN: Exclusivo Admin y Superadmin. |
budgets | Presupuestos anuales por partida. | SELECT: Admin, Comité. Residente bloqueado. MUTACIÓN: Exclusivo Admin y Superadmin. |
statement_dispatches | Bitácora de despacho de estados de cuenta. | Admin y Superadmin total. Auditoría interna. |
licenses | Asignación de licencias y planes. | SELECT: Superadmin total; usuario autenticado solo su propio correo (get_auth_email()).INSERT/UPDATE/DELETE: Exclusivo Superadmin ( is_superadmin()). |
license_requests | Solicitudes públicas de compra y demo. | SELECT: Superadmin y solicitante autenticado/anónimo con token. INSERT: Público ( anon, authenticated).UPDATE/DELETE: Exclusivo Superadmin. |
central_backups | Respaldos JSON de base de datos. | ALL: Exclusivo Superadmin (is_superadmin()). Totalmente invisible para administradores y residentes. |
app_users | Directorio de usuarios y roles del sistema. | SELECT: Superadmin; usuario propio sobre su fila; Admin sobre usuarios de su condo_id.MUTACIÓN: Superadmin y triggers de sincronización auth_user_id. |
audit_log | Registro forense de mutaciones. | INSERT: Trigger SECURITY DEFINER con JWT verificado.SELECT: Exclusivo Superadmin ( is_superadmin()). Imposible de alterar por clientes. |
community_posts | Publicaciones de la cartelera virtual. | SELECT: Todos los miembros del condominio (Admin, Comité, Residentes). INSERT/UPDATE/DELETE: Admin del condominio y Superadmin. |
community_post_attachments | Adjuntos de posts en cartelera. | Hereda visibilidad y mutación de community_posts. |
community_documents | Repositorio documental (actas/reglamentos). | SELECT: Todos los miembros del condominio. INSERT/UPDATE/DELETE: Admin del condominio y Superadmin. |
plan_limits | Topes y cuotas de viviendas, posts, documentos, storage y correos por tier. | SELECT: Público (USING (true)).MUTACIÓN: Exclusivo Superadmin. |
email_quota_usage | Registro de consumo mensual de correos por condominio (period_month). | SELECT: Público autenticado/anon. MUTACIÓN: Gestionado por RPCs atómicas check_and_consume_email_quota y refund_email_quota. |
itecel_settings | Configuración comercial y datos bancarios. | SELECT: Público (para pasarela/cotizaciones). MUTACIÓN: Exclusivo Superadmin. |
3. Tablas con Verificación Pendiente y Scripts de Solo Lectura
WARNING
Las siguientes tablas o columnas presentan evoluciones recientes en migraciones que requieren comprobación en caliente contra el entorno de producción de Supabase para descartar desviaciones o índices faltantes.
Elementos con Marcador: PENDIENTE DE VERIFICACIÓN CONTRA PRODUCCIÓN
- Tabla
licenses— Columnas de cuotas demo:
Confirmar presencia física dedemo_dispatch_used,demo_invites_used,demo_statements_used(Migración20260926_demo_dispatch_quota_pool.sql). - Tabla
license_requests— Trigger de auditoría en eliminación:
Confirmar si el trigger deaudit_logcaptura el eventoDELETEen solicitudes físicas (ADR-006). - Tabla
housing_units— Trigger P0003:
Confirmar que el triggercheck_housing_unit_limit_triggeresté activo y asociado al eventoBEFORE INSERT.
Script de SOLO LECTURA para el Operador (Ejecutar en SQL Editor si se desea validar)
sql
-- =============================================================================
-- SCRIPT DE AUDITORÍA FORENSE DE ESQUEMA (SOLO LECTURA - SEGURO)
-- No realiza bloqueos, no modifica datos, no altera transacciones.
-- =============================================================================
-- 1. Verificar columnas de licencias y cuotas
SELECT column_name, data_type, is_nullable, column_default
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'licenses'
AND column_name IN ('tier', 'demo_dispatch_used', 'demo_invites_used', 'demo_statements_used', 'valid_until', 'amount_paid')
ORDER BY column_name;
-- 2. Verificar existencia y estado del trigger de límites en housing_units
SELECT tgname AS trigger_name, tgtype, tgenabled, proname AS function_name
FROM pg_trigger tr
JOIN pg_proc pr ON tr.tgfoid = pr.oid
WHERE tr.tgrelid = 'public.housing_units'::regclass
AND tr.tgname ILIKE '%housing_unit_limit%';
-- 3. Verificar triggers de auditoría en license_requests
SELECT tgname AS trigger_name, tgtype, tgenabled, proname AS function_name
FROM pg_trigger tr
JOIN pg_proc pr ON tr.tgfoid = pr.oid
WHERE tr.tgrelid = 'public.license_requests'::regclass;
-- 4. Conteo de filas de tablas clave
SELECT 'condos' AS tabla, count(*) AS total_filas FROM public.condos
UNION ALL
SELECT 'licenses' AS tabla, count(*) FROM public.licenses
UNION ALL
SELECT 'app_users' AS tabla, count(*) FROM public.app_users
UNION ALL
SELECT 'plan_limits' AS tabla, count(*) FROM public.plan_limits
UNION ALL
SELECT 'license_requests' AS tabla, count(*) FROM public.license_requests;4. Modelo Comercial: Matriz de Precios (Tier × Ciclo) y Enums
Enums y Restricciones Almacenadas en BD
licenses.tipo:'demo'|'completa'licenses.status:'activa'|'suspendida'|'vencida'licenses.plan:'mensual'|'trimestral'|'semestral'|'anual'(nota de deuda ADR-003)licenses.tier:'demo'|'lite'|'standard'|'pro'|'enterprise'|'perpetua'
Matriz Definitiva de Precios Comerciales (Vigente en Frontend e itecel_settings)
| Tier de Licencia | Límite Viviendas | Mensual | Trimestral | Semestral | Anual | Notas Operativas |
|---|---|---|---|---|---|---|
| Demo Gratuita | Hasta 30 | $0 | N/A | N/A | N/A | Pool de cortesía: 10 despachos combinados. Vigencia 15 días. |
| Plan Lite | Hasta 30 | $10 | $25 | $50 | $95 | Condominios y edificios pequeños. |
| Plan Standard | Hasta 75 | $20 | $50 | $100 | $190 | Comunidades medianas (estándar de la industria). |
| Plan Pro | Hasta 150 | $30 | $80 | $150 | $270 | Complejos residenciales de alta densidad. |
| Plan Enterprise | Hasta 300 | Cotización | Cotización | Cotización | $150* | *Promo de apertura anual exclusiva ($150/año). |
| Perpetua (ADR-004) | Ilimitado | $0 | $0 | $0 | $0 | Socios, equipo fundador y pilotos estratégicos. Notas libres obligatorias. |
NOTE
Nota de Deuda Técnica ADR-003:
En el esquema histórico de base de datos, el campo plan almacenaba únicamente la periodicidad (mensual, anual, etc.). La columna tier fue introducida recientemente para desacoplar la capacidad del ciclo de cobro. Se mantiene la deuda técnica documentada para completar la migración de tipos en todas las funciones heredadas.
WARNING
ADVERTENCIA INTOCABLE: licenses.tier ≠ plan_limits.plan_tier (Enmienda ADR-003):
En la tabla public.licenses, la columna tier almacena valores heredados o duración de transición. El tier comercial canónico que rige las cuotas de viviendas, posts, documentos, correos y storage radica ÚNICA Y EXCLUSIVAMENTE en public.plan_limits.plan_tier ('demo', 'lite', 'standard', 'pro', 'enterprise', 'perpetua'). Queda estrictamente prohibido consultar o asumir que licenses.tier define las reglas comerciales sin realizar el cruce relacional contra public.plan_limits.
Cuotas y Límites Canónicos por Tier en public.plan_limits (ANEXO A)
Plan Tier (plan_tier) | Viviendas (max_viviendas) | Posts / Mes (max_posts_month) | Docs / Mes (max_documents_month) | Storage MB (max_storage_mb) | Correos / Mes (max_emails_month) |
|---|---|---|---|---|---|
demo | 30 | 4 | 4 | 60 MB | 10 |
lite | 30 | 20 | 30 | 300 MB | 150 |
standard | 75 | 50 | 75 | 1,000 MB | 375 |
pro | 150 | 100 | 150 | 2,500 MB | 750 |
enterprise | 300 | 200 | 300 | 5,000 MB | 1,500 |
perpetua | NULL (ilimitado) | NULL (ilimitado) | NULL (ilimitado) | NULL (ilimitado) | NULL (ilimitado) |