# Cercetare: factura de retur ca document de sine statator (tip 8/9) + aviz retur (24) Corectie fata de `retur_si_lista_preturi.md`: acea cercetare a documentat corect `But_retur` (retur de articole *in interiorul* unei facturi normale, tip 1/5/7/10 — selectie **per articol**). Aici e documentat mecanismul **separat**: factura de retur ca document propriu (tip 8 = retur lei, tip 9 = retur valuta), unde utilizatorul alege **facturile sursa la nivel de document**, iar linia de articole se populeaza integral din acele facturi. ## 1. Punctul de intrare si cursorul Oracle Tile-ul de pe ecranul principal de facturare, `Page2.Cw1` (`COMUN\clase\ofundal_facturare.vc2:882-884`): ``` PROCEDURE Page2.Cw1.do_actiune DO facturare_lista_de_preturi IN oproceduri_facturare.prg ENDPROC ``` `facturare_lista_de_preturi` (`COMUN\programe\oproceduri_facturare.prg:114-116`) = `Do politica.mpr`, care ruleaza meniul shortcut generat din `Meniuri\politica.mn2:14-15,45-46`: ``` DEFINE BAR 2 OF Shortcut PROMPT "\ cate un camp cu acelasi nume in cursorul VFP `crsarticole` (maparea VFP exacta camp-cu-camp nu a fost trasata pana in `crsfactura`; nu era necesara pentru raspuns). ## 4. Ce se poate face manual (`frm_facturare_articole`, `COMUN\clase\ofacturare.vc2:10968`) - **Stergere linie**: `do_sterge` (`:14608-14693`) nu e restrictionat pe tip; pentru retur (`Case Inlist(poDate.tip,8,9,24)`, `:14658-14659`) cantitatea stearsa se reintoarce in cursorul sursa (`Replace cantitate With cantitate - poArticol.cantitate For id_c = poArticol.id_c`) — deci **da, se pot sterge linii aduse**, iar cantitatea redevine disponibila pentru re-adaugare. - **Retur partial (modificare cantitate)**: coloana de cantitate din grila sursa isi schimba titlul in "Cant. max. de returnat" pentru tip 8/9 (`:15236-15239`); validarea in `do_verifica_articol` (`:14743-14754`, `llRetur = Inlist(poDate.tip,8,9,24)`) respinge doar cazul in care cantitatea ceruta ar depasi maximul returnabil — utilizatorul poate introduce orice cantitate <= maxim, deci **da, retur partial e posibil**. `do_modifica` (`:13746-13914`) trateaza explicit `Inlist(poDate.tip,8,9,24)` la `:13788,13895` fara blocaj suplimentar. - **Adaugare linie care NU e in facturile sursa**: `do_adauga_articol` (`:12813-13086`) preia articolul mereu din cursorul sursa al gridului (`lcCursor = [crsarticole]`, apoi `Select (lcCursor) / Scatter Name poArticol`, `:12843-12851`) — pentru tip 8/9 acest `crsarticole` e chiar rezultatul `cursor_retur` de la punctul 3, deci contine **doar** liniile facturilor alese. Nu exista pe acest formular o cale de a alege un articol din lista de preturi completa cand `poDate.tip` e 8/9 (spre deosebire de contract/comanda unde `crsarticole` ramane lista de preturi libera) — **nu se poate adauga o linie in afara facturilor sursa**, prin design-ul continutului cursorului, nu printr-o validare explicita de interzicere. ## 5. Aviz de retur (tip 24) Acelasi mecanism de baza: `Inlist(tnTip,8,9,24)` la `ofacturare.prg:306-307` (acelasi `pack_facturare.cursor_retur`) si aceleasi ramuri `Inlist(poDate.tip,8,9,24)` in `frm_facturare_articole` (`do_adauga_articol:12863`, `do_alege_stoc:13230`, `do_modifica:13788,13895`, `do_verifica_articol:14743`, `do_sterge:14658`). Diferenta: la antet, `nIdTipDoc` = 6 (AVIZ, ramura `Otherwise` la `ofacturare.prg:194-195`, pentru ca 24 nu e `<21` si nu e in `Inlist(45,48,49,51,52)`), iar formularul de date e `frm_date_aviz` (`ofacturare.prg:225`, ramura `Otherwise`), nu `frm_date_factura`. Punctul de intrare pentru tip 24: `emitere_aviz_clienti` cu `tnTip=7` (`COMUN\programe\oproceduri_facturare.prg:221-222`, `factureaza(24) && Retur aviz`), apelat din tile-ul `Page3.Cw1` -> `aviz_clienti.mpr` (neverificat detaliat, nu s-a insistat conform cerintei). ## 6. Relatia cu `But_retur` Mecanisme **complet separate**, confirmate pe cod: - **Vizibilitate**: `but_retur` e vizibil doar pentru tip 1/5/7/10 (`ofacturare.vc2:15127`, `This.but_retur.Visible = .T.` in ramura `Case Inlist(poDate.tip,1,5,7,10)`) — pe un document tip 8/9 acest buton nu exista deloc in UI (ramura lui la `Init` e alta, `:15236`). - **Formular de alegere a facturii sursa**: `But_retur` foloseste `caut_facturi_multiple_client_articol` (`oproceduri_facturare.prg:2124-2159`, filtrat suplimentar pe `b.id_articol = ?pnIdArticol` — cautare per-articol, cu titlu simplu "Alegeti factura"), tip 8/9 document foloseste `caut_facturi_multiple_client` (`:2091-2121`, fara filtru pe articol, multi-select, titlu "Alegeti facturile ..."). Doua functii diferite, in acelasi fisier, cu semnaturi aproape identice dar interogari SQL diferite. - **Procedura Oracle de populare a liniilor**: documentul tip 8/9 foloseste `pack_facturare.cursor_retur` la nivel de document intreg (populeaza `crsarticole` cu toate liniile facturilor alese, punctul 3 de mai sus). `But_retur` nu apeleaza `cursor_retur`/ `cursor_retur_document` deloc — foloseste `pack_facturare.cursor_gestiuni_articol_retur` (`ofacturare.vc2:13230`, per articol individual, in `do_alege_stoc`) pentru a alege gestiunea/seria/lotul de returnat pentru articolul deja selectat din lista de preturi a facturii normale curente. - **Punct comun**: niciunul direct. Singurul element comun e conventia de semn a cantitatii (`Iif(Inlist(poDate.tip,8,9,24),(-1),1)`, folosita si in `do_alege_stoc` al `But_retur`, `:13279-13309`, si pe formularul `frm_facturare_articole2`, `:17574-17585`) si textul UI ("cant. max. de returnat"). Concluzie: sunt doua fluxuri de cod independente care ating aceeasi clasa de formular (`frm_facturare_articole`) dar prin metode si proceduri Oracle diferite.