# C:\PYTHON\MyICR_Suite\app\features\dash_diritti\queries.py import pandas as pd from typing import Dict, Any from loguru import logger from app.database.connection import db_manager def get_distinct_tipologie_diritti() -> list: logger.info("Caricamento tipologie uniche per i filtri diritti...") query = "SELECT DISTINCT tipologia FROM diritti WHERE tipologia IS NOT NULL AND tipologia != '' ORDER BY tipologia" try: df = db_manager.execute_query(query) return df['tipologia'].tolist() except Exception as e: logger.error(f"Impossibile caricare le tipologie per i filtri: {e}") return [] def get_distinct_fornitori_diritti() -> list: logger.info("Caricamento cluster fornitori unici per i filtri diritti...") query = "SELECT DISTINCT fornitore_cluster FROM diritti_enrich WHERE fornitore_cluster IS NOT NULL AND fornitore_cluster != '' ORDER BY fornitore_cluster" try: df = db_manager.execute_query(query) return df['fornitore_cluster'].tolist() except Exception as e: logger.error(f"Impossibile caricare i cluster fornitori per i filtri: {e}") return [] def get_diritti_pivot_data(filters: Dict[str, Any] = None) -> pd.DataFrame: if filters is None: filters = {} logger.info(f"Esecuzione query dati grezzi diritti con filtri: {filters}") base_query = """ SELECT d.tipologia, d.decr, d.scad, d.fr_rr, d.prod, d.ediz, ANY_VALUE(d.perc) AS perc FROM diritti d LEFT JOIN diritti_enrich de ON d.id_diritto = de.id_diritto WHERE d.tipologia IS NOT NULL AND d.tipologia != '' AND d.decr IS NOT NULL """ conditions, params = [], [] if filters.get('exclude_inibiti'): conditions.append("AND d.flag_inib IS NULL") if filters.get('exclude_passaggi_zero'): conditions.append("AND d.pass_cons_tot > d.pass_eff_tot") if filters.get('fr_rr_filter'): conditions.append("AND d.fr_rr = ?"); params.append(filters['fr_rr_filter']) if filters.get('tipologia'): conditions.append("AND d.tipologia = ?"); params.append(filters['tipologia']) if filters.get('fornitore'): conditions.append("AND de.fornitore_cluster = ?"); params.append(filters['fornitore']) if filters.get('data_decorrenza'): conditions.append("AND d.scad >= ?"); params.append(filters['data_decorrenza']) if filters.get('data_scadenza'): conditions.append("AND d.decr <= ?"); params.append(filters['data_scadenza']) query = base_query + " " + " ".join(conditions) if conditions else base_query query += " GROUP BY d.tipologia, d.decr, d.scad, d.fr_rr, d.prod, d.ediz" try: logger.debug(f"Query Pivot Diritti Eseguita: {query} | Params: {params}") df = db_manager.execute_query(query, tuple(params)) logger.info(f"Query dati grezzi diritti eseguita. {len(df)} record ritornati per l'elaborazione.") return df except Exception as e: logger.error(f"Errore esecuzione query dati grezzi diritti: {e}", exc_info=True) return pd.DataFrame() def get_diritti_detail_data(tipologia: str, anno: str, fr_rr: str, filters: Dict[str, Any]) -> pd.DataFrame: logger.info(f"Caricamento dettagli per: Tipologia={tipologia}, Anno={anno}, FR/RR={fr_rr}, Filtri={filters}") cte_inner = """ WITH ranked AS ( SELECT p.titolo_italiano, p.titolo_originale, p.anno_produzione, p.paesi_produzione1, p.genere1, p.num_episodi, p.durata, d.decr, d.scad, d.ragsoc_distr, de.fornitore_cluster, d.perc, d.pass_cons_tot, d.pass_eff_tot, d.causale, d.fr_rr, d.prod, d.flag_inib, ROW_NUMBER() OVER (PARTITION BY d.prod, d.ediz ORDER BY d.id_diritto) AS rn FROM diritti d LEFT JOIN prodotti p ON d.prod = p.prodotto AND d.ediz = p.edizione LEFT JOIN diritti_enrich de ON d.id_diritto = de.id_diritto WHERE d.tipologia = ? AND d.fr_rr = ? """ cte_outer = """ ) SELECT titolo_italiano, titolo_originale, anno_produzione, paesi_produzione1, genere1, num_episodi, durata, decr, scad, ragsoc_distr, fornitore_cluster, perc, pass_cons_tot, pass_eff_tot, causale, fr_rr, prod, flag_inib FROM ranked WHERE rn = 1 ORDER BY decr DESC """ params = [tipologia, fr_rr] conditions = [] if filters.get('exclude_inibiti'): conditions.append("AND d.flag_inib IS NULL") if filters.get('exclude_passaggi_zero'): conditions.append("AND d.pass_cons_tot > d.pass_eff_tot") if filters.get('only_decorrenza_year'): logger.debug(f"Query dettaglio in modalità 'decorrenza' per l'anno {anno}") conditions.append("AND year(CAST(d.decr AS DATE)) = ?") params.append(int(anno)) else: logger.debug(f"Query dettaglio in modalità 'transito' per l'anno {anno}") conditions.append("AND year(CAST(d.decr AS DATE)) <= ? AND year(CAST(d.scad AS DATE)) >= ?") params.extend([int(anno), int(anno)]) if filters.get('fornitore'): conditions.append("AND de.fornitore_cluster = ?") params.append(filters['fornitore']) if filters.get('data_decorrenza'): conditions.append("AND d.scad >= ?"); params.append(filters['data_decorrenza']) if filters.get('data_scadenza'): conditions.append("AND d.decr <= ?"); params.append(filters['data_scadenza']) query = cte_inner + " " + " ".join(conditions) + cte_outer try: logger.debug(f"Query Dettaglio Diritti Eseguita: {query} | Params: {params}") df = db_manager.execute_query(query, tuple(params)) logger.info(f"Query dettaglio diritti eseguita. Trovati {len(df)} record.") return df except Exception as e: logger.error(f"Errore query dettaglio diritti: {e}", exc_info=True) return pd.DataFrame()