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.