Ir al contenido

Egresos manuales

La vista de Egresos (ruta /accounting/egresos) te permite listar egresos registrados y registrar egresos manuales: gastos operativos, pagos a proveedores, retiros de socio, mantenimiento, sueldos, etc. Está pensada para que captures cualquier salida de dinero que no venga directamente de una compra de inventario o de un proceso automatizado de Emelit Express.

A diferencia de otras vistas del módulo, Egresos requiere que tengas seleccionada una sucursal específica en el header (no se permite “Todas”). Cada egreso se imputa a una sucursal porque afecta al balance de cuentas, a los reportes por sucursal y al estado de resultados por sucursal.

Si nunca has registrado un egreso, antes revisa la Configuración contable para crear las categorías y cuentas que vas a necesitar. Sin categorías de tipo egreso o cuentas con saldo, el formulario no podrá completarse.


  1. Una sucursal seleccionada en el header. Si estás en “Todas” el botón “Registrar egreso” te pedirá cambiar. Los egresos se imputan a UNA sucursal.
  2. Al menos una categoría activa de tipo egreso o ambos. Vía AccountingService.listCategories('egreso'). Si no tienes categorías, créalas en Contabilidad > Configuración.
  3. Al menos una cuenta contable con saldo. Vía AccountingService.listAccounts(branch). Las cuentas son de una sucursal específica o globales (excepto las cajas, que siempre son por sucursal).
  4. Documentación del gasto lista. Si es deducible para el SAT (factura del proveedor), ten el CFDI a mano para relacionarlo después. Si es no deducible, también puedes registrarlo; lo verás en el egreso pero no afecta tu facturación.
  5. Conceptos previos útiles:
    • Idempotencia: el formulario genera un UUID interno (idempotency_key) que evita duplicados si guardas dos veces por una caída de red.
    • Counterparty: el proveedor, persona o entidad a quien se le pagó (ej. “Inmobiliaria Reforma S.A.”, “Distribuidora La Merced”).
    • Método de pago: efectivo, transferencia, tarjeta, otro.
  6. Tiempo de lectura: 6 minutos. Registrar un egreso te tomará 1–2 minutos una vez dominado el flujo.

Al entrar a Contabilidad > Egresos verás:

ZonaContenido
Selector de sucursal del headerAplica a esta vista. Recuerda: no puedes registrar en “Todas”.
Resumen superiorTotal registrado ($ suma de egresos posted del filtro) + número de movimientos.
Lista de egresosCada fila muestra: descripción / categoría / proveedor (counterparty) en una línea; cuenta / fecha en otra; monto en rojo.
Botón “Registrar egreso”Abre el drawer lateral derecho con el formulario.

Cada fila de la lista tiene 3 líneas:

  1. Descripción / categoría / proveedor: “Compra arroz 50kg — Insumos — Distribuidora La Merced”.
  2. Cuenta / fecha: “Banca Azteca 0492 — 30/06/2026”.
  3. Monto en rojo: - $4,500 MXN.
  1. Clic en el botón Registrar egreso (parte superior derecha de la vista).
  2. Se abre un drawer lateral derecho (no una ventana modal completa) con el formulario “Registrar egreso”.
  3. El drawer se mantiene abierto aunque navegues dentro de la lista; se cierra al guardar exitosamente o con el botón “Cancelar”.

Los campos del formulario, en orden:

CampoTipoObligatorioNotas
DescripciónTexto libreConcepto del egreso. Sé específico: usa “Renta oficina Vallejo junio 2026” en lugar de “Renta”.
MontoNúmero decimalSí (debe ser > 0)En MXN. Separa decimales con punto (15000.00).
FechaSelector de fechaSí (default: hoy)Fecha del egreso, no del registro. Si fue un pago de ayer, pon la fecha de ayer.
CategoríaSelectLista de categorías activas tipo egreso o ambos para la sucursal seleccionada.
CuentaSelectCuentas contables con balance disponible para la sucursal (incluye cuentas globales no cash).
Proveedor (counterparty)Texto libreNoNombre del proveedor o persona a quien se pagó. Facilita conciliación.
Método de pagoSelectNoefectivo, transferencia, tarjeta, otro. Default efectivo.
NotasTexto libreNoDetalles internos del gasto. Referencia bancaria, número de factura, acuerdo con proveedor.

Caso A: Renta mensual por transferencia bancaria

