> Source: https://fiscal.link/integrators/docs/migrate
> Aplicația FiscalLink citește aceleași foldere FiscalNet și Fisco și ascultă pe aceeași interfață Fisco, pe desktop. Programul tău nu se schimbă.

Migrare

# Treci de pe FiscalNet sau Fisco, fără schimbări în programul tău.

Aplicația FiscalLink citește aceleași foldere și ascultă pe aceeași interfață Fisco, pe desktop. Toate intrările vechi tipăresc prin același traseu ca restul aplicației.

## Ce rămâne la fel

Programul scris pentru driverele vechi merge neschimbat prin patru intrări:

| Intrare | Cum lucrează |
| --- | --- |
| Folderul FiscalNet | Scrii fișierul în `Bonuri`, răspunsul apare în `Raspuns`, pe trei rânduri: `BONOK=1` sau `BONOK=0`, numărul bonului sau codul erorii, detaliul. Prefixele `nf_*` (bon nefiscal) și `display_*` (afișaj client) aleg tipul lucrării. |
| Folderul Fisco | Folderul scanat, cu `BonOK`, `BonANSWER` și `BonERR`. |
| API-ul Fisco | `/api/v1/print`, `/validate`, `/status`, `/health`, `/last-receipt`. |
| `POST /api/Receipt` | Ruta veche FiscalNet / INP a API-ului local, neschimbată. |

## Ce instalezi

1.  Aplicația FiscalLink pe același calculator, cu Windows, macOS sau Linux. Folderele merg doar pe desktop.
2.  O licență pe casă și dispozitivul autorizat: fără ele, fiecare lucrare e refuzată (`LICENSE_REQUIRED`, `DEVICE_AUTHORIZATION_REQUIRED`). Pașii clientului: /app/docs.
3.  La o instalare nouă, aplicația pornește singură API-ul Fisco (doar pe acest calculator) și preia sau creează folderul `~/FiscalLink`. La o actualizare de la versiunea 2.2.1 le lasă oprite și ți le oferă în setări.
4.  Oprește driverul vechi. Dacă găsește un driver concurent pornit (`Fisco`, `FiscoDriver`, `EcmFiscalNet`, `FiscalNet`, `DriverFiscal`) sau portul 4040 ocupat, aplicația nu preia nimic și îți spune de ce. Două drivere pe aceeași casă tipăresc aceeași vânzare de două ori.
5.  Fișierele care erau deja în folder când îl preia aplicația nu se tipăresc: se mută în `Preluate-la-activare`.

## Folderele

-   Un fișier fără linie de plată e refuzat: într-un fișier, o plată lipsă e semnul unei scrieri întrerupte.
-   O linie de raport trebuie să fie singura comandă din fișier.
-   Sumele INP cu virgulă zecimală sunt refuzate.
-   Codurile de plată trec printr-o hartă a instalării, care implicit le lasă neschimbate. Pe o casă Daisy, fișierele care numerotează plățile ca Datecs sunt traduse, dacă nu ai configurat altă hartă.
-   Fișierul cu totalurile zilei (`Z.txt` / `X.txt`) se scrie pentru fiecare raport, din orice intrare, când e configurat un folder pentru el.

## API-ul Fisco

-   Ascultă pe portul 4040, doar pe acest calculator, deci un POS setat pe `localhost:4040` se conectează. Ascultarea pe toate interfețele (pentru tablete) se pornește explicit, cu avertisment. Dacă portul e ocupat, de exemplu de driverul vechi, API-ul rămâne oprit, iar Starea arată „Port ocupat”.
-   Refuză paginile web (`403`, antetul `Origin`), în afară de un POS din browser servit de pe același calculator (`localhost` sau o adresă loopback).
-   `/print` și `/validate` primesc doar `application/json`; altfel `415`.
-   `/api/v1/health` arată separat dacă e conectată casa, dacă are licență și dacă dispozitivul e autorizat.
-   Un `external_id` se tipărește cel mult o dată, chiar și după o repornire. Un `external_id` a cărui lucrare sigur nu a tipărit nimic se poate trimite din nou; unul cu rezultat necunoscut rămâne folosit.

## Ruta `/api/Receipt`

POST `/api/Receipt`

### Tipărește un bon în format FiscalNet sau INP

Primește un șir JSON de linii de comandă. Formatul se detectează singur: FiscalNet folosește `^`, INP folosește `,` și `;`.

Răspunde mereu HTTP `200`; rezultatul e în `ReceiptStatus` (`"true"` sau `"false"`), cu șiruri goale în loc de `null`. O vânzare fără linie de plată se achită în numerar.

#### FiscalNet

```json
[
  "S^Espresso^1000^1000^pcs^1^1",
  "ST^",
  "P^1^1000"
]
```

#### INP

```json
[
  "S,1,______,_,__;Espresso;10.00;1.000;1;1;2;0;0;pcs",
  "T,1,______,_,__;0;10.00;;;;"
]
```

#### Răspuns

```json
{
  "ReceiptStatus": "true",
  "ReceiptNumber": "12345",
  "ErrorCode": "",
  "ErrorInfo": ""
}
```

```json
{
  "ReceiptStatus": "false",
  "ReceiptNumber": "",
  "ErrorCode": "123",
  "ErrorInfo": "<error text>"
}
```
