--- aliases: ["Linker"] type: modulo parent: "MyICR Suite" --- # CLAUDE.md — Linker **Versione:** v1 **Ultimo aggiornamento:** 2026-07-02 --- ## Visione architetturale (2026-05-21) Il modulo PyQt6 "Linker" è l'erede di MyICR (il vecchio tool VBA in Excel). "Linker" è sia il nome del contenitore sia il nome dell'app standard al suo interno. ### Nomenclatura ufficiale | Nome | Classe | Descrizione | |---|---|---| | **Linker** (contenitore) | `MainWindow` | La finestra PyQt6 che ospita tutti i fogli | | **Linker** (app standard) | `LinkerSheet` | Foglio con input manuale RIFER/titoli | | **Aggancio** | `AggancioSheet` | Foglio con input da listino fornitore | | **In Scadenza** | `InScadenzaSheet` | Foglio feeder automatico da parquet | ### Modello concettuale ``` Linker (contenitore) ├── Linker 1 (istanza LinkerSheet) ├── Linker 2 (istanza LinkerSheet) ├── Aggancio 1 (istanza AggancioSheet) └── In Scadenza 1 (istanza InScadenzaSheet) ``` **Ogni tab è un'istanza di un'app specifica** — non un foglio generico. Il nome del tab è `[NomeApp] [N]` (es. "Linker 1", "Aggancio 1"). L'utente può rinominare il label visibile, ma il tipo (`app_type`) è immutabile e MyICR lo ricorda in `session.json`. ### Tre livelli distinti 1. **Feeder** — popola un foglio con RIFER: - Input manuale (Linker standard) - Listino fornitore (Aggancio) - Parquet automatico (In Scadenza) - Un foglio può essere popolato da più feeder in momenti diversi 2. **Renderer** — modulo trasversale (`GridFiller` + pipeline fetch parquet): - Prende una lista di RIFER → produce colonne standardizzate - Indifferente alla sorgente dei RIFER - Condiviso tra tutti i tipi di foglio 3. **Output** — la griglia renderizzata, sempre la stessa struttura ### Colonne derivate (DECOR_FORN, DELTA, MOTIVO) Appartengono al workflow di aggancio (confronto date decorrenza listino vs diritti esistenti). Non hanno senso in un foglio Linker standard o In Scadenza standalone. **Regola:** mostrarle solo se il foglio è di tipo Aggancio, o se è "In Scadenza" aperto in contesto di un Aggancio attivo. In tutti gli altri casi: colonne nascoste. ### Accoppiamento contenitore ↔ feeder "In Scadenza" non deve interrogare direttamente gli altri fogli. È il **contenitore** (MainWindow) che conosce i fogli aperti e passa le informazioni necessarie a "In Scadenza" come parametro al momento dell'apertura. Nessun accoppiamento diretto tra fogli. --- ## Sorgenti dati — NO MS Access **Il Linker non usa MS Access.** Migrazione completata 2026-04-29. - Dati prodotti: DuckDB su Parquet DataHub_v2 - Repository Linker: `linker.db` SQLite sidecar - Offline: parquet sincronizzati in `local_db/parquet/` --- ## Modalità offline Linker può funzionare offline se i parquet sono stati sincronizzati. Usa DuckDB/Parquet (`local_db/parquet/`) + `linker.db` SQLite — nessuna dipendenza di rete. --- ## GemmaSheet (completato 2026-07-01) Migrazione modulo Gemma da VBA completata come PyQt6 sheet nel Linker container. Scelta PyQt6 (non Flask) per performance su 51K righe. - File: `src/gui/gemma_sheet.py` - Tipo: `QTableView + QAbstractTableModel` — virtual scrolling (solo righe visibili) - Read-only — dati da `gemma.parquet` via DuckDB/SQLite mirror - Integrato come tab aggiuntivo nel Linker `MainWindow` --- ## Standard UI — fogli Linker Ogni nuovo foglio del Linker deve rispettare: | Feature | Standard | |---|---| | Selezione celle | `SelectItems` (singola cella, stile Excel) — **non** `SelectRows` | | Cella selezionata | `background: #CCE8FF; color: #0078D7` via stylesheet | | Tasto destro → Copia | `_copy_selection()` — copia selezione singola o multipla in TSV | | Hamburger menu | Importa / Esporta / Filtro colonne (Ctrl+F) / Mostra valutazioni | | FilterBar | presente, toggled via Ctrl+F e hamburger | | Font griglia | Calibri 8 | ```python self.table.setStyleSheet(""" QTableWidget { gridline-color: #C0C0C0; } QTableWidget::item { padding: 0px 3px; } QTableWidget::item:selected { background-color: #CCE8FF; color: #0078D7; } """) ``` --- ## Backlog - **Linker Step 4**: match tra tabelle — checkbox "Escludi titoli già in Linker" - **MT-03 Fase 2**: configurazione utente Modalità Mercato (tipologie, range anni, filtri) - **OTT**: spostare colonne valutazioni nella griglia ✓ — flag NO ICR auto-valorizzato ✓