Sección titulada «Caso A: Renta mensual por transferencia bancaria»
  1. Header en Vallejo.
  2. Descripción: “Renta oficina Vallejo junio 2026”.
  3. Monto: 15000.00.
  4. Fecha: 30/06/2026.
  5. Categoría: “Renta y servicios”.
  6. Cuenta: “Banco Azteca 0492” (cuenta bank global o de Vallejo).
  7. Proveedor: “Inmobiliaria Reforma S.A.”.
  8. Método de pago: “transferencia”.
  9. Notas: “Transferencia SPEI confirmada. CFDI del proveedor en archivo.”.
  10. Clic en Guardar.

Caso B: Compra de gas para cocina en efectivo

Sección titulada «Caso B: Compra de gas para cocina en efectivo»
  1. Header en Insurgentes.
  2. Descripción: “Recarga tanque estacionario LP 300L”.
  3. Monto: 4850.00.
  4. Fecha: hoy.
  5. Categoría: “Servicios básicos”.
  6. Cuenta: “Caja Insurgentes” (tipo cash, pertenece a Insurgentes).
  7. Proveedor: “Gas Express Nieto”.
  8. Método de pago: “efectivo”.
  9. Notas: “Recibo en caja chica.”.
  10. Clic en Guardar.

Caso C: Sueldo quincenal a mesero por transferencia

Sección titulada «Caso C: Sueldo quincenal a mesero por transferencia»
  1. Header en Guadalajara.
  2. Descripción: “Sueldo quincena 1 julio Juan Pérez (mesero)”.
  3. Monto: 6500.00.
  4. Fecha: 15/07/2026.
  5. Categoría: “Sueldos y salarios”.
  6. Cuenta: “Banorte 8821”.
  7. Proveedor: “Juan Pérez López”.
  8. Método de pago: “transferencia”.
  9. Notas: “SPEI conf. CLABE 012180012345678901. CURP PEJ…”.
  10. Clic en Guardar.

El formulario incluye un campo invisible llamado idempotency_key que se rellena con un UUID recién generado cada vez que abres el drawer. Este UUID viaja al backend en el cuerpo del POST /movimientos/egresos. El backend lo guarda como llave única en movimientos_contables:

  • Caso 1: guardas una vez, todo bien → backend guarda el egreso con ese key.
  • Caso 2: la red se cae justo después de guardar, reintentas con el mismo formulario abierto → mismo key → backend reconoce el key y responde el egreso original, sin crear duplicado.
  • Caso 3: recargas la página y abres el drawer de nuevo → nuevo UUID → backend guarda un nuevo egreso. Aquí sí habría duplicado si el primero logró guardarse.

Buenas prácticas:

  1. Si la red se cae, espera y vuelve a dar clic en Guardar sin cerrar el drawer. Misma data, mismo key.
  2. Si crees que el primer guardado sí pasó aunque la página se quedó en blanco, antes de reabrir el drawer, verifica la lista. Si el egreso ya aparece, no lo registres de nuevo.
  3. Si detectas un duplicado, no lo elimines (los movimientos son inmutables). Anúlalo con estado voided desde la lista con un clic.

Parte 6: Cómo se modifica o anula un egreso

Sección titulada «Parte 6: Cómo se modifica o anula un egreso»

Los egresos no se eliminan ni se editan directamente: son inmutables para preservar trazabilidad fiscal.

  • Para corregir un monto o categoría mal capturado: registra un movimiento voided que anule el original (el sistema vincula los dos con un reversal_of) y luego captura un nuevo egreso con los datos correctos.
  • Para anular un egreso por completo: abre el egreso en la lista y usa la acción “Anular”. El movimiento queda voided (ya no afecta balance ni reportes) pero sigue visible por auditoría.

La vista se apoya en:

  • AccountingService.listExpenses({ sucursalId }) — lista de egresos actuales de la sucursal.
  • AccountingService.listCategories('egreso') — categorías activas de egreso o ambos.
  • AccountingService.listAccounts(branch) — cuentas contables con saldo para esa sucursal (incluye globales no cash).
  • AccountingService.createExpense({ ...form, sucursal_id }) — alta del egreso, incluye el idempotency_key en el cuerpo.

Eres dueño de Restaurante El Buen Sazón (3 sucursales). Lunes 1 de julio 2026, 11 AM. Tu contador te pidió que el pago de la renta de la sucursal Vallejo quedara registrado en junio para que闭合ara el mes contable.

  1. Registrar el pago de renta de Vallejo a Inmobiliaria Reforma por $15,000 MXN con fecha 30 de junio de 2026.
  2. Confirmar que no se duplique aunque la red sea inestable.
  3. Validar que el egreso aparezca en el Reporte de Estado de Resultados de junio.

Lunes 11:00 AM — Preparación

  1. Verificas que tienes categorías. Entras a Contabilidad > Configuración > pestaña Categorías. Existe “Renta y servicios” tipo egreso. ✓
  2. Verificas cuentas. En Configuración > Cuentas tienes “Banco Azteca 0492” tipo bank, sucursal Vallejo, saldo inicial $80,000. ✓

