comanda_movil.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. /**
  3. * Archivo para imprimir comandas desde app móvil
  4. * Recibe datos vía POST y los distribuye a las impresoras según cocina
  5. * Usa librería: mike42/escpos-php
  6. */
  7. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  8. header("Access-Control-Allow-Origin: *");
  9. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
  10. header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
  11. http_response_code(204);
  12. exit;
  13. }
  14. header("Access-Control-Allow-Origin: *");
  15. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
  16. header("Access-Control-Allow-Headers: Content-Type, Authorization");
  17. header('Content-Type: application/json; charset=utf-8');
  18. error_reporting(E_ALL);
  19. ini_set('display_errors', 0);
  20. ini_set('log_errors', 1);
  21. ini_set('error_log', 'logs/error.log');
  22. require __DIR__ . '/../vendor/autoload.php';
  23. use Mike42\Escpos\Printer;
  24. use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
  25. // ===================================================================
  26. // CONFIGURACIÓN: Tamaño de letra para nombres de platos
  27. // ===================================================================
  28. // Cambia este valor para ajustar el tamaño de letra de los platos:
  29. // 14 o menos = Normal (1x1) - tamaño estándar
  30. // 15-16 = Altura doble (1x2) - más alto
  31. // 17-18 = Ancho doble (2x1) - más ancho
  32. // 19+ = Doble completo (2x2) - más grande
  33. // ===================================================================
  34. $TAMANO_LETRA_PLATOS = 14;
  35. /**
  36. * Función helper para convertir el tamaño numérico a valores de impresora
  37. * @param int $size Tamaño configurado (14, 16, 18, etc.)
  38. * @return array [ancho, alto] para setTextSize()
  39. */
  40. function getTamanoTexto($size) {
  41. if ($size <= 14) return array(1, 1); // Normal
  42. if ($size <= 16) return array(1, 2); // Altura doble
  43. if ($size <= 18) return array(2, 1); // Ancho doble
  44. return array(2, 2); // Doble completo
  45. }
  46. // Recibir datos
  47. $dataPrint = null;
  48. if(isset($_POST["dataPrint"])){
  49. if(is_string($_POST["dataPrint"])){
  50. $dataPrint = json_decode($_POST["dataPrint"], true);
  51. } else {
  52. $dataPrint = $_POST["dataPrint"];
  53. }
  54. }
  55. if(!$dataPrint){
  56. echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No se recibieron datos para imprimir', 'errores' => []]);
  57. exit;
  58. }
  59. if (!isset($dataPrint['impresos']) || empty($dataPrint['impresos'])) {
  60. echo json_encode(['success' => false, 'status' => 'error', 'message' => 'No hay comandas para imprimir', 'errores' => []]);
  61. exit;
  62. }
  63. $impresos = $dataPrint['impresos'];
  64. $errores = array();
  65. $exitos = array();
  66. // Iterar sobre cada impresora/cocina
  67. foreach ($impresos as $nombreImpresora => $datosComanda) {
  68. try {
  69. // Crear connector según el nombre de la impresora
  70. $connector = new WindowsPrintConnector($nombreImpresora);
  71. $printer = new Printer($connector);
  72. // ENCABEZADO
  73. $printer->setJustification(Printer::JUSTIFY_CENTER);
  74. $printer->setTextSize(2, 2);
  75. $printer->text($datosComanda['cocina'] . "\n");
  76. $printer->setTextSize(1, 1);
  77. $printer->text(str_repeat("=", 45) . "\n");
  78. $printer->setEmphasis(true);
  79. $printer->text("ORDEN #" . (isset($datosComanda['num_orden']) ? $datosComanda['num_orden'] : $datosComanda['id_orden']) . "\n");
  80. $printer->setEmphasis(false);
  81. $printer->text(str_repeat("=", 45) . "\n");
  82. // INFORMACIÓN DE LA ORDEN
  83. $printer->setJustification(Printer::JUSTIFY_LEFT);
  84. $printer->setEmphasis(true);
  85. $printer->text("Fecha: ");
  86. $printer->setEmphasis(false);
  87. $printer->text(date('d/m/Y H:i', strtotime($datosComanda['fecha'])) . "\n");
  88. $printer->setEmphasis(true);
  89. $printer->text("Mesa: ");
  90. $printer->setEmphasis(false);
  91. $printer->text($datosComanda['mesa'] . "\n");
  92. $printer->setEmphasis(true);
  93. $printer->text("Mesero: ");
  94. $printer->setEmphasis(false);
  95. $printer->text($datosComanda['mesero'] . "\n");
  96. $printer->setEmphasis(true);
  97. $printer->text("Cliente: ");
  98. $printer->setEmphasis(false);
  99. $printer->text($datosComanda['cliente'] . "\n");
  100. $printer->setEmphasis(true);
  101. $printer->text("Servicio: ");
  102. $printer->setEmphasis(false);
  103. $printer->text($datosComanda['servicio'] . "\n");
  104. $printer->text(str_repeat("-", 45) . "\n");
  105. // PLATOS
  106. $printer->setEmphasis(true);
  107. $printer->text("PLATOS:\n");
  108. $printer->setEmphasis(false);
  109. $printer->text(str_repeat("-", 45) . "\n");
  110. foreach ($datosComanda['platos'] as $plato) {
  111. // $plato es un array con [cant, nombre, acompanamientos, notas, precio]
  112. $cant = $plato[0];
  113. $nombre = $plato[1];
  114. $acompanamientos = isset($plato[2]) ? $plato[2] : '';
  115. $notas = isset($plato[3]) ? $plato[3] : '';
  116. $precio = isset($plato[4]) ? $plato[4] : 0;
  117. // Cantidad, nombre y precio del plato con tamaño configurable
  118. global $TAMANO_LETRA_PLATOS;
  119. $tamano = getTamanoTexto($TAMANO_LETRA_PLATOS);
  120. $printer->setEmphasis(true);
  121. $printer->setTextSize($tamano[0], $tamano[1]);
  122. $printer->text(number_format($cant, 0) . "x " . $nombre . " - $" . number_format($precio, 2) . "\n");
  123. $printer->setEmphasis(false);
  124. $printer->setTextSize(1, 1);
  125. // Acompañamientos
  126. if (!empty($acompanamientos)) {
  127. $printer->text(" " . $acompanamientos . "\n");
  128. }
  129. // Notas del plato
  130. if (!empty($notas)) {
  131. $printer->text(" Notas: " . $notas . "\n");
  132. }
  133. $printer->text("\n");
  134. }
  135. $printer->text(str_repeat("=", 45) . "\n");
  136. // NOTAS GENERALES DE LA ORDEN
  137. if (!empty($datosComanda['notas'])) {
  138. global $TAMANO_LETRA_PLATOS;
  139. $tamano = getTamanoTexto($TAMANO_LETRA_PLATOS);
  140. $printer->text("\n");
  141. $printer->setEmphasis(true);
  142. $printer->setTextSize(1, 1);
  143. $printer->text("*** NOTAS ***\n");
  144. $printer->setEmphasis(false);
  145. $printer->setTextSize($tamano[0], $tamano[1]);
  146. $printer->text($datosComanda['notas'] . "\n");
  147. $printer->setTextSize(1, 1);
  148. $printer->text(str_repeat("=", 45) . "\n");
  149. }
  150. $printer->feed(3);
  151. $printer->cut();
  152. $printer->getPrintConnector()->write("\x1B\x42" . chr(4) . chr(1));
  153. $printer->close();
  154. $exitos[] = $nombreImpresora . " (" . $datosComanda['cocina'] . ")";
  155. } catch (Exception $e) {
  156. $errores[] = array(
  157. 'impresora' => $nombreImpresora,
  158. 'cocina' => isset($datosComanda['cocina']) ? $datosComanda['cocina'] : 'N/A',
  159. 'error' => $e->getMessage()
  160. );
  161. }
  162. }
  163. // Respuesta
  164. $response = array(
  165. 'success' => count($errores) == 0,
  166. 'status' => count($errores) == 0 ? 'success' : 'partial',
  167. 'exitos' => $exitos,
  168. 'errores' => $errores,
  169. 'total_impresos' => count($impresos),
  170. 'total_exitos' => count($exitos),
  171. 'total_errores' => count($errores),
  172. 'message' => count($errores) == 0
  173. ? 'Todas las comandas se imprimieron correctamente'
  174. : 'Algunas comandas no se pudieron imprimir'
  175. );
  176. echo json_encode($response);