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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user