Files
roa2web-service-auto/docs/service-auto/export_ddl.sql
Claude Agent 43484db45e 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>
2026-06-05 09:37:09 +00:00

403 lines
14 KiB
SQL

-- =============================================================================
-- Export DDL + date din MARIUSM_AUTO pentru audit service-auto
-- =============================================================================
-- Utilizare:
-- 1. Deschide SQL Developer (sau sqlplus) conectat ca MARIUSM_AUTO
-- (sau orice user cu SELECT_CATALOG_ROLE)
-- 2. Rulează tot scriptul (F5 în SQL Developer)
-- 3. Output-ul apare în panoul "Script Output" — selectează tot, copiază,
-- trimite la Claude (sau salvează în fișier)
--
-- Output-ul conține:
-- - DDL pentru tabele DEV_*, NOM_LUCRARI, RUL, ACT, VANZARI
-- - DDL pentru pachete PACK_AUTO, PACK_FACTURARE, PACK_SESIUNE, PACK_CONTAFIN
-- - DDL pentru triggere TRG_DEV_*, TRG_NOM_LUCRARI_*
-- - DDL pentru views AUTO_*, DEV_V*, DEV_COMENZI_VALIDATE
-- - Conținutul enum DEV_TIP_DEVIZ (live)
-- - Coloanele live din DEV_ORDL, DEV_MASINICLIENTI, DEV_ESTIMARI_REP
--
-- Alternativ pentru sqlplus cu spool în fișier:
-- sqlplus MARIUSM_AUTO/parola@10.0.20.121:1521/ROA @export_ddl.sql
-- → fișierul `mariusm_ddl_export.log` e generat în directorul curent
-- =============================================================================
SET SERVEROUTPUT ON SIZE UNLIMITED
SET LINESIZE 32767
SET LONG 100000000
SET LONGCHUNKSIZE 32767
SET PAGESIZE 0
SET FEEDBACK OFF
SET VERIFY OFF
SET HEADING OFF
SET TRIMSPOOL ON
SET TRIMOUT ON
SET WRAP OFF
-- Spool DOAR dacă rulezi din sqlplus. SQL Developer ignoră această linie dacă
-- nu folosește `@script`. În SQL Developer pur, rezultatul apare în "Script Output".
SPOOL mariusm_ddl_export.log
-- Schema țintă — modifică dacă testezi pe alt user
DEFINE schema_name = 'MARIUSM_AUTO'
-- =============================================================================
-- Config DBMS_METADATA pentru DDL curat (fără storage/segment noise)
-- =============================================================================
BEGIN
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'STORAGE', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SEGMENT_ATTRIBUTES', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'TABLESPACE', FALSE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'PRETTY', TRUE);
DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
END;
/
PROMPT
PROMPT =============================================================================
PROMPT == MARIUSM_AUTO DDL EXPORT start
PROMPT == Data rulare: &_DATE
PROMPT =============================================================================
PROMPT
-- =============================================================================
-- BLOCUL MARE: tot exportul rulează într-un PL/SQL anonim care folosește
-- DBMS_OUTPUT.PUT_LINE ca să scrie totul în ordinea dorită.
-- Marca de secțiune e `-- === SECTION: <nume> ===` ca să o putem parsa ulterior.
-- =============================================================================
DECLARE
v_schema VARCHAR2(30) := '&schema_name';
v_ddl CLOB;
v_offset NUMBER;
v_chunk_size NUMBER := 30000;
v_length NUMBER;
-- Liste de obiecte de exportat — pattern-urile sunt SQL LIKE cu ESCAPE '\'
TYPE t_patterns IS TABLE OF VARCHAR2(100);
-- Tabele relevante
v_table_patterns t_patterns := t_patterns(
'DEV\_%', -- toate DEV_* (ordl, oper, nom_norme, tip_deviz, estimari_rep, masiniclienti, ...)
'NOM\_LUCRARI',
'NOM\_ARTICOLE',
'RUL',
'ACT',
'VANZARI',
'CONTRACTE',
'CTR\_ARTICOLE',
'CALENDAR',
'NOM\_PARTENERI',
'PARTENERI'
);
-- Views relevante
v_view_patterns t_patterns := t_patterns(
'AUTO\_%', -- AUTO_NORMARE_COMENZI, AUTO_ORDL_FACTURARE, AUTO_VNORME
'DEV\_V%', -- DEV_VORDL, DEV_VOPER, DEV_VVALID_COMENZI
'DEV\_COMENZI\_VALIDATE',
'VCOMENZI',
'VNOM\_%'
);
-- Triggere relevante
v_trigger_patterns t_patterns := t_patterns(
'TRG\_DEV\_%',
'TRG\_NOM\_LUCRARI\_%'
);
-- Pachete — listă explicită (DBMS_METADATA cere nume exact pentru PACKAGE)
TYPE t_packages IS TABLE OF VARCHAR2(30);
v_packages t_packages := t_packages(
'PACK_AUTO',
'PACK_FACTURARE',
'PACK_SESIUNE',
'PACK_CONTAFIN',
'PACK_COMENZI',
'PACK_TYPES'
);
-- =====================================================
-- Helper: print CLOB în chunk-uri (DBMS_OUTPUT limit = 32767/linie)
-- =====================================================
PROCEDURE print_clob(p_clob IN CLOB) IS
v_pos NUMBER := 1;
v_line VARCHAR2(32767);
v_nl NUMBER;
BEGIN
IF p_clob IS NULL THEN RETURN; END IF;
WHILE v_pos <= DBMS_LOB.GETLENGTH(p_clob) LOOP
v_nl := DBMS_LOB.INSTR(p_clob, CHR(10), v_pos);
IF v_nl = 0 OR v_nl - v_pos > 32000 THEN
v_line := DBMS_LOB.SUBSTR(p_clob, LEAST(32000, DBMS_LOB.GETLENGTH(p_clob) - v_pos + 1), v_pos);
DBMS_OUTPUT.PUT_LINE(v_line);
v_pos := v_pos + LENGTH(v_line);
ELSE
v_line := DBMS_LOB.SUBSTR(p_clob, v_nl - v_pos, v_pos);
DBMS_OUTPUT.PUT_LINE(v_line);
v_pos := v_nl + 1;
END IF;
END LOOP;
END;
-- =====================================================
-- Helper: export un grup de obiecte descoperite prin LIKE pe ALL_OBJECTS
-- =====================================================
PROCEDURE export_group(
p_object_type IN VARCHAR2,
p_patterns IN t_patterns,
p_section IN VARCHAR2
) IS
v_where_clause VARCHAR2(4000);
v_sql VARCHAR2(4000);
TYPE t_names IS TABLE OF VARCHAR2(128);
v_names t_names;
BEGIN
DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('-- ============================================================');
DBMS_OUTPUT.PUT_LINE('-- === SECTION: ' || p_section || ' ===');
DBMS_OUTPUT.PUT_LINE('-- ============================================================');
-- Build WHERE clause din pattern-uri
v_where_clause := '';
FOR i IN 1 .. p_patterns.COUNT LOOP
IF i > 1 THEN v_where_clause := v_where_clause || ' OR '; END IF;
v_where_clause := v_where_clause ||
'object_name LIKE ''' || p_patterns(i) || ''' ESCAPE ''\''';
END LOOP;
v_sql := 'SELECT object_name FROM all_objects ' ||
'WHERE owner = :1 AND object_type = :2 AND (' || v_where_clause || ') ' ||
'ORDER BY object_name';
EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_names USING v_schema, p_object_type;
DBMS_OUTPUT.PUT_LINE('-- Găsite: ' || v_names.COUNT || ' obiecte');
DBMS_OUTPUT.PUT_LINE('');
FOR i IN 1 .. v_names.COUNT LOOP
BEGIN
DBMS_OUTPUT.PUT_LINE('-- --- ' || p_object_type || ': ' || v_names(i) || ' ---');
v_ddl := DBMS_METADATA.GET_DDL(p_object_type, v_names(i), v_schema);
print_clob(v_ddl);
DBMS_OUTPUT.PUT_LINE('');
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('-- ERROR la ' || v_names(i) || ': ' || SQLERRM);
END;
END LOOP;
END;
-- =====================================================
-- Helper: export pachet (spec + body separate)
-- =====================================================
PROCEDURE export_package(p_name IN VARCHAR2) IS
v_exists NUMBER;
BEGIN
SELECT COUNT(*) INTO v_exists
FROM all_objects
WHERE owner = v_schema
AND object_name = p_name
AND object_type IN ('PACKAGE', 'PACKAGE BODY');
IF v_exists = 0 THEN
DBMS_OUTPUT.PUT_LINE('-- SKIP ' || p_name || ' — nu există în ' || v_schema);
RETURN;
END IF;
DBMS_OUTPUT.PUT_LINE('-- --- PACKAGE SPEC: ' || p_name || ' ---');
BEGIN
v_ddl := DBMS_METADATA.GET_DDL('PACKAGE_SPEC', p_name, v_schema);
print_clob(v_ddl);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('-- ERROR spec: ' || SQLERRM);
END;
DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('-- --- PACKAGE BODY: ' || p_name || ' ---');
BEGIN
v_ddl := DBMS_METADATA.GET_DDL('PACKAGE_BODY', p_name, v_schema);
print_clob(v_ddl);
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('-- ERROR body: ' || SQLERRM);
END;
DBMS_OUTPUT.PUT_LINE('');
END;
BEGIN
-- =====================================================
-- 1. TABELE
-- =====================================================
export_group('TABLE', v_table_patterns, 'TABLES');
-- =====================================================
-- 2. VIEWS
-- =====================================================
export_group('VIEW', v_view_patterns, 'VIEWS');
-- =====================================================
-- 3. TRIGGERE
-- =====================================================
export_group('TRIGGER', v_trigger_patterns, 'TRIGGERS');
-- =====================================================
-- 4. PACHETE (spec + body)
-- =====================================================
DBMS_OUTPUT.PUT_LINE('');
DBMS_OUTPUT.PUT_LINE('-- ============================================================');
DBMS_OUTPUT.PUT_LINE('-- === SECTION: PACKAGES ===');
DBMS_OUTPUT.PUT_LINE('-- ============================================================');
DBMS_OUTPUT.PUT_LINE('');
FOR i IN 1 .. v_packages.COUNT LOOP
export_package(v_packages(i));
END LOOP;
END;
/
-- =============================================================================
-- SECTION: DATA SAMPLES & COLUMN METADATA
-- =============================================================================
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: DATA - DEV_TIP_DEVIZ (enum live) ===
PROMPT -- ============================================================
PROMPT
SET HEADING ON
SET PAGESIZE 1000
SET FEEDBACK ON
COLUMN id_tip FORMAT 999
COLUMN denumire FORMAT A40
COLUMN sters FORMAT 9
COLUMN inch_validare FORMAT 9
SELECT id_tip, denumire, sters, inch_validare
FROM &schema_name..dev_tip_deviz
ORDER BY id_tip;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: COLUMNS - DEV_ORDL (live schema) ===
PROMPT -- ============================================================
PROMPT
COLUMN column_name FORMAT A30
COLUMN data_type FORMAT A15
COLUMN data_length FORMAT 99999
COLUMN nullable FORMAT A3
COLUMN data_default FORMAT A20
SELECT column_name, data_type, data_length, nullable, data_default
FROM all_tab_columns
WHERE owner = '&schema_name'
AND table_name = 'DEV_ORDL'
ORDER BY column_id;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: COLUMNS - DEV_OPER (live schema) ===
PROMPT -- ============================================================
PROMPT
SELECT column_name, data_type, data_length, nullable, data_default
FROM all_tab_columns
WHERE owner = '&schema_name'
AND table_name = 'DEV_OPER'
ORDER BY column_id;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: COLUMNS - DEV_ESTIMARI_REP (live schema) ===
PROMPT -- ============================================================
PROMPT
SELECT column_name, data_type, data_length, nullable, data_default
FROM all_tab_columns
WHERE owner = '&schema_name'
AND table_name = 'DEV_ESTIMARI_REP'
ORDER BY column_id;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: COLUMNS - DEV_MASINICLIENTI (live schema) ===
PROMPT -- ============================================================
PROMPT
SELECT column_name, data_type, data_length, nullable
FROM all_tab_columns
WHERE owner = '&schema_name'
AND table_name = 'DEV_MASINICLIENTI'
ORDER BY column_id;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: COLUMNS - NOM_LUCRARI (live schema) ===
PROMPT -- ============================================================
PROMPT
SELECT column_name, data_type, data_length, nullable
FROM all_tab_columns
WHERE owner = '&schema_name'
AND table_name = 'NOM_LUCRARI'
ORDER BY column_id;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: FK CONSTRAINTS pe DEV_* și NOM_LUCRARI ===
PROMPT -- ============================================================
PROMPT
COLUMN constraint_name FORMAT A30
COLUMN table_name FORMAT A25
COLUMN column_name FORMAT A25
COLUMN r_table FORMAT A25
COLUMN r_column FORMAT A25
SELECT c.constraint_name,
c.table_name,
cc.column_name,
rcc.table_name AS r_table,
rcc.column_name AS r_column
FROM all_constraints c
JOIN all_cons_columns cc
ON c.owner = cc.owner
AND c.constraint_name = cc.constraint_name
JOIN all_cons_columns rcc
ON c.r_owner = rcc.owner
AND c.r_constraint_name = rcc.constraint_name
AND cc.position = rcc.position
WHERE c.owner = '&schema_name'
AND c.constraint_type = 'R'
AND (c.table_name LIKE 'DEV\_%' ESCAPE '\' OR c.table_name = 'NOM_LUCRARI')
ORDER BY c.table_name, c.constraint_name, cc.position;
PROMPT
PROMPT -- ============================================================
PROMPT -- === SECTION: SEQUENCES (SEQ_DEV_*, SEQ_NOM_LUCRARI) ===
PROMPT -- ============================================================
PROMPT
COLUMN sequence_name FORMAT A30
COLUMN last_number FORMAT 99999999999
COLUMN increment_by FORMAT 99999
SELECT sequence_name, last_number, increment_by, cycle_flag
FROM all_sequences
WHERE sequence_owner = '&schema_name'
AND (sequence_name LIKE 'SEQ\_DEV\_%' ESCAPE '\'
OR sequence_name LIKE 'SEQ\_NOM\_LUCRARI%' ESCAPE '\'
OR sequence_name LIKE 'SEQ\_NRORD%' ESCAPE '\')
ORDER BY sequence_name;
PROMPT
PROMPT =============================================================================
PROMPT == MARIUSM_AUTO DDL EXPORT done
PROMPT =============================================================================
SPOOL OFF
SET FEEDBACK ON
SET PAGESIZE 14
SET HEADING ON