MEMORY_TRANSFER.md Stato Progetto MyICR Suite Data: 27/08/2025 Scopo: Documentare lo stato attuale del progetto, riflettendo le evoluzioni architetturali e le funzionalità implementate. 1. Contesto Generale e Metafora Architettonica Lo sviluppo dell'applicazione desktop MyICR Suite prosegue secondo l'architettura a "Nave Portacontainer". La Nave (src/): È il guscio dell'applicazione (MainWindow, DatabaseManager, widget di base). È responsabile del caricamento e della gestione dei "container", ma è agnostica riguardo al loro contenuto specifico. I Container (containers/): Sono le funzionalità principali (es. le dashboard). Ogni container è un package Python completamente autonomo e sigillato, contenente la propria UI, logica di business e query SQL. 2. Principi Guida Architettonici (La Nostra Bussola) Questi principi, derivati dal POST_MORTEM.md, rimangono la nostra guida fondamentale: L'Isolamento Vince sull'Eleganza: La priorità assoluta è l'autonomia dei container. La duplicazione di codice controllata è accettata per prevenire accoppiamenti fragili. Il Refactoring è Guidato dall'Evidenza: Un componente viene promosso a "servizio della nave" solo quando la sua necessità è dimostrata in più container e la sua interfaccia si è stabilizzata. Il Core (src) è Sacro: Le dipendenze sono unidirezionali: i containers possono importare da src, ma src non deve mai importare dai containers. Duplicazione Controllata > Accoppiamento Fragile: L'idea di widget di base condivisi (es. BaseTableWidget) è stata scartata a favore dell'inclusione di tutto il codice necessario all'interno di ogni container, massimizzando l'isolamento. 3. Struttura Attuale del Progetto La struttura fisica del progetto riflette fedelmente l'architettura. code Code MyICR_Suite/ ├── containers/ │ └── dashboards/ │ ├── dash_diritti/ │ ├── dash_em_pivot/ │ └── dash_tipologie/ │ ├── database/ │ └── connection.py <-- Contiene solo il DatabaseManager generico │ ├── src/ │ ├── pages/ │ │ └── navigation/ <-- Unica pagina "core" per la navigazione │ ├── utils/ │ │ └── worker.py │ ├── widgets/ <-- Widget usati solo dalla Nave (es. LoadingOverlay) │ └── main_window.py <-- La "Nave" │ └── main.py Nota di Refactoring: Le cartelle database/queries/ e src/pages/fullscreen_table_page/ sono state eliminate con successo. Ogni container ora gestisce le proprie query e le proprie pagine a schermo intero. 4. Stato Attuale e Lavoro Completato Abbiamo raggiunto uno stato stabile e funzionale per tre dashboard principali. Le seguenti funzionalità sono complete, testate e integrate: Container Operativi: Le dashboard dash_tipologie, dash_em_pivot e dash_diritti sono state implementate come container autonomi e funzionanti. Esportazione Excel: Tutti e tre i container dispongono di una funzionalità di esportazione in Excel per le tabelle di dettaglio. Vista a Schermo Intero: Tutti e tre i container permettono di aprire la tabella di dettaglio in una nuova tab a schermo intero per una migliore analisi. Architettura Toolbar Decentralizzata: In linea con il principio di isolamento, la MainToolbar centralizzata è stata rimossa. Ogni container ora implementa e gestisce le proprie azioni (esportazione, reset, fullscreen) in modo autonomo: dash_em_pivot usa una classe PageToolbar dedicata. dash_diritti e dash_tipologie integrano i QPushButton di azione direttamente nel loro layout. Questa evoluzione rafforza l'indipendenza di ogni modulo. 5. Prossimi Passi e Roadmap Le prossime direzioni di sviluppo si concentrano sul consolidamento e il potenziamento delle funzionalità esistenti: Potenziare la Dashboard Diritti: Implementare filtri di business complessi (es. "escludi inibiti", "solo piena titolarità"). Miglioramenti Architettonici e UI: Valutare la standardizzazione dell'approccio alla toolbar/azioni all'interno dei container per garantire una User Experience più coerente tra le diverse dashboard. 6. Pattern Architettonici Chiave (Codice di Riferimento) Registro delle Pagine (Il "Manifesto di Carico"): Il dizionario page_registry in src/main_window.py è il punto centrale per dichiarare i container e le pagine alla "Nave". code Python # In src/main_window.py self.page_registry = { # ... 'dash_diritti': { 'class': DashboardDirittiPage, 'type': 'container', 'title': "Dashboard Diritti", 'async_loader': FilterPanelDiritti.get_filter_data, }, 'fullscreen_diritti': { 'class': FullScreenDiritti, 'type': 'sub-container' } # ... } Query Dinamica ("a Mattoncini"): Il nostro pattern standard per costruire query SQL che si adattano dinamicamente ai filtri forniti dall'utente. code Python # In containers/dashboards/dash_diritti/queries.py def get_diritti_detail_data(..., filters: Dict[str, Any]) -> pd.DataFrame: base_query = """ SELECT ... FROM diritti WHERE ... """ params = [...] conditions = [] if filters.get('fornitore'): conditions.append("AND fornitore_cluster = ?") params.append(filters['fornitore']) # ... altri filtri ... query = base_query + " " + " ".join(conditions) return db_manager.execute_query(query, tuple(params)) Apertura di Tab Dinamiche: Il pattern basato sul segnale open_new_tab_requested permette a un container di chiedere alla MainWindow di aprire una nuova pagina (es. una vista a schermo intero) in modo disaccoppiato. code Python # In un container, es. containers/dashboards/dash_diritti/__init__.py def open_detail_fullscreen(self): page_data = {'dataframe': self.detail_table.original_data, 'title': ...} self.open_new_tab_requested.emit( 'fullscreen_diritti', # page_id_prefix page_data['title'], # Titolo della tab False, # is_singleton page_data # Dati da passare alla nuova pagina )