Continutul dosarului business:

## d212-business.sch ## 
Pattern: `id="business"`  
Contine reguli: **BR-D212-0001  BR-D212-0016** + **BR-D212-0076**

## Index reguli

- BR-D212-0001
- BR-D212-0002
- BR-D212-0003
- BR-D212-0004
- BR-D212-0005
- BR-D212-0006
- BR-D212-0007
- BR-D212-0008
- BR-D212-0009
- BR-D212-0010
- BR-D212-0011
- BR-D212-0012
- BR-D212-0013
- BR-D212-0014
- BR-D212-0015
- BR-D212-0016
- BR-D212-0076

## Unde se aplica validarile 

### `//@bifa_optiune | //@baza_optiune`
- **BR-D212-0016**  corelare `bifa_optiune` si `baza_optiune` (bifa=1 si baza_optiune completat(a) si = 24300)

### `//@cnpCoasigurat`
- **BR-D212-0014**  unicitate `cnpCoasigurat` (daca e completat) + diferit de `/*/@cif`
- **BR-D212-0076**  validare CNP pentru `cnpCoasigurat` (accepta gol sau CNP valid)

### `//@cif`
- **BR-D212-0013**  unicitate `cif` n formular (nu trebuie sa coincida cu `cnpCoasigurat` sau `cif_i`)
- **BR-D212-0001**  validare CNP pentru `cif` (accepta gol sau CNP valid)

### `//@*[name() = 'cif_i']`
- **BR-D212-0002**  `cif_i` este fie CNP valid, fie CUI valid, fie necompletat

### `/*`
- **BR-D212-0003**  corelare `rectif1/rectif2` si `d_rec` (d_rec=1 daca rectif1=1 sau rectif2=1, altfel 0)

### `//@*[name(.) = 'totalPlata_A']`
- **BR-D212-0004**  `totalPlata_A` = suma cifrelor din `/*/@cif`

### `//@*[name(.) = 'luna_r']`
- **BR-D212-0005**  `luna_r` trebuie sa fie 12

### `//@*[name(.) = 'an_r']`
- **BR-D212-0006**  `an_r` trebuie sa fie 2026

### `//@*[name(.) = 'bifa111']`
- **BR-D212-0007**  `bifa111=1` si elementul `cap11` exista

### `//@*[name(.) = 'bifa112']`
- **BR-D212-0008**  `bifa112=1` si elementul `cap12` exista

### `//@*[name(.) = 'bifa121']`
- **BR-D212-0009**  `bifa121=1` si elementul `cap14` exista

### `//@*[name(.) = 'bifa19']`
- **BR-D212-0010**  `bifa19=1` si elementul `cap19` exista

### `//@*[name(.) = 'bifa23']`
- **BR-D212-0011**  `bifa23=1` si elementul `cap23` exista

### `//@*[name(.) = 'cont_bancar']`
- **BR-D212-0012**  validare IBAN RO (format + checksum mod 97); accepta gol sau IBAN valid

### `//@bifa_optiune | //@situatie_optiune`
- **BR-D212-0015**  corelare `bifa_optiune` si `situatie_optiune` (bifa=1 si situatie_optiune completat(a))


## d212-business-2.sch ## 
Pattern: `id="business-2"`  
Con?ine reguli: **BR-D212-0017  BR-D212-0029**

## Index reguli

- BR-D212-0017
- BR-D212-0018
- BR-D212-0019
- BR-D212-0020
- BR-D212-0021
- BR-D212-0022
- BR-D212-0023
- BR-D212-0024
- BR-D212-0025
- BR-D212-0026
- BR-D212-0027
- BR-D212-0028
- BR-D212-0029

## Unde se aplica validarile

### `//*[@data_incep and @data_sf and @data_suspendare]`
- BR-D212-0027  `data_suspendare` trebuie sa fie ntre `data_incep` si `data_sf` (inclusiv), comparate ca date calendaristice (prin cod lexicografic YYYYMMDD)

