ROAFACTURARE · todos.txt punctul 13 · mockup, versiunea 9 (runda 17)
Datele documentului si articolele in aceeasi fereastra, fara incarcarea prealabila a tuturor articolelor din toate politicile de preturi. Acelasi formular la introducere, la modificare, la copiere si la proforma.
Deschis pe o factura in lei, emisa pe baza de comanda. Antetul e blocat — butonul din bara lui arata creionul. Asezarea e varianta D: antetul strans pe doua randuri, fara panou separat de discount, banda de totaluri lipita de grid pe toata latimea — cu procentul si motivul discountului chiar in ea — si randul de jos cu doua sectiuni colapsabile, incasare si alte date. La introducerea unui document nou arata identic, cu antetul deschis si campurile goale.
| 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 |