docs(service-auto): ground truth audit v3 from MARIUSM_AUTO production

Add real production sources as authoritative reference (supersedes
vfp_roaauto/Scripturi_instalare/packages.sql which is for a different
product — devize producție, not service auto):

- mariusm_ddl_export.sql: 5127 lines DDL from DBMS_METADATA (tables,
  views, triggers) of MARIUSM_AUTO schema
- pack_auto.pck: main business package (17 procedures)
- PACK_FACTURARE.pck, PACK_SESIUNE.pck, PACK_CONTAFIN.pck,
  PACK_COMENZI.pck: dependency packages
- export_ddl.sql: SQL export helper using DBMS_METADATA + DBMS_OUTPUT
  with discovery via ALL_OBJECTS LIKE patterns

Rewrite tabele-service-auto.md v3 (~600 lines) fully grounded in
production sources. Map all flows end-to-end:

- Create (pack_auto.dev_adauga_lucrare) → NOM_LUCRARI + DEV_ORDL
- Normare (dev_adauga_operatie) → DEV_OPER + DEV_OPER_MECANICI
- Validate ops (dev_valideaza_operatii) → DEV_OPER.VALIDAT
- Validate order (dev_valideaza_comanda) → DEV_ORDL.VALIDAT + CALENDAR
- Archive (dev_arhiveaza_comanda) → DEV_ORDL.INCHIS_FORTAT
- Bonuri consum: generic ROA (ointroduceri.prg tip=3) → RUL.id_lucrare
- Facturare: pack_facturare.* + pack_auto.actualizeaza_deviz

Key business semantics confirmed by Marius 2026-04-11:

- DEV_TIP_DEVIZ.inch_validare = 1 means validation alone closes the
  order (no closing note). inch_validare = 0 means additional closing
  required (via invoice for billable types, or 711=332 journal entry
  for internal types). View AUTO_LISTARE_MAN_TOT_COM has the exact
  "closed" condition as (validat=1 AND inch_validare=1) OR
  (facturat=1 AND inch_validare=0).
- Live DEV_TIP_DEVIZ values: 1=POST GARANTIE, 2=GARANTIE, 3=REGIE,
  4=PREGATIRE, 5=REGIE 2, 6=PRODUCTIE, 7=CONSTATARE. REGIE/PRODUCTIE/
  CONSTATARE have inch_validare=1 (internal, closed at validation).
- DEV_OPER for service auto contains only manopera (id_norme). The
  id_articol/id_rul_aux columns exist in DDL for another product that
  shares the table but are not populated by pack_auto.
- Real materials consumed on an order live in RUL tagged by id_lucrare,
  not in DEV_OPER. DEV_ESTIMARI_REP is a separate pre-sale estimate
  (both manopera and materiale lines) given to the client, independent
  of the real manopera (DEV_OPER) and real materials (RUL).

Plan Correction 13 (claude-main-design-20260411-rethink.md):

- Invalidate Scripturi_instalare references
- Confirm NOM_LUCRARI ← DEV_ORDL inheritance pattern
- Confirm pack_sesiune.dev_idLucrare/dev_idOrdl populated by triggers
- Refine prototype SP (Option 3) template based on real schema
- Timeline unchanged, scope wall reconfirmed

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Claude Agent
2026-04-11 16:03:20 +00:00
parent 6aceb85bf1
commit 43484db45e
9 changed files with 38142 additions and 458 deletions

View File