### `//*[@cass_optiune]`
- BR-D212-0017  daca `cass_optiune` este completat, atunci trebuie sa fie `round(baza_optiune  10%)`

### `//@*[name(.) = 'bifa_optiune_coasigurat']`
- BR-D212-0018  `bifa_optiune_coasigurat = 1` si exista cel putin un element `coasigurat` n formular

### `//@*[name(.) = 'totalCassDatoratCoasigurat']`
- BR-D212-0019  `totalCassDatoratCoasigurat` trebuie sa fie suma tuturor `@cassDatoratCoasigurat` din elementele `coasigurat`

### `//@*[name(.) = 'totalCassDatorat']`
- BR-D212-0020  `totalCassDatorat` trebuie sa fie `cass_optiune + totalCassDatoratCoasigurat` (atribute lipsa se considera 0)

### `//d212:coasigurat/@bazaCassCoasigurat`
- BR-D212-0021  `bazaCassCoasigurat` trebuie sa fie 24300

### `//d212:coasigurat/@cassDatoratCoasigurat`
- BR-D212-0022  `cassDatoratCoasigurat` trebuie sa fie `round(bazaCassCoasigurat  10 / 100)`

### `//@*[name() = 'data_incep' or name() = 'data_sf' or name() = 'data_suspendare' or name() = 'norma_data_incep' or name() = 'norma_data_sf' or name() = 'str_data_incep' or name() = 'str_data_sf']`
- BR-D212-0023  pentru orice atribut din lista de date, anul din valoare trebuie sa fie `an_r - 1`

### `//*[@data_incep and @data_sf]`
- BR-D212-0024  `data_sf` trebuie sa fie = `data_incep` (comparare ca data calendaristica)

### `//*[@norma_data_incep and @norma_data_sf]`
- BR-D212-0025  `norma_data_sf` trebuie sa fie = `norma_data_incep` (comparare ca data calendaristica)

### `//*[@str_data_incep and @str_data_sf]`
- BR-D212-0026  `str_data_sf` trebuie sa fie = `str_data_incep` (comparare ca data calendaristica)

### `/*`
- BR-D212-0028  `stat_rezidenta` exista si `nerezident = 1`
- BR-D212-0029  daca `stat_rezidenta` este completat, nu are voie sa fie `RO`

## d212-business-3.sch ## 
Pattern: `id="business-3"`  
Con?ine reguli: **BR-D212-0030  BR-D212-0040**, respectiv **BR-D212-0041  BR-D212-0078**

## Index reguli

- BR-D212-0030
- BR-D212-0031
- BR-D212-0032
- BR-D212-0033
- BR-D212-0034
- BR-D212-0035
- BR-D212-0036
- BR-D212-0037
- BR-D212-0038
- BR-D212-0039
- BR-D212-0040
- BR-D212-0041
- BR-D212-0042
- BR-D212-0043
- BR-D212-0044
- BR-D212-0045
- BR-D212-0046
- BR-D212-0047
- BR-D212-0048
- BR-D212-0049
- BR-D212-0050
- BR-D212-0051
- BR-D212-0052
- BR-D212-0053
- BR-D212-0054
- BR-D212-0055
- BR-D212-0056
- BR-D212-0057
- BR-D212-0058
- BR-D212-0059
- BR-D212-0060
- BR-D212-0061
- BR-D212-0062
- BR-D212-0063
- BR-D212-0064
- BR-D212-0065
- BR-D212-0066
- BR-D212-0067
- BR-D212-0068
- BR-D212-0069
- BR-D212-0070
- BR-D212-0071
- BR-D212-0072
- BR-D212-0073
- BR-D212-0074
- BR-D212-0075
- BR-D212-0077
- BR-D212-0078
- BR-D212-0115

---

## Context si variabile comune

### Context: `/*` (radacina declaratiei)
Toate regulile din pattern sunt evaluate n interiorul unui singur `<rule context="/*">`, cu variabile comune:

