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

9.8 KiB

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)