150 lines
5.2 KiB
Markdown
150 lines
5.2 KiB
Markdown
# PACK_SERII_NUMERE — Verificare live + unblock serii tipDoc=20
|
|
|
|
**Data verificare**: 2026-04-14
|
|
**Executat de**: teammate `pack-serii-verifier` (task #4, branch `feat/service-auto`)
|
|
**Mediu**: Oracle `10.0.20.121:1521/ROA`, schema `MARIUSM_AUTO`, user `ROA_WEB`
|
|
|
|
---
|
|
|
|
## 1. AUTHID — DEFINER ✅ **verificat live**
|
|
|
|
```sql
|
|
SELECT OBJECT_NAME, PROCEDURE_NAME, AUTHID
|
|
FROM ALL_PROCEDURES
|
|
WHERE OWNER = 'MARIUSM_AUTO'
|
|
AND OBJECT_NAME = 'PACK_SERII_NUMERE';
|
|
```
|
|
|
|
Rezultat:
|
|
|
|
| OBJECT_NAME | PROCEDURE_NAME | AUTHID |
|
|
|---|---|---|
|
|
| `PACK_SERII_NUMERE` | *(null, package-level)* | **`DEFINER`** |
|
|
|
|
**Concluzie**: HANDOFF-ul era corect. Pachetul rulează cu privilegiile owner-ului
|
|
(`MARIUSM_AUTO`), deci `GRANT EXECUTE` pentru `ROA_WEB` este suficient.
|
|
Nu sunt necesare granturi suplimentare pe `SERII` / `PLAJE_NUMERE` / `SERII_NUMERE`.
|
|
|
|
Status obiect: `VALID`, created `2025-09-30`, last DDL `2026-04-13 19:11`.
|
|
|
|
---
|
|
|
|
## 2. DDL export
|
|
|
|
`DBMS_METADATA.GET_DDL('PACKAGE', …)` → **ORA-31603**: ROA_WEB nu are
|
|
`SELECT_CATALOG_ROLE`. Fallback la `ALL_SOURCE` a reușit pentru **PACKAGE SPEC**
|
|
(12 825 caractere) dar nu și pentru **PACKAGE BODY** (0 caractere — ROA_WEB
|
|
nu are SELECT pe source-ul body-ului).
|
|
|
|
- Spec salvat: [`PACK_SERII_NUMERE.pck`](./PACK_SERII_NUMERE.pck)
|
|
- Body-ul va trebui exportat manual de DBA (ex: de pe cont `MARIUSM_AUTO`)
|
|
dacă e nevoie pentru audit complet.
|
|
|
|
### Tabele referite în spec (nume reale)
|
|
|
|
Contrar denumirilor din HANDOFF (`SER_SERII`/`SER_PLAJE`), tabelele efective sunt:
|
|
|
|
| Referit în spec ca | Rol |
|
|
|---|---|
|
|
| `SERII` | Master pentru serii (PREFIX, AN2CARACTERE, ISAUTOFACTURA, ISBENEFICIARI, ISTERTI, ISFURNIZORI) |
|
|
| `PLAJE_NUMERE` | Plaje numere (ID_TIPDOC, ID_TIPENTITATE, ID_ENTITATE, ID_SERIE, ID_SUCURSALA, PL_INF, PL_SUP, DATAI, DATAS, INACTIV) |
|
|
| `SERII_NUMERE` | Numere alocate (ID_NUMAR, NUMAR) — destinația lui `aloca_numar` |
|
|
|
|
---
|
|
|
|
## 3. TIP_DOC=20 — valid, dar **fără configurare**
|
|
|
|
Testarea indirectă, prin pachet (ROA_WEB nu are SELECT pe tabele, dar poate apela
|
|
procedurile pachetului via EXECUTE + DEFINER):
|
|
|
|
```
|
|
PACK_SERII_NUMERE.verifica_tipdoc(V_ID_TIPDOC=20, V_REZULTAT OUT) → 0 (OK)
|
|
```
|
|
|
|
→ TIP_DOC=20 este **acceptat** de pachet (deși nu apare ca named constant
|
|
`nTip…` în spec — există o „gaură" între `nTipNrDispPlata := 19` și
|
|
`nTipNrOrdinPlata := 21`, dar array-urile interne `tabela_tipdoc` /
|
|
`tabela_numere` au 26 elemente, deci indicele 20 e legal).
|
|
|
|
```
|
|
PACK_SERII_NUMERE.verifica_cursor_serii(V_ID_TIPDOC=20, V_ID_UTIL=1, V_ID_SUCURSALA=0, …)
|
|
→ ORA-20000: Nu exista plaje de serii comenzi auto pentru aceste configurari!
|
|
at PACK_SERII_NUMERE line 1071
|
|
```
|
|
|
|
**Aceasta este exact eroarea care blochează happy-path `POST /api/service-auto/comenzi`**
|
|
(mapată la HTTP 422 „Nu s-au configurat valori…"). Cauza: nu există niciun rând în
|
|
`SERII` + `PLAJE_NUMERE` pentru TIP_DOC=20 care să matchuiască user-ul 1.
|
|
|
|
---
|
|
|
|
## 4. Granturi efective ROA_WEB (live)
|
|
|
|
```sql
|
|
SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS
|
|
WHERE GRANTEE='ROA_WEB' AND OWNER='MARIUSM_AUTO';
|
|
```
|
|
|
|
| TABLE_NAME | PRIVILEGE |
|
|
|---|---|
|
|
| `AUTO_VMASINICLIENTI` | SELECT |
|
|
| `CALENDAR` | SELECT |
|
|
| `DEV_NOM_ASIGURATORI` | SELECT |
|
|
| `DEV_NOM_INSPECTORI` | SELECT |
|
|
| `DEV_NOM_NORME` | SELECT |
|
|
| `DEV_ORDL` | SELECT |
|
|
| `DEV_TIP_DEVIZ` | SELECT |
|
|
| `NOM_LUCRARI` | SELECT |
|
|
| `NOM_PARTENERI` | SELECT, INSERT |
|
|
| `PACK_AUTO` | EXECUTE |
|
|
| `PACK_SERII_NUMERE` | EXECUTE |
|
|
| `SP_CREEAZA_COMANDA_PROTOTIP` | EXECUTE |
|
|
|
|
Granturile sunt **aliniate** cu `docs/service-auto/onboarding_roa_web.sql`.
|
|
`SERII` / `PLAJE_NUMERE` / `SERII_NUMERE` NU sunt în listă — nici nu trebuie să fie,
|
|
deoarece pachetul e DEFINER.
|
|
|
|
---
|
|
|
|
## 5. Unblock plan — 3 pași
|
|
|
|
### Pasul 1 — DBA (MARIUSM_AUTO sau DBA) rulează migrația
|
|
|
|
Fișierul [`migrations/ff_2026_04_14_01_AUTO.sql`](./migrations/ff_2026_04_14_01_AUTO.sql)
|
|
conține un template cu placeholders pentru:
|
|
|
|
- nume serie (ex. `DEV01`)
|
|
- lungime numerică (ex. `6` → numere 1..999999)
|
|
- user/grup alocat (`<V_ID_UTIL>` — tipic admin MARIUSM_AUTO; pachetul îl
|
|
transformă intern în grup via `IdUtil2IdGrupUtil`)
|
|
- plaja `PL_INF`/`PL_SUP` (ex. 1..999999)
|
|
- sucursală (`0` pentru toate sucursalele sau ID specific)
|
|
|
|
Migrația folosește **procedurile publice ale pachetului** (`adauga_serie` +
|
|
`adauga_plaja`) pentru a respecta validările interne — NU face INSERT direct
|
|
în `SERII` / `PLAJE_NUMERE`. DBA-ul trebuie doar să înlocuiască placeholders
|
|
și să ruleze.
|
|
|
|
### Pasul 2 — Verificare de regresie (re-rulare probe)
|
|
|
|
După configurare, DBA sau teammate QA poate re-rula scriptul de probe și să
|
|
confirme că:
|
|
|
|
```
|
|
PACK_SERII_NUMERE.verifica_cursor_serii(20, 1, 0, …) → rezultat=0 (fără ORA-20000)
|
|
```
|
|
|
|
### Pasul 3 — Smoke test happy-path
|
|
|
|
- `POST /api/service-auto/comenzi` cu payload valid (masina+tip deviz) pe
|
|
tenant `mariusm_test`, user `MARIUS M`/pass `123`, firma `MARIUSM AUTO`
|
|
- Așteptat: HTTP 200 + `pc_nr` generat (prefix + număr + `/` + nr. înmatriculare)
|
|
|
|
---
|
|
|
|
## 6. Decizie pe AUTHID-related grants
|
|
|
|
**NU este necesar** niciun grant suplimentar pe `SERII`/`PLAJE_NUMERE`/`SERII_NUMERE`.
|
|
DEFINER rights sunt suficiente. Dacă pe viitor observăm ORA-01031 la apel pachet,
|
|
atunci revedem (dar acum happy-path dă 422 nu 500, deci privilege ≠ cauza).
|