Para qué sirve y para quién
Impresión es donde el negocio da de alta sus impresoras, dice qué sale por cada una y ve si el papel está saliendo. Cada impresora tiene un nombre («Caja», «Cocina»), su conexión (red, USB, Bluetooth o la impresora del sistema), su ancho de papel (58 u 80 mm) y su función: tiques, cocina, barra o etiquetas. Las demás apps (Ventas al cobrar, Caja al cerrar el turno, Inventario para las etiquetas) piden sus impresiones a Impresión, que las pone en la cola de impresión del negocio; el dispositivo con la app de ERPlora instalada junto a la impresora las saca en papel y confirma. Si algo no sale, la cola lo dice y deja reintentarlo o cancelarlo.
Quién la usa:
- El propietario y el administrador: todo; además reintentan y cancelan trabajos atascados.
- El responsable: da de alta y cambia impresoras y ajustes, y pide impresiones.
- El empleado: ve impresoras, ajustes y cola, y pide impresiones (una prueba, un tique).
Sirve igual a la peluquería y al restaurante: los dos imprimen el tique y las etiquetas; la comanda de cocina y barra es solo del restaurante.
Impresión no compone lo que se imprime (el tique es de Ventas, la factura de Facturación, el informe del turno de Caja, la etiqueta de Inventario) y no habla con la impresora: lo hace la app del dispositivo. Un navegador no llega a las impresoras.
Referencia adoptada
ERPlora no inventa flujos: adopta los que el mercado ya probó.
- Square — impresoras de recibos, pedidos y etiquetas: cada impresora se da de alta en el punto de venta con su nombre, su conexión y lo que imprime (recibos, tiques de cocina, etiquetas); una prueba de impresión por impresora.
- Toast — impresión y estaciones de cocina: cada documento sale por la impresora de su estación; la comanda no se desvía a la de tiques.
- Toast — modo sin conexión y Square — modo sin conexión: un trabajo que no puede salir espera y se avisa; recuperarlo no lo duplica.
- Epson TM y Star (manuales de las térmicas de 58 y 80 mm): el ancho del papel es de cada impresora, no del negocio.
- Lightspeed y Odoo TPV: la cola de impresión con reintento y el «abrir cajón al cobrar» por la impresora de tiques.
- AEAT — SIF y VERI*FACTU: el tique lleva el QR de cotejo y la reimpresión es copia («DUPLICADO»); la cuenta de la mesa no lleva número, QR ni pago, y avisa de que no es factura. Lo pone quien compone el documento.
Antes de empezar
- Encender Impresión en el negocio. No necesita ninguna otra app.
- La app de ERPlora instalada en el dispositivo que está junto a la impresora (en su red, con su cable USB o emparejado por Bluetooth). Ese dispositivo saca el papel de la cola; desde un navegador no se llega a las impresoras.
- Una impresora térmica (ESC/POS) para tiques, comandas y etiquetas, encendida; para A4 (una factura completa), la impresora del sistema del ordenador.
Configuración inicial, paso a paso:
- Abre Impresión → Impresoras y pulsa «Añadir impresora». Escribe su nombre, elige la conexión, escribe su dirección (la IP de su hoja de configuración, la MAC de Bluetooth o el nombre de la cola USB), el ancho de papel y su función (PRINTING-F03, PRINTING-F04).
- Pulsa «Probar» en su fila y comprueba que sale la hoja de prueba (PRINTING-F05).
- En Impresión → Ajustes decide si el tique sale solo al cobrar, si se abre el cajón con él, cuántas copias y, si tienes varias impresoras con la misma función, cuál es la de cada una (PRINTING-F06).
- La cabecera y el pie del tique se escriben en los ajustes de Ventas, no aquí.
- Cobra una venta de prueba y comprueba en Impresión → Cola que el trabajo sale y queda «Impreso» (PRINTING-F07, PRINTING-F01).
Pantallas
Tres pestañas abajo, las mismas que el menú: Impresoras, Cola y Ajustes.
Impresoras
Menú Impresión → Impresoras. Título «Impresión» y la frase «Da de alta las impresoras del negocio, di qué sale por cada una y comprueba que el papel sale.». Dos zonas, en este orden:
- Estado de la impresión: una tarjeta por cada función que tenga alguna impresora o trabajos esperando (un negocio nuevo no ve ninguna), con su nombre («Recibo», «Cocina», «Barra», «Etiqueta»), su estado («Lista», «En cola, sin impresora», «Con errores») y «En cola: N · el más antiguo lleva 3 min» o «Nada en cola». Una función con trabajos esperando y sin ninguna impresora activa saca el aviso naranja «N trabajos de Cocina llevan 3 min esperando. Ninguna impresora activa tiene esta función: añade una o dale esta función a una de abajo.». Con todo vacío: «Todo al día: no hay nada en cola.». Error de lectura: «No se pudo leer la cola de impresión.» con «Reintentar».
- Impresoras: la tabla (o tarjetas en el móvil) con Nombre, Función, Conexión, Dirección, Papel, Estado y Activa. El estado es «Lista», «Esperando» (tiene trabajos que no salen desde hace más de un minuto), «Con errores» (el último intento falló: debajo, «Último error: …») o «Inactiva». Por fila: «Editar», «Probar» y «Desactivar»/«Activar». Arriba, «Añadir impresora». Vacía: «Todavía no hay impresoras. Añade la de tu caja con su dirección.». Una nota recuerda que el papel lo saca la app de ERPlora del dispositivo que está junto a la impresora.
La ventana Nueva impresora / Editar impresora tiene «Nombre», «Conexión» («Red», «USB», «Bluetooth», «Impresora del sistema (A4)»), «Dirección IP o nombre» y «Puerto» (red; 9100 de fábrica), «MAC de Bluetooth» (Bluetooth), «Nombre de la cola USB» (USB), «Ancho de papel» (80 mm o 58 mm; no en la del sistema; debajo, «Se guarda con la impresora: la app de ERPlora imprime por ahora 32 caracteres por línea, sea cual sea el papel.»), «Función» y «Activa», con «Guardar» y «Cancelar».
Quien no puede cambiar impresoras no ve «Añadir impresora», «Editar» ni «Desactivar»; quien no puede imprimir no ve «Probar».
Cola
Menú Impresión → Cola. Título «Cola de impresión». La tabla de trabajos, del más reciente al más antiguo, 50 por página: Documento («Tique T-000123», o «Tique · 14/10/26 23:05» si no trae número), Función, Impresora, Estado («Pendiente», «Enviado», «Impreso», «Fallido», «Cancelado»), Intentos, Pedido el y Detalle («Último error: …», «Cancelado por Ana · motivo», «Reenviado por Ana»). Filtros por estado, función e impresora, y buscador por número de documento. Quien puede gestionar la cola ve en cada fila «Reintentar» (un trabajo fallido, o enviado y sin respuesta pasado su plazo) y «Cancelar» (en cola, fallido o sin respuesta); «Cancelar» abre una ventana con «Motivo (opcional)», «Sí, cancelar» y «Volver». Vacía: «No hay trabajos de impresión.». Error al cargar: el mensaje con «Reintentar».
Ajustes
Menú Impresión → Ajustes. Una tarjeta «Ajustes del ticket» con «Imprimir ticket al cobrar», «Abrir cajón al cobrar» y «Copias del ticket» (1, 2 o 3); otra «Impresora de cada función» con un desplegable por función («Recibo», «Cocina», «Barra», «Etiqueta»): «La primera activa con esa función» o una de sus impresoras activas. La nota «El encabezado y el pie del tique forman parte de los ajustes de Ventas, que es de donde sale el tique.» con el enlace «Abrir los ajustes del tique» (si Ventas está encendida). «Guardar ajustes» guarda lo que cambió y dice «Ajustes guardados.». Quien no puede cambiarlos los ve bloqueados con «No tienes permiso para cambiar estos ajustes.». Cargando: «Cargando ajustes…». Error: «No se pudieron cargar los ajustes.» con «Reintentar»; al guardar, «No se pudieron guardar los ajustes.» con el motivo.
Flujos
| ID | Flujo | Vertical | Estado |
|---|---|---|---|
| PRINTING-F01 | Ver cómo va la impresión | común | hecho |
| PRINTING-F02 | Encontrar una impresora de la red sin escribir su dirección | común | no hecho: lo hará la app del dispositivo (bloque 6) |
| PRINTING-F03 | Añadir una impresora por su dirección | común | hecho |
| PRINTING-F04 | Asignar qué sale por cada impresora | común | hecho |
| PRINTING-F05 | Hacer una prueba de impresión | común | parcial: el papel sale con /ws/print |
| PRINTING-F06 | Elegir cómo imprime el negocio | común | hecho |
| PRINTING-F07 | Imprimir el tique al cobrar | común | parcial: falta que Ventas lo pida |
| PRINTING-F08 | Reimprimir un tique o una factura | común | parcial: falta que Ventas y Facturación lo pidan |
| PRINTING-F09 | Imprimir la cuenta de la mesa | restaurante | parcial: falta que Ventas lo pida |
| PRINTING-F10 | Imprimir la comanda en cocina y barra | restaurante | no hecho: Cocina no existe |
| PRINTING-F11 | Reimprimir una comanda | restaurante | no hecho: Cocina no existe |
| PRINTING-F12 | Imprimir la etiqueta de un código de barras | común | parcial: falta que Inventario lo pida |
| PRINTING-F13 | Abrir el cajón al cobrar | común | parcial: falta que Ventas lo pida |
| PRINTING-F14 | Sacar del atasco un trabajo de impresión | común | hecho |
| PRINTING-F15 | Llevar el texto antiguo del tique a Ventas | común | retirado |
| PRINTING-F16 | Mandar imprimir desde el asistente | común | hecho |
| PRINTING-F17 | Imprimir el cierre de caja | común | parcial: falta que Caja lo pida |
| PRINTING-F18 | Sacar el papel: el dispositivo recoge y confirma los trabajos | común | parcial: la recogida está hecha; el canal /ws/print es de base |
| PRINTING-F19 | Ver el estado de una impresora | común | hecho |
PRINTING-F01 Ver cómo va la impresión
Estado: hecho Vertical: común Actor: administrador, responsable, empleado Pantalla: Impresoras, Cola Pasos: 1. Abre Impresión → Impresoras: las tarjetas de función dicen si cada una tiene impresora, cuánto espera y desde cuándo. 2. Abre Impresión → Cola para ver cada trabajo con su estado, sus intentos y su último error. 3. Si una función sale «En cola, sin impresora» o hay un aviso naranja, el papel no está saliendo: sigue por PRINTING-F04 (dar la función a una impresora) o PRINTING-F14 (sacar el trabajo del atasco). Entra: la cola y las impresoras del negocio. Sale: nada guardado. Lo que depende del reloj (cuánto lleva esperando, el aviso naranja, «Esperando» y un enviado que no contestó a tiempo) se recalcula solo cada 30 s, sin esperar a otro cambio; «Todo al día» exige que no haya nada en cola, enviado sin confirmar ni fallido. Las pantallas se refrescan solas al encolarse, enviarse, imprimirse, fallar, reintentarse o cancelarse un trabajo. Si falla: «No se pudo leer la cola de impresión.» con «Reintentar»; no se pinta «Todo al día» cuando la lectura falla. Implicados: PRINTING-F14, PRINTING-F18, CASH_REGISTER-F08
PRINTING-F02 Encontrar una impresora de la red sin escribir su dirección
Estado: no hecho — buscar impresoras (mDNS y barrido del puerto 9100, USB del sistema, Bluetooth
emparejado) lo hace la app del dispositivo (erplora_discover_printers); su puente JavaScript llega a
packages/ui con el bloque 6 (PLAN-HUB §5). Mientras tanto, la impresora se añade por su dirección
(PRINTING-F03).
Vertical: común
Actor: administrador, responsable
Pantalla: Impresoras
Pasos:
1. (Bloque 6) En la app instalada, «Buscar impresoras» lista lo que encuentra el dispositivo.
2. Elegir una la da de alta con su conexión y su dirección ya rellenas (PRINTING-F03).
Entra: lo que encuentra la app del dispositivo.
Sale: la impresora dada de alta en el negocio.
Si falla: desde un navegador, «Desde el navegador no se puede buscar impresoras: añádela por su
dirección.».
Implicados: PRINTING-F03
PRINTING-F03 Añadir una impresora por su dirección
Estado: hecho
Vertical: común
Actor: administrador, responsable
Pantalla: Impresoras
Pasos:
1. Pulsa «Añadir impresora».
2. Escribe el «Nombre» («Caja», «Cocina»), elige la «Conexión» y escribe su dirección: la IP (o el
nombre en la red) y el puerto para una de red (la IP sale en la hoja de configuración que imprime
la impresora al encenderla con el botón de avance pulsado); la MAC para una Bluetooth emparejada; el
nombre de la cola del sistema para una USB. La «Impresora del sistema (A4)» no lleva dirección: es
la del ordenador.
3. Elige el «Ancho de papel» y la «Función», y pulsa «Guardar».
4. Sale «Impresora añadida.» y aparece en la tabla.
Entra: el nombre, la conexión, la dirección, el papel y la función.
Sale: la impresora del negocio (avisa: printing.printer.created).
Si falla: el campo marcado con el motivo: «Ya hay una impresora con ese nombre.», «Escribe una IP o un
nombre de red válido (por ejemplo 192.168.1.100).», «El puerto va de 1 a 65535.», «Escribe la MAC
como AA:BB:CC:DD:EE:FF.», «Escribe el nombre de la cola tal como lo da el sistema (letras, números,
punto, guion y guion bajo).», «La impresora del sistema imprime páginas A4: dale la función Recibo.».
Implicados: PRINTING-F04, PRINTING-F05
PRINTING-F04 Asignar qué sale por cada impresora
Estado: hecho Vertical: común Actor: administrador, responsable Pantalla: Impresoras, Ajustes Pasos: 1. Al dar de alta o editar una impresora, elige su «Función»: «Recibo» (tique, factura, cuenta de la mesa, informe de caja, albarán), «Cocina» (comandas), «Barra» (comandas de barra) o «Etiqueta» (etiquetas de código de barras). 2. Si hay varias impresoras con la misma función, en Ajustes → Impresora de cada función elige la que la saca; si no eliges, sale por la primera activa con esa función (por nombre). 3. «Desactivar» deja una impresora fuera sin borrarla: no recibe trabajos nuevos y sus trabajos en cola esperan (reintentarlos los manda a la impresora que toque entonces). Entra: la función de cada impresora y, si hay varias, la elegida. Sale: cada documento sale por la impresora de su función. Una impresora no se borra: la cola la nombra. Si falla: si ninguna impresora activa tiene la función, el trabajo espera en la cola sin impresora («En cola, sin impresora») y sale en cuanto una la tenga. En ajustes, una impresora de otra función o inactiva se rechaza: «Esa impresora no tiene esta función.», «Esa impresora está inactiva.». Implicados: PRINTING-F01, PRINTING-F06, INVENTORY-F25
PRINTING-F05 Hacer una prueba de impresión
Estado: parcial — la prueba se encola y la recoge el dispositivo (PRINTING-F18); el papel sale cuando
base sirva /ws/print (bloque 6)
Vertical: común
Actor: administrador, responsable, empleado
Pantalla: Impresoras
Pasos:
1. Pulsa «Probar» en la fila de la impresora.
2. Sale «Prueba enviada a la cola de Caja.» y en la cola aparece «Hoja de prueba».
3. El dispositivo junto a la impresora la saca: el nombre del negocio (el que tiene Facturación; sin
Facturación o sin permiso para leerlo, «ERPlora»), «Impresora OK», la fecha y la dirección de la
impresora. Una impresora del sistema saca la hoja en A4 con lo mismo.
Entra: la impresora.
Sale: un trabajo «Hoja de prueba» para esa impresora (avisa: printing.job.queued).
Si falla: una impresora inactiva no se prueba: «Esa impresora está inactiva: actívala para probarla.».
Si el papel no sale, el trabajo queda «Fallido» con el error del dispositivo (PRINTING-F14).
Implicados: PRINTING-F18
PRINTING-F06 Elegir cómo imprime el negocio
Estado: hecho
Vertical: común
Actor: administrador, responsable
Pantalla: Ajustes
Pasos:
1. Abre Impresión → Ajustes.
2. Enciende o apaga «Imprimir ticket al cobrar» y «Abrir cajón al cobrar», elige las «Copias del
tique» y, si quieres, la impresora de cada función.
3. Pulsa «Guardar ajustes». Se guarda lo que cambiaste; lo demás queda como estaba.
Entra: las decisiones del negocio.
Sale: los ajustes de impresión, una sola fila (avisa: printing.settings.updated). Sin guardar
nunca valen los de fábrica: tique al cobrar encendido, cajón apagado, una copia, sin impresora elegida.
Si falla: «No se pudieron guardar los ajustes.» con el motivo. Si la lectura falla, la pantalla no
enseña valores y ofrece «Reintentar». Sin permiso, bloqueados y sin «Guardar ajustes».
Implicados: PRINTING-F07, PRINTING-F13
PRINTING-F07 Imprimir el tique al cobrar
Estado: parcial — Impresión lo hace en cuanto se le pide (printing.job.create con automatic);
falta que Ventas lo pida al cobrar (pedido al worker de sale) y el papel, con /ws/print
Vertical: común
Actor: empleado
Pantalla: Vender (de Ventas)
Pasos:
1. El empleado cobra en Ventas → Vender.
2. En la misma transacción del cobro, Ventas pide a Impresión el tique (automatic: true).
3. Si «Imprimir ticket al cobrar» está encendido, el tique entra en la cola de la función Recibo
con las copias de los ajustes y, si «Abrir cajón al cobrar» está encendido, con la orden de abrir
el cajón; el dispositivo lo saca.
Entra: el tique compuesto por Ventas (receipt).
Sale: un trabajo en la cola, o nada si el negocio no imprime al cobrar.
Si falla: una venta nunca se cae por la impresión: si Impresión no está encendida o la petición
falla, Ventas cobra igual y lo dice. Un trabajo que no sale queda en la cola (PRINTING-F14).
Implicados: SALE-F08, PRINTING-F13, PRINTING-F18
PRINTING-F08 Reimprimir un tique o una factura
Estado: parcial — Impresión acepta el tique (receipt con duplicate) y la factura (invoice, o la
página A4 de Facturación para la impresora del sistema); falta que Ventas y Facturación lo pidan
Vertical: común
Actor: administrador, responsable, empleado
Pantalla: Ventas, Facturas (de esas apps)
Pasos:
1. En la ficha de la venta o de la factura, pulsa «Imprimir».
2. La app pide a Impresión el documento marcado como copia («DUPLICADO»).
Entra: el documento con duplicate: true.
Sale: un trabajo en la cola de Recibo; una factura A4 va a la impresora del sistema.
Si falla: como F07.
Implicados: SALE-F31
PRINTING-F09 Imprimir la cuenta de la mesa
Estado: parcial — Impresión acepta la cuenta (prebill) y rechaza una sin líneas; falta que Ventas la
pida
Vertical: restaurante
Actor: empleado
Pantalla: Vender (de Ventas)
Pasos:
1. Con la cuenta abierta, pulsa «Imprimir cuenta».
2. Ventas pide la cuenta (sin número, sin QR, sin pago y con el aviso de que no es factura).
Entra: la cuenta (prebill) con sus líneas.
Sale: un trabajo en la cola de Recibo. Cada pulsación saca una cuenta.
Si falla: «Una cuenta lleva líneas que cobrar: esta no tiene ninguna.» (422).
Implicados: SALE-F15
PRINTING-F10 Imprimir la comanda en cocina y barra
Estado: no hecho — Cocina no existe todavía en la plataforma; Impresión ya acepta la comanda
(kitchen_order, función Cocina o Barra)
Vertical: restaurante
Actor: empleado
Pantalla: Vender (de Ventas)
Pasos:
1. El camarero dispara el pedido.
2. Cocina pide una comanda por estación (función Cocina o Barra).
Entra: la comanda (kitchen_order) con su mesa, camarero y líneas.
Sale: un trabajo por estación.
Si falla: la comanda no se desvía a la impresora de tiques; espera en su función.
Implicados: PRINTING-F04
PRINTING-F11 Reimprimir una comanda
Estado: no hecho — llega con Cocina Vertical: restaurante Actor: empleado Pantalla: Cocina Pasos: 1. En la comanda, «Reimprimir». Entra: la comanda. Sale: un trabajo nuevo con otra clave. Si falla: como F10. Implicados: PRINTING-F10
PRINTING-F12 Imprimir la etiqueta de un código de barras
Estado: parcial — Impresión acepta la etiqueta (barcode_label, función Etiqueta: nombre, código y
precio; el código lo dibuja la impresora); falta que Inventario la pida (INVENTORY-F25)
Vertical: común
Actor: administrador, responsable, empleado
Pantalla: Ficha del producto (de Inventario)
Pasos:
1. En la ficha del producto, «Imprimir código de barras».
2. Inventario pide la etiqueta a Impresión.
Entra: product_name, barcode (el SKU) y price.
Sale: un trabajo en la cola de Etiqueta. Cada pulsación saca una etiqueta.
Si falla: sin impresora con la función Etiqueta, la etiqueta espera en la cola y la tarjeta de
Etiqueta lo dice («En cola, sin impresora»).
Implicados: INVENTORY-F25, PRINTING-F04
PRINTING-F13 Abrir el cajón al cobrar
Estado: parcial — el trabajo del tique lleva la orden de abrir el cajón (o, con el tique apagado, un trabajo solo de cajón); falta que Ventas lo pida (F07) Vertical: común Actor: empleado Pantalla: Vender (de Ventas) Pasos: 1. Con «Abrir cajón al cobrar» encendido, el cobro (F07) abre el cajón conectado a la impresora de tiques, con cualquier forma de pago. Entra: el ajuste. Sale: la orden de abrir el cajón, en el mismo trabajo que el tique. Si falla: si el tique no sale, el cajón tampoco; el trabajo queda en la cola (PRINTING-F14). Implicados: PRINTING-F06, PRINTING-F07
PRINTING-F14 Sacar del atasco un trabajo de impresión
Estado: hecho
Vertical: común
Actor: propietario, administrador
Pantalla: Cola
Pasos:
1. En Impresión → Cola, busca el trabajo «Fallido» (o «Enviado» que no contestó).
2. «Reintentar» lo devuelve a la cola con los intentos a cero, hacia la impresora que toque ahora:
«Devuelto a la cola: el próximo dispositivo que se conecte lo imprimirá.».
3. «Cancelar» pide un motivo (opcional) y lo retira: «Trabajo cancelado. No se imprimirá.». Queda en
la cola con quién, cuándo y por qué.
Entra: el trabajo y, al cancelar, el motivo.
Sale: el trabajo en cola otra vez o cancelado (avisa: printing.job.retried, printing.job.cancelled).
Nada se borra.
Si falla: «Solo se reintenta un trabajo fallido o que no contestó; este está …», «Un trabajo que está
imprimiendo o ya impreso no se cancela; este está …». Sin permiso no se ven los botones.
Implicados: PRINTING-F01
PRINTING-F15 Llevar el texto antiguo del tique a Ventas
Estado: retirado — la plataforma nueva no tiene cabecera ni pie de tique en Impresión que llevar: el texto del tique vive en los ajustes de Ventas desde el principio Vertical: común Actor: administrador Pantalla: Ajustes Pasos: 1. La nota de Ajustes lleva a los ajustes de Ventas, donde se escribe el texto del tique. Entra: nada. Sale: nada. Si falla: no aplica. Implicados: SALE-F02
PRINTING-F16 Mandar imprimir desde el asistente
Estado: hecho Vertical: común Actor: administrador, responsable, empleado Pantalla: Asistente Pasos: 1. «Imprime una prueba en la de cocina», «reintenta los trabajos fallidos de etiquetas», «¿cómo está la impresora de la caja?»: el asistente usa las mismas operaciones que las pantallas, nombrando la impresora por su nombre y el trabajo por su número. Entra: la petición. Sale: lo mismo que la pantalla. Si falla: lo mismo que la pantalla, con las palabras del servidor. Implicados: PRINTING-F05, PRINTING-F14, PRINTING-F19
PRINTING-F17 Imprimir el cierre de caja
Estado: parcial — Impresión acepta el informe (cash_session_report); falta que Caja lo pida al
imprimir el informe X o Z (hoy sale por el diálogo del navegador)
Vertical: común
Actor: empleado
Pantalla: Detalle de la sesión (de Caja)
Pasos:
1. En el detalle de la sesión, «Imprimir».
2. Caja pide el informe a la función Recibo.
Entra: el informe (sesión, cajero, fondo, cierre y movimientos).
Sale: un trabajo en la cola de Recibo.
Si falla: como F07.
Implicados: CASH_REGISTER-F16
PRINTING-F18 Sacar el papel: el dispositivo recoge y confirma los trabajos
Estado: parcial — recoger, confirmar y avisar del fallo están hechos como operaciones
(printing.job.claim, printing.job.complete, printing.job.fail); el canal /ws/print y la app
que las llama son de base y de la app nativa (bloque 6). Contrato en «Contrato con la plataforma».
Vertical: común
Actor: sistema (la app del dispositivo)
Pantalla: ninguna
Pasos:
1. El dispositivo junto a la impresora pide el siguiente trabajo de las impresoras a las que llega.
2. Impresión le da el más antiguo en cola (de esa impresora, o sin impresora y de su función), lo
marca «Enviado» con un plazo de 90 s y suma un intento.
3. El dispositivo lo imprime —la primera copia como original y las demás de un tique o una factura
como «DUPLICADO»— y confirma diciendo quién es y qué entrega contesta: «Impreso». Si no pudo, avisa
con el error: vuelve a la cola hasta 5 intentos y después queda «Fallido».
4. Si el dispositivo se cae sin contestar, pasado el plazo el trabajo vuelve a la cola y se avisa a los
dispositivos (printing.job.queued).
Entra: las impresoras que alcanza el dispositivo y, al confirmar, el resultado.
Sale: el trabajo con su estado (avisa: printing.job.claimed, printing.job.printed,
printing.job.failed).
Si falla: confirmar dos veces es una confirmación. Una confirmación tardía del mismo dispositivo
(una impresora lenta con copias pasa de los 90 s y el trabajo ya había vuelto a la cola) se acepta: el
papel salió y no se imprime otra vez. Una confirmación o un fallo de otro dispositivo, o de una entrega
que no es la suya, se rechaza (409 printing.job_not_yours) y no cambia nada.
Implicados: PRINTING-F05, PRINTING-F07, PRINTING-F14
PRINTING-F19 Ver el estado de una impresora
Estado: hecho Vertical: común Actor: administrador, responsable, empleado Pantalla: Impresoras Pasos: 1. La columna «Estado» de cada impresora dice «Lista», «Esperando», «Con errores» o «Inactiva», con su último error. 2. El asistente lo contesta por el nombre de la impresora. Entra: la impresora. Sale: su estado, cuántos trabajos esperan y desde cuándo, cuándo imprimió por última vez y su último error. Si falla: «No hay ninguna impresora con ese nombre.». Implicados: PRINTING-F01
Servicios: lo que entra y lo que sale
Las demás apps y el asistente usan Impresión por estas operaciones, por su nombre; nunca sus tablas.
Lo que ofrece: consultas (leen, no cambian nada)
| Qué da | Quién puede | Flujos | Servicio |
|---|---|---|---|
| Los ajustes de impresión (los de fábrica si nunca se guardaron) | ver | F06 | printing.settings.get |
| Las impresoras, con búsqueda por nombre, filtros (función, conexión, activa) y páginas, cada una con su estado | ver | F03, F04, F19 | printing.printer.list |
| Una impresora por id o por nombre | ver | F04 | printing.printer.get |
| El estado de una impresora (por id o nombre) | ver | F19 | printing.printer.status |
| La cola, del más reciente al más antiguo, con búsqueda por documento, filtros (estado, función, impresora) y páginas | ver | F01, F14 | printing.job.list |
| El resumen de la cola por función | ver | F01 | printing.job.summary |
Lo que ofrece: acciones (cambian datos)
| Qué hace | Quién puede | Flujos | Servicio |
|---|---|---|---|
| Guarda los ajustes (solo lo que se manda) | ajustes | F06 | printing.settings.update |
| Da de alta una impresora | ajustes | F03 | printing.printer.create |
| Cambia una impresora, o la desactiva y activa | ajustes | F04 | printing.printer.update |
| Encola la hoja de prueba de una impresora | imprimir | F05 | printing.printer.test |
| Encola un documento (idempotente por su clave) | imprimir | F07–F13, F16, F17 | printing.job.create |
| Da al dispositivo el siguiente trabajo de sus impresoras | imprimir | F18 | printing.job.claim |
| Confirma un trabajo impreso | imprimir | F18 | printing.job.complete |
| Avisa de que un trabajo no salió | imprimir | F18 | printing.job.fail |
| Devuelve a la cola un trabajo fallido o sin respuesta | cola | F14 | printing.job.retry |
| Cancela un trabajo | cola | F14 | printing.job.cancel |
Lo que avisa
| Aviso | Cuándo | Qué lleva | Servicio |
|---|---|---|---|
| Ajustes guardados | Guardar los ajustes | Qué campos cambiaron | printing.settings.updated |
| Impresora nueva | Dar de alta una impresora | Cuál | printing.printer.created |
| Impresora cambiada | Editarla, desactivarla o activarla | Cuál y qué campos | printing.printer.updated |
| Trabajo en cola | Encolar (también reintentar) | El trabajo, su función y su impresora | printing.job.queued |
| Trabajo enviado | Un dispositivo lo recoge | El trabajo y su impresora | printing.job.claimed |
| Trabajo impreso | El dispositivo confirma | El trabajo | printing.job.printed |
| Trabajo fallido | El dispositivo avisa del error | El trabajo y si ya no se reintenta | printing.job.failed |
| Trabajo devuelto a la cola | Reintentar | El trabajo | printing.job.retried |
| Trabajo cancelado | Cancelar | El trabajo | printing.job.cancelled |
Los avisos no llevan el documento (puede tener el nombre o el NIF de un cliente): solo ids.
A qué reacciona
A nada. Las apps que imprimen llaman a printing.job.create por su nombre, dentro de su propia
transacción (la de la venta, la del cierre), y no esperan a un aviso.
Lo que necesita de otras apps
Nada (requires = []). No lee modelos de nadie: quien imprime manda el documento ya compuesto.
Contrato con la plataforma
Lo que pide cada app (printing.job.create). La entrada es la del cuadro; los importes van en
unidades de la moneda (12.50), con decimals si no son 2, y las fechas, ya escritas:
| Campo | Qué es |
|---|---|
job_key |
Clave de idempotencia de quien pide (≤ 128): dos peticiones con la misma clave son un trabajo; la segunda contesta duplicate: true con el que ya estaba. Sin clave, Impresión pone una. |
document_type |
Uno de los ocho que la impresora sabe pintar: receipt, kitchen_order, invoice, delivery_note, barcode_label, cash_session_report, prebill, generic. Otro es 422. |
document |
El documento estructurado (objeto JSON, ≤ 512 KB): nunca HTML para una térmica. Los campos son los que lee crates/peripherals/src/escpos.rs de la app (abajo). |
format |
receipt (térmica, de fábrica) o a4 (impresora del sistema). |
html |
La página A4 completa (≤ 2 MB, sin scripts) cuando format es a4; obligatoria entonces y prohibida si no. |
usage |
La función: receipt, kitchen, bar o label. Sin ella sale del documento: kitchen_order → cocina, barcode_label → etiquetas, el resto → tiques. |
printer |
Una impresora concreta por id o por nombre («Cocina»); sin ella, la de la función (ajustes), o la primera activa con esa función, o ninguna (espera). |
copies |
De 1 a 5; sin ella, las copias del tique de los ajustes para receipt y 1 para lo demás. |
automatic |
true = la impresión sola al cobrar: respeta «Imprimir ticket al cobrar» (apagado → nada en cola, skipped: "print_on_sale_off") y añade «Abrir cajón al cobrar» (open_drawer; con el tique apagado y el cajón encendido, encola un trabajo solo de cajón). |
source_app, source_ref |
Quién lo pide y qué documento es («sale», «T-000123»): lo que se ve en la cola. |
Si el documento no trae locale, Impresión pone el idioma de quien lo pide; si no trae decimals
(salvo en generic, que imprime todas sus claves), los de la moneda (currency, ISO 4217; sin ella,
EUR). Un valor que no es JSON (un Decimal, una fecha) es 422, nunca un error del servidor.
Campos del documento que lee la impresora (los demás se ignoran):
receipteinvoice:business_name,business_address,vat_number,phone,receipt_id,duplicate,rectifying,cashier,customer_name,customer_tax_id,customer_address,items(name,quantity,total,notes,components,modifiers),subtotal,tax_amount,tax_label,tax_breakdown(rate,base,tax),discount,total,payment_method,paid,change,qr_data,qr_heading,qr_legend,receipt_header,receipt_footer,claim_*,promo_*,decimals,locale. Unainvoiceexigevat_number,receipt_id,customer_name,customer_tax_idytax_breakdownno vacío (422 si falta).prebill: lo mismo sin número, QR ni pago, connotice; exigeitemsno vacío.kitchen_order:order_number,round_number,table,waiter,label,priority,items(name,quantity,notes,combo_name,combo_ref).barcode_label:product_name,barcode,price.cash_session_report:receipt_id(la sesión),cashier,opening_balance,closing_balance,transactions(label,amount).delivery_note:receipt_id,customer_name,delivery_address,items(name,quantity).generic:titley cualquier par clave–valor.
Lo que hace base con /ws/print (fase 2, bloque 6). El protocolo es el del Hub viejo
(print_ws.rs): hello con la sesión en el primer mensaje y el deviceId, ready, claim, job,
done/failed, ack, beat, wake, idle, error. Lo de Impresión es el estado de la cola; el
canal llama a sus operaciones con el contexto de la sesión del dispositivo:
claim→printing.job.claimconprinters(los ids de las impresoras del negocio que ese dispositivo alcanza; el dispositivo los conoce porprinting.printer.list) ydevice(su nombre odeviceId). Contesta{"job": null}(→idle) o el trabajo:{"id", "kind", "printer_id", "target", "paper_width", "document_type", "document", "copy_document", "format", "html", "copies", "open_drawer", "attempts", "leased_until"}.- El dispositivo lo imprime con los comandos nativos de la app, que no cambian:
-
kind = "document"yformat = "receipt":erplora_print(printerId = target, documentType, data = document, jobId = id)una vez y, sicopies> 1,erplora_print(…, data = copy_document, …)lascopies − 1restantes. En unreceipto unainvoice,copy_documentes el documento con"duplicate": true: la app imprime «DUPLICADO» (escpos.rs) y nunca sale un segundo original (RD 1619/2012, art. 14.4). Una página A4 se imprime una vez; -kind = "document"yformat = "a4":print_document(html); -kind = "test_page":erplora_test_print(printerId = target, data = document)(en la impresora del sistema,print_document(html)); -kind = "drawer", oopen_drawer: truedespués de imprimir:erplora_open_drawer(printerId = target).targetes elprinter_idque entiende la app:network:<ip>:<puerto>,bluetooth:<MAC>,usb:<cola>osystem. done→printing.job.completecondeviceyattempt({"confirmed": true}→ack); se acepta también si el trabajo ya volvió a la cola, siempre que sea del mismo dispositivo.failed→printing.job.failcon el error,deviceyattempt; solo vale para la entrega en curso. Otro dispositivo u otra entrega → 409printing.job_not_yours.wake: tras el COMMIT de un trabajo nuevo llega el avisoprinting.job.queuedpor la BD de control (el mismo NOTIFY que/api/live); el canal despierta a los dispositivos de esa impresora o función. Es un empujón: el documento solo viaja en la respuesta aclaim.- Quién puede ser dispositivo de impresión (el registro de dispositivos y su latido) es de
base; el permiso de las tres operaciones esprinting.print.
Lo que se pide a cada app (no se toca desde aquí):
- Ventas (
sale): al cobrar, llamar aprinting.job.createcon el tique (receipt,automatic: true,job_key=sale-<id>-receipt,source_app: "sale",source_ref= número) en la transacción del cobro, sin caerse si Impresión está apagada; en «Imprimir» de la ficha, lo mismo conduplicate: truey otra clave; en «Imprimir cuenta»,prebill. Los importes en unidades (céntimos / 100). - Facturación (
invoice): «Imprimir» →invoice(térmica) o su página A4 (templates/invoice/invoice.html) conformat: "a4". - Caja (
cash_register): «Imprimir» del detalle →cash_session_report. - Inventario (
inventory, INVENTORY-F25): «Imprimir código de barras» →barcode_labelconproduct_name,barcode= SKU yprice. - Cocina (cuando exista):
kitchen_orderpor estación,usagekitchenobar.
Quién la usa
| App | Para qué | Servicio |
|---|---|---|
| Ventas | Tique al cobrar, reimpresión, cuenta de la mesa (cuando lo adopte) | printing.job.create |
| Facturación | Factura en térmica o A4 (cuando lo adopte) | printing.job.create |
| Caja | Informe X y Z (cuando lo adopte) | printing.job.create |
| Inventario | Etiqueta de código de barras (cuando lo adopte) | printing.job.create |
base (/ws/print) |
Entregar y confirmar trabajos | printing.job.claim, printing.job.complete, printing.job.fail |
Quién puede qué
| Permiso | Propietario | Administrador | Responsable | Empleado | Servicio |
|---|---|---|---|---|---|
| Ver impresoras, ajustes y cola | sí | sí | sí | sí | printing.view_settings |
| Impresoras y ajustes | sí | sí | sí | no | printing.manage_settings |
| Imprimir (pedir, probar, recoger y confirmar) | sí | sí | sí | sí | printing.print |
| Reintentar y cancelar trabajos | sí | sí | no | no | printing.manage_jobs |