QZ Laravel
========

Paquete de laravel para el manejo de la API de QZ Tray.

Permite la impresión silencionas de etiquetas y tickets desde el navegador.

## Instalación

```bash
    composer require sideso/qz-laravel

    php artisan vendor:publish --provider="Sideso\QzLaravel\QzLaravelServiceProvider"
```

## Configuración

Para la impresión silenciosa es indispensable agregar en las variables de entorno el par de claves de encriptación

```bash
    QZ_PRIV_KEY=
    QZ_PRIV_KEY_PASS=
    QZ_PUBLIC_KEY=
```

## Uso

### Diseño del ticket

1. Construya la impresión línea a línea con la ayuda del paquete [Mike42\Escpos](https://github.com/mike42/escpos-php)

```php
    $printer = new QzPrinter();
    $printer->initialize();
    $printer->feed();
    $printer->textRaw("esdrújula");
    $printer->feed();
    $printer->feed();
    $printer->setJustification(QzPrinter::JUSTIFY_CENTER);
    $printer->setTextSize(2, 2);
    $printer->text($appointment->service->site->name);
    $printer->feed();
    $printer->feed();
    $printer->feed();
    $printer->setTextSize(8, 8);
    $printer->text($appointment->service->prefix . $appointment->number);
    $printer->feed();
    $printer->selectPrintMode();
    $printer->feed();
    $printer->setJustification(QzPrinter::JUSTIFY_LEFT);
    $printer->text($appointment->service->name);
    $printer->feed();
    $printer->text(date("Y-m-d G:i:s"));
    $printer->feed();
    $printer->feed();
    $printer->feed();
    $printer->cut();


    return $printer->getJsonData();
```

Importante: Ya que lo anterior genera un array con caracteres de control, se debe convertir a una cadena de texto con el método `getJsonData()` que asegura el manejo correcto de los caracteres especiales.

2. Integración javascript

Utilice el componente de blade `x-qztray::scripts` para cargar el script de QZ Tray en la vista.

```html
    <x-qztray::scripts />
```

Una vez el documento esté listo, podría imprimir el ticket con el siguiente código:	

```html
    <script>
        $( document ).ready(function() {
            let printer="POS-58";
            let printData = {!! $JsonTicket !!};
            printFromData(printData, printer);
        });
    </script>
```

Si prefiere obtener la data de impresión vía ajax, puede hacerlo de la siguiente manera:

```php
    <script>
        $( document ).ready(function() {
            let printer="POS-58";
            printFromUrl('{{ route('print.appointment', $appointment->id) }}', printer);
        });
    </script>
```

Para utilizar acentos y otros caracteres especiales, es necesario utilizar la función `txtRaw` del objeto printer.

```php
    $printer->textRaw("esdrújula");
```