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.
Corpul cererii
Se trimite ca JSON, în corpul cererii (Content-Type: application/json) — nu în şirul de interogare.
AAAA-LL-ZZ; implicit ziua curentă.
intreaga (implicit) sau partiala. La normă parţială, contribuţiile se raportează la salariul minim, nu la brutul efectiv.
intreagapartiala
brut-la-net.
{
"net": 3000
}
{
"net": 5000
}
{
"net": 4000,
"persoane_intretinere": 1
}
{
"net": 10000,
"facilitate": "constructii",
"la_data": "2023-06-15"
}
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
meta.total_e_limita_de_jos e cuvântul pe care comuţi în cod.
brut e null.
data e null, iar aici stă motivul. neacoperit, facilitate_inactiva.
fara_date e proză şi se poate reformula, ăsta nu.
Exemple de răspuns
body: {"net": 3000}
{
"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."
}
}
body: {"net": 5000}
{
"data": {
"net": 5000,
"brut": 8548,
"la_data": "2026-10-07",
"facilitate": null,
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 8548,
"cota": "25%",
"valoare": 2137,
"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."
}
}
body: {"net": 4000, "persoane_intretinere": 1}
{
"data": {
"net": 4000,
"brut": 6837,
"la_data": "2026-10-07",
"facilitate": null,
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 6837,
"cota": "25%",
"valoare": 1709,
"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.",
"avertismente": [
"Mai multe brute dau acelaşi net (6837, 6838, 6839 lei), fiindcă fiecare componentă se rotunjeşte la leu. Îl întoarcem pe cel mai mic."
],
"nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
}
}
body: {"net": 10000, "facilitate": "constructii", "la_data": "2023-06-15"}
{
"data": {
"net": 10000,
"brut": 13632,
"la_data": "2023-06-15",
"facilitate": {
"sector": "constructii",
"denumire": "Facilităţi pentru sectorul construcţii",
"act_normativ": "OG 16/2022, art. I pct. 26 (modifică art. 60 pct. 5 din Legea 227/2015), aplicabil veniturilor din ianuarie 2023; Legea 411/2004, art. 43",
"de_verificat": false
},
"componente": [
{
"cod": "cas",
"denumire": "Contribuţia de asigurări sociale",
"baza_de_calcul": 13632,
"cota": "21.25%",
"valoare": 3033,
"act_normativ": "OG 16/2022, art. I pct. 26 (modifică art. 60 pct. 5 din Legea 227/2015), aplicabil veniturilor din ianuarie 2023; Legea 411/2004, art. 43",
"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.",
"avertismente": [
"Brutul depăşeşte plafonul facilităţii (10000 lei). Partea de deasupra nu beneficiază de nicio facilitate: se impozitează şi poartă cotele generale de CAS şi CASS, în timp ce partea de dedesubt păstrează cotele facilităţii. Baza impozabilă a părţii de deasupra e calculată scăzând contribuţiile aferente ei — interpretare a textului, nu citat din el."
],
"nota_acoperire": "Ce e acoperit şi ce nu: /financiar/v1/fiscal/acoperire."
}
}
Coduri de eroare
| Cod | Slug | Când apare |
|---|---|---|
| 401 | neautentificat | Token lipsă sau invalid. |
| 403 | feature_indisponibil | financiar.fiscal_calcul nu e în planul curent. |
| 422 | net_imposibil | Niciun brut întreg nu dă acest net. deducere_neacoperita — doar pentru la_data înainte de 2023. net_lipsa. |
| 429 | cota_depasita | Cota 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."
}
}