{
  "info": {
    "_postman_id": "5ecf89b2-0a0d-4f4d-bf8a-8c5ebc3f7d22",
    "name": "WeBill API v6",
    "description": "API-ul v6 WeBill permite unei aplicații externe (magazin online, ERP, CRM, aplicație de pontaj) să emită și să gestioneze facturi fiscale, proforme, încasări, stornări, clienți și pontaje în contul unei companii WeBill și să citească datele companiei.\n\n## Pornire rapidă\n\n1. În WeBill, la **Setări companie > API**: copiază **Client ID** (login-ul contului care deține compania) și **ID companie**, apoi generează **Secretul API** (se afișează o singură dată; fiecare companie are secretul ei).\n2. În Postman, importă colecția și fișierul de mediu `webident-crm-api-v6.postman_environment.json` (sau creează un Environment cu variabilele de mai jos) și completează `base_url`, `api_user`, `api_secret` și, dacă ai mai multe companii, `company_id`.\n3. Rulează **Autentificare > Obținere token**: tokenul se salvează automat în `api_token` și este folosit de toate celelalte cereri (autentificarea Bearer e setată la nivel de colecție).\n4. Rulează **Nomenclatoare > Facturi**: completează automat `serie_id`, `receipt_serie_id`, `delegate_id` și `bank_id` cu valorile marcate „Implicit” în Setări, altfel primele active.\n5. Cererile din fiecare folder pot fi rulate de sus în jos (Collection Runner): fiecare cerere care creează ceva salvează ID-ul în Environment pentru cererile următoare.\n\n> ⚠️ Cererile emit documente fiscale reale în compania tokenului (numere consumate din serie). Testează pe o companie / serie de test.\n\n## Autentificare\n\n- `POST /api/v6/auth/token` cu login-ul utilizatorului și secretul API al companiei → `access_token`.\n- Toate celelalte cereri trimit `Authorization: Bearer {access_token}` (alternativ headerul `X-API-Token: {access_token}`). Tokenul în query string nu este acceptat.\n- Tokenul este valabil **12 ore** (`expires_in: 43200`); nu există refresh — la 401 cere un token nou și reia cererea.\n- Un utilizator are **un singur token activ pe companie**: un token nou îl invalidează imediat pe cel vechi. Dacă două integrări folosesc același utilizator și aceeași companie, ele se deconectează reciproc; folosește câte un utilizator pentru fiecare integrare sau partajează tokenul.\n- Toate datele sunt limitate la compania tokenului: ID-urile altor companii răspund 404.\n\n| Răspuns 401 | Cauză |\n| --- | --- |\n| `(401.0) Acces refuzat: lipseste tokenul de acces` | Lipsește tokenul. |\n| `(401.1) Acces refuzat: token de acces invalid` | Token necunoscut sau înlocuit de un token mai nou. |\n| `(401.2) Tokenul de acces a expirat` | Tokenul a expirat (după 12 ore). Cererile următoare cu același token primesc 401.1. |\n| `(401.3) Compania tokenului nu mai exista` | Compania tokenului nu mai există. |\n| `(401.4) Acces refuzat: compania este inchisa` | Compania a fost închisă; nu se mai emit tokenuri, iar cele emise sunt refuzate. |\n\n## Format cereri\n\n- Trimite JSON cu `Content-Type: application/json` și `Accept: application/json`. Sunt acceptate și cererile form-data; un corp JSON trimis cu alt Content-Type este decodat oricum.\n- Date: `AAAA-LL-ZZ`. Sume: numere (`121.5`); se acceptă și virgula zecimală în string (`\"121,5\"`). Boolean: `true` / `false` (se acceptă și `1`, `\"da\"`, `\"yes\"`, `\"on\"`).\n- Multe câmpuri au și denumiri alternative (camelCase, ex. `clientId`, `serieId`); în documentație apar denumirile principale, recomandate.\n- În Postman, o cerere care folosește o variabilă încă goală (ex. `product_id` când compania nu are produse, `project_id` fără proiecte) este sărită, cu motivul în Console. Restul colecției rulează mai departe.\n- O rută sau o metodă inexistentă sub `/api/v6/` răspunde tot în formatul de mai jos: 404 `Ruta nu exista`, 405 `Metoda nu este permisa pe aceasta ruta`.\n- Toate mesajele (`statusMessage` și textele din `errors`) sunt în limba română, fără diacritice. În mesajele de validare numele câmpului apare cu spații în loc de `_` (ex. `Campul serie id este obligatoriu.`); cheile din `errors` rămân numele câmpurilor. Codul HTTP și `errors.code` sunt cele de urmărit în integrare, nu textul.\n\n## Format răspunsuri\n\nSucces (codul HTTP este egal cu `status`):\n\n```json\n{ \"status\": 200, \"statusMessage\": \"Document creat\", \"data\": { ... } }\n```\n\nEroare:\n\n```json\n{ \"status\": 422, \"statusMessage\": \"Cota TVA selectata nu este disponibila.\", \"errors\": { \"code\": \"INVALID_TAX\" }, \"data\": null }\n```\n\n- `statusMessage` este textul de afișat / logat; `data` este `null` la erori.\n- `errors` este `[]` sau un obiect: erori pe câmpuri (`{\"items\": [\"...\"]}`) sau `{\"code\": \"...\"}` pentru refuzurile de business pe documente și încasări. Integrează-te pe `status` + `errors.code`, nu pe textul mesajului.\n- Descărcările (`/download`) răspund direct cu fișierul PDF (`Content-Type: application/pdf`, `Content-Disposition: attachment; filename=...`); erorile lor sunt JSON.\n\n| HTTP | Când |\n| --- | --- |\n| 200 / 201 | Succes (201 doar la un pontaj nou). |\n| 400 | JSON invalid, parametri lipsă la nomenclatoare, alte erori neașteptate ale operației. |\n| 401 | Autentificare (vezi mai sus). |\n| 403 | Resursa există, dar nu aparține companiei (proiecte). |\n| 404 | Resursa nu există în compania tokenului. |\n| 409 | Starea documentului nu permite operația (factură trimisă în SPV, cu încasări, deja stornată etc.). |\n| 422 | Date invalide (validare). |\n| 429 | Limita de cereri depășită. Corpul nu are formatul de mai sus; respectă headerul `Retry-After`. |\n\n### Coduri `errors.code`\n\n| Cod | HTTP | Semnificație |\n| --- | --- | --- |\n| `INVALID_CLIENT` | 422 | Clientul nu este disponibil. |\n| `INVALID_INVOICE_SERIE` / `INVALID_PROFORMA_SERIE` | 422 | Seria nu există, nu e activă sau nu e a companiei. |\n| `INVALID_RECEIPT_SERIE` | 422 | Seria de chitanțe nu este disponibilă. |\n| `INVALID_DELEGATE` | 422 | Delegatul nu este disponibil. |\n| `INVALID_BANK_ACCOUNT` | 422 | Contul bancar nu este disponibil. |\n| `INVALID_TAX` | 422 | Cota TVA nu este disponibilă. |\n| `INVALID_TAX_CLIENT` | 422 | Cota TVA aleasă (ex. taxare inversă) nu se aplică acestui client. |\n| `INVALID_PRODUCT` | 422 | Produsul nu există în nomenclatorul companiei. |\n| `INVALID_ITEMS` | 422 | Documentul nu are nicio linie validă. |\n| `INVOICE_PAYMENT_AMOUNT_INVALID` | 422 | Suma încasării trebuie să fie mai mare decât zero. |\n| `INVOICE_PAYMENT_TYPE_INVALID` | 422 | Tipul de încasare nu este disponibil. |\n| `INVOICE_PAYMENT_NOT_ALLOWED` | 409 | Documentul nu mai acceptă încasări (anulat, stornat, proformă convertită etc.). |\n| `INVOICE_CANCEL_HAS_PAYMENTS` | 409 | Factura are încasări și nu poate fi anulată (șterge încasările sau storneaz-o). |\n| `INVOICE_CANCEL_NOT_ALLOWED` | 409 | Factura nu poate fi anulată în starea curentă. |\n| `INVOICE_STORNO_HAS_PAYMENTS` | 409 | Factura are încasări: trimite `payments_action` (`credit` sau `refund`). |\n| `INVOICE_STORNO_PAYMENTS_ACTION_INVALID` | 422 | `payments_action` invalid. |\n| `INVOICE_STORNO_NOT_ALLOWED` | 409 | Factura nu poate fi stornată în starea curentă. |\n| `AMBIGUOUS_DOCUMENT` | 409 | Caută după serie și număr: mai multe documente se potrivesc; `errors.candidates[]`. |\n| `CLIENT_MISMATCH` | 404 | Caută după serie și număr: documentul există, dar clientul nu corespunde. |\n| `COMPANY_MISMATCH` | 404 | Caută după serie și număr: documentul există, dar emitentul are alt cod fiscal. |\n| `DATE_MISMATCH` | 404 | Caută după serie și număr: documentul există, dar are altă dată decât `date`. |\n| `DOCUMENT_NOT_FOUND` | 404 | Caută după serie și număr: niciun document cu seria și numărul acestea. |\n\n## Limite\n\n- **120 de cereri pe minut** pentru toate rutele `/api/v6` (inclusiv obținerea tokenului). Peste limită: 429 cu headerele `Retry-After`, `X-RateLimit-Limit`, `X-RateLimit-Remaining`.\n- `GET /clients` este paginat (max. 100 pe pagină); celelalte liste nu sunt paginate.\n\n## Cache (ETag)\n\n`GET /company` și toate `GET /nomenclature/*` răspund cu `ETag` și `Cache-Control: no-cache, private`. Păstrează răspunsul împreună cu `ETag`-ul și la cererea următoare trimite headerul `If-None-Match: <ETag>`: dacă datele nu s-au schimbat primești **304 Not Modified, fără corp**, și folosești copia ta; altfel 200 cu datele noi și un `ETag` nou. ETag-ul se schimbă la orice modificare a datelor (o serie, un cont, un produs nou). Cererea 304 se numără în limita de 120 pe minut, dar nu mai transferă datele.\n\n- Recomandare: citește Nomenclatoare > Facturi o dată la pornirea integrării (sau înaintea unei serii de facturi) și revalidează-l, în loc să-l ceri înaintea fiecărei facturi.\n- Răspunsurile sunt `private` (depind de token): un proxy partajat nu le păstrează.\n\n## Ciclul unei facturi\n\n1. **Emitere** — `POST /invoices` creează direct o factură **emisă**, numerotată în serie (API-ul nu creează ciorne). Transmiterea în SPV (e-Factura) se face din WeBill, după setările companiei.\n2. **Modificare** — `PATCH /invoices/{id}` cât timp factura nu a fost trimisă în SPV.\n3. **Încasare** — `POST /invoices/{id}/receipts` (sau direct la emitere cu `POST /invoices/with-receipt`); o plată pentru mai multe facturi: `POST /invoices/receipts/bulk`.\n4. **Corectare** — înainte de SPV și fără încasări: `POST /invoices/{id}/cancel` (anulare). După SPV: stornare totală sau parțială, `POST /invoices/{id}/storno`.\n\n| Stare | Modificare | Încasări | Anulare | Stornare |\n| --- | --- | --- | --- | --- |\n| `emisa`, netrimisă în SPV | da | da | da, fără încasări | da |\n| `emisa`, trimisă în SPV | nu (409) | da | devine stornare | da |\n| `anulata` | nu | nu | idempotent | nu |\n| `storno` (factura inversă) | — | doar restituiri (sume negative) | dacă nu e trimisă în SPV | nu |\n\n## Scenarii frecvente\n\n- **Factura după numărul tipărit**: `GET /invoices/find?serie=WB&number=12&company_vat=...` (opțional și `date`, `client_vat`, `client_name`) întoarce factura ca `GET /invoices/{id}` doar dacă seria, numărul, codul fiscal al emitentului și fiecare parametru opțional trimis corespund exact; altfel o eroare cu `errors.code`, niciodată un document apropiat. La fel `GET /proforme/find`.\n- **Datele emitentului**: `GET /company` — identitatea fiscală, adresa, conturile bancare, punctele de lucru, modulele pornite și dacă e-Factura e conectată.\n- **Comandă plătită online (magazin)**: `POST /invoices/with-receipt` cu clientul inline, `order_id` = ID-ul comenzii și `receipt.type = card`. Factura și încasarea se creează în aceeași tranzacție; reîncercarea cu același `order_id` în 2 minute nu dublează factura. Apoi `POST /invoices/{id}/email`.\n- **Comandă cu plata ulterior (OP / ramburs)**: `POST /invoices`, iar la confirmarea plății `POST /invoices/{id}/receipts` cu `type = op` sau `ramburs`.\n- **Extras bancar cu o plată pentru mai multe facturi**: citește restul de plată (`GET /invoices/{id}` → `totals.stats.rest`) și trimite `POST /invoices/receipts/bulk` cu `expected_balances`.\n- **Retur parțial**: `GET /invoices/{id}/storno` (liniile și ce a rămas de stornat), apoi `POST /invoices/{id}/storno` cu `lines`.\n- **Ofertă / avans**: `POST /proforme`, încasare pe proformă; proforma se convertește în factură din WeBill.\n\n## Variabile de mediu\n\n| Variabilă | Setată de | Descriere |\n| --- | --- | --- |\n| `base_url` | tine | `https://webill.ro` |\n| `api_user` | tine | Login-ul utilizatorului WeBill. |\n| `api_secret` | tine | Secretul API al companiei. |\n| `company_id` | tine | ID-ul companiei; obligatoriu doar dacă utilizatorul are mai multe companii cu același secret. |\n| `api_token` | Obținere token | Tokenul Bearer. |\n| `serie_id`, `receipt_serie_id`, `delegate_id`, `bank_id` | Nomenclatoare > Facturi | Seria de facturi, delegatul și contul RON implicite (altfel primele), prima serie cu chitanțier. |\n| `proforma_serie_id` | Nomenclatoare > Facturi | Seria de proforme implicită (altfel prima). |\n| `tax_id` | Nomenclatoare > Facturi | Cota TVA implicită. |\n| `product_id` | Nomenclatoare > Produse | Primul produs din nomenclator. |\n| `country_code`, `currency` | tine | Ex. `RO`, `EUR`. |\n| `client_id`, `client_vat` | Clienți > Creează persoană juridică | Clientul folosit în exemplele de documente. |\n| `project_id` | Proiecte > Listă | Primul proiect. |\n| `invoice_id`, `invoice_id_2`, `invoice_id_3`, `paid_invoice_id` | Facturi fiscale > Creează ... | Facturile create de exemple. |\n| `company_vat` | Companie > Detalii companie | Codul fiscal al companiei, pentru Caută după serie și număr. |\n| `invoice_serie`, `invoice_number` | Facturi fiscale > Creează | Seria și numărul facturii, pentru Caută după serie și număr. |\n| `receipt_id`, `cash_receipt_id` | Încasări - Creează ... | Încasările create de exemple. |\n| `storno_line_id` | Variante de stornare | Prima linie care se poate storna. |\n| `proforma_id`, `proforma_receipt_id` | Proforme > Creează ... | Proforma și încasarea ei. |\n| `proforma_serie`, `proforma_number` | Proforme > Creează | Seria și numărul proformei. |\n| `today` | automat | Data de azi (`AAAA-LL-ZZ`), calculată la fiecare cerere dacă nu e setată în Environment. |",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "auth": {
    "type": "bearer",
    "bearer": [
      {
        "key": "token",
        "value": "{{api_token}}",
        "type": "string"
      }
    ]
  },
  "event": [
    {
      "listen": "prerequest",
      "script": {
        "type": "text/javascript",
        "exec": [
          "// {{today}}: the local date as AAAA-LL-ZZ, unless the Environment sets it.",
          "if (!pm.environment.get('today')) {",
          "    const d = new Date();",
          "    pm.variables.set('today', [d.getFullYear(), String(d.getMonth() + 1).padStart(2, '0'), String(d.getDate()).padStart(2, '0')].join('-'));",
          "}",
          "// A request that needs an id no earlier request saved (e.g. product_id when the company has no products) is skipped",
          "// with a note in the Console, instead of going out as invalid JSON or to a path with \"//\".",
          "const used = (pm.request.url.toString() + ' ' + ((pm.request.body && pm.request.body.raw) || '')).match(/{{\\s*[\\w.-]+\\s*}}/g) || [];",
          "// Only ids (…_id, …_id_2): the other variables, like the balances, are filled by the request's own script, which runs later.",
          "const missing = [...new Set(used.map((m) => m.replace(/[{}\\s]/g, '')))].filter((name) => /_id(_\\d+)?$/.test(name)).filter((name) => {",
          "    const value = pm.variables.get(name);",
          "    return value === undefined || value === null || value === '';",
          "});",
          "if (missing.length) {",
          "    console.warn(`${pm.info.requestName}: sărită, lipsesc ${missing.join(', ')}. Rulează întâi cererile care le salvează sau completează-le în Environment.`);",
          "    pm.execution.skipRequest();",
          "}"
        ]
      }
    }
  ],
  "item": [
    {
      "name": "Autentificare",
      "description": "Obținerea tokenului Bearer. Nu cere autentificare.",
      "item": [
        {
          "name": "Obținere token",
          "_postman_id": "d01aa7f3-136e-5fcf-b22c-9466f52ab37e",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/auth/token",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "auth",
                "token"
              ]
            },
            "description": "Emite tokenul de acces pentru o companie. Tokenul se salvează automat în variabila `api_token`.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `client_id` | string | da | **Client ID** din Setări companie > API: login-ul contului care deține compania (alias: `login`). |\n| `client_secret` | string | da | **Secretul API** al companiei, din Setări companie > API (alias: `secret`). |\n| `company_id` | int | nu | Compania pentru care se emite tokenul. Obligatoriu când același utilizator are mai multe companii cu același secret. |\n\nAlternativ, credențialele se pot trimite în header `Authorization: Basic base64(login:secret)`; `company_id` rămâne în body.\n\n**Răspuns**: `token_type` (`Bearer`), `access_token`, `expires_in` (secunde; mereu 43200 = 12 ore), `issued_at` (ora serverului, Europe/Bucharest), `company` (`id`, `vat`), `owner` (`id`, `login`).\n\nUn token nou pentru același utilizator și aceeași companie îl invalidează imediat pe cel anterior. Cere un token nou la expirare (401.2) sau la 401.1, nu la fiecare cerere.\n\n**Erori**\n- 401 `(401) Date de autentificare invalide` — lipsește login-ul sau secretul.\n- 401 `(401) Utilizator inexistent`.\n- 401 `(401) Secret sau companie invalida` — secretul nu se potrivește cu nicio companie a utilizatorului (sau cu `company_id`).\n- 422 `(422) Selectati compania (company_id) cand exista mai mult de o companie activa` (`errors.company_id`).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": \"{{api_user}}\",\n  \"client_secret\": \"{{api_secret}}\",\n  \"company_id\": \"{{company_id}}\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "auth": {
              "type": "noauth"
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": \"{{api_user}}\",\n  \"client_secret\": \"{{api_secret}}\",\n  \"company_id\": \"{{company_id}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/auth/token",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "auth",
                    "token"
                  ]
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"token_type\": \"Bearer\",\n    \"access_token\": \"a3f1c9...(128 de caractere hex)\",\n    \"expires_in\": 43200,\n    \"scope\": null,\n    \"issued_at\": \"2026-10-29 12:53:47\",\n    \"company\": {\n      \"id\": 1,\n      \"vat\": \"RO10000008\"\n    },\n    \"owner\": {\n      \"id\": 1,\n      \"login\": \"api.demo\"\n    }\n  }\n}"
            },
            {
              "name": "401 Secret greșit",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": \"{{api_user}}\",\n  \"client_secret\": \"secret-gresit\",\n  \"company_id\": \"{{company_id}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/auth/token",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "auth",
                    "token"
                  ]
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 401,\n  \"statusMessage\": \"(401) Secret sau companie invalida\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.access_token !== undefined && body.data.access_token !== null) pm.environment.set('api_token', String(body.data.access_token));",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Nomenclatoare",
      "description": "Listele de valori ale companiei: serii, delegați, conturi bancare, cote TVA, țări, județe, curs valutar și produse. ID-urile de aici sunt cele pe care le primesc documentele. Nomenclatoarele se schimbă rar: păstrează-le în cache și revalidează-le cu `If-None-Match` (304 fără corp când nu s-a schimbat nimic). Nomenclatoare > Facturi aduce într-o singură cerere tot ce trebuie pentru o factură.",
      "item": [
        {
          "name": "Facturi",
          "_postman_id": "301ce8fd-b4d9-5e97-8ec0-4c63e0d7b060",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/nomenclature/invoice",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "nomenclature",
                "invoice"
              ]
            },
            "description": "Tot ce trebuie pentru a construi o factură sau o proformă. Doar elementele active ale companiei, în ordinea din WeBill (Setări, săgețile sus / jos). Un document creat fără `serie_id`, `delegate_id` sau `bank_accounts` ia ce e marcat „Implicit” în Setări (`is_default: true`: seria, delegatul, contul monedei documentului), altfel prima serie, primul delegat, toate conturile active.\n\n| Cheie | Conținut |\n| --- | --- |\n| `currencies[]` | `code`, `name` — monedele acceptate în `currency`. |\n| `languages[]` | `code` (`ro`, `en`), `name`. |\n| `invoice_series[]` | `id`, `serie`, `current_number` (următorul număr), `receipt_serie` / `receipt_current_number` (chitanțierul seriei, folosit la încasările `cash`), `currency`, `is_default`, `is_active`. `rec_serie` / `rec_current_index` sunt aliasuri vechi. |\n| `proforma_series[]` | `id`, `serie`, `current_number`, `is_default`, `is_active`. |\n| `delegates[]` | `id`, `name`, `transport_type`, `transport_number`, `is_default`, `is_active`. |\n| `banks[]` | `id`, `bank`, `iban`, `currency`, `label`, `is_default` (cel mult unul pe monedă), `is_active` — pentru `bank_accounts`. |\n| `taxes[]` | `id`, `name`, `percent`, `categorie` (categoria e-Factura: `S`, `Z`, `E`, `AE`, `K`, `O` ...), `is_default`, `is_active` — pentru `tax_id` / `tax_value`. |\n| `units[]` | `id`, `code` (codul UN/ECE, ex. `H87`, `HUR`), `name` (denumirea dată de companie, altfel cea standard), `default_name`, `is_default` — unitățile de măsură ale companiei (Setări > Unități de măsură), în ordinea din editorul de documente. Pe o linie, `um` primește `code` sau `name`. |\n\nScriptul de test salvează în Environment `serie_id`, `receipt_serie_id`, `proforma_serie_id`, `delegate_id`, `bank_id` și `tax_id`: valoarea cu `is_default: true` (la cont, cel în RON), altfel prima din listă."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/invoice",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "invoice"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"0750cdc01c14690720d01e44f31bef52\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Nomenclatoare facturi\",\n  \"data\": {\n    \"currencies\": [\n      {\n        \"code\": \"RON\",\n        \"name\": \"RON - Leu romanesc\"\n      },\n      {\n        \"code\": \"EUR\",\n        \"name\": \"EUR - Euro\"\n      },\n      {\n        \"code\": \"USD\",\n        \"name\": \"USD - Dolarul american\"\n      },\n      {\n        \"code\": \"MDL\",\n        \"name\": \"MDL - Leul moldovenesc\"\n      },\n      {\n        \"code\": \"GBP\",\n        \"name\": \"GBP - Lira sterlina\"\n      },\n      {\n        \"code\": \"CHF\",\n        \"name\": \"CHF - Francul elvetian\"\n      },\n      {\n        \"code\": \"AUD\",\n        \"name\": \"AUD - Dolarul australian\"\n      },\n      {\n        \"code\": \"BGN\",\n        \"name\": \"BGN - Leva bulgareasca\"\n      },\n      {\n        \"code\": \"CAD\",\n        \"name\": \"CAD - Dolarul canadian\"\n      },\n      {\n        \"code\": \"CZK\",\n        \"name\": \"CZK - Coroana ceha\"\n      },\n      {\n        \"code\": \"DKK\",\n        \"name\": \"DKK - Coroana daneza\"\n      },\n      {\n        \"code\": \"HUF\",\n        \"name\": \"HUF - 100 Forinti maghiari\"\n      },\n      {\n        \"code\": \"EGP\",\n        \"name\": \"EGP - Lira egipteana\"\n      },\n      {\n        \"code\": \"JPY\",\n        \"name\": \"JPY - 100 Yeni japonezi\"\n      },\n      {\n        \"code\": \"NOK\",\n        \"name\": \"NOK - Coroana norvegiana\"\n      },\n      {\n        \"code\": \"PLN\",\n        \"name\": \"PLN - Zlotul polonez\"\n      },\n      {\n        \"code\": \"RUB\",\n        \"name\": \"RUB - Rubla ruseasca\"\n      },\n      {\n        \"code\": \"SEK\",\n        \"name\": \"SEK - Coroana suedeza\"\n      },\n      {\n        \"code\": \"TRY\",\n        \"name\": \"TRY - Lira turceasca\"\n      },\n      {\n        \"code\": \"ZAR\",\n        \"name\": \"ZAR - Randul sud-african\"\n      },\n      {\n        \"code\": \"BRL\",\n        \"name\": \"BRL - Realul brazilian\"\n      },\n      {\n        \"code\": \"CNY\",\n        \"name\": \"CNY - Renminbi-ul chinezesc\"\n      },\n      {\n        \"code\": \"INR\",\n        \"name\": \"INR - Rupia indiana\"\n      },\n      {\n        \"code\": \"KRW\",\n        \"name\": \"KRW - 100 Woni sud-coreeni\"\n      },\n      {\n        \"code\": \"MXN\",\n        \"name\": \"MXN - Peso-ul mexican\"\n      },\n      {\n        \"code\": \"NZD\",\n        \"name\": \"NZD - Dolarul neo-zeelandez\"\n      },\n      {\n        \"code\": \"RSD\",\n        \"name\": \"RSD - Dinarul sarbesc\"\n      },\n      {\n        \"code\": \"UAH\",\n        \"name\": \"UAH - Hryvna ucraineana\"\n      },\n      {\n        \"code\": \"AED\",\n        \"name\": \"AED - Dirhamul Emiratelor Arabe\"\n      },\n      {\n        \"code\": \"THB\",\n        \"name\": \"THB - Bahtul thailandez\"\n      },\n      {\n        \"code\": \"XAU\",\n        \"name\": \"XAU - Gramul de aur\"\n      },\n      {\n        \"code\": \"XDR\",\n        \"name\": \"XDR - DST\"\n      }\n    ],\n    \"languages\": [\n      {\n        \"code\": \"ro\",\n        \"name\": \"RO - Română\"\n      },\n      {\n        \"code\": \"en\",\n        \"name\": \"EN - English\"\n      }\n    ],\n    \"invoice_series\": [\n      {\n        \"id\": 1,\n        \"serie\": \"WB\",\n        \"current_number\": 1,\n        \"receipt_serie\": \"CH\",\n        \"receipt_current_number\": 1,\n        \"rec_serie\": \"CH\",\n        \"rec_current_index\": 1,\n        \"currency\": \"RON\",\n        \"is_default\": false,\n        \"is_active\": true\n      }\n    ],\n    \"proforma_series\": [\n      {\n        \"id\": 1,\n        \"serie\": \"PF\",\n        \"current_number\": 1,\n        \"is_default\": false,\n        \"is_active\": true\n      }\n    ],\n    \"delegates\": [\n      {\n        \"id\": 1,\n        \"name\": \"Email\",\n        \"transport_type\": null,\n        \"transport_number\": null,\n        \"is_default\": false,\n        \"is_active\": true\n      },\n      {\n        \"id\": 2,\n        \"name\": \"Ion Delegat\",\n        \"transport_type\": null,\n        \"transport_number\": null,\n        \"is_default\": false,\n        \"is_active\": true\n      }\n    ],\n    \"banks\": [\n      {\n        \"id\": 1,\n        \"bank\": \"ING\",\n        \"iban\": \"RO49INGB0000999900000000\",\n        \"currency\": \"RON\",\n        \"label\": \"ING - RO49INGB0000999900000000 (RON)\",\n        \"is_default\": false,\n        \"is_active\": true\n      }\n    ],\n    \"taxes\": [\n      {\n        \"id\": 9,\n        \"name\": \"TVA 21%\",\n        \"percent\": 21,\n        \"categorie\": \"S\",\n        \"is_default\": true,\n        \"is_active\": true\n      },\n      {\n        \"id\": 10,\n        \"name\": \"Fara TVA\",\n        \"percent\": 0,\n        \"categorie\": \"O\",\n        \"is_default\": false,\n        \"is_active\": true\n      }\n    ],\n    \"units\": [\n      {\n        \"id\": 893,\n        \"code\": \"H87\",\n        \"name\": \"BUC\",\n        \"default_name\": \"H87 - bucata\",\n        \"is_default\": false\n      }\n    ]\n  }\n}"
            },
            {
              "name": "401 Fără token",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/invoice",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "invoice"
                  ]
                },
                "auth": {
                  "type": "noauth"
                }
              },
              "status": "Unauthorized",
              "code": 401,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 401,\n  \"statusMessage\": \"(401.0) Acces refuzat: lipseste tokenul de acces\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "const d = (body && body.data) || {};",
                  "const first = (list) => (Array.isArray(list) && list.length ? list[0] : null);",
                  "const pick = (list, match = () => true) => { const rows = (list || []).filter(match); return rows.find((r) => r.is_default) || rows[0] || null; };",
                  "const set = (name, value) => { if (value !== null && value !== undefined) pm.environment.set(name, String(value)); };",
                  "set('serie_id', (pick(d.invoice_series) || {}).id);",
                  "set('receipt_serie_id', ((d.invoice_series || []).find((s) => s.receipt_serie) || {}).id);",
                  "set('proforma_serie_id', (pick(d.proforma_series) || {}).id);",
                  "set('delegate_id', (pick(d.delegates) || {}).id);",
                  "set('bank_id', (pick(d.banks, (b) => b.currency === 'RON') || first(d.banks) || {}).id);",
                  "set('tax_id', ((d.taxes || []).find((t) => t.is_default) || first(d.taxes) || {}).id);"
                ]
              }
            }
          ]
        },
        {
          "name": "Clienți",
          "_postman_id": "9af6e19c-bfec-5422-8e64-b9cbbef67e33",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/nomenclature/client",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "nomenclature",
                "client"
              ]
            },
            "description": "Tipurile de client (`client_types`: `pf` persoană fizică, `pj` persoană juridică — la clienți se trimit ca `is_pf: true/false`) și țările active (`countries[]`: `code`, `name`), cu cele fixate primele."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/client",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "client"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"03fe10766c81d3b90c76a1fe22ced7d1\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Nomenclatoare clienti\",\n  \"data\": {\n    \"client_types\": [\n      {\n        \"code\": \"pf\",\n        \"name\": \"Persoană fizică\"\n      },\n      {\n        \"code\": \"pj\",\n        \"name\": \"Persoană juridică\"\n      }\n    ],\n    \"countries\": [\n      {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Județe după țară",
          "_postman_id": "047e2ecf-06db-5d2f-8b28-8e04ce2a4e29",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/nomenclature/states?country={{country_code}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "nomenclature",
                "states"
              ],
              "query": [
                {
                  "key": "country",
                  "value": "{{country_code}}",
                  "description": "Codul ISO al țării (ex. RO) sau o parte din nume. Obligatoriu."
                }
              ]
            },
            "description": "Județele / regiunile unei țări: `country` (`code`, `name`) și `states[]` (`code`, `name`), ordonate după nume. Codul (`B`, `CJ`, `IF` ...) se trimite în câmpul `state` al clientului.\n\n**Query**: `country` (obligatoriu) — codul țării (`RO`), sau o parte din numele ei.\n\n**Erori**: 400 `Parametrul country este obligatoriu`; 404 `Tara nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/states?country={{country_code}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "states"
                  ],
                  "query": [
                    {
                      "key": "country",
                      "value": "{{country_code}}",
                      "description": "Codul ISO al țării (ex. RO) sau o parte din nume. Obligatoriu."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"a57a74e6aa37ba74ff26523230f63cbf\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Nomenclatoare regiuni\",\n  \"data\": {\n    \"country\": {\n      \"code\": \"RO\",\n      \"name\": \"Romania\"\n    },\n    \"states\": [\n      {\n        \"code\": \"AB\",\n        \"name\": \"Alba\"\n      },\n      {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      {\n        \"code\": \"IF\",\n        \"name\": \"Ilfov\"\n      }\n    ]\n  }\n}"
            }
          ]
        },
        {
          "name": "Curs valutar",
          "_postman_id": "1c9463c4-c408-5199-a276-25add8e2cb0a",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/nomenclature/exchange-rate?currency={{currency}}&date={{today}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "nomenclature",
                "exchange-rate"
              ],
              "query": [
                {
                  "key": "currency",
                  "value": "{{currency}}",
                  "description": "Codul monedei, 3 litere. Obligatoriu."
                },
                {
                  "key": "date",
                  "value": "{{today}}",
                  "description": "Data documentului, AAAA-LL-ZZ. Opțional (implicit azi)."
                }
              ]
            },
            "description": "Cursul BNR pe care WeBill îl folosește pentru un document cu data cerută: ultimul curs publicat **înaintea** datei (cursul zilei bancare anterioare).\n\n**Query**\n- `currency` (obligatoriu): codul monedei, 3 litere (`EUR`, `USD` ...). Pentru `RON` se întoarce cursul EUR.\n- `date` (opțional): `AAAA-LL-ZZ`; implicit azi. Alternativ `year`, `month`, `day`.\n\n**Răspuns**: `requested_currency`, `currency`, `rate`, `multiplier` (1 pentru majoritatea monedelor; 100 pentru HUF / JPY: cursul este pentru 100 de unități), `requested_date`, `rate_date`, `source` (`BNR`).\n\n**Erori**: 400 `Parametrul currency este obligatoriu.` / `... trebuie sa aiba 3 caractere.` / `Parametrul date trebuie sa fie in format YYYY-MM-DD.`; 404 `Cursul valutar nu a fost gasit pentru moneda solicitata.`"
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/exchange-rate?currency={{currency}}&date={{today}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "exchange-rate"
                  ],
                  "query": [
                    {
                      "key": "currency",
                      "value": "{{currency}}",
                      "description": "Codul monedei, 3 litere. Obligatoriu."
                    },
                    {
                      "key": "date",
                      "value": "{{today}}",
                      "description": "Data documentului, AAAA-LL-ZZ. Opțional (implicit azi)."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"be372915e64e6948000c8037b24c323a\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Curs valutar\",\n  \"data\": {\n    \"requested_currency\": \"EUR\",\n    \"currency\": \"EUR\",\n    \"rate\": 5,\n    \"multiplier\": 1,\n    \"requested_date\": \"2026-10-29\",\n    \"rate_date\": \"2026-09-29\",\n    \"source\": \"BNR\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Produse și servicii",
          "_postman_id": "48a404b8-9ce7-5596-99f9-0a9d1c9c7713",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/nomenclature/products",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "nomenclature",
                "products"
              ],
              "query": [
                {
                  "key": "q",
                  "value": "",
                  "description": "Text din denumire sau codul exact al produsului. Opțional.",
                  "disabled": true
                }
              ]
            },
            "description": "Produsele și serviciile active din nomenclatorul companiei (Facturi > Produse și servicii), ordonate după nume. Nu este paginat.\n\n**Query**: `q` (opțional) — caută în denumire sau după codul exact.\n\n**`products[]`**: `id`, `name`, `details`, `code`, `unit`, `unit_price`, `currency`, `tax_id`, `tax_included`, `cpv_code`, `tracks_stock`, `tracks_lots`, `stock`.\n\nCu modulul Gestiune pornit, `stock` are câte un rând pe gestiune activă care a avut articolul: `warehouse_id`, `warehouse_name`, `quantity`, `reserved`, `lots[]` (`lot`, `expiry_date`, `quantity`). Fără urmărire de stoc (sau cu modulul oprit), `tracks_stock` / `tracks_lots` sunt `false` și `stock` este `null`.\n\nPe o linie de factură / proformă poți trimite doar `product_id` și `qty`: restul câmpurilor se completează din produs (le poți suprascrie trimițându-le). Scriptul de test salvează primul produs în `product_id`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/nomenclature/products",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "nomenclature",
                    "products"
                  ],
                  "query": [
                    {
                      "key": "q",
                      "value": "",
                      "description": "Text din denumire sau codul exact al produsului. Opțional.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"a8a124a5b0128e1791634e010a3acdad\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Nomenclator produse\",\n  \"data\": {\n    \"products\": [\n      {\n        \"id\": 1,\n        \"name\": \"Abonament lunar\",\n        \"details\": null,\n        \"code\": \"ABN-01\",\n        \"unit\": \"H87\",\n        \"unit_price\": 121,\n        \"currency\": \"RON\",\n        \"tax_id\": 9,\n        \"tax_included\": true,\n        \"cpv_code\": null,\n        \"tracks_stock\": false,\n        \"tracks_lots\": false,\n        \"stock\": null\n      }\n    ]\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data && Array.isArray(body.data.products)) {",
                  "    // A product with a VAT rate first: on a VAT payer a line without one is refused (D200).",
                  "    const product = body.data.products.find((p) => p.tax_id) || body.data.products[0];",
                  "    if (product && product.id !== undefined && product.id !== null) pm.environment.set('product_id', String(product.id));",
                  "}"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Companie",
      "_postman_id": "bcecf46c-3230-491a-8096-9dab1c8e559e",
      "description": "Datele companiei tokenului (emitentul documentelor), doar de citit. Utile pentru afișarea emitentului, verificarea plătitorului de TVA sau a modulelor pornite înainte de a emite.",
      "item": [
        {
          "name": "Detalii companie",
          "_postman_id": "6cacace3-366d-4c24-b7ce-bcd3a912b6ce",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/company",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "company"
              ]
            },
            "description": "Datele companiei tokenului, doar de citit: identitatea fiscală și adresa așa cum apar pe documente, punctele de lucru, modulele pornite, starea la ANAF, conectarea e-Factura (SPV) și preferințele documentelor. Tot ce trebuie pentru o factură (serii, conturi bancare, cote TVA, delegați, unități de măsură) este într-o singură cerere, Nomenclatoare > Facturi.\n\nRăspunde cu `ETag`: retrimite-l în `If-None-Match` și primești 304 fără corp cât timp datele nu s-au schimbat (vezi Cache în descrierea colecției).\n\n**`company`**\n\n| Câmp | Detalii |\n| --- | --- |\n| `id`, `name`, `alias`, `code` | ID-ul (același cu `company_id` de la token), denumirea legală, numele scurt și codul intern din Setări. |\n| `vat`, `vat_label` | Codul fiscal fără / cu prefixul `RO` (prefixul doar la plătitorii de TVA). |\n| `has_vat`, `vat_on_collection` | Plătitor de TVA; TVA la încasare (doar împreună cu `has_vat`). |\n| `vat_vies`, `reg`, `capital_social`, `bt_29` | Codul VIES, nr. de înregistrare la Registrul Comerțului, capitalul social, identificatorul vânzătorului din e-Factura (BT-29). `null` când nu sunt completate. |\n| `administrator`, `email`, `phone` | Datele de contact din Setări companie. |\n| `country`, `state` | `{ code, name }` (codurile din Nomenclatoare > Clienți / Județe) sau `null`. |\n| `city`, `address_1`, `address_2`, `zip` | Adresa sediului; `zip` este `null` când lipsește. |\n| `other_info[]` | `label`, `value` — informațiile suplimentare tipărite pe documente (ex. cont Trezorerie). |\n| `conta_cont_analitic_client` | Contul analitic al companiei folosit la exportul contabil. |\n| `logo_url` | URL-ul public al logo-ului sau `null`. |\n| `is_branch`, `cui_branch`, `parent_company` | Punct de lucru: CUI-ul punctului și compania-mamă (`id`, `name`, `vat`). Un punct de lucru are identitatea fiscală a companiei-mamă (`vat`, `reg`, `has_vat` etc.). |\n| `subscription_until` | Ultima zi plătită a abonamentului WeBill (`AAAA-LL-ZZ`) sau `null`. |\n| `created_at` | Data creării companiei în WeBill. |\n\n**Celelalte chei**\n\n| Cheie | Conținut |\n| --- | --- |\n| `anaf` | `state` (`active`, `inactive`, `suspended`, `deregistered`), `state_text`, `state_date`, `synced_at` — ultima verificare a companiei la ANAF; `null` dacă nu a fost verificată. |\n| `efactura` | `connected` (există un token SPV valabil), `expires_at`, `autoupload` (facturile se trimit automat în SPV), `autodownload`. |\n| `branches[]` | `id`, `name`, `code`, `cui_branch`, `city` — punctele de lucru active ale companiei (gol pentru un punct de lucru). Fiecare are propriul `company_id` și propriul token. |\n| `modules[]` | `code`, `name` — modulele opționale pornite: `stock` (Gestiune), `offers`, `contracts`, `projects`, `subscriptions`, `accounting_export`. |\n| `preferences` | `invoice_due_date` (zilele de scadență implicite), `invoice_notes` (observațiile implicite), `invoice_payments_on_documents`, `autosend_invoice_to_client`, `export_documents`, `spv_alerts`, `spv_downloads_email`, `spv_max_days_send`. |\n\nSecretul API, proprietarul contului și datele interne WeBill nu sunt întoarse.\n\nScriptul de test salvează codul fiscal în `company_vat` (folosit de Caută după serie și număr)."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/company",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "company"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "ETag",
                  "value": "\"105abdff4603e6c5020687aa88b3afec\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Detalii companie\",\n  \"data\": {\n    \"company\": {\n      \"id\": 1,\n      \"name\": \"FIRMA DEMO SRL\",\n      \"alias\": null,\n      \"code\": null,\n      \"vat\": \"10000008\",\n      \"vat_label\": \"RO10000008\",\n      \"has_vat\": true,\n      \"vat_on_collection\": false,\n      \"vat_vies\": null,\n      \"reg\": \"J40/3066/2020\",\n      \"capital_social\": null,\n      \"bt_29\": null,\n      \"administrator\": null,\n      \"email\": null,\n      \"phone\": null,\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": null,\n      \"city\": \"Bucuresti\",\n      \"address_1\": null,\n      \"address_2\": null,\n      \"zip\": null,\n      \"other_info\": [],\n      \"conta_cont_analitic_client\": null,\n      \"logo_url\": null,\n      \"is_branch\": false,\n      \"cui_branch\": null,\n      \"parent_company\": null,\n      \"subscription_until\": null,\n      \"created_at\": \"2026-10-29 12:53:43\"\n    },\n    \"anaf\": {\n      \"state\": null,\n      \"state_text\": null,\n      \"state_date\": null,\n      \"synced_at\": null\n    },\n    \"efactura\": {\n      \"connected\": false,\n      \"expires_at\": null,\n      \"autoupload\": false,\n      \"autodownload\": false\n    },\n    \"branches\": [],\n    \"modules\": [],\n    \"preferences\": {\n      \"export_documents\": null,\n      \"spv_alerts\": null,\n      \"spv_downloads_email\": null,\n      \"spv_max_days_send\": 1,\n      \"autosend_invoice_to_client\": false,\n      \"invoice_payments_on_documents\": false,\n      \"invoice_notes\": null,\n      \"invoice_due_date\": 15\n    }\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data && body.data.company && body.data.company.vat) pm.environment.set('company_vat', String(body.data.company.vat));"
                ]
              }
            }
          ]
        }
      ]
    },
    {
      "name": "Clienți",
      "description": "Clienții companiei: căutare, creare și actualizare. Nu există ștergere prin API. Documentele pot primi fie `client_id`, fie clientul inline (`client`), cu aceleași câmpuri ca aici.",
      "item": [
        {
          "name": "Creează persoană juridică",
          "_postman_id": "f269efef-010f-543a-a053-089c25016e7f",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients"
              ]
            },
            "description": "Creează un client persoană juridică.\n\n- Dacă există deja un client PJ cu același CUI, **nu se creează un duplicat**: răspunsul conține clientul existent, nemodificat (folosește PATCH pentru a-l actualiza). Poți apela deci acest endpoint ca „găsește sau creează”.\n- Pentru un CUI nou, datele lipsă (denumire, Reg. Com., adresă, plătitor de TVA) se completează din ANAF; valorile trimise de tine au prioritate.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `is_pf` | bool | recomandat | `false` persoană juridică, `true` persoană fizică. **Implicit `true` la creare.** |\n| `company` | string | nu | Denumirea firmei sau numele persoanei. |\n| `vat` | string | da la PJ | CUI (cu sau fără `RO`; se păstrează doar cifrele) sau CNP la persoana fizică. În România CUI-ul și CNP-ul sunt validate. PF fără CNP → CNP anonim `0000000000000`. |\n| `has_vat` | bool | nu | Plătitor de TVA. La PJ se completează din ANAF dacă nu e trimis. |\n| `reg` | string | nu | Nr. Registrul Comerțului. |\n| `country` | string | da | Codul țării (`RO`), din Nomenclatoare > Clienți. |\n| `state` | string | nu | Codul județului (`B`, `CJ` ...), din Nomenclatoare > Județe. |\n| `city` | string | nu | Localitatea. **Pentru București (`state: B`) este obligatoriu și trebuie să fie `Sector 1` ... `Sector 6`.** |\n| `address_line_1` | string | nu | Adresa (stradă, număr). |\n| `address_line_2` | string | nu | Completare adresă. |\n| `zip` | string | nu | Cod poștal. |\n| `phone` | string | nu | Telefon. |\n| `email` | string | nu | Emailul folosit implicit la trimiterea documentelor (mai multe adrese separate prin virgulă). |\n| `bank` | string | nu | Banca. |\n| `iban` | string | nu | IBAN. |\n\n**Răspuns**: `statusMessage` `Client creat cu succes` pentru un client nou. Dacă firma are deja un client PJ cu același CUI, răspunsul este tot HTTP 200, cu aceeași structură `data`, clientul existent rămâne nemodificat, iar `statusMessage` este `Clientul exista deja cu acest cod fiscal si nu a fost modificat`.\n\n**`data` (client)**: `id`, `company`, `is_pf`, `has_vat`, `vat` (doar cifre), `country` (`code`, `name`) / `null`, `state` (`code`, `name`) / `null`, `city`, `email`, `address_1`, `phone`, `bank`, `iban`.\n\n**Erori** — 422 `Eroare validare client: <motiv>`, de exemplu:\n- `Denumirea tarii este obligatorie pentru tipul de client selectat.`\n- `Campul vat este obligatoriu.` (PJ fără CUI) / `Codul fiscal (vat) nu este valid` (CUI românesc invalid) / `CNP-ul introdus este invalid`\n- `Pentru Bucuresti, campul city este obligatoriu si trebuie sa fie Sector 1, Sector 2, ... sau Sector 6.`\n- `Judet/localitate invalid.`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"is_pf\": false,\n  \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n  \"vat\": \"RO10000008\",\n  \"has_vat\": true,\n  \"reg\": \"J40/1234/2024\",\n  \"country\": \"RO\",\n  \"state\": \"B\",\n  \"city\": \"Sector 1\",\n  \"address_line_1\": \"Str. Exemplu nr. 1\",\n  \"address_line_2\": \"Et. 2, ap. 5\",\n  \"zip\": \"010101\",\n  \"phone\": \"0722000000\",\n  \"email\": \"contabilitate@exemplu.ro\",\n  \"bank\": \"Banca Exemplu\",\n  \"iban\": \"RO49AAAA1B31007593840000\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"is_pf\": false,\n  \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n  \"vat\": \"RO10000008\",\n  \"has_vat\": true,\n  \"reg\": \"J40/1234/2024\",\n  \"country\": \"RO\",\n  \"state\": \"B\",\n  \"city\": \"Sector 1\",\n  \"address_line_1\": \"Str. Exemplu nr. 1\",\n  \"address_line_2\": \"Et. 2, ap. 5\",\n  \"zip\": \"010101\",\n  \"phone\": \"0722000000\",\n  \"email\": \"contabilitate@exemplu.ro\",\n  \"bank\": \"Banca Exemplu\",\n  \"iban\": \"RO49AAAA1B31007593840000\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/clients",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Client creat cu succes\",\n  \"data\": {\n    \"id\": 2,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"is_pf\": false,\n    \"has_vat\": true,\n    \"vat\": \"10000008\",\n    \"country\": {\n      \"code\": \"RO\",\n      \"name\": \"Romania\"\n    },\n    \"state\": {\n      \"code\": \"B\",\n      \"name\": \"Bucuresti\"\n    },\n    \"city\": \"Sector 1\",\n    \"email\": \"contabilitate@exemplu.ro\",\n    \"address_1\": \"Str. Exemplu nr. 1\",\n    \"phone\": \"0722000000\",\n    \"bank\": \"Banca Exemplu\",\n    \"iban\": \"RO49AAAA1B31007593840000\"\n  }\n}"
            },
            {
              "name": "422 CUI invalid",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"is_pf\": false,\n  \"company\": \"EXEMPLU SRL\",\n  \"vat\": \"RO10000009\",\n  \"country\": \"RO\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/clients",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Eroare validare client: Codul fiscal (vat) nu este valid\",\n  \"errors\": [],\n  \"data\": null\n}"
            },
            {
              "name": "422 București fără sector",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"is_pf\": true,\n  \"company\": \"Ionescu Dan\",\n  \"country\": \"RO\",\n  \"state\": \"B\",\n  \"city\": \"Bucuresti\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/clients",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Eroare validare client: Pentru Bucuresti, campul city trebuie sa fie Sector 1, Sector 2, Sector 3, Sector 4, Sector 5 sau Sector 6.\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('client_id', String(body.data.id));",
                  "    if (body.data.vat !== undefined && body.data.vat !== null) pm.environment.set('client_vat', String(body.data.vat));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Creează persoană fizică",
          "_postman_id": "1db0bf4b-0f72-5152-b42f-34b3a59cbca4",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients"
              ]
            },
            "description": "Creează un client persoană fizică (`is_pf: true`). CNP-ul (`vat`) este opțional: fără el se folosește CNP-ul anonim `0000000000000`, acceptat de e-Factura. Persoanele fizice nu sunt deduplicate: fiecare cerere creează un client nou — caută-l întâi după CNP dacă ai unul.\n\nCâmpurile și erorile sunt cele de la persoana juridică.\n\n**`data` (client)**: `id`, `company`, `is_pf`, `has_vat`, `vat` (doar cifre), `country` (`code`, `name`) / `null`, `state` (`code`, `name`) / `null`, `city`, `email`, `address_1`, `phone`, `bank`, `iban`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"is_pf\": true,\n  \"company\": \"Popescu Ana\",\n  \"country\": \"RO\",\n  \"state\": \"CJ\",\n  \"city\": \"Cluj-Napoca\",\n  \"address_line_1\": \"Str. Memorandumului nr. 10\",\n  \"phone\": \"0744000000\",\n  \"email\": \"ana.popescu@exemplu.ro\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"is_pf\": true,\n  \"company\": \"Popescu Ana\",\n  \"country\": \"RO\",\n  \"state\": \"CJ\",\n  \"city\": \"Cluj-Napoca\",\n  \"address_line_1\": \"Str. Memorandumului nr. 10\",\n  \"phone\": \"0744000000\",\n  \"email\": \"ana.popescu@exemplu.ro\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/clients",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Client creat cu succes\",\n  \"data\": {\n    \"id\": 3,\n    \"company\": \"Popescu Ana\",\n    \"is_pf\": true,\n    \"has_vat\": false,\n    \"vat\": \"0000000000000\",\n    \"country\": {\n      \"code\": \"RO\",\n      \"name\": \"Romania\"\n    },\n    \"state\": null,\n    \"city\": \"Cluj-Napoca\",\n    \"email\": \"ana.popescu@exemplu.ro\",\n    \"address_1\": \"Str. Memorandumului nr. 10\",\n    \"phone\": \"0744000000\",\n    \"bank\": null,\n    \"iban\": null\n  }\n}"
            }
          ]
        },
        {
          "name": "Listă",
          "_postman_id": "bd4f4322-49fa-5da9-bffe-16e718b99554",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients?per_page=20&page=1",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients"
              ],
              "query": [
                {
                  "key": "per_page",
                  "value": "20",
                  "description": "Rezultate pe pagină, 1–100 (implicit 20)."
                },
                {
                  "key": "page",
                  "value": "1",
                  "description": "Pagina, de la 1."
                },
                {
                  "key": "q",
                  "value": "",
                  "description": "Text căutat în denumirea clientului.",
                  "disabled": true
                }
              ]
            },
            "description": "Lista paginată a clienților, ordonată după denumire.\n\n**Query**\n- `q` — caută în denumire.\n- `per_page` — 1–100 (implicit 20); `page` — pagina (de la 1).\n- `id` — un singur client (404 `Client inexistent` dacă nu există).\n- `vat` — caută după CUI / CNP (vezi cererea următoare).\n\n**Răspuns**: `items[]` (clienți, ca la Detaliu) și `meta` (`page`, `perPage`, `total`, `path`). Numărul de pagini = `ceil(total / perPage)`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/clients?per_page=20&page=1",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ],
                  "query": [
                    {
                      "key": "per_page",
                      "value": "20",
                      "description": "Rezultate pe pagină, 1–100 (implicit 20)."
                    },
                    {
                      "key": "page",
                      "value": "1",
                      "description": "Pagina, de la 1."
                    },
                    {
                      "key": "q",
                      "value": "",
                      "description": "Text căutat în denumirea clientului.",
                      "disabled": true
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": 1,\n        \"company\": \"CLIENT DEMO SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"23010836\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"AB\",\n          \"name\": \"Alba\"\n        },\n        \"city\": \"Alba Iulia\",\n        \"email\": \"client@exemplu.ro\",\n        \"address_1\": \"Str. Principala 1\",\n        \"phone\": \"0722000000\",\n        \"bank\": null,\n        \"iban\": null\n      },\n      {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"contabilitate@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 1\",\n        \"phone\": \"0722000000\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      {\n        \"id\": 3,\n        \"company\": \"Popescu Ana\",\n        \"is_pf\": true,\n        \"has_vat\": false,\n        \"vat\": \"0000000000000\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": null,\n        \"city\": \"Cluj-Napoca\",\n        \"email\": \"ana.popescu@exemplu.ro\",\n        \"address_1\": \"Str. Memorandumului nr. 10\",\n        \"phone\": \"0744000000\",\n        \"bank\": null,\n        \"iban\": null\n      }\n    ],\n    \"meta\": {\n      \"page\": 1,\n      \"perPage\": 20,\n      \"total\": 3,\n      \"path\": \"http://127.0.0.1:8765/api/v6/clients\"\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Caută după CUI/CNP",
          "_postman_id": "3fa5f159-165b-57b7-ac8f-9f0016f8c59a",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients?vat={{client_vat}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients"
              ],
              "query": [
                {
                  "key": "vat",
                  "value": "{{client_vat}}",
                  "description": "CUI / CNP, cu sau fără RO."
                }
              ]
            },
            "description": "Caută clientul după cod fiscal sau CNP. Prefixul `RO` și orice alt caracter în afara cifrelor sunt ignorate. Răspunsul are același format ca lista: `items` cu cel mult un client (`total: 0` și `items: []` dacă nu există).\n\nTipic pentru integrare: caută după CUI → dacă nu există, creează-l (sau trimite direct clientul inline pe factură)."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/clients?vat={{client_vat}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients"
                  ],
                  "query": [
                    {
                      "key": "vat",
                      "value": "{{client_vat}}",
                      "description": "CUI / CNP, cu sau fără RO."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"items\": [\n      {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"contabilitate@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 1\",\n        \"phone\": \"0722000000\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      }\n    ],\n    \"meta\": {\n      \"page\": 1,\n      \"perPage\": 1,\n      \"total\": 1,\n      \"path\": \"http://127.0.0.1:8765/api/v6/clients\"\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Detaliu",
          "_postman_id": "a6a6c508-1d14-56d6-a687-d4c1f1c96245",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients/{{client_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients",
                "{{client_id}}"
              ]
            },
            "description": "Un client după ID. `data` este direct obiectul client.\n\n**`data` (client)**: `id`, `company`, `is_pf`, `has_vat`, `vat` (doar cifre), `country` (`code`, `name`) / `null`, `state` (`code`, `name`) / `null`, `city`, `email`, `address_1`, `phone`, `bank`, `iban`.\n\n**Erori**: 404 `Clientul nu a fost gasit`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/clients/{{client_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients",
                    "{{client_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 2,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"is_pf\": false,\n    \"has_vat\": true,\n    \"vat\": \"10000008\",\n    \"country\": {\n      \"code\": \"RO\",\n      \"name\": \"Romania\"\n    },\n    \"state\": {\n      \"code\": \"B\",\n      \"name\": \"Bucuresti\"\n    },\n    \"city\": \"Sector 1\",\n    \"email\": \"contabilitate@exemplu.ro\",\n    \"address_1\": \"Str. Exemplu nr. 1\",\n    \"phone\": \"0722000000\",\n    \"bank\": \"Banca Exemplu\",\n    \"iban\": \"RO49AAAA1B31007593840000\"\n  }\n}"
            },
            {
              "name": "404 Client inexistent",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/clients/999999999",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients",
                    "999999999"
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 404,\n  \"statusMessage\": \"Clientul nu a fost gasit\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ]
        },
        {
          "name": "Actualizează",
          "_postman_id": "8234dae2-7472-5a8a-939b-2101c30f2ce7",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/clients/{{client_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "clients",
                "{{client_id}}"
              ]
            },
            "description": "Actualizează doar câmpurile trimise (aceleași câmpuri ca la creare); restul rămân neschimbate. Validarea se face pe clientul rezultat (de ex. un client din București trebuie să aibă în continuare `city` = `Sector N`). Nu se face completare din ANAF.\n\n**Răspuns**: `statusMessage` `Client actualizat`, `data` = clientul.\n\n**Erori**: 404 `Clientul nu a fost gasit`; 422 `Eroare validare client: ...`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"0722999999\",\n  \"email\": \"facturi@exemplu.ro\",\n  \"address_line_1\": \"Str. Exemplu nr. 3\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"phone\": \"0722999999\",\n  \"email\": \"facturi@exemplu.ro\",\n  \"address_line_1\": \"Str. Exemplu nr. 3\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/clients/{{client_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "clients",
                    "{{client_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Client actualizat\",\n  \"data\": {\n    \"id\": 2,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"is_pf\": false,\n    \"has_vat\": true,\n    \"vat\": \"10000008\",\n    \"country\": {\n      \"code\": \"RO\",\n      \"name\": \"Romania\"\n    },\n    \"state\": {\n      \"code\": \"B\",\n      \"name\": \"Bucuresti\"\n    },\n    \"city\": \"Sector 1\",\n    \"email\": \"facturi@exemplu.ro\",\n    \"address_1\": \"Str. Exemplu nr. 3\",\n    \"phone\": \"0722999999\",\n    \"bank\": \"Banca Exemplu\",\n    \"iban\": \"RO49AAAA1B31007593840000\"\n  }\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Proiecte",
      "description": "Proiectele companiei și pontajul zilnic pe proiect (pentru aplicații de time-tracking). Orele pontate se facturează din WeBill.",
      "item": [
        {
          "name": "Listă",
          "_postman_id": "f403deb0-d135-5cfd-b685-ffdaeecace2f",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/projects",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "projects"
              ]
            },
            "description": "Toate proiectele companiei, cele mai noi primele (fără paginare).\n\n**`projects[]`**: `id`, `project_name`, `status` (`working` activ, `standby` pauză, `draft` ciornă, `completed` finalizat, `canceled` anulat), `client_id`, `client` (`id`, `company`) / `null`, `currency`, `default_price_per_hour`, `estimative_price`, `deadline`.\n\nScriptul de test salvează primul proiect în `project_id`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/projects",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "projects"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Proiecte\",\n  \"data\": {\n    \"projects\": [\n      {\n        \"id\": 1,\n        \"project_name\": \"Implementare magazin online\",\n        \"status\": \"working\",\n        \"client_id\": 1,\n        \"client\": {\n          \"id\": 1,\n          \"company\": \"CLIENT DEMO SRL\"\n        },\n        \"currency\": \"RON\",\n        \"default_price_per_hour\": 150,\n        \"estimative_price\": 6000,\n        \"deadline\": null\n      }\n    ]\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if ((body.data.projects[0] || {}).id !== undefined && (body.data.projects[0] || {}).id !== null) pm.environment.set('project_id', String((body.data.projects[0] || {}).id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Pontaj zilnic",
          "_postman_id": "5595bd56-915d-53a8-899b-bc191c3a0af3",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/projects/{{project_id}}/timesheets",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "projects",
                "{{project_id}}",
                "timesheets"
              ]
            },
            "description": "Înregistrează timpul lucrat într-o zi pe un proiect. Există **un singur pontaj pe proiect și zi**: a doua cerere pentru aceeași zi îl suprascrie (200), prima îl creează (201).\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `job_date` | `AAAA-LL-ZZ` | da | Ziua lucrată. |\n| `job_time` | `H:MM` / `HH:MM` / `HH:MM:SS` | da | Durata lucrată (nu ora din zi), ex. `2:30` = 2 ore și 30 de minute. |\n| `job_notes` | string | da | Ce s-a lucrat. |\n| `billable` | bool | nu | Se facturează. Implicit `true` (și la suprascriere, dacă lipsește). |\n| `status` | int | nu | `0` To Do, `2` In Progress, `5` In review (implicit), `1` Done, `3` On Hold, `4` Canceled. |\n| `created_by` | int | nu | ID-ul utilizatorului WeBill care a lucrat. |\n\nTariful orar este întotdeauna `default_price_per_hour` al proiectului.\n\n**Răspuns**: `id`, `project_id`, `job_date`, `job_time`, `job_timespan` (minute), `job_notes`, `billable`, `status`, `price_per_hour`, `created_by`.\n\n**Erori**: 404 `Proiectul nu a fost gasit` (inexistent sau al altei companii); 422 `Date invalide la pontaj` cu `errors` pe câmpuri.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"job_date\": \"{{today}}\",\n  \"job_time\": \"2:30\",\n  \"job_notes\": \"Integrare API facturare\",\n  \"billable\": true,\n  \"status\": 5\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "201 Created",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"job_date\": \"{{today}}\",\n  \"job_time\": \"2:30\",\n  \"job_notes\": \"Integrare API facturare\",\n  \"billable\": true,\n  \"status\": 5\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/projects/{{project_id}}/timesheets",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "projects",
                    "{{project_id}}",
                    "timesheets"
                  ]
                }
              },
              "status": "Created",
              "code": 201,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 201,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 1,\n    \"project_id\": 1,\n    \"job_date\": \"2026-10-29\",\n    \"job_time\": \"2:30:00\",\n    \"job_timespan\": 150,\n    \"job_notes\": \"Integrare API facturare\",\n    \"billable\": true,\n    \"status\": 5,\n    \"price_per_hour\": 150,\n    \"created_by\": 1\n  }\n}"
            },
            {
              "name": "422 Câmpuri lipsă",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"job_time\": \"90\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/projects/{{project_id}}/timesheets",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "projects",
                    "{{project_id}}",
                    "timesheets"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Date invalide la pontaj\",\n  \"errors\": {\n    \"job_date\": [\n      \"Campul job date este obligatoriu.\"\n    ],\n    \"job_time\": [\n      \"Formatul campului job time nu este valid.\"\n    ],\n    \"job_notes\": [\n      \"Campul job notes este obligatoriu.\"\n    ]\n  },\n  \"data\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Facturi fiscale",
      "description": "Facturi fiscale: emitere, modificare, PDF, email, încasări, anulare și stornare. Cererile sunt în ordinea în care pot fi rulate cap-coadă (Collection Runner); fiecare creare salvează ID-ul în Environment.",
      "item": [
        {
          "name": "Creează",
          "_postman_id": "f834f24c-149f-5a31-b502-b160cc8a849a",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices"
              ]
            },
            "description": "Emite o factură fiscală **emisă**, numerotată în seria aleasă (API-ul nu creează ciorne). Transmiterea în SPV (e-Factura) se face din WeBill, după setările companiei. Scriptul de test salvează ID-ul în `invoice_id`, seria și numărul în `invoice_serie` / `invoice_number`.\n\nCu modulul Gestiune pornit, liniile cu produse urmărite pe stoc descarcă stocul din gestiunea implicită, din loturile cele mai vechi (API-ul nu primește gestiunea sau lotul). Stoc insuficient → 422 `Stoc insuficient pentru \"...\" in gestiunea \"...\", la AAAA-LL-ZZ: disponibil X, necesar Y.`, iar factura nu se creează.\n\n**Body**\n\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `client_id` | int | unul din `client_id` / `client` | Client existent al companiei (vezi Clienți). |\n| `client` | obiect | unul din `client_id` / `client` | Client inline, cu aceleași câmpuri și reguli ca POST /clients (persoana juridică existentă cu același CUI este refolosită). Eroare → 422 `Client invalid: ...`. |\n| `items` | array | da | Cel puțin o linie (vezi mai jos). |\n| `serie_id` | int | nu | Seria (Nomenclatoare > Facturi: `invoice_series` / `proforma_series`). Implicit seria marcată „Implicită” în Setări, altfel prima serie activă. Serie străină / inactivă → 422 `INVALID_INVOICE_SERIE` / `INVALID_PROFORMA_SERIE`. |\n| `delegate_id` | int | nu | Delegatul (`delegates`). Implicit delegatul marcat „Implicit” în Setări, altfel primul delegat activ. → 422 `INVALID_DELEGATE`. |\n| `bank_accounts` | int[] | nu | Conturile bancare tipărite pe document (`banks`). Implicit contul marcat „Implicit” în moneda documentului, altfel toate conturile active. → 422 `INVALID_BANK_ACCOUNT`. |\n| `issue_date` | `AAAA-LL-ZZ` | nu | Data documentului; implicit azi. O factură nu poate fi datată înaintea ultimei facturi emise din aceeași serie (422). |\n| `due_days` / `due_date` | int ≥ 0 sau dată | nu | Termenul de plată: numărul de zile (implicit 15) sau direct data scadenței, `AAAA-LL-ZZ` (sau `ZZ.LL.AAAA`), care nu poate fi înaintea datei documentului. |\n| `currency` | string (3) | nu | Implicit `RON`. Lista în Nomenclatoare > Facturi (`currencies`). |\n| `exchange_rate` | număr | nu | Implicit cursul BNR al datei documentului (1 pentru RON). |\n| `language` | `ro` / `en` | nu | Limba documentului (PDF, email). Implicit `ro`. |\n| `comments` | string | nu | Observații tipărite pe document. |\n| `document_type` | int | nu | Tipul e-Factura: `380` factură (implicit), `751` factură în scop de informare contabilă, `389` autofactură (emisă în numele furnizorului: clientul documentului e furnizorul, compania e cumpărătorul). |\n| `order_id` | string | nu | ID-ul comenzii din sistemul tău. **Idempotență**: o factură pentru același client și același `order_id` creată în ultimele 2 minute este întoarsă în loc să se creeze un duplicat (sigur la reîncercări după timeout). Două cereri simultane cu același `order_id` → a doua primește 409 `Comanda este deja in curs de facturare. Reincearca.` |\n| `curier`, `awb` | string | nu | Date de livrare. |\n| `generate_payment_link` | bool | nu | `true` generează un link de plată cu cardul (Netopia) inclus în email și PDF. Cere un cont Netopia activ în companie, altfel 400. |\n\n\n**Linii (`items[]`)**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `description` | string ≤ 255 | da* | Denumirea produsului / serviciului. |\n| `details` | string | nu | Text suplimentar pe linie. |\n| `um` | string ≤ 50 | da* | Unitatea de măsură: denumirea folosită de companie (ex. `BUC`, `ORA`) sau codul UN/ECE (`H87`, `HUR`). Lista: Nomenclatoare > Facturi (`units`). |\n| `qty` | număr > 0 | da | Cantitatea. Zecimale cu punct sau virgulă. |\n| `unit_price` | număr ≥ 0 | da* | Prețul unitar, în moneda liniei. |\n| `tax_included` | bool | nu | Implicit `true`: prețul include TVA. `false` = preț fără TVA. |\n| `tax_value` | număr 0–100 | nu | Cota TVA în procente (ex. `21`, `11`, `0`). Se potrivește cu o cotă activă a companiei cu exact acest procent; vezi `taxes` din Nomenclatoare > Facturi. |\n| `tax_id` | int | nu | ID-ul cotei TVA din Nomenclatoare > Facturi. Are prioritate față de `tax_value`. Cotă inexistentă / inactivă → 422 `INVALID_TAX`. |\n| `discount` | număr | nu | Reducere pe linie, ca **valoare** (în moneda liniei). |\n| `discount_type` | string | nu | Doar `valoric` (implicit). Reducerea procentuală nu este disponibilă prin API. |\n| `currency` | string (3) | nu | Moneda liniei; implicit moneda documentului. Conversia se face la cursul BNR al datei documentului. |\n| `product_id` | int | nu | Produs din Nomenclatoare > Produse și servicii: câmpurile netrimise (`description`, `details`, `um`, `unit_price`, `currency`, `tax_id`, `tax_included`, `cpv_code`) se completează din produs. Produs inexistent → 422 `INVALID_PRODUCT`. |\n| `cpv_code` | string | nu | Cod CPV (achiziții publice). |\n\n\\* nu sunt obligatorii când linia are `product_id`. O cantitate, un preț sau o reducere negativă marchează linia ca linie de stornare.\n\n**Exemplu de calcul** (body-ul de mai jos): linia 1 are prețul cu TVA inclus (1000 = 826,45 + 173,55 TVA); linia 2 are prețul fără TVA: 2 × 150 − 30 reducere = 270 + 56,70 TVA. Totalurile sunt în `totals`.\n\n**Răspuns**: `statusMessage` `Document creat`.\n\n**`data` (document)**\n- `id`, `document_type` (`invoice` / `proforma`), `company_id`, `serie_id`, `serie`, `number`, `number_display` (ex. `WB000012`).\n- `date` (`AAAA-LL-ZZ`), `due_days`, `due_date` (**`ZZ.LL.AAAA`**, păstrat așa pentru integrările existente), `due_date_iso` (aceeași zi, `AAAA-LL-ZZ`), `currency`, `exchange_rate`, `language`, `efactura_type` (380 / 751 / 389 / 100).\n- `status`: `emisa`, `anulata`, `storno` (factura inversă a unei stornări).\n- `status_incasare`: `pending` (neîncasată), `partial`, `incasata`, `compensata` (închisă din credit / stornare parțială), `stornata`.\n- `client`: obiectul client (ca la Clienți > Detaliu).\n- `totals.items[]`: liniile — `id` (folosit la stornare), `denumire`, `nota`, `um`, `um_code`, `qty`, `cota_tva`, `pret_cu_tva`, `pret_fara_tva`, `valoare` (fără TVA), `tva`, `discount`, `discount_net`, `discount_tva`, `cpv_code`.\n- `totals.subtotal`: pe cota TVA (`\"21\": {\"total_fara_tva\", \"total_tva\"}`); `totals.total`: `valoare` (fără TVA) și `tva` sunt **înainte de reduceri**, `total` (de plată) este **după** reduceri: `total = valoare + tva - discount.total`; `totals.discount`: reducerile; `totals.stats`: `incasat`, `rest` (rest de plată).\n- `items_count`, `payment_link_requested`, `payment_link` (linkul de plată Netopia activ sau `null`).\n\n**Erori**\n- 400 `Payload JSON invalid: ...` — corpul nu este JSON valid.\n- 422 `Date invalide la linii`, cu erorile în `errors` pe cheia liniei (ex. `{\"items.0.description\": [\"Campul description este obligatoriu.\"]}`); la fel pentru `items: []`.\n- 422 `Data din campul issue_date nu este valida (format AAAA-LL-ZZ).` (sau `date`, după câmpul trimis) — o dată pe care serverul nu o poate citi nu mai devine data de azi.\n- 422 pentru un `due_date` care nu e nici număr de zile, nici dată, sau care e înaintea datei documentului.\n- 422 `Clientul nu a fost identificat` — lipsește `client_id` / `client` sau clientul nu este al companiei.\n- 422 `Date invalide la document` + `errors` pe câmpuri (ex. `errors.items`).\n- 422 cu `errors.code`: `INVALID_INVOICE_SERIE`, `INVALID_PROFORMA_SERIE`, `INVALID_DELEGATE`, `INVALID_BANK_ACCOUNT`, `INVALID_TAX`, `INVALID_TAX_CLIENT` (cotă de taxare inversă / intracomunitară nepotrivită clientului), `INVALID_PRODUCT`, `INVALID_CLIENT`, `INVALID_ITEMS`.\n- 422 `Data facturii (...) nu poate fi inaintea ultimei facturi emise din seria ...` (`errors.issue_date`).\n- 409 `Comanda este deja in curs de facturare. Reincearca.` — altă cerere cu același `order_id` este în curs.\n- 400 `Compania nu are un cont Netopia activ pentru generarea linkului de plata.`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": {{client_id}},\n  \"serie_id\": {{serie_id}},\n  \"delegate_id\": {{delegate_id}},\n  \"bank_accounts\": [\n    {{bank_id}}\n  ],\n  \"issue_date\": \"{{today}}\",\n  \"due_days\": 15,\n  \"currency\": \"RON\",\n  \"language\": \"ro\",\n  \"document_type\": 380,\n  \"order_id\": \"WC-{{$timestamp}}\",\n  \"comments\": \"Comanda online WC-1001\",\n  \"generate_payment_link\": false,\n  \"items\": [\n    {\n      \"description\": \"Abonament platformă\",\n      \"details\": \"Luna curentă\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 1000,\n      \"tax_included\": true,\n      \"tax_value\": 21\n    },\n    {\n      \"description\": \"Licență utilizator suplimentar\",\n      \"um\": \"BUC\",\n      \"qty\": 2,\n      \"unit_price\": 150,\n      \"tax_included\": false,\n      \"tax_value\": 21,\n      \"discount\": 30,\n      \"discount_type\": \"valoric\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": {{client_id}},\n  \"serie_id\": {{serie_id}},\n  \"delegate_id\": {{delegate_id}},\n  \"bank_accounts\": [\n    {{bank_id}}\n  ],\n  \"issue_date\": \"{{today}}\",\n  \"due_days\": 15,\n  \"currency\": \"RON\",\n  \"language\": \"ro\",\n  \"document_type\": 380,\n  \"order_id\": \"WC-{{$timestamp}}\",\n  \"comments\": \"Comanda online WC-1001\",\n  \"generate_payment_link\": false,\n  \"items\": [\n    {\n      \"description\": \"Abonament platformă\",\n      \"details\": \"Luna curentă\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 1000,\n      \"tax_included\": true,\n      \"tax_value\": 21\n    },\n    {\n      \"description\": \"Licență utilizator suplimentar\",\n      \"um\": \"BUC\",\n      \"qty\": 2,\n      \"unit_price\": 150,\n      \"tax_included\": false,\n      \"tax_value\": 21,\n      \"discount\": 30,\n      \"discount_type\": \"valoric\"\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document creat\",\n  \"data\": {\n    \"id\": 1,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 1,\n    \"number_display\": \"WB000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 1,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Abonament platformă\",\n          \"nota\": \"Luna curentă\",\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 1000,\n          \"pret_fara_tva\": 826.45,\n          \"valoare\": 826.45,\n          \"tva\": 173.55,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        },\n        {\n          \"id\": 2,\n          \"sort_order\": 2,\n          \"type\": 1,\n          \"denumire\": \"Licență utilizator suplimentar\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 2,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 181.5,\n          \"pret_fara_tva\": 150,\n          \"valoare\": 300,\n          \"tva\": 63,\n          \"discount\": 36.3,\n          \"discount_net\": 30,\n          \"discount_tva\": 6.3,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 1096.45,\n          \"total_tva\": 230.25\n        }\n      },\n      \"total\": {\n        \"valoare\": 1126.45,\n        \"tva\": 236.55,\n        \"total\": 1326.7\n      },\n      \"discount\": {\n        \"valoare\": 30,\n        \"tva\": 6.3,\n        \"total\": 36.3\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 1326.7\n      }\n    },\n    \"items_count\": 2,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            },
            {
              "name": "422 Cotă TVA indisponibilă",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": \"{{client_id}}\",\n  \"items\": [\n    {\n      \"description\": \"Serviciu\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 100,\n      \"tax_id\": 999999999\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Cota TVA selectata nu este disponibila.\",\n  \"errors\": {\n    \"code\": \"INVALID_TAX\"\n  },\n  \"data\": null\n}"
            },
            {
              "name": "422 Fără client",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"items\": [\n    {\n      \"description\": \"Serviciu\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 100\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Clientul nu a fost identificat\",\n  \"errors\": [],\n  \"data\": null\n}"
            },
            {
              "name": "422 Linie invalidă",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": \"{{client_id}}\",\n  \"items\": [\n    {\n      \"um\": \"BUC\",\n      \"qty\": 0,\n      \"unit_price\": 100\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Date invalide la linii\",\n  \"errors\": {\n    \"items.0.description\": [\n      \"Campul description este obligatoriu.\"\n    ],\n    \"items.0.qty\": [\n      \"Campul qty trebuie sa fie cel putin 0.0001.\"\n    ],\n    \"items.0.tax_id\": [\n      \"Cota de TVA a liniei este obligatorie.\"\n    ]\n  },\n  \"data\": null\n}"
            },
            {
              "name": "422 Scadență înaintea datei",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": \"{{client_id}}\",\n  \"issue_date\": \"{{today}}\",\n  \"due_date\": \"2000-01-01\",\n  \"items\": [\n    {\n      \"description\": \"Serviciu\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 100\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Data scadentei (due_date) nu poate fi inaintea datei documentului.\",\n  \"errors\": {\n    \"due_date\": [\n      \"Data scadentei (due_date) nu poate fi inaintea datei documentului.\"\n    ]\n  },\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('invoice_id', String(body.data.id));",
                  "    if (body.data.serie) pm.environment.set('invoice_serie', String(body.data.serie));",
                  "    if (body.data.number !== undefined && body.data.number !== null) pm.environment.set('invoice_number', String(body.data.number));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Creează minimă",
          "_postman_id": "b3df5d7d-1276-5c6b-b31b-2080a0f780ff",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices"
              ]
            },
            "description": "Cea mai scurtă factură validă: clientul și liniile. Seria, delegatul, conturile bancare, data (azi), termenul (15 zile), moneda (RON) și limba (ro) iau valorile implicite ale companiei; o linie fără `tax_value` / `tax_id` primește cota implicită. Scriptul de test salvează ID-ul în `invoice_id_2`.\n\nCâmpurile sunt descrise la **Creează**.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": {{client_id}},\n  \"items\": [\n    {\n      \"description\": \"Mentenanță lunară\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 121,\n      \"tax_value\": 21\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": {{client_id}},\n  \"items\": [\n    {\n      \"description\": \"Mentenanță lunară\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 121,\n      \"tax_value\": 21\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document creat\",\n  \"data\": {\n    \"id\": 2,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 2,\n    \"number_display\": \"WB000002\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 3,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Mentenanță lunară\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 121,\n          \"pret_fara_tva\": 100,\n          \"valoare\": 100,\n          \"tva\": 21,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 100,\n          \"total_tva\": 21\n        }\n      },\n      \"total\": {\n        \"valoare\": 100,\n        \"tva\": 21,\n        \"total\": 121\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 121\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('invoice_id_2', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Creează cu client inline",
          "_postman_id": "ab356b97-d5fe-5112-a129-8cc4c346c8f2",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices"
              ]
            },
            "description": "Factură cu clientul trimis direct în `client` (fără să-l creezi întâi): clientul PJ existent cu același CUI este refolosit, altfel se creează. Util pentru magazinele online. Câmpurile clientului sunt cele de la **Clienți > Creează**; pentru o persoană fizică fără CNP trimite `is_pf: true` fără `vat`.\n\nFolosește `product_id` (din Nomenclatoare > Produse): linia se completează din nomenclator. Scriptul de test salvează ID-ul în `invoice_id_3`.\n\n**Erori** în plus față de **Creează**: 422 `Client invalid: <motiv>`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client\": {\n    \"is_pf\": false,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"vat\": \"RO10000008\",\n    \"country\": \"RO\",\n    \"state\": \"B\",\n    \"city\": \"Sector 1\",\n    \"address_line_1\": \"Str. Exemplu nr. 1\",\n    \"email\": \"contabilitate@exemplu.ro\"\n  },\n  \"order_id\": \"WC-{{$timestamp}}-2\",\n  \"items\": [\n    {\n      \"product_id\": {{product_id}},\n      \"qty\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"is_pf\": false,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"vat\": \"RO10000008\",\n    \"country\": \"RO\",\n    \"state\": \"B\",\n    \"city\": \"Sector 1\",\n    \"address_line_1\": \"Str. Exemplu nr. 1\",\n    \"email\": \"contabilitate@exemplu.ro\"\n  },\n  \"order_id\": \"WC-{{$timestamp}}-2\",\n  \"items\": [\n    {\n      \"product_id\": {{product_id}},\n      \"qty\": 1\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document creat\",\n  \"data\": {\n    \"id\": 3,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 3,\n    \"number_display\": \"WB000003\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 4,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Abonament lunar\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 121,\n          \"pret_fara_tva\": 100,\n          \"valoare\": 100,\n          \"tva\": 21,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 100,\n          \"total_tva\": 21\n        }\n      },\n      \"total\": {\n        \"valoare\": 100,\n        \"tva\": 21,\n        \"total\": 121\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 121\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('invoice_id_3', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Creează cu încasare card",
          "_postman_id": "e53785b4-1e80-596d-97c4-dcf3e724074b",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/with-receipt",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "with-receipt"
              ]
            },
            "description": "Emite factura și o încasează în aceeași cerere, într-o singură tranzacție: dacă încasarea e invalidă, factura nu se creează. Potrivit pentru comenzile deja plătite online. Scriptul de test salvează ID-ul în `paid_invoice_id`.\n\n**Body**: câmpurile de la **Creează** plus `receipt` (obligatoriu), cu câmpurile de la **Încasări - Creează** (`type`, `amount`, `date`, `identifier`, `serie_id`, `notes`).\n\n**Răspuns**: `statusMessage` `Document si incasare create`; `data` = factura (ca la Creează) plus cheia `receipt` (încasarea).\n\n**Erori** în plus: 422 `Date invalide la incasare` (`errors.receipt`: `Obiectul receipt este obligatoriu.`, sau erori pe câmpurile încasării); 422 `INVOICE_PAYMENT_AMOUNT_INVALID`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client\": {\n    \"is_pf\": false,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"vat\": \"RO10000008\",\n    \"country\": \"RO\",\n    \"state\": \"B\",\n    \"city\": \"Sector 1\",\n    \"address_line_1\": \"Str. Exemplu nr. 1\",\n    \"email\": \"contabilitate@exemplu.ro\"\n  },\n  \"issue_date\": \"{{today}}\",\n  \"currency\": \"RON\",\n  \"order_id\": \"CARD-{{$timestamp}}\",\n  \"comments\": \"Comanda achitata online\",\n  \"items\": [\n    {\n      \"description\": \"Produs achitat online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 242,\n      \"tax_included\": true,\n      \"tax_value\": 21\n    }\n  ],\n  \"receipt\": {\n    \"type\": \"card\",\n    \"identifier\": \"TX-{{$timestamp}}\",\n    \"amount\": 242,\n    \"date\": \"{{today}}\",\n    \"notes\": \"Plata card confirmata\"\n  }\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client\": {\n    \"is_pf\": false,\n    \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n    \"vat\": \"RO10000008\",\n    \"country\": \"RO\",\n    \"state\": \"B\",\n    \"city\": \"Sector 1\",\n    \"address_line_1\": \"Str. Exemplu nr. 1\",\n    \"email\": \"contabilitate@exemplu.ro\"\n  },\n  \"issue_date\": \"{{today}}\",\n  \"currency\": \"RON\",\n  \"order_id\": \"CARD-{{$timestamp}}\",\n  \"comments\": \"Comanda achitata online\",\n  \"items\": [\n    {\n      \"description\": \"Produs achitat online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 242,\n      \"tax_included\": true,\n      \"tax_value\": 21\n    }\n  ],\n  \"receipt\": {\n    \"type\": \"card\",\n    \"identifier\": \"TX-{{$timestamp}}\",\n    \"amount\": 242,\n    \"date\": \"{{today}}\",\n    \"notes\": \"Plata card confirmata\"\n  }\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/with-receipt",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "with-receipt"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document si incasare create\",\n  \"data\": {\n    \"id\": 4,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 4,\n    \"number_display\": \"WB000004\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"incasata\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 5,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Produs achitat online\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 242,\n          \"pret_fara_tva\": 200,\n          \"valoare\": 200,\n          \"tva\": 42,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 200,\n          \"total_tva\": 42\n        }\n      },\n      \"total\": {\n        \"valoare\": 200,\n        \"tva\": 42,\n        \"total\": 242\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 242,\n        \"rest\": 0\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null,\n    \"receipt\": {\n      \"id\": 1,\n      \"invoice_id\": 4,\n      \"type\": \"card\",\n      \"identifier\": \"TX-1793271228\",\n      \"serie_id\": null,\n      \"serie\": null,\n      \"number\": null,\n      \"receipt_number\": \"TX-1793271228\",\n      \"date\": \"2026-10-29\",\n      \"amount\": 242,\n      \"notes\": \"Plata card confirmata\",\n      \"created_at\": \"2026-10-29 12:53:48\",\n      \"updated_at\": \"2026-10-29 12:53:48\"\n    }\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('paid_invoice_id', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Actualizează",
          "_postman_id": "7cfb569e-1b9c-53ed-911c-a3aa5e7d822b",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}"
              ]
            },
            "description": "Modifică o factură emisă care **nu a fost trimisă în SPV**. Se schimbă doar câmpurile trimise (cele de la **Creează**, plus `status`).\n\n- `client_id` (sau `client`) e opțional: fără el factura își păstrează clientul; trimis, schimbă clientul.\n- `items`, dacă e trimis, **înlocuiește toate liniile** facturii.\n- `status`: `emisa`, `anulata`, `storno`, doar prin tranzițiile permise; pentru anulare și stornare folosește endpointurile dedicate.\n\n**Răspuns**: `statusMessage` `Document actualizat`, `data` = factura.\n\n**Erori**\n- 404 `Documentul nu a fost gasit`.\n- 409 `Factura nu mai poate fi modificata.` (`errors.invoice`) — factura a fost trimisă în SPV sau este blocată de o stornare parțială / factură de corecție / reducere. Corecția se face prin stornare.\n- 422 `Clientul nu a fost identificat` — `client_id` trimis nu este un client al companiei.\n- celelalte erori de la **Creează**.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": {{client_id}},\n  \"curier\": \"Fan Courier\",\n  \"awb\": \"2345678901\",\n  \"comments\": \"Livrare prin curier\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": {{client_id}},\n  \"curier\": \"Fan Courier\",\n  \"awb\": \"2345678901\",\n  \"comments\": \"Livrare prin curier\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document actualizat\",\n  \"data\": {\n    \"id\": 1,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 1,\n    \"number_display\": \"WB000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 1,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Abonament platformă\",\n          \"nota\": \"Luna curentă\",\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 1000,\n          \"pret_fara_tva\": 826.45,\n          \"valoare\": 826.45,\n          \"tva\": 173.55,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        },\n        {\n          \"id\": 2,\n          \"sort_order\": 2,\n          \"type\": 1,\n          \"denumire\": \"Licență utilizator suplimentar\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 2,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 181.5,\n          \"pret_fara_tva\": 150,\n          \"valoare\": 300,\n          \"tva\": 63,\n          \"discount\": 36.3,\n          \"discount_net\": 30,\n          \"discount_tva\": 6.3,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 1096.45,\n          \"total_tva\": 230.25\n        }\n      },\n      \"total\": {\n        \"valoare\": 1126.45,\n        \"tva\": 236.55,\n        \"total\": 1326.7\n      },\n      \"discount\": {\n        \"valoare\": 30,\n        \"tva\": 6.3,\n        \"total\": 36.3\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 1326.7\n      }\n    },\n    \"items_count\": 2,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            },
            {
              "name": "422 Client necunoscut",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": 999999999\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Clientul nu a fost identificat\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ]
        },
        {
          "name": "Detaliu",
          "_postman_id": "e86814fa-cde5-53d3-bbf5-ec771f9033ad",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}"
              ]
            },
            "description": "Factura, cu clientul, totalurile pe cote de TVA, liniile (`totals.items`) și situația încasării (`totals.stats.incasat`, `totals.stats.rest`).\n\n**`data` (document)**\n- `id`, `document_type` (`invoice` / `proforma`), `company_id`, `serie_id`, `serie`, `number`, `number_display` (ex. `WB000012`).\n- `date` (`AAAA-LL-ZZ`), `due_days`, `due_date` (**`ZZ.LL.AAAA`**, păstrat așa pentru integrările existente), `due_date_iso` (aceeași zi, `AAAA-LL-ZZ`), `currency`, `exchange_rate`, `language`, `efactura_type` (380 / 751 / 389 / 100).\n- `status`: `emisa`, `anulata`, `storno` (factura inversă a unei stornări).\n- `status_incasare`: `pending` (neîncasată), `partial`, `incasata`, `compensata` (închisă din credit / stornare parțială), `stornata`.\n- `client`: obiectul client (ca la Clienți > Detaliu).\n- `totals.items[]`: liniile — `id` (folosit la stornare), `denumire`, `nota`, `um`, `um_code`, `qty`, `cota_tva`, `pret_cu_tva`, `pret_fara_tva`, `valoare` (fără TVA), `tva`, `discount`, `discount_net`, `discount_tva`, `cpv_code`.\n- `totals.subtotal`: pe cota TVA (`\"21\": {\"total_fara_tva\", \"total_tva\"}`); `totals.total`: `valoare` (fără TVA) și `tva` sunt **înainte de reduceri**, `total` (de plată) este **după** reduceri: `total = valoare + tva - discount.total`; `totals.discount`: reducerile; `totals.stats`: `incasat`, `rest` (rest de plată).\n- `items_count`, `payment_link_requested`, `payment_link` (linkul de plată Netopia activ sau `null`).\n\n**Erori**: 404 `Factura nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 1,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 1,\n    \"number_display\": \"WB000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 1,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Abonament platformă\",\n          \"nota\": \"Luna curentă\",\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 1000,\n          \"pret_fara_tva\": 826.45,\n          \"valoare\": 826.45,\n          \"tva\": 173.55,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        },\n        {\n          \"id\": 2,\n          \"sort_order\": 2,\n          \"type\": 1,\n          \"denumire\": \"Licență utilizator suplimentar\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 2,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 181.5,\n          \"pret_fara_tva\": 150,\n          \"valoare\": 300,\n          \"tva\": 63,\n          \"discount\": 36.3,\n          \"discount_net\": 30,\n          \"discount_tva\": 6.3,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 1096.45,\n          \"total_tva\": 230.25\n        }\n      },\n      \"total\": {\n        \"valoare\": 1126.45,\n        \"tva\": 236.55,\n        \"total\": 1326.7\n      },\n      \"discount\": {\n        \"valoare\": 30,\n        \"tva\": 6.3,\n        \"total\": 36.3\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 1326.7\n      }\n    },\n    \"items_count\": 2,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ]
        },
        {
          "name": "Caută după serie și număr",
          "_postman_id": "b502506c-cdca-422c-8ab2-28c66516b4a7",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number={{invoice_number}}&company_vat={{company_vat}}&client_vat={{client_vat}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "find"
              ],
              "query": [
                {
                  "key": "serie",
                  "value": "{{invoice_serie}}"
                },
                {
                  "key": "number",
                  "value": "{{invoice_number}}"
                },
                {
                  "key": "company_vat",
                  "value": "{{company_vat}}"
                },
                {
                  "key": "date",
                  "value": "{{today}}",
                  "disabled": true,
                  "description": "Opțional: data documentului (AAAA-LL-ZZ)."
                },
                {
                  "key": "client_vat",
                  "value": "{{client_vat}}",
                  "description": "Opțional: CUI-ul / CNP-ul clientului tipărit pe document."
                },
                {
                  "key": "client_name",
                  "value": "",
                  "disabled": true,
                  "description": "Opțional: numele clientului de pe document."
                }
              ]
            },
            "description": "Factura fiscală cu seria și numărul date, confirmată de codul fiscal al emitentului și, opțional, de dată și de client, în compania tokenului: același răspuns ca la Detaliu (`GET /invoices/{id}`). Util când sistemul tău a păstrat numărul tipărit, nu ID-ul WeBill.\n\n**Exact sau nimic.** Căutarea nu ghicește: dacă ceva nu corespunde întocmai sau mai multe documente se potrivesc, primești o eroare, niciodată documentul „cel mai probabil”. O automatizare care acționează pe răspuns (încasare, stornare) nu poate atinge astfel o factură greșită.\n\n**Query** (`serie`, `number` și `company_vat` obligatorii; restul opționale, fiecare trimis se compară)\n\n| Parametru | Detalii |\n| --- | --- |\n| `serie` | Seria, ex. `WB`. |\n| `number` | Numărul: doar cifre (`12`, `0012`) sau numărul tipărit cu seria în față (`WB0012`). Orice altceva (`12a`, `WB-12`, altă serie) → 400. |\n| `company_vat` | CUI-ul emitentului, cum apare pe document (pentru un punct de lucru, al companiei-mamă). Se acceptă cu sau fără `RO`, cu spații. |\n| `date` | Opțional. Data documentului, `AAAA-LL-ZZ`. Deosebește documentele vechi cu aceeași serie și același număr. |\n| `client_vat` | Opțional. CUI-ul / CNP-ul clientului **cum a fost tipărit la emitere** (o schimbare ulterioară a clientului nu contează). Cu sau fără `RO`; un cod străin își păstrează prefixul țării (`DE123...`). La persoanele fizice fără CNP (`0000000000000`) codul nu identifică pe nimeni: lasă-l gol sau folosește `date`. |\n| `client_name` | Opțional. Numele clientului de pe document, comparat fără majuscule, diacritice și spații în plus. |\n\n| Răspuns | `errors.code` | Când |\n| --- | --- | --- |\n| 200 | — | Exact un document se potrivește. |\n| 400 | — | Lipsește un parametru obligatoriu, `number` nu este exact numărul documentului sau `date` nu e o dată `AAAA-LL-ZZ`. |\n| 404 | `DOCUMENT_NOT_FOUND` | Nu există niciun document cu seria și numărul acestea (`Factura nu a fost gasita`). |\n| 404 | `COMPANY_MISMATCH` | Documentul există, dar emitentul are alt cod fiscal (ex. tokenul altei companii). |\n| 404 | `DATE_MISMATCH` | Documentul există, dar are altă dată. |\n| 404 | `CLIENT_MISMATCH` | Documentul există, dar clientul are alt cod fiscal sau alt nume. |\n| 409 | `AMBIGUOUS_DOCUMENT` | Mai multe documente se potrivesc (aceeași serie și același număr, fără `date` sau client care să le deosebească) (ex. o factură veche și stornarea ei cu același număr). `errors.candidates[]` are `id`, `date`, `status`: alege documentul și cere-l cu `GET /invoices/{id}`. |\n\nProformele nu sunt căutate aici (au `proforme/find`). Ciornele nu au număr, deci nu se găsesc."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number={{invoice_number}}&company_vat={{company_vat}}&client_vat={{client_vat}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{invoice_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "{{invoice_number}}"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "client_vat",
                      "value": "{{client_vat}}"
                    },
                    {
                      "key": "client_name",
                      "value": "",
                      "disabled": true,
                      "description": "Doar la CNP-ul anonim 0000000000000."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 1,\n    \"document_type\": \"invoice\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"WB\",\n    \"number\": 1,\n    \"number_display\": \"WB000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 15,\n    \"due_date\": \"13.11.2026\",\n    \"due_date_iso\": \"2026-11-13\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 380,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 1,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Abonament platformă\",\n          \"nota\": \"Luna curentă\",\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 1000,\n          \"pret_fara_tva\": 826.45,\n          \"valoare\": 826.45,\n          \"tva\": 173.55,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        },\n        {\n          \"id\": 2,\n          \"sort_order\": 2,\n          \"type\": 1,\n          \"denumire\": \"Licență utilizator suplimentar\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 2,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 181.5,\n          \"pret_fara_tva\": 150,\n          \"valoare\": 300,\n          \"tva\": 63,\n          \"discount\": 36.3,\n          \"discount_net\": 30,\n          \"discount_tva\": 6.3,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 1096.45,\n          \"total_tva\": 230.25\n        }\n      },\n      \"total\": {\n        \"valoare\": 1126.45,\n        \"tva\": 236.55,\n        \"total\": 1326.7\n      },\n      \"discount\": {\n        \"valoare\": 30,\n        \"tva\": 6.3,\n        \"total\": 36.3\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 1326.7\n      }\n    },\n    \"items_count\": 2,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            },
            {
              "name": "404 Factura nu există",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number=999999&company_vat={{company_vat}}&client_vat={{client_vat}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{invoice_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "999999"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "client_vat",
                      "value": "{{client_vat}}"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 404,\n  \"statusMessage\": \"Factura nu a fost gasita\",\n  \"errors\": {\n    \"code\": \"DOCUMENT_NOT_FOUND\"\n  },\n  \"data\": null\n}"
            },
            {
              "name": "404 Alt client",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number={{invoice_number}}&company_vat={{company_vat}}&client_vat=14399840",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{invoice_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "{{invoice_number}}"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "client_vat",
                      "value": "14399840"
                    }
                  ]
                }
              },
              "status": "Not Found",
              "code": 404,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 404,\n  \"statusMessage\": \"Documentul exista, dar clientul nu corespunde\",\n  \"errors\": {\n    \"code\": \"CLIENT_MISMATCH\"\n  },\n  \"data\": null\n}"
            },
            {
              "name": "400 Număr inexact",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number={{invoice_number}}a&company_vat={{company_vat}}&client_vat={{client_vat}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{invoice_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "{{invoice_number}}a"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "client_vat",
                      "value": "{{client_vat}}"
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 400,\n  \"statusMessage\": \"Parametrul number trebuie sa fie numarul documentului (ex. 12, 0012 sau WB0012)\",\n  \"errors\": [],\n  \"data\": null\n}"
            },
            {
              "name": "400 Dată invalidă",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/find?serie={{invoice_serie}}&number={{invoice_number}}&company_vat={{company_vat}}&date=29-10-2026",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{invoice_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "{{invoice_number}}"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "date",
                      "value": "29-10-2026"
                    }
                  ]
                }
              },
              "status": "Bad Request",
              "code": 400,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 400,\n  \"statusMessage\": \"Parametrul date trebuie sa fie data documentului, in forma AAAA-LL-ZZ\",\n  \"errors\": [],\n  \"data\": null\n}"
            }
          ]
        },
        {
          "name": "Descarcă PDF",
          "_postman_id": "33f2789f-a871-518b-b9d4-40bf207b2977",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/download",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "download"
              ]
            },
            "description": "PDF-ul documentului. Răspunsul este fișierul (`Content-Type: application/pdf`, `Content-Disposition: attachment; filename=factura-fiscala-wb000012-09-10-2026.pdf`). În Postman: **Send and Download**.\n\n**Erori** (JSON): 404 `Documentul nu a fost gasit`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/download",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "download"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "text",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/pdf"
                },
                {
                  "key": "Content-Disposition",
                  "value": "attachment; filename=factura-fiscala-wb000001-29-10-2026.pdf"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": ""
            }
          ]
        },
        {
          "name": "Trimite pe email",
          "_postman_id": "f9477b9a-1229-5e56-a794-f88b6f05d313",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/email",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "email"
              ]
            },
            "description": "Trimite documentul pe email, cu PDF-ul atașat. Trimiterea se face asincron (în coadă), deci răspunsul confirmă programarea, nu livrarea. Fiecare trimitere apare în istoricul de emailuri al documentului din WeBill (sursa API), la facturi și la proforme.\n\n**Body** (toate opționale)\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `to` | string | nu | Destinatarul. Implicit emailul clientului (prima adresă validă; celelalte trec în CC). |\n| `cc` | string | nu | Adrese în copie, separate prin `,` sau `;`. |\n| `subject` | string | nu | Subiectul. Implicit `Factura fiscala #WB000012` / `Factura proforma #PF000003`. |\n\n**Răspuns**: `statusMessage` `Email programat pentru trimitere`, `data`: `document_id`, `recipient`.\n\n**Erori**: 404 `Documentul nu a fost gasit`; 400 `Clientul nu are email setat` (fără `to` și fără email la client).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"to\": \"client@exemplu.ro\",\n  \"cc\": \"contabilitate@exemplu.ro\",\n  \"subject\": \"Factura pentru comanda WC-1001\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"client@exemplu.ro\",\n  \"cc\": \"contabilitate@exemplu.ro\",\n  \"subject\": \"Factura pentru comanda WC-1001\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/email",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "email"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Email programat pentru trimitere\",\n  \"data\": {\n    \"document_id\": 1,\n    \"recipient\": \"client@exemplu.ro\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Listă",
          "_postman_id": "47173ef1-53ce-570c-b46d-902985eddaee",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts"
              ]
            },
            "description": "Încasările documentului, ordonate după dată, plus documentul (cu `totals.stats.incasat` / `rest`).\n\n**Răspuns**: `statusMessage` `Incasari document`, `data`: `document`, `receipts[]`.\n\n**`data` (încasare)**: `id`, `invoice_id` (ID-ul documentului), `type`, `identifier`, `serie_id`, `serie`, `number`, `receipt_number` (ex. `CH.1`, doar la numerar), `date`, `amount`, `notes`, `created_at`, `updated_at`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasari document\",\n  \"data\": {\n    \"document\": {\n      \"id\": 1,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 1,\n      \"number_display\": \"WB000001\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"pending\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 1,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Abonament platformă\",\n            \"nota\": \"Luna curentă\",\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 1000,\n            \"pret_fara_tva\": 826.45,\n            \"valoare\": 826.45,\n            \"tva\": 173.55,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          },\n          {\n            \"id\": 2,\n            \"sort_order\": 2,\n            \"type\": 1,\n            \"denumire\": \"Licență utilizator suplimentar\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 2,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 181.5,\n            \"pret_fara_tva\": 150,\n            \"valoare\": 300,\n            \"tva\": 63,\n            \"discount\": 36.3,\n            \"discount_net\": 30,\n            \"discount_tva\": 6.3,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 1096.45,\n            \"total_tva\": 230.25\n          }\n        },\n        \"total\": {\n          \"valoare\": 1126.45,\n          \"tva\": 236.55,\n          \"total\": 1326.7\n        },\n        \"discount\": {\n          \"valoare\": 30,\n          \"tva\": 6.3,\n          \"total\": 36.3\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": 1326.7\n        }\n      },\n      \"items_count\": 2,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    },\n    \"receipts\": []\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Creează",
          "_postman_id": "cc99b8c6-004a-5698-89bc-9ad5bcda82c6",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts"
              ]
            },
            "description": "Înregistrează o încasare pe document. Starea de încasare a documentului (`status_incasare`) se actualizează: `pending` → `partial` → `incasata`. O sumă mai mare decât restul este acceptată; diferența intră în creditul clientului.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `type` | string | da | Tipul încasării (tabelul de mai jos). |\n| `amount` | număr > 0 | da | Suma, în moneda documentului. |\n| `date` | `AAAA-LL-ZZ` | da | Data încasării. |\n| `identifier` | string ≤ 255 | la op / bf / card / ramburs | Referința plății (nr. OP, ID tranzacție, AWB, nr. bon). |\n| `serie_id` | int | la cash | Seria cu chitanțier (`invoice_series[].id` din Nomenclatoare > Facturi). Chitanța se numerotează automat. |\n| `notes` | string | nu | Observații. |\n\n| `type` | Ce este | Câmpuri cerute în plus |\n| --- | --- | --- |\n| `op` | Ordin de plată / transfer bancar | `identifier` (ex. numărul OP) |\n| `bf` | Bon fiscal | `identifier` (numărul bonului) |\n| `card` | Plată cu cardul / POS / online | `identifier` (ex. ID-ul tranzacției) |\n| `ramburs` | Ramburs prin curier | `identifier` (ex. AWB) |\n| `cash` | Numerar, cu chitanță numerotată automat | `serie_id` = ID-ul seriei de facturi care are chitanțierul (`invoice_series[].id`, câmpul `receipt_serie`) |\n| `avans` | Avans | — |\n| `credit` | Din creditul clientului (sume plătite în plus, stornări) | — ; suma nu poate depăși creditul disponibil |\n\n**Răspuns**: `statusMessage` `Incasare creata`.\n\n**`data` (încasare)**: `id`, `invoice_id` (ID-ul documentului), `type`, `identifier`, `serie_id`, `serie`, `number`, `receipt_number` (ex. `CH.1`, doar la numerar), `date`, `amount`, `notes`, `created_at`, `updated_at`.\n\n**Erori**\n- 404 `Documentul nu a fost gasit`.\n- 422 `Date invalide la incasare` + `errors` pe câmpuri (ex. `identifier`, `serie_id`).\n- 422 `INVOICE_PAYMENT_AMOUNT_INVALID`, `INVOICE_PAYMENT_TYPE_INVALID`, `INVALID_RECEIPT_SERIE`.\n- 422 `Creditul disponibil al clientului este ... RON.` (tipul `credit`).\n- 409 `INVOICE_PAYMENT_NOT_ALLOWED` — documentul nu mai acceptă încasări (anulat, stornat, proformă convertită).\n\nScriptul de test salvează ID-ul în `receipt_id`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"op\",\n  \"identifier\": \"OP-1001\",\n  \"amount\": 100,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Plata partiala prin OP\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"op\",\n  \"identifier\": \"OP-1001\",\n  \"amount\": 100,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Plata partiala prin OP\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare creata\",\n  \"data\": {\n    \"id\": 2,\n    \"invoice_id\": 1,\n    \"type\": \"op\",\n    \"identifier\": \"OP-1001\",\n    \"serie_id\": null,\n    \"serie\": null,\n    \"number\": null,\n    \"receipt_number\": \"OP-1001\",\n    \"date\": \"2026-10-29\",\n    \"amount\": 100,\n    \"notes\": \"Plata partiala prin OP\",\n    \"created_at\": \"2026-10-29 12:53:48\",\n    \"updated_at\": \"2026-10-29 12:53:48\"\n  }\n}"
            },
            {
              "name": "422 Lipsește identifier",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"op\",\n  \"amount\": 10,\n  \"date\": \"{{today}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Date invalide la incasare\",\n  \"errors\": {\n    \"identifier\": [\n      \"Campul identifier este obligatoriu.\"\n    ]\n  },\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('receipt_id', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Încasări - Creează cash",
          "_postman_id": "6a32279b-a56e-5d53-83d5-a7286c6827e8",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts"
              ]
            },
            "description": "Încasare în numerar: se emite o chitanță numerotată automat în chitanțierul seriei `serie_id` (`receipt_number`, ex. `CH.1`). `identifier` nu se trimite. Scriptul de test salvează ID-ul în `cash_receipt_id`.\n\nCâmpurile și erorile sunt cele de la **Încasări - Creează**.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"cash\",\n  \"serie_id\": {{receipt_serie_id}},\n  \"amount\": 100,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Achitat la livrare\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"cash\",\n  \"serie_id\": {{receipt_serie_id}},\n  \"amount\": 100,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Achitat la livrare\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare creata\",\n  \"data\": {\n    \"id\": 3,\n    \"invoice_id\": 1,\n    \"type\": \"cash\",\n    \"identifier\": \"CH.1\",\n    \"serie_id\": 1,\n    \"serie\": \"CH\",\n    \"number\": 1,\n    \"receipt_number\": \"CH.1\",\n    \"date\": \"2026-10-29\",\n    \"amount\": 100,\n    \"notes\": \"Achitat la livrare\",\n    \"created_at\": \"2026-10-29 12:53:48\",\n    \"updated_at\": \"2026-10-29 12:53:48\"\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('cash_receipt_id', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Încasări - Actualizează",
          "_postman_id": "fefab779-7cb6-5ab6-8c77-40dfe5fa9eba",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{receipt_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts",
                "{{receipt_id}}"
              ]
            },
            "description": "Modifică doar câmpurile trimise: `amount`, `date`, `identifier`, `notes`. Tipul și seria încasării nu se pot schimba (422 `Tipul incasarii nu poate fi modificat.`): pentru alt tip, șterge încasarea și creeaz-o din nou.\n\n**Răspuns**: `statusMessage` `Incasare actualizata`, `data` = încasarea.\n\n**Erori**: 404 `Incasarea nu a fost gasita`; 422 `Date invalide la incasare`; 422 `Eroare validare incasare: ...` (sumă ≤ 0, încasare creată automat din credit / stornare, factură stornată).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 150,\n  \"identifier\": \"OP-1001\",\n  \"notes\": \"Suma corectata dupa extras\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 150,\n  \"identifier\": \"OP-1001\",\n  \"notes\": \"Suma corectata dupa extras\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{receipt_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts",
                    "{{receipt_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare actualizata\",\n  \"data\": {\n    \"id\": 2,\n    \"invoice_id\": 1,\n    \"type\": \"op\",\n    \"identifier\": \"OP-1001\",\n    \"serie_id\": null,\n    \"serie\": null,\n    \"number\": null,\n    \"receipt_number\": \"OP-1001\",\n    \"date\": \"2026-10-29\",\n    \"amount\": 150,\n    \"notes\": \"Suma corectata dupa extras\",\n    \"created_at\": \"2026-10-29 12:53:48\",\n    \"updated_at\": \"2026-10-29 12:53:48\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Descarcă chitanță",
          "_postman_id": "bc986efa-63de-589d-a4ce-c82193d0c5fb",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{cash_receipt_id}}/download",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts",
                "{{cash_receipt_id}}",
                "download"
              ]
            },
            "description": "PDF-ul chitanței (încasări `cash`) sau al dovezii de încasare. Răspunsul este fișierul (`Content-Type: application/pdf`, `Content-Disposition: attachment; filename=\"Chitanta-CH.1.pdf\"`).\n\n**Erori** (JSON): 404 `Documentul nu a fost gasit` / `Incasarea nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{cash_receipt_id}}/download",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts",
                    "{{cash_receipt_id}}",
                    "download"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "text",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/pdf"
                },
                {
                  "key": "Content-Disposition",
                  "value": "attachment; filename=\"Chitanta-CH.1.pdf\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": ""
            }
          ]
        },
        {
          "name": "Încasări - Șterge",
          "_postman_id": "40ff35b5-afac-57d8-bff4-b878864065bb",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{receipt_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "receipts",
                "{{receipt_id}}"
              ]
            },
            "description": "Șterge încasarea și recalculează starea de încasare a documentului.\n\n**Răspuns**: `statusMessage` `Incasare stearsa`, `data`: `receipt_id` și `document` (documentul actualizat).\n\n**Erori**: 404 `Incasarea nu a fost gasita`; 400 `Eroare stergere incasare: ...` (încasări create automat din credit / stornare)."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/receipts/{{receipt_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "receipts",
                    "{{receipt_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare stearsa\",\n  \"data\": {\n    \"receipt_id\": 2,\n    \"document\": {\n      \"id\": 1,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 1,\n      \"number_display\": \"WB000001\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"partial\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 1,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Abonament platformă\",\n            \"nota\": \"Luna curentă\",\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 1000,\n            \"pret_fara_tva\": 826.45,\n            \"valoare\": 826.45,\n            \"tva\": 173.55,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          },\n          {\n            \"id\": 2,\n            \"sort_order\": 2,\n            \"type\": 1,\n            \"denumire\": \"Licență utilizator suplimentar\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 2,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 181.5,\n            \"pret_fara_tva\": 150,\n            \"valoare\": 300,\n            \"tva\": 63,\n            \"discount\": 36.3,\n            \"discount_net\": 30,\n            \"discount_tva\": 6.3,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 1096.45,\n            \"total_tva\": 230.25\n          }\n        },\n        \"total\": {\n          \"valoare\": 1126.45,\n          \"tva\": 236.55,\n          \"total\": 1326.7\n        },\n        \"discount\": {\n          \"valoare\": 30,\n          \"tva\": 6.3,\n          \"total\": 36.3\n        },\n        \"stats\": {\n          \"incasat\": 100,\n          \"rest\": 1226.7\n        }\n      },\n      \"items_count\": 2,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Alocare multiplă",
          "_postman_id": "6e373eca-e793-5d5a-8c15-331fdf289d86",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/receipts/bulk",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "receipts",
                "bulk"
              ]
            },
            "description": "O singură plată (ex. un OP din extras) împărțită pe mai multe facturi ale aceluiași client, **de la cea mai veche**: fiecare factură se achită integral înainte de următoarea; ultima poate rămâne parțial achitată. Se creează câte o încasare pe fiecare factură atinsă.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `invoice_ids` | int[] | da | Facturile: același client, aceeași monedă, status `emisa`, cu rest de plată. |\n| `expected_balances` | obiect | da | `{\"<invoice_id>\": <rest>}` pentru **fiecare** factură: restul de plată pe care l-ai văzut (`totals.stats.rest`). Dacă între timp s-a schimbat, cererea e refuzată, ca să nu aloci pe date vechi. |\n| `amount` | număr > 0 | da | Suma totală; cel mult suma resturilor. |\n| `date` | `AAAA-LL-ZZ` | da | Data încasării. |\n| `type` | string | da | `op`, `bf`, `cash`, `card` sau `ramburs`. |\n| `identifier` | string | da, în afară de cash | Referința plății, aceeași pe toate încasările. |\n| `serie_id` | int | la cash | Seria cu chitanțier; fiecare factură primește chitanța ei. |\n| `notes` | string | nu | Observații. |\n\nScriptul pre-request citește resturile celor două facturi (`invoice_id`, `invoice_id_2`), le pune în `expected_balances` și alege `amount` = restul primei facturi plus jumătate din restul celei de-a doua (prima se achită integral, a doua parțial).\n\n**Răspuns**: `statusMessage` `Incasare alocata`, `data.receipts[]` (încasările create).\n\n**Erori** — 422 `Date invalide la incasare` (câmpuri lipsă) sau 422 `Eroare validare incasare: <motiv>`:\n- `Facturile selectate trebuie sa apartina aceluiasi client.` / `... aceeasi moneda.`\n- `Doar pe facturile cu status Emisa se pot efectua incasari multiple.` / `Facturile selectate trebuie sa aiba rest de incasat.`\n- `Restul de incasat al unei facturi s-a schimbat intre timp. Reciteste facturile si incearca din nou.` — `expected_balances` nu mai corespunde; recitește facturile.\n- `Lipseste restul de incasat (expected_balances) pentru una dintre facturi. Reciteste facturile si incearca din nou.` — lipsește o factură din `expected_balances`.\n- `Valoarea incasarii nu poate depasi totalul facturilor selectate.`",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"invoice_ids\": [{{invoice_id}}, {{invoice_id_2}}],\n  \"expected_balances\": {\n    \"{{invoice_id}}\": {{invoice_rest}},\n    \"{{invoice_id_2}}\": {{invoice_2_rest}}\n  },\n  \"type\": \"op\",\n  \"identifier\": \"OP-2002\",\n  \"amount\": {{allocation_amount}},\n  \"date\": \"{{today}}\",\n  \"notes\": \"Plata din extrasul de azi\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoice_ids\": [{{invoice_id}}, {{invoice_id_2}}],\n  \"expected_balances\": {\n    \"{{invoice_id}}\": {{invoice_rest}},\n    \"{{invoice_id_2}}\": {{invoice_2_rest}}\n  },\n  \"type\": \"op\",\n  \"identifier\": \"OP-2002\",\n  \"amount\": {{allocation_amount}},\n  \"date\": \"{{today}}\",\n  \"notes\": \"Plata din extrasul de azi\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/receipts/bulk",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "receipts",
                    "bulk"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare alocata\",\n  \"data\": {\n    \"receipts\": [\n      {\n        \"id\": 4,\n        \"invoice_id\": 1,\n        \"type\": \"op\",\n        \"identifier\": \"OP-2002\",\n        \"serie_id\": null,\n        \"serie\": null,\n        \"number\": null,\n        \"receipt_number\": \"OP-2002\",\n        \"date\": \"2026-10-29\",\n        \"amount\": 1226.7,\n        \"notes\": \"Plata din extrasul de azi\",\n        \"created_at\": \"2026-10-29 12:53:48\",\n        \"updated_at\": \"2026-10-29 12:53:48\"\n      },\n      {\n        \"id\": 5,\n        \"invoice_id\": 2,\n        \"type\": \"op\",\n        \"identifier\": \"OP-2002\",\n        \"serie_id\": null,\n        \"serie\": null,\n        \"number\": null,\n        \"receipt_number\": \"OP-2002\",\n        \"date\": \"2026-10-29\",\n        \"amount\": 60.5,\n        \"notes\": \"Plata din extrasul de azi\",\n        \"created_at\": \"2026-10-29 12:53:48\",\n        \"updated_at\": \"2026-10-29 12:53:48\"\n      }\n    ]\n  }\n}"
            },
            {
              "name": "422 Rest modificat între timp",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"invoice_ids\": [{{invoice_id}}, {{invoice_id_2}}],\n  \"expected_balances\": { \"{{invoice_id}}\": 1, \"{{invoice_id_2}}\": 1 },\n  \"type\": \"op\",\n  \"identifier\": \"OP-2002\",\n  \"amount\": 1,\n  \"date\": \"{{today}}\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/receipts/bulk",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "receipts",
                    "bulk"
                  ]
                }
              },
              "status": "Unprocessable Content",
              "code": 422,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 422,\n  \"statusMessage\": \"Eroare validare incasare: Restul de incasat al unei facturi s-a schimbat intre timp. Reciteste facturile si incearca din nou.\",\n  \"errors\": {\n    \"invoices\": [\n      \"Restul de incasat al unei facturi s-a schimbat intre timp. Reciteste facturile si incearca din nou.\"\n    ]\n  },\n  \"data\": null\n}"
            }
          ],
          "event": [
            {
              "listen": "prerequest",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "// Reads the outstanding balance of both invoices: the API refuses the allocation if a balance changed meanwhile.",
                  "const get = (id) => new Promise((resolve, reject) => pm.sendRequest({",
                  "    url: pm.environment.get('base_url') + '/api/v6/invoices/' + id, method: 'GET',",
                  "    header: [{ key: 'Authorization', value: 'Bearer ' + pm.environment.get('api_token') }, { key: 'Accept', value: 'application/json' }],",
                  "}, (err, res) => (err ? reject(err) : resolve(res.json().data))));",
                  "Promise.all([get(pm.environment.get('invoice_id')), get(pm.environment.get('invoice_id_2'))]).then(([a, b]) => {",
                  "    pm.variables.set('invoice_rest', a.totals.stats.rest);",
                  "    pm.variables.set('invoice_2_rest', b.totals.stats.rest);",
                  "    // The first invoice paid in full, the second in part, whatever the amounts the company's invoices came to.",
                  "    pm.variables.set('allocation_amount', Math.round((a.totals.stats.rest + b.totals.stats.rest / 2) * 100) / 100);",
                  "});"
                ]
              }
            }
          ]
        },
        {
          "name": "Variante de stornare",
          "_postman_id": "25052185-f386-5c6f-8ef5-11b98e52379c",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/storno",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "storno"
              ]
            },
            "description": "Ce se poate storna pe factură, înainte de `POST .../storno`.\n\n**Răspuns (`data`)**\n- `storno_allowed` / `storno_blocker` — stornarea totală e posibilă / motivul pentru care nu e.\n- `partial_storno_allowed` / `partial_storno_blocker` — idem pentru stornarea parțială.\n- `has_payments` — factura are încasări (stornarea totală cere atunci `payments_action`).\n- `default_date`, `default_serie_id` — data și seria propuse.\n- `reasons` — motivele acceptate (`cheie` → text).\n- `lines[]` — liniile facturii: `id` (se trimite în `lines[].id`), `description`, `um`, `qty`, `price`, `vat_rate`, `tax_included`, `qty_left` / `price_left` / `amount_left` (ce a rămas de stornat), `done` (linie stornată complet). Listă goală când stornarea parțială nu e permisă.\n\nScriptul de test salvează prima linie în `storno_line_id`.\n\n**Erori**: 404 `Factura nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/storno",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "storno"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"invoice_id\": 1,\n    \"number_display\": \"WB000001\",\n    \"storno_allowed\": true,\n    \"storno_blocker\": null,\n    \"partial_storno_allowed\": true,\n    \"partial_storno_blocker\": null,\n    \"has_payments\": true,\n    \"default_date\": \"2026-10-29\",\n    \"default_serie_id\": 1,\n    \"reasons\": {\n      \"retur\": \"Retur marfă\",\n      \"eroare\": \"Eroare de facturare\",\n      \"anulare_comanda\": \"Anulare comandă\",\n      \"serviciu_neprestat\": \"Serviciu neprestat\",\n      \"altul\": \"Altul\"\n    },\n    \"lines\": [\n      {\n        \"id\": 1,\n        \"description\": \"Abonament platformă\",\n        \"um\": \"BUC\",\n        \"negative\": false,\n        \"qty\": 1,\n        \"price\": 1000,\n        \"vat_rate\": 21,\n        \"tax_included\": true,\n        \"discount_percent\": null,\n        \"qty_left\": 1,\n        \"price_left\": 1000,\n        \"amount_left\": 1000,\n        \"done\": false\n      },\n      {\n        \"id\": 2,\n        \"description\": \"Licență utilizator suplimentar\",\n        \"um\": \"BUC\",\n        \"negative\": false,\n        \"qty\": 2,\n        \"price\": 150,\n        \"vat_rate\": 21,\n        \"tax_included\": false,\n        \"discount_percent\": null,\n        \"qty_left\": 2,\n        \"price_left\": 150,\n        \"amount_left\": 300,\n        \"done\": false\n      }\n    ]\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if ((body.data.lines[0] || {}).id !== undefined && (body.data.lines[0] || {}).id !== null) pm.environment.set('storno_line_id', String((body.data.lines[0] || {}).id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Stornează parțial",
          "_postman_id": "44c9a710-cc76-5a87-a1ac-e9f6745bb7f9",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/storno",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id}}",
                "storno"
              ]
            },
            "description": "Stornare parțială: emite o factură storno doar pentru liniile / cantitățile alese (retur parțial, reducere de preț). Suma stornată trece în creditul clientului și se aplică pe restul de plată al facturii.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `lines` | array (≤ 500) | da, sau `all` | Liniile de stornat: `id` (din Variante de stornare), `mode`, și `qty` sau `price`. |\n| `lines[].mode` | `qty` / `price` | da | `qty`: stornează `qty` bucăți. `price`: scade prețul unitar cu `price` pe cantitatea rămasă. |\n| `all` | bool | nu | `true` stornează tot ce a rămas. După o stornare parțială, este singurul mod de a storna restul. |\n| `date` | `AAAA-LL-ZZ` | nu | Data stornării; implicit azi, cel mai devreme data facturii. |\n| `serie_id` | int | nu | Seria facturii storno; implicit seria stornărilor din Preferințe, altfel seria facturii. |\n| `reason` | string | nu | `retur`, `eroare`, `anulare_comanda`, `serviciu_neprestat`, `altul`. Apare în observații și în e-Factura. |\n| `reason_note` | string ≤ 500 | la `altul` | Motivul, în text liber. |\n\n**Răspuns**: `statusMessage` `Stornarea partiala a fost emisa`, `data`: `action` (`partial_storno`), `invoice` (factura actualizată), `storno_invoice` (factura storno, cu totaluri negative).\n\n**Erori**\n- 404 `Factura nu a fost gasita`.\n- 422 `Eroare validare stornare: <motiv>` + `errors` pe câmpuri, de ex. `Alege cel putin o linie si cantitatea sau valoarea de stornat.`, `Linia nu mai exista pe factura.`, `Cantitatea de pe linia ... depaseste ce a ramas (N).`, `Stornarea nu poate fi datata inaintea facturii pe care o storneaza (...)`.\n- 409 — factura nu poate fi stornată parțial (motivul în `statusMessage`).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"retur\",\n  \"date\": \"{{today}}\",\n  \"lines\": [\n    {\n      \"id\": {{storno_line_id}},\n      \"mode\": \"qty\",\n      \"qty\": 1\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"retur\",\n  \"date\": \"{{today}}\",\n  \"lines\": [\n    {\n      \"id\": {{storno_line_id}},\n      \"mode\": \"qty\",\n      \"qty\": 1\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/storno",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "storno"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Stornarea partiala a fost emisa\",\n  \"data\": {\n    \"action\": \"partial_storno\",\n    \"invoice\": {\n      \"id\": 1,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 1,\n      \"number_display\": \"WB000001\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"incasata\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 1,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Abonament platformă\",\n            \"nota\": \"Luna curentă\",\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 1000,\n            \"pret_fara_tva\": 826.45,\n            \"valoare\": 826.45,\n            \"tva\": 173.55,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          },\n          {\n            \"id\": 2,\n            \"sort_order\": 2,\n            \"type\": 1,\n            \"denumire\": \"Licență utilizator suplimentar\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 2,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 181.5,\n            \"pret_fara_tva\": 150,\n            \"valoare\": 300,\n            \"tva\": 63,\n            \"discount\": 36.3,\n            \"discount_net\": 30,\n            \"discount_tva\": 6.3,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 1096.45,\n            \"total_tva\": 230.25\n          }\n        },\n        \"total\": {\n          \"valoare\": 1126.45,\n          \"tva\": 236.55,\n          \"total\": 1326.7\n        },\n        \"discount\": {\n          \"valoare\": 30,\n          \"tva\": 6.3,\n          \"total\": 36.3\n        },\n        \"stats\": {\n          \"incasat\": 1326.7,\n          \"rest\": 0\n        }\n      },\n      \"items_count\": 2,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    },\n    \"storno_invoice\": {\n      \"id\": 5,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 5,\n      \"number_display\": \"WB000005\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 0,\n      \"due_date\": \"29.10.2026\",\n      \"due_date_iso\": \"2026-10-29\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"compensata\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 6,\n            \"sort_order\": 1,\n            \"type\": -1,\n            \"denumire\": \"Abonament platformă\",\n            \"nota\": \"Luna curentă\",\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 1000,\n            \"pret_fara_tva\": 826.45,\n            \"valoare\": 826.45,\n            \"tva\": 173.55,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": -826.45,\n            \"total_tva\": -173.55\n          }\n        },\n        \"total\": {\n          \"valoare\": -826.45,\n          \"tva\": -173.55,\n          \"total\": -1000\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": -1000\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    }\n  }\n}"
            }
          ]
        },
        {
          "name": "Stornează total",
          "_postman_id": "7a6bd956-9081-5e96-b3fd-546a3cac5a07",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{paid_invoice_id}}/storno",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{paid_invoice_id}}",
                "storno"
              ]
            },
            "description": "Stornare totală: emite factura storno pentru întreaga factură (fără `lines` / `all`). Se folosește pentru facturile trimise în SPV; o factură netrimisă se poate și anula (**Anulează**).\n\n**Body** (toate opționale): `date`, `serie_id`, `reason`, `reason_note` (ca la stornarea parțială) și:\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `payments_action` | `credit` / `refund` | dacă factura are încasări | `credit`: suma încasată trece în creditul clientului (se poate folosi la încasări cu `type: credit`). `refund`: suma se restituie clientului. |\n\n**Răspuns**: `statusMessage` `Factura a fost stornata`, `data`: `action` (`storno`), `invoice`, `storno_invoice` (status `storno`).\n\n**Erori**\n- 409 `INVOICE_STORNO_HAS_PAYMENTS` — factura are încasări și lipsește `payments_action`.\n- 409 `INVOICE_STORNO_NOT_ALLOWED` / 409 cu motivul (ex. `Factura are stornari partiale; restul se storneaza cu \"all\".`, `Factura a fost deja stornata.`).\n- 422 `INVOICE_STORNO_PAYMENTS_ACTION_INVALID`; 422 `Eroare validare stornare: ...`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"reason\": \"eroare\",\n  \"date\": \"{{today}}\",\n  \"payments_action\": \"credit\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"eroare\",\n  \"date\": \"{{today}}\",\n  \"payments_action\": \"credit\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{paid_invoice_id}}/storno",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{paid_invoice_id}}",
                    "storno"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Factura a fost stornata\",\n  \"data\": {\n    \"action\": \"storno\",\n    \"invoice\": {\n      \"id\": 4,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 4,\n      \"number_display\": \"WB000004\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"stornata\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 5,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Produs achitat online\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 242,\n            \"pret_fara_tva\": 200,\n            \"valoare\": 200,\n            \"tva\": 42,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 200,\n            \"total_tva\": 42\n          }\n        },\n        \"total\": {\n          \"valoare\": 200,\n          \"tva\": 42,\n          \"total\": 242\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 242,\n          \"rest\": 0\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    },\n    \"storno_invoice\": {\n      \"id\": 6,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 6,\n      \"number_display\": \"WB000006\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"storno\",\n      \"status_incasare\": \"stornata\",\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 7,\n            \"sort_order\": 1,\n            \"type\": -1,\n            \"denumire\": \"Produs achitat online\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 242,\n            \"pret_fara_tva\": 200,\n            \"valoare\": 200,\n            \"tva\": 42,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": -200,\n            \"total_tva\": -42\n          }\n        },\n        \"total\": {\n          \"valoare\": -200,\n          \"tva\": -42,\n          \"total\": -242\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": -242\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    }\n  }\n}"
            },
            {
              "name": "409 Factura are încasări",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"reason\": \"eroare\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id_2}}/storno",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id_2}}",
                    "storno"
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 409,\n  \"statusMessage\": \"Factura are incasari. Alege ce se intampla cu banii incasati: credit client sau restituire.\",\n  \"errors\": {\n    \"code\": \"INVOICE_STORNO_HAS_PAYMENTS\"\n  },\n  \"data\": null\n}"
            }
          ]
        },
        {
          "name": "Anulează",
          "_postman_id": "4036fdce-0fab-5f02-9cf8-9c52802fd483",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/invoices/{{invoice_id_3}}/cancel",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "invoices",
                "{{invoice_id_3}}",
                "cancel"
              ]
            },
            "description": "Anulează factura sau, dacă a fost deja trimisă în SPV, o stornează (o factură trimisă în SPV nu se mai poate anula).\n\n| Situație | Rezultat | `data.action` |\n| --- | --- | --- |\n| Netrimisă în SPV, fără încasări | status `anulata` | `cancelled` |\n| Trimisă în SPV | se emite factura storno (`data.storno_invoice`) | `storno` |\n| Deja anulată / stornată | nimic (idempotent) | `already_cancelled` / `already_storno` |\n\n**Body** (opțional): `payments_action` (`credit` / `refund`), folosit doar când se ajunge la stornare și factura are încasări.\n\n**Răspuns**: `data`: `action`, `invoice`, `storno_invoice` (doar la stornare).\n\n**Erori**\n- 404 `Factura nu a fost gasita`.\n- 409 `INVOICE_CANCEL_HAS_PAYMENTS` — factura are încasări: șterge-le sau stornează factura.\n- 409 `INVOICE_CANCEL_NOT_ALLOWED`; la stornare: 409 `INVOICE_STORNO_HAS_PAYMENTS`, `INVOICE_STORNO_NOT_ALLOWED`.",
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id_3}}/cancel",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id_3}}",
                    "cancel"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Factura a fost anulata\",\n  \"data\": {\n    \"action\": \"cancelled\",\n    \"invoice\": {\n      \"id\": 3,\n      \"document_type\": \"invoice\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"WB\",\n      \"number\": 3,\n      \"number_display\": \"WB000003\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 15,\n      \"due_date\": \"13.11.2026\",\n      \"due_date_iso\": \"2026-11-13\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"anulata\",\n      \"status_incasare\": null,\n      \"efactura_type\": 380,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 4,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Abonament lunar\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 121,\n            \"pret_fara_tva\": 100,\n            \"valoare\": 100,\n            \"tva\": 21,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 100,\n            \"total_tva\": 21\n          }\n        },\n        \"total\": {\n          \"valoare\": 100,\n          \"tva\": 21,\n          \"total\": 121\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": 121\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    }\n  }\n}"
            },
            {
              "name": "409 Factura are încasări",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/invoices/{{invoice_id}}/cancel",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "invoices",
                    "{{invoice_id}}",
                    "cancel"
                  ]
                }
              },
              "status": "Conflict",
              "code": 409,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 409,\n  \"statusMessage\": \"Factura are incasari si nu poate fi anulata.\",\n  \"errors\": {\n    \"code\": \"INVOICE_CANCEL_HAS_PAYMENTS\"\n  },\n  \"data\": null\n}"
            }
          ]
        }
      ]
    },
    {
      "name": "Proforme",
      "description": "Facturi proforme: emitere, modificare, PDF, email și încasări (avansuri). Proforma se convertește în factură fiscală din WeBill; o proformă convertită nu mai acceptă modificări sau încasări. Proformele nu au anulare / stornare prin endpoint dedicat: anularea se face cu PATCH `status: anulata`.",
      "item": [
        {
          "name": "Creează",
          "_postman_id": "48de56a9-e4d9-536a-8876-0e177bbd0658",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme"
              ]
            },
            "description": "Emite o proformă în seria aleasă (`proforma_series` din Nomenclatoare > Facturi). Câmpurile sunt cele ale facturii (fără `order_id`, `curier`, `awb`, `generate_payment_link`); `document_type` este întotdeauna `100`. Scriptul de test salvează ID-ul în `proforma_id`, seria și numărul în `proforma_serie` / `proforma_number`.\n\n**Body**\n\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `client_id` | int | unul din `client_id` / `client` | Client existent al companiei (vezi Clienți). |\n| `client` | obiect | unul din `client_id` / `client` | Client inline, cu aceleași câmpuri și reguli ca POST /clients (persoana juridică existentă cu același CUI este refolosită). Eroare → 422 `Client invalid: ...`. |\n| `items` | array | da | Cel puțin o linie (vezi mai jos). |\n| `serie_id` | int | nu | Seria (Nomenclatoare > Facturi: `invoice_series` / `proforma_series`). Implicit seria marcată „Implicită” în Setări, altfel prima serie activă. Serie străină / inactivă → 422 `INVALID_INVOICE_SERIE` / `INVALID_PROFORMA_SERIE`. |\n| `delegate_id` | int | nu | Delegatul (`delegates`). Implicit delegatul marcat „Implicit” în Setări, altfel primul delegat activ. → 422 `INVALID_DELEGATE`. |\n| `bank_accounts` | int[] | nu | Conturile bancare tipărite pe document (`banks`). Implicit contul marcat „Implicit” în moneda documentului, altfel toate conturile active. → 422 `INVALID_BANK_ACCOUNT`. |\n| `issue_date` | `AAAA-LL-ZZ` | nu | Data documentului; implicit azi. O factură nu poate fi datată înaintea ultimei facturi emise din aceeași serie (422). |\n| `due_days` / `due_date` | int ≥ 0 sau dată | nu | Termenul de plată: numărul de zile (implicit 15) sau direct data scadenței, `AAAA-LL-ZZ` (sau `ZZ.LL.AAAA`), care nu poate fi înaintea datei documentului. |\n| `currency` | string (3) | nu | Implicit `RON`. Lista în Nomenclatoare > Facturi (`currencies`). |\n| `exchange_rate` | număr | nu | Implicit cursul BNR al datei documentului (1 pentru RON). |\n| `language` | `ro` / `en` | nu | Limba documentului (PDF, email). Implicit `ro`. |\n| `comments` | string | nu | Observații tipărite pe document. |\n\n\n**Linii (`items[]`)**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `description` | string ≤ 255 | da* | Denumirea produsului / serviciului. |\n| `details` | string | nu | Text suplimentar pe linie. |\n| `um` | string ≤ 50 | da* | Unitatea de măsură: denumirea folosită de companie (ex. `BUC`, `ORA`) sau codul UN/ECE (`H87`, `HUR`). |\n| `qty` | număr > 0 | da | Cantitatea. Zecimale cu punct sau virgulă. |\n| `unit_price` | număr ≥ 0 | da* | Prețul unitar, în moneda liniei. |\n| `tax_included` | bool | nu | Implicit `true`: prețul include TVA. `false` = preț fără TVA. |\n| `tax_value` | număr 0–100 | nu | Cota TVA în procente (ex. `21`, `11`, `0`). Se potrivește cu o cotă activă a companiei cu exact acest procent; vezi `taxes` din Nomenclatoare > Facturi. |\n| `tax_id` | int | nu | ID-ul cotei TVA din Nomenclatoare > Facturi. Are prioritate față de `tax_value`. Cotă inexistentă / inactivă → 422 `INVALID_TAX`. |\n| `discount` | număr | nu | Reducere pe linie, ca **valoare** (în moneda liniei). |\n| `discount_type` | string | nu | Doar `valoric` (implicit). Reducerea procentuală nu este disponibilă prin API. |\n| `currency` | string (3) | nu | Moneda liniei; implicit moneda documentului. Conversia se face la cursul BNR al datei documentului. |\n| `product_id` | int | nu | Produs din Nomenclatoare > Produse și servicii: câmpurile netrimise (`description`, `details`, `um`, `unit_price`, `currency`, `tax_id`, `tax_included`, `cpv_code`) se completează din produs. Produs inexistent → 422 `INVALID_PRODUCT`. |\n| `cpv_code` | string | nu | Cod CPV (achiziții publice). |\n\n\\* nu sunt obligatorii când linia are `product_id`. O cantitate, un preț sau o reducere negativă marchează linia ca linie de stornare.\n\n**Răspuns**: `statusMessage` `Document creat`, `data.document_type` = `proforma`.\n\n**`data` (document)**\n- `id`, `document_type` (`invoice` / `proforma`), `company_id`, `serie_id`, `serie`, `number`, `number_display` (ex. `WB000012`).\n- `date` (`AAAA-LL-ZZ`), `due_days`, `due_date` (**`ZZ.LL.AAAA`**, păstrat așa pentru integrările existente), `due_date_iso` (aceeași zi, `AAAA-LL-ZZ`), `currency`, `exchange_rate`, `language`, `efactura_type` (380 / 751 / 389 / 100).\n- `status`: `emisa`, `anulata`, `storno` (factura inversă a unei stornări).\n- `status_incasare`: `pending` (neîncasată), `partial`, `incasata`, `compensata` (închisă din credit / stornare parțială), `stornata`.\n- `client`: obiectul client (ca la Clienți > Detaliu).\n- `totals.items[]`: liniile — `id` (folosit la stornare), `denumire`, `nota`, `um`, `um_code`, `qty`, `cota_tva`, `pret_cu_tva`, `pret_fara_tva`, `valoare` (fără TVA), `tva`, `discount`, `discount_net`, `discount_tva`, `cpv_code`.\n- `totals.subtotal`: pe cota TVA (`\"21\": {\"total_fara_tva\", \"total_tva\"}`); `totals.total`: `valoare` (fără TVA) și `tva` sunt **înainte de reduceri**, `total` (de plată) este **după** reduceri: `total = valoare + tva - discount.total`; `totals.discount`: reducerile; `totals.stats`: `incasat`, `rest` (rest de plată).\n- `items_count`, `payment_link_requested`, `payment_link` (linkul de plată Netopia activ sau `null`).\n\n**Erori**\n- 400 `Payload JSON invalid: ...` — corpul nu este JSON valid.\n- 422 `Date invalide la linii`, cu erorile în `errors` pe cheia liniei (ex. `{\"items.0.description\": [\"Campul description este obligatoriu.\"]}`); la fel pentru `items: []`.\n- 422 `Data din campul issue_date nu este valida (format AAAA-LL-ZZ).` (sau `date`, după câmpul trimis) — o dată pe care serverul nu o poate citi nu mai devine data de azi.\n- 422 pentru un `due_date` care nu e nici număr de zile, nici dată, sau care e înaintea datei documentului.\n- 422 `Clientul nu a fost identificat` — lipsește `client_id` / `client` sau clientul nu este al companiei.\n- 422 `Date invalide la document` + `errors` pe câmpuri (ex. `errors.items`).\n- 422 cu `errors.code`: `INVALID_INVOICE_SERIE`, `INVALID_PROFORMA_SERIE`, `INVALID_DELEGATE`, `INVALID_BANK_ACCOUNT`, `INVALID_TAX`, `INVALID_TAX_CLIENT` (cotă de taxare inversă / intracomunitară nepotrivită clientului), `INVALID_PRODUCT`, `INVALID_CLIENT`, `INVALID_ITEMS`.\n- 422 `Data facturii (...) nu poate fi inaintea ultimei facturi emise din seria ...` (`errors.issue_date`).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": {{client_id}},\n  \"serie_id\": {{proforma_serie_id}},\n  \"delegate_id\": {{delegate_id}},\n  \"bank_accounts\": [\n    {{bank_id}}\n  ],\n  \"issue_date\": \"{{today}}\",\n  \"due_days\": 7,\n  \"currency\": \"RON\",\n  \"language\": \"ro\",\n  \"comments\": \"Oferta valabila 7 zile\",\n  \"items\": [\n    {\n      \"description\": \"Implementare magazin online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 5000,\n      \"tax_included\": false,\n      \"tax_value\": 21\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": {{client_id}},\n  \"serie_id\": {{proforma_serie_id}},\n  \"delegate_id\": {{delegate_id}},\n  \"bank_accounts\": [\n    {{bank_id}}\n  ],\n  \"issue_date\": \"{{today}}\",\n  \"due_days\": 7,\n  \"currency\": \"RON\",\n  \"language\": \"ro\",\n  \"comments\": \"Oferta valabila 7 zile\",\n  \"items\": [\n    {\n      \"description\": \"Implementare magazin online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 5000,\n      \"tax_included\": false,\n      \"tax_value\": 21\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document creat\",\n  \"data\": {\n    \"id\": 7,\n    \"document_type\": \"proforma\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"PF\",\n    \"number\": 1,\n    \"number_display\": \"PF000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 7,\n    \"due_date\": \"05.11.2026\",\n    \"due_date_iso\": \"2026-11-05\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 100,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 8,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Implementare magazin online\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 6050,\n          \"pret_fara_tva\": 5000,\n          \"valoare\": 5000,\n          \"tva\": 1050,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 5000,\n          \"total_tva\": 1050\n        }\n      },\n      \"total\": {\n        \"valoare\": 5000,\n        \"tva\": 1050,\n        \"total\": 6050\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 6050\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('proforma_id', String(body.data.id));",
                  "    if (body.data.serie) pm.environment.set('proforma_serie', String(body.data.serie));",
                  "    if (body.data.number !== undefined && body.data.number !== null) pm.environment.set('proforma_number', String(body.data.number));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Actualizează",
          "_postman_id": "a90f139e-1717-5cb4-bf78-09767f16285c",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}"
              ]
            },
            "description": "Modifică proforma; doar câmpurile trimise se schimbă. Ca la facturi, fără `client_id` (sau `client`) proforma își păstrează clientul, iar `items` înlocuiește toate liniile. `status`: `emisa` sau `anulata`.\n\n**Răspuns**: `statusMessage` `Document actualizat`.\n\n**Erori**: 404 `Documentul nu a fost gasit`; 422 `Clientul nu a fost identificat`; celelalte de la **Creează**.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"client_id\": {{client_id}},\n  \"due_days\": 10,\n  \"comments\": \"Oferta prelungita\",\n  \"items\": [\n    {\n      \"description\": \"Implementare magazin online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 4500,\n      \"tax_included\": false,\n      \"tax_value\": 21\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"client_id\": {{client_id}},\n  \"due_days\": 10,\n  \"comments\": \"Oferta prelungita\",\n  \"items\": [\n    {\n      \"description\": \"Implementare magazin online\",\n      \"um\": \"BUC\",\n      \"qty\": 1,\n      \"unit_price\": 4500,\n      \"tax_included\": false,\n      \"tax_value\": 21\n    }\n  ]\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Document actualizat\",\n  \"data\": {\n    \"id\": 7,\n    \"document_type\": \"proforma\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"PF\",\n    \"number\": 1,\n    \"number_display\": \"PF000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 10,\n    \"due_date\": \"08.11.2026\",\n    \"due_date_iso\": \"2026-11-08\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 100,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 9,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Implementare magazin online\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 5445,\n          \"pret_fara_tva\": 4500,\n          \"valoare\": 4500,\n          \"tva\": 945,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 4500,\n          \"total_tva\": 945\n        }\n      },\n      \"total\": {\n        \"valoare\": 4500,\n        \"tva\": 945,\n        \"total\": 5445\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 5445\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ]
        },
        {
          "name": "Detaliu",
          "_postman_id": "6ccd53c1-840f-5204-840e-67d1c46a92c8",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}"
              ]
            },
            "description": "Proforma, cu clientul, totalurile și situația încasării.\n\n**`data` (document)**\n- `id`, `document_type` (`invoice` / `proforma`), `company_id`, `serie_id`, `serie`, `number`, `number_display` (ex. `WB000012`).\n- `date` (`AAAA-LL-ZZ`), `due_days`, `due_date` (**`ZZ.LL.AAAA`**, păstrat așa pentru integrările existente), `due_date_iso` (aceeași zi, `AAAA-LL-ZZ`), `currency`, `exchange_rate`, `language`, `efactura_type` (380 / 751 / 389 / 100).\n- `status`: `emisa`, `anulata`, `storno` (factura inversă a unei stornări).\n- `status_incasare`: `pending` (neîncasată), `partial`, `incasata`, `compensata` (închisă din credit / stornare parțială), `stornata`.\n- `client`: obiectul client (ca la Clienți > Detaliu).\n- `totals.items[]`: liniile — `id` (folosit la stornare), `denumire`, `nota`, `um`, `um_code`, `qty`, `cota_tva`, `pret_cu_tva`, `pret_fara_tva`, `valoare` (fără TVA), `tva`, `discount`, `discount_net`, `discount_tva`, `cpv_code`.\n- `totals.subtotal`: pe cota TVA (`\"21\": {\"total_fara_tva\", \"total_tva\"}`); `totals.total`: `valoare` (fără TVA) și `tva` sunt **înainte de reduceri**, `total` (de plată) este **după** reduceri: `total = valoare + tva - discount.total`; `totals.discount`: reducerile; `totals.stats`: `incasat`, `rest` (rest de plată).\n- `items_count`, `payment_link_requested`, `payment_link` (linkul de plată Netopia activ sau `null`).\n\n**Erori**: 404 `Proforma nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 7,\n    \"document_type\": \"proforma\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"PF\",\n    \"number\": 1,\n    \"number_display\": \"PF000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 10,\n    \"due_date\": \"08.11.2026\",\n    \"due_date_iso\": \"2026-11-08\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 100,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 9,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Implementare magazin online\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 5445,\n          \"pret_fara_tva\": 4500,\n          \"valoare\": 4500,\n          \"tva\": 945,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 4500,\n          \"total_tva\": 945\n        }\n      },\n      \"total\": {\n        \"valoare\": 4500,\n        \"tva\": 945,\n        \"total\": 5445\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 5445\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ]
        },
        {
          "name": "Caută după serie și număr",
          "_postman_id": "fcc0ed81-7bde-4da0-ad41-d8f4c8f11f1b",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/find?serie={{proforma_serie}}&number={{proforma_number}}&company_vat={{company_vat}}&client_vat={{client_vat}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "find"
              ],
              "query": [
                {
                  "key": "serie",
                  "value": "{{proforma_serie}}"
                },
                {
                  "key": "number",
                  "value": "{{proforma_number}}"
                },
                {
                  "key": "company_vat",
                  "value": "{{company_vat}}"
                },
                {
                  "key": "date",
                  "value": "{{today}}",
                  "disabled": true,
                  "description": "Opțional: data documentului (AAAA-LL-ZZ)."
                },
                {
                  "key": "client_vat",
                  "value": "{{client_vat}}",
                  "description": "Opțional: CUI-ul / CNP-ul clientului tipărit pe document."
                },
                {
                  "key": "client_name",
                  "value": "",
                  "disabled": true,
                  "description": "Opțional: numele clientului de pe document."
                }
              ]
            },
            "description": "Proforma cu seria și numărul date, confirmată de codul fiscal al emitentului și, opțional, de dată și de client, în compania tokenului: același răspuns ca la Detaliu (`GET /proforme/{id}`). Util când sistemul tău a păstrat numărul tipărit, nu ID-ul WeBill.\n\n**Exact sau nimic.** Căutarea nu ghicește: dacă ceva nu corespunde întocmai sau mai multe documente se potrivesc, primești o eroare, niciodată documentul „cel mai probabil”. O automatizare care acționează pe răspuns (încasare, stornare) nu poate atinge astfel o factură greșită.\n\n**Query** (`serie`, `number` și `company_vat` obligatorii; restul opționale, fiecare trimis se compară)\n\n| Parametru | Detalii |\n| --- | --- |\n| `serie` | Seria, ex. `WB`. |\n| `number` | Numărul: doar cifre (`12`, `0012`) sau numărul tipărit cu seria în față (`WB0012`). Orice altceva (`12a`, `WB-12`, altă serie) → 400. |\n| `company_vat` | CUI-ul emitentului, cum apare pe document (pentru un punct de lucru, al companiei-mamă). Se acceptă cu sau fără `RO`, cu spații. |\n| `date` | Opțional. Data documentului, `AAAA-LL-ZZ`. Deosebește documentele vechi cu aceeași serie și același număr. |\n| `client_vat` | Opțional. CUI-ul / CNP-ul clientului **cum a fost tipărit la emitere** (o schimbare ulterioară a clientului nu contează). Cu sau fără `RO`; un cod străin își păstrează prefixul țării (`DE123...`). La persoanele fizice fără CNP (`0000000000000`) codul nu identifică pe nimeni: lasă-l gol sau folosește `date`. |\n| `client_name` | Opțional. Numele clientului de pe document, comparat fără majuscule, diacritice și spații în plus. |\n\n| Răspuns | `errors.code` | Când |\n| --- | --- | --- |\n| 200 | — | Exact un document se potrivește. |\n| 400 | — | Lipsește un parametru obligatoriu, `number` nu este exact numărul documentului sau `date` nu e o dată `AAAA-LL-ZZ`. |\n| 404 | `DOCUMENT_NOT_FOUND` | Nu există niciun document cu seria și numărul acestea (`Proforma nu a fost gasita`). |\n| 404 | `COMPANY_MISMATCH` | Documentul există, dar emitentul are alt cod fiscal (ex. tokenul altei companii). |\n| 404 | `DATE_MISMATCH` | Documentul există, dar are altă dată. |\n| 404 | `CLIENT_MISMATCH` | Documentul există, dar clientul are alt cod fiscal sau alt nume. |\n| 409 | `AMBIGUOUS_DOCUMENT` | Mai multe documente se potrivesc (aceeași serie și același număr, fără `date` sau client care să le deosebească) (ex. o factură veche și stornarea ei cu același număr). `errors.candidates[]` are `id`, `date`, `status`: alege documentul și cere-l cu `GET /proforme/{id}`. |\n\nFacturile fiscale nu sunt căutate aici (au `invoices/find`). Ciornele nu au număr, deci nu se găsesc."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/find?serie={{proforma_serie}}&number={{proforma_number}}&company_vat={{company_vat}}&client_vat={{client_vat}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "find"
                  ],
                  "query": [
                    {
                      "key": "serie",
                      "value": "{{proforma_serie}}"
                    },
                    {
                      "key": "number",
                      "value": "{{proforma_number}}"
                    },
                    {
                      "key": "company_vat",
                      "value": "{{company_vat}}"
                    },
                    {
                      "key": "client_vat",
                      "value": "{{client_vat}}"
                    },
                    {
                      "key": "client_name",
                      "value": "",
                      "disabled": true,
                      "description": "Doar la CNP-ul anonim 0000000000000."
                    }
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"success\",\n  \"data\": {\n    \"id\": 7,\n    \"document_type\": \"proforma\",\n    \"company_id\": 1,\n    \"serie_id\": 1,\n    \"serie\": \"PF\",\n    \"number\": 1,\n    \"number_display\": \"PF000001\",\n    \"date\": \"2026-10-29\",\n    \"due_days\": 10,\n    \"due_date\": \"08.11.2026\",\n    \"due_date_iso\": \"2026-11-08\",\n    \"currency\": \"RON\",\n    \"exchange_rate\": 1,\n    \"status\": \"emisa\",\n    \"status_incasare\": \"pending\",\n    \"efactura_type\": 100,\n    \"language\": \"ro\",\n    \"client\": {\n      \"id\": 2,\n      \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n      \"is_pf\": false,\n      \"has_vat\": true,\n      \"vat\": \"10000008\",\n      \"country\": {\n        \"code\": \"RO\",\n        \"name\": \"Romania\"\n      },\n      \"state\": {\n        \"code\": \"B\",\n        \"name\": \"Bucuresti\"\n      },\n      \"city\": \"Sector 1\",\n      \"email\": \"facturi@exemplu.ro\",\n      \"address_1\": \"Str. Exemplu nr. 3\",\n      \"phone\": \"0722999999\",\n      \"bank\": \"Banca Exemplu\",\n      \"iban\": \"RO49AAAA1B31007593840000\"\n    },\n    \"totals\": {\n      \"items\": [\n        {\n          \"id\": 9,\n          \"sort_order\": 1,\n          \"type\": 1,\n          \"denumire\": \"Implementare magazin online\",\n          \"nota\": null,\n          \"cpv_code\": null,\n          \"um\": \"BUC\",\n          \"um_code\": \"H87\",\n          \"qty\": 1,\n          \"cota_tva\": 21,\n          \"pret_cu_tva\": 5445,\n          \"pret_fara_tva\": 4500,\n          \"valoare\": 4500,\n          \"tva\": 945,\n          \"discount\": 0,\n          \"discount_net\": 0,\n          \"discount_tva\": 0,\n          \"discount_percent\": null\n        }\n      ],\n      \"subtotal\": {\n        \"21\": {\n          \"total_fara_tva\": 4500,\n          \"total_tva\": 945\n        }\n      },\n      \"total\": {\n        \"valoare\": 4500,\n        \"tva\": 945,\n        \"total\": 5445\n      },\n      \"discount\": {\n        \"valoare\": 0,\n        \"tva\": 0,\n        \"total\": 0\n      },\n      \"stats\": {\n        \"incasat\": 0,\n        \"rest\": 5445\n      }\n    },\n    \"items_count\": 1,\n    \"payment_link_requested\": false,\n    \"payment_link\": null\n  }\n}"
            }
          ]
        },
        {
          "name": "Descarcă PDF",
          "_postman_id": "aa489c53-6116-5f4d-a746-36ed1d1cf90f",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/download",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "download"
              ]
            },
            "description": "PDF-ul documentului. Răspunsul este fișierul (`Content-Type: application/pdf`, `Content-Disposition: attachment; filename=proforma-pf000003-09-10-2026.pdf`). În Postman: **Send and Download**.\n\n**Erori** (JSON): 404 `Documentul nu a fost gasit`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/download",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "download"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "text",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/pdf"
                },
                {
                  "key": "Content-Disposition",
                  "value": "attachment; filename=proforma-pf000001-29-10-2026.pdf"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": ""
            }
          ]
        },
        {
          "name": "Trimite pe email",
          "_postman_id": "f59dc156-8df2-51c7-8bbd-26aa8c24881a",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/email",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "email"
              ]
            },
            "description": "Trimite documentul pe email, cu PDF-ul atașat. Trimiterea se face asincron (în coadă), deci răspunsul confirmă programarea, nu livrarea. Fiecare trimitere apare în istoricul de emailuri al documentului din WeBill (sursa API), la facturi și la proforme.\n\n**Body** (toate opționale)\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `to` | string | nu | Destinatarul. Implicit emailul clientului (prima adresă validă; celelalte trec în CC). |\n| `cc` | string | nu | Adrese în copie, separate prin `,` sau `;`. |\n| `subject` | string | nu | Subiectul. Implicit `Factura fiscala #WB000012` / `Factura proforma #PF000003`. |\n\n**Răspuns**: `statusMessage` `Email programat pentru trimitere`, `data`: `document_id`, `recipient`.\n\n**Erori**: 404 `Documentul nu a fost gasit`; 400 `Clientul nu are email setat` (fără `to` și fără email la client).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"to\": \"client@exemplu.ro\",\n  \"subject\": \"Oferta pentru implementarea magazinului online\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"to\": \"client@exemplu.ro\",\n  \"subject\": \"Oferta pentru implementarea magazinului online\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/email",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "email"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Email programat pentru trimitere\",\n  \"data\": {\n    \"document_id\": 7,\n    \"recipient\": \"client@exemplu.ro\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Listă",
          "_postman_id": "315dd3f3-ac9a-50dc-9b9f-bd8160e95cd0",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "receipts"
              ]
            },
            "description": "Încasările documentului, ordonate după dată, plus documentul (cu `totals.stats.incasat` / `rest`).\n\n**Răspuns**: `statusMessage` `Incasari document`, `data`: `document`, `receipts[]`.\n\n**`data` (încasare)**: `id`, `invoice_id` (ID-ul documentului), `type`, `identifier`, `serie_id`, `serie`, `number`, `receipt_number` (ex. `CH.1`, doar la numerar), `date`, `amount`, `notes`, `created_at`, `updated_at`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasari document\",\n  \"data\": {\n    \"document\": {\n      \"id\": 7,\n      \"document_type\": \"proforma\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"PF\",\n      \"number\": 1,\n      \"number_display\": \"PF000001\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 10,\n      \"due_date\": \"08.11.2026\",\n      \"due_date_iso\": \"2026-11-08\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"pending\",\n      \"efactura_type\": 100,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 9,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Implementare magazin online\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 5445,\n            \"pret_fara_tva\": 4500,\n            \"valoare\": 4500,\n            \"tva\": 945,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 4500,\n            \"total_tva\": 945\n          }\n        },\n        \"total\": {\n          \"valoare\": 4500,\n          \"tva\": 945,\n          \"total\": 5445\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": 5445\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    },\n    \"receipts\": []\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Creează",
          "_postman_id": "6c367fcc-7ff3-5691-871b-85f39f04f38f",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "receipts"
              ]
            },
            "description": "Înregistrează o încasare pe document. Starea de încasare a documentului (`status_incasare`) se actualizează: `pending` → `partial` → `incasata`. O sumă mai mare decât restul este acceptată; diferența intră în creditul clientului.\n\n**Body**\n\n| Câmp | Tip | Obligatoriu | Detalii |\n| --- | --- | --- | --- |\n| `type` | string | da | Tipul încasării (tabelul de mai jos). |\n| `amount` | număr > 0 | da | Suma, în moneda documentului. |\n| `date` | `AAAA-LL-ZZ` | da | Data încasării. |\n| `identifier` | string ≤ 255 | la op / bf / card / ramburs | Referința plății (nr. OP, ID tranzacție, AWB, nr. bon). |\n| `serie_id` | int | la cash | Seria cu chitanțier (`invoice_series[].id` din Nomenclatoare > Facturi). Chitanța se numerotează automat. |\n| `notes` | string | nu | Observații. |\n\n| `type` | Ce este | Câmpuri cerute în plus |\n| --- | --- | --- |\n| `op` | Ordin de plată / transfer bancar | `identifier` (ex. numărul OP) |\n| `bf` | Bon fiscal | `identifier` (numărul bonului) |\n| `card` | Plată cu cardul / POS / online | `identifier` (ex. ID-ul tranzacției) |\n| `ramburs` | Ramburs prin curier | `identifier` (ex. AWB) |\n| `cash` | Numerar, cu chitanță numerotată automat | `serie_id` = ID-ul seriei de facturi care are chitanțierul (`invoice_series[].id`, câmpul `receipt_serie`) |\n| `avans` | Avans | — |\n| `credit` | Din creditul clientului (sume plătite în plus, stornări) | — ; suma nu poate depăși creditul disponibil |\n\n**Răspuns**: `statusMessage` `Incasare creata`.\n\n**`data` (încasare)**: `id`, `invoice_id` (ID-ul documentului), `type`, `identifier`, `serie_id`, `serie`, `number`, `receipt_number` (ex. `CH.1`, doar la numerar), `date`, `amount`, `notes`, `created_at`, `updated_at`.\n\n**Erori**\n- 404 `Documentul nu a fost gasit`.\n- 422 `Date invalide la incasare` + `errors` pe câmpuri (ex. `identifier`, `serie_id`).\n- 422 `INVOICE_PAYMENT_AMOUNT_INVALID`, `INVOICE_PAYMENT_TYPE_INVALID`, `INVALID_RECEIPT_SERIE`.\n- 422 `Creditul disponibil al clientului este ... RON.` (tipul `credit`).\n- 409 `INVOICE_PAYMENT_NOT_ALLOWED` — documentul nu mai acceptă încasări (anulat, stornat, proformă convertită).\n\nÎncasările proformei se preiau pe factura în care este convertită. Scriptul de test salvează ID-ul în `proforma_receipt_id`.",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"type\": \"op\",\n  \"identifier\": \"OP-3003\",\n  \"amount\": 1000,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Avans 20%\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "POST",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"type\": \"op\",\n  \"identifier\": \"OP-3003\",\n  \"amount\": 1000,\n  \"date\": \"{{today}}\",\n  \"notes\": \"Avans 20%\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "receipts"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare creata\",\n  \"data\": {\n    \"id\": 6,\n    \"invoice_id\": 7,\n    \"type\": \"op\",\n    \"identifier\": \"OP-3003\",\n    \"serie_id\": null,\n    \"serie\": null,\n    \"number\": null,\n    \"receipt_number\": \"OP-3003\",\n    \"date\": \"2026-10-29\",\n    \"amount\": 1000,\n    \"notes\": \"Avans 20%\",\n    \"created_at\": \"2026-10-29 12:53:49\",\n    \"updated_at\": \"2026-10-29 12:53:49\"\n  }\n}"
            }
          ],
          "event": [
            {
              "listen": "test",
              "script": {
                "type": "text/javascript",
                "exec": [
                  "const body = pm.response.json();",
                  "if (body && body.data) {",
                  "    if (body.data.id !== undefined && body.data.id !== null) pm.environment.set('proforma_receipt_id', String(body.data.id));",
                  "}"
                ]
              }
            }
          ]
        },
        {
          "name": "Încasări - Actualizează",
          "_postman_id": "6ec94bf7-1aa6-55a1-8792-f777324a1601",
          "request": {
            "method": "PATCH",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              },
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "receipts",
                "{{proforma_receipt_id}}"
              ]
            },
            "description": "Modifică doar câmpurile trimise: `amount`, `date`, `identifier`, `notes`. Tipul și seria încasării nu se pot schimba (422 `Tipul incasarii nu poate fi modificat.`): pentru alt tip, șterge încasarea și creeaz-o din nou.\n\n**Răspuns**: `statusMessage` `Incasare actualizata`, `data` = încasarea.\n\n**Erori**: 404 `Incasarea nu a fost gasita`; 422 `Date invalide la incasare`; 422 `Eroare validare incasare: ...` (sumă ≤ 0, încasare creată automat din credit / stornare, factură stornată).",
            "body": {
              "mode": "raw",
              "raw": "{\n  \"amount\": 1500,\n  \"notes\": \"Avans 30%\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            }
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "PATCH",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  },
                  {
                    "key": "Content-Type",
                    "value": "application/json"
                  }
                ],
                "body": {
                  "mode": "raw",
                  "raw": "{\n  \"amount\": 1500,\n  \"notes\": \"Avans 30%\"\n}",
                  "options": {
                    "raw": {
                      "language": "json"
                    }
                  }
                },
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "receipts",
                    "{{proforma_receipt_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare actualizata\",\n  \"data\": {\n    \"id\": 6,\n    \"invoice_id\": 7,\n    \"type\": \"op\",\n    \"identifier\": \"OP-3003\",\n    \"serie_id\": null,\n    \"serie\": null,\n    \"number\": null,\n    \"receipt_number\": \"OP-3003\",\n    \"date\": \"2026-10-29\",\n    \"amount\": 1500,\n    \"notes\": \"Avans 30%\",\n    \"created_at\": \"2026-10-29 12:53:49\",\n    \"updated_at\": \"2026-10-29 12:53:49\"\n  }\n}"
            }
          ]
        },
        {
          "name": "Încasări - Descarcă chitanță",
          "_postman_id": "afed9d3e-015e-5536-965d-73d64d143a62",
          "request": {
            "method": "GET",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}/download",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "receipts",
                "{{proforma_receipt_id}}",
                "download"
              ]
            },
            "description": "PDF-ul chitanței (încasări `cash`) sau al dovezii de încasare. Răspunsul este fișierul (`Content-Type: application/pdf`, `Content-Disposition: attachment; filename=\"Chitanta-CH.1.pdf\"`).\n\n**Erori** (JSON): 404 `Documentul nu a fost gasit` / `Incasarea nu a fost gasita`."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "GET",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}/download",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "receipts",
                    "{{proforma_receipt_id}}",
                    "download"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "text",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/pdf"
                },
                {
                  "key": "Content-Disposition",
                  "value": "attachment; filename=\"Chitanta-OP-3003.pdf\""
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": ""
            }
          ]
        },
        {
          "name": "Încasări - Șterge",
          "_postman_id": "c05be1d7-c441-5e0e-a310-bffb0dbed29d",
          "request": {
            "method": "DELETE",
            "header": [
              {
                "key": "Accept",
                "value": "application/json"
              }
            ],
            "url": {
              "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}",
              "host": [
                "{{base_url}}"
              ],
              "path": [
                "api",
                "v6",
                "proforme",
                "{{proforma_id}}",
                "receipts",
                "{{proforma_receipt_id}}"
              ]
            },
            "description": "Șterge încasarea și recalculează starea de încasare a documentului.\n\n**Răspuns**: `statusMessage` `Incasare stearsa`, `data`: `receipt_id` și `document` (documentul actualizat).\n\n**Erori**: 404 `Incasarea nu a fost gasita`; 400 `Eroare stergere incasare: ...` (încasări create automat din credit / stornare)."
          },
          "response": [
            {
              "name": "200 OK",
              "originalRequest": {
                "method": "DELETE",
                "header": [
                  {
                    "key": "Accept",
                    "value": "application/json"
                  }
                ],
                "url": {
                  "raw": "{{base_url}}/api/v6/proforme/{{proforma_id}}/receipts/{{proforma_receipt_id}}",
                  "host": [
                    "{{base_url}}"
                  ],
                  "path": [
                    "api",
                    "v6",
                    "proforme",
                    "{{proforma_id}}",
                    "receipts",
                    "{{proforma_receipt_id}}"
                  ]
                }
              },
              "status": "OK",
              "code": 200,
              "_postman_previewlanguage": "json",
              "header": [
                {
                  "key": "Content-Type",
                  "value": "application/json"
                },
                {
                  "key": "X-RateLimit-Limit",
                  "value": "120"
                },
                {
                  "key": "X-RateLimit-Remaining",
                  "value": "119"
                }
              ],
              "cookie": [],
              "body": "{\n  \"status\": 200,\n  \"statusMessage\": \"Incasare stearsa\",\n  \"data\": {\n    \"receipt_id\": 6,\n    \"document\": {\n      \"id\": 7,\n      \"document_type\": \"proforma\",\n      \"company_id\": 1,\n      \"serie_id\": 1,\n      \"serie\": \"PF\",\n      \"number\": 1,\n      \"number_display\": \"PF000001\",\n      \"date\": \"2026-10-29\",\n      \"due_days\": 10,\n      \"due_date\": \"08.11.2026\",\n      \"due_date_iso\": \"2026-11-08\",\n      \"currency\": \"RON\",\n      \"exchange_rate\": 1,\n      \"status\": \"emisa\",\n      \"status_incasare\": \"pending\",\n      \"efactura_type\": 100,\n      \"language\": \"ro\",\n      \"client\": {\n        \"id\": 2,\n        \"company\": \"EXEMPLU DISTRIBUTIE SRL\",\n        \"is_pf\": false,\n        \"has_vat\": true,\n        \"vat\": \"10000008\",\n        \"country\": {\n          \"code\": \"RO\",\n          \"name\": \"Romania\"\n        },\n        \"state\": {\n          \"code\": \"B\",\n          \"name\": \"Bucuresti\"\n        },\n        \"city\": \"Sector 1\",\n        \"email\": \"facturi@exemplu.ro\",\n        \"address_1\": \"Str. Exemplu nr. 3\",\n        \"phone\": \"0722999999\",\n        \"bank\": \"Banca Exemplu\",\n        \"iban\": \"RO49AAAA1B31007593840000\"\n      },\n      \"totals\": {\n        \"items\": [\n          {\n            \"id\": 9,\n            \"sort_order\": 1,\n            \"type\": 1,\n            \"denumire\": \"Implementare magazin online\",\n            \"nota\": null,\n            \"cpv_code\": null,\n            \"um\": \"BUC\",\n            \"um_code\": \"H87\",\n            \"qty\": 1,\n            \"cota_tva\": 21,\n            \"pret_cu_tva\": 5445,\n            \"pret_fara_tva\": 4500,\n            \"valoare\": 4500,\n            \"tva\": 945,\n            \"discount\": 0,\n            \"discount_net\": 0,\n            \"discount_tva\": 0,\n            \"discount_percent\": null\n          }\n        ],\n        \"subtotal\": {\n          \"21\": {\n            \"total_fara_tva\": 4500,\n            \"total_tva\": 945\n          }\n        },\n        \"total\": {\n          \"valoare\": 4500,\n          \"tva\": 945,\n          \"total\": 5445\n        },\n        \"discount\": {\n          \"valoare\": 0,\n          \"tva\": 0,\n          \"total\": 0\n        },\n        \"stats\": {\n          \"incasat\": 0,\n          \"rest\": 5445\n        }\n      },\n      \"items_count\": 1,\n      \"payment_link_requested\": false,\n      \"payment_link\": null\n    }\n  }\n}"
            }
          ]
        }
      ]
    }
  ]
}
