Files
roaauto/docs/tva-valori-manopera-materiale.md
Marius Mutu 395e51e5bb sync SVN r18197
ROAAUTO 2.5.6: Vizualizare comenzi unificata cu Istoric comenzi (filtre si coloane noi), coloane manopera/materiale si total fara/cu TVA in vizualizare comenzi si facturi; versiune_db 2026_09_23_01.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Cfkx1QfeDv987o8x1rAtrr
2026-09-23 22:13:59 +03:00

131 lines
9.8 KiB
Markdown

# 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)