Saltar al contenido

Cumplimiento fiscal

El CFDI global de VendeWare se arma a mano, sin comparar nunca contra una venta real

Por Eduardo Gallegos · Publicado el 21 de septiembre de 2026

Cajero de un comercio capturando a mano los renglones del CFDI global de fin de día.

Ya documentamos, en merma deducida sin aviso de destrucción al SAT, un hallazgo sobre cómo VendeWare registra la salida de mercancía. Este es distinto: no es sobre inventario, es sobre el otro extremo del mostrador — la factura que ampara lo que el cliente ya pagó. Cuando el cliente no pide factura individual, la ley permite agrupar esas ventas en un CFDI global. Verificamos en el código de VendeWare que ese comprobante se arma con renglones de texto libre que nadie compara contra lo que de verdad se vendió: el sistema no tiene ninguna forma de saber si una venta cobrada terminó, o no, con algún comprobante fiscal.

La ley no exime de comprobar el 100% de las ventas — sólo permite agruparlas

El Código Fiscal de la Federación (CFF, texto vigente publicado por la Cámara de Diputados, última reforma DOF 09-04-2026) es categórico en su artículo 29: todo ingreso percibido debe ampararse con un comprobante fiscal.

"ARTÍCULO 29. Cuando las leyes fiscales establezcan la obligación de expedir comprobantes fiscales por los actos o actividades que realicen, por los ingresos que se perciban o por las retenciones de contribuciones que efectúen, los contribuyentes deberán emitirlos mediante documentos digitales a través de la página de Internet del Servicio de Administración Tributaria."

Cuando el cliente de un comercio no pide factura, la Resolución Miscelánea Fiscal 2026 (RMF, Diario Oficial de la Federación, 28 de diciembre de 2025) no exime esa venta de tener comprobante: permite agruparla con las demás del período en un solo CFDI. La regla 2.7.1.21 lo describe así:

"Los contribuyentes podrán elaborar un CFDI diario, semanal o mensual donde consten los importes correspondientes a cada una de las operaciones realizadas con el público en general del periodo [...] a más tardar dentro de las 24 horas siguientes al cierre de las operaciones realizadas de manera diaria, semanal, mensual o bimestral."

La propia regla exige que ese CFDI global incluya el folio o número de operación de cada comprobante simplificado (ticket de venta) que agrupa — no es una cifra global suelta, es la suma verificable de operaciones reales, cada una identificable. Agrupar no es lo mismo que aproximar: la ley sigue exigiendo que el CFDI, individual o global, ampare el 100% de lo vendido.

Agenda una demo gratis

La sanción: el propio artículo 83 nombra este caso

El artículo 83, fracción VII, del CFF no deja espacio para la duda: nombra explícitamente el caso de una venta con público en general sin su comprobante.

"VII. No expedir, no entregar o no poner a disposición de los clientes los comprobantes fiscales digitales por Internet de sus actividades cuando las disposiciones fiscales lo establezcan, o expedirlos sin que cumplan los requisitos señalados en este Código, en su Reglamento o en las reglas de carácter general que al efecto emita el Servicio de Administración Tributaria [...] así como no expedir los comprobantes fiscales digitales por Internet que amparen las operaciones realizadas con el público en general, o bien, no ponerlos a disposición de las autoridades fiscales cuando éstas los requieran."

El artículo 84, fracción IV, fija la multa para el supuesto general de esta infracción:

"a) De $22,300.00 a $127,530.00. En caso de reincidencia, las autoridades fiscales podrán, adicionalmente, clausurar preventivamente el establecimiento del contribuyente por un plazo de tres a quince días [...]"

Monto vigente por resolución miscelánea fiscal, DOF 28-12-2025. Si la venta sin comprobante se descubre por otra vía —por ejemplo, un depósito bancario que no corresponde a ningún registro contable—, el artículo 59, fracción III, del mismo CFF agrava el caso: presume ese depósito como ingreso omitido, con la carga de la prueba sobre el contribuyente.

"III. Que los depósitos en la cuenta o cuenta bancaria abierta a nombre del contribuyente que no correspondan a registros de su contabilidad que esté obligado a llevar, son ingresos y valor de actos o actividades por los que se deben pagar contribuciones."

ElementoQué dice la norma
Todo ingreso percibido debe ampararse con comprobante fiscalArt. 29, CFF
El CFDI global agrupa ventas al público en general, con folio de cada operación, en máximo 24 hRegla 2.7.1.21, RMF 2026 (DOF 28-12-2025)
Infracción por no expedir el comprobante de operaciones con público en generalArt. 83, fracción VII, CFF
Multa del supuesto generalArt. 84, fr. IV, inciso a): $22,300.00 a $127,530.00, con posible clausura preventiva en reincidencia
Agravante si se descubre por depósito no registrado en contabilidadArt. 59, fracción III, CFF: presunción de ingreso omitido

Verificado en el código: el renglón del CFDI global es texto libre, sin dueño

Confirmamos el hallazgo directamente en el código de VendeWare (repo medware-di). Cada renglón del CFDI global se valida con el esquema globalInvoiceLineInputSchema, y su referencia a la venta de origen es sourceRef: z.string().min(1).max(120) (packages/shared-schemas/src/factura-global.schema.ts:11) — una cadena de texto de hasta 120 caracteres, sin ningún tipo que la ate a un ticket, orden o venta real. El método que crea el CFDI global, create() (apps/services/facturacion/src/global/global.service.ts:159-181), arma la factura únicamente con lo que venga en input.lines: en ningún punto consulta al punto de venta ni al módulo de ventas para saber qué se vendió de verdad en el período. Y el repositorio que guarda cada renglón, insertLine() (apps/services/facturacion/src/global/global.repository.ts:144-155), hace un INSERT plano, sin índice único ni restricción sobre source_ref: nada impide capturar el mismo ticket dos veces —doble conteo— ni detecta que falte uno.

