> ## Documentation Index
> Fetch the complete documentation index at: https://docs.plato.ae/llms.txt
> Use this file to discover all available pages before exploring further.

# Yazdırma Akışı

> İşler Plato POS'den termal yazıcıya nasıl taşınır?

# Yazdırma Akışı

PC yazıcı sürücüsü kasıtlı olarak `/print`'den hızlı bir şekilde geri dönüyor. Gerçek yazıcı G/Ç'si, hedef yazıcının arka plan çalışanında gerçekleşir.

## Uçtan Uca Akış

1. Plato Konsolu bir PNG blobuna makbuz, bilet veya rapor işler.
2. Konsol `WIN_DRIVER` bağdaştırıcısı görüntüyü siyah/beyaz tarama satırlarına dönüştürür.
3. Raster satırları 128 satırlık parçalara bölünmüştür.
4. Her parça bir ESC/POS raster komutu olarak kodlanır ve base64 olarak kodlanır.
5. Konsol, `ip_address`, `port` ve `chunks` ile `POST /print`'yi gönderir.
6. Sürücü parçaları küçük gecikmelerle sarar, besleme/kesme ekler ve isteğe bağlı olarak bip sesi komutları ekler.
7. İş, söz konusu yazıcının BullMQ kuyruğuna eklenir.
8. Çalışan yazıcıya bir TCP yuvası açar.
9. Çalışan ESC/POS başlatmayı ve ardından her parçayı gönderir.
10. İşçi işten sonra yazıcı bağlantısını kapatır.

## Konsol Parçalama

Konsol adaptörü şunları kullanır:

| Ayar                        | Değer          |
| --------------------------- | -------------- |
| Sürücü türü                 | `WIN_DRIVER`   |
| Raster yığın yüksekliği     | `128` satırlar |
| Durum zaman aşımı           | `3000ms`       |
| Yazdırma isteği zaman aşımı | `5000ms`       |
| Nakit çekmece zaman aşımı   | `3000ms`       |

Tarayıcı önceden kodlanmış tarama parçaları gönderir. Sürücü HTML oluşturmuyor.

## Sürücü Parçası Sarma

`receipt-encoder.ts`, gelen parçaları iş parçalarına dönüştürür:

* Gelen her parçanın kodu base64'ten çözülür.
* Her yazdırma parçası `delayAfterMs: 25` alır.
* Bir besleme ve kısmi kesme komutu eklenir.
* `beep` doğruysa 18 bip komutu eklenir.
* Her bip sesi parçasında `delayAfterMs: 150` bulunur.

## ESC/POS Komutları

| Emretmek             | Bayt                             | Amaç                                      |
| -------------------- | -------------------------------- | ----------------------------------------- |
| Başlat               | `1B 40`                          | Her işten önce yazıcıyı sıfırlayın.       |
| Taramalı görüntü     | `1D 76 30 00 ...`                | Konsol parçaları tarafından gönderildi.   |
| Beslemek             | `0A 0A 0A 0A`                    | Kesmeden önce besleyin.                   |
| Kısmi kesim          | Kodlayıcı tarafından oluşturulan | Kısmi kağıt kesiği.                       |
| Bip sesi             | `1B 42 01 01`                    | Sürücü tarafından tekrarlanan bip komutu. |
| Yazar kasa çekmecesi | `1B 70 00 19 FA`                 | Çekmece darbesini vurun.                  |

## Soket Yaşam Döngüsü

Geçerli çalışan her iş için yazıcı bağlantısını açar ve kapatır.

| Devamlı                   | Değer  | Amaç                                                         |
| ------------------------- | ------ | ------------------------------------------------------------ |
| `OPEN_ATTEMPT_TIMEOUT_MS` | `2000` | TCP soketini açmak için maksimum süre.                       |
| `CONNECTION_COOLDOWN_MS`  | `250`  | Başka bir açılmadan önce kapanıştan sonraki minimum gecikme. |
| `CLOSE_TIMEOUT_MS`        | `250`  | Max yok etmeden önce zarif bir şekilde kapanmayı bekle.      |
| `WRITE_TIMEOUT_MS`        | `6000` | Bir sokete yazma için maksimum süre.                         |

Ayrıca `3000ms`'nin boşta bırakma zamanlayıcısı da vardır, ancak mevcut süreç yolu, her başarılı işin hemen ardından bağlantıyı kapatır.

## Arıza Yolu

Açma veya yazma başarısız olursa:

1. Yazıcı `offline` olarak işaretlenmiştir.
2. Soket serbest bırakılır/yok edilir.
3. BullMQ işi başarısız oluyor.
4. BullMQ, `queue.retryDelayMs`'den sonra yeniden dener.
5. Yazıcıya tekrar ulaşıldığında, gelecekteki bir `runAt` ile kasıtlı olarak planlanmadıkları sürece, gecikmeli yeniden deneme işleri yükseltilir.

## Durum Araştırması

`POST /status` yazıcıyı yalnızca kuyruk çalışması etkin olmadığında araştırabilir. Bu, aynı yazıcı yazdırma işlemiyle meşgulken prob yuvasının açılmasını önler.
