Skip to content

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 ​

  1. Diagrama Entidad-Relación (ERD) Principal
  2. Catálogo Resumen de Tablas y Políticas RLS
  3. Tablas con Verificación Pendiente y Scripts de Solo Lectura
  4. 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_...).

TablaPropósito PrincipalModelo RLS Vigente
condosEntidad 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.
sectionsAgrupaciones físicas (torres/bloques).Hereda RLS por condo_id: Admin total, Residente/Comité solo lectura.
housing_unitsCatá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).
suppliersProveedores de servicios y bienes.SELECT/INSERT/UPDATE/DELETE: Admin y Superadmin. Comité solo lectura. Residente bloqueado.
bank_accountsCuentas bancarias y fondos de reserva.SELECT/INSERT/UPDATE/DELETE: Admin y Superadmin. Comité solo lectura. Residente bloqueado.
debt_templatesPlantillas de cobro recurrente.Admin y Superadmin total. Residente bloqueado.
generated_debtsAdeudos individuales por vivienda.SELECT: Admin, Comité; Residente únicamente adeudos de su propia unit_id.
MUTACIÓN: Exclusivo Admin y Superadmin.
payment_recordsRecibos de cobro y pagos aplicados.SELECT: Admin, Comité; Residente únicamente recibos de su propia unit_id.
MUTACIÓN: Exclusivo Admin y Superadmin.
expensesFacturas y comprobantes de egreso.SELECT: Admin, Comité. Residente bloqueado.
MUTACIÓN: Exclusivo Admin y Superadmin.
bank_movementsKardex bancario (ingresos y egresos).SELECT: Admin, Comité. Residente bloqueado.
MUTACIÓN: Exclusivo Admin y Superadmin.
budgetsPresupuestos anuales por partida.SELECT: Admin, Comité. Residente bloqueado.
MUTACIÓN: Exclusivo Admin y Superadmin.
statement_dispatchesBitácora de despacho de estados de cuenta.Admin y Superadmin total. Auditoría interna.
licensesAsignació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_requestsSolicitudes 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_backupsRespaldos JSON de base de datos.ALL: Exclusivo Superadmin (is_superadmin()). Totalmente invisible para administradores y residentes.
app_usersDirectorio 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_logRegistro forense de mutaciones.INSERT: Trigger SECURITY DEFINER con JWT verificado.
SELECT: Exclusivo Superadmin (is_superadmin()). Imposible de alterar por clientes.
community_postsPublicaciones de la cartelera virtual.SELECT: Todos los miembros del condominio (Admin, Comité, Residentes).
INSERT/UPDATE/DELETE: Admin del condominio y Superadmin.
community_post_attachmentsAdjuntos de posts en cartelera.Hereda visibilidad y mutación de community_posts.
community_documentsRepositorio documental (actas/reglamentos).SELECT: Todos los miembros del condominio.
INSERT/UPDATE/DELETE: Admin del condominio y Superadmin.
plan_limitsTopes y cuotas de viviendas, posts, documentos, storage y correos por tier.SELECT: Público (USING (true)).
MUTACIÓN: Exclusivo Superadmin.
email_quota_usageRegistro 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_settingsConfiguració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 ​

  1. Tabla licenses — Columnas de cuotas demo:
    Confirmar presencia física de demo_dispatch_used, demo_invites_used, demo_statements_used (Migración 20260926_demo_dispatch_quota_pool.sql).
  2. Tabla license_requests — Trigger de auditoría en eliminación:
    Confirmar si el trigger de audit_log captura el evento DELETE en solicitudes físicas (ADR-006).
  3. Tabla housing_units — Trigger P0003:
    Confirmar que el trigger check_housing_unit_limit_trigger esté activo y asociado al evento BEFORE 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 LicenciaLímite ViviendasMensualTrimestralSemestralAnualNotas Operativas
Demo GratuitaHasta 30$0N/AN/AN/APool de cortesía: 10 despachos combinados. Vigencia 15 días.
Plan LiteHasta 30$10$25$50$95Condominios y edificios pequeños.
Plan StandardHasta 75$20$50$100$190Comunidades medianas (estándar de la industria).
Plan ProHasta 150$30$80$150$270Complejos residenciales de alta densidad.
Plan EnterpriseHasta 300CotizaciónCotizaciónCotización$150**Promo de apertura anual exclusiva ($150/año).
Perpetua (ADR-004)Ilimitado$0$0$0$0Socios, 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)
demo304460 MB10
lite302030300 MB150
standard7550751,000 MB375
pro1501001502,500 MB750
enterprise3002003005,000 MB1,500
perpetuaNULL (ilimitado)NULL (ilimitado)NULL (ilimitado)NULL (ilimitado)NULL (ilimitado)

Wiki Técnica Oficial — ITECEL ADM