# CLAUDE.md — PIPELINE_PYTHON (copia versionata) **Versione:** v1 **Ultimo aggiornamento:** 2026-07-17 Eredita la Costituzione Adrian (`Dropbox/adrian/CLAUDE.md`). Nessuna regola generale da ripetere. --- ## Contesto di questa copia Questo è il **mirror versionato** di `I:\SOFTWARE\SCHEDULATORE\PIPELINE_PYTHON`. Il codice **live/produzione** gira da `I:\SOFTWARE\SCHEDULATORE\PIPELINE_PYTHON` su DS (Direzione Sistemi), non da questa cartella. Questa copia serve per: - **Versionamento git** e storico modifiche (il repo su I:\ ha il suo git, ma è isolato) - **Visibilità da Nave** in sola lettura (via Dropbox) - **Backup** fuori dalla share di rete **Per aggiornare la copia dopo una modifica su I:\**: ricopiare manualmente i file modificati. **Per deployare questa copia verso I:\**: usare `deploy.bat` (solo manuale, mai automatico). **Frequenza di sync**: raramente — la pipeline è delicata, ogni deploy va valutato. --- ## Scopo Orchestratore della pipeline ICR settimanale/giornaliera su DS. Produce i Parquet Layer 1 e Layer 2, popola i database Access (DB_WEEK, DB_DAY) e il mirror SQLite di L2. --- ## Architettura pipeline ``` run_weekly.bat / run_daily.bat ← lanciato da DS │ ├─ [1] Venv check C:\venv_ICR (auto-crea se assente) │ ├─ [2] CsvToParquet_layer1 │ CSV sorgente → Parquet Layer 1 locali │ C:\PYTHON_LOCAL\CsvToParquet_layer1\parquet\ │ ├─ [3] Pubblica Layer 1 su rete │ → I:\SOFTWARE\PYTHON_SRV\parquet_layer1\ │ ├─ [4] Parquet_layer1ToParquet_layer2 │ L1 rete → L2 rete (trasformazioni business + enrich) │ → I:\SOFTWARE\PYTHON_SRV\PYTHON_LOCAL\MyICR_Suite\local_db\parquet\ │ ├─ [5 weekly] SQLite mirror L2 │ L2 parquet → mirror_l2.sqlite │ → I:\SOFTWARE\PYTHON_SRV\sqlite_layer2\mirror_l2.sqlite │ ├─ [6/7 weekly] ParquetToAccessWeekly → DB_WEEK.accdb │ → I:\SOFTWARE\ProcedureICR\ICRmonitor\MonitorLinker\DB_WEEK.accdb │ └─ [6/7 daily] ParquetToAccessDaily → DB_DAY.accdb → I:\SOFTWARE\ProcedureICR\ICRmonitor\MonitorLinker\DB_DAY.accdb ``` --- ## Moduli | Modulo | Ruolo | |---|---| | `CsvToParquet_layer1/` | CSV ICR → Parquet Layer 1. Ha CLAUDE.md proprio. | | `Parquet_layer1ToParquet_layer2/` | Trasformazioni L1→L2 + sqlite_mirror.py (export SQLite). Solo DuckDB. | | `ParquetToAccessWeekly/` | Parquet → DB_WEEK.accdb (6 tabelle Access). | | `ParquetToAccessDaily/` | Parquet → DB_DAY.accdb (enrichment giornaliero). Ha CLAUDE.md proprio. | | `WriteToAccess/` | Mattoncino riusabile: DataFrame → Access via TransferText. | --- ## Venv su DS ``` C:\venv_ICR\Scripts\python.exe ``` Auto-creato da `run_weekly.bat` / `run_daily.bat` se assente, usando `C:\Python311\python.exe`. Pacchetti: `pyodbc pywin32 duckdb pandas loguru` Il venv `C:\PYTHON\_runtimes\venv` è su macchina A (sviluppo) — **non usarlo nei bat DS**. --- ## Gotcha critici - **Separatore decimale italiano**: Access su locale IT usa `,` come decimale. Fix in `WriteToAccess/writer.py`: `_fix_float_decimals()`. - **Access NON deve essere aperto durante i run**: `DoCmd.TransferText` e `CompactRepair` aprono Access via COM — se già aperto → errore. - **schema.ini column order**: `writer.py` genera `schema.ini` con ordine colonne del DataFrame, NON della tabella Access. Fix già applicato in `_build_schema_ini()`. - **PermissionError su DB_WEEK.accdb al rerun manuale**: se il daemon ha creato il file con altro account, cancellare manualmente prima di rilanciare. - **TCDURLORDA formula**: secondi → `(x + 10) // 60` (soglia 50s come VBA, non 30s). - **Date sentinella**: `2201-01-01` (parquet) → `9999-12-31` (VBA); `0001-01-01` → `1001-01-01` (Access non gestisce anni <100). Il CLAUDE.md originale su `I:\SOFTWARE\SCHEDULATORE\PIPELINE_PYTHON\CLAUDE.md` (v8, 2026-04-27) contiene il dettaglio completo dei gotcha, decisioni architetturali e schema parquet L2 — fonte di verità per il codice live. --- ## Stato parallelo Python vs VBA (post-fix 2026-04-23) | Tabella | Match% | |---|---| | CUSTOM_EMESSO | 97.47% (residuo TCDURLORDA ±1min strutturale) | | CUSTOM_ANAGR_ORIZ | 99.76% | | EDIZIONI | 100.00% | | SUPERSERIE | 99.84% | | CUSTOM_DIRITTI | 100.00% | | BOXOFFICE | 99.55% |