- `d_rec`, `rectif1`, `rectif2` si `$drec_root`, `$rect1_root`, `$rect2_root`
- bife venituri realizate si `$bifa111_root  $bifa23_root`
- bife pe `<oblig_estimat>` (prima aparitie) si `$bifaOpt_root`, `$bifaOptCoas_root`

---

## Reguli pe declaratie 

### BR-D212-0031  Declaratie initiala fara nicio bifa relevanta
- Context: `/*`
- Logica:
  - daca `d_rec = 0` (declaratie initiala),
  - atunci trebuie sa existe **cel putin una** dintre bifele relevante setata la `1`
  - (include si bifele din `oblig_estimat`: `bifa_optiune`, `bifa_optiune_coasigurat`)
- Mesaj: utilizatorul trebuie sa completeze **venituri realizate** sau **CASS prin optiune** sau **persoane n ntretinere**.

### BR-D212-0033  Rectific doar optiuni (rectif1=0, rectif2=1) si fara venituri realizate
- Conditie: `rectif1='0' and rectif2='1'`
- Restrictie: nicio bifa de venit (`bifa111  bifa23`) nu are voie sa fie `1`.

### BR-D212-0030  `cif_str` exista si `nerezident = 1`
- Daca bifa `nerezident` e activa si trebuie sa existe `cif_str`
- Daca `nerezident` nu e activ si `cif_str` nu trebuie completat.

### BR-D212-0032  Rectific doar venituri (rectif1=1, rectif2=0) si NU optiuni/coasigurati
- Conditie: `rectif1='1' and rectif2='0'`
- Restrictie: `bifa_optiune` si `bifa_optiune_coasigurat` nu trebuie sa fie `1`.

---

## Reguli bifa113 (turistic pe norme) si oblig_realizat

### BR-D212-0034  daca `bifa113=1` si `real_camere_inchiriere` obligatoriu
- Daca `bifa113_root='1'` atunci `@real_camere_inchiriere` trebuie sa existe/nevid.

### BR-D212-0035  daca `bifa113=1` si `real_venit_inchiriere` obligatoriu
- Daca `bifa113_root='1'` atunci `@real_venit_inchiriere` trebuie sa existe/nevid.

### BR-D212-0036  daca `bifa113=1` si impozit = round(venit  10%)
- Verifica numeric (fara NaN).
- `real_impozit_inchiriere = round(real_venit_inchiriere  10/100)`.

---

## Reguli bifa122 (salarii din strainatate) si oblig_realizat

### BR-D212-0037  daca `bifa122=1` si `str_cas_baza` obligatoriu
### BR-D212-0038  daca `bifa122=1` si `str_cas_datorat = round(str_cas_baza  25%)`
### BR-D212-0039  daca `bifa122=1` si `str_cass_baza` obligatoriu
### BR-D212-0040  daca `bifa122=1` si `str_cass_datorat = round(str_cass_baza  10%)`

---

## Reguli bifa131 (CAS realizat) si oblig_realizat (bife + calcule)

> `obl_realizat` = primul `.//d212:oblig_realizat`

### BR-D212-0041 / 0042 / 0043  daca `bifa131=1` si bife CAS obligatorii
- 0041: `bifa_cas_real` trebuie sa existe
- 0042: `bifa_cas_recalculat` trebuie sa existe
- 0043: `bifa_cas_sub_plafon` trebuie sa existe

### BR-D212-0044  `bifa_cas_sub_plafon` si `bifa_cas_recalculat` nu pot fi ambele 1
- Mutual exclusiv pe valoarea `1`.

### BR-D212-0045 / 0046 / 0048 / 0052  cmpuri CAS obligatorii cnd `bifa131=1`
- 0045: `cas_total_ven` exista
- 0046: `cas_baza` exista
- 0048: `cas_datorat` exista
- 0052: `cas_dif_plus` exista

### BR-D212-0047  praguri minime pentru `cas_baza` n functie de `bifa_cas_real`
- Daca `bifa_cas_real = 1` si `cas_baza >= 12 * 4050`
- Daca `bifa_cas_real = 2` si `cas_baza >= 24 * 4050`
- Altfel nu impune prag.

