# Valorile de manoperă / materiale: cu TVA sau fără TVA? Read-only, din sursa view-urilor Oracle (`D:\ROA\DATABASE\SCRIPTURI_CLAR\`) + codul VFP. `Clase\oviz_devize.vc2` era editat în paralel — **liniile pot aluneca**, ancorele sigure sunt numele claselor/procedurilor. ## Răspuns scurt - Toate valorile de **deviz** (`val_manopera`, `ore_manopera`, `val_materiale_ach`, `val_materiale_vz`) sunt **FĂRĂ TVA**. - Coloanele **facturate** `val_manopera_factura` / `val_materiale_factura` (și `manopera`, `materiale` din `AUTO_FACTURI_EMISE`) sunt **FĂRĂ TVA** — vin din conturi de venit nete (704, 707/419). - **Doar** `valctva` / `valctva_factura` / „Total facturi (cu TVA)" / „Valoare cu TVA" este **CU TVA** = manoperă + materiale + 4427. ## Tabel | valoare | sursă | cu/fără TVA | formulă | fișier:linie | |---|---|---|---|---| | `ore_manopera` | `DEV_ORDL` ⋈ `DEV_OPER` | n/a (ore) | `sum(b1.timpn)` | `AUTO_ISTORIC_COMENZI` `2026/09/ff_2026_09_22_01_AUTO.sql:55`; `AUTO_FACTURI_EMISE` `:145` | | `val_manopera` | `DEV_OPER.PRET * TIMPN` | **fără TVA** | `sum(round(b1.timpn*b1.pret,2))` | view `2026/09/ff_2026_09_22_01_AUTO.sql:56` / `:146` | | `DEV_OPER.PRET` | scris la facturare din totalul **fără TVA** | **fără TVA** | `V_PRET := tnTotalFTva / tnTimpN` | `PACK_AUTO.dev_adauga_oper_fact` `2026/03/ff_2026_03_31_02_AUTO_PACK_AUTO.sql:392,415`; apelat cu `?pnTotalFTva` din `Programe/oproceduri_devize.prg:801` | | `DEV_OPER.PRET` (adaugare manuală) | `auto_vpreturi.pret` (tarif orar) | **fără TVA** | `Thisform.npret` = `v_preturi.pret` | `Clase/odevize.vc2:947,1082`; `auto_vpreturi` = `dev_nom_preturi` `2013/07/ff_2013_07_24_02_AUTO.sql:930`; DDL fără coloană TVA `Scripturi_instalare/tabele.sql:495` | | `val_materiale_ach` | `RUL.PRET` (cost lot FIFO) | **fără TVA** | `sum(round(pret*cante,2))` | view `2026/09/ff_2026_09_22_01_AUTO.sql:53` / `:143` | | `RUL.PRET` | `STOC.PRET` | **fără TVA** (cost) | `V_PRET := tab_stoc(i).PRET` | `PACK_FACTURARE.descarca_gestiune` `2026/09/ff_2026_09_16_04_COMUN_PACK_FACTURARE.sql:8975` | | `val_materiale_vz` | `RUL.PRETV` (preț vânzare) | **fără TVA** | `sum(round(pretv*cante,2))` | view `2026/09/ff_2026_09_22_01_AUTO.sql:54` / `:144` | | `RUL.PRETV` | `STOC.PRETV`; TVA-ul stă separat în `RUL.TVAV` / `RUL.PRETVTVA` | **fără TVA** | `V_PRETV_ORIG := tab_stoc(i).PRETV`; la insert `PRETV, TVAV, PRETVTVA` | `...COMUN_PACK_FACTURARE.sql:8977` și `:10491-10493` | | `val_manopera_factura` | `AUTO_VORDL_FACTURI.valfactmanopera` = `MV_ORDL_SUME_ACT.manopera_ron/rol` | **fără TVA** | cont **704** | `2025/06/ff_2025_06_30_01_AUTO.sql:9-12`; MV `2013/12/ff_2013_12_09_02_AUTO.sql:50` | | `val_materiale_factura` | `MV_ORDL_SUME_ACT.materiale_ron/rol` | **fără TVA** | cont **707, 419** | `2025/06/ff_2025_06_30_01_AUTO.sql:16-18`; MV `2013/12/ff_2013_12_09_02_AUTO.sql:68` | | `valctva` / `valctva_factura` | `MV_ORDL_SUME_ACT` | **CU TVA** | `manopera + materiale + tva` | `2025/06/ff_2025_06_30_01_AUTO.sql:23-26` | | `...tva_ron` (componenta TVA) | `MV_ORDL_SUME_ACT` | CU TVA | cont **4427 sau 4428** (TVA la încasare) | `2026/09/ff_2026_09_23_01_AUTO.sql`; înainte doar 4427 (`2013/12/ff_2013_12_09_02_AUTO.sql:86`) | | `manopera`, `materiale` (`AUTO_FACTURI_EMISE`) | `MV_ORDL_SUME_ACT` (704 / 707,419) | **fără TVA** | `b.manopera_ron/rol`, `b.materiale_ron/rol` | `2026/09/ff_2026_09_22_01_AUTO.sql:119-132` | | totaluri sub grid „Vizualizare facturi" | `crsfacturi` (`AUTO_FACTURI_EMISE`) | mixt | `clb_valctva`=Sum(valctva) **cu TVA**; `clb_manopera`/`clb_materiale`=Sum(manopera/materiale) WHERE `nrcrt=1` **fără TVA** | `Clase/oviz_devize.vc2` proc `frm_viz_facturi.refreshdata` (~`:17995`) | Garda `MV_ORDL_SUME_ACT`: `scd in ('4111','667','482','711','6588')` și `id_set in (31001..31007, 31011..31013)` (`2013/12/ff_2013_12_09_02_AUTO.sql:238-243`), definit ca materialized view *fast refresh on commit* cu fallback pe view (`:39-45`). ## Observația „Total facturi (cu TVA) = val_manopera_factura + val_materiale_factura" **Componentele nu conțin TVA.** `valctva = manopera + materiale + tva_ron`, deci egalitatea cu `manopera + materiale` înseamnă `tva_ron = 0`. **Cauza, măsurată pe date: firma are TVA la încasare** (`calendar.tva_incasare = 1`). Pe aceste firme TVA-ul facturii se înregistrează `4111 → 4428` (neexigibil), nu `4111 → 4427`. Până la `ff_2026_09_23_01_AUTO`, `MV_ORDL_SUME_ACT.tva_ron` însuma **doar `scc = '4427'`**, deci ieșea 0, iar coloanele/totalurile „cu TVA" afișau **netul**. Afirmația anterioară din acest doc („eticheta este corectă chiar și atunci") era dedusă doar din sursă și era **greșită**. Dovada (`MARIUSM_AUTO`, factura 1159, `id_lucrare` 131): `4428` TVA MANOPERA 147.82 + TVA MATERIALE 180.91 = 328.73 = 21 % din 1 565.37 (manopera 703.89 + materiale 861.48); `tva_ron` era 0. În 2026: 97 linii `4111 → 4427`, 574 linii `4111 → 4428`. **Fixul** (`2026/09/ff_2026_09_23_01_AUTO.sql`, aplicat pe `MARIUSM_AUTO`, nepublicat): - `tva_ron`/`tva_rol` (și `cnt_`) însumează `scc in ('4427','4428')`; - liniile `DISCOUNT MANOPERA%` / `DISCOUNT MATERIALE%` cu `scc = '4428'` (TVA-ul discountului) **nu se mai scad din net** — garda era `scc <> '4427'`, deci pe TVA la încasare manopera și materialele ieșeau subevaluate cu TVA-ul discountului (ex. `id_lucrare` 103: manopera 97.58 în loc de 99.58, materiale 234.58 în loc de 240.41). **Nu se dublează TVA-ul la încasare**: nota de exigibilizare e `4428 → 4427` (`scd = '4428'`), exclusă de filtrul `scd in ('4111','667','482','711','6588')`. Verificat pe date. ## Capcane - **Asimetrie de deduplicare** în `frm_viz_facturi.refreshdata`: `valctva` se însumează pe **toate** rândurile `crsfacturi`, iar `manopera`/`materiale` doar pe `nrcrt=1`. Dacă un `nrord` are >1 rând (mai multe `id_set`/`nact` în `MV_ORDL_SUME_ACT`), totalul „cu TVA" poate fi umflat față de restul coloanelor — nu trage concluzii din diferența dintre totaluri fără verificare. - `proc_tvav` (coloana `DEV_ORDL.PROC_TVAV`, expusă prin `AUTO_COMENZI_VALIDATE` → `AUTO_ISTORIC_COMENZI.proc_tvav`; DDL view `2024/07/ff_2024_07_03_01_AUTO.sql:192`) este **multiplicatorul TVA pe comandă** (`1 + cota/100`). TVA se calculează ca `valoare * (proc_tvav - 1)` (ex. `Clase/oviz_devize.vc2:2355`). Când `proc_tvav = 1` (scutit / taxare inversă), „cu TVA" == „fără TVA". Se stabilește la crearea comenzii și se actualizează la validare/facturare (`Programe/oproceduri_vizualizare.prg:285-288`). **Nu** este o opțiune de firmă. - **Opțiunea „prețuri cu TVA"** există, dar nu e de firmă: `CRM_POLITICI_PRETURI.PRETURI_CU_TVA` (per politică de preț), citită în `COMUN/programe/ofacturare_comun.prg:2425-2431` și `COMUN/clase/ointroduceri.vc2:16270`, propagată pe linii ca `VANZARI_DETALII.PRET_CU_TVA` / `cu_tva` (modulele comenzi/facturare articole). **Nu schimbă cele trei ecrane**: `RUL` ține mereu prețul net (`PRETV`) și cel cu TVA (`PRETVTVA`) în coloane separate, iar veniturile contabile sunt nete. `gnTipPret` nu a fost găsit în cod. - `DEV_OPER.PRET` la corecția unor luni vechi: `pack_devize.dev_actualizeaza_operatie` înmulțește prețul cu `10000` la trecerea ROL→RON (2005), fără legătură cu TVA (`Scripturi_instalare/packages.sql:393-398`). - `MV_ORDL_SUME_ACT` și `AUTO_VORDL_FACTURI` depind de luna de lucru din `PACK_SESIUNE` (`vederi-auto-comenzi.md`, `vfp_oracle_pack_sesiune.md`) — o citire din `sqlplus` fără `setluna/setan` întoarce tăcut alte date. ## Ecranul „Facturarea devizelor" Clasa `frm_emitere_facturi` (`Clase/oviz_devize.vc2:505`), deschisă din `Programe/oproceduri_vizualizare.prg:74` (`emitere_facturi`); procedurile `do_factureaza_avans` (`:1527`) și `do_factureaza_final` (`:2226`). Afișează „Manopera"/„Materiale" (nete), „Avans cu TVA facturat", „Total deviz cu TVA", „Total discount cu TVA", „Total factura", „TVA manopera", „TVA materiale". Manopera facturată se scrie în `DEV_OPER.PRET` ca **total fără TVA / ore** (`Programe/oproceduri_devize.prg:801` → `2026/03/ff_2026_03_31_02_AUTO_PACK_AUTO.sql:415`). Prețul „cu TVA" se calculează separat, la nevoie, cu `pack_sesiune.calculeaza_pret_cu_tva` (ex. `Clase/oviz_devize.vc2:2361`) — folosit la bonul fiscal detaliat, nu în coloanele de deviz. ## Propunere de etichetare (doar propunere, nu s-a modificat niciun `.vc2`) `obiect -> caption propus` **frm_viz_comenzi / grdcomenzi** (`Clase/oviz_devize.vc2`) - `cValManopera` -> `Valoare manopera (fara TVA)` - `cValManoperaFactura` -> `Valoare manopera factura (fara TVA)` - `cValMaterialeVz` -> `Valoare materiale vanzare (fara TVA)` - `cValMaterialeAch` -> `Valoare materiale achizitie (fara TVA)` - `cValMaterialeFactura` -> `Valoare materiale factura (fara TVA)` - `cOreManopera` -> neschimbat (ore, fără noțiune de TVA) **frm_viz_facturi / grdfacturi + totaluri** (`Clase/oviz_devize.vc2`) - `cManopera` -> `Manopera (fara TVA)` - `cMateriale` -> `Materiale (fara TVA)` - `cValManopera` -> `Valoare manopera (fara TVA)` - `cValMaterialeAch` -> `Valoare materiale achizitie (fara TVA)` - `cValMaterialeVz` -> `Valoare materiale vanzare (fara TVA)` - `clb_manopera` („Manopera fact.") -> `Manopera fact. (fara TVA)` - `clb_materiale` („Materiale fact.") -> `Materiale fact. (fara TVA)` - `clb_val_manopera` („Val. manopera") -> `Val. manopera (fara TVA)` - `clb_val_mat_ach` („Mat. achizitie") -> `Mat. achizitie (fara TVA)` - `clb_val_mat_vz` („Mat. vanzare") -> `Mat. vanzare (fara TVA)` - `cValctva` („Valoare cu TVA") și `clb_valctva` („Total facturi (cu TVA)") -> neschimbate (corecte) **frm_emitere_facturi** („Facturarea devizelor", `Clase/oviz_devize.vc2:505`) - „Manopera" / „Materiale" -> `Manopera (fara TVA)` / `Materiale (fara TVA)` - „Total deviz cu TVA", „Avans cu TVA facturat", „Total factura", „TVA manopera", „TVA materiale" -> neschimbate (deja explicite)