> ## 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.

# Flux d'impression

> Comment les tâches sont transférées de Plato POS vers l'imprimante thermique.

# Flux d'impression

Le pilote d'imprimante PC revient intentionnellement rapidement de `/print`. Les E/S réelles de l'imprimante se produisent dans le programme de travail en arrière-plan de l'imprimante cible.

## Flux de bout en bout

1. La console Plato génère un reçu, un ticket ou un rapport dans un blob PNG.
2. L'adaptateur Console `WIN_DRIVER` convertit l'image en lignes raster noir/blanc.
3. Les lignes raster sont divisées en morceaux de 128 lignes.
4. Chaque morceau est codé en tant que commande raster ESC/POS et codé en base64.
5. La console envoie `POST /print` avec `ip_address`, `port` et `chunks`.
6. Le pilote encapsule les morceaux avec de petits délais, ajoute l'alimentation/la coupe et ajoute éventuellement des commandes sonores.
7. Le travail est ajouté à la file d'attente BullMQ de cette imprimante.
8. Le travailleur ouvre un socket TCP sur l'imprimante.
9. Le travailleur envoie l'initialisation ESC/POS, puis chaque morceau.
10. Le travailleur ferme la connexion de l'imprimante après le travail.

## Blocage de la console

L'adaptateur de console utilise :

| Paramètre                                   | Valeur       |
| ------------------------------------------- | ------------ |
| Type de pilote                              | `WIN_DRIVER` |
| Hauteur des fragments raster                | Lignes `128` |
| Délai d'expiration du statut                | `3000ms`     |
| Expiration du délai de demande d'impression | `5000ms`     |
| Expiration du délai du tiroir-caisse        | `3000ms`     |

Le navigateur envoie des morceaux raster déjà codés. Le pilote ne restitue pas le HTML.

## Emballage de fragments de pilotes

`receipt-encoder.ts` transforme les blocs entrants en blocs de tâches :

* Chaque morceau entrant est décodé en base64.
* Chaque morceau d'impression obtient `delayAfterMs: 25`.
* Une commande d'avance et de coupe partielle est annexée.
* Si `beep` est vrai, 18 commandes sonores sont ajoutées.
* Chaque morceau de bip a `delayAfterMs: 150`.

## Commandes ESC/POS

| Commande        | Octets                | But                                            |
| --------------- | --------------------- | ---------------------------------------------- |
| Initialiser     | `1B 40`               | Réinitialisez l'imprimante avant chaque tâche. |
| Image rastée    | `1D 76 30 00 ...`     | Envoyé par des morceaux de console.            |
| Alimentation    | `0A 0A 0A 0A`         | Nourrir avant de couper.                       |
| Coupe partielle | Généré par l'encodeur | Papier découpé partiellement.                  |
| Bip             | `1B 42 01 01`         | Commande bip répétée par le conducteur.        |
| Tiroir-caisse   | `1B 70 00 19 FA`      | Impulsion du tiroir.                           |

## Cycle de vie des sockets

Le travailleur actuel ouvre et ferme la connexion de l'imprimante pour chaque tâche.

| Constante                 | Valeur | But                                                         |
| ------------------------- | ------ | ----------------------------------------------------------- |
| `OPEN_ATTEMPT_TIMEOUT_MS` | `2000` | Temps maximum pour ouvrir le socket TCP.                    |
| `CONNECTION_COOLDOWN_MS`  | `250`  | Délai minimum après la fermeture avant une autre ouverture. |
| `CLOSE_TIMEOUT_MS`        | `250`  | Max attend une fermeture gracieuse avant de détruire.       |
| `WRITE_TIMEOUT_MS`        | `6000` | Temps maximum pour une écriture sur une socket.             |

Il existe également un minuteur de libération inactive de `3000ms`, mais le chemin de processus actuel ferme la connexion immédiatement après chaque tâche réussie.

## Chemin d'échec

Si l'ouverture ou l'écriture échoue :

1. L'imprimante est marquée `offline`.
2. La douille est libérée/détruite.
3. Le travail BullMQ échoue.
4. BullMQ réessaye après `queue.retryDelayMs`.
5. Lorsque l'imprimante est à nouveau atteinte, les travaux de nouvelle tentative différée sont promus, à moins qu'ils ne soient intentionnellement planifiés avec un futur `runAt`.

## Sondage d'état

`POST /status` peut sonder l'imprimante uniquement lorsque le travail en file d'attente n'est pas actif. Cela évite d'ouvrir une prise de sonde alors que la même imprimante est en train d'imprimer.
