# MyICR Suite — Data Dictionary per NL Query **Versione:** 1.1 **Data:** 2026-06-08 **Fonte dati:** Parquet L2 in `local_db/parquet/` + `linker.db` + `ott.db` + `mediatrack.db` --- ## Panoramica del sistema MyICR Suite gestisce il **catalogo acquisti ICR (Indagine Contenuti e Risorse)** di Mediaset. I quattro domini principali sono: | Dominio | Descrizione | Tabelle principali | |---------|-------------|-------------------| | **Anagrafica** | Scheda prodotto (film, telefilm, ecc.) | `prodotti`, `cast`, `imdb`, `imdb_full` | | **Diritti** | Contratti di acquisto/trasmissione | `diritti`, `diritti_enrich` | | **Emesso** | Storico trasmissioni TV | `emesso`, `emesso_enrich`, `reti_cluster` | | **Boxoffice** | Incassi cinema italiani | `boxoffice` | | **Valutazione** | Proposte e valutazioni ICR | `gemma`, `scelte_rete` | | **Mercato OTT** | Catalogo streaming (Netflix, Amazon, ecc.) | `ott`, `ott_ext` (in `ott.db`/`linker.db`) | | **Osservatorio** | Produzione internazionale streaming | `osservatorio` | | **MediaTrack** | Tracking acquisti mercati internazionali | `AnagraficaMedia`, `LogAggiornamenti`, `OmdbData` (in `mediatrack.db`) | --- ## Chiave di navigazione — come si collegano i domini ``` prodotti (program_id = RIFER) ├── prodotto ──→ diritti.prod + diritti.ediz ├── prodotto ──→ emesso.prodotto + emesso.edizione ├── prodotto ──→ imdb.codice ──→ imdb.riferimento_imdb ('tt...') ├── prodotto ──→ cast.prodotto ├── prodotto ──→ boxoffice.prodotto ├── prodotto ──→ scelte_rete.prodotto └── program_id ──→ gemma.A_CODICE_PRODOTTO (o via IMDB) diritti.id_diritto ──→ diritti_enrich.id_diritto emesso (rete + data_emissione + ora_inizio) ──→ emesso_enrich (stessa tripla) emesso.rete / scelte_rete.codice_rete ──→ reti_cluster.codice_rete imdb.riferimento_imdb ──→ imdb_full.IMDB_CODICE gemma.A_COD_IMDB ──→ imdb_full.IMDB_CODICE ott.imdb_id ──→ imdb_full.IMDB_CODICE AnagraficaMedia.id_media ('G_' + gemma.A_ID) ──→ gemma (via CAST stripping prefix) AnagraficaMedia.codice_imdb ──→ imdb_full.IMDB_CODICE AnagraficaMedia.id_media ──→ LogAggiornamenti.id_media_fk AnagraficaMedia.id_media ──→ OmdbData.id_media_fk LogAggiornamenti.id_tipo_evento_fk ──→ TipiEvento.id_tipo_evento LogAggiornamenti.id_distributore_fk ──→ Distributori.id_distributore ``` > **⚠ RIFER vs prodotto:** In tutta l'applicazione il termine **RIFER** indica `prodotti.program_id` (VARCHAR, es. `'ANA00101'`, `'338467'`). Il campo `prodotto` (INTEGER) è l'ID interno numerico. Sono due chiavi diverse per lo stesso prodotto. --- ## PRODOTTI — Anagrafica prodotto **Record:** 225.698 | **Chiave primaria:** `(prodotto, edizione)` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `prodotto` | INTEGER | ID interno numerico. Chiave di join verso diritti, emesso, cast, boxoffice, imdb, scelte_rete | | `edizione` | INTEGER | Numero edizione. Lo stesso film può avere più edizioni con diritti diversi | | `program_id` | VARCHAR | **= RIFER** — identificatore univoco esterno (es. `'ANA00101'`, `'338467'`). Usato come chiave di riferimento in tutto il sistema | | `titolo_italiano` | VARCHAR | Titolo in italiano (può contenere indicazioni regia tra parentesi) | | `titolo_originale` | VARCHAR | Titolo originale | | `descr_edizione` | VARCHAR | Descrizione edizione (es. "Ed. 2") | | `tipologia` | VARCHAR | Tipo di contenuto — vedi valori sotto | | `veg` | VARCHAR | Valenza Editoriale Globale — classe editoriale | | `genere1` / `genere2` / `genere3` | VARCHAR | Generi (principale + secondari) | | `anno_produzione` | INTEGER | Anno di produzione | | `durata` | INTEGER | Durata in minuti | | `num_episodi` | INTEGER | Numero episodi (per serie) | | `stagione` | INTEGER | Numero stagione | | `paesi_produzione1/2/3` | VARCHAR | Paesi di produzione | | `unico_seriale` | VARCHAR | `'U'` = fa parte di una superserie | | `superserie_descr` | VARCHAR | Nome della superserie/franchise (es. "DEADPOOL", "JAMES BOND") | | `superserie_id` | INTEGER | ID numerico superserie | | `superserie_extkey` | VARCHAR | Chiave esterna superserie | | `vm` | VARCHAR | Vietato Minori — rating età | | `cromia` | VARCHAR | Colore/Bianco e nero | | `provenienza` | VARCHAR | Provenienza del contenuto | **Valori `tipologia` rilevanti per ICR:** - `FILM` — film cinematografico - `TELEFILM` — serie TV episodica - `MINISERIE` — miniserie TV - `TV MOVIE` — film prodotto per TV - `DOCUMENTARI` — documentari - `CARTOON` — animazione - `SOAP` — soap opera - `TELENOVELAS`, `TELEROMANZO`, `SIT COM`, `TALK SHOW`, `REALITY`, ecc. - Valore NULL presente (prodotti senza classificazione) **Valori `veg` (Valenza Editoriale Globale):** - `A`, `B`, `C`, `D`, `E`, `F`, `G`, `H` — scala qualitativa (A = massima valenza) - `SUPER TOP`, `TOP` — eccellenza editoriale - `EVER GREEN` — contenuto perennemente valido - `UNIVOCA` — classificazione univoca - `FICTION AUTOPRODOTTA` — produzione interna Mediaset - `DA ATTRIBUIRE` — non ancora classificato (~80K record) - `NON GESTITA` — non gestita dal sistema --- ## DIRITTI — Contratti di acquisizione **Record:** 51.340 | **Chiave primaria:** `id_diritto` **Solo diritti FREE / Analogico-DVB-T** (filtro applicato in L2 — no pay-TV, no streaming) | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id_diritto` | BIGINT | PK — identificatore univoco contratto | | `prod` | INTEGER | FK → `prodotti.prodotto` | | `ediz` | INTEGER | FK → `prodotti.edizione` | | `tipologia` | VARCHAR | Tipo contratto | | `d_t` | VARCHAR | `D`=Diritto (acquisizione), `T`=Trasmissione (~51K D, ~200 T) | | `ragsoc_distr` | VARCHAR | Ragione sociale distributore/fornitore | | `perc` | DOUBLE | Percentuale diritti detenuta | | `pass_cons` | DOUBLE | Passaggi consentiti dal contratto | | `pass_eff` | DOUBLE | Passaggi effettivamente trasmessi | | `decr` | DATE | Data decorrenza diritto (inizio validità) | | `scad` | DATE | Data scadenza diritto (fine validità). `9999-12-31` = diritto perpetuo | | `causale` | VARCHAR | Causale/tipo del diritto | | `fr_rr` | VARCHAR | `F`=First Run (prima visione), `R`=Repeat (replica), `S`=Sospeso, `M`=Mixed | | `flag_inib` | VARCHAR | Flag inibizione (blocco trasmissione) | | `decr_inib` / `scad_inib` | DATE | Periodo inibizione | | `contratto` | INTEGER | Numero contratto | | `CONTRAENTE_WIN_1..9` | VARCHAR | Controparte per ciascuna finestra temporale | | `DECR_WIN_1..9` | DATE | Data inizio finestra 1..9 | | `SCAD_WIN_1..9` | DATE | Data fine finestra 1..9 | | `CAUSALE_WIN_1..9` | VARCHAR | Causale finestra | | `CAUSALE_INIBIZIONE_WIN_1..9` | VARCHAR | Causale inibizione per finestra | | `NOTE_WIN_1..9` | VARCHAR | Note per finestra | > **Nota finestre (WIN_1..9):** Un contratto può articolarsi in fino a 9 finestre temporali con controparti diverse. La maggioranza dei record usa solo WIN_1. --- ## DIRITTI_ENRICH — Arricchimento diritti **Record:** 51.340 (1:1 con diritti) | **Join:** `id_diritto` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id_diritto` | BIGINT | FK → `diritti.id_diritto` | | `fornitore_cluster` | VARCHAR | Raggruppamento fornitore (es. "warner", "disney", "altro") | | `ESCLUSIVO_TEM` | BOOLEAN | `true` se il diritto è esclusivo per canali tematici | --- ## EMESSO — Storico trasmissioni **Record:** 8.783.206 | **Chiave:** `(rete, data_emissione, ora_inizio, prodotto, edizione)` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `rete` | VARCHAR | Codice rete (2 caratteri) — es. `C5`, `I1`, `R4`. Join → `reti_cluster.codice_rete` | | `data_emissione` | VARCHAR | Data trasmissione in formato `'YYYY-MM-DD'` (stringa, non DATE) | | `ora_inizio` | INTEGER | Ora inizio in secondi dalla mezzanotte (es. 72000 = 20:00:00) | | `ora_fine` | INTEGER | Ora fine in secondi dalla mezzanotte | | `prodotto` | INTEGER | FK → `prodotti.prodotto` | | `edizione` | INTEGER | FK → `prodotti.edizione` | | `prima_visione` | VARCHAR | `S`=prima visione assoluta su questa rete, `N`=replica | | `audience` | INTEGER | Numero di spettatori | | `share` | DOUBLE | Share percentuale | | `fascia` | VARCHAR | Fascia oraria — vedi valori sotto | | `tipologia` | VARCHAR | Tipo contenuto al momento della trasmissione | | `durata_netta` | INTEGER | Durata netta in secondi | | `durata_lorda` | INTEGER | Durata lorda in secondi | | `ncparpgm` | INTEGER | Numero commercials/break | | `episodio` | INTEGER | Numero episodio trasmesso | **Valori `fascia` (fasce orarie):** | Codice | Descrizione | Orario indicativo | |--------|-------------|-------------------| | `MA` | Mattina | 06:00–12:00 | | `ME` | Mezzogiorno | 12:00–14:00 | | `PO` | Pomeriggio | 14:00–18:00 | | `PS` | Preserale | 18:00–20:00 | | `PR` | Prima serata (prime time) | 20:00–22:30 | | `SS` | Seconda serata | 22:30–01:00 | | `NO` | Notte | 01:00–06:00 | | `AR` | Alba | prima alba | | `GR` | Giorno generico | (non classificato per ora) | | NULL | Non classificato | — | > **Nota ora_inizio:** I valori >86400 indicano trasmissioni "a cavallo" della mezzanotte (es. 90000 = 01:00 del giorno dopo). Per convertire: `ora_inizio % 86400 / 3600` = ore. --- ## EMESSO_ENRICH — Arricchimento trasmissioni **Record:** 8.783.206 (1:1 con emesso) | **Join:** `(rete, data_emissione, ora_inizio)` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `rete` | VARCHAR | FK → `emesso.rete` | | `data_emissione` | VARCHAR | FK → `emesso.data_emissione` | | `ora_inizio` | INTEGER | FK → `emesso.ora_inizio` | | `fornitore_diritto` | VARCHAR | Fornitore del diritto al momento della trasmissione | | `fornitore_cluster` | VARCHAR | Cluster fornitore | | `is_primetime_main` | INTEGER | `1` se trasmesso in prime time su canale principale (C5/I1/R4) | | `timestamp_normalizzato` | VARCHAR | Timestamp normalizzato | | `prima_visione_recalc` | VARCHAR | Prima visione ricalcolata (corregge eventuali errori del campo originale) | --- ## RETI_CLUSTER — Anagrafica reti TV **Record:** 36 | **Chiave:** `codice_rete` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `codice_rete` | VARCHAR | Codice breve 2 caratteri — chiave primaria (es. `C5`, `I1`, `R4`) | | `rete_6chr` | VARCHAR | Codice 6 caratteri (es. `C5`, `I1`, `BOINGP`) | | `rete_2chr` | VARCHAR | Codice 2 caratteri alternativo | | `rete_estesa` | VARCHAR | Nome completo (es. `CANALE 5`, `ITALIA 1`, `BOING PLUS`) | | `cluster_rete` | VARCHAR | Raggruppamento editoriale | **Cluster principali:** | Cluster | Reti | |---------|------| | `C5-I1-R4` | Canale 5, Italia 1, Retequattro — generaliste Mediaset | | `MED. TEM.` | Iris, La5, Boing, Top Crime, Cine34, Focus, Italia2, ecc. — tematiche Mediaset | | `R1-R2-R3` | Rai 1, Rai 2, Rai 3 — generaliste RAI | | `RAI TEM.` | Rai 4, Rai Movie, Rai Premium — tematiche RAI | | `LA7` | LA7, LA7D | | `DISCOVERY` | Discovery, Real Time, DMAX, Nove, Giallo | | `SKY` | Cielo, TV8 | | `CONC. TEM.` | Sony, Warner TV, Paramount, Pop — tematiche concorrenti | --- ## IMDB — Collegamento codici IMDB **Record:** 110.381 | **Chiave:** `codice` (= `prodotti.prodotto`) | Colonna | Tipo | Descrizione | |---------|------|-------------| | `codice` | INTEGER | FK → `prodotti.prodotto` — ID numerico interno | | `riferimento_imdb` | VARCHAR | Codice IMDB in formato `'tt1234567'` | > **Nota:** Non tutti i prodotti hanno un codice IMDB. La tabella contiene solo le associazioni note. --- ## IMDB_FULL — Dati IMDB completi **Record:** 1.273.028 | **Chiave:** `IMDB_CODICE` Tabella autonoma, non direttamente collegata a `prodotti`. Join tramite `imdb.riferimento_imdb`. | Colonna | Tipo | Descrizione | |---------|------|-------------| | `IMDB_CODICE` | VARCHAR | Codice IMDB (`'tt...'`) — chiave primaria | | `TIPOL` | VARCHAR | Tipo contenuto | | `TO` | VARCHAR | Titolo originale | | `TI` | VARCHAR | Titolo italiano | | `DUR` | INTEGER | Durata in minuti | | `ANNO` | INTEGER | Anno di uscita | | `GENERE` | VARCHAR | Genere principale | | `VOTO` | DOUBLE | Rating IMDB (0-10) | | `VOTANTI` | BIGINT | Numero voti IMDB | | `REGISTA` | VARCHAR | Nome regista | | `CAST` | VARCHAR | Cast principale (stringa) | --- ## CAST — Cast e crew **Record:** 1.770.473 | **Join:** `prodotto` → `prodotti.prodotto` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `prodotto` | INTEGER | FK → `prodotti.prodotto` | | `ruolo` | VARCHAR | Codice ruolo — vedi tabella sotto | | `descr_ruolo` | VARCHAR | Descrizione ruolo leggibile | | `progr_ruolo` | INTEGER | Progressivo posizione nel ruolo | | `progr_cast` | INTEGER | Progressivo assoluto nel cast | | `nome` | VARCHAR | Nome persona | | `cognome` | VARCHAR | Cognome persona | | `ccprodtip` | VARCHAR | Codice tipo produzione | **Ruoli principali:** | Codice | Descrizione | |--------|-------------| | `C001` | ATTORE | | `FRE` | REGISTA | | `FSS` | SCENEGGIATORE | | `FMN` | MONTATORE | | `FFO` | FOTOGRAFO (direttore fotografia) | | `C025` | MUSICISTA | | `FSU` | AUTORE SOGGETTO | | `C006` | CONDUTTORE | | `VOC` | VOCE | | `SS` | SE STESSO/A | | `FDP` | DOPPIATORE | --- ## BOXOFFICE — Incassi cinema italiani **Record:** 39.632 | **Join:** `prodotto` → `prodotti.prodotto` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `prodotto` | INTEGER | FK → `prodotti.prodotto` | | `stagione` | VARCHAR | Stagione cinematografica (es. `'2023/24'`, `'1949/50'`) | | `data_debutto` | DATE | Data di uscita al cinema in Italia | | `distributore` | VARCHAR | Distributore cinematografico in Italia | | `incasso` | DOUBLE | Incasso totale in euro | | `spettatori` | BIGINT | Numero spettatori totali | --- ## SCELTE_RETE — Slot editoriali assegnati **Record:** 9.596 | **Join:** `prodotto` → `prodotti.prodotto` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `prodotto` | INTEGER | FK → `prodotti.prodotto` | | `codice_rete` | VARCHAR | FK → `reti_cluster.codice_rete` | | `slot` | VARCHAR | Slot editoriale assegnato (es. `'MA'`, `'PT E'`, `'PT G'`) | > `PT E` = prime time estivo, `PT G` = prime time generico --- ## GEMMA — Proposte e valutazioni ICR **Record:** 51.736 | **Fonte:** aggiornamento giornaliero Gemma è il sistema interno ICR di valutazione dei contenuti da acquistare. Prefisso `A_` = dati anagrafici/acquisizione | Prefisso `V_` = valutazioni ICR per rete | Colonna | Tipo | Descrizione | |---------|------|-------------| | `A_ID` | VARCHAR | ID interno Gemma | | `A_STATO` | VARCHAR | Stato pratica: `Finalizzato`, `In carico ICR`, `Modificato ICR`, `Nuovo` | | `A_TITOLO` | VARCHAR | Titolo | | `A_TIPO` | VARCHAR | `Film`, `Documentario`, `Film-Documentario` | | `A_DATA` | VARCHAR | Data scheda | | `A_DISTRIBUTORE` | VARCHAR | Distributore/venditore | | `A_TIPOLOGIA` | VARCHAR | Tipologia contenuto | | `A_AUTORE_REGISTA` | VARCHAR | Regista | | `A_CAST` | VARCHAR | Cast | | `A_CODICE_PRODOTTO` | VARCHAR | Codice prodotto Mediaset (= `program_id` / RIFER) | | `A_COD_IMDB` | VARCHAR | Codice IMDB (`'tt...'`) | | `A_EPISODIO` | VARCHAR | Numero episodi | | `A_SUPPORTO` | VARCHAR | Tipo supporto consegnato | | `A_ACQUISTATO_VENDUTO` | VARCHAR | `Acquistato`, `Venduto`, NULL | | `A_DEADLINE` | VARCHAR | Deadline offerta | | `A_NOTE_PUBBLICHE` / `A_NOTE_PRIVATE` | VARCHAR | Note | | `A_C5`, `A_I1`, `A_R4`, `A_LA5`, `A_I2`, `A_IRIS`, `A_TOP`, `A_FOC`, `A_C20`, `A_CI34`, `A_C27` | VARCHAR | Flag di interesse per rete (`1`=interessante, `0`=no) | | `A_CIN`, `A_INF`, `A_EMO`, `A_ENE`, `A_COM`, `A_STO`, `A_CRI`, `A_ACT` | VARCHAR | Generi/caratteristiche (`1`=presente) | | `V_STATO` | VARCHAR | Stato valutazione ICR | | `V_RDA` | VARCHAR | Valutazione RDA | | `V_C5`, `V_I1`, `V_R4`, `V_LA5`, `V_I2`, `V_IRIS`, `V_TOP`, `V_FOC`, `V_C20`, `V_CI34`, `V_C27` | VARCHAR | Punteggio ICR per rete (score numerico come stringa) | | `V_CIN`, `V_INF`, `V_EMO`, `V_ENE`, `V_COM`, `V_STO`, `V_CRI`, `V_ACT` | VARCHAR | Punteggi per categoria | **Reti Mediaset nei flag A_ / V_:** `C5`=Canale5, `I1`=Italia1, `R4`=Retequattro, `LA5`=La5, `I2`=Italia2, `IRIS`=Iris, `TOP`=TopCrime, `FOC`=Focus, `C20`=20, `CI34`=Cine34, `C27`=TwentySeven --- ## OSSERVATORIO — Produzione internazionale streaming **Record:** 34.201 | **Join:** `imdb` → `imdb_full.IMDB_CODICE` Monitoraggio serie e film in produzione o già realizzati sulle principali piattaforme mondiali. | Colonna | Tipo | Descrizione | |---------|------|-------------| | `codice` | VARCHAR | Codice interno | | `imdb` | VARCHAR | Codice IMDB | | `titolo` / `titolo_int` | VARCHAR | Titolo locale / internazionale | | `stato` | VARCHAR | `Project`=in sviluppo, `Realizzato`=completato | | `platform` | VARCHAR | Piattaforma streaming (Netflix, Amazon, Disney+, Apple TV, Max, Paramount+, ecc.) | | `paese` | VARCHAR | Paese di produzione | | `genere` / `subgenere` | VARCHAR | Genere e sottogenere | | `tipologia` | VARCHAR | Tipo contenuto | | `anno` / `anno_screening` | VARCHAR | Anno produzione / anno screening | | `rete` | VARCHAR | Rete televisiva (se applicabile) | | `produttore` / `produzione` | VARCHAR | Casa produttrice | | `distribuzione` | VARCHAR | Distributore | | `regia` | VARCHAR | Regista | | `cast` | VARCHAR | Cast | | `episodi` | VARCHAR | Numero episodi | | `durata` | VARCHAR | Durata | | `trama` | VARCHAR | Sinossi | | `note_programmazione` / `note_sceneggiatura` | VARCHAR | Note | --- ## OTT — Catalogo streaming settimanale **Fonte:** `local_db/ott.db` (`I:\SOFTWARE\PYTHON_SRV\PYTHON_LOCAL\MyICR_Suite\local_db\ott.db`) | **Record:** 332.177 | **Chiave primaria:** `(mediaset_id, provider COLLATE NOCASE, tipo_finestra COLLATE NOCASE, data_inizio)` Mirror del file Excel settimanale Qlik/Marketing. Rimpiazzato completamente ad ogni import. Distribuito ai client via pull al boot (come i parquet). | Colonna | Tipo | Descrizione | |---------|------|-------------| | `mediaset_id` | VARCHAR(255) | ID Mediaset del titolo (es. `M_12345`) | | `titolo` | VARCHAR(255) | Titolo | | `tipo` | VARCHAR(255) | `movie` o `show` | | `imdb_id` | VARCHAR(255) | Codice IMDB (`'tt...'`) | | `anno` | VARCHAR(255) | Anno di produzione | | `nr_stagioni` | VARCHAR(255) | Numero stagioni | | `tot_episodi` | VARCHAR(255) | Totale episodi | | `provider` | VARCHAR(255) | Piattaforma (Netflix, Amazon Prime Video, Apple TV Plus, Apple TV+, Timvision, Disney Plus, ecc.) | | `tipo_finestra` | VARCHAR(255) | `SVOD`=subscription streaming, `EST`=electronic sell-through, `TVOD`=transactional, ecc. | | `monetization_type` | VARCHAR(255) | Tipo monetizzazione | | `data_inizio` | VARCHAR(255) | Data inizio disponibilità `YYYY-MM-DD` | | `data_fine` | VARCHAR(255) | Data fine disponibilità `YYYY-MM-DD` (vuoto = perpetuo) | | `regista` | VARCHAR(255) | Regista | | `generi` | VARCHAR(512) | Generi | | `paesi` | VARCHAR(255) | Paesi di produzione | > **Nota COLLATE NOCASE:** `provider` e `tipo_finestra` nella PK sono case-insensitive per allineamento con MS Access (es. "Chili" e "CHILI" = stesso record). --- ## OTT_EXT — Storico apparizioni OTT **Fonte:** `sync_db/linker.db` (`I:\SOFTWARE\PYTHON_SRV\sync_db\linker.db`) | **Record:** 148.253 | **Chiave primaria:** `(mediaset_id, provider COLLATE NOCASE)` Tabella append-only: registra la **prima data** in cui ogni coppia (mediaset_id, provider) è apparsa nel file settimanale Qlik. Non viene mai sovrascritto — solo aggiunto. | Colonna | Tipo | Descrizione | |---------|------|-------------| | `mediaset_id` | VARCHAR(255) | FK → `ott.mediaset_id` | | `provider` | VARCHAR(255) | FK → `ott.provider` | | `data_creazione` | VARCHAR(255) | Data prima apparizione `YYYY-MM-DD` — usata come "DATA IMPORTAZIONE" | | `segnalazioni_automatiche` | VARCHAR(255) | `SMONTATO` se finestra SVOD scaduta senza versione attiva, NULL altrimenti | | `budget` | VARCHAR(255) | Budget film (da IMDb Pro) | | `gross_world` | VARCHAR(255) | Incasso mondiale | | `gross_us_canada` | VARCHAR(255) | Incasso USA+Canada | | `production_company` | VARCHAR(255) | Casa di produzione | | `distributor` | VARCHAR(255) | Distributore | > **Logica filtro movie_filtrato:** usa `data_creazione >= cutoff` dove cutoff = 3ª data più recente in OTT_EXT (ultime 3 settimane di import). --- ## LINKER_REPOSITORY — Archivio titoli linkati **Fonte:** `sync_db/linker.db` | **Record:** 66.957 | **Chiave:** `(FORNITORE, TITOLO)` | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id` | INTEGER | PK autoincrement | | `FORNITORE` | VARCHAR(255) | Nome fornitore/listino (es. "PARAMOUNT 2024") | | `TITOLO` | VARCHAR(255) | Titolo come appare nel listino fornitore | | `TIPO_TITOLO` | VARCHAR(255) | `TO`=titolo originale, `TI`=titolo italiano | | `ANNO` | VARCHAR(255) | Anno | | `REGISTA` | VARCHAR(255) | Regista | | `RIFER` | VARCHAR(255) | = `prodotti.program_id` — aggancio al catalogo Mediaset | | `COD_IMDB` | VARCHAR(255) | Codice IMDB (`'tt...'`) | | `data_creazione` | VARCHAR(255) | Data inserimento | | `data_update` | VARCHAR(255) | Data ultimo aggiornamento | --- ## LINKER_VALUTAZIONE — Valutazioni ICR per listino **Fonte:** `sync_db/linker.db` | **Record:** 29.833 | Colonna | Tipo | Descrizione | |---------|------|-------------| | `COD_IMDB` | VARCHAR(255) | Codice IMDB — chiave di join | | `FORNITORE` | VARCHAR(255) | Nome fornitore/listino | | `DATA` | VARCHAR(255) | Data valutazione `YYYY-MM-DD` | | `C5`, `I1`, `R4`, `LA5`, `I2`, `IRIS`, `TOPCRIME`, `FOCUS`, `C20`, `CINE34`, `TWENTYSEVEN` | VARCHAR(255) | Punteggio ICR per rete | | `GEMSIN` | VARCHAR(255) | Punteggio Gemma sintetico | | `data_creazione` | VARCHAR(255) | Timestamp inserimento | --- ## COMPETITIVE_IMDB_MAP — Mapping titolo/distributore → IMDB **Fonte:** `sync_db/linker.db` | **Record:** 4.065 | **Chiave primaria:** `(TITOLO, DISTRIBUTORE)` Tabella di lookup usata nel modulo Linker per risolvere un codice IMDB dato il titolo esatto e il distributore, quando il match automatico non è disponibile. Popolata manualmente o da import listino. | Colonna | Tipo | Descrizione | |---------|------|-------------| | `TITOLO` | VARCHAR(255) PK | Titolo del film/prodotto (come appare nel listino fornitore) | | `DISTRIBUTORE` | VARCHAR(255) PK | Nome distributore/fornitore | | `IMDB_CODE` | VARCHAR(255) | Codice IMDB risolto (es. `tt1234567`) | | `data_update` | VARCHAR(255) | Data ultimo aggiornamento | > Join tipico: `COMPETITIVE_IMDB_MAP.IMDB_CODE → imdb_full.IMDB_CODICE` per arricchire un listino con i metadati IMDB. --- ## Relazioni tra domini — mappa join completa ```sql -- Prodotto con diritti attivi oggi SELECT p.program_id AS rifer, p.titolo_italiano, d.ragsoc_distr, d.decr, d.scad FROM prodotti p JOIN diritti d ON d.prod = p.prodotto AND d.ediz = p.edizione WHERE d.scad >= CURRENT_DATE AND d.decr <= CURRENT_DATE -- Prodotto con prima trasmissione su C5 SELECT p.program_id AS rifer, p.titolo_italiano, MIN(e.data_emissione) AS prima_tx FROM prodotti p JOIN emesso e ON e.prodotto = p.prodotto AND e.edizione = p.edizione WHERE e.rete = 'C5' AND e.prima_visione = 'S' GROUP BY p.program_id, p.titolo_italiano -- Prodotto → codice IMDB SELECT p.program_id AS rifer, i.riferimento_imdb AS imdb_code FROM prodotti p JOIN imdb i ON i.codice = p.prodotto -- Titolo OTT con dati catalogo Mediaset SELECT o.titolo, o.provider, o.data_inizio, p.program_id AS rifer FROM ott o JOIN imdb_full f ON f.IMDB_CODICE = o.imdb_id JOIN imdb i ON i.riferimento_imdb = o.imdb_id JOIN prodotti p ON p.prodotto = i.codice ``` --- ## MEDIATRACK.DB — Tracking acquisti mercati internazionali **File:** `sync_db/mediatrack.db` (server: `I:\SOFTWARE\PYTHON_SRV\sync_db\mediatrack.db`) **Descrizione:** Database del modulo MediaTrack — catalogo prodotti seguiti nei mercati internazionali (AFM, EFM, MIPCOM, ecc.) con log delle attività commerciali. --- ### AnagraficaMedia — Catalogo prodotti MediaTrack **Record:** ~51.292 | **PK:** `id_media` (TEXT) | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id_media` | TEXT PK | Identificativo prodotto. Formato `G_XXXXX` per prodotti da Gemma (51.040 su 51.292), `TIPO-timestamp` per inserimenti manuali da mercato (es. `FILM-1763656380241`) | | `titolo_ufficiale` | TEXT | Titolo del prodotto | | `tipo` | TEXT | Sempre MAIUSCOLO: `FILM`, `DOCUMENTARIO`, `FILM-DOCUMENTARIO`, `TELEFILM`, `MINISERIE`, `CORTOMETRAGGIO` | | `distributore_nome` | TEXT | Nome distributore internazionale | | `codice_imdb` | TEXT | Codice IMDB (es. `tt1234567`) — link verso `imdb_full` | | `budget_produzione` | TEXT | Budget di produzione (testuale, può contenere valuta) | | `ultimo_asking_ita` | TEXT | Ultimo prezzo richiesto mercato italiano | | `ultimo_asking_spa` | TEXT | Ultimo prezzo richiesto mercato spagnolo | | `imdb_search_status` | INTEGER | Stato ricerca OMDB: 0=non cercato, 1=trovato, 2=non trovato | | `data_ultimo_controllo_imdb` | TEXT | Data ultimo aggiornamento dati OMDB (ISO 'YYYY-MM-DD') | | `piattaforma` | TEXT | Piattaforma target (es. `Canale 5`, `Italia 1`, `Netflix`) | | `formato` | TEXT | Formato produzione (es. `Feature Film`, `Series`) | | `is_offline_insert` | INTEGER | 1 = inserito in modalità offline (mercato senza connessione) | | `anno_produzione` | TEXT | Anno di produzione | | `durata` | TEXT | Durata in minuti (testuale) | | `paesi` | TEXT | Paesi di produzione | | `generi` | TEXT | Generi (stringa libera) | | `registi` | TEXT | Registi | | `attori` | TEXT | Cast principale | | `trama` | TEXT | Sinossi | | `updated_at` | TEXT | Data/ora ultima modifica (ISO timestamp) | | `updated_by` | TEXT | Username chi ha modificato | | `deleted_at` | TEXT | Data soft-delete (NULL = attivo) | **Join con Gemma:** `AnagraficaMedia.id_media = 'G_' || gemma.A_ID` Per fare il join inverso: `REPLACE(id_media, 'G_', '') = gemma.A_ID` (solo per record con prefisso `G_`). --- ### LogAggiornamenti — Storico attività commerciali **Record:** ~517 | **PK:** `id_aggiornamento` (INTEGER) | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id_aggiornamento` | INTEGER PK | ID auto-increment | | `id_media_fk` | TEXT | → `AnagraficaMedia.id_media` | | `id_distributore_fk` | INTEGER | → `Distributori.id_distributore` | | `id_tipo_evento_fk` | INTEGER NOT NULL | → `TipiEvento.id_tipo_evento` | | `data_evento` | TEXT | Data dell'evento (ISO 'YYYY-MM-DD') | | `dettaglio_contesto` | TEXT | Contesto (mercato, festival, ecc.) — valore libero o da `Contesti.nome` | | `costo_richiesto_ita` | REAL | Prezzo asking mercato Italia | | `costo_richiesto_spa` | REAL | Prezzo asking mercato Spagna | | `note` | TEXT | Note testuali libere | | `percorso_file` | TEXT | Path file allegato | | `buyer_contatto` | TEXT | Nome contatto acquirente | | `budget_produzione` | REAL | Budget produzione (numerico) | | `data_reminder` | TEXT | Data promemoria follow-up (ISO 'YYYY-MM-DD') | | `preferito` | INTEGER | 1 = titolo preferito/segnalato | | `venduto_a` | TEXT | A chi è stato venduto (per tipo evento Venduto) | | `privato` | INTEGER | 1 = nota privata | | `created_by` | INTEGER | → `Users.id_user` | | `delivery` | TEXT | Info delivery/consegna | | `links` | TEXT | URL allegati (JSON array o stringa) | --- ### OmdbData — Dati OMDB/IMDB arricchiti **Record:** ~15.543 | **PK:** `id_media_fk` (relazione 1:1 con `AnagraficaMedia`) | Colonna | Tipo | Descrizione | |---------|------|-------------| | `id_media_fk` | TEXT PK | → `AnagraficaMedia.id_media` | | `codice_imdb` | TEXT | Codice IMDB (es. `tt1234567`) — ridondante con `AnagraficaMedia.codice_imdb` | | `titolo_omdb` | TEXT | Titolo originale da OMDB | | `sinossi` | TEXT | Trama da OMDB | | `anno_produzione` | TEXT | Anno da OMDB | | `data_rilascio` | TEXT | Data rilascio (formato USA da OMDB, es. `01 Jan 2023`) | | `durata` | TEXT | Durata da OMDB (es. `115 min`) | | `generi` | TEXT | Generi da OMDB (es. `Drama, Thriller`) | | `registi` | TEXT | Registi da OMDB | | `sceneggiatori` | TEXT | Sceneggiatori da OMDB | | `attori` | TEXT | Cast da OMDB | | `lingue` | TEXT | Lingue del film | | `paesi` | TEXT | Paesi di produzione da OMDB | | `premi` | TEXT | Premi e nomination (testo libero OMDB) | | `url_poster` | TEXT | URL poster OMDB | | `metascore` | TEXT | Punteggio Metacritic (testuale, `'N/A'` se assente) | | `imdb_rating` | TEXT | Rating IMDB (testuale, `'N/A'` se assente) | | `imdb_voti` | TEXT | Numero voti IMDB (testuale con virgole, es. `'123,456'`) | | `box_office` | TEXT | Incasso USA (testuale OMDB) | | `produzione` | TEXT | Casa di produzione | | `scaricato_il` | TIMESTAMP | Data/ora download dati OMDB | --- ### TipiEvento — Catalogo tipi di evento commerciale **Record:** 8 | **PK:** `id_tipo_evento` | ID | Nome | Descrizione | |----|------|-------------| | 1 | Mercato | Partecipazione a mercato/festival — ha campi costo_ita, costo_spa, buyer_contatto | | 3 | Sceneggiatura | Lettura/valutazione sceneggiatura | | 7 | Venduto | Prodotto venduto — ha campo venduto_a | | 8 | Note | Nota generica | | 9 | CUSTOM | Evento personalizzato | | 10 | Test | Test (uso interno) | | 11 | Line-up | Inserimento in line-up di programmazione | | 12 | Holdback | Blocco/holdback contrattuale | --- ### Contesti — Mercati e festival **Record:** 5 | **PK:** `id_contesto` | ID | Nome | Gemma_supporto | |----|------|---------------| | 1 | AFM 2025 | AFM 2025 | | 2 | EFM 2026 | EFM 2026 | | 3 | MIPCOM 2025 | Mipcom2025 | | 4 | CFF 2026 | MARCHE26 | | 5 | INFO DA ACQUISTI | (nessun mercato Gemma associato) | `gemma_supporto` è il valore corrispondente in `gemma.A_SUPPORTO` per filtrare i titoli presentati allo stesso mercato. --- ### Distributori — Anagrafica distributori internazionali **Record:** 36 | **PK:** `id_distributore` Contiene: `nome`, `nome_completo`, `paese`, `sito_web`, `email`, `telefono`, `persona_contatto`, `stato_rapporto`, `ultimo_contatto`, `note`. --- ### SessioniImport — Sessioni di import da listino mercato **Record:** 4 | **PK:** `id_sessione` (TEXT UUID) Contiene: `nome_mercato`, `data_mercato`, `tipo_import`, `stato`, `prodotti_inseriti`, `data_creazione`, `data_ultima_modifica`. --- ### Query di esempio — MediaTrack ```sql -- Prodotti visti a MIPCOM 2025 con rating IMDB SELECT a.titolo_ufficiale, a.tipo, a.anno_produzione, o.imdb_rating, o.metascore, l.costo_richiesto_ita FROM AnagraficaMedia a JOIN LogAggiornamenti l ON l.id_media_fk = a.id_media LEFT JOIN OmdbData o ON o.id_media_fk = a.id_media WHERE l.dettaglio_contesto = 'MIPCOM 2025' AND l.id_tipo_evento_fk = 1 -- Mercato -- Prodotti MediaTrack non ancora in Gemma (inseriti da mercato offline) SELECT a.id_media, a.titolo_ufficiale, a.tipo FROM AnagraficaMedia a WHERE a.id_media NOT LIKE 'G_%' AND a.deleted_at IS NULL -- Join MediaTrack ↔ Gemma ↔ diritti Mediaset SELECT a.titolo_ufficiale, a.tipo, g.A_ACQUISTATO_VENDUTO, d.decr, d.scad, d.ragsoc_distr FROM AnagraficaMedia a JOIN gemma g ON g.A_ID = REPLACE(a.id_media, 'G_', '') JOIN imdb im ON im.riferimento_imdb = a.codice_imdb JOIN prodotti p ON p.prodotto = im.codice JOIN diritti d ON d.prod = p.prodotto AND d.ediz = p.edizione WHERE a.id_media LIKE 'G_%' AND a.deleted_at IS NULL -- Prodotti MediaTrack con reminder imminente SELECT a.titolo_ufficiale, l.data_reminder, l.note, l.buyer_contatto FROM AnagraficaMedia a JOIN LogAggiornamenti l ON l.id_media_fk = a.id_media WHERE l.data_reminder IS NOT NULL AND l.data_reminder >= date('now') ORDER BY l.data_reminder ``` --- ## Ambiguità e gotcha noti | # | Ambiguità | Dettaglio | |---|-----------|-----------| | 1 | **RIFER vs prodotto** | `prodotti.program_id` = RIFER (VARCHAR). `prodotti.prodotto` = ID numerico interno. Due chiavi diverse per lo stesso prodotto. Nelle query NL l'utente dirà "RIFER ANA00101" = `program_id`. | | 2 | **emesso.data_emissione è VARCHAR** | Non DATE. Per confronti usare stringhe ISO `'YYYY-MM-DD'`. | | 3 | **Stesso prodotto con più edizioni** | `(prodotto, edizione)` è la PK di prodotti. Diritti e emesso usano entrambe le colonne. Un prodotto può avere diritti diversi per edizioni diverse. | | 4 | **ora_inizio > 86400** | Trasmissioni a cavallo della mezzanotte. Convertire con `ora_inizio % 86400`. | | 5 | **diritti solo FREE/DVB-T** | Nessun diritto pay-TV o streaming. Per contenuti OTT usare `ott` e `ott_ext`. | | 6 | **OTT provider case-insensitive** | "Chili" e "CHILI" sono lo stesso provider — gestito con COLLATE NOCASE nella PK. | | 7 | **gemma.A_C5 è stringa `'0'/'1'`** | Non INTEGER booleano. Filtrare con `= '1'`. | | 8 | **fascia NULL in emesso** | ~2,1M record senza fascia (24% del totale). Non assumere che tutti i record abbiano fascia. | | 9 | **tipologia in prodotti ≠ tipologia in emesso** | Due colonne diverse con lo stesso nome. `prodotti.tipologia` = tipo contenuto (FILM, TELEFILM...). `emesso.tipologia` = tipo emissione. | | 10 | **scelte_rete.prodotto senza edizione** | Join solo su `prodotto`, non su `(prodotto, edizione)`. Per prodotti multi-edizione potrebbe matchare più edizioni. | | 11 | **superserie_id 0 vs NULL** | Alcuni prodotti hanno `superserie_id = 0` invece di NULL. Verificare entrambi. | | 12 | **OTT_EXT data_creazione** | Non è la data di uscita del titolo, ma la data in cui il titolo è apparso per la prima volta nel file settimanale Qlik. Usata per filtrare "titoli nuovi delle ultime N settimane". | | 13 | **AnagraficaMedia.id_media formato doppio** | 51.040/51.292 record hanno prefisso `G_` (da Gemma): `G_XXXXX` dove XXXXX = `gemma.A_ID`. I restanti 252 sono inserimenti manuali da mercato con formato `TIPO-timestamp` (es. `FILM-1763656380241`). Il join con Gemma funziona solo per i record `G_`. | | 14 | **OmdbData rating/voti sono TEXT** | `imdb_rating`, `metascore`, `imdb_voti` sono stringhe, non numeri. Possono valere `'N/A'`. Castare con `CAST(... AS REAL)` e gestire NULL/N/A prima di ordinare. | | 15 | **LogAggiornamenti.dettaglio_contesto** | Campo testo libero — non è una FK verso `Contesti`. Può contenere il `Contesti.nome` oppure un valore diverso. Non fare JOIN diretto. | | 16 | **mediatrack.db è sincronizzato da server** | La copia locale viene aggiornata al boot da `I:\SOFTWARE\PYTHON_SRV\sync_db\mediatrack.db`. Il server vince sui record esistenti; solo i record nuovi in locale vengono preservati. |