Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git, nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de cercetare pe care se sprijina modificarile din cod. O stergere acolo era definitiva. Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele fisierelor de test la care se refereau. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
367 lines
22 KiB
Markdown
367 lines
22 KiB
Markdown
# Verificare — alegerea stocului pe proforma (runda de verificare)
|
|
|
|
Investigatie read-only, 10.08.2026. Raspunde la 4 intrebari punctuale cerute de team-lead, pentru
|
|
decizia de proiectare S5b (comutare FACTURA <-> PROFORMA cu linii deja adaugate).
|
|
|
|
Continua fara sa reia: `s5b_proforma_descarcare_gestiune.md` (mecanismul `gestionabil=0` /
|
|
`id_gestiune=-1000`) si `s5b_proiectare_proforma_copiere.md` (proiectarea de runda 12, care a
|
|
descoperit deja ca `scrie_proforma` nu cheama `contabilizeaza_articol` deloc).
|
|
|
|
Nicio modificare de cod, niciun `git_sync.ps1`/`txt2vcx.ps1`, niciun commit, nicio scriere Oracle
|
|
(numai `SELECT`/`Read`/`Grep` pe fisiere de pe disc). Sursa Oracle folosita:
|
|
`D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql` (citat mai jos
|
|
`PACK:linie`).
|
|
|
|
**Status: COMPLET.**
|
|
|
|
---
|
|
|
|
## Rezumat executiv
|
|
|
|
1. **Da, pe calea principala si pe toate celelalte surse (cu exceptia copierii), stocul NU se
|
|
alege la adaugarea unei linii pe proforma azi** — pentru ca `gestionabil` a fost deja fortat pe
|
|
`0` in VFP, in masa, **inainte** ca gridul de linii sa se deschida. Cand ruleaza `Do Case`-ul de
|
|
la `ofacturare.vc2:13803`, `poArticol.gestionabil` e deja `0`, nu valoarea reala din nomenclator.
|
|
2. **Marcarea negestionabila are un singur mecanism activ azi, exclusiv in VFP**:
|
|
`UPDATE (m.lcCursor) SET gestionabil = 0` (`ofacturare.prg:333-336`), rulat in interiorul
|
|
functiei `factureaza()`, imediat dupa incarcarea cursorului candidat (`crsarticole`) si
|
|
**inainte** de construirea `crsfactura` (`creeaza_facturacrs`, linia 338) — adica la
|
|
**deschiderea documentului / incarcarea liniilor candidate**, nu la Termina/salvare. **Exista si
|
|
un al doilea mecanism, in Oracle**, in `cursor_retur_document` (`PACK:3993-4000`,
|
|
`CASE WHEN V_PROFORMA=1 THEN 0 ...`), dar acesta e **mort in fluxul curent**: `cursor_retur_document`
|
|
se cheama dintr-un singur loc (`ofacturare.prg:268`, ramura de copiere), cu
|
|
`V_PROFORMA = poDate.eProforma` **al documentului nou**, care e **intotdeauna 0** dupa copiere
|
|
(`nIdTipDoc` nu se propaga de la sursa, `ofacturare_comun.prg:370`) — deci ramura `V_PROFORMA=1`
|
|
nu se activeaza niciodata azi. **Nu e o contradictie intre cele doua rapoarte anterioare — sunt
|
|
doua mecanisme reale in cod, dar doar unul (cel VFP) e activ pe traseul de creare a unei
|
|
proforme; cel Oracle exista doar pentru copiere si acolo nu se declanseaza cu valoarea curenta a
|
|
parametrului.**
|
|
3. **`pret_achizitie` depinde de sursa**: pe calea principala (`cursor_preturi`, lista de preturi)
|
|
NU se completeaza deloc din cursor (coloana nici nu exista in `SELECT`-ul lui `cursor_preturi`)
|
|
— ramane `0`, prin acelasi tipar de valoare implicita ca la `id_gestiune` (`do_initializeaza_articol`).
|
|
Pe sursele care incarca dintr-un document existent (`cursor_avize`, `cursor_retur_document` —
|
|
avize si copiere), `PRET_ACHIZITIE` **e** selectat direct din `VANZARI_DETALII`, deci ajunge real.
|
|
4. **Daca proforma ar pastra `id_gestiune` real pana la salvare, nimic din contabilizare/stoc nu
|
|
s-ar strica** — pentru ca blocajul real nu e sentinela `-1000`, ci faptul ca `scrie_proforma`
|
|
(calea Oracle aleasa la Termina cand `eProforma=1`) **nu cheama niciodata**
|
|
`contabilizeaza_articol`/`descarca_gestiune` (confirmat deja in raportul-sursa de runda 12).
|
|
`adauga_articol_factura` (care ar primi `V_ID_GESTIUNE` real) **se cheama oricum**, neconditionat
|
|
de `eProforma`, pentru orice linie — deci un `id_gestiune` real ar ajunge fara probleme in
|
|
`VANZARI_DETALII_TEMP`/`VANZARI_DETALII`, fara sa declanseze nimic in plus. **`do_alege_stoc` nu
|
|
rezerva stoc real** — face doar un `SELECT` (cursoare `cursor_gestiuni_articol*`) si scade local,
|
|
in memorie, cantitatile deja puse pe documentul curent (`crsfactura`), ca operatorul sa nu aleaga
|
|
de doua ori acelasi lot; nu scrie nimic in Oracle. Deci lasarea lui `do_alege_stoc` sa ruleze pe
|
|
proforma nu ar bloca stoc pentru nimeni. Singurul risc real gasit e cel deja semnalat in
|
|
`s5b_proiectare_proforma_copiere.md` §5 (drumul invers, proforma -> factura in aceeasi sesiune),
|
|
care ramane valabil indiferent de aceasta decizie.
|
|
|
|
---
|
|
|
|
## Intrebarea 1 — se alege stocul la adaugarea unui articol pe proforma azi?
|
|
|
|
**Raspuns: NU, pe niciuna dintre caile de creare directa a unei proforme** (nu prin copiere).
|
|
|
|
### Calea principala — `cursor_preturi`
|
|
|
|
`cursor_preturi` (`PACK:2138-2646`) e apelat pentru `tnTip` in `{45, 1, 22, 5, 29, 7, 10, 23}`
|
|
(`ofacturare.prg:275-282` — lista de preturi, inclusiv `restaurant`), adica cea mai comuna sursa
|
|
pentru o proforma noua. SELECT-ul lui `cursor_preturi` intoarce `GESTIONABIL` ca
|
|
`C.IN_STOC AS GESTIONABIL` (`PACK:2192`, `:2297` — valoarea reala din `NOM_ARTICOLE`, fara nicio
|
|
constienta de proforma; `cursor_preturi` **nu are parametru** `V_PROFORMA`, confirmat prin grep pe
|
|
tot fisierul: `V_PROFORMA` apare doar la declaratia si corpul lui `cursor_retur_document`,
|
|
`PACK:408, 3939, 3944, 3952, 3957, 3994`).
|
|
|
|
Insa, imediat dupa ce acest cursor e adus in `crsarticole` in VFP, **inainte** ca operatorul sa
|
|
apuce sa vada gridul de linii:
|
|
|
|
```
|
|
COMUN\programe\ofacturare.prg:330-336
|
|
* Daca este o proforma, consider toate articolele negestionabile, pentru a nu mai alege din stoc
|
|
* 12.03.2021
|
|
IF poDate.eProforma = 1
|
|
UPDATE (m.lcCursor) SET gestionabil = 0
|
|
GO TOP IN (m.lcCursor)
|
|
ENDIF
|
|
```
|
|
|
|
`m.lcCursor` = `crsarticole` (setat la `:310`). Acest bloc ruleaza **dupa** `Do Case`-ul de
|
|
incarcare (`:266-308`) si **inainte** de `creeaza_facturacrs([crsfactura])` (`:338`) — adica la
|
|
compunerea listei de articole candidate, nu la salvare. Cand operatorul adauga o linie mai tarziu,
|
|
`Do Case`-ul care alege dialogul (`ofacturare.vc2:13803-13809`) citeste `poArticol.gestionabil`,
|
|
care e deja `0` pentru **toate** liniile candidate (setat in masa mai sus), deci intra pe ramura
|
|
`frm_articol_factura`, **niciodata** pe `Thisform.do_alege_stoc`.
|
|
|
|
### Celelalte cursoare (fara copiere)
|
|
|
|
Verificat direct in `PACK_FACTURARE`, niciunul din urmatoarele cursoare, folosite pentru celelalte
|
|
surse ale unei proforme noi, nu are parametru `V_PROFORMA` si nici nu calculeaza `GESTIONABIL` in
|
|
functie de proforma — toate intorc valoarea reala din nomenclator/contract:
|
|
|
|
| Cursor | Apelat pentru (`tnTip`) | `GESTIONABIL` in SELECT | Linie |
|
|
|---|---|---|---|
|
|
| `cursor_preturi` | 45,1,22,5,29,7,10,23 | `C.IN_STOC` | `PACK:2192,2297` |
|
|
| `cursor_contract` | 2,26,6,52 | `A.GESTIONABIL` (coloana reala) | `PACK:2411,2487,2572` |
|
|
| `cursor_comanda` | 3,21,25,28,42,47 | `E.IN_STOC` | `PACK:2789` |
|
|
| `cursor_lucrare` | 27 | `C.IN_STOC` | `PACK:3029` |
|
|
| `cursor_articole_k` | 48,49 | `C.IN_STOC` | `PACK:3117` |
|
|
| `cursor_avize` | 4 | `C.IN_STOC` | `PACK:3634` |
|
|
| `cursor_aviz_nir` | 30 | `0` (hardcodat) | `PACK:3745` |
|
|
| `cursor_gestiune` | 41 | `A.GESTIONABIL` | `PACK:4104` |
|
|
| `cursor_retur` | 8,9,24 | (nu are coloana `GESTIONABIL` separata — vezi nota) | `PACK:3934-3948` |
|
|
|
|
Pentru **toate** aceste surse, aceeasi bucla `ofacturare.prg:330-336` e singurul loc care forteaza
|
|
`gestionabil=0` cand `poDate.eProforma=1` — mecanismul e identic indiferent de sursa, pentru ca
|
|
`UPDATE (m.lcCursor) SET gestionabil = 0` ruleaza pe `crsarticole` dupa orice ramura a `Do Case`-ului
|
|
de la `:266-308`, nu doar pe ramura lista-de-preturi.
|
|
|
|
### Ramura de copiere — singura cu parametru `V_PROFORMA` in Oracle
|
|
|
|
`Case m.llCopiere` (`ofacturare.prg:267-268`) e **singura** ramura care apeleaza
|
|
`cursor_retur_document`, singurul cursor cu parametru `V_PROFORMA`. Insa la copiere, documentul nou
|
|
pleaca intotdeauna cu `eProforma=0` (`nIdTipDoc` explicit necopiat, `ofacturare_comun.prg:370` —
|
|
deja stabilit in `s5b_proiectare_proforma_copiere.md` §2.3), deci `V_PROFORMA` trimis e `0`, iar
|
|
ramura `GESTIONABIL = B.IN_STOC` (valoarea reala) se activeaza, nu `WHEN V_PROFORMA=1 THEN 0`. Asta
|
|
e comportamentul **corect si dorit** la copiere (liniile redevin gestionabile) — dar confirma ca
|
|
`V_PROFORMA=1` nu apare niciodata cu valoarea `1` in vreun apel real azi (vezi Intrebarea 2).
|
|
|
|
**Concluzie Intrebarea 1**: pe orice cale de creare directa a unei proforme (nu copiere), la
|
|
momentul `Do Case`-ului de adaugare a liniei (`ofacturare.vc2:13803`), `poArticol.gestionabil` e
|
|
deja `0` — fortat de VFP la incarcare, nu valoarea reala din nomenclator. `do_alege_stoc` nu ruleaza
|
|
niciodata pentru o linie noua adaugata sub `eProforma=1`, indiferent de sursa.
|
|
|
|
---
|
|
|
|
## Intrebarea 2 — unde exact se face marcarea negestionabila si CAND?
|
|
|
|
**Doua locuri in cod, dar un singur loc activ azi:**
|
|
|
|
### 2.1 VFP — activ, la incarcarea documentului (nu la salvare)
|
|
|
|
`COMUN\programe\ofacturare.prg:333-336`, in interiorul procedurii `factureaza()`. Secventa completa
|
|
in `factureaza()`:
|
|
|
|
1. `:266-308` — `Do Case` pe `tnTip`/`llCopiere`, alege cursorul Oracle si il aduce in `crsarticole`.
|
|
2. `:311` — `goExecutor.oExecute(lcSqlCursor, lcCursor)` — executa efectiv apelul Oracle.
|
|
3. `:324-336` — daca sunt randuri, **si daca `poDate.eProforma = 1`**: `UPDATE crsarticole SET gestionabil = 0`.
|
|
4. `:338` — abia acum `creeaza_facturacrs([crsfactura])` construieste cursorul gol de linii ale
|
|
documentului; liniile candidate (`crsarticole`, deja marcate) raman disponibile pentru ca
|
|
operatorul sa aleaga din ele.
|
|
|
|
Acest pas ruleaza **la deschiderea ecranului de adaugare articole**, mult inainte de `Termina`
|
|
(`do_scrie_factura`, apelat doar la click pe butonul de finalizare — vezi 2.3 mai jos). Nu exista
|
|
niciun `UPDATE`/`REPLACE gestionabil With 0` la salvare in `do_scrie_factura` sau `do_scrie_articole`
|
|
— am cautat explicit `gestionabil` in ambele metode (`ofacturare.vc2:14197-14380`,`:13967-14150`) si
|
|
singura referinta la `gestionabil` in acea zona e citirea lui la `Do Case`-ul din `:13803` (decizia
|
|
de dialog), nu o scriere.
|
|
|
|
### 2.2 Oracle — exista in cod, dar mort in fluxul curent
|
|
|
|
`cursor_retur_document` (`PACK:3949-4064`), branch la `PACK:3993-4000`:
|
|
```sql
|
|
(case
|
|
when V_PROFORMA = 1 then 0
|
|
when V_COPIERE = 1 then B.IN_STOC
|
|
else A.GESTIONABIL
|
|
end) AS GESTIONABIL,
|
|
```
|
|
cu comentariu explicit in cod: `-- V_PROFORMA: Daca este proforma (1), fac articolele negestionabile
|
|
sa pot alege orice cantitate` (`PACK:3957`). Acest cod **exista si e corect scris**, dar
|
|
`cursor_retur_document` are un singur punct de apel in tot codul VFP (confirmat prin cautare in
|
|
`ofacturare.prg`, singura potrivire e la `:268`; potrivirile suplimentare gasite in
|
|
`COMUN\.svn\pristine\*` sunt copii istorice ale **aceleiasi** linii, nu apeluri suplimentare), si
|
|
acolo `V_PROFORMA` trimis e `poDate.eProforma` **al documentului nou** din copiere, care e
|
|
intotdeauna `0` (Intrebarea 1). **Deci acest branch Oracle nu se activeaza niciodata cu valoarea 1
|
|
in fluxul curent** — e cod mort din perspectiva efectului observabil, desi sintactic corect si
|
|
prezent.
|
|
|
|
### 2.3 Clarificare pe "inainte de compunerea documentului" vs. "la salvare"
|
|
|
|
Formularea raportului de runda 9 ("VFP marcheaza toate liniile proformei negestionabile inainte de
|
|
compunerea documentului") e **corecta** — "compunerea documentului" inseamna acolo constructia
|
|
listei de articole candidate/`crsfactura` (pasul 4 de mai sus), care se intampla la
|
|
**deschiderea** ecranului de facturare, nu la apasarea `Termina`. Nu exista o contradictie reala cu
|
|
mentiunea `V_PROFORMA` din `cursor_retur_document` din brief — acel `CASE` Oracle e un mecanism
|
|
separat, pentru un cursor diferit (candidati la copiere), care azi nu se declanseaza niciodata cu
|
|
`V_PROFORMA=1`. Ambele afirmatii din surse sunt adevarate simultan, pentru ca descriu lucruri
|
|
diferite.
|
|
|
|
**Concluzie Intrebarea 2**: singurul mecanism activ e `UPDATE` de masa in VFP
|
|
(`ofacturare.prg:333-336`), care ruleaza in `factureaza()`, la incarcarea/compunerea listei de
|
|
articole candidate — **cu mult inainte** de `Termina`/`do_scrie_factura`. Mecanismul Oracle din
|
|
`cursor_retur_document` exista in cod dar nu se activeaza cu valoarea curenta a parametrilor.
|
|
|
|
---
|
|
|
|
## Intrebarea 3 — se completeaza `pret_achizitie` pe liniile de proforma?
|
|
|
|
**Depinde strict de sursa cursorului, la fel ca la `gestionabil` — dar cu rezultat opus pentru
|
|
calea principala.**
|
|
|
|
### Ce cursoare selecteaza `PRET_ACHIZITIE`
|
|
|
|
Cautare directa in `PACK_FACTURARE` (`grep PRET_ACHIZITIE`): coloana **nu apare deloc** in
|
|
`cursor_preturi` (`PACK:2138-2646`), `cursor_contract` (`:2646-2952`), `cursor_comanda`
|
|
(`:2952-3173`), `cursor_lucrare` (`:3173-3595`), `cursor_articole_k` (`:3595-3703`),
|
|
`cursor_gestiune` (`:4158-4349`). Apare doar in:
|
|
- `cursor_avize` (in jurul liniilor `PACK:3754-3864` — sursa `VANZARI_DETALII`/`RUL`, articol
|
|
provenit dintr-un aviz existent);
|
|
- `cursor_retur_document` (`PACK:4026`, `A.PRET_ACHIZITIE` direct din `VANZARI_DETALII`, folosit la
|
|
copiere).
|
|
|
|
### Ce se intampla in VFP cand lipseste
|
|
|
|
`crsfactura` (structura din `creeaza_facturacrs`, `ofacturare_comun.prg:1777`) are un camp
|
|
`pret_achizitie` in schema — dar o linie noua nu se construieste prin copiere in masa din
|
|
`crsarticole`, ci prin `Scatter`/`Gather` pe obiectul `poArticol`, populat cand utilizatorul alege un
|
|
articol din grid. `do_initializeaza_articol` (`ofacturare.vc2:13715-13719`), apelat pentru orice
|
|
linie care trece prin `frm_articol_factura` (ramura negestionabila, deci si orice linie de
|
|
proforma):
|
|
```
|
|
If Type('toArticol.pret_achizitie')="U"
|
|
AddProperty(toArticol,'pret_achizitie',0)
|
|
Endif
|
|
If Isnull(toArticol.pret_achizitie)
|
|
toArticol.pret_achizitie = 0
|
|
Endif
|
|
```
|
|
Deci: **pe calea principala (lista de preturi), `pret_achizitie` ramane `0`** pe liniile de proforma
|
|
— campul nici nu exista in `crsarticole` sursa (cursorul Oracle nu-l selecteaza), asa ca proprietatea
|
|
lipseste pe `poArticol` si `do_initializeaza_articol` o creeaza cu valoare implicita `0`, exact
|
|
acelasi tipar defensiv folosit pentru `id_gestiune=-1000` (aceeasi metoda, linii apropiate,
|
|
`:13618-13623` vs `:13715-13719`).
|
|
|
|
**Pe sursele care carata un document existent** (`cursor_avize`, si `cursor_retur_document` la
|
|
copiere), `pret_achizitie` **e** populat real din `VANZARI_DETALII.PRET_ACHIZITIE` a documentului
|
|
sursa, deci proprietatea exista pe `poArticol` si `do_initializeaza_articol` nu o suprascrie.
|
|
|
|
### Unde ajunge
|
|
|
|
Indiferent de valoare (`0` sau reala), `poArt.pret_achizitie` merge neschimbat catre Oracle ca
|
|
parametru pozitional in apelul catre `adauga_articol_factura`:
|
|
```
|
|
ofacturare.vc2:14073
|
|
... + Alltrim(Str(poArt.pret_achizitie,18,gnPPret)) + [,] + ...
|
|
```
|
|
primit ca `V_PRET_ACHIZITIE_TEMP` (`PACK:4995`), copiat direct `V_PRET_ACHIZITIE := V_PRET_ACHIZITIE_TEMP`
|
|
(`PACK:5031`, fara sentinela, spre deosebire de `id_gestiune`) si scris ca atare in
|
|
`VANZARI_DETALII_TEMP.PRET_ACHIZITIE` (`PACK:5229/5259`), apoi in `VANZARI_DETALII` la
|
|
`scrie_in_vanzari`.
|
|
|
|
**Concluzie Intrebarea 3**: pe calea principala (lista de preturi), `pret_achizitie` ramane `0` pe
|
|
liniile de proforma — nu vine din `do_alege_stoc` (care nu ruleaza) si nici din cursorul Oracle (care
|
|
nu-l selecteaza pe aceasta ramura). Pe sursele avize/copiere, valoarea reala din documentul sursa se
|
|
pastreaza.
|
|
|
|
---
|
|
|
|
## Intrebarea 4 — ce s-ar strica daca proforma ar pastra gestiunea reala pana la salvare?
|
|
|
|
### 4a. `adauga_articol_factura` se cheama si pentru liniile de proforma?
|
|
|
|
**Da, neconditionat.** `do_scrie_factura` (`ofacturare.vc2:14197+`) cheama
|
|
`Thisform.do_scrie_articole()` la linia **14264**, **inainte** de `Do Case poDate.eProforma = 1`
|
|
(care alege intre `scrie_proforma` si `scrie_factura2`, la `:14282`):
|
|
```
|
|
ofacturare.vc2:14264
|
|
llReturn = Thisform.do_scrie_articole() && se deschide tranzactie manuala
|
|
...
|
|
ofacturare.vc2:14282
|
|
Do Case
|
|
Case poDate.eProforma = 1
|
|
* scrie_proforma are aceiasi parametri ca scrie_factura2
|
|
* salveaza doar in vanzari, nu si in contabilitate
|
|
lcSql = [{call pack_facturare.scrie_proforma(...)}]
|
|
```
|
|
`do_scrie_articole` parcurge liniile din `crsfactura` si cheama `adauga_articol_factura` pentru
|
|
fiecare (`ofacturare.vc2:14069-14073`, deja citat in raportul-sursa) — **acelasi cod, indiferent de
|
|
`eProforma`**. Daca `poArt.id_gestiune` ar fi real (nu `-1000`), `adauga_articol_factura` l-ar
|
|
traduce direct in `V_ID_GESTIUNE2 := V_ID_GESTIUNE` (`PACK:5032-5034`, gate-ul `<> -1000`) si l-ar
|
|
scrie ca atare in `VANZARI_DETALII_TEMP.ID_GESTIUNE` (`PACK:5237,5267`), apoi in
|
|
`VANZARI_DETALII.ID_GESTIUNE` la `scrie_in_vanzari` (`INSERT INTO VANZARI_DETALII SELECT FROM
|
|
VANZARI_DETALII_TEMP`, fara nicio conditie suplimentara pe `id_gestiune`).
|
|
|
|
### 4b. Are efect ca linia sa ramana cu `ID_GESTIUNE` completat, cata vreme `scrie_proforma` nu cheama `contabilizeaza_articol`?
|
|
|
|
**Niciunul, pe partea de contabilizare/descarcare.** Confirmat deja (runda 12,
|
|
`s5b_proiectare_proforma_copiere.md`, sectiunea "Descoperire centrala"): `scrie_proforma`
|
|
(`PACK:5637-5671`) cheama **doar** `scrie_in_vanzari` — insereaza antetul si liniile ca atare, apoi
|
|
seteaza `VANZARI.EPROFORMA=1`. **Nu cheama** `contabilizeaza_articol` in niciun caz. Sentinela
|
|
`-1000` conteaza doar **in interiorul** lui `contabilizeaza_articol` (`PACK:7472-7476`), care nu
|
|
ruleaza deloc pentru `scrie_proforma`. Deci `ID_GESTIUNE` real pe o linie de proforma nu ar declansa
|
|
`descarca_gestiune`, nu ar genera `NOTE_CONTABILE`, nu ar atinge `RUL`/`STOC` — pentru ca intreaga
|
|
functie care ar face asta nu se executa pe traseul `scrie_proforma`.
|
|
|
|
### 4c. Rapoarte/view-uri care citesc `ID_GESTIUNE` pe documente `eProforma=1` si ar arata altceva?
|
|
|
|
Cautare `eproforma` (case-insensitive) in tot `PACK_FACTURARE`: doar 3 potriviri, toate in
|
|
`scrie_proforma`/comentarii (`PACK:1408, 5666, 5668`) — nicio alta procedura/vedere din pachet nu
|
|
filtreaza sau calculeaza dupa `EPROFORMA`.
|
|
|
|
Pe partea VFP, `crsDetaliiListare` (folosit la **relistarea** unui document deja emis, inclusiv
|
|
proforma — `oproceduri_facturare.prg:1111-1126`, sursa `fact_vfacturi2`) **include** coloana
|
|
`id_gestiune` in schema si in `SELECT`, indiferent de `eproforma` (nu exista filtru pe
|
|
`eproforma` in acest `SELECT`). Deci daca `ID_GESTIUNE` ar fi real pe o proforma, acest cursor l-ar
|
|
citi ca atare la relistare — azi citeste `NULL`. **Nu am putut confirma daca vreun raport `.frx`
|
|
tiparit efectiv afiseaza `id_gestiune`/`nume_gestiune` pe documentul proforma insusi**
|
|
(rapoartele `PROFORMA`/`PROFORMA_VAL` nu au versiune text `.fr2` generata in `Rapoarte\`, deci nu
|
|
s-au putut grep-ui direct) — de regula gestiunea e un camp intern, nu unul tiparit pe un document
|
|
comercial, dar afirmatia ramane neconfirmata pe cod, nu doar presupusa corecta. Vezi "Ce nu s-a
|
|
putut stabili".
|
|
|
|
### 4d. `do_alege_stoc` rezerva stoc sau doar alege?
|
|
|
|
**Doar alege — nu scrie nimic in Oracle.** Corpul complet al `do_alege_stoc`
|
|
(`ofacturare.vc2:13200-13400+`) face exclusiv: (1) un `SELECT` prin
|
|
`cursor_gestiuni_articol`/`cursor_gestiuni_articol_retur`/`cursor_gestiuni_articol_stoc0` (toate
|
|
proceduri read-only, populeaza un cursor local `crsgestarticoltemp`), (2) o scadere **locala, in
|
|
memorie**, a cantitatilor deja adaugate pe **acelasi document, in aceeasi sesiune**
|
|
(`ofacturare.vc2:13273-13311`: `SELECT ... FROM crsfactura ... INTO CURSOR crsFacturaArticoleTemp`,
|
|
apoi `a.cantitate - Nvl(b.cantitate,0)` la afisare), ca sa nu i se ofere operatorului sa aleaga de
|
|
doua ori acelasi lot pe acelasi document. **Nu exista niciun `INSERT`/`UPDATE` catre Oracle in
|
|
aceasta metoda** — `goExecutor.oExecute` apare o singura data, pentru `SELECT`-ul de la pasul (1).
|
|
Blocarea/decrementarea reala a stocului se intampla abia la `descarca_gestiune`
|
|
(`PACK:7648-7797`), apelata doar din `contabilizeaza_articol`, care (per 4b) nu ruleaza niciodata
|
|
pentru `scrie_proforma`. **Deci chiar daca `do_alege_stoc` ar rula pe liniile unei proforme, nu ar
|
|
"tine" stoc blocat pentru nimeni** — nu exista mecanism de rezervare reala in aplicatie pe acest
|
|
traseu, doar o verificare locala de neduplicare in sesiunea curenta.
|
|
|
|
**Concluzie Intrebarea 4**: nimic din contabilizare, descarcare de gestiune sau stoc real nu s-ar
|
|
strica daca proforma ar pastra `id_gestiune` real pana la salvare — blocajul functional e la nivelul
|
|
routing-ului `scrie_proforma` (care nu cheama `contabilizeaza_articol`), nu la nivelul sentinelei
|
|
`-1000`. Singurul loc unde s-ar vedea o diferenta reala e la **relistarea** documentului
|
|
(`crsDetaliiListare`/`fact_vfacturi2`), unde `id_gestiune` ar aparea completat in loc de `NULL` —
|
|
efect cosmetic/informational, nu unul care sa afecteze stocul sau contabilitatea, cu rezerva ca nu
|
|
s-a confirmat daca vreun `.frx` chiar il tipareste. Riscul real ramas e cel deja identificat in
|
|
`s5b_proiectare_proforma_copiere.md` §5 (drumul invers, proforma comutata inapoi in factura in
|
|
aceeasi sesiune, inainte de Termina) — acela nu se schimba, indiferent de aceasta decizie, pentru ca
|
|
depinde de routing-ul de la Termina, nu de momentul in care se alege gestiunea.
|
|
|
|
---
|
|
|
|
## Ce nu s-a putut stabili
|
|
|
|
1. **Daca vreun raport `.frx` tiparit (PROFORMA/PROFORMA_VAL) afiseaza efectiv `id_gestiune` sau
|
|
`nume_gestiune` pe documentul insusi** — rapoartele nu au versiune text `.fr2` generata in
|
|
`Rapoarte\`, asa ca nu s-a putut grep pe continutul lor; ar necesita fie generarea textului cu
|
|
`git_sync.ps1`/`foxbin2prg` (in afara mandatului read-only), fie deschidere in IDE VFP.
|
|
2. **Nu s-a rulat nimic pe date vii** — toata analiza e trasare de cod static (VFP text + PL/SQL
|
|
text), conform mandatului read-only.
|
|
3. **Cautarea "eproforma" in Oracle** a acoperit doar `PACK_FACTURARE` — nu s-au verificat alte
|
|
pachete/view-uri/rapoarte Oracle care ar putea referi `VANZARI.EPROFORMA` impreuna cu
|
|
`ID_GESTIUNE` (de exemplu rapoarte de gestiune/stoc din alte module ROA). Zero rezultate in
|
|
`PACK_FACTURARE` nu e dovada de completitudine pentru intreaga schema.
|
|
4. **`cursor_retur`** (`PACK:3934-3948`, folosit pentru `tnTip` 8,9,24 — retururi) nu a fost citit
|
|
integral pentru coloana `GESTIONABIL` (tabelul de la Intrebarea 1 il listeaza fara valoare
|
|
confirmata) — nu are parametru `V_PROFORMA` (confirmat prin grep), deci concluzia generala
|
|
(marcarea vine doar din VFP) ramane valabila, dar valoarea exacta intoarsa de coloana nu a fost
|
|
verificata linie-cu-linie.
|
|
|
|
---
|
|
|
|
## Handoff
|
|
|
|
Cercetare incheiata intr-o singura sesiune, fara sa fie nevoie de predare de context. Toate cele 4
|
|
intrebari din brief au raspuns cu dovada `fisier:linie`, plus rezumatul executiv de mai sus. Niciun
|
|
fisier de cod atins, niciun `git_sync.ps1`/`txt2vcx.ps1` rulat, niciun commit, nicio scriere pe
|
|
Oracle.
|