Ir al contenido

🖨️ 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":

  1. ✅ Se envía un formulario POST con op=printcfg_save.
  2. 🧠 PHP valida y sanitiza todos los campos.
  3. 📦 Genera un JSON con la nueva configuración.
  4. 🔄 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.
  5. 🔍 Verifica que el archivo final no esté vacío (evita corrupción).
  6. 🔄 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
  1. 🎨 Ajustar diseño en el formulario.
  2. 👀 Verificar que el preview se vea como esperas.
  3. 💾 Hacer clic en "Guardar diseño".
  4. 🧪 Probar con "Imprimir prueba directa".
  5. 🎉 ¡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

Calificación
0 0

No hay comentarios por ahora.

para ser el primero en comentar.