impresora USB B -> USB A
🖨️ Módulo de Impresión — Panel de Administración
Este documento describe cómo funciona la pestaña de Impresión en el panel de administración del sistema de turnos (/turnero/admin2/index.php), incluyendo el guardado de configuración, el preview en vivo y las acciones de prueba.
📁 Estructura de archivos
- Configuración guardada en:
/var/www/html/turnero/storage/print/config.json
- Directorio requerido:
storage/print/ (debe existir y tener permisos de escritura para www-data) - Valores por defecto:
Si config.json no existe, se usan valores predeterminados definidos en $printCfgDefaults.
⚙️ Configuración editable
Desde la interfaz, puedes ajustar los siguientes parámetros:
📏Papel | Select | 58 mm o 80 mm |
📐Alineación | Select | Izquierd a,Centrada,Derecha |
📄Título | Texto | Nombre del negocio (ej: CARNICERIA) |
🏷️Subtítulo | Texto | Sucursal u otra info (opcional) |
📝Mensaje de pie | Texto | Frase final (ej:Gracias por su visita) |
🔢Texto grande | Checkbox | Activa fuente grande para el número de turno |
🖼️Bordes/Líneas | Checkbox | Agrega recuadros y divisores |
📅Mostrar fecha/hora | Checkbox | Incluye timestamp en el ticket |
📱Mostrar QR | Checkbox | Imprime código QR con enlace al turno |
🔗Plantilla QR | Texto | URL con{TICKET}como placeholder (ej:/turnos/{TICKET}) |
🖨️Cola CUPS | Texto | Nombre de la cola de impresión (ej:POS80) |
⬇️Feed (líneas) | Número | Líneas en blanco al final del ticket (0–30) |
💾 Guardado de configuración
Al hacer clic en "Guardar diseño":
- ✅ Se envía un formulario POST con op=printcfg_save.
- 🧠 PHP valida y sanitiza todos los campos.
- 📦 Genera un JSON con la nueva configuración.
- 🔄 Escribe de forma atómica:
- Crea un archivo temporal: config.json.tmp
- Si tiene éxito, lo renombra a config.json
- Si falla rename() (ej: por filesystem diferente), usa file_put_contents() como fallback.
- 🔍 Verifica que el archivo final no esté vacío (evita corrupción).
- 🔄 Redirige a index.php#impresion con mensaje de éxito o error.
⚠️ Importante: El directorio storage/print/ debe ser escribible por el usuario www-data.
👁️ Preview en vivo
El panel muestra un preview simulado del ticket en tiempo real:
- 🎯 Se actualiza automáticamente al modificar cualquier campo.
- 🖼️ Usa los mismos estilos que la impresora térmica (monoespaciado, negritas, alineación).
- 🧪 Muestra un ticket de ejemplo con número C-123.
- 🔗 El QR muestra la URL generada con {TICKET} reemplazado.
💡 El preview no imprime, solo simula visualmente cómo se verá el ticket.
🧪 Acciones de prueba
Además del guardado, hay botones para probar la impresión:
- Presiona el botón nuevo
- Presiona el botón atrás
- Presiona el botón reset
Verificar impresora instalada
root@turnito:/home/fgonzalez# lpstat -t
scheduler is running
no system default destination
device for POS80: parallel:/dev/usb/lp0
POS80 accepting requests since Sat 04 Oct 2025 10:31:16 -03
printer POS80 is idle. enabled since Sat 04 Oct 2025 10:31:16 -03
Verificar impresión de test:
curl -s "http://127.0.0.1/turnero/print_ticket.php?prefix=C&n=123" | jq
{
"ok": true,
"via": "cups-stdin",
"queue": "POS80",
"ticket": "C-123",
"qr": "/turnero/turnos/C-123",
"lp_output": "request id is POS80-148 (0 file(s))",
"datetime": "2025-10-04T10:31:16-03:00",
"used_cfg": true
}
Verificar errores de Cola de impresión
sudo tail -n 100 /var/log/cups/error_log
[04/Oct/2025:10:12:09 -0300] Raw queues are deprecated and will stop working in a future version of CUPS. See https://github.com/OpenPrinting/cups/issues/103
root@turnito:/home/fgonzalez#
🖨️ Imprimir prueba directa
- Emite un ticket de prueba C-999.
- Llama internamente a:
http://127.0.0.1/turnero/print_ticket.php?prefix=C&n=999
- Usa cURL o file_get_contents() según disponibilidad.
- Muestra mensaje de éxito o error en la interfaz.
🎫 Emitir + Imprimir (API nuevo)
- Simula un usuario presionando el botón físico.
- Llama a:
curl -s -X POST http://127.0.0.1/turnero/api/botones/nuevo.php --data "queue_id=1" | jq
- Emite un ticket real y lo imprime sin imprimir.
{
"ok": true,
"action": "nuevo",
"numero": "023"
}
Verificar eventos de captura de pines GPIO dela Rasperi pi:
tail -f /var/www/html/turnero/pi/gpio_events.json
root@turnito:/home/fgonzalez# tail -f /var/www/html/turnero/pi/gpio_events.json
"ts_iso": "2025-10-02T13:20:58-03:00"
},
{
"pin": 17,
"value": "event:0",
"queue": 1,
"ts": 1759422058,
"ts_iso": "2025-10-02T13:20:58-03:00"
}
]
🖨️Emitir + Imprimir directo en dispatch PHP:
curl -s -X POST http://127.0.0.1/turnero/pi/gpio_dispatch.php -H 'Content-Type: application/json' -d '{"pin":17,"value":"event:0","queue_id":1}' | jq
{ "ok": true,
"event": {
"pin": 17,
"value": "event:0",
"queue": 1,
"ts": 1759585399,
"ts_iso": "2025-10-04T10:43:19-03:00"
},
"action": "nuevo",
"result": {
"ok": true,
"action": "nuevo",
"numero": "025"
}
}
🖨️Test consola imprimir:
printf "TEST\r\n\r\n\x1D\x56\x00" | lp -d POS80 -o raw
root@turnito:/home/fgonzalez# printf "TEST\r\n\r\n\x1D\x56\x00" | lp -d POS80 -o raw
request id is POS80-151 (0 file(s))
root@turnito:/home/fgonzalez#
🔧 Diagnóstico y estado
La pestaña también muestra información útil para depuración:
- 🟢 Estado del servicio GPIO: active / failed / inactive
- 📜 ExecStart: Comando usado para iniciar gpio_buttons.service
- 🖨️ Salida de lpstat -t: Estado de las impresoras CUPS
- 🔄 Botón "Reiniciar servicio GPIO", Ejecuta:
systemctl restart gpio_buttons.service
- 📊 Eventos GPIO recientes: Últimos 10 eventos desde
tail -f /var/www/html/turnero/pi/gpio_events.json
🛠️ Solución de problemas comunes
❌ No se guarda config.json | Permisos insuficientes | chown www-data:www-data storage/print |
📄 Preview no aparece | JavaScript falla o IDs incorrectos | Asegurar que los campos tengan id="f-*" |
🖨️ Impresión falla | Cola CUPS incorrecta o impresora desconectada | Verificar lpstat -t y nombre de cola |
🔄 Guardar dispara impresión | Formularios anidados en HTML | Evitar <form> dentro de otro <form> |
✅ Flujo ideal de uso
- 🎨 Ajustar diseño en el formulario.
- 👀 Verificar que el preview se vea como esperas.
- 💾 Hacer clic en "Guardar diseño".
- 🧪 Probar con "Imprimir prueba directa".
- 🎉 ¡Listo! El sistema usará esta configuración para todos los tickets futuros.
🌟 Consejo: Usa {TICKET} en la plantilla QR para que cada código sea único y enlace al turno específico.
📄 Última actualización: Abril 2025
👨💻 Mantenido por: Sistema de Turnos Flavio
No hay comentarios por ahora.
