| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- <?php
- /**
- * Archivo para imprimir comandas desde app móvil
- * Recibe datos vía POST y los distribuye a las impresoras según cocina
- * Usa librería: mike42/escpos-php
- */
- if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
- header("Access-Control-Allow-Origin: *");
- header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
- header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
- http_response_code(204);
- exit;
- }
- header("Access-Control-Allow-Origin: *");
- header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
- header("Access-Control-Allow-Headers: Content-Type, Authorization");
- header('Content-Type: application/json; charset=utf-8');
- error_reporting(E_ALL);
- ini_set('display_errors', 0);
- ini_set('log_errors', 1);
- ini_set('error_log', 'logs/error.log');
- require __DIR__ . '/../vendor/autoload.php';
- use Mike42\Escpos\Printer;
- use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
- // ===================================================================
- // CONFIGURACIÓN: Tamaño de letra para nombres de platos
- // ===================================================================
- // Cambia este valor para ajustar el tamaño de letra de los platos:
- // 14 o menos = Normal (1x1) - tamaño estándar
- // 15-16 = Altura doble (1x2) - más alto
- // 17-18 = Ancho doble (2x1) - más ancho
- // 19+ = Doble completo (2x2) - más grande
- // ===================================================================
- $TAMANO_LETRA_PLATOS = 14;
- /**
- * Función helper para convertir el tamaño numérico a valores de impresora
- * @param int $size Tamaño configurado (14, 16, 18, etc.)
- * @return array [ancho, alto] para setTextSize()
- */
- function getTamanoTexto($size) {
- if ($size <= 14) return array(1, 1); // Normal
- if ($size <= 16) return array(1, 2); // Altura doble
- if ($size <= 18) return array(2, 1); // Ancho doble
- return array(2, 2); // Doble completo
- }
- // Recibir datos
- $dataPrint = null;
- if(isset($_POST["dataPrint"])){
- if(is_string($_POST["dataPrint"])){
- $dataPrint = json_decode($_POST["dataPrint"], true);
- } else {
- $dataPrint = $_POST["dataPrint"];
- }
- }
- if(!$dataPrint){
- echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No se recibieron datos para imprimir', 'errores' => []]);
- exit;
- }
- if (!isset($dataPrint['impresos']) || empty($dataPrint['impresos'])) {
- echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No hay comandas para imprimir', 'errores' => []]);
- exit;
- }
- $impresos = $dataPrint['impresos'];
- $errores = array();
- $exitos = array();
- // Iterar sobre cada impresora/cocina
- foreach ($impresos as $nombreImpresora => $datosComanda) {
- try {
- // Crear connector según el nombre de la impresora
- $connector = new WindowsPrintConnector($nombreImpresora);
- $printer = new Printer($connector);
-
- // ENCABEZADO
- $printer->setJustification(Printer::JUSTIFY_CENTER);
- $printer->setTextSize(2, 2);
- $printer->text($datosComanda['cocina'] . "\n");
- $printer->setTextSize(1, 1);
- $printer->text(str_repeat("=", 45) . "\n");
- $printer->setEmphasis(true);
- $printer->text("ORDEN #" . (isset($datosComanda['num_orden']) ? $datosComanda['num_orden'] : $datosComanda['id_orden']) . "\n");
- $printer->setEmphasis(false);
- $printer->text(str_repeat("=", 45) . "\n");
-
- // INFORMACIÓN DE LA ORDEN
- $printer->setJustification(Printer::JUSTIFY_LEFT);
- $printer->setEmphasis(true);
- $printer->text("Fecha: ");
- $printer->setEmphasis(false);
- $printer->text(date('d/m/Y H:i', strtotime($datosComanda['fecha'])) . "\n");
-
-
- $printer->setEmphasis(true);
- $printer->text("Mesa: ");
- $printer->setEmphasis(false);
- $printer->text($datosComanda['mesa'] . "\n");
-
-
- $printer->setEmphasis(true);
- $printer->text("Mesero: ");
- $printer->setEmphasis(false);
- $printer->text($datosComanda['mesero'] . "\n");
-
- $printer->setEmphasis(true);
- $printer->text("Cliente: ");
- $printer->setEmphasis(false);
- $printer->text($datosComanda['cliente'] . "\n");
-
- $printer->setEmphasis(true);
- $printer->text("Servicio: ");
- $printer->setEmphasis(false);
- $printer->text($datosComanda['servicio'] . "\n");
-
- $printer->text(str_repeat("-", 45) . "\n");
-
- // PLATOS
- $printer->setEmphasis(true);
- $printer->text("PLATOS:\n");
- $printer->setEmphasis(false);
- $printer->text(str_repeat("-", 45) . "\n");
-
- foreach ($datosComanda['platos'] as $plato) {
- // $plato es un array con [cant, nombre, acompanamientos, notas, precio]
- $cant = $plato[0];
- $nombre = $plato[1];
- $acompanamientos = isset($plato[2]) ? $plato[2] : '';
- $notas = isset($plato[3]) ? $plato[3] : '';
- $precio = isset($plato[4]) ? $plato[4] : 0;
-
- // Cantidad, nombre y precio del plato con tamaño configurable
- global $TAMANO_LETRA_PLATOS;
- $tamano = getTamanoTexto($TAMANO_LETRA_PLATOS);
- $printer->setEmphasis(true);
- $printer->setTextSize($tamano[0], $tamano[1]);
- $printer->text(number_format($cant, 0) . "x " . $nombre . " - $" . number_format($precio, 2) . "\n");
- $printer->setEmphasis(false);
- $printer->setTextSize(1, 1);
-
- // Acompañamientos
- if (!empty($acompanamientos)) {
- $printer->text(" " . $acompanamientos . "\n");
- }
-
- // Notas del plato
- if (!empty($notas)) {
- $printer->text(" Notas: " . $notas . "\n");
- }
-
- $printer->text("\n");
- }
-
- $printer->text(str_repeat("=", 45) . "\n");
-
- // NOTAS GENERALES DE LA ORDEN
- if (!empty($datosComanda['notas'])) {
- global $TAMANO_LETRA_PLATOS;
- $tamano = getTamanoTexto($TAMANO_LETRA_PLATOS);
- $printer->text("\n");
- $printer->setEmphasis(true);
- $printer->setTextSize(1, 1);
- $printer->text("*** NOTAS ***\n");
- $printer->setEmphasis(false);
- $printer->setTextSize($tamano[0], $tamano[1]);
- $printer->text($datosComanda['notas'] . "\n");
- $printer->setTextSize(1, 1);
- $printer->text(str_repeat("=", 45) . "\n");
- }
-
- $printer->feed(3);
- $printer->cut();
- $printer->getPrintConnector()->write("\x1B\x42" . chr(4) . chr(1));
- $printer->close();
-
- $exitos[] = $nombreImpresora . " (" . $datosComanda['cocina'] . ")";
-
- } catch (Exception $e) {
- $errores[] = array(
- 'impresora' => $nombreImpresora,
- 'cocina' => isset($datosComanda['cocina']) ? $datosComanda['cocina'] : 'N/A',
- 'error' => $e->getMessage()
- );
- }
- }
- // Respuesta
- $response = array(
- 'success' => count($errores) == 0,
- 'status' => count($errores) == 0 ? 'success' : 'partial',
- 'exitos' => $exitos,
- 'errores' => $errores,
- 'total_impresos' => count($impresos),
- 'total_exitos' => count($exitos),
- 'total_errores' => count($errores),
- 'message' => count($errores) == 0
- ? 'Todas las comandas se imprimieron correctamente'
- : 'Algunas comandas no se pudieron imprimir'
- );
- echo json_encode($response);
|