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->getPrintConnector()->write("\x1B\x42" . chr(4) . chr(1)); $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." ]); } ?>