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
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(șimanopera,materialedinAUTO_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(șicnt_) însumeazăscc in ('4427','4428');- liniile
DISCOUNT MANOPERA%/DISCOUNT MATERIALE%cuscc = '4428'(TVA-ul discountului) nu se mai scad din net — garda erascc <> '4427', deci pe TVA la încasare manopera și materialele ieșeau subevaluate cu TVA-ul discountului (ex.id_lucrare103: 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:valctvase însumează pe toate rândurilecrsfacturi, iarmanopera/materialedoar penrcrt=1. Dacă unnrordare >1 rând (mai multeid_set/nactînMV_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(coloanaDEV_ORDL.PROC_TVAV, expusă prinAUTO_COMENZI_VALIDATE→AUTO_ISTORIC_COMENZI.proc_tvav; DDL view2024/07/ff_2024_07_03_01_AUTO.sql:192) este multiplicatorul TVA pe comandă (1 + cota/100). TVA se calculează cavaloare * (proc_tvav - 1)(ex.Clase/oviz_devize.vc2:2355). Cândproc_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ă înCOMUN/programe/ofacturare_comun.prg:2425-2431șiCOMUN/clase/ointroduceri.vc2:16270, propagată pe linii caVANZARI_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.gnTipPretnu a fost găsit în cod. DEV_OPER.PRETla corecția unor luni vechi:pack_devize.dev_actualizeaza_operatieînmulțește prețul cu10000la trecerea ROL→RON (2005), fără legătură cu TVA (Scripturi_instalare/packages.sql:393-398).MV_ORDL_SUME_ACTșiAUTO_VORDL_FACTURIdepind de luna de lucru dinPACK_SESIUNE(vederi-auto-comenzi.md,vfp_oracle_pack_sesiune.md) — o citire dinsqlplusfă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") șiclb_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)