Skip to content

Arquitectura general

Objetivo

Explicar cómo está construido sy-energy por dentro: qué capas tiene, dónde vive cada tipo de código y qué implicaciones operativas tiene su diseño.

Audiencia

Desarrollo interno y soporte técnico.

Estado documental

  • Estado: Borrador
  • Última actualización: 2026-08-02
  • Owner: Pendiente
  • SME requerido: arquitectura y desarrollo
  • Fuente resumida: estructura de código, configuración de servicios, colas y despliegue.

Qué es sy-energy

El sistema central del ecosistema. Administra clientes, centros de carga, contratos y demanda; procesa los Estados de Cuenta Diarios de CENACE; calcula el costo de la energía por centro de carga; y genera los estados de cuenta y los CFDI que se entregan al cliente y se cargan al portal SIM.

Todos los demás sistemas del ecosistema existen para alimentarlo o para extenderlo.

Stack

CapaTecnología
LenguajePHP 8.5
FrameworkLaravel 13
VistasBlade + Laravel Mix
FrontendVue 3, Bootstrap 4, Tailwind, DataTables, Chart.js
Base de datos principalMySQL
Bases de datos secundariasMongoDB (precios del MEM), SQL Server (integración externa)
Caché y sesionesRedis
ColasAWS SQS (FIFO y estándar) y colas en base de datos
AlmacenamientoAWS S3
PDFdompdf
ExcelMaatwebsite Excel
DespliegueDeployer

Multi-participante

sy-energy no es una instalación única. Se despliega una instancia por participante del mercado, cada una con:

  • su propio despliegue y directorio en el servidor;
  • su propia base de datos;
  • su propio juego de colas SQS, nombradas por código de participante;
  • sus propias credenciales de CENACE y de Factura.com.

Es la decisión de arquitectura con más impacto operativo del sistema. Implica que:

  • un comando ejecutado en la instancia equivocada produce datos incorrectos sin reportar error;
  • un incidente hay que acotarlo siempre a un participante;
  • hay reglas de negocio que difieren entre participantes — por ejemplo, algunos cálculos se excluyen deliberadamente para ciertos participantes.

Organización del código

Conviven dos estilos, resultado de una migración progresiva hacia una estructura por dominios:

text
app/     capa histórica de Laravel
src/     capa por dominios (DDD), namespace SyEnergy\

src/ — dominios

Es donde vive la lógica de negocio nueva. Cada dominio agrupa sus acciones, constructores de consultas, validadores y constantes.

DominioResponsabilidad
ChargeCenterCentros de carga y sus consultas.
DemandDemanda eléctrica.
PassThroughCálculos de costo pass-through: MDA, MTR, congestión, distribución, capacidad.
CfdiComprobantes fiscales.
FacturaComIntegración con el proveedor de timbrado.
OrdersÓrdenes y documentos generados.
CelsCertificados de Energías Limpias.
CfeTxIntegración de transacciones CFE.
ReportsReportes exportables.
ServicesServicios de dominio compartidos.
General / Api / RedirectSoporte transversal.

app/ — capa Laravel

CarpetaContenido
Console/CommandsLos comandos operativos. Organizados por función: Calculate, PassThrough, Dispatch, Files, Bots, Demand, Report, Sync.
JobsTrabajos de cola, incluidos los de despacho y los de respuesta de bots.
ServicesIntegraciones: AWS, bots, adaptador de sincronización de demanda.
StrategyEstrategias por tipo de producto y tipo de documento.
BuilderConstructores de estados de cuenta: uno para costo fijo, otro para pass-through.
ToolsUtilidades por dominio funcional.
LibrariesReglas externas fijas, como el catálogo de CFDI de CENACE.
HttpControladores, requests y middleware.
Raíz de app/Modelos Eloquent históricos (CentroCarga, Contract, Factura, Participante, Order…). Los nombres mezclan español e inglés.

Al buscar código

La lógica de negocio nueva está en src/Domain/. Los modelos y los comandos están en app/. Si un cálculo no aparece donde se espera, suele estar en una Action del dominio correspondiente, invocada desde un comando.

Cómo se ejecuta el trabajo

Tres caminos, con implicaciones distintas para el diagnóstico:

CaminoCómo se disparaQué hay que verificar si falla
Interfaz webUsuario en el navegadorLogs de la aplicación.
Comando de consolaScheduler o ejecución manualQue el cron esté vivo y el log de la tarea.
ColaUn comando despacha; un worker procesaQue el worker esté arriba. El comando que despacha reporta éxito aunque nadie procese el trabajo.

El tercer caso es la fuente más frecuente de confusión operativa: encolar no es procesar.

Conexiones de cola configuradas: sqsfifo, sqscustom, database, redis, sync. Las colas FIFO se usan donde el orden importa, como el balance de CENACE y la sincronización de ECD.

Integraciones

Resumen; el detalle está en Integraciones externas.

Sistema externoPara quéDirección
CENACE (API)Descarga de ECD y documentosEntrada
CENACE (portal SIM)Carga de facturas, REA, FOP — vía botsAmbas
Factura.comTimbrado de CFDISalida
MEMPrecios de nodos y zonas de cargaEntrada
CFE / CFE TXTarifas y mediciones de alta tensiónEntrada
Servicio de demandaDemanda de centros de cargaEntrada
AWS (SQS, S3)Transporte y almacenamientoAmbas

Riesgos y gaps

  • La coexistencia de app/ y src/ significa que hay lógica equivalente en dos estilos; no está documentado qué se migra y qué se queda.
  • Los modelos históricos mezclan español e inglés en nombres de tabla y columna, lo que dificulta la lectura de consultas.
  • No está documentada la arquitectura de red ni el dimensionamiento del servidor.
  • Falta un diagrama de entidades del modelo de datos.
  • No está documentado qué diferencias de configuración existen entre instancias de participante, más allá de las colas.

Próxima revisión

Al documentar el modelo de datos.