|
|
@@ -0,0 +1,250 @@
|
|
|
+<?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");
|
|
|
+
|
|
|
+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;
|
|
|
+use Mike42\Escpos\EscposImage;
|
|
|
+
|
|
|
+// Recibir datos - puede venir como JSON string o como objeto serializado por jQuery
|
|
|
+$dataComanda = null;
|
|
|
+
|
|
|
+if(isset($_POST["dataComanda"])){
|
|
|
+ if(is_string($_POST["dataComanda"])){
|
|
|
+ $dataComanda = json_decode($_POST["dataComanda"]);
|
|
|
+ } else {
|
|
|
+ $dataComanda = json_decode(json_encode($_POST["dataComanda"]));
|
|
|
+ }
|
|
|
+} elseif(isset($_POST["dataPrint"])){
|
|
|
+ if(is_string($_POST["dataPrint"])){
|
|
|
+ $dataComanda = json_decode($_POST["dataPrint"]);
|
|
|
+ } else {
|
|
|
+ $dataComanda = json_decode(json_encode($_POST["dataPrint"]));
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+if($dataComanda){
|
|
|
+ // Verificar si tiene productos_cocina ya generados
|
|
|
+ if(isset($dataComanda->productos_cocina) && is_array($dataComanda->productos_cocina) && count($dataComanda->productos_cocina) > 0){
|
|
|
+ $productosPorCocina = $dataComanda->productos_cocina;
|
|
|
+ } else {
|
|
|
+ // Si no tiene productos_cocina, retornar error silencioso (no hay nada que imprimir en cocina)
|
|
|
+ echo json_encode(array('status' => 'success', 'message' => 'No hay productos para cocina'));
|
|
|
+ exit;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Datos generales
|
|
|
+ $fecha = $dataComanda->fecha ?? date("d-m-Y H:i:s");
|
|
|
+ $numeroOrden = $dataComanda->numero_orden ?? ($dataComanda->referencia ?? "N/A");
|
|
|
+
|
|
|
+ // Extraer número de orden si viene con formato V-, C-, D-
|
|
|
+ if(isset($numeroOrden) && is_string($numeroOrden)){
|
|
|
+ $numeroOrden = str_replace(array("V-", "C-", "D-"), "", $numeroOrden);
|
|
|
+ }
|
|
|
+
|
|
|
+ $mesa = $dataComanda->mesa_orden ?? ($dataComanda->mesa ?? "N/A");
|
|
|
+ $mesero = $dataComanda->mesero ?? ($dataComanda->vendedor ?? "");
|
|
|
+ $cliente = $dataComanda->cliente ?? "";
|
|
|
+ $servicio = $dataComanda->servicio ?? "";
|
|
|
+ $notas = $dataComanda->notas ?? "";
|
|
|
+ $observaciones = $dataComanda->observaciones ?? "";
|
|
|
+
|
|
|
+ $resultados = [];
|
|
|
+
|
|
|
+ // Imprimir una comanda por cada cocina
|
|
|
+ foreach ($productosPorCocina as $cocina) {
|
|
|
+ try {
|
|
|
+ $PRINTER_NAME = $cocina->impresor;
|
|
|
+ $anchoPapel = intval($cocina->ancho_papel ?? 80);
|
|
|
+ $maxCaracteres = ($anchoPapel == 80) ? 45 : 32; // Caracteres según ancho de papel
|
|
|
+ $maxDescripcion = ($anchoPapel == 80) ? 28 : 20;
|
|
|
+
|
|
|
+ $connector = new WindowsPrintConnector($PRINTER_NAME);
|
|
|
+ $printer = new Printer($connector);
|
|
|
+
|
|
|
+ // ENCABEZADO
|
|
|
+ $printer->setJustification(Printer::JUSTIFY_CENTER);
|
|
|
+ $printer->setTextSize(2, 2);
|
|
|
+ $printer->text("COMANDA\n");
|
|
|
+ $printer->setTextSize(1, 1);
|
|
|
+ $printer->text(strtoupper($cocina->nombre_cocina) . "\n");
|
|
|
+ $printer->text(str_repeat("=", $maxCaracteres) . "\n");
|
|
|
+
|
|
|
+ // INFORMACIÓN DE LA ORDEN
|
|
|
+ $printer->setJustification(Printer::JUSTIFY_LEFT);
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("Fecha: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$fecha\n");
|
|
|
+
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("Orden: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$numeroOrden");
|
|
|
+
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text(" Mesa: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$mesa\n");
|
|
|
+
|
|
|
+ if($mesero && $mesero != ""){
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("Mesero: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$mesero\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if($cliente && $cliente != ""){
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("Cliente: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$cliente\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if($servicio && $servicio != ""){
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("Servicio: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text("$servicio\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ $printer->text(str_repeat("-", $maxCaracteres) . "\n");
|
|
|
+
|
|
|
+ // PRODUCTOS
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->setTextSize(1, 1);
|
|
|
+ $printer->text("Cant Descripcion\n");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text(str_repeat("-", $maxCaracteres) . "\n");
|
|
|
+
|
|
|
+ foreach ($cocina->productos as $producto) {
|
|
|
+ // Formatear cantidad
|
|
|
+ $cantidad = str_pad(number_format($producto->cant, 2), 6, " ", STR_PAD_RIGHT);
|
|
|
+
|
|
|
+ // Descripción del producto
|
|
|
+ $descripcion = $producto->desc;
|
|
|
+ $descripcionLineas = explode("\n", wordwrap($descripcion, $maxDescripcion, "\n", true));
|
|
|
+
|
|
|
+ // Primera línea con cantidad
|
|
|
+ $printer->setTextSize(1, 1);
|
|
|
+ $printer->text("$cantidad " . $descripcionLineas[0] . "\n");
|
|
|
+
|
|
|
+ // Líneas adicionales de descripción
|
|
|
+ for ($i = 1; $i < count($descripcionLineas); $i++) {
|
|
|
+ $printer->text(" " . $descripcionLineas[$i] . "\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ // Acompañamientos si existen
|
|
|
+ if (isset($producto->acompanamientos) && $producto->acompanamientos != "") {
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text(" CON: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $printer->text($producto->acompanamientos . "\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ // Notas del producto si existen
|
|
|
+ if (isset($producto->notas) && $producto->notas != "") {
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text(" NOTA: ");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $notasLineas = explode("\n", wordwrap($producto->notas, $maxDescripcion - 6, "\n", true));
|
|
|
+ $printer->text($notasLineas[0] . "\n");
|
|
|
+ for ($j = 1; $j < count($notasLineas); $j++) {
|
|
|
+ $printer->text(" " . $notasLineas[$j] . "\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ $printer->text("\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ $printer->text(str_repeat("=", $maxCaracteres) . "\n");
|
|
|
+
|
|
|
+ // NOTAS GENERALES
|
|
|
+ if($notas && $notas != ""){
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("NOTAS:\n");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $notasLineas = explode("\n", wordwrap($notas, $maxCaracteres, "\n", true));
|
|
|
+ foreach($notasLineas as $linea){
|
|
|
+ $printer->text($linea . "\n");
|
|
|
+ }
|
|
|
+ $printer->text("\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ if($observaciones && $observaciones != ""){
|
|
|
+ $printer->setEmphasis(true);
|
|
|
+ $printer->text("OBSERVACIONES:\n");
|
|
|
+ $printer->setEmphasis(false);
|
|
|
+ $obsLineas = explode("\n", wordwrap($observaciones, $maxCaracteres, "\n", true));
|
|
|
+ foreach($obsLineas as $linea){
|
|
|
+ $printer->text($linea . "\n");
|
|
|
+ }
|
|
|
+ $printer->text("\n");
|
|
|
+ }
|
|
|
+
|
|
|
+ // PIE
|
|
|
+ $printer->setJustification(Printer::JUSTIFY_CENTER);
|
|
|
+ $printer->setTextSize(2, 2);
|
|
|
+ $printer->text("PREPARAR\n");
|
|
|
+ $printer->setTextSize(1, 1);
|
|
|
+ $printer->text("Orden: $numeroOrden\n");
|
|
|
+
|
|
|
+ // CORTAR PAPEL Y CERRAR IMPRESORA
|
|
|
+ $printer->feed(3);
|
|
|
+ $printer->cut();
|
|
|
+ $printer->close();
|
|
|
+
|
|
|
+ $resultados[] = [
|
|
|
+ "cocina" => $cocina->nombre_cocina,
|
|
|
+ "impresora" => $PRINTER_NAME,
|
|
|
+ "status" => "success",
|
|
|
+ "message" => "Comanda impresa correctamente"
|
|
|
+ ];
|
|
|
+
|
|
|
+ } catch (Exception $e) {
|
|
|
+ $resultados[] = [
|
|
|
+ "cocina" => $cocina->nombre_cocina ?? "Desconocida",
|
|
|
+ "impresora" => $PRINTER_NAME ?? "Desconocida",
|
|
|
+ "status" => "error",
|
|
|
+ "message" => "Error al imprimir: " . $e->getMessage()
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // Verificar si todas las impresiones fueron exitosas
|
|
|
+ $todosExitosos = true;
|
|
|
+ foreach($resultados as $resultado){
|
|
|
+ if($resultado["status"] != "success"){
|
|
|
+ $todosExitosos = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ echo json_encode([
|
|
|
+ "status" => $todosExitosos ? "success" : "partial",
|
|
|
+ "message" => $todosExitosos ? "Todas las comandas impresas correctamente" : "Algunas comandas no se pudieron imprimir",
|
|
|
+ "resultados" => $resultados
|
|
|
+ ]);
|
|
|
+
|
|
|
+} else {
|
|
|
+ echo json_encode([
|
|
|
+ "status" => "error",
|
|
|
+ "message" => "No se recibieron datos para imprimir comandas."
|
|
|
+ ]);
|
|
|
+}
|
|
|
+?>
|