### BR-D212-0049  `cas_datorat = round(cas_baza  25%)`
- Conditie: doar cnd `bifa131=1` si exista baza + datorat.

### BR-D212-0050  daca `cas_retinut_platitor` exista si `cas_retinut_platitor <= cas_datorat`
### BR-D212-0051  daca `cas_retinut_platitor` exista si `cas_retinut_platitor <= 24300`
- Plafon explicit numeric.

### BR-D212-0053  `cas_dif_plus = cas_datorat - cas_retinut_platitor` (lipsa si 0)
- Daca `cas_retinut_platitor` lipseste, se considera 0.

---

## Reguli bifa132 (CASS datorat pe venituri) ? oblig_realizat (AI + DPI)

### BR-D212-0054  daca `bifa132=1` si `bifa_cass_datorat_ai` trebuie sa existe
### BR-D212-0055  daca `bifa132=1` si `bifa_cass_datorat_dpi` trebuie sa existe

### BR-D212-0056  `bifa_cass_datorat_ai = 1` si exista `cass_total_ven_ai`
### BR-D212-0057  `bifa_cass_datorat_ai = 1` si exista `baza_cass_datorat_ai`

### BR-D212-0058  `baza_cass_datorat_ai <= 243000` (60SMB)
- Se aplica doar daca atributul exista.

### BR-D212-0059  `cass_anuala_ai = round(baza_cass_datorat_ai  10%)`
- Se aplica doar daca baza exista.

### BR-D212-0060  determinarea `cass_datorat_ai` n functie de baza si art. 180
- Daca `baza_cass_datorat_ai > 24300` si `cass_datorat_ai = round(cass_anuala_ai - cass_datorat_art180_ai)`
- Altfel, daca `cass_datorat_art180_ai >= 2430` si `cass_datorat_ai = 0`
- Altfel: regula nu impune o egalitate (ramura nu validam aici).

### BR-D212-0061  `cass_dif_plus_ai` (fara NaN)
- Daca diferenta `cass_datorat_ai - cass_retinut_platitor_alin6_ai` > 0 si `cass_dif_plus_ai = diferenta`
- Altfel si `cass_dif_plus_ai = 0`
- Se aplica doar daca poate calcula diferenta si atributul tinta exista numeric.

### BR-D212-0062  `cass_dif_minus6_ai` (fara NaN)
- Daca diferenta < 0 si `cass_dif_minus6_ai = cass_retinut_platitor_alin6_ai - cass_datorat_ai`
- Altfel si `cass_dif_minus6_ai = 0`
- Se aplica doar daca poate calcula diferenta si atributul tinta exista numeric.

---

## Reguli DPI (legate de bifa_cass_real) si oblig_realizat (prezenta cmpuri)

### BR-D212-0063  daca `bifa_cass_datorat_dpi = 1` si `bifa_cass_real` trebuie sa existe
### BR-D212-0064  BR-D212-0069  daca `bifa_cass_real` exista si trebuie sa existe si componentele cass_ven_*
- 0064: `cass_ven_dpi`
- 0065: `cass_ven_asc`
- 0066: `cass_ven_cfb`
- 0067: `cass_ven_inv`
- 0068: `cass_ven_asp`
- 0069: `cass_ven_alt`

---

## Total CASS si praguri CASS (realizat)

### BR-D212-0070  `cass_total_ven = suma(cass_ven_*)` (componente lipsa si 0)
- Se aplica doar daca `cass_total_ven` exista/nevid.

### BR-D212-0071 / 0072 / 0073  `cass_baza` fixa n functie de `bifa_cass_real`
- daca `bifa_cass_real=1` si `cass_baza=24300` (64050)
- daca `bifa_cass_real=2` si `cass_baza=48600` (124050)
- daca `bifa_cass_real=3` si `cass_baza=97200` (244050)

### BR-D212-0074  `cass_anuala = rotunjire(cass_baza  10%)`
- calc: `floor(x + 0.5)` (pentru valori pozitive)

