comanda.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. <?php
  2. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  3. header("Access-Control-Allow-Origin: *");
  4. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
  5. header("Access-Control-Allow-Headers: Content-Type, Authorization, X-Requested-With");
  6. http_response_code(204);
  7. exit;
  8. }
  9. header("Access-Control-Allow-Origin: *");
  10. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE");
  11. header("Access-Control-Allow-Headers: Content-Type, Authorization");
  12. error_reporting(E_ALL);
  13. ini_set('display_errors', 0);
  14. ini_set('log_errors', 1);
  15. ini_set('error_log', 'logs/error.log');
  16. require __DIR__ . '/vendor/autoload.php';
  17. use Mike42\Escpos\Printer;
  18. use Mike42\Escpos\PrintConnectors\WindowsPrintConnector;
  19. use Mike42\Escpos\EscposImage;
  20. $dataComanda = json_decode($_POST["dataComanda"]);
  21. if($dataComanda){
  22. // Datos generales
  23. $fecha = $dataComanda->fecha;
  24. $numeroOrden = $dataComanda->numero_orden ?? "N/A";
  25. $mesa = $dataComanda->mesa ?? "N/A";
  26. $mesero = $dataComanda->mesero ?? "";
  27. $cliente = $dataComanda->cliente ?? "";
  28. $servicio = $dataComanda->servicio ?? "";
  29. $notas = $dataComanda->notas ?? "";
  30. $observaciones = $dataComanda->observaciones ?? "";
  31. // Productos agrupados por cocina
  32. $productosPorCocina = $dataComanda->productos_cocina; // Array de objetos con: cocina, impresor, ancho, productos[]
  33. $resultados = [];
  34. // Imprimir una comanda por cada cocina
  35. foreach ($productosPorCocina as $cocina) {
  36. try {
  37. $PRINTER_NAME = $cocina->impresor;
  38. $anchoPapel = intval($cocina->ancho_papel ?? 80);
  39. $maxCaracteres = ($anchoPapel == 80) ? 45 : 32; // Caracteres según ancho de papel
  40. $maxDescripcion = ($anchoPapel == 80) ? 28 : 20;
  41. $connector = new WindowsPrintConnector($PRINTER_NAME);
  42. $printer = new Printer($connector);
  43. // ENCABEZADO
  44. $printer->setJustification(Printer::JUSTIFY_CENTER);
  45. $printer->setTextSize(2, 2);
  46. $printer->text("COMANDA\n");
  47. $printer->setTextSize(1, 1);
  48. $printer->text(strtoupper($cocina->nombre_cocina) . "\n");
  49. $printer->text(str_repeat("=", $maxCaracteres) . "\n");
  50. // INFORMACIÓN DE LA ORDEN
  51. $printer->setJustification(Printer::JUSTIFY_LEFT);
  52. $printer->setEmphasis(true);
  53. $printer->text("Fecha: ");
  54. $printer->setEmphasis(false);
  55. $printer->text("$fecha\n");
  56. $printer->setEmphasis(true);
  57. $printer->text("Orden: ");
  58. $printer->setEmphasis(false);
  59. $printer->text("$numeroOrden");
  60. $printer->setEmphasis(true);
  61. $printer->text(" Mesa: ");
  62. $printer->setEmphasis(false);
  63. $printer->text("$mesa\n");
  64. if($mesero && $mesero != ""){
  65. $printer->setEmphasis(true);
  66. $printer->text("Mesero: ");
  67. $printer->setEmphasis(false);
  68. $printer->text("$mesero\n");
  69. }
  70. if($cliente && $cliente != ""){
  71. $printer->setEmphasis(true);
  72. $printer->text("Cliente: ");
  73. $printer->setEmphasis(false);
  74. $printer->text("$cliente\n");
  75. }
  76. if($servicio && $servicio != ""){
  77. $printer->setEmphasis(true);
  78. $printer->text("Servicio: ");
  79. $printer->setEmphasis(false);
  80. $printer->text("$servicio\n");
  81. }
  82. $printer->text(str_repeat("-", $maxCaracteres) . "\n");
  83. // PRODUCTOS
  84. $printer->setEmphasis(true);
  85. $printer->setTextSize(1, 1);
  86. $printer->text("Cant Descripcion\n");
  87. $printer->setEmphasis(false);
  88. $printer->text(str_repeat("-", $maxCaracteres) . "\n");
  89. foreach ($cocina->productos as $producto) {
  90. // Formatear cantidad
  91. $cantidad = str_pad(number_format($producto->cant, 2), 6, " ", STR_PAD_RIGHT);
  92. // Descripción del producto
  93. $descripcion = $producto->desc;
  94. $descripcionLineas = explode("\n", wordwrap($descripcion, $maxDescripcion, "\n", true));
  95. // Primera línea con cantidad
  96. $printer->setTextSize(1, 1);
  97. $printer->text("$cantidad " . $descripcionLineas[0] . "\n");
  98. // Líneas adicionales de descripción
  99. for ($i = 1; $i < count($descripcionLineas); $i++) {
  100. $printer->text(" " . $descripcionLineas[$i] . "\n");
  101. }
  102. // Acompañamientos si existen
  103. if (isset($producto->acompanamientos) && $producto->acompanamientos != "") {
  104. $printer->setEmphasis(true);
  105. $printer->text(" CON: ");
  106. $printer->setEmphasis(false);
  107. $printer->text($producto->acompanamientos . "\n");
  108. }
  109. // Notas del producto si existen
  110. if (isset($producto->notas) && $producto->notas != "") {
  111. $printer->setEmphasis(true);
  112. $printer->text(" NOTA: ");
  113. $printer->setEmphasis(false);
  114. $notasLineas = explode("\n", wordwrap($producto->notas, $maxDescripcion - 6, "\n", true));
  115. $printer->text($notasLineas[0] . "\n");
  116. for ($j = 1; $j < count($notasLineas); $j++) {
  117. $printer->text(" " . $notasLineas[$j] . "\n");
  118. }
  119. }
  120. $printer->text("\n");
  121. }
  122. $printer->text(str_repeat("=", $maxCaracteres) . "\n");
  123. // NOTAS GENERALES
  124. if($notas && $notas != ""){
  125. $printer->setEmphasis(true);
  126. $printer->text("NOTAS:\n");
  127. $printer->setEmphasis(false);
  128. $notasLineas = explode("\n", wordwrap($notas, $maxCaracteres, "\n", true));
  129. foreach($notasLineas as $linea){
  130. $printer->text($linea . "\n");
  131. }
  132. $printer->text("\n");
  133. }
  134. if($observaciones && $observaciones != ""){
  135. $printer->setEmphasis(true);
  136. $printer->text("OBSERVACIONES:\n");
  137. $printer->setEmphasis(false);
  138. $obsLineas = explode("\n", wordwrap($observaciones, $maxCaracteres, "\n", true));
  139. foreach($obsLineas as $linea){
  140. $printer->text($linea . "\n");
  141. }
  142. $printer->text("\n");
  143. }
  144. // PIE
  145. $printer->setJustification(Printer::JUSTIFY_CENTER);
  146. $printer->setTextSize(2, 2);
  147. $printer->text("PREPARAR\n");
  148. $printer->setTextSize(1, 1);
  149. $printer->text("Orden: $numeroOrden\n");
  150. // CORTAR PAPEL Y CERRAR IMPRESORA
  151. $printer->feed(3);
  152. $printer->cut();
  153. $printer->close();
  154. $resultados[] = [
  155. "cocina" => $cocina->nombre_cocina,
  156. "impresora" => $PRINTER_NAME,
  157. "status" => "success",
  158. "message" => "Comanda impresa correctamente"
  159. ];
  160. } catch (Exception $e) {
  161. $resultados[] = [
  162. "cocina" => $cocina->nombre_cocina ?? "Desconocida",
  163. "impresora" => $PRINTER_NAME ?? "Desconocida",
  164. "status" => "error",
  165. "message" => "Error al imprimir: " . $e->getMessage()
  166. ];
  167. }
  168. }
  169. // Verificar si todas las impresiones fueron exitosas
  170. $todosExitosos = true;
  171. foreach($resultados as $resultado){
  172. if($resultado["status"] != "success"){
  173. $todosExitosos = false;
  174. break;
  175. }
  176. }
  177. echo json_encode([
  178. "status" => $todosExitosos ? "success" : "partial",
  179. "message" => $todosExitosos ? "Todas las comandas impresas correctamente" : "Algunas comandas no se pudieron imprimir",
  180. "resultados" => $resultados
  181. ]);
  182. } else {
  183. echo json_encode([
  184. "status" => "error",
  185. "message" => "No se recibieron datos para imprimir comandas."
  186. ]);
  187. }
  188. ?>