Ir al contenido

Ingresos y movimientos

La vista de Ingresos (ruta /accounting/ingresos) es la vista principal del módulo de Contabilidad. A pesar del nombre, lista TODOS los movimientos contables de tu negocio (ingresos y egresos), agrupados por fecha, con filtros avanzados y un resumen superior calculado en backend a partir de los datos de cada sucursal.

Es la herramienta que usas a diario para responder a la pregunta: “¿Cómo van los números hoy, esta semana o este mes?”.

Si recién entras a Contabilidad, antes conviene leer la guía general del módulo para entender el layout, el selector de sucursal y la persistencia en localStorage.


  1. El selector de sucursal del header ya está aplicado. La vista de Ingresos respeta la sucursal elegida en el header: si estás en “Todas”, verás movimientos de todas tus sucursales; si estás en una sucursal específica, solo los de esa. Cambiar el selector refresca la vista inmediatamente.
  2. Los movimientos se generan automáticamente. Salen de Pedidos cerrados, ventas POS, consumos locales y compras de inventario. No necesitas crearlos a mano.
  3. Para ver egresos también aquí. La columna “Tipo” te indica si cada movimiento es ingreso o egreso, y el filtro por tipo te permite separarlos.
  4. Conceptos previos útiles:
    • Movimiento: cada registro contable individual con su monto, fecha, cuenta, categoría y estado.
    • Origen: el proceso de Emelit Express que generó el movimiento (pedido_digital, venta_directa, consumo_local, compra_inventario, gasto_manual).
    • Estado: posted, voided, paid, pending, draft, to_pay.
  5. Tiempo de lectura: 5 minutos. Recorrer la vista para tu día a día te tomará 2–3 minutos por sesión.