### BR-D212-0075  determinarea `cass_datorat` n functie de baza si art. 180
- Daca `cass_baza > 24300` si `cass_datorat = round(cass_anuala - cass_datorat_art180)`
- Altfel, daca `cass_datorat_art180 >= 2430` si `cass_datorat = 0`
- Altfel: regula nu impune o egalitate.

---

## Diferente CASS (realizat)

### BR-D212-0077  `cass_dif_plus`
- Daca `(cass_datorat - cass_retinut) > 0` si `cass_dif_plus = diferen?a`
- Altfel si `cass_dif_plus = 0`
- Se aplica doar daca atributul tinta `cass_dif_plus` exista; pentru calcul, lipsa si 0.

### BR-D212-0078  `cass_dif_minus`
- Daca `(cass_datorat - cass_retinut) < 0` si `cass_dif_minus = cass_retinut - cass_datorat`
- Altfel si `cass_dif_minus = 0`
- Se aplica doar daca atributul tinta `cass_dif_minus` exista; pentru calcul, lipsa si 0.

### BR-D212-0115:
     IF( (statut NOT EXISTS OR statut NOT IN (1,2,5))
         AND ( (cass_total_ven_ai + cass_ven_dpi) >= 48600
               OR bifa_cas_sub_plafon = 1 )
       )
     THEN cas_baza MUST EXISTS

## d212-business-4.sch ##
Pattern: `id="business-4"`
Con?ine reguli: **BR-D212-0079  BR-D212-0114** + **BR-D212-0085**

## Index reguli

- BR-D212-0079
- BR-D212-0080
- BR-D212-0081
- BR-D212-0082
- BR-D212-0083
- BR-D212-0084
- BR-D212-0086
- BR-D212-0087
- BR-D212-0088
- BR-D212-0089
- BR-D212-0090
- BR-D212-0091
- BR-D212-0092
- BR-D212-0093
- BR-D212-0094
- BR-D212-0095
- BR-D212-0096
- BR-D212-0097
- BR-D212-0098
- BR-D212-0099
- BR-D212-0100
- BR-D212-0101
- BR-D212-0102
- BR-D212-0103
- BR-D212-0104
- BR-D212-0106
- BR-D212-0107
- BR-D212-0108
- BR-D212-0109
- BR-D212-0110
- BR-D212-0111
- BR-D212-0112
- BR-D212-0113
- BR-D212-0114
- BR-D212-0085

---

## Context si structura

### Context principal: `d212:cap11`
Majoritatea regulilor sunt evaluate n:
- `<rule context="d212:cap11">`

Aici apar corelari ntre:
- atributele `cap11` (ex: `categ_venit`, `scutire`, `reg`, `forma_org`, etc.)
- si atribute de pe radacina (ex: `/*/@nerezident`, `/*/@an_r`)

### Context secundar (rule separat): `d212:cap11[@categ_venit = '1012']`
- BR-D212-0085 verifica apari?ia unica n toata declara?ia.

---

## Reguli nerezident si scutire / reg

### BR-D212-0079  `nerezident=1` si `scutire` exista
- Context: `d212:cap11`
- Logica:
  - daca `/*/@nerezident = 1` si `@scutire` MUST EXISTS
  - altfel si `@scutire` MUST NOT EXISTS

### BR-D212-0081  `nerezident=1` si `reg` exista
- Context: `d212:cap11`
- Logica:
  - daca `/*/@nerezident = 1` si `@reg` MUST EXISTS
  - altfel ? `@reg` MUST NOT EXISTS

---

## Reguli `scutire` / `reg` n functie de `categ_venit`

### BR-D212-0080  daca `categ_venit` nu e permis, `scutire != 1`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1012,1021,1022,1023,1024)`
  - atunci `scutire` nu poate fi `1` (poate lipsi sau poate fi 0/altceva)

### BR-D212-0082  daca `categ_venit` nu e permis, `reg != 1`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1016,1003)`
  - atunci `reg` nu poate fi `1`