Del otro lado del mostrador, el punto de venta y las ventas tampoco saben que la facturación existe: una búsqueda exhaustiva de "invoice", "cfdi" y "factur" en apps/services/pos/src y apps/services/sales/src da cero resultados de lógica real, sólo un comentario. Ese comentario, de hecho, confirma que la desconexión es intencional: apps/services/pos/src/pos/promotions.gateway.ts:17 explica que sales y facturacion se desacoplaron a propósito, tras un incidente en producción, para que un problema de facturación nunca bloquee una venta. Es una decisión de resiliencia razonable —cobrar no debe depender de facturar—, pero confirma que hoy no existe ningún enganche automático entre lo que se vendió y lo que se facturó.

Y el hueco no es por falta de un patrón dentro del propio repositorio: el módulo de comisiones de vendedores, a unas carpetas de distancia, sí resuelve exactamente este problema. insertAccrual() (apps/services/sales/src/commissions/commissions.repository.ts:266-289) usa un INSERT ... ON CONFLICT DO NOTHING contra un índice único parcial sobre (tenant, seller, periodo, source_ref), documentado en el propio código como un endurecimiento posterior a una auditoría ("BARRIDA-037") que encontró una condición de carrera capaz de duplicar el pago de comisiones. VendeWare ya sabe cómo evitar que un sourceRef se cuente dos veces —lo hizo para no pagarle de más a un vendedor—; ese mismo patrón nunca se aplicó al renglón que determina si una venta quedó, o no, con comprobante fiscal. Y el único módulo de conciliación real del sistema, apps/services/finance/src/reconciliation, concilia depósitos bancarios contra el estado de cuenta, no ventas contra CFDI: no cubre este hueco.

Agenda una demo gratis

Qué significa en la práctica, y qué falta en el producto

Con el diseño actual, quien arma el CFDI global de fin de día escribe cada renglón a mano, sin ninguna lista real de lo que el punto de venta cobró ese período. Si olvida un ticket, esa venta queda —indefinidamente, sin que nada lo detecte— sin ningún comprobante fiscal, individual o global: exactamente el supuesto que nombra el artículo 83, fracción VII. Si captura el mismo ticket dos veces, el CFDI global reporta más ingreso del que realmente hubo, un error en la dirección contraria pero igual de invisible para el sistema. Lo que falta es una conexión, no una funcionalidad nueva: que create() valide cada sourceRef contra una venta real del punto de venta —el mismo tipo de índice único que commissions.repository.ts ya usa para no duplicar una comisión— y que el módulo de ventas exponga, al cierre del período, la lista de lo que sí se cobró y todavía no tiene comprobante. Puedes ver ese recorrido completo, del ticket al CFDI global, en de la venta al CFDI global: el flujo completo en VendeWare, o estimar la exposición con tus propios números en la calculadora de exposición por ventas sin comprobante fiscal.

Preguntas frecuentes

¿El CFDI global exime a un comercio de comprobar todas sus ventas?
No. La regla 2.7.1.21 de la RMF 2026 sólo permite agrupar las ventas al público en general en un solo comprobante periódico; sigue exigiendo que ese comprobante ampare, con el folio de cada operación, el 100% de lo vendido en el período.

¿VendeWare compara el CFDI global contra las ventas reales del punto de venta?
No hoy. El renglón que identifica la venta de origen (sourceRef) es un campo de texto libre de hasta 120 caracteres, sin ninguna validación contra el módulo de ventas o de punto de venta.

¿Esto significa que hay un error de facturación en todos los comercios que usan VendeWare?
No necesariamente: el gap es que el sistema no lo impide ni lo detecta, no que ya haya ocurrido en tu comercio. Si tu equipo captura cada renglón con disciplina, no tienes el problema hoy —pero tampoco tienes ninguna alerta si algún día deja de hacerlo.

¿Cuál es la multa exacta?
El CFF no fija un monto único: de $22,300.00 a $127,530.00 por el supuesto general del artículo 84, fracción IV, inciso a), con posible clausura preventiva de tres a quince días en reincidencia. Si la venta sin comprobante se descubre por un depósito bancario no registrado en tu contabilidad, el artículo 59, fracción III, agrega la presunción de ingreso omitido sobre ese monto. El importe concreto dentro del rango lo determina la autoridad fiscal caso por caso.

Fuentes consultadas: Código Fiscal de la Federación, texto vigente publicado por la Cámara de Diputados del H. Congreso de la Unión, última reforma DOF 09-04-2026, artículos 29, 59, 83 y 84. Resolución Miscelánea Fiscal para 2026 y sus Anexos, Diario Oficial de la Federación, 28 de diciembre de 2025, regla 2.7.1.21. Montos de la multa del art. 84, fracción IV, actualizados por la misma resolución. Este artículo es orientativo y no sustituye una revisión de tu caso por tu contador o asesor fiscal.

Ve cómo VendeWare arma hoy el CFDI global, y dónde falta la conexión

Te mostramos en vivo el punto de venta, el cierre de caja y el CFDI global que agrupa esas ventas — y el paso exacto donde nadie los compara.

Agenda una demo gratis
Agendar 30 min
Contacta a un especialista
Ventas y Proyectos (abre en una ventana nueva) Soporte Técnico (abre en una ventana nueva)