| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250 |
- <?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."
- ]);
- }
- ?>
|