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.
Antes de empezar
Sección titulada «Antes de empezar»- 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.
- Los movimientos se generan automáticamente. Salen de Pedidos cerrados, ventas POS, consumos locales y compras de inventario. No necesitas crearlos a mano.
- 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.
- 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.
- Tiempo de lectura: 5 minutos. Recorrer la vista para tu día a día te tomará 2–3 minutos por sesión.
Paso a paso detallado
Sección titulada «Paso a paso detallado»Parte 1: Conocer la pantalla
Sección titulada «Parte 1: Conocer la pantalla»Elementos visuales
Sección titulada «Elementos visuales»| Zona | Qué contiene |
|---|---|
| Resumen superior | 4 KPIs: total de movimientos, ingresos ($), egresos ($), neto ($). Calculados vía movimientosService.getSummary(sucursalId). |
| Barra de filtros | Bú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óvil | Tarjetas agrupadas por día, cada una colapsable. |
| Cuerpo principal — vista desktop | Tabla con 10 columnas: checkbox.marca, ID, hora, descripción, cliente/origen, sucursal, estado, tipo, monto y cuenta. |
| Paginación inferior | Botones “Anterior” / “Siguiente” para recorrer lotes de movimientos. |
Columnas de la tabla desktop
Sección titulada «Columnas de la tabla desktop»| Columna | Descripción |
|---|---|
| Checkbox | Marca múltiple para acciones en lote (futuro). |
| ID | Identificador interno del movimiento. |
| Hora | Hora del movimiento (HH:mm). |
| Descripción | Concepto del movimiento (“Pedido #123”, “Compra inventario — proveedor XYZ”, etc.). |
| Cliente/Origen | Cliente asociado o el origen mapeado: pedido digital, venta directa, consumo local, compra inventario, gasto manual. |
| Sucursal | Nombre de la sucursal origen (mapa id → nombre). En modo sucursal específica sigue visible para confirmar. |
| Estado | Badge con color según estado: posted (verde), voided (gris), paid (azul), pending (ámbar), draft (gris claro), to_pay (morado). |
| Tipo | Ingreso (verde) o egreso (rojo). |
| Monto | Cantidad en MXN con signo (positivo para ingresos, negativo para egresos). |
| Cuenta | Cuenta contable afectada (Caja Insurgentes, Banco Azteca 0492, etc.). |
Parte 2: Filtrar movimientos
Sección titulada «Parte 2: Filtrar movimientos»Filtros disponibles
Sección titulada «Filtros disponibles»| Filtro | Qué hace | Cuándo usarlo |
|---|---|---|
| Búsqueda de texto | Filtra por descripción, ID, cliente o referencia. | Cuando buscas un pedido o un gasto específico (“Renta”, “ORD-3852”). |
| Estado | Filtra por posted, voided, paid, pending, draft, to_pay o “todos”. | Para ver solo anulados al cierre, o solo pendientes de aprobar. |
| Tipo | Filtra por ingreso, egreso o ambos (default). | Para ver solo salidas al revisar egresos. |
| Fecha desde | Inicio del rango de fechas. | Cierre mensual: día 1 del mes. |
| Fecha hasta | Fin del rango de fechas. | Cierre mensual: último día del mes. |
Cómo combinar filtros
Sección titulada «Cómo combinar filtros»- Define primero el rango de fechas (es el que más recorta resultados).
- Agrega el tipo si solo te interesa ingresos o solo egresos.
- Agrega estado si quieres excluir anulados o borradores.
- 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.
Parte 3: Agrupar por día e interpretar
Sección titulada «Parte 3: Agrupar por día e interpretar»Cómo se agrupa
Sección titulada «Cómo se agrupa»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.
Botonera Expandir/Colapsar
Sección titulada «Botonera Expandir/Colapsar»- 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.
Cómo leer el resumen superior
Sección titulada «Cómo leer el resumen superior»En la cabecera de la vista verás 4 KPIs:
| KPI | Significado | Cómo interpretarlo |
|---|---|---|
| Total movimientos | Cantidad de registros (ingresos + egresos) en el filtro actual. | Un número alto no implica más ingresos; revisa también el neto. |
| Ingresos | Suma 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. |
| Egresos | Suma de todos los movimientos de tipo egreso en el rango. | Si el porcentaje egresos/ingresos supera tu meta, revisa las categorías altas. |
| Neto | Ingresos − 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.
Parte 4: Paginación
Sección titulada «Parte 4: Paginación»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.
Parte 5: Interpretar badges de estado
Sección titulada «Parte 5: Interpretar badges de estado»| Badge | Color | Significado | Acción recomendada |
|---|---|---|---|
posted | Verde | Registrado y válido. Forma parte del balance de la cuenta. | Ninguna. |
voided | Gris | Anulado. No afecta balance. El movimiento original sigue visible por trazabilidad. | revisa la razón de anulación con tu equipo. |
paid | Azul | Cuenta por pagar ya cubierta. | Ninguna. |
pending | Ámbar | Pendiente de aprobación. | Aprueba o corrige desde el origen (Egresos o Pedidos). |
draft | Gris claro | Borrador. No impacta balance. | Conviértelo a posted cuando esté confirmado. |
to_pay | Morado | Programado para pago futuro. | Confirma la fecha de pago en Egresos. |
Parte 6: Origines mapeados
Sección titulada «Parte 6: Origines mapeados»Cada movimiento tiene un origen que indica el proceso de Emelit Express que lo generó:
| Origen | Cuándo aparece |
|---|---|
| Pedido digital | Un cliente hizo un pedido online y se cerró con éxito. |
| Venta directa | Una venta registrada en el POS de una sucursal. |
| Consumo local | Consumo de mesas dentro del restaurante (códigos QR, reservas). |
| Compra inventario | Una compra de insumos registrada en Inventario > Compras. |
| Gasto manual | Un egreso registrado manualmente desde Contabilidad > Egresos. |
Ejemplo practico
Sección titulada «Ejemplo practico»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.
Objetivo
Sección titulada «Objetivo»- Ver el neto de la semana actual (jun 9–13).
- Detectar el día con más egresos.
- Confirmar que no haya movimientos
voidedraros. - Aislar solo los ingresos de la sucursal Vallejo.
Recorrido
Sección titulada «Recorrido»Viernes 7:30 PM — Vista Global
- Clic en Contabilidad > Ingresos. El selector del header está en “Todas” (tu última preferencia guardada).
- En la barra de filtros pones
Desde: 09/06/2026,Hasta: 13/06/2026. Dejas Tipo en “Ambos” y Estado en “Todos”. - El resumen superior muestra: 612 movimientos, $164,300 ingresos, $58,900 egresos, $105,400 neto.
- Clic en Colapsar todos para leer solo cabeceras diarias.
Viernes 7:32 PM — Detectar el día con más egresos
- 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).
- Miércoles 11 se dispara. Clic en expandir ese día.
- Aparece una fila con descripción “Compra inventario — Proveedor La Merced”, monto
-$15,000 MXN, origen “compra inventario”, sucursal “Insurgentes”. - Confirmas con un mensaje a tu gerente de Insurgentes: efectivamente fue el reabastecimiento semanal de verduras.
Viernes 7:35 PM — Revisar anulados
- En Estado seleccionas
voided. Resumen cambia a 3 movimientos anulados en la semana. - 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
- En el header cambias el selector de “Todas” a Vallejo. El localStorage actualiza
manager_branch_id:789. - 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.
- 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).
- 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.
Resultados después de 1 mes
Sección titulada «Resultados después de 1 mes»- 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.
Flujo de trabajo recomendado
Sección titulada «Flujo de trabajo recomendado»Rutina diaria
Sección titulada «Rutina diaria»- Apertura (9 AM): rango “Hoy”, Tipo “Ambos”. Revisa el neto y los egresos atípicos del día anterior si olvidaste hacerlo.
- Cierre (9 PM): rango “Hoy”, expande el día. Confirma que los movimientos
postedesperados aparecieron (las ventas del POS ya deben verse).
Rutina semanal
Sección titulada «Rutina semanal»- Lunes 9 AM: rango “Semana pasada”. Revisa neto global, expande el mejor y el peor día.
- Filtrar por estado
voided: identifica anulados y valida con gerentes que sean legítimos. - Filtrar por tipo “egreso”: revisa el top de egresos de la semana. Identifica categorías que crecen.
Rutina mensual
Sección titulada «Rutina mensual»- Día 1 del mes: rango mes anterior. Compara el neto global contra el mes previo mentalmente o con la vista de Reportes.
- Filtra por origen: separa “pedido digital” de “venta directa” para ver mezcla de canal.
- Pagina hasta el final para asegurarte de que ningún movimiento quedó sin revisar en categoría alta.
Errores comunes y soluciones
Sección titulada «Errores comunes y soluciones»| Error | Causa probable | Solució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. |
Preguntas frecuentes
Sección titulada «Preguntas frecuentes»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.