Arquitectura técnica
Stack: Laravel 13, Filament 5, Laravel Cashier (Stripe), PhpSpreadsheet, Tailwind 4.
Dos niveles de base de datos
- MySQL central: usuarios, empresas (
tenants), membresías y roles, tarifas, suscripciones, proveedores y consumo de IA, importaciones, definiciones de modelos y campos, conectores, avisos, automatizaciones y actividad. - SQLite por empresa (
storage/app/private/tenants/{uid}/data.sqlite): una tabla física por modelo dinámico (d_{nombre}), con las columnas de sistemaid,_source,_external_id,_created_by,_updated_by,created_atyupdated_at.
Así la base central no crece con los datos de los clientes, cada empresa queda aislada y se puede respaldar, mover o borrar por separado.
Piezas principales
| Pieza | Ubicación | Responsabilidad |
|---|---|---|
TenantDatabase |
app/Services/Tenancy |
Registra en tiempo de ejecución la conexión SQLite de cada empresa. |
SchemaManager |
app/Services/Dynamic |
Crea, sincroniza, renombra y elimina tablas y columnas al cambiar las definiciones. |
DynamicModel / DynamicField |
app/Models |
Definición de modelos y campos (tipos en App\Enums\FieldType). |
DynamicRecord |
app/Models |
Modelo Eloquent genérico que se enlaza a la tabla y conexión de un DynamicModel, con casts dinámicos. |
DynamicSchema |
app/Filament/Support |
Genera formularios, columnas, filtros, filtro avanzado y agrupaciones de Filament desde la definición. |
DynamicRecords |
app/Filament/App/Pages |
Página genérica /app/{empresa}/datos/{modelo} que actúa como resource dinámico y genera el menú. |
SpreadsheetReader |
app/Services/Excel |
Lee hojas, detecta la fila de cabeceras y extrae muestras y filas. |
ExcelAnalyzer / HeuristicAnalyzer |
app/Services/Excel |
Propuesta de modelos con IA o local. |
ImportApplier |
app/Services/Excel |
Crea modelos y tablas e importa por lotes (con resolución de relaciones y deduplicado). |
AiManager + drivers |
app/Services/Ai |
Capa multi-proveedor (Anthropic, OpenAI y compatibles, Gemini), límites y registro de consumo. |
ApiAnalyzer / ApiSyncService / ApiClient |
app/Services/Integrations |
Análisis de APIs con IA, sincronización (pull/push, paginación, upsert). |
RuleEngine, ConditionEvaluator, AlertDispatcher, AutomationRunner |
app/Services/Rules |
Avisos y automatizaciones por eventos y programadas. |
IntegrationCatalog |
app/Services/Integrations |
Catálogo de fichas (config/integrations.php), sustitución de valores, prueba de conexión y fichas generadas con IA. |
ModelBuilder |
app/Services/Integrations |
Propone y crea modelos a partir de registros reales de una API (campos, tipos, sublistas como modelos hijos), con IA opcional. |
IntegrationInstaller |
app/Services/Integrations |
Conector → endpoints → modelos → primera sincronización → webhooks. |
IncomingWebhookController |
app/Http/Controllers |
POST /hooks/{token} con verificación de firmas. |
FileFetcher / DataSourceRefresher |
app/Services/Files |
Descarga desde URL / FTP / SFTP y refresco de modelos (append / upsert / replace). |
PlanLimits |
app/Services/Billing |
Límites por plan. |
TablifyxBillingProvider + EnsureTenantHasAccess |
app/Services/Billing, app/Http/Middleware |
Integración de la facturación con la tenancy de Filament. |
Paneles
/admin— superadministración (empresas, usuarios, tarifas, proveedores y consumo de IA)./app/{empresa}— panel de cliente con tenancy de Filament porslug.
Flujo de eventos
DynamicRecordObserver escucha created, updated y deleted de DynamicRecord y llama a RuleEngine, que evalúa avisos y automatizaciones. Las importaciones masivas insertan por lotes sin disparar reglas; las sincronizaciones de API sí las disparan. Las ejecuciones programadas se lanzan con tablifyx:rules desde el scheduler.