Para qué sirve y para quién
Facturación convierte cada venta cobrada en un documento fiscal numerado y lo guarda para siempre: el tique (factura simplificada, F2) de cada cobro, la factura completa (F1) cuando el cliente da su NIF, la factura completa que sustituye a un tique (F3) que ya se llevó el cliente, y la rectificativa (R1–R5) cuando se devuelve dinero, se anula una venta o un documento estaba mal. Es el eslabón entre Ventas y VeriFactu en la cadena fiscal española (venta → factura → registro VeriFactu → AEAT): aquí nace el número de serie que luego viaja a Hacienda. Sirve igual al restaurante y a la peluquería: no hay nada propio de un vertical.
Quién la usa:
- El empleado consulta las facturas, las imprime, emite una factura a mano, pasa un tique a factura completa y marca pagada una factura.
- El responsable, además, rectifica y lleva las series de numeración.
- El propietario y el administrador, además, configuran el emisor (la identidad fiscal del negocio que sale en cada factura).
- El sistema, sin nadie delante, factura cada cobro y rectifica cada devolución y cada anulación.
No cobra ni devuelve dinero (eso es Ventas), no envía nada a la AEAT ni calcula la huella (eso es VeriFactu) y no guarda la forma de pago.
Referencia adoptada
Aquí manda la especificación oficial sobre el mercado:
- RD 1619/2012 (Reglamento de facturación): factura completa (art. 6: número y serie, fecha de expedición y de operación si es distinta, nombre, NIF y domicilio de emisor y destinatario, descripción, base, tipo y cuota por tipo), simplificada (art. 7), sustitución del tique por factura completa, y rectificativa con su serie propia, la referencia a la factura que corrige y la corrección hecha (art. 15). Series correlativas, una aparte para las rectificativas, como recuerda la AEAT.
- SIF / VERI*FACTU
(RD 1007/2023, Orden HAC/1177/2024): tipos F1, F2, F3 y R1–R5, rectificativa por diferencias
(
TipoRectificativa«I») con importes negativos, inmutabilidad del documento emitido. - Numeración, contrastada con Odoo, Business Central, NetSuite, Sage 50, Holded, Lightspeed, Toast, Shopify, WooCommerce y Square: el número se asigna en la misma operación que guarda el documento, una serie por código y año que vuelve a 1 cada 1 de enero, plantilla de formato que se congela con el primer número, vista previa del siguiente número sin gastarlo, y la prueba de que no hay huecos.
- El tipo de rectificativa como en el
l10n_es_edi_verifactude Odoo: R5 para un tique, R1 («error fundado en derecho y art. 80 Uno, Dos y Seis LIVA», la devolución) por defecto en una factura completa, y R2–R4 a elegir al rectificar a mano. - El número fiscal se gasta al cobrar, nunca al abrir la cuenta: la cuenta abierta y la precuenta no llevan número de serie.
Antes de empezar
- Al activar Facturación se activan con ella Ventas, Impuestos y Clientes (las requiere). VeriFactu no se activa sola, pero en España hace falta para que cada factura llegue a la AEAT.
- El emisor (razón social, NIF y domicilio del negocio) es obligatorio: sin él no se emite ningún documento (Facturación → Emisor, INVOICE-F21). Hoy la identidad fiscal del negocio vive en la cuenta de ERPlora (el SaaS); cuando el SaaS la mande en la foto del hub, el emisor se rellenará solo (INVOICE-F22) y la pantalla dirá que viene de la cuenta.
- «Hoy» es la hora de Madrid en la fase 1 (el Hub todavía no guarda la zona horaria del negocio): decide la fecha de cada documento y, con ella, el año de su serie. Un cobro a las 00:30 del 1 de enero numera en la serie del año nuevo.
- Las series se crean solas la primera vez que se usan en el año: «TICKET» (tiques, F2), «FACT»
(facturas completas y sustitutivas, F1 y F3) y «RECT» (rectificativas, R1–R5), con el código como
prefijo (
TICKET-2026-000001). La de un año nuevo hereda el nombre, el prefijo y el formato de la del año anterior con el mismo código. La venta numera siempre en esas tres; una serie con otro código sirve para las facturas hechas a mano (INVOICE-F12).
Configuración inicial, paso a paso:
- En Facturación → Emisor, escribe la razón social, el NIF y el domicilio del negocio y guarda.
- Si quieres otro prefijo, otro formato o continuar la numeración de otro sistema, crea antes de la
primera venta del año las series
TICKET(Ticket F2),FACT(Factura F1) yRECT(Rectificativa R1) del año en curso con su «Siguiente número» (INVOICE-F12). Comprueba el «Siguiente número» al editarlas (INVOICE-F13). - Haz una venta de prueba y comprueba en Facturación → Facturas que aparece su tique con el número esperado (INVOICE-F01, INVOICE-F16).
Pantallas
Facturas
Menú Facturación → Facturas. Tabla paginada de 50 en 50 (vista de tabla o de tarjetas; en el móvil, tarjetas con el número como título) con «Número», «Cliente», «Total», «Estado», «Fecha» y «Tipo»; cada columna se ordena. Buscador «Buscar facturas…» (número, nombre o NIF del cliente) y filtros de «Estado», «Tipo», «Serie», «Origen», «Fecha» (entre dos días) y «Total» (entre dos importes). Sin ordenar, lo último emitido sale arriba. Por fila: «Ver» (también al pulsar la fila), «Marcar pagada» (solo en las que están «Emitida» y no son rectificativas) y «Rectificar» (solo en las que no son rectificativas, no están canceladas ni sustituidas). El botón + abre «Nueva factura manual» (INVOICE-F03); sin permiso de emitir no aparece, ni tampoco «Marcar pagada». La lista se pone al día sola cuando se emite, se rectifica o se paga una factura en cualquier dispositivo. Vacía: «Aún no hay facturas.». Cargando: «Cargando…». Error: el mensaje con «Reintentar». Un rechazo de una acción de fila sale como aviso encima de la tabla.
Ficha de factura
Se abre desde una fila de Facturas (/invoice/invoices/<id>). Arriba, «Factura {número}» con la
etiqueta de estado y los botones «Imprimir / PDF» y «← Volver». Si es una factura completa o una
rectificativa de una factura completa sin NIF del cliente, el aviso «Esta factura no tiene el NIF del
cliente: la impresora de tiques no puede sacarla como factura completa.». Debajo, «Tipo», «Serie»,
«Fecha de emisión», «Fecha de operación» (si es otra), «Cliente», «NIF cliente», «Dirección», «Emisor»,
«Origen» («Venta del TPV», «Alta manual», «Sustituye a una factura simplificada», «Rectificación»,
«Devolución de la venta», «Anulación de la venta»), «Venta» (su número), «Rectifica a» (el número de la
original, que la abre), «Sustituye a» / «Sustituida por» (enlaces), «Rectificativas» (las que la
corrigen), «Pagada el» y «Notas». Las líneas: «#», «Descripción», «Cant.», «Precio», «IVA %», «Base»,
«Impuesto», «Total» (en el móvil, cada línea en bloque); sin líneas, «Sin líneas de detalle.». El
desglose por tipo («IVA 21 %», «Recargo de equivalencia 5,2 %», «Exento (E1)», «No sujeto»,
«Inversión del sujeto pasivo») con su base y su cuota, y los totales «Base», «Impuestos» y «Total». Los
botones «Marcar pagada», «Rectificar» y «Factura completa» (solo en un tique que no se ha sustituido)
con la misma regla que en la fila. Un rechazo sale justo encima de esos botones.
Error al abrir: «Factura no encontrada» o el mensaje del fallo, con «← Volver».
Rectificar
Ventana que abre «Rectificar», desde la fila o desde la ficha. Título «Rectificar {número}», la nota «Se emitirá una rectificativa (serie RECT) con los importes negados y la factura original quedará cancelada. Esta operación no se puede deshacer.», el «Tipo de rectificativa» (R1 a R4; en un tique, siempre R5, sin elegir), el campo «Motivo» (obligatorio), «Emitir rectificativa» («Rectificando…» mientras va) y «Cancelar». Tres finales dentro de la misma ventana: el rechazo traducido, el documento que no se puede rectificar («Una rectificativa no se puede rectificar.», «La factura ya está cancelada.») y el resultado «Rectificativa {número} emitida. {original} queda cancelada.», cada uno con «Cerrar».
Factura completa (sustituir un tique)
Ventana que abre «Factura completa» en la ficha de un tique. Título «Factura completa del tique {número}», el buscador de clientes de Clientes (rellena los datos) y «Nombre o razón social», «País», «Tipo de documento» (solo fuera de España), «NIF» y «Domicilio», todos obligatorios salvo el tipo. «Emitir factura completa» y «Cancelar». Al emitir, la ventana se cierra y la ficha abre la F3 nueva.
Nueva factura manual
Ventana con la «Serie» (las activas del año que emiten F1 o F2; de entrada, la predeterminada o FACT), el buscador de clientes de Clientes, «Cliente», «NIF cliente», «Dirección», «País», «Notas» y las líneas: «Descripción», «Cant.» (1 de entrada; admite decimales), «Precio» (sin IVA, en euros) e «IVA %» (21 de entrada). «+ Línea» añade otra y la cruz la quita. «Emitir factura» («Emitiendo…» mientras va) está en gris hasta que cada línea tiene descripción, cantidad y precio. Un rechazo sale encima de los botones, por campo cuando es de un campo.
Series
Menú Facturación → Series (solo con permiso de llevar las series). La entrada «Cada serie define
el prefijo, el formato y el contador de la numeración por año y tipo de factura…» y una tabla con
«Código», «Nombre», «Tipo», «Año», «Prefijo», «Formato» (vacío se lee PREFIX-YYYY-NNNNNN), «Nº
actual», «Activa» y «Predet.»; buscador «Buscar código, nombre…». Por debajo de 1280 px abre en
tarjetas. + abre «Nueva serie de numeración»; «Editar» (o pulsar la fila) abre «Editar serie
{código}» (INVOICE-F12, INVOICE-F13).
Vacía: «Aún no hay series. Crea la primera para numerar tus facturas.». Cargando: «Cargando series…».
Error: «No se pudieron cargar las series» con «Reintentar».
Emisor
Menú Facturación → Emisor. «Razón social», «NIF», «Domicilio», «Código postal», «Ciudad», «Provincia» y «País», y «Guardar». Arriba, si aún no está completo, «Sin el emisor no se puede emitir ninguna factura.»; si lo mandó la cuenta de ERPlora, «Datos recibidos de tu cuenta de ERPlora el {fecha}.». Solo lo cambian el propietario y el administrador; el resto lo ve sin poder editar.
Estados de cada pantalla
| Estado | Qué ve la persona |
|---|---|
| Cargando | «Cargando…» (o «Cargando series…») mientras llega el primer resultado. |
| Vacío | «Aún no hay facturas.» / «Aún no hay series…» (o «Sin resultados» con búsqueda o filtro), con + si puede crear. |
| Error | El aviso de la tabla con «Reintentar»; un rechazo de una ventana sale dentro de ella, junto a su campo si es de un campo. |
| Reconectando | Lo pintado se queda; una franja avisa «Reconectando…». |
App inactiva (app_inactive) |
«Esta app no está activa en este negocio». |
| Sin permiso | No aparece lo que no puede hacer; si llega por otra puerta, «No tienes permiso». |
Flujos
| ID | Flujo | Estado |
|---|---|---|
| INVOICE-F01 | El tique (factura simplificada) que nace al cobrar | hecho — Ventas lo emite al cobrar, dentro de la transacción del cobro (sale.sale.complete → invoice.invoice.create_from_sale; en curso en Ventas); la reacción del outbox (events.REACTIONS) queda de respaldo (fase 2) |
| INVOICE-F02 | La factura completa al cobrar a un cliente con NIF | hecho — Ventas lo emite al cobrar, dentro de la transacción del cobro (sale.sale.complete → invoice.invoice.create_from_sale; en curso en Ventas); la reacción del outbox (events.REACTIONS) queda de respaldo (fase 2) |
| INVOICE-F03 | Emitir una factura a mano | hecho |
| INVOICE-F04 | El cliente pide la factura completa de su tique | servidor hecho; falta la página pública de la plataforma (/p) |
| INVOICE-F05 | Pasar un tique a factura completa desde el mostrador | hecho |
| INVOICE-F06 | Una venta cobrada que no se ha podido facturar | hecho — Ventas cobra igualmente con el documento «pendiente» y la reacción del outbox lo emite en cuanto puede (reintentos: relay de la fase 2); por la API o el asistente, por el número de la venta |
| INVOICE-F07 | Anular una venta cobrada que ya tiene su tique | hecho — Ventas la pide al anular, dentro de la transacción de la anulación (sale.sale.void → invoice.invoice.rectify_from_void; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2) |
| INVOICE-F08 | Rectificar una factura a mano | hecho |
| INVOICE-F09 | La rectificativa al devolver una venta entera | hecho — Ventas la pide al devolver, dentro de la transacción de la devolución (sale.sale.refund → invoice.invoice.rectify_from_refund; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2) |
| INVOICE-F10 | La rectificativa por diferencias al devolver parte de una venta | hecho — Ventas la pide al devolver, dentro de la transacción de la devolución (sale.sale.refund → invoice.invoice.rectify_from_refund; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2) |
| INVOICE-F11 | Numerar cada documento en su serie y su año | hecho |
| INVOICE-F12 | Crear una serie de numeración | hecho |
| INVOICE-F13 | Cambiar una serie | hecho |
| INVOICE-F14 | Saber si la numeración del año está preparada | servidor hecho; la tarea de Inicio es de la plataforma |
| INVOICE-F15 | Comprobar que la numeración no tiene huecos | hecho |
| INVOICE-F16 | Buscar una factura | hecho |
| INVOICE-F17 | Ver una factura | hecho; el justificante VeriFactu llega con la app de VeriFactu |
| INVOICE-F18 | Imprimir o guardar en PDF una factura | hecho; la impresora de tiques llega con la app de Impresión |
| INVOICE-F19 | Marcar una factura como pagada | hecho |
| INVOICE-F20 | Dar a otras apps la factura de una venta | hecho |
| INVOICE-F21 | Configurar el emisor | hecho |
| INVOICE-F22 | Recibir el emisor de la cuenta de ERPlora | servidor hecho; la foto del SaaS todavía no lleva el emisor |
| INVOICE-F23 | Emitir las facturas de ERPlora (hub de plataforma) | hecho (servidor; sin pantalla); en la fase 1 no se da de alta donde factura un negocio real |
INVOICE-F01 El tique (factura simplificada) que nace al cobrar
Estado: hecho — Ventas lo emite al cobrar, dentro de la transacción del cobro (sale.sale.complete → invoice.invoice.create_from_sale; en curso en Ventas); la reacción del outbox (events.REACTIONS) queda de respaldo (fase 2)
Actor: sistema
Pantalla: ninguna
Pasos:
1. El cajero cobra una venta en Ventas como tique, que es lo habitual en barra y en el salón.
2. Al cobrar, Ventas pide a Facturación su factura simplificada (F2), dentro del mismo cobro: sale en la
serie «TICKET» del año, fechada el día del negocio, con la fecha de operación del cobro, las líneas de
la venta y el cliente si la venta tenía uno. La factura nace «Pagada» (el dinero ya está en la
caja), con la hora del cobro, y el tique de Ventas ya lleva su número.
3. La factura aparece en Facturación → Facturas como «Ticket», «Pagada», con «Origen» «Venta del
TPV».
4. Se comprueba abriéndola: las líneas y el «Total» son los del tique de Ventas, al céntimo.
Entra: la venta cobrada de Ventas (sale.sale.completed), leída de la propia venta: sus líneas con
base y cuota ya calculadas, si los precios llevaban el IVA dentro, la regla fiscal congelada de cada
línea y el tipo de documento; el emisor configurado.
Sale: la F2 con su número, la descripción de la operación («Venta {número de la venta}», en español, la
lengua de la AEAT), sus líneas (cada una con su precio unitario sin IVA y antes de descuentos, y el
descuento aparte, sin IVA) y el desglose por clave fiscal (impuesto, régimen, calificación,
tipo y recargo), cerrado una vez por clave: lo cobrado no cambia ni un céntimo, pero con el IVA
incluido la base y la cuota de cada tipo se recalculan sobre el total cobrado de ese tipo (base por
división, cuota por diferencia) y se reparten a las líneas, que siguen sumando lo cobrado. Avisa
invoice.invoice.issued: VeriFactu crea su registro y Ventas podrá poner el número en su tique.
Si falla: el mismo aviso repetido no crea otra factura ni gasta número (una factura por venta, también
con dos entregas a la vez): la reacción del outbox responde la que emitió el cobro. Si VeriFactu rechaza
su registro (no se podría declarar), no se emite el tique: el cobro queda con el documento «pendiente»,
el motivo a la vista y «Emitir ahora» en Ventas. Sin emisor
configurado, o si los importes no cuadran (una cuota que no corresponde a su tipo, una cuota en una
línea que no es sujeta), Facturación no escribe nada ni gasta número; Ventas cobra igualmente con el
documento «pendiente» y lo emite la reacción del outbox en cuanto se pueda (INVOICE-F06). Una venta que
ya no existe no se factura. El techo de la simplificada (3.000 €) lo vigila Ventas al cobrar.
Implicados: SALE-F01, SALE-F04, TAX-F18, TAX-F19
INVOICE-F02 La factura completa al cobrar a un cliente con NIF
Estado: hecho — Ventas lo emite al cobrar, dentro de la transacción del cobro (sale.sale.complete → invoice.invoice.create_from_sale; en curso en Ventas); la reacción del outbox (events.REACTIONS) queda de respaldo (fase 2)
Actor: sistema
Pantalla: ninguna
Pasos:
1. El cajero cobra en Ventas eligiendo «Factura», con el nombre, el NIF y la dirección del cliente
(Ventas no deja cobrar como factura sin los tres).
2. Al cobrar, Ventas pide la factura completa (F1), dentro del mismo cobro: sale en la serie «FACT» del
año, con el nombre, el NIF, la dirección, el país y el tipo de documento del cliente copiados del
cobro (o, si el cobro no los trae, de la ficha del cliente), y cada línea con su precio sin IVA y su
descuento aparte (RD 1619/2012, art. 6.1.f).
3. Aparece en Facturas como «Factura», «Pagada», «Venta del TPV», y la ficha enseña «NIF cliente» y
«Dirección».
Entra: la venta cobrada como factura (sale.sale.completed con tipo de documento factura) y los datos
fiscales del cliente que viajan en el aviso.
Sale: la F1 (avisa invoice.invoice.issued). Es una copia: editar después la ficha del cliente no la
cambia. Un cliente de fuera de España se declara por su país y su tipo de documento.
Si falla: como en INVOICE-F01. Sin nombre, NIF y dirección del cliente, «Una factura completa necesita
el nombre, el NIF y la dirección del cliente.» y no se emite nada. El destinatario se lee igual que en
cualquier otro documento: un NIF español que no valida, o un NIF extranjero
sin su tipo de documento, se rechaza bajo su campo (422) y no se emite nada. En un tique (F2) el
destinatario es opcional: si el NIF de la ficha o del cobro no valida, el tique sale igualmente con el
nombre y sin NIF (queda en el registro de la aplicación), para que nunca quede «pendiente» por eso.
Implicados: SALE-F04, CUSTOMER-F17
INVOICE-F03 Emitir una factura a mano
Estado: hecho
Actor: empleado, responsable, administrador
Pantalla: Facturas, Nueva factura manual
Pasos:
1. En Facturas, pulsa +: se abre «Nueva factura manual».
2. Elige la «Serie» (las activas del año que emiten facturas, F1, o tiques, F2, y siempre «FACT» y «TICKET»
aunque el año aún no las haya abierto; empieza en la predeterminada o en «FACT») y, si quieres, busca al
cliente en Clientes: rellena nombre, NIF, dirección y país. Escribe o corrige «Cliente», «NIF
cliente», «Dirección» y «Notas».
3. Rellena cada línea: «Descripción», «Cant.» (1 de entrada; hasta tres decimales), «Precio» sin IVA y
en euros, e «IVA %» (21 de entrada). «+ Línea» añade otra y la cruz la quita.
4. Pulsa «Emitir factura»; está en gris hasta que cada línea tiene descripción, cantidad y precio. La
ventana se cierra y la factura aparece en la lista con su número, «Emitida» y «Origen» «Alta manual».
Entra: lo que escribe la persona; el emisor configurado. Por la API o el asistente una línea puede
llevar además la categoría fiscal de Impuestos: entonces su tipo y su calificación son los de la regla
vigente hoy, no el «IVA %» escrito. El tipo escrito es del impuesto del territorio fiscal del negocio
(Impuestos → Ajustes, TAX-F11): en Canarias se declara como IGIC y en Ceuta y Melilla como IPSI.
Sale: la factura (F1 en una serie de facturas, F2 en una de tiques) con el IVA calculado encima del
precio, cerrado una vez por tipo y repartido entre las líneas por resto mayor (los conceptos suman el
total impreso), y como descripción de la operación sus conceptos («Curso de corte, Kit de tinte», hasta
500 caracteres); avisa invoice.invoice.issued.
Si falla: dentro de la ventana, encima de los botones: «Una factura completa necesita el nombre, el NIF
y la dirección del cliente.», «Ese NIF no es válido.» (bajo el campo), «Línea {n}: el precio no es un
importe…», una línea con precio que sale a 0,00, una serie inactiva, que no emite facturas o de otro
año («Esa serie numera otro año…»), un tique por encima del límite de Ventas («Por encima de 3.000,00 €
no se puede emitir un tique…», RD 1619/2012 art. 4), o la falta de emisor. No se emite nada ni se gasta
número, y lo escrito se conserva.
Implicados: TAX-F18, CUSTOMER-F17
INVOICE-F04 El cliente pide la factura completa de su tique
Estado: servidor hecho; falta la página pública de la plataforma (/p)
Actor: cliente
Pantalla: página pública de la plataforma (/p)
Pasos:
1. El tique que imprime Ventas lleva un código para pedir la factura.
2. El cliente lo abre en su móvil, sin iniciar sesión, y escribe sus datos fiscales.
3. Facturación emite la factura completa sustitutiva (F3), como en INVOICE-F05.
Entra: el tique (F2) y los datos que escribe el cliente.
Sale: la F3 (avisa invoice.invoice.issued).
Si falla: como en INVOICE-F05.
Pendiente: la página pública y el código del tique son de la plataforma (/p) y de Ventas; Facturación
ya ofrece la operación que la página llamará (invoice.invoice.substitute).
Implicados: SALE-F29
INVOICE-F05 Pasar un tique a factura completa desde el mostrador
Estado: hecho
Actor: empleado, responsable, administrador
Pantalla: Ficha de factura, Factura completa
Pasos:
1. El cliente vuelve con su tique y pide la factura a su nombre.
2. En Facturas, busca el tique (por su número) y ábrelo.
3. Pulsa «Factura completa», busca al cliente o escribe sus datos (nombre, país, NIF y domicilio) y
pulsa «Emitir factura completa».
4. Se abre la F3 nueva: «Factura», «Origen» «Sustituye a una factura simplificada» y «Sustituye a» con
el número del tique; el tique dice «Sustituida por» con el de la F3.
Entra: el tique (F2) que se sustituye y los datos fiscales del cliente.
Sale: la F3 en la serie «FACT» del año, con las líneas y los importes del tique copiados al céntimo
(misma operación) y la misma fecha de operación; el tique no se toca. Si el tique estaba pagado, la F3
nace pagada. Avisa invoice.invoice.issued. Desde entonces, rectificar o devolver esa venta rectifica
la F3, no el tique.
Si falla: sin nombre, NIF o domicilio, rechazo; un NIF español que no es válido, «Ese NIF no es
válido.»; un documento que no es un tique, «Solo un tique (factura simplificada) se puede sustituir por
una factura completa.». Si el tique ya tiene su F3, responde con ella sin emitir otra ni gastar número.
Implicados: INVOICE-F04
INVOICE-F06 Una venta cobrada que no se ha podido facturar
Estado: hecho — Ventas cobra igualmente con el documento «pendiente» y la reacción del outbox lo emite en cuanto puede (reintentos: relay de la fase 2); por la API o el asistente, por el número de la venta
Actor: sistema, administrador, asistente
Pantalla: ninguna
Pasos:
1. Una venta queda cobrada y Facturación no puede emitir su factura al cobrar: falta el emisor o los
importes no cuadran. Ventas cobra igualmente y deja su documento «pendiente».
2. La venta no se pierde: el aviso queda guardado en la cola de avisos del hub y se reintenta.
3. Quien arregla la causa (configura el emisor) ve salir la factura en el siguiente reintento. Por la
API o el asistente se puede pedir también la factura de una venta concreta, por su número.
Entra: el aviso de la venta cobrada, o el número de la venta.
Sale: lo de INVOICE-F01 o INVOICE-F02, fechado el día en que por fin se emite (la fecha de operación
sigue siendo la del cobro).
Si falla: una devolución o una anulación que llega antes que la factura de su venta no se pierde: se
reintenta hasta que la factura existe (INVOICE-F07, INVOICE-F09).
Pendiente: el reparto de avisos entre apps y sus reintentos son del relay del outbox (fase 2); hasta
entonces la reacción está declarada (events.REACTIONS) y se prueba entregando el aviso real.
Implicados: SALE-F01
INVOICE-F07 Anular una venta cobrada que ya tiene su tique
Estado: hecho — Ventas la pide al anular, dentro de la transacción de la anulación (sale.sale.void → invoice.invoice.rectify_from_void; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2)
Actor: sistema
Pantalla: ninguna
Pasos:
1. Alguien anula en Ventas una venta cobrada como tique, con su motivo (Ventas no deja anular una venta
cobrada como factura ni una con devoluciones).
2. Al anular, Ventas pide la rectificativa del tique entero, dentro de la anulación: R5 (rectificativa de simplificada) en la
serie «RECT» del año, en negativo, con el motivo de la anulación. Si el tique ya se había sustituido
por una F3, rectifica la F3 (R1).
3. El tique pasa a «Cancelada»; la rectificativa sale con «Origen» «Anulación de la venta».
Entra: la anulación de la venta (sale.sale.voided), resuelta desde la propia venta.
Sale: la rectificativa y la original cancelada (avisa invoice.invoice.issued y
invoice.invoice.rectified); VeriFactu la registra. El aviso repetido no emite otra.
Si falla: si la venta aún no tiene factura, se reintenta hasta que la tenga (INVOICE-F06).
Implicados: SALE-F30
INVOICE-F08 Rectificar una factura a mano
Estado: hecho
Actor: responsable, administrador, asistente
Pantalla: Rectificar
Pasos:
1. En Facturas (fila) o en la ficha, pulsa «Rectificar» en una factura que no sea rectificativa ni
esté cancelada o sustituida.
2. Elige el «Tipo de rectificativa» (R1 de entrada: error fundado en derecho y art. 80 Uno, Dos y Seis
LIVA; R2 concurso; R3 deudas incobrables; R4 resto; un tique siempre R5), escribe el «Motivo» y pulsa
«Emitir rectificativa» (un segundo clic no emite otra).
3. La ventana dice «Rectificativa {número} emitida. {original} queda cancelada.». Al cerrarla, la
original sale «Cancelada» y la lista tiene una «Rectificativa» nueva fechada hoy, con los importes y
las líneas de la original en negativo y la nota «Rectifica la factura {número}. Motivo: {motivo}».
Entra: la factura elegida, el tipo y el motivo. La fecha la pone el servidor: el día del negocio.
Sale: la rectificativa numerada en la serie «RECT» del año, con el emisor y el cliente de la original,
su desglose en negativo y sus líneas en negativo (la cantidad lleva el signo; el precio no); la
original pasa a «Cancelada» (avisa invoice.invoice.issued y invoice.invoice.rectified). No mueve
dinero ni caja. Si la original ya tenía rectificativas por diferencias (devoluciones parciales), esta
rectifica exactamente lo que queda, con una línea por clave fiscal a su propio tipo.
Si falla: dentro de la ventana, traducido. Una fecha que no es la de hoy (API o asistente): «Una
factura rectificativa lleva la fecha del día en que se emite…» y no se emite nada. Sobre una
rectificativa o una cancelada, la ventana solo dice por qué. Sobre un tique sustituido, «Este tique ya
se sustituyó por una factura completa: rectifica la factura completa.». Dos rectificaciones a la vez
de la misma factura: la segunda espera a la primera y se rechaza sin gastar número. Sin permiso no
aparece la acción.
Implicados: SALE-F31
INVOICE-F09 La rectificativa al devolver una venta entera
Estado: hecho — Ventas la pide al devolver, dentro de la transacción de la devolución (sale.sale.refund → invoice.invoice.rectify_from_refund; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2)
Actor: sistema
Pantalla: ninguna
Pasos:
1. Alguien devuelve en Ventas una venta cobrada entera, de una vez.
2. Al devolver, Ventas pide la rectificativa, dentro de la devolución: la factura de esa venta entera en
negativo, en la serie
«RECT» del año, fechada el día del negocio, con las líneas de la original en negativo y el motivo de
la devolución. R5 si la original es un tique; R1 si es una factura completa.
3. La original pasa a «Cancelada»; la rectificativa aparece en Facturas con «Origen» «Devolución de
la venta» y «Rectifica a» la original.
Entra: la devolución de Ventas (sale.sale.refunded), leída del propio documento de devolución: la
venta, el importe y si cierra la venta. La factura original se busca por la venta (su F3 si el tique se
sustituyó), nunca por lo que diga el aviso.
Sale: la rectificativa y la original cancelada (avisa invoice.invoice.issued y
invoice.invoice.rectified).
Si falla: la misma devolución dos veces es un solo documento, un solo número. Si la venta aún no tiene
factura, se reintenta hasta que la tenga (INVOICE-F06).
Implicados: SALE-F31
INVOICE-F10 La rectificativa por diferencias al devolver parte de una venta
Estado: hecho — Ventas la pide al devolver, dentro de la transacción de la devolución (sale.sale.refund → invoice.invoice.rectify_from_refund; en curso en Ventas); la reacción del outbox queda de respaldo (fase 2)
Actor: sistema
Pantalla: ninguna
Pasos:
1. Alguien devuelve en Ventas una parte de una venta cobrada.
2. Al devolver, Ventas pide una rectificativa por diferencias por el importe devuelto: en negativo, en
la serie «RECT» del año. Si volvieron artículos, el importe se reparte solo entre sus claves
fiscales (devolver el champú al 21 % no toca el menú al 10 %); si solo volvió dinero, entre todas las
claves en proporción. Lleva una línea por clave, a su propio tipo, con lo que volvió de esa clave
(«2 × Champú, 1 × Cera») o, sin artículos, el motivo. La original sigue «Pagada» o «Emitida».
3. Cada devolución siguiente emite la suya sobre lo que queda; la que cierra la venta se lleva
exactamente lo que queda, y entonces la original pasa a «Cancelada».
4. Con la venta devuelta entera, la original y sus rectificativas suman cero al céntimo, tipo a tipo.
Entra: la devolución de Ventas (sale.sale.refunded), como en INVOICE-F09.
Sale: una rectificativa por documento de devolución; la original se cancela solo cuando queda a cero.
Si falla: la misma devolución dos veces es un solo documento, y nunca se rectifica más de lo que queda
de la original.
Implicados: SALE-F31
INVOICE-F11 Numerar cada documento en su serie y su año
Estado: hecho
Actor: sistema
Pantalla: ninguna
Pasos:
1. Cada vez que se emite un documento (tique, factura, sustitutiva o rectificativa), Facturación toma
la serie de su código y del año del día del negocio; si no existe, la crea en ese momento con el
contador a 0, heredando nombre, prefijo y formato de la del año anterior con ese código (o, la
primera vez, con el código como prefijo).
2. Sube el contador de esa serie en uno y escribe el número con el formato de la serie (sin formato,
TICKET-2026-000001) en la misma operación que guarda el documento.
3. El 1 de enero, a la hora del negocio, el siguiente documento abre la serie del año nuevo y vuelve a 1
(o al «Siguiente número» que se le haya fijado).
Entra: el código de serie que toca (TICKET para los tiques, FACT para las facturas completas y las
sustitutivas, RECT para las rectificativas; en el alta manual, la serie elegida) y el día del negocio.
Sale: el número del documento. El número entra en la huella encadenada de VeriFactu.
Si falla: si la emisión se rechaza o falla, no se guarda nada y el contador no sube: no queda hueco.
Dos cobros a la vez en la misma serie esperan uno al otro y reciben números seguidos; dos documentos de
la misma serie no pueden llevar el mismo número («Ese número ya existe en la serie…»: pasa si una serie
de otro año usa un formato sin el año).
Implicados: ninguno
INVOICE-F12 Crear una serie de numeración
Estado: hecho
Actor: responsable, administrador
Pantalla: Series
Pasos:
1. En Facturación → Series, pulsa +: se abre «Nueva serie de numeración».
2. Escribe «Código» (mayúsculas, dígitos, guion o guion bajo), «Nombre», «Tipo de factura» (de F1 a R5),
«Año» (de entrada, el del negocio), «Prefijo» (vacío = el código), si quieres «Formato del número»
(marcadores {prefix}, {code}, {year}, {seq} y {seq:01d}…{seq:09d}; vacío es
PREFIX-YYYY-NNNNNN) y «Siguiente número» (1 de entrada; otro para continuar la numeración de otro
sistema). Elige «Activa» y «Serie predeterminada».
3. Pulsa «Crear serie». La ventana se cierra y la serie aparece con «Nº actual» uno menos que el
siguiente número.
Entra: lo que escribe la persona.
Sale: la serie; si se marcó predeterminada, la que lo era ese año deja de serlo. Para que la usen las
ventas y las devoluciones, el código tiene que ser TICKET, FACT o RECT; con otro código, sirve para el
alta manual (si su tipo es F1 o F2).
Si falla: un código vacío o con otra forma, un formato sin el año o sin marcador de secuencia, con un
salto de línea, o un prefijo o formato con tildes o símbolos como º o ª, salen bajo su campo (el número
es el NumSerieFactura de VeriFactu: solo ASCII imprimible); unos números que con la secuencia más
ancha pasarían de 60 caracteres, «Los números de esta serie no cabrían en 60 caracteres…» bajo el
prefijo o el formato; un código que ya existe ese año, «Ya hay una serie con ese código ese año.».
Implicados: ninguno
INVOICE-F13 Cambiar una serie
Estado: hecho Actor: responsable, administrador Pantalla: Series Pasos: 1. En Series, pulsa «Editar» en la fila (o la fila entera): se abre «Editar serie {código}». 2. Cambia «Nombre», «Activa», «Serie predeterminada» y, mientras la serie no haya emitido nada, «Prefijo», «Formato del número» y «Siguiente número». «Código», «Tipo de factura» y «Año» están bloqueados. 3. Mira «Siguiente número»: es exactamente el número que llevará el próximo documento, calculado por el servidor sin gastarlo. 4. Pulsa «Guardar»; la ventana se cierra y la tabla se pone al día. Entra: la serie elegida y los cambios. Sale: la serie cambiada; los números ya emitidos no cambian. Una serie inactiva deja de ofrecerse (y se rechaza) en el alta manual; las ventas siguen numerando en TICKET, FACT y RECT. Si falla: con la serie ya usada, prefijo, formato y siguiente número están bloqueados y lo dice «Esta serie ya ha emitido facturas, así que su prefijo, su formato y su siguiente número ya no se pueden cambiar: el número forma parte de la cadena de VeriFactu. Crea una serie nueva si necesitas otros.». Implicados: ninguno
INVOICE-F14 Saber si la numeración del año está preparada
Estado: servidor hecho; la tarea de Inicio es de la plataforma Actor: responsable, administrador, asistente Pantalla: ninguna (la tarea de Inicio llegará con la plataforma) Pasos: 1. Se pregunta (asistente, API o la futura tarea de Inicio) si la numeración del año está preparada. 2. La respuesta dice el año del negocio y cuántas series ordinarias (F1, F2, F3), de rectificativas (R1–R5) y predeterminadas tiene ese año, y si está preparada (al menos una ordinaria y una de rectificativas). Entra: las series del año del negocio. Sale: nada; solo se lee. Si falla: nada que fallar; un negocio recién creado responde que no está preparada. Pendiente: la tarea «Tu numeración de facturas» de Inicio es de la plataforma. Implicados: ninguno
INVOICE-F15 Comprobar que la numeración no tiene huecos
Estado: hecho Actor: empleado, responsable, administrador, asistente Pantalla: ninguna (asistente o API) Pasos: 1. Pide al asistente si la numeración tiene huecos, o el libro de números de una serie. 2. Sin huecos, la respuesta es que no falta ninguno; con huecos, dice la serie, el año, el último número que sí está y cuántos faltan seguidos. 3. El libro dice qué número se dio a qué documento y cuándo. Entra: los documentos emitidos. Sale: nada; solo se lee. Si falla: el libro es la propia factura (el número se asigna en la misma transacción que la guarda, así que un número sin documento no puede existir). El hueco que se ve es el de un «Siguiente número» que se saltó números, o uno que nunca se usó; antes del primer número de una serie no cuenta como hueco. Implicados: ninguno
INVOICE-F16 Buscar una factura
Estado: hecho Actor: empleado, responsable, administrador Pantalla: Facturas Pasos: 1. Abre Facturación → Facturas. 2. Escribe en «Buscar facturas…» un número, un nombre de cliente o un NIF; o filtra (estado, tipo, serie, origen, fecha, total); o pulsa una columna para ordenar. 3. La tabla enseña las que casan, de 50 en 50; lo último emitido, arriba. 4. Pulsa «Ver», o la fila, para abrirla (INVOICE-F17). Entra: las facturas del hub. Sale: nada; solo se lee. Si falla: sin resultados, «Sin resultados»; con un error, el mensaje y «Reintentar». Un total que no es un importe dice «Escribe un importe, como 12,50» bajo su campo, y una fecha final anterior a la inicial, «La fecha final no puede ser anterior a la inicial.»; ninguno de los dos filtra. Implicados: ninguno
INVOICE-F17 Ver una factura
Estado: hecho; el justificante VeriFactu llega con la app de VeriFactu Actor: empleado, responsable, administrador Pantalla: Ficha de factura Pasos: 1. En Facturas, abre la factura. 2. Lee la cabecera, las líneas (con su «Precio» sin IVA y antes de descuentos y, si alguna lo tiene, la columna «Dto.» con el descuento sin IVA), el desglose y los totales. 3. «Rectifica a», «Sustituye a», «Sustituida por» y las rectificativas abren el documento enlazado. 4. «← Volver» regresa a la lista. Entra: la factura y sus líneas. Sale: nada; solo se lee. La ficha se pone al día sola si mientras tanto se paga o se rectifica. Si falla: «Factura no encontrada» o el motivo del fallo. Pendiente: el «Justificante VeriFactu» (estado, CSV, QR «QR tributario:» / «VERI*FACTU») lo pintará la ficha cuando exista VeriFactu, con su propia consulta por factura. Implicados: ninguno
INVOICE-F18 Imprimir o guardar en PDF una factura
Estado: hecho; la impresora de tiques llega con la app de Impresión
Actor: empleado, responsable, administrador
Pantalla: Ficha de factura
Pasos:
1. En la ficha, pulsa «Imprimir / PDF».
2. Se abre el diálogo de impresión del navegador con la factura en A4 (emisor, «Facturar a», líneas,
desglose por tipo, totales y la nota de lo que rectifica), en el idioma de la pantalla, desde donde se
puede guardar como PDF. Un documento de una venta sale como «Copia» (el original fue el papel del
cobro); uno emitido desde Facturación, como original.
Entra: la factura y sus líneas.
Sale: el papel; la factura no cambia.
Si falla: «No se pudo imprimir la factura».
Pendiente: la impresora de tiques llega con la app de Impresión, que imprimirá el mismo documento
(invoice.invoice.document, la plantilla templates/invoice/invoice.html); el QR de VeriFactu llega
con VeriFactu.
Implicados: ninguno
INVOICE-F19 Marcar una factura como pagada
Estado: hecho
Actor: empleado, responsable, administrador
Pantalla: Facturas, Ficha de factura
Pasos:
1. En Facturas (fila) o en la ficha, pulsa «Marcar pagada» en una factura «Emitida».
2. Confirma en «¿Marcar {número} como pagada?» («El cobro se registra con la fecha y la hora de
ahora.») con «Marcar pagada», o vuelve con «Cancelar».
3. La factura pasa a «Pagada» y la ficha enseña «Pagada el» con la fecha y la hora.
Entra: la factura elegida.
Sale: el estado «Pagada» y la fecha de pago (avisa invoice.invoice.paid). Ningún importe cambia y la
caja no se toca.
Si falla: si mientras tanto alguien la pagó o la rectificó, «Esta factura no se puede marcar como
pagada: solo se puede con una factura emitida que aún no esté pagada. No se ha cambiado nada.». Las
facturas que nacen de una venta ya nacen pagadas y una rectificativa no se paga: no ofrecen la acción.
Implicados: ninguno
INVOICE-F20 Dar a otras apps la factura de una venta
Estado: hecho Actor: sistema Pantalla: ninguna Pasos: 1. Otra app pregunta qué factura nació de una venta. 2. Facturación contesta con el documento vigente de la venta (su F3 si el tique se sustituyó): número, tipo, serie, fecha, emisor, cliente, total y estado. Entra: la venta (su id o su número). Sale: los datos de la factura; solo se lee. Si falla: si la factura aún no existe, contesta que no hay. Implicados: SALE-F29
INVOICE-F21 Configurar el emisor
Estado: hecho
Actor: propietario, administrador
Pantalla: Emisor
Pasos:
1. Abre Facturación → Emisor.
2. Escribe «Razón social», «NIF», «Domicilio», «Código postal», «Ciudad», «Provincia» y elige el «País»
(España de entrada).
3. Pulsa «Guardar»: sale «Emisor guardado.».
Entra: lo que escribe la persona.
Sale: el emisor, que se copia en cada documento que se emita desde ahora (los ya emitidos no cambian);
avisa invoice.issuer.updated.
Si falla: sin razón social, NIF o domicilio, bajo su campo; un NIF español que no es válido, «Ese NIF no
es válido.».
Implicados: ninguno
INVOICE-F22 Recibir el emisor de la cuenta de ERPlora
Estado: servidor hecho; la foto del SaaS todavía no lleva el emisor
Actor: sistema
Pantalla: Emisor
Pasos:
1. Cuando la cuenta de ERPlora (el SaaS) manda la foto del hub con la identidad fiscal del negocio, la
plataforma se la entrega a Facturación con la versión de la foto.
2. Facturación guarda el emisor y la pantalla dice «Datos recibidos de tu cuenta de ERPlora el
{fecha}.».
Entra: el bloque issuer de la foto (legal_name, tax_id, address, postal_code, city,
province, country) y su version.
Sale: el emisor (avisa invoice.issuer.updated). Una foto más vieja que la guardada se ignora.
Si falla: un emisor incompleto o con un NIF no válido se rechaza y queda el anterior.
Pendiente: la foto del SaaS todavía no lleva la identidad fiscal; el contrato está escrito abajo.
Implicados: ninguno
INVOICE-F23 Emitir las facturas de ERPlora (hub de plataforma)
Estado: hecho (servidor; sin pantalla: nadie entra en el hub de plataforma)
Actor: sistema (la cuenta de ERPlora, el SaaS, por /internal/platform/invoices)
Pantalla: ninguna
Pasos:
1. Un cliente paga su suscripción en Stripe; el SaaS numera su factura (ERP-2026-00123, abonos en
ERPR) y la manda al hub de plataforma de ERPlora con POST /internal/platform/invoices, firmada.
2. Facturación la emite tal cual llega, con el número y la fecha del SaaS (ninguna serie del Hub cuenta
para ella), con ERPlora como emisor y el pagador de ese día como destinatario, y VeriFactu sella su
registro en la misma transacción. Contesta 201 {"status": "issued", "qr", "error": null}.
3. El SaaS pregunta después cómo va (GET …/{id}): issued mientras el registro va a la AEAT,
accepted, accepted_with_errors o rejected cuando contesta (con su código y su mensaje).
4. El PDF (GET …/{id}/pdf) es el mismo A4 de INVOICE-F18 en el idioma del pagador, con el QR de
VeriFactu («QR tributario:», «VERI*FACTU») solo cuando la AEAT ya lo aceptó, como el SaaS antiguo.
Entra: el cuerpo de platform_payload() del SaaS (id, kind, series, number, issued_on,
rectification, currency, language, céntimos, tax_treatment, tax_country, tax_rate,
recipient, lines, rectifies).
Sale: la factura con platform_ref = el id del SaaS (avisa invoice.invoice.issued; un abono, además,
invoice.invoice.rectified) y su registro de VeriFactu.
Si falla: la misma factura otra vez (o dos entregas a la vez) contesta lo que ya hay, sin escribir nada
(200); un abono de una factura que no llegó, 404 invoice.platform_original_unknown; más de 400 € sin
NIF, 409 invoice.platform_recipient_required; un cuerpo fuera de contrato, 422 con su código; un
rechazo de VeriFactu deshace la factura entera.
Implicados: VeriFactu (verifactu.record.create, verifactu.record.by_invoice, verifactu.record.get)
Servicios: lo que entra y lo que sale
Todo se puede pedir por las pantallas, el asistente (por voz o por texto, con la sesión de la propia
persona) y la API, con las mismas reglas y los mismos permisos. Pensado para la voz: una factura se
nombra por su número (FACT-2026-000012), una venta por su número del día (20261014-0003), un
cliente por su nombre, su teléfono o su correo (como en Clientes) y una serie por su código.
Lo que ofrece: consultas (leen, no cambian nada)
| Qué da | Quién puede | Flujos | Servicio |
|---|---|---|---|
| Las facturas, con búsqueda, filtros, orden y páginas (hasta 100) | ver | F16 | invoice.invoice.list |
| Una factura con sus líneas, desglose y enlaces, por su id o su número | ver | F17 | invoice.invoice.get |
| La factura vigente de una venta | ver | F20 | invoice.invoice.by_source |
| El documento imprimible (HTML A4) de una factura | ver | F18 | invoice.invoice.document |
| Las series, con búsqueda, filtros y páginas | ver | F12, F13 | invoice.series.list |
| El siguiente número de una serie, sin gastarlo | ver | F13 | invoice.series.peek_next |
| Si la numeración del año está preparada | ver | F14 | invoice.numbering.status |
| Los huecos de la numeración | ver | F15 | invoice.numbering.gaps |
| El libro de números entregados | ver | F15 | invoice.numbering.allocations |
| El emisor | ver | F21, F22 | invoice.issuer.get |
Cómo va una factura de ERPlora (por el id del SaaS) |
solo el sistema | F23 | invoice.invoice.platform_status |
| El A4 de una factura de ERPlora, en su idioma | solo el sistema | F23 | invoice.invoice.platform_document |
| Si el hub de plataforma puede emitir ahora | solo el sistema | F23 | invoice.invoice.platform_health |
Todas se pueden seguir en vivo.
Lo que ofrece: acciones (cambian datos)
| Qué hace | Quién puede | Flujos | Servicio |
|---|---|---|---|
| Emite una factura a mano | emitir | F03 | invoice.invoice.create |
| Emite la factura de una venta cobrada (también la reacción a su cobro) | emitir | F01, F02, F06 | invoice.invoice.create_from_sale |
| Sustituye un tique por una factura completa | emitir | F04, F05 | invoice.invoice.substitute |
| Marca pagada una factura emitida | emitir | F19 | invoice.invoice.mark_paid |
| Rectifica una factura | rectificar | F08 | invoice.invoice.rectify |
| Emite la rectificativa de una devolución (también la reacción a ella) | rectificar | F09, F10 | invoice.invoice.rectify_from_refund |
| Emite la rectificativa de una venta anulada (también la reacción a ella) | rectificar | F07 | invoice.invoice.rectify_from_void |
| Crea una serie | llevar las series | F12 | invoice.series.create |
| Cambia una serie | llevar las series | F13 | invoice.series.update |
| Guarda el emisor | configurar el emisor | F21 | invoice.issuer.update |
| Guarda el emisor que manda la cuenta de ERPlora | solo el sistema | F22 | invoice.issuer.sync |
| Emite una factura de ERPlora con su registro de VeriFactu | solo el sistema | F23 | invoice.invoice.issue_platform |
Lo que avisa
| Aviso | Cuándo | Qué lleva | Servicio |
|---|---|---|---|
| Documento emitido | Toda F1, F2, F3 y R1–R5 nueva | invoice_id, number, series, invoice_type, total, source_type, sale_id, source ({type, sale_id, refund_id, void}: de qué cobro, devolución o anulación de Ventas sale), rectifies_id, substitutes_id |
invoice.invoice.issued |
| Factura rectificada | Una rectificativa corrige una factura | invoice_id (la original), number, status, rectification_id, rectification_number, remaining |
invoice.invoice.rectified |
| Factura pagada | Marcar pagada | invoice_id, number, paid_at |
invoice.invoice.paid |
| Serie nueva | Crear una serie | id, code, year |
invoice.series.created |
| Serie cambiada | Cambiar una serie | id, code, year, fields |
invoice.series.updated |
| Emisor cambiado | Guardar o recibir el emisor | source |
invoice.issuer.updated |
Contrato del origen con Ventas: source.type es el source_type del documento (sale, manual,
substitution, rectification, refund, void); source.sale_id la venta de la que sale (también en
su F3 y en sus rectificativas), source.refund_id la devolución de una rectificativa por devolución y
source.void es true en la de una anulación. Así sale.sale.record_invoice enlaza con su cobro, su
devolución o su anulación un documento que quedó «pendiente» y emitió después la reacción del outbox.
Qué refresca cada aviso: la lista, la ficha, la factura de una venta y el documento, con «emitido», «rectificada» y «pagada»; las series, el siguiente número, el estado de la numeración, los huecos y el libro, con «emitido» y los de series; el emisor, con «emisor cambiado».
A qué reacciona
| Aviso | De | Qué hace | Servicio |
|---|---|---|---|
Venta cobrada (sale.sale.completed) |
Ventas | Emite su F2 o su F1 (F01, F02) | invoice.invoice.create_from_sale |
Venta devuelta (sale.sale.refunded) |
Ventas | Emite la rectificativa de la devolución (F09, F10) | invoice.invoice.rectify_from_refund |
Venta anulada (sale.sale.voided) |
Ventas | Emite la rectificativa del tique entero (F07) | invoice.invoice.rectify_from_void |
Cada reacción corre como el sistema, en su propia transacción, y es idempotente: una por venta, una por devolución y una por anulación.
Lo que necesita de otras apps
- Ventas (requisito): la venta, sus líneas, sus devoluciones y su anulación, leídas de sus filas.
- Impuestos (requisito): la regla congelada en cada línea de la venta (impuesto, régimen,
calificación, tipo y recargo) y, en el alta manual por categoría, la regla vigente hoy
(
resolve_tax, en el territorio fiscal del negocio); el impuesto de un territorio (tax_kind_of,business_tax_kind) para lo que no tiene regla: la línea con tipo tecleado (el territorio del negocio) y la de una venta cuya regla ya no existe (el territorio que la línea congeló al cobrarse); el redondeo a mitad hacia arriba (round_half_up). - Clientes (requisito): la ficha del cliente (nombre o empresa, NIF, domicilio y país) que rellena los datos fiscales en el alta manual, en la sustitución y en la F1 de una venta que no los trae.
Quién la usa
| App | Para qué | Servicio |
|---|---|---|
| VeriFactu | Registrar cada documento emitido y encadenar su huella | invoice.invoice.issued + la factura (requiere invoice) |
| Ventas | Poner el número de la factura en el tique | invoice.invoice.by_source |
| Impresión | Imprimir el documento | invoice.invoice.document |
Quién puede qué
| Permiso | Propietario | Administrador | Responsable | Empleado | Servicio |
|---|---|---|---|---|---|
| Ver facturas, series, numeración y emisor; imprimir | sí | sí | sí | sí | invoice.view_invoice |
| Emitir a mano, facturar una venta, sustituir un tique, marcar pagada | sí | sí | sí | sí | invoice.add_invoice |
| Rectificar (a mano, por devolución y por anulación) | sí | sí | sí | no | invoice.rectify_invoice |
| Crear y cambiar series | sí | sí | sí | no | invoice.manage_series |
| Configurar el emisor | sí | sí | no | no | invoice.manage_issuer |
Los papeles llegan del SaaS con prefijo (hub_owner, hub_admin, hub_manager, hub_employee).
Recibir el emisor del SaaS (invoice.sync_issuer) no es de ningún papel: solo del sistema.