oneapi
Autentificare
Financiar v1 / Fiscal

Salariu net la brut

Brutul din care rezultă un net dat, cu aceeaşi descompunere.

⚠️ Nu se rezolvă algebric. Fiecare componentă e rotunjită la leu, deci funcţia brut → net e
constantă pe mici intervale: pot exista mai multe brute care dau acelaşi net, iar unele neturi nu
sunt atinse de niciun brut întreg. Ruta caută brutul care dă EXACT netul cerut, îl întoarce pe cel
mai mic când sunt mai multe — şi spune în răspuns că sunt mai multe — iar când nu există niciunul,
refuză explicit în loc să rotunjească.

⚠️ La inversare nu ştim brutul înainte să-l aflăm, deci nu ştim nici ce tranşă de deducere i se
cuvine. Nu presupunem una: motorul primeşte un rezolvator şi întreabă, pentru fiecare brut
candidat pe care îl încearcă, ce deducere are acel brut. Aşa inversarea rămâne exactă pe toată
grila, nu doar peste pragul de la care deducerea e zero.

POST
https://oneapi.ro/api/financiar/v1/calcul/salariu/net-la-brut

Corpul cererii

Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.

NumeTipDescriereValori acceptate
netobligatoriu integer | null Obligatoriu, în lei întregi. 1 – 100000000
la_dataopțional string | null Opţional, AAAA-LL-ZZ; implicit ziua curentă.
normaopțional string | null Opţional: intreaga (implicit) sau partiala. La normă parţială, contribuţiile se raportează la salariul minim, nu la brutul efectiv. intreagapartiala
facilitateopțional string | null Opţional, ca la brut-la-net.
persoane_intretinereopțional integer | null Opţional, 0-20. 0 – 20
deducere_personalaopțional integer | null Opţional, în lei; necesar sub pragul pe care răspunsul îl indică. 0 – 100000
3.000 lei net Corpul cererii
{
    "net": 3000
}
5.000 lei net Corpul cererii
{
    "net": 5000
}
Cu o persoană în întreţinere Corpul cererii
{
    "net": 4000,
    "persoane_intretinere": 1
}
Sectorul construcţii, în 2023 Corpul cererii
{
    "net": 10000,
    "facilitate": "constructii",
    "la_data": "2023-06-15"
}

Parametri de interogare

Ruta nu acceptă parametri de interogare.

Cum se comportă

  • Brutul din care rezultă un net dat, cu aceeaşi descompunere ca la brut-la-net.
  • ⚠️ Nu se rezolvă algebric. Fiecare componentă e rotunjită la leu, deci funcţia brut → net e constantă pe mici intervale: pot exista mai multe brute care dau acelaşi net, iar unele neturi nu sunt atinse de niciun brut întreg. Ruta caută brutul care dă exact netul cerut; când sunt mai multe îl întoarce pe cel mai mic şi spune în răspuns care sunt toate; când nu există niciunul, refuză cu net_imposibil în loc să rotunjească şi să pară că a reuşit.
  • ⚠️ La inversare nu ştim brutul înainte să-l aflăm, deci nu ştim nici ce tranşă de deducere i se cuvine. Nu presupunem una: motorul primeşte un rezolvator şi întreabă, pentru fiecare brut candidat pe care îl încearcă, ce deducere are acel brut. Aşa inversarea rămâne exactă pe toată grila, nu doar peste pragul de la care deducerea e zero. Exemplu: net 2.695 lei la 1 martie 2025 dă exact 4.500 lei.
  • ⚠️ POST şi retenţie zero, ca la brut-la-net.

La ce folosește

  • Negocierea unui salariu pornind de la net, cu costul brut aferent.
  • Verificarea inversă a unui fluturaş.

Structura răspunsului

CâmpTipDescriere
data.net integer Poziţia netă calculată: totalul activelor minus totalul pasivelor.
data.brut integer Cel mai mic brut întreg care dă exact netul cerut.
data.la_data string Data la care sunt valabile valorile întoarse.
data.facilitate null
data.componente[].cod string Codul din nomenclatorul sursei — cheia pe care se filtrează.
data.componente[].denumire string Denumirea, aşa cum o publică sursa.
data.componente[].baza_de_calcul integer Suma pe care s-a aplicat cota — la impozit e baza impozabilă, nu brutul.
data.componente[].cota string
data.componente[].valoare integer Valoarea publicată de sursă pentru combinaţia de mai sus.
data.componente[].act_normativ string Temeiul cotei aplicate componentei.
data.componente[].de_verificat boolean
meta.sursa string Sursa oficială din care vin datele, cu licenţa ei acolo unde e cerută.
meta.retentie string Confirmarea că intrarea nu s-a scris nicăieri.
meta.nota_acoperire string De ce totalul e o limită de jos, în proză. meta.total_e_limita_de_jos e cuvântul pe care comuţi în cod.
meta.avertismente array Spune, când e cazul, că mai multe brute dau acelaşi net şi care sunt.
data.brut_interval Prezent doar când deducerea cade în tranşa netranscrisă: capetele între care stă sigur brutul. Când e prezent, brut e null.
meta.fara_date data e null, iar aici stă motivul. neacoperit, facilitate_inactiva.
meta.fara_date_cod Cuvântul scurt şi STABIL al motivului, pentru clienţii care comută pe el în cod: fara_date e proză şi se poate reformula, ăsta nu.

Exemple de răspuns

body: {"net": 3000}

POSThttps://oneapi.ro/api/financiar/v1/calcul/salariu/net-la-brut
{
    "data": {
        "net": 3000,
        "brut": 5036,
        "la_data": "2026-10-07",
        "facilitate": null,
        "componente": [
            {
                "cod": "cas",
                "denumire": "Contribuţia de asigurări sociale",
                "baza_de_calcul": 5036,
                "cota": "25%",
                "valoare": 1259,
                "act_normativ": "Codul Fiscal art.138",
                "de_verificat": false
            }
        ]
    },
    "meta": {
        "sursa": "Cotele vin din registrul comun `business_indicatori_fiscali`; facilităţile şi grila deducerii, din `Modules/Financiar/resources/fiscal`, cu act normativ pe fiecare valoare.",
        "retentie": "Zero. Intrarea nu se scrie nicăieri — nici în bază, nici în cache, nici în log.",
        "nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
    }
}

Coduri de eroare

CodSlugCând apare
401neautentificatToken lipsă sau invalid.
403feature_indisponibilfinanciar.fiscal_calcul nu e în planul curent.
422net_imposibilNiciun brut întreg nu dă acest net. deducere_neacoperita — doar pentru la_data înainte de 2023. net_lipsa.
429cota_depasitaCota lunară a planului a fost depăşită (vezi Retry-After).

Toate erorile au aceeași formă. eroare.cod e stabil și e cel după care trebuie să ramifici în cod — nu după textul din mesaj, care se poate schimba.

{
    "eroare": {
        "cod": "net_imposibil",
        "mesaj": "Niciun brut întreg nu dă acest net. deducere_neacoperita — doar pentru la_data înainte de 2023. net_lipsa."
    }
}