### BR-D212-0083  `scutire` si `reg` mutual exclusive
- Context: `d212:cap11`
- Logica:
  - nu pot fi ambele `1`
  - daca `scutire = 1` ? `reg = 0`

---

## Reguli `categ_venit` obligatoriu si unicitate

### BR-D212-0084  `categ_venit` obligatoriu n fiecare `cap11`
- Context: `d212:cap11`
- Logica:
  - `@categ_venit` MUST EXISTS

### BR-D212-0085  `categ_venit=1012` apare o singura data n declaratie
- Context: `d212:cap11[@categ_venit='1012']`
- Logica:
  - `count(//d212:cap11[@categ_venit='1012']) = 1`

---

## Reguli `det_ven_net` (existenta / valori permise)

### BR-D212-0086  anumite categ interzic `det_ven_net`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1012,1021,1022,1023,1024,1025)`
  - atunci `det_ven_net` MUST NOT EXISTS

### BR-D212-0087  anumite categ impun `det_ven_net=1`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1016,1006,1009,1010,1011)`
  - atunci `det_ven_net` MUST EXISTS si `det_ven_net=1`

### BR-D212-0088  `categ_venit=1015` impune `det_ven_net=2`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit = 1015`
  - atunci `det_ven_net` MUST EXISTS si `det_ven_net=2`

### BR-D212-0089  `categ_venit=1003` impune `det_ven_net ? {1,2}`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit = 1003`
  - atunci `det_ven_net` MUST EXISTS si `det_ven_net IN (1,2)`

---

## Reguli `forma_org` si `caen`

### BR-D212-0090  `forma_org` obligatoriu / interzis n functie de lista
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1006,1012,1015,1021,1022,1023,1024,1025)`
    si `forma_org` MUST EXISTS
  - altfel
    si `forma_org` MUST NOT EXISTS

### BR-D212-0091  pentru anumite categ, `forma_org != 3` (daca exista)
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1003,1009,1010,1011)`
  - atunci `forma_org` (daca exista) si 3

### BR-D212-0092  doar `1016` poate avea `forma_org=4` (daca exista)
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit != 1016`
  - atunci `forma_org` (daca exista) si 4

### BR-D212-0093  `categ_venit=1016` si `caen` exista
- Context: `d212:cap11`
- Logica:
  - `categ_venit = 1016` si `caen` MUST EXISTS (bidirectional)

---

## Reguli documente autorizare / asociere

### BR-D212-0094  `descriere_sediu_bun` obligatoriu n afara listei
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1003,1012,1021,1022,1023,1024,1025)`
  - atunci `descriere_sediu_bun` MUST EXISTS

### BR-D212-0095  pentru (1016,1015) ? `nr_doc_autoriz` obligatoriu
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1016,1015)`
  - atunci `nr_doc_autoriz` MUST EXISTS

### BR-D212-0096  `nr_doc_autoriz` si `data_doc_autoriz`
- Context: `d212:cap11`
- Logica:
  - daca unul exista si celalalt trebuie sa existe (si reciproc)

### BR-D212-0097  `nr_doc_asociere` obligatoriu cnd lista categ + `forma_org=2`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1016,1003,1009,1010,1011)` si `forma_org=2`
  - atunci `nr_doc_asociere` MUST EXISTS

### BR-D212-0098  `nr_doc_asociere` si `data_doc_asociere` (condi?ionat)
- Context: `d212:cap11`
- Logica:
  - regula se aplica doar daca exista cel putin unul din atribute
  - daca exista unul si trebuie sa existe si celalalt (si reciproc)

---

## Reguli `nr_zile_scutite` + validari an bisect