ZonaQué contiene
Resumen superior4 KPIs: total de movimientos, ingresos ($), egresos ($), neto ($). Calculados vía movimientosService.getSummary(sucursalId).
Barra de filtrosBúsqueda por texto, estado, tipo (ingreso/egreso/ambos), fecha desde y fecha hasta.
Botones superiores”Expandir todos” / “Colapsar todos” para abrir/cerrar todos los grupos por día de una sola vez.
Cuerpo principal — vista móvilTarjetas agrupadas por día, cada una colapsable.
Cuerpo principal — vista desktopTabla con 10 columnas: checkbox.marca, ID, hora, descripción, cliente/origen, sucursal, estado, tipo, monto y cuenta.
Paginación inferiorBotones “Anterior” / “Siguiente” para recorrer lotes de movimientos.
ColumnaDescripción
CheckboxMarca múltiple para acciones en lote (futuro).
IDIdentificador interno del movimiento.
HoraHora del movimiento (HH:mm).
DescripciónConcepto del movimiento (“Pedido #123”, “Compra inventario — proveedor XYZ”, etc.).
Cliente/OrigenCliente asociado o el origen mapeado: pedido digital, venta directa, consumo local, compra inventario, gasto manual.
SucursalNombre de la sucursal origen (mapa id → nombre). En modo sucursal específica sigue visible para confirmar.
EstadoBadge con color según estado: posted (verde), voided (gris), paid (azul), pending (ámbar), draft (gris claro), to_pay (morado).
TipoIngreso (verde) o egreso (rojo).
MontoCantidad en MXN con signo (positivo para ingresos, negativo para egresos).
CuentaCuenta contable afectada (Caja Insurgentes, Banco Azteca 0492, etc.).
FiltroQué haceCuándo usarlo
Búsqueda de textoFiltra por descripción, ID, cliente o referencia.Cuando buscas un pedido o un gasto específico (“Renta”, “ORD-3852”).
EstadoFiltra por posted, voided, paid, pending, draft, to_pay o “todos”.Para ver solo anulados al cierre, o solo pendientes de aprobar.
TipoFiltra por ingreso, egreso o ambos (default).Para ver solo salidas al revisar egresos.
Fecha desdeInicio del rango de fechas.Cierre mensual: día 1 del mes.
Fecha hastaFin del rango de fechas.Cierre mensual: último día del mes.
  1. Define primero el rango de fechas (es el que más recorta resultados).
  2. Agrega el tipo si solo te interesa ingresos o solo egresos.
  3. Agrega estado si quieres excluir anulados o borradores.
  4. Usa la búsqueda de texto para encontrar algo específico dentro del filtro resultante (ej. “Renta Vallejo”).

Cada filtro dispara una nueva consulta a movimientosService.getRecentMovements(limit, sucursalId) con los parámetros actualizados. No necesitas un botón “Aplicar” — se aplica automáticamente.

Los movimientos se agrupan por fecha (no por hora). Cada grupo corresponde a un día y muestra su cabecera con:

  • Fecha del grupo (ej. “Sábado 14 de junio de 2026”).
  • Número de movimientos del día.
  • Total neto del día (ingresos − egresos).
  • En móvil: tarjeta colapsable; en desktop: cabecera de tabla con totales.
  • Expandir todos: abre todos los días visibles en la página actual. Útil para revisar detalle completo de un periodo corto.
  • Colapsar todos: cierra todos los grupos, dejando solo las cabeceras con totales diarios. Útil para lectura comparativa rápida.

En la cabecera de la vista verás 4 KPIs:

KPISignificadoCómo interpretarlo
Total movimientosCantidad de registros (ingresos + egresos) en el filtro actual.Un número alto no implica más ingresos; revisa también el neto.
IngresosSuma de todos los movimientos de tipo ingreso con estado posted, paid o equivalentes sobre el rango.Es la base para comparar contra el periodo anterior.
EgresosSuma de todos los movimientos de tipo egreso en el rango.Si el porcentaje egresos/ingresos supera tu meta, revisa las categorías altas.
NetoIngresos − egresos.Es el dinero que efectivamente “se quedó” en el periodo. No es utilidad fiscal: para eso usa Reportes > Estado de resultados.

La cifra del resumen es una agregación del backend vía getSummary. No la calcula el frontend sumando filas visibles: consulta la base completa y devuelve los totales. Por eso aunque pagines, los KPIs siguen mostrando el total del rango filtrado.

Al final de la vista verás los botones Anterior y Siguiente. La vista carga los movimientos en lotes (limit configurable) para mantener la página rápida, especialmente con miles de movimientos mensuales.

  • Anterior: carga el lote previo manteniendo el mismo filtro.
  • Siguiente: carga el lote siguiente.
  • El resumen superior no se ve afectado por la paginación: siempre refleja el total del rango filtrado, no solo el lote visible.
BadgeColorSignificadoAcción recomendada
postedVerdeRegistrado y válido. Forma parte del balance de la cuenta.Ninguna.
voidedGrisAnulado. No afecta balance. El movimiento original sigue visible por trazabilidad.revisa la razón de anulación con tu equipo.
paidAzulCuenta por pagar ya cubierta.Ninguna.
pendingÁmbarPendiente de aprobación.Aprueba o corrige desde el origen (Egresos o Pedidos).
draftGris claroBorrador. No impacta balance.Conviértelo a posted cuando esté confirmado.
to_payMoradoProgramado para pago futuro.Confirma la fecha de pago en Egresos.

Cada movimiento tiene un origen que indica el proceso de Emelit Express que lo generó:

OrigenCuándo aparece
Pedido digitalUn cliente hizo un pedido online y se cerró con éxito.
Venta directaUna venta registrada en el POS de una sucursal.
Consumo localConsumo de mesas dentro del restaurante (códigos QR, reservas).
Compra inventarioUna compra de insumos registrada en Inventario > Compras.
Gasto manualUn egreso registrado manualmente desde Contabilidad > Egresos.

Eres dueño de Restaurante El Buen Sazón con 3 sucursales. Viernes 13 de junio 2026, 7:30 PM. Quieres hacer un cierre rápido de la semana antes de irte a casa.

  1. Ver el neto de la semana actual (jun 9–13).
  2. Detectar el día con más egresos.
  3. Confirmar que no haya movimientos voided raros.
  4. Aislar solo los ingresos de la sucursal Vallejo.

Viernes 7:30 PM — Vista Global

  1. Clic en Contabilidad > Ingresos. El selector del header está en “Todas” (tu última preferencia guardada).
  2. En la barra de filtros pones Desde: 09/06/2026, Hasta: 13/06/2026. Dejas Tipo en “Ambos” y Estado en “Todos”.
  3. El resumen superior muestra: 612 movimientos, $164,300 ingresos, $58,900 egresos, $105,400 neto.
  4. Clic en Colapsar todos para leer solo cabeceras diarias.

Viernes 7:32 PM — Detectar el día con más egresos

  1. Reviso las cabeceras por día: Lunes 9 ($4,200 egresos), Martes 10 ($8,900), Miércoles 11 ($22,400), Jueves 12 ($12,300) y hoy viernes 13 ($10,900).
  2. Miércoles 11 se dispara. Clic en expandir ese día.
  3. Aparece una fila con descripción “Compra inventario — Proveedor La Merced”, monto -$15,000 MXN, origen “compra inventario”, sucursal “Insurgentes”.
  4. Confirmas con un mensaje a tu gerente de Insurgentes: efectivamente fue el reabastecimiento semanal de verduras.

Viernes 7:35 PM — Revisar anulados

  1. En Estado seleccionas voided. Resumen cambia a 3 movimientos anulados en la semana.
  2. Los expandidos: dos son vendidos POS cancelados por error de captura; uno es un consumo local que el cliente canceló. Todo cuadra.

Viernes 7:38 PM — Filtrar solo Vallejo

  1. En el header cambias el selector de “Todas” a Vallejo. El localStorage actualiza manager_branch_id:789.
  2. La vista se refresca con los mismos filtros de fecha: Vallejo hizo $38,400 ingresos en la semana y $12,900 egresos; neto $25,500.
  3. Clic en Expandir todos para revisar día por día; miércoles 11 confirmas que en Vallejo no hubo egreso atípico (la compra de La Merced fue en Insurgentes).
  4. Clic en Siguiente para revisar si hay lotes adicionales.

Autoconclusión: la semana va bien. Te vas a casa tranquilo, sin tener que abrir Excel.

  • Cierres de semana en 5 min en lugar de 30 min cruzando Excel.
  • Detección de egresos atípicos el mismo día en que ocurren, no al cierre de mes.
  • Validación de anulados semanal evita acumular movimientos sospechosos.

  1. Apertura (9 AM): rango “Hoy”, Tipo “Ambos”. Revisa el neto y los egresos atípicos del día anterior si olvidaste hacerlo.
  2. Cierre (9 PM): rango “Hoy”, expande el día. Confirma que los movimientos posted esperados aparecieron (las ventas del POS ya deben verse).
  1. Lunes 9 AM: rango “Semana pasada”. Revisa neto global, expande el mejor y el peor día.
  2. Filtrar por estado voided: identifica anulados y valida con gerentes que sean legítimos.
  3. Filtrar por tipo “egreso”: revisa el top de egresos de la semana. Identifica categorías que crecen.
  1. Día 1 del mes: rango mes anterior. Compara el neto global contra el mes previo mentalmente o con la vista de Reportes.
  2. Filtra por origen: separa “pedido digital” de “venta directa” para ver mezcla de canal.
  3. Pagina hasta el final para asegurarte de que ningún movimiento quedó sin revisar en categoría alta.

ErrorCausa probableSolución paso a paso
”El resumen no coincide con la suma de las filas visibles”El resumen agrega TODO el rango filtrado, no solo el lote paginado visible.Comportamiento esperado. Si quieres validar, suma todas las páginas o reduce el rango.
”Cambio el rango de fechas pero la tabla no se actualiza”El debounce del filtro no disparó la consulta.1. Pulsa Enter en el campo de fecha. 2. Si no, recarga. 3. Limpia los filtros y vuelve a aplicar.
”Filtro ‘Todas’ muestra una sucursal que no conozco”Sucursal activa pero inactiva operativamente, o mapa mal generado.1. Verifica tus sucursales en Sucursales > Gestión de Sucursales. 2. Si hay sucursales de prueba, dáselas de baja.
”Aparecen movimientos con sucursal en blanco”Ordenes antiguas sin sucursal_id (pre-migración).1. Identifica la orden en Pedidos > Panel de Pedidos. 2. Edítala y asígnale la sucursal correcta. 3. Refresca Ingresos.
”Badge de estado no se ve en móvil”Problema de viewport.1. Rota el teléfono a horizontal. 2. Si persiste, usa la versión web.
”Paginación salta movimientos”Bug de offset probable.1. Recarga. 2. Reporta a soporte con el rango exacto del bug.

P: ¿Por qué veo egresos en una vista llamada “Ingresos”? R: La vista se llama “Ingresos” por su origen histórico, pero en realidad muestra todos los movimientos (ingresos y egresos). El filtro “Tipo” te permite ver solo uno. El nombre se conservará por compatibilidad con tus marcadores.

P: ¿Puedo editar un movimiento aquí? R: No. Los movimientos son inmutables. Si uno está mal, anúlalo (voided) desde el módulo de origen (Egresos para egresos manuales, Pedidos para ventas) y registra el correcto.

P: ¿El neto del resumen es mi utilidad fiscal? R: No. El neto aquí es ingresos menos egresos del periodo con los criterios contables de Emelit Express. Para tu utilidad fiscal ante el SAT, usa tu software contable certificado y el reporte de Facturas emitidas.

P: ¿Puedo exportar la tabla a CSV? R: La exportación CSV está integrada en la vista de Reportes. Para Ingresos, está planeada en próximas versiones. Mientras tanto, copia desde pantalla o usa el endpoint /api/v1/movimientos con tu token.

P: ¿Qué origen tiene un pedido de WhatsApp? R: Un pedido por WhatsApp atado a una orden digital se mapea como pedido digital; uno generado en POS como venta directa. Si根系创业者 o generas consumos locales con QR, se mapea como consumo local.

P: ¿Por qué un movimiento está en estado pending? R: Los movimientos pending son los que están pendientes de aprobación (por ejemplo, egresos que requieren doble validación). Aprobarlos los mueve a posted. Ver Ingresos con filtro “Tipo: egreso” y “Estado: pending” para encontrarlos.

P: ¿El resumen considera los movimientos voided o draft? R: No. El resumen (getSummary) solo considera movimientos posted (y paid cuando aplica). voided, draft, pending y to_pay no afectan los KPIs.

P: ¿Cuántos movimientos carga cada página? R: El backend usa limit configurable; típicamente 50–100 por lote. Si necesitas más detalle, reduce el rango de fechas o usa la exportación CSV cuando esté disponible.


Para profundizar en el resto del módulo, continúa con Egresos manuales, Reportes financieros y Configuración contable.