| Nr | Cod material | Articol | UM | Gestiune | +Cantitate | Pret f. TVA | pret c. TVA |
+ Disc. % | Disc. unitar | +Explicatie TVA | +Val. f. TVA | TVA | Val. c. TVA | Explicatie linie | +
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | MAT-0041 | Ciment Portland 42,5R 40 kg | +SAC | DEPOZIT CENTRAL | +100,000 | 28,5000 | + | 0,00 | 0,0000 | +Livrari 21% | +2 850,00 | 598,50 | 3 448,50 | — | +
| 2 | MAT-0107 | Adeziv gresie/faianta 25 kg | +SAC | DEPOZIT CENTRAL | +40,000 | 42,0000 | + | 5,00 | 2,1000 | +Livrari 21% | +1 596,00 | 335,16 | 1 931,16 | conform comanda | +
| 3 | SRV-0002 | Transport marfa | +BUC | — | +1,000 | 250,0000 | ✓ | +0,00 | 0,0000 | +Prestari 21% | +250,00 | 52,50 | 302,50 | — | +
| 4 | scrie codul sau denumirea… | +cautare pe server, pe masura ce scrii — nu se mai aduce lista de preturi intreaga | +||||||||||||
Un singur buton. Creionul deschide antetul si devine discheta; discheta salveaza doar + antetul si redevine creion. Nicio bifa — nici cele patru de azi, pe serie, numar, data si + scadenta. Fara valuta si fara data de curs — factura e in lei si niciun articol nu are pret in + valuta (sectiunea 4). Cat anume deschide, si de ce nu chiar tot in prima etapa: + sectiunea 2.
Incasarea si alte date (analitice, delegat/transport, adresa de facturare, text aditional) + stau colapsate, una langa alta, nu una sub alta (decizia 57). Sunt independente — se poate tine + deschisa doar una — iar randul inchis arata rezumatul continutului, nu doar titlul: cand + incasarea e completata arata suma si modalitatea, cand nu e nimic completat rezumatul spune asta. + Campurile din interior stau pe orizontala, doua randuri fiecare. A treia sectiune, pentru + motivul discountului, a fost incercata si respinsa — motivul sta langa discount, in banda de + totaluri (decizia 66 rastoarna decizia 64). + Incasarea ramane cea deosebita (decizia 41): e singura cu efecte laterale reale — + alocare/dezalocare de numere — deci garda de non-alocare la deschidere se scrie si se testeaza + intr-un singur loc, si e singura blocata pe un document deja emis (decizia 25). Tot pe document + emis, analiticele se vad dar nu se editeaza de aici — sectiunea 2.
Adauga articole deschide un meniu cu optiunile potrivite sursei — sectiunea 3. + Dispare gridul de sus cu toate articolele din toate politicile.
Baza, discount articole, discount document si TVA, desfacute pe un singur rand, cu totalul + mare singur la dreapta (decizia 57). Discountul de document se editeaza pe loc, procentul langa + suma; bifa „se pune in evidenta…" de pe panoul care disparea s-a mutat aici, discret. Repartizarea + pe cote de TVA e automata si proportionala (decizia 59) — nu se cere nimic utilizatorului.
Singura bucata din reparatia discountului de document care cere UI nou (decizia 61): text
+ optional, ajunge in AllowanceChargeReason din eFactura (ReasonCode
+ ramane 95). Sta in banda de totaluri, imediat dupa suma pe care o explica
+ (decizia 66) — nu ca sectiune separata jos, cum se stabilise la decizia 64. Ia latimea ramasa
+ intre discount si TVA; e activ doar cand discountul de document nu e zero — un motiv fara
+ discount n-are ce explica.
+ Protectia antetului nu e o inventie: formularul de azi de modificare are deja patru bife, cate una + pe camp, care deblocheaza serie, numar, data si scadenta. Ce se schimba e ca toate patru dispar, + inlocuite de un singur buton in bara panoului, care isi schimba imaginea: creion cat timp + antetul e blocat, discheta cat timp e deschis. +
+ +| Actiune | Ce salveaza | Cum |
|---|---|---|
| Butonul de antet, a doua apasare | +tot antetul, adica exact cele 14 campuri pe care le stie procedura: ruta, + delegat, agent, masina, data/ora expedierii, adresa de facturare, listare detaliata, + text aditional, tip SAF-T, eFactura, plus serie / numar / data / scadenta | +pe loc pack_facturare.modifica_date_factura.
+ Nu atinge articolele si nu recalculeaza nicio suma. Zece campuri se scriu neconditionat
+ in VANZARI, deci apelul trimite antetul intreg, nu doar ce s-a schimbat;
+ cele patru de identitate se propaga dupa ID_FACT in inca cinci tabele. |
| Termina | +tot documentul, ca azi | +ruta se alege dupa ce s-a schimbat — vezi sectiunea 7 |
+ Ce deschide efectiv butonul — si de ce nu chiar tot, deocamdata. + „Tot antetul” ramane intentia, dar campurile nu au aceeasi ruta de scriere. S-a cautat exhaustiv, + si in Oracle si in tot codul VFP: pentru o parte din ele nu exista nicio procedura care sa le + schimbe pe un document deja emis. Nu e o scapare de proiectare, e starea codului de azi. +
+| Grup de campuri | Etapa I | Etapa II, cu regenerare |
|---|---|---|
| cele 14 — serie, numar, data, scadenta, ruta, delegat, masina, agent, + data/ora expedierii, adresa de facturare, text aditional, listare detaliata, tip SAF-T, + eFactura | +se deschid salvate pe loc | +la fel |
| tip document, client, valuta, zi curs, sursa, gestiune sursa, politica de preturi, + si incasarea | +blocate cu explicatie la hover | +se deschid modificarea lor marcheaza documentul pentru + regenerare, aplicata la Termina |
| analiticele — venit / cheltuiala, sectie, responsabil, lucrare | +doar afisare se modifica din editarea notei + contabile, nu de aici | |
+ In loc de doua butoane („adauga tot” si „alege”), unul singur care deschide un meniu — acelasi + tipar folosit deja de butonul de modificare din lista de facturi. Optiunile se schimba dupa sursa + documentului, cu doua constante: ultimele doua optiuni sunt aceleasi peste tot — + Cauta in lista de preturi…, cu pretul din politici, si Alege din nomenclator…, cu + pretul tastat. Sursa umple documentul, nu il inchide: pe o factura din comanda se poate adauga + oricand un articol liber, si se poate si sterge — clientul mai vrea ceva, sau vrea sa schimbe. +
+ +| Cele doua mecanisme de retur | Cum e azi | Ce se schimba |
|---|---|---|
| Factura de retur document de sine statator |
+ exista deja alegi facturile clientului dintr-un browse cu + selectie multipla, iar liniile se populeaza din ele: gestiunea si pretul de achizitie + vin neschimbate din linia originala, pretul de vanzare se recalculeaza pe curs doar + daca moneda nu e nationala. Antetul primeste singur textul „RETUR FACTURA …”. | +se muta ca atare. Nu se reproiecteaza nimic din ce functioneaza — in special nu + mostenirea gestiunii si a pretului de achizitie. |
| Retur de articole intr-o factura de vanzare normala |
+ alt mecanism, complet separat: factura sursa se alege per articol, iar gestiunea + nu vine din factura sursa, ci se alege. Butonul e vizibil doar pe facturile din lista de + preturi. | +capata si alegerea la nivel de document, dupa modelul de mai sus; calea per-articol + ramane, pentru cand returnezi un singur lucru |
| Cantitate partiala si stergere | +exista deja coloana isi schimba capul in + Cant. max. de returnat, serverul calculeaza maximul, iar o linie stearsa isi + elibereaza cantitatea inapoi | +nimic — se pastreaza intocmai, ca si interdictia de retur dintr-un retur |
| Articole din afara facturilor sursa | +nu se poate lista de articole este continutul + facturilor alese, deci nu ai de unde alege altceva — aceeasi cauza ca la comanda | +optiunea din lista de preturi devine disponibila si aici. O linie de retur fara + factura originala e permisa, ca pe orice alt document — returul nu face exceptie. + Consecinta: pe acele linii gestiunea si pretul de achizitie se aleg, nu se + mostenesc, iar maximul returnabil calculat pe server nu se aplica, pentru ca nu exista + cantitate originala fata de care sa se limiteze. |
+ Doua concepte diferite, care azi impart acelasi camp mereu vizibil. Campul „Data curs valutar” + nu e eliminat niciodata in functie de valuta — doar pe retur — deci apare si pe facturi in lei + unde nu are ce cauta. +
+| Caz | Ce e in document | Ce arata antetul |
|---|---|---|
| Factura in lei, articole in lei |
+ tot in lei, niciun pret din politica in valuta | +fara valuta fara data curs + Nimic de ales, nimic de convertit. |
+
| Factura in lei, articole cu pret in valuta |
+ documentul e in lei; unele articole au pretul din politica in valuta si se convertesc | +apare Data curs valutar + Cu explicatia langa el: preturile in valuta se convertesc in lei la cursul acestei + zile; documentul si contabilitatea raman in lei. |
+
| Factura in valuta Invoice, credit note, retur valuta, factura fiscala valuta pe contract |
+ documentul insusi e in valuta; articolele au pret in valuta | +Valuta Data curs valutar + Amandoua, ca azi. |
+
+ Verificat pe formularul de azi si pe tabela. Raspunsul e mai simplu decat parea: si procentul, si + valoarea exista deja — dar nu in grid. +
+| Ce | Cum e azi | Ce se schimba |
|---|---|---|
| Procent si valoare unitara, ca intrare pentru operator | +exista deja in dialogul de articol care se deschide la + fiecare adaugare: trei campuri — procent, suma in lei, suma in valuta — orice tastezi in + unul recalculeaza pe celelalte. | +Dialogul dispare odata cu unificarea. Cele doua campuri devin coloane in grid, + cu acelasi calcul in spate. | +
| Ce se stocheaza | +o singura coloana VANZARI_DETALII.DISCOUNT_UNITAR,
+ NUMBER(22,6) — valoare absoluta pe unitate. Nu exista coloana de procent.
+ Aceeasi coloana e si pe politica de pret, deci discountul poate veni din politica. |
+ Nimic. Modelul de date nu se atinge — procentul ramane doar mod de introducere. | +
| Discountul in grid, azi | +inconsecvent pe factura in lei coloana e read-only; pe + factura in valuta e editabila, dar nu are handler de recalcul — o editare directa in + celula schimba valoarea fara sa refaca totalurile. | +Se repara odata cu mutarea in grid: aceleasi validari ca in dialogul de azi. | +
+ Cerinta e ca formularul sa poata fi deschis cu sursa deja completata, fara sa o mai alegi. + Doua cai fac deja exact asta. +
+Butonul de pe randul de comanda trimite comanda selectata si deschide formularul cu ea + completata. Ascuns cand comanda e deja facturata.
Butonul de pe grila de contracte trimite contractul selectat si deschide acelasi formular, + cu contractul completat. Nu mai alegi nimic.
Fara sursa precompletata — alegi comanda sau contractul in formular, ca pana acum.
+ Un singur formular, dar nu o singura cale de scriere. ID_FACT se pastreaza in
+ toate cazurile.
+
| Ce s-a schimbat | Cum se scrie | Efect |
|---|---|---|
| Antet — cele 14 campuri pe care le stie procedura | +pe loc modifica_date_factura |
+ aceeasi procedura ca butonul de antet pe a doua apasare; propaga serie / numar / data dupa ID_FACT |
+
| Antet — tip document, client, valuta, zi curs, sursa, gestiune sursa, politica de preturi, + si tot ce tine de incasare | +regenerare | +verificat pe cod: nu exista nicio cale de a le scrie pe un document emis — nici in + Oracle, nici in VFP. Singura ruta e drumul de emitere, adica regenerarea. Pana cand ea + exista (etapa II), campurile raman blocate. | +
| Antet — analiticele: venit / cheltuiala, sectie, responsabil, lucrare | +nu de aici | +se editeaza din editarea notei contabile, care le trateaza la nivel de linie de + nota. Formularul unificat le arata, nu le scrie — ca sa nu existe doua ferestre care + modifica acelasi camp cu intelesuri diferite. | +
| Explicatia si codul fiscal al unei linii | +pe loc modifica_explicatie_articol |
+ doua coloane, nicio suma | +
| Cantitati, preturi, linii adaugate sau sterse, discount, gestiune, cota TVA | +regenerare stergere + reemitere, in aceeasi tranzactie | +documentul vechi sters = 1; cel nou scris pe drumul normal de emitere; notele si rulajele refacute |
+
| Nimic | +nimic | +documentul ramane neatins | +
ID_FACT refolosit la reemitere. Azi se ia din secventa, neconditionat.
+ Varianta care il cauta dupa numar, serie si data exista in pachet, dar e comentata — si
+ filtreaza STERS = 0, deci trebuie citita inainte de stergere.IN_STOC <> 0).frm_facturi, nu in formularul unificat (deciziile 63 si 65). Formularul nu capata
+ niciun control nou din cerinta de audit.do_modifica de pe frm_facturi ramane activ pentru multi-selectie
+ (decizia 52). Formularul unificat preia doar cazul cu un singur document.ACT_TEMP, prin
+ oscrie_in_fisiere) nu se retrage odata cu #13 — coexista cu regenerarea prin
+ pack_facturare, iar decizia despre unificarea lor se ia mai tarziu, dupa ce #13
+ livreaza si se vede in practica daca intretinerea celor doua drumuri doare cu adevarat.CORESP_CONT_VENCHELT pentru articolele gestionabile si din
+ NOM_ARTICOLE.CONT (sau, implicit, 704) pentru cele negestionabile; derivarea
+ se face in VFP (decizia 27-bis), pack_facturare ramane neatins. Reteta si
+ costurile: sectiunea 10.+ ROAAUTO emite facturi din formularul lui de devize, dar prin acelasi pachet si in aceleasi tabele. + Formularul unificat le vede fara niciun cod special. Ce lipseste nu e recunoasterea, ci scrierea. +
+| Intrebare | Raspunsul de pe cod |
|---|---|
| Scrie in aceleasi tabele? | +da acelasi PACK_FACTURARE, acelasi drum prin
+ tabela de staging catre VANZARI_DETALII. Tip de document -12. |
| Se vad in editorul nou? | +da deja, testat pe date reale — detectia liniilor nu + filtreaza dupa tipul documentului. |
| Se pot adauga articole la emitere? | +da prin Alte servicii, la emiterea facturii finale. + Articolele vin din nomenclatorul brut, sunt limitate la cele fara stoc, iar + pretul se tasteaza — nu vine din politici. Raman linii proprii, nu se cumuleaza in + manopera sau materiale. |
| Se pot modifica dupa emitere? | +nu butonul se blocheaza imediat ce comanda are numar de + factura, metoda de stornare a comenzii e goala, iar gridul din editorul nou e read-only. + Singurul instrument asupra unei facturi emise e stergerea ei intreaga. Asta e + capacitatea care se cere. |
| Cum arata liniile lor? | +cele venite din deviz nu sunt articole: sunt sume cumulate pe categorii — manopera, + materiale, avans, discount — pe pseudo-articole cu cod negativ. Langa ele pot sta articole + reale. Niciunele nu au gestiune, nici macar cele reale. |
+ Intrebarea ramasa deschisa in sectiunea 8: cu ce cont de venit intra un articol adaugat
+ „Alege din nomenclator…”, fara politica de pret. Decizia 27 (mai jos) nu s-a schimbat; reteta prin
+ care ajungea la pack_facturare s-a abandonat intre runda 8 si runda 9-10, in favoarea
+ unui parametru nou.
+
| Articol | Sursa contului de venit |
|---|---|
| gestionabil cont de gestiune clasa 3xx |
+ CORESP_CONT_VENCHELT.CONT_VENIT, cautat pe CONT = contul de
+ gestiune al liniei |
| negestionabil | +NOM_ARTICOLE.CONT, daca e deja cont de clasa 6xx sau 7xx;
+ altfel, implicit 704 |
contabilizeaza_articol primeste contul, printr-un parametru nouSCD si CU_TVA pe ramura fara politica| Camp | Sursa noua |
|---|---|
SCD |
+ o optiune de firma noua, cu 4111 ca implicit — acelasi tipar in trei
+ niveluri deja folosit de pack_facturare.scrie_incasare2 pentru
+ RF_CONT_INCASARE_*: parametru explicit → optiune de firma → constanta
+ hardcodata daca optiunea lipseste. Mecanismul (tabelul OPTIUNI,
+ PACK_SESIUNE.getoptiunefirma, ecranul generic frm_optiuni) exista
+ de 15+ ani, deci cheia noua nu cere niciun cod VFP nou, doar randul in tabel.
+ ASCD nu se atinge — se calculeaza deja din V_SCD. |
CU_TVA |
+ derivat din cota liniei, nu fixat: 1 daca proc_tvav > 0,
+ altfel 0. Elimina prin constructie riscul gasit la verificarea adversariala: cu
+ CU_TVA = 1 fixat, o linie scutita ar fi intrat in comparatia de maxim din
+ nproc_tva_max si ar fi putut imprumuta coloana si taxcode-ul ei liniei de
+ discount a intregii facturi. Diferenta fata de ce face azi nota e intentionata, se
+ consemneaza la testare. |
pack_facturare e comun la
+ ROACONT / ROAGEST / ROACONTRACTE / ROAAUTO / ROAACNPRO, si ramura noua e atinsa de apelul comun
+ din ofacturare.vc2.frm_facturare_articole.do_scrie_articole si
+ frm_facturare_articole2.do_scrie_articole isi construiesc fiecare propriul apel RPC —
+ parametrul se adauga in ambele, nu o singura data.scrie_in_vanzari trebuie extinsa explicit daca se
+ vrea CONT_VENIT pastrat si dupa fapt in VANZARI_DETALII, nu doar in
+ VANZARI_DETALII_TEMP / ACT_TEMP.704) intra direct pe linie, fara sa mai treaca
+ printr-o politica sau o nota existenta — spre deosebire de reteta veche, nu mai cere configurare
+ cu contabilul, dar nici nu mai e validat impotriva planului de conturi (decizia 37).+ Nu blocheaza nimic din ce e mai sus; se inchid la implementarea povestii respective. Enumerate ca sa + nu se piarda intre runde — se merge pe recomandare daca Marius nu + spune altfel. +
+| Punct | Poveste | Se merge pe |
|---|---|---|
| Textul tooltip-urilor pentru analiticele read-only si pentru grupul de incasare blocat | +S3b | formularea propusa in raport, sectiunile 2.2 si 5.3 |
Eager vs. lazy pentru lookup-urile Oracle din Init (delegat / masina
+ ultimei facturi, casa) |
+ S3b, S3 | lazy, ca sa nu se plateasca la fiecare depliere |
_checkbox1 vs. chkDetaliat — campul unic de „listare
+ detaliata” |
+ S3b, S1 | nedecis — se inchide pe cod la implementare, nu prin alegere |
Forma lui toSursa: obiect scatter (duck-typing) sau clasa dedicata |
+ S3c | duck-typing, ca azi — o clasa noua n-ar schimba nimic functional |
| Conversia comenzii si a contractului: un commit sau doua | +S3c | un singur commit — aceleasi trei fisiere comune, separarea nu reduce + regresia |
goComanda = '' redundant la Cw3.do_actiune dupa conversie |
+ S3c | se lasa, marcat explicit „intentionat” in diff |
Contractul cu doua meniuri (articole vs. rate): eticheta generica sau diferentiata pe
+ OPT_FACTURARE |
+ S4b | diferentiata — „Alege ratele de facturat…” e gresita pe contractele cu + articole |
| „Alege facturile de returnat…” — ramane doar la antet sau capata incarcare aditiva din + bara | +S4b | ramane la antet in etapa I; mutarea e poveste separata |
But_renunt1 / But_reset1 capata Caption pentru
+ consistenta cu bara etichetata |
+ S4b | da — decizia 13 cere etichete, nu iconite mute |
Ordinea si formularea optiunilor din xmenu() per sursa |
+ S4b | tabelul din sectiunea 3 a raportului |
UX-ul contractului cu doua surse pe acelasi grid conceptual (crsarticole
+ filtrat + crsarticole1) |
+ S4 | de confirmat vizual la mockup, nu pe hartie |