### BR-D212-0099  `nr_zile_scutite` permis doar pentru anumite categ
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1016,1003,1009,1010,1011)`
  - atunci `nr_zile_scutite` MUST NOT EXISTS

### BR-D212-0100  daca `an = an_r-1` si anul NU e bisect si `nr_zile_scutite = 365`
- Context: `d212:cap11`
- Aplicare: doar daca exista `nr_zile_scutite`, `an`, `an_r`

### BR-D212-0101  daca `an = an_r-1` si anul ESTE bisect si `nr_zile_scutite = 366`
- Context: `d212:cap11`
- Aplicare: doar daca exista `nr_zile_scutite`, `an`, `an_r`

---

## Reguli prezenta cmpuri venit (brut/net/pierdere)

### BR-D212-0102  `venit_brut` exista numai n cazuri permise
- Context: `d212:cap11`
- Logica:
  - daca (categ n (1016,1003,1009,1010,1011) si `forma_org=1`) OR (categ n (1015,1006))
    si `venit_brut` MUST EXISTS
  - altfel
    si `venit_brut` MUST NOT EXISTS

### BR-D212-0103  `venit_net_anual` XOR `pierdere` n cazuri permise
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit=1012` OR (categ n (1016,1003,1009,1010,1011) ?i `forma_org=2`)
  - atunci trebuie sa existe exact unul: `venit_net_anual` sau `pierdere`

### BR-D212-0104  `venit_net_anual` si `pierdere` nu pot fi ambele pozitive
- Context: `d212:cap11`
- Logica:
  - se aplica doar daca exista cel putin unul din atribute
  - interzice `venit_net_anual > 0` si `pierdere > 0` simultan

---

## Reguli `venit_recalculat` + seturi interzise

### BR-D212-0106  pentru categ recalculate si `venit_recalculat` obligatoriu
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1021,1022,1023,1024,1025)`
  - atunci `venit_recalculat` MUST EXISTS

### BR-D212-0107  n afara listei si `venit_recalculat = venit_net_anual - pierdere_compensata`
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit NOT IN (1021,1022,1023,1024,1025)`
  - atunci `venit_recalculat` MUST EXISTS si egal cu formula
  - lipsa `venit_net_anual` / `pierdere_compensata` si 0 n calcul

### BR-D212-0108  pentru categ recalculate si interzice setul de cmpuri "clasice"
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1021,1022,1023,1024,1025)`
  - atunci MUST NOT EXISTS:
    `venit_brut`, `chelt_deduc`, `venit_net_anual`, `pierdere`,
    `pierdere_precedenta`, `pierdere_compensata`, `venit_redus`

---

## Reguli `venit_redus` si `impozit11`

### BR-D212-0109  `venit_redus` exista numai cu `nr_zile_scutite` + cazuri permise
- Context: `d212:cap11`
- Logica:
  - daca ((categ=1003 ?i det_ven_net=2) OR categ n (1009,1010,1011)) si `nr_zile_scutite` exista
    si `venit_redus` MUST EXISTS
  - altfel
    si `venit_redus` MUST NOT EXISTS

### BR-D212-0110  pentru (1016/1003 cu det_ven_net=1) si `impozit11` interzis
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1016,1003)` ?i `det_ven_net=1`
  - atunci `impozit11` MUST NOT EXISTS

### BR-D212-0111  pentru (1016/1003 cu det_ven_net=1) si `venit_redus` interzis
- Context: `d212:cap11`
- Logica:
  - daca `categ_venit IN (1016,1003)` si `det_ven_net=1`
  - atunci `venit_redus` MUST NOT EXISTS

### BR-D212-0112  daca exista `pierdere` si`impozit11` trebuie sa fie 0
- Context: `d212:cap11`
- Logica:
  - daca `pierdere` EXISTS
  - atunci `impozit11` MUST EXISTS si `impozit11 = 0`

### BR-D212-0113  `impozit_retinut` permis doar n cazuri specifice
- Context: `d212:cap11`
- Logica:
  - `impozit_retinut` permis doar daca:
    - `categ_venit = 1016` OR
    - `categ_venit = 1021` OR
    - (`categ_venit = 1003` AND `reg = 1`)
  - altfel `impozit_retinut` MUST NOT EXISTS

### BR-D212-0114  `categ_venit=1015` si `tip_chirie` exista
- Context: `d212:cap11`
- Logica:
  - `categ_venit = 1015` si `tip_chirie` MUST EXISTS (bidirectional)
 