Lunes 11:05 AM — Registro

  1. Header en Vallejo. Entras a Contabilidad > Egresos.
  2. Resumen muestra $38,700 ya registrados en Vallejo en junio (otras cuentas: gas, sueldo quincenal, insumos).
  3. Clic en Registrar egreso → drawer lateral.
  4. Llenas:
    • Descripción: “Renta oficina Vallejo junio 2026”.
    • Monto: 15000.00.
    • Fecha: 30/06/2026.
    • Categoría: “Renta y servicios”.
    • Cuenta: “Banco Azteca 0492”.
    • Proveedor: “Inmobiliaria Reforma S.A.”.
    • Método de pago: “transferencia”.
    • Notas: “SPEI conf. ref 220630RIES. CFDI del proveedor archivado”.
  5. Clic en Guardar. Aparece toast verde “Egreso registrado correctamente”.

Lunes 11:07 AM — Validación anti-duplicado

  1. Tu red WiFi falla justo cuando das clic. La página muestra “Cargando…”.
  2. Esperas 10 segundos, das clic en Guardar de nuevo (sin cerrar el drawer).
  3. El backend recibe el mismo idempotency_key, reconoce que el egreso ya existe y responde el egreso original. No se duplica.
  4. El drawer se cierra y ves en la lista el egreso nuevo con - $15,000 MXN.

Lunes 11:10 AM — Validación en reporte

  1. Vas a Contabilidad > Reportes > tab Estado de resultado.
  2. Rango 01/06/202630/06/2026, sucursal Vallejo, Actualizar.
  3. En la tabla de Egresos por categoría, “Renta y servicios” ahora muestra $18,500 MXN ($3,500 anteriores + $15,000 nuevos).
  4. El balance de la cuenta “Banco Azteca 0492” bajó de $80,000 a $65,000. Confirma el impacto del nuevo egreso.
  • Cierre mensual sin sobresaltos: agosto reporta sin desviaciones porque todos los egresos quedaron imputados a la sucursal correcta.
  • Cero duplicados: aunque la red es inestable en Vallejo, no has registrado duplicados gracias a idempotencia.
  • Trazabilidad SAT: cada egreso con CFDI del proveedor queda anotado en “Notas”, listo para tu contador.

  1. Cierre de día (9 PM): header en cada sucursal (o solo la relevante), revisa lista de Egresos con rango “Hoy”.
  2. Si detectas un gasto no capturado, regístralo ahora mismo para que no quede “fuera del cierre”.
  1. Lunes 9 AM: rango “Semana pasada”, revisa lista completa.
  2. Si hay un egreso voided inesperado, pídele a tu gerente que explique.
  3. Verifica que los egresos grandes del periodo (rentas, sueldos, insumos mayores) ya estén registrados.
  1. Día 1 del mes: rango “Mes anterior”, revisa por sucursal.
  2. Compara la suma de egresos con tus expectativas operativas.
  3. Si hay deuda del mes pasado (proveedores sin pagar), regístrala como to_pay o espera a pagarla y regístrala posted.
  4. Cruza con tus facturas de proveedores (los CFDI recibidos, no los emitidos) para empalmar egreso con factura deducible ante el SAT.
  • Confirma la sucursal del header.
  • Confirma la cuenta: si es una caja (cash), debe ser de esa sucursal. Si es bank, card, digital, other puede ser global.
  • Confirma el monto en MXN con dos decimales.
  • Anota el CFDI o contrato del proveedor en Notas.

