comanda_express.php 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. // Recibir datos - puede venir como JSON string o como objeto serializado por jQuery
  21. $dataComanda = null;
  22. if(isset($_POST["dataComanda"])){
  23. if(is_string($_POST["dataComanda"])){
  24. $dataComanda = json_decode($_POST["dataComanda"]);
  25. } else {
  26. $dataComanda = json_decode(json_encode($_POST["dataComanda"]));
  27. }
  28. } elseif(isset($_POST["dataPrint"])){
  29. if(is_string($_POST["dataPrint"])){
  30. $dataComanda = json_decode($_POST["dataPrint"]);
  31. } else {
  32. $dataComanda = json_decode(json_encode($_POST["dataPrint"]));
  33. }
  34. }
  35. if($dataComanda){
  36. // Verificar si tiene productos_cocina ya generados
  37. if(isset($dataComanda->productos_cocina) && is_array($dataComanda->productos_cocina) && count($dataComanda->productos_cocina) > 0){
  38. $productosPorCocina = $dataComanda->productos_cocina;
  39. } else {
  40. // Si no tiene productos_cocina, retornar error silencioso (no hay nada que imprimir en cocina)
  41. echo json_encode(array('status' => 'success', 'message' => 'No hay productos para cocina'));
  42. exit;
  43. }
  44. // Datos generales
  45. $fecha = $dataComanda->fecha ?? date("d-m-Y H:i:s");
  46. $numeroOrden = $dataComanda->numero_orden ?? ($dataComanda->referencia ?? "N/A");
  47. // Extraer número de orden si viene con formato V-, C-, D-
  48. if(isset($numeroOrden) && is_string($numeroOrden)){
  49. $numeroOrden = str_replace(array("V-", "C-", "D-"), "", $numeroOrden);
  50. }
  51. $mesa = $dataComanda->mesa_orden ?? ($dataComanda->mesa ?? "N/A");
  52. $mesero = $dataComanda->mesero ?? ($dataComanda->vendedor ?? "");
  53. $cliente = $dataComanda->cliente ?? "";
  54. $servicio = $dataComanda->servicio ?? "";
  55. $notas = $dataComanda->notas ?? "";
  56. $observaciones = $dataComanda->observaciones ?? "";
  57. $resultados = [];
  58. // Imprimir una comanda por cada cocina
  59. foreach ($productosPorCocina as $cocina) {
  60. try {
  61. $PRINTER_NAME = $cocina->impresor;
  62. $anchoPapel = intval($cocina->ancho_papel ?? 80);
  63. $maxCaracteres = ($anchoPapel == 80) ? 45 : 32; // Caracteres según ancho de papel
  64. $maxDescripcion = ($anchoPapel == 80) ? 28 : 20;
  65. $connector = new WindowsPrintConnector($PRINTER_NAME);
  66. $printer = new Printer($connector);
  67. // ENCABEZADO
  68. $printer->setJustification(Printer::JUSTIFY_CENTER);
  69. $printer->setTextSize(2, 2);
  70. $printer->text("COMANDA\n");
  71. $printer->setTextSize(1, 1);
  72. $printer->text(strtoupper($cocina->nombre_cocina) . "\n");
  73. $printer->text(str_repeat("=", $maxCaracteres) . "\n");
  74. // INFORMACIÓN DE LA ORDEN
  75. $printer->setJustification(Printer::JUSTIFY_LEFT);
  76. $printer->setEmphasis(true);
  77. $printer->text("Fecha: ");
  78. $printer->setEmphasis(false);
  79. $printer->text("$fecha\n");
  80. $printer->setEmphasis(true);
  81. $printer->text("Orden: ");
  82. $printer->setEmphasis(false);
  83. $printer->text("$numeroOrden");
  84. $printer->setEmphasis(true);
  85. $printer->text(" Mesa: ");
  86. $printer->setEmphasis(false);
  87. $printer->text("$mesa\n");
  88. if($mesero && $mesero != ""){
  89. $printer->setEmphasis(true);
  90. $printer->text("Mesero: ");
  91. $printer->setEmphasis(false);
  92. $printer->text("$mesero\n");
  93. }
  94. if($cliente && $cliente != ""){
  95. $printer->setEmphasis(true);
  96. $printer->text("Cliente: ");
  97. $printer->setEmphasis(false);
  98. $printer->text("$cliente\n");
  99. }
  100. if($servicio && $servicio != ""){
  101. $printer->setEmphasis(true);
  102. $printer->text("Servicio: ");
  103. $printer->setEmphasis(false);
  104. $printer->text("$servicio\n");
  105. }
  106. $printer->text(str_repeat("-", $maxCaracteres) . "\n");
  107. // PRODUCTOS
  108. $printer->setEmphasis(true);
  109. $printer->setTextSize(1, 1);
  110. $printer->text("Cant Descripcion\n");
  111. $printer->setEmphasis(false);
  112. $printer->text(str_repeat("-", $maxCaracteres) . "\n");
  113. foreach ($cocina->productos as $producto) {
  114. // Formatear cantidad
  115. $cantidad = str_pad(number_format($producto->cant, 2), 6, " ", STR_PAD_RIGHT);
  116. // Descripción del producto
  117. $descripcion = $producto->desc;
  118. $descripcionLineas = explode("\n", wordwrap($descripcion, $maxDescripcion, "\n", true));
  119. // Primera línea con cantidad
  120. $printer->setTextSize(1, 1);
  121. $printer->text("$cantidad " . $descripcionLineas[0] . "\n");
  122. // Líneas adicionales de descripción
  123. for ($i = 1; $i < count($descripcionLineas); $i++) {
  124. $printer->text(" " . $descripcionLineas[$i] . "\n");
  125. }
  126. // Acompañamientos si existen
  127. if (isset($producto->acompanamientos) && $producto->acompanamientos != "") {
  128. $printer->setEmphasis(true);
  129. $printer->text(" CON: ");
  130. $printer->setEmphasis(false);
  131. $printer->text($producto->acompanamientos . "\n");
  132. }
  133. // Notas del producto si existen
  134. if (isset($producto->notas) && $producto->notas != "") {
  135. $printer->setEmphasis(true);
  136. $printer->text(" NOTA: ");
  137. $printer->setEmphasis(false);
  138. $notasLineas = explode("\n", wordwrap($producto->notas, $maxDescripcion - 6, "\n", true));
  139. $printer->text($notasLineas[0] . "\n");
  140. for ($j = 1; $j < count($notasLineas); $j++) {
  141. $printer->text(" " . $notasLineas[$j] . "\n");
  142. }
  143. }
  144. $printer->text("\n");
  145. }
  146. $printer->text(str_repeat("=", $maxCaracteres) . "\n");
  147. // NOTAS GENERALES
  148. if($notas && $notas != ""){
  149. $printer->setEmphasis(true);
  150. $printer->text("NOTAS:\n");
  151. $printer->setEmphasis(false);
  152. $notasLineas = explode("\n", wordwrap($notas, $maxCaracteres, "\n", true));
  153. foreach($notasLineas as $linea){
  154. $printer->text($linea . "\n");
  155. }
  156. $printer->text("\n");
  157. }
  158. if($observaciones && $observaciones != ""){
  159. $printer->setEmphasis(true);
  160. $printer->text("OBSERVACIONES:\n");
  161. $printer->setEmphasis(false);
  162. $obsLineas = explode("\n", wordwrap($observaciones, $maxCaracteres, "\n", true));
  163. foreach($obsLineas as $linea){
  164. $printer->text($linea . "\n");
  165. }
  166. $printer->text("\n");
  167. }
  168. // PIE
  169. $printer->setJustification(Printer::JUSTIFY_CENTER);
  170. $printer->setTextSize(2, 2);
  171. $printer->text("PREPARAR\n");
  172. $printer->setTextSize(1, 1);
  173. $printer->text("Orden: $numeroOrden\n");
  174. // CORTAR PAPEL Y CERRAR IMPRESORA
  175. $printer->feed(3);
  176. $printer->cut();
  177. $printer->close();
  178. $resultados[] = [
  179. "cocina" => $cocina->nombre_cocina,
  180. "impresora" => $PRINTER_NAME,
  181. "status" => "success",
  182. "message" => "Comanda impresa correctamente"
  183. ];
  184. } catch (Exception $e) {
  185. $resultados[] = [
  186. "cocina" => $cocina->nombre_cocina ?? "Desconocida",
  187. "impresora" => $PRINTER_NAME ?? "Desconocida",
  188. "status" => "error",
  189. "message" => "Error al imprimir: " . $e->getMessage()
  190. ];
  191. }
  192. }
  193. // Verificar si todas las impresiones fueron exitosas
  194. $todosExitosos = true;
  195. foreach($resultados as $resultado){
  196. if($resultado["status"] != "success"){
  197. $todosExitosos = false;
  198. break;
  199. }
  200. }
  201. echo json_encode([
  202. "status" => $todosExitosos ? "success" : "partial",
  203. "message" => $todosExitosos ? "Todas las comandas impresas correctamente" : "Algunas comandas no se pudieron imprimir",
  204. "resultados" => $resultados
  205. ]);
  206. } else {
  207. echo json_encode([
  208. "status" => "error",
  209. "message" => "No se recibieron datos para imprimir comandas."
  210. ]);
  211. }
  212. ?>