@@ -294,6 +294,91 @@ template + decision-log. Ce se schimbă: **țintim o tabelă reală (`dev_ordl`)
real (`dev_tip_deviz`), și documentăm un path clar spre reuse-ul pachet-urilor legacy pentru
phase 2**. Hedge-ul devine mai credibil, nu mai slab.
### Correction 13 — Ground truth complet din MARIUSM_AUTO (2026-04-11 later)
**Ce s-a schimbat:** Marius a furnizat versiunile reale din producție:
- `docs/service-auto/mariusm_ddl_export.sql` (5127 linii DDL: tabele + views + triggere)
- `docs/service-auto/pack_auto.pck`, `PACK_FACTURARE.pck`, `PACK_SESIUNE.pck`,
`PACK_CONTAFIN.pck`, `PACK_COMENZI.pck` — body-urile reale
**Ce s-a invalidat:**
- **`vfp_roaauto/Scripturi_instalare/packages.sql` = alt produs** ("devize producție"), NU
service auto. Toate referințele v2 la `pack_devize.dev_adauga_lucrare` erau la un pachet
care nu există în MARIUSM_AUTO.
- **`VCOMENZI` din MARIUSM_AUTO nu e pentru service auto** — e pentru ROA ERP base
(vânzări/contracte generice), cu coloane `id_codclient`/`interna`/`id_masina` care
nu aparțin flux-ului auto.
- **`dev_distribuie_timp_n`** are semnătură nouă: `(v_luna, v_an)` nu `(v_gcs, v_filtru)`.
**Ce s-a reconfirmat ca fiind corect:**
- Pattern-ul de inheritance `NOM_LUCRARI` (parent) + `DEV_ORDL` (child, FK `id_lucrare`)
- `TRG_NOM_LUCRARI_BEFOINS` populează `pack_sesiune.dev_idLucrare` din `SEQ_NOM_LUCRARI.NEXTVAL`
- `TRG_DEV_ORDL_BEFOINS` populează `pack_sesiune.dev_idOrdl` din `SEQ_DEV_ORDL.NEXTVAL`
- Bypass `pack_sesiune` prin `RETURNING id_lucrare INTO v_local` e **trivial și safe**
(trigger-ul rulează oricum, noi îl ignorăm)
**Descoperiri NOI critice:**
1. **`DEV_ORDL` are 37 coloane în producție** (nu 28-30 cum estima v2), cu
`PROC_TVAV`, `SOLICITARI_CLIENT CLOB`, `OBSERVATII`, `DEFECTIUNI`, `NR_DOSAR`,
`ID_PART` (FK la NOM_PARTENERI — client direct, nu doar prin mașină), `ID_AGENT`,
`ID_PART_REF`, `ORE_FUNCTIONARE`, `IN_LUCRU`, `COADA_DEVIZ`, `ID_UTIL_INCHIS`,
`DATAORAINCHIS`, `DATA_IN_LUCRU`, `DATAORAINLUCRU`, `FACTUREZMIX`, `DATA_CURS`,
`ID_VALUTA_DEVIZ`, `INCHIS_FORTAT`. FK constraints ENABLE:
`FK_DEV_ORDL_001..006` pe `DEV_NOM_INSPECTORI`, `NOM_LUCRARI`, `NOM_PARTENERI` ×3,
`NOM_VALUTE`.
2. **`DEV_OPER` e polimorfic**: poate fi **manoperă** (`id_norme` non-NULL) SAU **linie
material** (`id_articol` non-NULL + `id_rul_aux` FK la mișcarea de stoc). Materialele
pe comandă nu au tabela `DEV_MAT` separată — sunt linii în `DEV_OPER` cu tip diferit.
3. **`DEV_ESTIMARI_REP`** e tabelă nouă (pre-sale estimate) — linii cu `id_lucrare` FK,
fiecare linie e fie manoperă fie material. `pack_auto.adauga_manopera_de` /
`adauga_material_de` scriu aici. View `AUTO_VESTIMARI_REP` cu `pack_sesiune.calculeaza_*`
pentru prețuri. **Out of scope** pentru prototype.
4. **`DEV_TIP_DEVIZ.INCH_VALIDARE`** (NUMBER(1) default 1) e flag-ul care decide între
**închidere prin validare** (`dev_valideaza_comanda`) sau **închidere prin arhivare**
(`dev_arhiveaza_comanda`). Citit prin `pack_auto.getOptiuneInchidere(id_tip)`.
5. **`actualizeaza_deviz` (pack_auto)** e procedura care replace-uiește vechiul
`dev_completeaza_rul`. Face 3 UPDATE-uri într-o tranzacție: `DEV_ORDL.PROC_TVAV`,
`RUL.ID_FACT` (pentru toate materialele consumate), și — condiționat de `id_set` în
(31003-31011) — `NOM_LUCRARI.ID_FACT`.
6. **Bonuri consum = flux generic ROA, nu `pack_auto`**`ointroduceri.prg tip=3` scrie
direct în `RUL` + `RUL_AUXILIAR` cu `ID_LUCRARE` tag. `DEV_OPER` capturează liniile
prin `id_rul_aux` FK. **Out of scope.**
7. **View-urile UI**: `AUTO_NORMARE_COMENZI`, `AUTO_VALIDARE_COMENZI`, `AUTO_ORDL_FACTURARE`,
`AUTO_COMENZI_VALIDATE` (cu time-aware validat flag prin `pack_sesiune.getluna()`),
`AUTO_VORDL_MAN`, `AUTO_VORDL_MAT` (citește din `MV_ORDL_MAT` materialized view),
`AUTO_VESTIMARI_REP`.
8. **`pack_audit.verifica_val`** — trigger-ele `_BEFOUPD` pe `NOM_LUCRARI`, `DEV_ORDL`,
`DEV_OPER`, `DEV_OPER_MECANICI` apelează această procedură pentru fiecare câmp modificat
→ audit trail automat pentru TOATE UPDATE-urile. Triggerele `_BEFOINS` **nu** apelează
pack_audit — deci prototype-ul care doar inserează **nu atinge pack_audit**.
**Audit complet:** `docs/service-auto/tabele-service-auto.md` a fost rescris complet
(v3, ~500 linii) cu referințe directe la DDL + pack_auto + pack_facturare real. Conține:
- Diagrama ierarhiei `NOM_LUCRARI → DEV_ORDL → DEV_OPER → DEV_OPER_MECANICI`
- Schema reală `DEV_ORDL` (37 coloane) + `DEV_OPER` (polimorfic) + `DEV_ESTIMARI_REP`
- Map procedure → tabele pentru întreg `pack_auto` (17 proceduri/funcții)
- Flux VFP real pentru create, normare, validare operații, validare comandă, arhivare,
facturare (cu referințe la `pack_facturare.initializeaza_date_factura`,
`adauga_articol_factura_deviz`, `scrie_in_vanzari`)
- List complete de view-uri UI cu rolul fiecăruia
- SP minimal propus pentru prototype (Opțiunea 3, rafinată) — 30 linii PL/SQL, zero
dependențe pe `pack_contafin`/`STRINGAGG`/`pack_sesiune`, doar două INSERT-uri cu
RETURNING și un duplicate-check
**Scope wall reconfirmat**: prototype-ul rămâne la **creare comandă simplă**. Normare,
validare operații, validare comandă, arhivare, facturare, bonuri consum, estimare =
**phase 2+**. Fluxul complet e documentat ca referință viitoare, nu ca commitment.
**Impact asupra timeline:** **zero** — task-urile săpt 1-24 rămân identice, doar că săpt 7-8
("scrie SP_CREEAZA_COMANDA") are acum templatul PL/SQL exact definitivat în tabele-service-auto.md
§12.2, gata de copy-paste + commit.
**Impact asupra ipotezelor:** niciuna invalidată. Ipoteza #1 rămâne centrală — probă că
Python+oracledb apelează PL/SQL cu OUT params pe un INSERT dual cu RETURNING. Ipoteza #2
(`session_callback`) rămâne independentă. Ipoteza #3 (grants) este și mai **ușor de probat**
acum că știm exact cele două tabele atinse (`NOM_LUCRARI`, `DEV_ORDL`) și putem scrie
testul negativ cu nume fixe.
### Correction 4 — `connection.commit()` e explicit în pattern
**Prima versiune** nu menționa commit. **Realitate:** `oracledb` driver are autocommit OFF