ErrorCausa probableSolución paso a paso
”No puedo registrar en ‘Todas‘“Comportamiento esperado: egresos requieren sucursal específica.1. Cambia el selector del header a la sucursal donde se pagó. 2. Abre el drawer y llena el formulario.
”El botón Guardar está deshabilitado”Falta un campo obligatorio (descripción, monto válido > 0, categoría, cuenta).Revisa campos: descripción no vacía, monto > 0, categoría y cuenta seleccionadas.
”No aparecen cuentas para seleccionar”No hay cuentas con saldo para esa sucursal.1. Ve a Contabilidad > Configuración > Cuentas. 2. Crea una cuenta (cash o bank) para la sucursal con saldo inicial. 3. Vuelve a Egresos.
”No aparecen categorías”No hay categorías tipo egreso o ambos activas.1. Ve a Contabilidad > Configuración > Categorías. 2. Crea la categoría (ej. “Renta y servicios”). 3. Vuelve a Egresos.
”Se guardó un egreso duplicado”Recargaste el drawer entre intentos, generando un nuevo idempotency_key.1. Verifica cuál es el duplicado (mismo monto, fecha, descripción). 2. Anula uno con estado voided. 3. NO lo elimines: los movimientos son inmutables. 4. Si reproduciste el bug varias veces, reporta a soporte con los IDs.
”El monto acepta negativo”Validación frontend puede permitir signo.Aunque el formulario lo permita ocasionalmente, el backend solo acepta monto > 0. Captura valores positivos.
”El egreso no aparece en Reportes”Estado draft o pending; Reportes solo considera posted.1. Verifica el estado en la lista. 2. Si está pending, apruébalo. 3. Si está draft, publícalo.
”Cuenta con saldo cero no aparece”listAccounts filtra cuentas sin saldo.Si es la primera vez que usas una cuenta vacía, dale saldo inicial desde Configuración > Cuentas, o registra un ingreso primero.
”Cambié de sucursal y el egreso previo no se ve”Cada sucursal tiene sus propios egresos; la vista respeta el selector.1. Si el egreso fue capturado en Vallejo y cambias a Insurgentes, no lo verás. 2. Cambia el selector a Vallejo para verlo.
”Capté mal la categoría, ya guardé”Inmutabilidad de movimientos.1. Anula el egreso (voided). 2. Registra uno nuevo con la categoría correcta. 3. No intentes editarlo.

P: ¿Por qué no puedo elegir “Todas” para registrar un egreso? R: Porque cada egreso afecta el balance de una cuenta, los reportes por sucursal y el estado de resultados. Imputarlo a “Todas” haría imposible saber a qué sucursal corresponde el gasto. Cambia el selector a la sucursal correcta.

P: ¿Puedo registrar un egreso con fecha futura? R: Sí, el campo Fecha acepta fechas futuras. El egreso quedará en estado to_pay (o pending según tu config) y se sumará al balance cuando la fecha sea actual y el estado sea posted. Útil para programar sueldos o rentas.

P: ¿Cómo asocio una factura CFDI recibida del proveedor a un egreso? R: En el campo Notas captura la referencia (UUID, folio o referencia bancaria). En una versión futura habrá un campo “CFDI recibido” para vincularlo formalmente con el XML del proveedor y apoyar tu deductibilidad ante el SAT.

P: ¿Qué pasa si duplico un egreso por error de red? R: El sistema está diseñado para evitarlo con idempotency_key. Si de cualquier manera se crea un duplicado (por ejemplo recargaste el formulario), anula uno con voided desde la lista. No se elimina, se anula.

P: ¿Puedo registrar un egreso para una cuenta global (sin sucursal)? R: Sí, siempre que la cuenta sea bank, card, digital u other. Las cajas cash no existen a nivel global. El egreso se imputa al balance de esa cuenta global pero la “sucursal del egreso” (para reportes) será la del selector.

P: ¿El monto negativo se considera egreso automáticamente? R: No, capturas monto siempre positivo. El backend lo interpreta como salida porque el endpoint es /movimientos/egresos. No mezcles signos.

P: ¿Cómo corrijo categorías sin perder histórico? R: Las categorías son de solo activación/desactivación (no se eliminan). Si creaste una categoría mal, désactívala y crea una nueva. Los egresos históricos siguen referenciando la categoría original y la trazabilidad se mantiene.

P: ¿Las cuentas de caja (cash) requieren sucursal? R: Sí, indispensable. El backend lo valida con validateAccount y rechaza cualquier intento de crear cuenta cash sin sucursal.

P: ¿Cómo actualizo el saldo inicial de una cuenta? R: El saldo inicial se ajusta en Configuración > Cuentas editando la cuenta. El balance se recalcula como opening_balance + Σ(movimientos posted). Si cambias el saldo inicial a mitad de mes, modifica los saldos futuros del reporte.

P: ¿Puedoistrar un pago parcial a un proveedor? R: Sí. Registra el monto parcial como egreso posted y anota en Notas que falta el resto. Cuando complete el pago, registra otro egreso por el restante. La categoría puede ser la misma.

P: ¿El total registrado del resumen descuenta anulados? R: Sí. El resumen usa getSummary que solo considera posted (y paid cuando aplica). Los voided no suman ni restan.

P: ¿Hay límite de monto? R: No desde el formulario. El único límite es el saldo de la cuenta seleccionada (no puedes generar un egreso que deje la cuenta en negativo si tienes esa validación activa en backend). Si el egreso supera el saldo, el backend rechaza con error de validación.


Para profundizar, continúa con Reportes financieros y la Configuración contable, donde aprenderás a crear las categorías y cuentas que usarás aquí.