Il dizionario del dump
103 tabelle · piattaforma v2.43.1 · cosa c'è dentro db.sql.gz di un backup.
Ogni backup contiene db.sql.gz: il dump mysqldump del database della società, MySQL 8, UTF-8 (utf8mb4). Si ricarica in qualunque MySQL con gunzip -c db.sql.gz | mysql <database>. È il formato fedele — tutto, compresi permessi e impostazioni — ma è il nostro, e cambia a ogni release: per portare i dati altrove si usa il pacchetto dati aperto, che sta nella stessa cartella. Questo dizionario serve a chi il dump lo deve leggere lo stesso.
Le date/ore sono in UTC. I campi pwd, uid e i token sono credenziali: non vanno riutilizzati altrove. Le tabelle _prisma_migrations e quelle con token nel nome sono interne.
athletes
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
firstName | String (obbl.) | |
lastName | String (obbl.) | |
dateOfBirth | DateTime (obbl.) | |
birthPlace | String | |
birthProvince | String | |
nationality | String | default "Italiana" |
taxCode | String | |
gender | athletes_gender
M F | |
medicalExpiry | DateTime | |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
photo | String | |
liberatoria_immagini_ritirata_il | DateTime | La famiglia ha ritirato la liberatoria per le immagini: da questa data le foto in cui l'atleta e' ritratto spariscono dalla galleria (vedi foto_attivita). |
consent_privacy_ok | Boolean (obbl.) | I FLAG DI CONSENSO (PRM-01): derivati, mai scritti a mano — li ricalcola `FlagConsensoService` dall'ultima accettazione corrente e dalle revoche successive. Le funzionalita' li leggono, non li impostano. default false |
consent_parental_ok | Boolean (obbl.) | default false |
image_internal_ok | Boolean (obbl.) | Immagini di attivita' (galleria della squadra) — consenso, decisione #3. default false |
image_public_ok | Boolean (obbl.) | Diffusione esterna (sito, social, stampe) — consenso distinto, decisione #3. default false |
messaging_whatsapp_ok | Boolean (obbl.) | default false |
messaging_telegram_ok | Boolean (obbl.) | default false |
consent_flags_updated_at | DateTime | |
figcCard | String | |
matricola | String | |
residenceCity | String | |
residenceProvince | String | |
email | String | |
phone | String | |
codeunico | String (obbl.) | |
address | String | |
birthCity | String | |
postalCode | String | |
notes | String | |
active | Boolean | default true |
category_id | Int | |
category_locked | Boolean | deroga: categoria impostata a mano, "Applica" non la sovrascrive default false |
tessera_date | DateTime | |
tessera_expiry | DateTime | Deroga alla durata di società: scadenza tessera impostata a mano per questo atleta (alcune categorie hanno regole proprie). |
pratica_inviata_at | DateTime | Pratica di tesseramento conclusa e inviata alla federazione: il tesserino non è ancora arrivato. Stato intermedio legittimo, non blocca nulla. |
prestito_da | String | PRESTITO da un'altra società: l'atleta è tesserato altrove e gioca da noi con il nulla osta agli atti. |
prestito_dal | DateTime | |
prestito_al | DateTime | |
prestito_stessa_federazione | Boolean | Se il prestito viene da una società della NOSTRA federazione. NULL = non dichiarato, e vale come «altra»: davanti a un dubbio sul titolo si sta dalla parte prudente. |
deroga_verso | String | DEROGA sul singolo atleta, nei due versi: CONSENTI (la sua scala sostituisce il verdetto) | BLOCCA (si aggiunge, vince la più severa). |
deroga_scala | String | |
deroga_motivo | String | Obbligatorio nell'interfaccia: una deroga senza motivo, fra sei mesi, è un atleta fermo e nessuno che sappia perché. |
deroga_da | String | |
deroga_at | DateTime | |
nulla_osta_path | String | Il nulla osta è allegato allo stato di prestito, non al catalogo documenti del club (riguarda un atleta solo). |
nulla_osta_name | String | |
nulla_osta_date | DateTime | |
archived_at | DateTime | |
archived_reason | String | |
createdByUserId | BigInt | |
parentId | BigInt | |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
dati_cancellati_il | DateTime | Da questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts). |
uidunico | String | |
pwd | String | |
telegram_username | String | |
telegram_chat_id | String | |
attendance
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
event_id | Int (obbl.) | |
athlete_id | BigInt (obbl.) | |
status | attendance_status
present absent late | default present |
notes | String | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
coaches
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
firstName | String (obbl.) | |
lastName | String (obbl.) | |
emailunico | String (obbl.) | |
phone | String | |
photo | String | |
license | String | |
specialization | coaches_specialization
ALLENATORE_GENERALE PORTIERI DIFENSORI CENTROCAMPISTI ATTACCANTI | |
active | Boolean | default true |
createdByUserId | BigInt | |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
dati_cancellati_il | DateTime | Da questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts). |
uidunico | String | |
pwd | String | |
telegram_username | String | |
telegram_chat_id | String | |
directors
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
firstName | String (obbl.) | |
lastName | String (obbl.) | |
emailunico | String (obbl.) | |
phone | String | |
photo | String | |
role | directors_role
DIRETTORE_SPORTIVO DIRIGENTE ACCOMPAGNATORE | default DIRIGENTE |
active | Boolean | default true |
createdByUserId | BigInt | |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
dati_cancellati_il | DateTime | Da questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts). |
uidunico | String | |
pwd | String | |
telegram_username | String | |
telegram_chat_id | String | |
documents
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
athlete_id | BigInt | |
name | String (obbl.) | |
type | String (obbl.) | |
file_path | String (obbl.) | |
file_size | Int | |
mime_type | String | |
expiry_date | DateTime | |
uploaded_at | DateTime | default now( |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
scope | String | default "ATHLETE" |
team_id | BigInt | |
events
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
title | String (obbl.) | |
description | String | |
date | DateTime (obbl.) | |
time | DateTime | |
location | String | |
team_id | BigInt | |
type | String | default "training" |
visibility | String (obbl.) | "public" = visibile a genitori/atleti dei team coinvolti; "internal" = solo staff/admin. Governa soprattutto gli eventi senza squadra (riunioni). Vedi events.service. default "public" |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
facilities
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
name | String (obbl.) | |
address | String | |
city | String | |
province | String | |
postal_code | String | |
phone | String | |
email | String | |
capacity | Int | |
notes | String | |
societa | String | |
campo | Int | |
ora | DateTime | |
active | Boolean | default true |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
invitations
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
event_id | Int (obbl.) | |
athlete_id | BigInt (obbl.) | |
status | invitations_status
pending accepted declined | default pending |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
parent_athletes
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
parentId | BigInt (obbl.) | |
athleteId | BigInt (obbl.) | |
relationship | parent_athletes_relationship
PADRE MADRE TUTORE NONNO NONNA ZIO ZIA ALTRO | default PADRE |
isPrimaryContact | Boolean | default false |
canPickup | Boolean | default true |
emergencyContact | Boolean | default false |
createdAt | DateTime | default now( |
active | Boolean | default true |
parents
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
firstName | String (obbl.) | |
lastName | String (obbl.) | |
emailunico | String (obbl.) | |
phone | String | |
address | String | |
city | String | |
province | String | |
postalCode | String | |
fiscalCode | String | |
relationship | parents_relationship
PADRE MADRE TUTORE NONNO NONNA ZIO ZIA ALTRO | default PADRE |
active | Boolean | default true |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
telegram_username | String | |
telegram_chat_id | String | |
dati_cancellati_il | DateTime | Da questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts). |
uidunico | String | |
pwd | String | |
ruoli
Catalogo ruoli di gioco (parametrizzato; CRUD catalogo solo via DB).
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
codeunico | String (obbl.) | |
label | String (obbl.) | |
sortOrder | Int (obbl.) | default 0 |
active | Boolean (obbl.) | default true |
team_players
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
teamId | BigInt (obbl.) | |
athleteId | BigInt (obbl.) | |
position | String | |
ruoloId | Int | |
jerseyNumber | Int | |
active | Boolean | default true |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
team_staff
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
teamId | BigInt (obbl.) | |
staffId | BigInt (obbl.) | |
staffType | team_staff_staffType (obbl.)
COACH DIRECTOR SPORT_DIRECTOR | |
role | String | |
active | Boolean | default true |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
teams
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
name | String (obbl.) | |
category | String (obbl.) | |
season | String (obbl.) | |
struttura_id | Int | |
active | Boolean | default true |
convocation_mode | team_convocation_mode
ALL_CONVOCATED MANUAL_SELECTION | default MANUAL_SELECTION |
ritrovo_minuti_prima | Int | Ritrovo: quanti minuti prima dell'inizio. NULL = non impostato (il messaggio non scrive la riga). La singola partita puo' scavalcarlo. |
non_convocati_al_campo | String (obbl.) | Cosa fa chi NON e' convocato: VIENE | NON_VIENE | DECIDE_ALLENATORE | NON_SPECIFICATO. Lo stabilisce chi guida la squadra, non la piattaforma. default "NON_SPECIFICATO" |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
training_attendance
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
trainingId | BigInt (obbl.) | |
athleteId | BigInt (obbl.) | |
status | training_attendance_status
present absent late excused | default present |
arrivalTime | DateTime | |
notes | String | |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
training_exceptions
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
teamId | BigInt (obbl.) | |
exceptionDate | DateTime (obbl.) | |
reason | String | |
isHoliday | Boolean | default false |
createdAt | DateTime | default now( |
training_templates
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
teamId | BigInt (obbl.) | |
title | String (obbl.) | |
description | String | |
dayOfWeek | training_templates_dayOfWeek (obbl.)
monday tuesday wednesday thursday friday saturday sunday | |
startTime | DateTime (obbl.) | |
duration | Int | default 90 |
location | String | |
coachId | BigInt | |
isActive | Boolean | default true |
impiantoId | Int | |
campoId | Int | Dove si svolge la regola, non solo il singolo allenamento: senza campo e quota il motore non ha niente da verificare, e la generazione non colloca. |
quota | Int | |
agioPrima | Int (obbl.) | default 0 |
agioDopo | Int (obbl.) | default 0 |
motivoAgio | String | |
validoDa | DateTime | Il periodo in cui la regola vale. NULL = sempre. |
validoA | DateTime | |
serieId | BigInt | I periodi nati dallo stesso taglio condividono la serie. |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
trainings
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
teamId | BigInt (obbl.) | |
templateId | BigInt | |
title | String (obbl.) | |
description | String | |
scheduledDate | DateTime (obbl.) | |
duration | Int | default 90 |
location | String | |
coachId | BigInt | |
status | trainings_status
scheduled completed cancelled | default scheduled |
cancelReason | String | |
cancelledAt | DateTime | |
cancelledBy | BigInt | |
impiantoId | Int | Dove si svolge: campo, quanta parte, e l'agio sullo spogliatoio. Sono colonne dell'allenamento e non una tabella a parte perche' l'occupazione e' un attributo dell'evento, non un oggetto a se'. L'impianto: un riferimento vero, non piu' il testo di `location`. |
campoId | Int | |
quota | Int | |
agioPrima | Int (obbl.) | default 0 |
agioDopo | Int (obbl.) | default 0 |
motivoAgio | String | |
spogliatoiForzati | String | |
presenze_registrate_at | DateTime | Quando lo staff ha salvato le presenze: le righe nascono gia' «presenti», quindi solo questa data dice se qualcuno le ha guardate davvero. |
notes | String | |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
risorse_impianti
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nome | String (obbl.) | |
indirizzo | String | |
apertura | Int (obbl.) | Minuti da mezzanotte: un orario da orologio, non un istante. default 840 |
chiusura | Int (obbl.) | default 1380 |
note | String | |
struttura_id | Int | |
attivo | Boolean (obbl.) | default true |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
risorse_campi
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
impianto_id | Int (obbl.) | |
nome | String (obbl.) | |
tipo | String | |
superficie | String | |
frazioni | Int (obbl.) | Divisibilita' MASSIMA, non una partizione fissa. default 1 |
illuminato | Boolean (obbl.) | default false |
riassetto_min | Int (obbl.) | default 10 |
note | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
risorse_spogliatoi
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
impianto_id | Int (obbl.) | |
nome | String (obbl.) | |
capienza | Int (obbl.) | Capienza in SQUADRE, non in persone. default 1 |
escluso | Boolean (obbl.) | default false |
note | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
risorse_parametri_categoria
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
categoriaunico | String (obbl.) | |
frazioni_allenamento | Int (obbl.) | default 0 |
frazioni_partita | Int (obbl.) | default 0 |
spogliatoio_prima_allenamento | Int (obbl.) | default 30 |
spogliatoio_dopo_allenamento | Int (obbl.) | default 45 |
spogliatoio_prima_partita | Int (obbl.) | default 60 |
spogliatoio_dopo_partita | Int (obbl.) | default 45 |
riassetto_allenamento | Int (obbl.) | default 10 |
riassetto_partita | Int (obbl.) | default 15 |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
risorse_parametri_squadra
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
team_idunico | BigInt (obbl.) | |
ore_previste | Decimal (obbl.) | default 3.0 |
spogliatoi_abituali | String | |
genere_forzato | risorse_parametri_squadra_genere
M F MISTA | Esiste perche' `athletes.gender` e' quasi sempre vuoto: finche' e' cosi' il genere si dichiara qui, e resta scritto che e' stato messo a mano. |
override_parametri | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
risorse_occupazioni
Occupazioni SENZA un evento dietro: manutenzione, tornei, terzi.
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
campo_id | Int (obbl.) | |
giorno | DateTime (obbl.) | |
inizio | Int (obbl.) | |
durata | Int (obbl.) | |
quota | Int (obbl.) | default 1 |
etichetta | String (obbl.) | |
note | String | |
created_by | BigInt | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
users
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
emailunico | String (obbl.) | |
password | String (obbl.) | |
firstName | String (obbl.) | |
lastName | String (obbl.) | |
role | String | default "USER" |
active | Boolean | default true |
createdAt | DateTime | default now( |
updatedAt | DateTime | default now( |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
uid | String | |
pwd | String | |
recovery_email | String | Indirizzo di RECUPERO: non fa login, riceve il promemoria dell'email principale e il link per rifare la password (vedi 20260904160000_utenti_staff). |
phone | String | |
invited_at | DateTime | |
last_login_at | DateTime | |
device_tokens
Cambio dell'email principale in due passi: il nuovo indirizzo deve confermare, il vecchio e quello di recupero vengono avvisati. Fino alla conferma si entra ancora con l'email di prima. I telefoni a cui mandare le notifiche push. Un telefono non e' un utente: la stessa persona ne puo' avere due, e lo stesso telefono passa di mano (logout, altro accesso). Per questo la riga e' il TOKEN, e chi lo possiede si legge dall'identita' del momento — la coppia (`user_type`, `user_id`) e' la stessa che sta nel JWT (`userType`, `originalId`): ATHLETE → athletes.id, PARENT → parents.id, COACH → coaches.id, DIRECTOR → directors.id, ADMIN → users.id. Niente chiave esterna: cinque tabelle diverse, e un token orfano si toglie da solo al primo invio.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_type | String (obbl.) | |
user_id | BigInt (obbl.) | |
tokenunico | String (obbl.) | |
piattaforma | String (obbl.) | 'ios' | 'android' |
versione_app | String | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
visto_at | DateTime | L'ultima volta che il telefono si e' fatto vivo (accesso o refresh del token). default now( |
push_promemoria
I promemoria push gia' mandati, per non mandarli due volte. Il cron passa ogni dieci minuti e guarda una finestra piu' larga del suo passo, cosi' un riavvio del server non salta nessun allenamento; il prezzo e' che lo stesso allenamento ricade in due passaggi. Questa tabella e' la memoria: (`tipo`, `riferimento_id`) si scrive una volta sola.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
tipo | String (obbl.) | 'ALLENAMENTO_2H' (riferimento = trainings.id) · 'CONVOCAZIONE_48H' (riferimento = convocazioni.id) |
riferimento_id | BigInt (obbl.) | |
inviato_at | DateTime | default now( |
note_attivita
Le note vocali dello staff su un allenamento o una partita, trascritte. Una nota appartiene a UN'attivita': `tipo_attivita` ('ALLENAMENTO' → trainings.id, 'PARTITA' → partite.id) piu' `attivita_id`. `team_id` e' copiato alla creazione per elencare le note di una squadra senza unire le due tabelle. L'autore e' la coppia del JWT (`userType`, `originalId`) come in `device_tokens`, e il nome e' fotografato: la nota deve dire chi l'ha scritta anche quando quella persona non e' piu' nella societa'. L'audio sta in `storage/<club>/note-audio/`: qui solo il nome del file.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
tipo_attivita | String (obbl.) | |
attivita_id | BigInt (obbl.) | |
team_id | BigInt | |
autore_tipo | String (obbl.) | |
autore_id | BigInt (obbl.) | |
autore_nome | String (obbl.) | |
testo | String | |
audio_path | String | |
audio_mime | String | |
durata_sec | Int | |
created_at | DateTime | default now( |
avvisi
La bacheca della societa': un avviso scritto dallo staff e letto da tutti quelli che entrano. `team_id` NULL = a tutta la societa'. Non si cancella, si ritira (`ritirato_at`). Vedi la migrazione `bacheca_avvisi`.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
titolo | String (obbl.) | |
testo | String (obbl.) | |
team_id | BigInt | |
autore_tipo | String (obbl.) | |
autore_id | BigInt (obbl.) | |
autore_nome | String (obbl.) | |
created_at | DateTime | default now( |
ritirato_at | DateTime | |
avvisi_letture
Chi ha letto quale avviso, come coppia del JWT (tipo + id).
| Colonna | Tipo | Note |
|---|
avviso_id | BigInt (obbl.) | |
lettore_tipo | String (obbl.) | |
lettore_id | BigInt (obbl.) | |
letto_at | DateTime | default now( |
email_change_tokens
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_id | BigInt (obbl.) | |
new_email | String (obbl.) | |
token_hash | String (obbl.) | |
expires_at | DateTime (obbl.) | |
confirmed_at | DateTime | |
cancelled_at | DateTime | |
created_at | DateTime | default now( |
permission_overrides
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
role | String (obbl.) | |
resource | String (obbl.) | |
action | String (obbl.) | |
context | permission_context (obbl.)
PUBLIC ALL TEAM OWN | default ALL |
enabled | Boolean | default true |
created_by | BigInt | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
permission_audit_log
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_id | BigInt (obbl.) | |
action | String (obbl.) | |
role | String (obbl.) | |
resource | String | |
action_type | String | |
old_value | String | |
new_value | String | |
description | String | |
created_at | DateTime | default now( |
permission_versions
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
version_nameunico | String (obbl.) | |
description | String | |
permissions | String (obbl.) | |
created_by | BigInt | |
created_at | DateTime | default now( |
is_active | Boolean | default false |
password_reset_tokens
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_id | BigInt | |
user_type | String | 'USER', 'ATHLETE', 'COACH', 'DIRECTOR', 'PARENT' |
athlete_id | BigInt | |
coach_id | BigInt | |
director_id | BigInt | |
parent_id | BigInt | |
token_hash | String (obbl.) | |
expires_at | DateTime (obbl.) | |
used_at | DateTime | |
created_at | DateTime (obbl.) | default now( |
campionati
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nome | String (obbl.) | |
stagione | String (obbl.) | |
categoria | String | |
livello | campionati_livello (obbl.)
regionale provinciale nazionale internazionale | |
girone | String (obbl.) | Legacy: prima dei gironi in tabella `gironi`. Non usare per logica nuova. default "" |
formato | campionati_formato (obbl.)
CINQUE SETTE NOVE UNDICI | |
num_tempi | Int (obbl.) | default 2 |
minuti_per_tempo | Int (obbl.) | default 45 |
regola_risultato | campionati_regola_risultato (obbl.)
per_tempo totale_gol | default totale_gol |
is_attivo | Boolean | default true |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
categories
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nameunico | String (obbl.) | |
description | String | |
age_min | Int | |
age_max | Int | |
is_active | Boolean | default true |
sort_order | Int | default 0 |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
classifiche
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
campionato_id | Int | |
torneo_id | Int | |
girone_id | Int | |
squadra_id | BigInt (obbl.) | |
partite_giocate | Int | default 0 |
partite_vinte | Int | default 0 |
partite_pareggiate | Int | default 0 |
partite_perse | Int | default 0 |
gol_fatti | Int | default 0 |
gol_subiti | Int | default 0 |
differenza_gol | Int | default 0 |
punti | Int | default 0 |
posizione | Int | default 0 |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
utente_id | BigInt (obbl.) | |
testo | String (obbl.) | |
is_live | Boolean | default false |
tempo_numero | Int | |
minuto | Int | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
composizioni_tattiche
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
tempo_numero | Int (obbl.) | |
difesa | Int (obbl.) | |
centrocampo | Int (obbl.) | |
attacco | Int (obbl.) | |
note | String | |
created_at | DateTime | default now( |
convocation_notifications
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
athlete_id | BigInt (obbl.) | |
parent_id | BigInt | |
status | convocation_notifications_status (obbl.)
convocato non_convocato | |
message | String | |
channels | String | |
sent_at | DateTime | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
convocazioni
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
atleta_id | Int (obbl.) | |
convocato | Boolean | default false |
formazione | convocazioni_formazione
titolare riserva | |
disponibilita | convocazioni_disponibilita
SI NO DA_CONFERMARE | default DA_CONFERMARE |
numero_maglia | Int | |
ruolo | String | |
ruoloId | Int | |
note | String | |
forzata | Boolean (obbl.) | Convocato pur senza certificato medico valido: gesto esplicito, non distrazione. La traccia serve alla segreteria per sapere quali certificati inseguire. default false |
forzata_motivo | String | |
forzata_da | String | |
forzata_at | DateTime | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
eventi_partita
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
tempo_numero | Int (obbl.) | |
minuto | Int (obbl.) | |
tipo | eventi_partita_tipo (obbl.)
gol ammonizione espulsione sostituzione rigore autogol nota | |
gol_fatto | Boolean | default true |
atleta_coinvolto_id | BigInt | |
atleta_secondario_id | BigInt | |
numero_maglia | Int | |
minuti_giocati | Int | |
dettagli | String | |
osservazioni | String | |
punizione | eventi_partita_punizione
rigore calcio_di_rigore calcio_di_punizione calcio_d_angolo rimessa_laterale | |
esito_rigore | eventi_partita_esito_rigore
gol parato fuori palo | |
created_at | DateTime | default now( |
created_by | BigInt (obbl.) | |
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
atleta_id | BigInt (obbl.) | |
numero_maglia | Int (obbl.) | |
ruoloId | Int (obbl.) | |
status | formazioni_status (obbl.)
titolare panchina | |
posizione_campo | formazioni_posizione_campo
portiere terzino_dx terzino_sx centrale_dx centrale_sx mediano trequartista ala_dx ala_sx centravanti seconda_punta | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
gironi
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
torneo_id | Int | |
campionato_id | Int | |
nome | String (obbl.) | |
ordine | Int (obbl.) | |
is_attivo | Boolean | default true |
created_at | DateTime | default now( |
squadre_campionati_iscrizioni
Iscrizione ufficiale di una squadra società a un campionato (per stagione). Al più una riga per (team, campionato, stagione).
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
team_id | BigInt (obbl.) | |
campionato_id | Int (obbl.) | |
stagione | String (obbl.) | |
girone_id | Int | |
formato | campionati_formato
CINQUE SETTE NOVE UNDICI | |
num_tempi | Int | |
minuti_per_tempo | Int | |
regola_risultato | campionati_regola_risultato
per_tempo totale_gol | |
is_attivo | Boolean | default true |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
utente_id | BigInt (obbl.) | |
tipo | media_partita_tipo (obbl.)
foto video link_streaming | |
url | String (obbl.) | |
titolo | String | |
descrizione | String | |
is_principale | Boolean | default false |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
notification_group_members
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
group_id | Int (obbl.) | |
user_id | BigInt | |
athlete_id | BigInt | |
email | String | |
telegram_chat_id | String | |
phone | String | |
created_at | DateTime | default now( |
notification_groups
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
name | String (obbl.) | |
description | String | |
type | notification_groups_type
custom system | default custom |
created_by | BigInt | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
notification_history
This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
type | notification_history_type (obbl.)
email telegram both | |
template_id | Int | |
subject | String | |
message | String | |
recipients_count | Int | default 0 |
recipients_data | String | |
status | notification_history_status
sent failed partial | default sent |
sent_by | BigInt | |
sent_at | DateTime | default now( |
error_message | String | |
notification_templates
This model or at least one of its fields has comments in the database, and requires an additional setup for migrations: Read more: https://pris.ly/d/database-comments
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
name | String (obbl.) | |
description | String | |
category | notification_templates_category
convocation non_convocation document_expiry training_reminder match_update general | default general |
subject | String | |
message_text | String | |
message_html | String | |
telegram_message | String | |
channel_type | notification_templates_channel_type
email telegram both | default both |
variables | String | |
is_active | Boolean | default true |
created_by | BigInt | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
partita_live_state
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
partita_idunico | Int (obbl.) | |
stato | partita_live_state_stato (obbl.)
preparazione in_corso pausa fine_tempo fine_incontro | default preparazione |
tempo_numero | Int (obbl.) | default 1 |
minuto_corrente | Int | default 0 |
secondo_corrente | Int | default 0 |
tempo_inizio | DateTime | |
tempo_pausa | DateTime | |
tempo_riprendi | DateTime | |
tempo_fine | DateTime | |
posizioni_giocatori | String | |
sostituzioni_effettuate | String | |
minuti_giocati_per_atleta | String | |
timer_elapsed_offset_sec | Int (obbl.) | default 0 |
timer_segment_started_at | DateTime | |
overtime_ack_minuto | Int | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
partite_minutaggio
Snapshot a fine partita: minuti per atleta e tempo (da JSON live state).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
partita_id | Int (obbl.) | |
atleta_id | BigInt (obbl.) | |
tempo | Int (obbl.) | |
minuti_giocati | Float (obbl.) | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
partite
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
tipo | partite_tipo (obbl.)
amichevole interna torneo campionato | |
data_ora | DateTime (obbl.) | |
ritrovo_ora | DateTime | L'ORARIO del ritrovo per questa partita — quello che leggono i genitori. Precompilato da `teams.ritrovo_minuti_prima`, ma modificabile qui. NULL = si calcola dai minuti della squadra; se anche quelli mancano, il messaggio non scrive la riga del ritrovo. |
struttura_id | Int | |
squadra_casa_id | BigInt | |
squadra_trasf_id | BigInt | |
squadra_avversaria_id | Int | |
squadra_avversaria_nome | String | |
campionato_id | Int | |
torneo_id | Int | |
girone_id | Int | |
formato | partite_formato (obbl.)
CINQUE SETTE NOVE UNDICI | default dbgenerated("11" |
num_tempi | Int (obbl.) | default 2 |
minuti_per_tempo | Int (obbl.) | default 45 |
regola_risultato | partite_regola_risultato (obbl.)
per_tempo totale_gol | default totale_gol |
stato | partite_stato (obbl.)
programmata in_corso terminata annullata | default programmata |
risultato_casa | Int | default 0 |
risultato_trasferta | Int | default 0 |
punteggi_tempi | String | |
note | String | |
note_famiglia | String | «Cosa portare», scritto dallo staff PER le famiglie: maglia, borraccia, tessera. Colonna a parte da `note`, che e' l'appunto di lavoro dello staff. |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
created_by | BigInt | |
squadra_societa_id | Int | |
squadra_societa_in_casa | Boolean | default false |
impiantoId | Int | Dove si gioca, fra le risorse gestite: le stesse colonne che ha l'allenamento, perche' la collocazione e' un attributo dell'evento. |
campoId | Int | |
quota | Int | |
agioPrima | Int (obbl.) | default 0 |
agioDopo | Int (obbl.) | default 0 |
motivoAgio | String | |
spostataInGriglia | Boolean (obbl.) | Qualcuno le ha cambiato data o ora dalla pianificazione. default false |
partita_live_state | partita_live_state | |
seasons
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
nameunico | String (obbl.) | |
start_date | DateTime (obbl.) | |
end_date | DateTime (obbl.) | |
active | Boolean | default true |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
squadre_avversarie
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nome | String (obbl.) | |
anno | Int (obbl.) | |
citta | String (obbl.) | |
category_id | Int | |
struttura_id | Int | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
created_by | Int | |
strutture
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nome | String (obbl.) | |
indirizzo | String | |
citta | String | |
provincia | String | |
cap | String | |
telefono | String | |
email | String | |
tipo | strutture_tipo (obbl.)
casa trasferta neutro | default neutro |
is_attiva | Boolean | default true |
societa | String | |
note | String | |
campo_figc | Int | |
ora | DateTime | |
capacity | Int | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
telegram_groups
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
chat_idunico | String (obbl.) | |
name | String (obbl.) | |
description | String | |
member_count | Int | default 0 |
last_sync | DateTime | default now( |
created_at | DateTime | default now( |
tornei
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default autoincrement( |
nome | String (obbl.) | |
stagione | String (obbl.) | |
data_inizio | DateTime (obbl.) | |
data_fine | DateTime (obbl.) | |
struttura_id | Int | |
formato | tornei_formato (obbl.)
CINQUE SETTE NOVE UNDICI | |
num_tempi | Int (obbl.) | default 2 |
minuti_per_tempo | Int (obbl.) | default 45 |
regola_risultato | tornei_regola_risultato (obbl.)
per_tempo totale_gol | default totale_gol |
is_attivo | Boolean | default true |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
parent_registration_requests
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
parent_firstName | String (obbl.) | |
parent_lastName | String (obbl.) | |
parent_emailunico | String (obbl.) | |
parent_phone | String | |
parent_address | String | |
parent_city | String | |
parent_province | String | |
parent_postalCode | String | |
parent_fiscalCode | String | |
parent_relationship | String | default "PADRE" |
accepted_terms_timestamp | DateTime | |
medical_privacy_timestamp | DateTime | |
marketing_consent | Boolean | default false |
is_adult_confirmed | Boolean | |
accepted_terms_version | String | |
medical_privacy_version | String | |
operational_notifications_timestamp | DateTime | |
operational_notifications_version | String | |
children_text | String | Nome e cognome atleti (testo libero, una riga per atleta) per validazione admin |
children_data | Json (obbl.) | |
email_verification_token | String | |
email_verified | Boolean | default false |
email_verified_at | DateTime | |
status | parent_registration_request_status
PENDING APPROVED REJECTED | default PENDING |
approved_at | DateTime | |
approved_by | BigInt | |
rejection_reason | String | |
rejected_at | DateTime | |
rejected_by | BigInt | |
password_setup_token | String | |
password_setup_token_expires_at | DateTime | |
pending_password_hash | String | bcrypt della password scelta in fase di richiesta (app/web); applicata all'approvazione |
linked_athlete_ids | Json | ID atleti anagrafica scelti dall'admin in modifica; in approvazione si collegano al genitore (priorità sul testo libero) |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
preregistrations
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_first_name | String (obbl.) | Atleta (soggetto principale della preiscrizione) |
athlete_last_name | String (obbl.) | |
athlete_date_of_birth | DateTime (obbl.) | |
athlete_gender | String | |
athlete_fiscal_code | String | |
athlete_birth_place | String | |
athlete_residence_address | String | Residenza atleta (dati aggiuntivi raccolti al completamento — Ondata 3) |
athlete_residence_city | String | |
athlete_residence_province | String | |
athlete_residence_cap | String | |
is_minor | Boolean (obbl.) | default true |
categoria_richiesta | String | |
contact_email | String (obbl.) | Contatto principale del flusso (genitore se minore, atleta se maggiorenne) |
athlete_email | String | |
athlete_phone | String | |
guardian1_first_name | String | Tutore/genitore 1 (obbligatorio se minorenne) |
guardian1_last_name | String | |
guardian1_relationship | String | |
guardian1_email | String | |
guardian1_phone | String | |
guardian1_fiscal_code | String | |
guardian2_first_name | String | Tutore/genitore 2 (opzionale) |
guardian2_last_name | String | |
guardian2_relationship | String | |
guardian2_email | String | |
guardian2_phone | String | |
guardian2_fiscal_code | String | |
open_day_note | String | Open day / note libere del richiedente |
notes | String | |
privacy_accepted_at | DateTime | Consenso base al trattamento dati per la gestione della preiscrizione |
status | String (obbl.) | Workflow: PENDING | CONFERMATA | DECLINATA (esteso nelle ondate successive) default "PENDING" |
season | String | |
confirmed_at | DateTime | Audit conferma/declino (id utente attore, senza FK: tabella standalone) |
confirmed_by | BigInt | |
declined_at | DateTime | |
declined_by | BigInt | |
decline_reason | String | |
completion_token | String | Predisposizione Ondata 3 (completamento dati in area riservata) e ⑤ tesseramento |
completion_token_expires_at | DateTime | |
linked_athlete_id | BigInt | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
tesseramento_fees
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
season | String (obbl.) | |
enrollment_type | String (obbl.) | NUOVO | RINNOVO | ENTRAMBI default "ENTRAMBI" |
birth_year | Int | annata; null = tutte le annate (default per stagione+tipo) |
category_id | Int | categoria/livello (es. Prima squadra, Agonistica); null = tutte |
amount_cents | Int (obbl.) | |
label | String | |
active | Boolean (obbl.) | default true |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
category_seasons
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
season | String (obbl.) | |
category_id | Int (obbl.) | |
birth_year | Int (obbl.) | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
athlete_fee_overrides
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_id | BigInt (obbl.) | |
season | String (obbl.) | |
amount_cents | Int (obbl.) | 0 = esente (solo controllo documentale) |
note | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
registration_requirements
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
kind | String (obbl.) | UPLOAD | ACK — resta per compatibilità; la verità è `modalita` |
modalita | String (obbl.) | COME si adempie: CARICA (il file lo porta la famiglia) · LEGGE (atto unilaterale) · SCEGLIE (sì/NO) · FIRMA. default "CARICA" |
doc_keyunico | String | Chiave di sistema per handling speciale (es. medical_certificate → PDF visita). null = voce custom del club. |
label | String (obbl.) | |
description | String | |
mandatory | Boolean (obbl.) | = livello diverso da FACOLTATIVO (tenuto in sincronia dal servizio) default true |
livello | String (obbl.) | Scala ORDINATA di obbligatorietà: FACOLTATIVO < SOCIETA < TESSERAMENTO < ATTIVITA. TESSERAMENTO = senza non si tessera. ATTIVITA = serve anche dopo, per allenarsi e giocare (certificato medico). default "TESSERAMENTO" |
attivita_scala | String (obbl.) | «Senza questo documento, fin dove si arriva»: sei cifre, una per attività, nell'ordine impianti · allenamenti · amichevoli interne · amichevoli · tornei · partite di federazione. 2 = consentito · 1 = consentito ma segnalato · 0 = bloccato. Mai più permissiva a destra. default "222222" |
blocca_tesseramento | Boolean (obbl.) | L'altra domanda, che la scala non esprime: serve per CHIUDERE LA PRATICA? Il tesseramento è un atto, non un'attività. default false |
requires_expiry | Boolean (obbl.) | solo UPLOAD: traccia data di scadenza (es. certificato medico) default false |
version | String | per ACK: versione della presa visione |
applies_scope | String (obbl.) | categoria (futuro): ALL | per-categoria default "ALL" |
applies_to | String (obbl.) | ENTRAMBI | NUOVI | RINNOVI (tipo iscrizione) default "ENTRAMBI" |
renewal_reuse | Boolean (obbl.) | Al RINNOVO: se true riusa il documento già agli atti (non ri-richiederlo) se ancora valido; se false lo richiede sempre. default false |
modello_path | String | Il modello che la famiglia legge: un file OPPURE un testo scritto in piattaforma. Non entrambi. |
modello_name | String | |
modello_mime | String | |
modello_testo | String | |
modello_hash | String | Impronta di ciò che è pubblicato: finisce nell'adempimento ed è l'unica prova di *cosa* è stato firmato. |
ammette_congiunta | Boolean (obbl.) | Solo per FIRMA: l'atto può richiedere entrambi i genitori (uso pubblico di foto e video del minore). default false |
sort_order | Int (obbl.) | default 0 |
active | Boolean (obbl.) | default true |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
registration_submissions
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
preregistration_id | BigInt | Adempimento legato a una preiscrizione (onboarding nuovo) OPPURE a un atleta×stagione (rinnovo/esistente). Uno dei due. |
athlete_id | BigInt | |
season | String | |
requirement_id | BigInt (obbl.) | |
kind | String (obbl.) | snapshot: UPLOAD | ACK |
file_path | String | UPLOAD percorso su storage privato (non servito staticamente) |
file_name | String | |
mime_type | String | |
file_size | Int | |
expiry_date | DateTime | |
acknowledged_at | DateTime | ACK — doppia presa visione step 1: dichiaro di aver preso visione |
confirmed_at | DateTime | step 2: conferma vincolante |
version | String | snapshot versione ACK |
status | String (obbl.) | pending | done | sospeso (consenso congiunto in attesa del secondo genitore) default "pending" |
esito | String | Per SCEGLIE: il NO chiude il requisito quanto il sì — «rifiutato» non è «mancante». ACCETTATO | RIFIUTATO |
firma_profilo | String | LA TRACCIA: vale come firma elettronica semplice solo se dice chi, quando, da dove e su quale versione. |
firma_ip | String | |
firma_user_agent | String | |
doc_hash | String | |
su_carta | Boolean (obbl.) | Firmato su carta in segreteria: chi lo attesta e dove sta l'originale. Non è un ripiego, è una delle due vie. default false |
su_carta_da | String | |
verifica | String (obbl.) | La verifica di ciò che carica la famiglia: un file caricato non è ancora un documento. NON_RICHIESTA | IN_ATTESA | ACCETTATO | RIFIUTATO default "NON_RICHIESTA" |
verifica_motivo | String | |
verifica_da | String | |
verifica_at | DateTime | |
congiunta | Boolean | Consenso congiunto: chi firma per primo dichiara se la sua firma basta. |
secondo_nome | String | |
secondo_email | String | |
secondo_tokenunico | String | |
secondo_invitato_at | DateTime | |
secondo_firmato_at | DateTime | |
secondo_profilo | String | |
secondo_ip | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
payment_items
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
name | String (obbl.) | |
description | String | |
amount_cents | Int (obbl.) | |
recurrence | String (obbl.) | una_tantum | mensile | annuale default "una_tantum" |
entry_type | String | classificazione contabile: istituzionale | commerciale |
is_tesseramento | Boolean (obbl.) | voce di sistema: quota tesseramento (governata da Quote tesseramento, non editabile a mano) default false |
contributo_a_carico_club | Boolean (obbl.) | Il Contributo al servizio di pagamento online lo sostiene la societa' invece della famiglia (Listino Art. 5.2). default false |
ledger_account_id | BigInt | Voce del piano dei conti su cui l'incasso di questa quota finisce in prima nota (Tesoreria). Null = la voce non alimenta la contabilità. |
season | String | stagione di riferimento della voce (es. 2026/2027); base per economics/bilancio |
active | Boolean (obbl.) | default true |
sort_order | Int (obbl.) | default 0 |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
payment_dues
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
item_id | BigInt (obbl.) | |
athlete_id | BigInt | |
parent_id | BigInt | |
preregistration_id | BigInt | Quota tesseramento legata a una preiscrizione non ancora materializzata in atleta (Fase 2 #4b). |
amount_cents | Int (obbl.) | |
due_date | DateTime | |
period | String | |
status | String (obbl.) | pending | processing (SEPA in lavorazione) | paid | canceled default "pending" |
channel | String | stripe | contanti | bonifico | altro |
paid_at | DateTime | |
note | String | |
stripe_payment_intent_id | String | |
stripe_checkout_session_id | String | |
fee_cents | Int | costo per il club del pagamento online: Commissione + Contributo se lo sostiene lui. Solo canale stripe, fissato al pagamento |
commissione_cents | Int | Commissione di Piattaforma e Contributo del pagamento che ha saldato la quota (PRM-02, sezione E). |
contributo_cents | Int | |
strumento | String | carta | sepa | altro |
receipt_number | String | |
ricevuta_annullata_numero | String | Ricevuta annullata da una contestazione o da un rimborso: il numero resta qui, la quota torna da pagare. |
ricevuta_annullata_il | DateTime | |
ricevuta_annullata_motivo | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
payment_avvisi
Avvisi di quota inviati (o registrati) alle famiglie, con riscontro "Ho preso visione". L'invio email è gated dal flag env AVVISI_EMAIL_ENABLED (default off): con flag off gli avvisi si creano (status=registrato) ma NON vengono spediti.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
due_id | BigInt (obbl.) | |
tokenunico | String (obbl.) | |
email_to | String (obbl.) | |
status | String (obbl.) | registrato | inviato | errore default "registrato" |
error_message | String | |
inviato_il | DateTime | |
preso_visione_il | DateTime | |
created_at | DateTime (obbl.) | default now( |
enrollment_seasons
Tipo iscrizione per atleta e stagione (⑤→②): rinnovo | nuovo. Una riga per (atleta, stagione). Default (assenza riga) per un atleta attivo = "rinnovo". La Fase 2 (tesseramento) popolerà questa tabella creando lo storico → dalla 2ª stagione il rinnovo è deducibile dal dato.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_id | BigInt (obbl.) | |
season | String (obbl.) | es. "2026/2027" |
tipo | String (obbl.) | rinnovo | nuovo |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
club_settings
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default 1 |
legal_name | String | |
fiscal_code | String | |
vat_number | String | |
address | String | |
logo_path | String | |
receipt_notes | String | |
sport | String | settore sportivo della società (calcio, volley, basket…): guida i preset categorie |
federations | String | federazioni di affiliazione (codici csv: FIGC,CSI,FIPAV,FIB,FIR,…); il preset categorie è per (federazione × sport) |
tessera_validita_mesi | Int | Durata della tessera decisa dalla società, valida per TUTTI gli atleti. NULL = stagione sportiva (scade il 30 giugno della stagione di emissione); un numero = mesi dalla data di tesseramento. Deroga per singolo atleta: athletes.tessera_expiry. |
doc_non_verificato | String (obbl.) | Quanto vale un documento caricato e non ancora guardato: PRESENTE | SEGNALATO | MANCANTE. Lo decide la società, una volta, per tutti. default "SEGNALATO" |
giorni_tolleranza_insoluto | Int (obbl.) | Da quanti giorni un addebito scaduto conta come insoluto ai fini di ciò che l'atleta può fare. default 30 |
convocazioni_apri_all_inizio | Boolean (obbl.) | Le convocazioni degli altri si aprono all'ora di inizio della partita. Vale solo per chi ha il permesso `convocazioni/view` al contesto OWN (genitori e atleti): prima del fischio vedono solo la propria riga. Chi ha TEAM o ALL vede sempre l'elenco e non e' toccato da questa leva. default true |
foto_abilitate | Boolean (obbl.) | FOTO DI PARTITE E ALLENAMENTI — opzione della societa', nasce spenta. Accendendola l'amministratore dichiara che la societa' ha raccolto la liberatoria per le immagini da tutti gli atleti: chi e quando resta qui. default false |
foto_abilitate_il | DateTime | |
foto_abilitate_da | String | |
foto_proroga_mesi | Int (obbl.) | Mesi oltre la fine della stagione per cui le foto si conservano (0 = fine stagione). default 0 |
avviso_riprese_allega | Boolean (obbl.) | PRM-07 §F: allega l'avviso riprese (SPO-M05) alle convocazioni dei tornei. default false |
website | String | BLOCCO PUBBLICO — ciò che il club mostra in fondo alle pagine (footer). Prima era il blocco della Polisportiva scritto nel codice: al secondo club reale sarebbe comparso il footer di un'altra società. Questi campi sono PUBBLICI per natura (un club li stampa sul proprio sito e sulle ricevute) e vengono serviti anche prima del login da /tenant/info. sito del club, mostrato e linkato nel footer |
registrations | String | matricole/affiliazioni da stampare (es. "Matricola FIGC 930021 - Matricola CONI 94651") |
footer_note | String | riga libera del footer (es. di chi è la proprietà del logo) |
logo_url | String | Logo per il WEB (percorso servito dal browser, es. /segrate-info-logo.png). NON è logo_path, che è un percorso su disco letto da PDFKit per la ricevuta: tenerli separati evita che l'uno rompa l'altro. |
theme_preset | String | ASPETTO — combinazione colori scelta dal club (Amministrazione › Aspetto). È un ID di preset del catalogo verificato, NON dei colori liberi: la scelta libera renderebbe possibile uno stato illeggibile e irrecuperabile dall'utente. Un id sconosciuto ricade sul default lato frontend. es. 'sportops-lime' | 'blu-giallo' |
default_theme | String | 'light' | 'dark' — default del club, l'utente può sovrascriverlo |
legal_form | String | IDENTITA' LEGALE (PRM-01, decisione #7): la sorgente dei campi {{club.*}} dei modelli e del frontespizio. Per i club nati dal wizard li copia il provisioning; per segrate e demo si compilano da «Dati societa'». ASD, SSD a r.l., APS, altro |
legal_representative_name | String | |
legal_representative_fiscal_code | String | |
pec | String | |
email | String | email amministrativa |
phone | String | |
privacy_email | String | per le richieste degli interessati |
dpo | String | solo se nominato |
sdi_code | String | codice destinatario per la fatturazione elettronica |
consent_second_parent_required | Boolean (obbl.) | CONSENSI — scelte del club (PRM-01): per la diffusione esterna delle immagini dei minori serve la firma di entrambi i genitori? (decisione #26) E per i 14-17 anni chi firma: il ragazzo, il genitore o entrambi? (PRM-07 §C) default false |
consent_minor_14_plus | String (obbl.) | atleta | genitore | entrambi default "genitore" |
updated_at | DateTime (obbl.) | default now( |
identity_verification_settings
Impostazioni per-tenant della verifica identità (riga singleton id=1).
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default 1 |
required_level | String (obbl.) | NONE | DECLARED | SUBSTANTIAL | HIGH default "NONE" |
allowed_methods | String (obbl.) | CSV: AUTOCERT,IDV,SPID default "AUTOCERT" |
idv_provider | String | es. stripe_identity | onfido (metodo B) |
reverify_after_months | Int | null = verifica valida a tempo indeterminato |
autocert_text | String | override del testo di autocertificazione |
updated_at | DateTime (obbl.) | default now( |
identity_verifications
Record di verifica identità: una riga per tentativo/esito (storico incluso), ancorata a un soggetto polimorfico (subject_type + subject_id). Tabella standalone (nessuna FK): riferisce preregistrations/parents/athletes per id.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
subject_type | String (obbl.) | PREREGISTRATION | PARENT | ATHLETE |
subject_id | BigInt (obbl.) | |
method | String (obbl.) | AUTOCERT | IDV | SPID |
level | String (obbl.) | DECLARED | SUBSTANTIAL | HIGH |
status | String (obbl.) | pending | verified | rejected | expired default "pending" |
declared_full_name | String | Metodo A — autocertificazione (dati dichiarati + snapshot del testo accettato) |
declared_fiscal_code | String | |
declared_relationship | String | |
declaration_version | String | |
declaration_text | String | |
provider | String | Metodo B — IDV (provider esterno documento+selfie) |
provider_ref | String | |
evidence_path | String | eventuale evidenza su storage privato |
verified_at | DateTime | Esito e audit |
expires_at | DateTime | |
ip_address | String | |
user_agent | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
fiscal_settings
Impostazioni contabili per-tenant (riga singleton id=1).
| Colonna | Tipo | Note |
|---|
idPK | Int (obbl.) | default 1 |
accounting_enabled | Boolean (obbl.) | interruttore della sezione Tesoreria default false |
regime | String (obbl.) | 398 | ordinario | forfettario | ETS default "398" |
scheme | String (obbl.) | CASSA (< 220.000 €) | COMPETENZA default "CASSA" |
exercise_start_month | Int (obbl.) | mese di apertura dell'esercizio sociale (1=gennaio, 7=luglio, 9=settembre) default 1 |
plafond_cents | BigInt (obbl.) | plafond proventi commerciali L. 398/91 (400.000 €) default 40000000 |
vat_default_percent | Int (obbl.) | default 22 |
locked_until | DateTime | chiusura periodo: sotto questa data i movimenti non si toccano |
updated_at | DateTime (obbl.) | default now( |
ledger_accounts
Piano dei conti. Le voci di sistema (`is_system`) sono lo schema CNDCEC/FNC e non si eliminano: si rinomina `label` (etichetta amichevole) o si disattivano. `official_name` resta la denominazione esatta usata nel rendiconto.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
section | String (obbl.) | A | B | C | D | E |
direction | String (obbl.) | ENTRATA | USCITA |
codeunico | String (obbl.) | es. "A.E.2" |
official_name | String (obbl.) | |
label | String (obbl.) | |
nature | String (obbl.) | ISTITUZIONALE | COMMERCIALE (voci * dello schema → plafond 398/91) default "ISTITUZIONALE" |
parent_id | BigInt | sottoconto del club appeso a una voce ufficiale |
is_system | Boolean (obbl.) | default false |
active | Boolean (obbl.) | default true |
sort_order | Int (obbl.) | default 0 |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
cash_accounts
Conti di cassa e banca: alimentano il riquadro "Cassa e banca" del rendiconto e la quadratura (saldo iniziale + entrate − uscite = saldo finale).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
name | String (obbl.) | |
type | String (obbl.) | CASSA | BANCA | POSTALE | CONTO_FEDERALE | STRIPE | ALTRO |
iban | String | |
opening_balance_cents | BigInt (obbl.) | default 0 |
opening_date | DateTime | |
active | Boolean (obbl.) | default true |
sort_order | Int (obbl.) | default 0 |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
counterparties
Controparti dei movimenti: fornitori, sponsor, enti, persone.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
name | String (obbl.) | |
kind | String (obbl.) | FORNITORE | SPONSOR | ENTE | PERSONA | ALTRO default "FORNITORE" |
fiscal_code | String | |
vat_number | String | |
email | String | |
phone | String | |
note | String | |
active | Boolean (obbl.) | default true |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
ledger_entries
Prima nota: il registro dei movimenti di cassa/banca. Un movimento è imputato a una voce del piano dei conti (`account_id`) e a un conto cassa/banca (`cash_account_id`). `source` != MANUAL ⇒ movimento generato dalla piattaforma e in sola lettura: si corregge alla fonte.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
entry_date | DateTime (obbl.) | |
direction | String (obbl.) | ENTRATA | USCITA (deve combaciare con la voce di piano dei conti) |
amount_cents | BigInt (obbl.) | |
account_id | BigInt (obbl.) | |
cash_account_id | BigInt (obbl.) | |
counterparty_id | BigInt | |
description | String (obbl.) | |
doc_type | String | RICEVUTA | FATTURA | SCONTRINO | ALTRO |
doc_number | String | |
doc_date | DateTime | |
attachment_path | String | Giustificativo su storage privato (non servito staticamente), come i documenti d'iscrizione |
attachment_name | String | |
attachment_mime | String | |
attachment_size | Int | |
season | String | Analitica: a quale stagione/squadra/categoria imputare il movimento (costo per categoria) |
team_id | BigInt | |
category_id | Int | |
nature | String (obbl.) | default dalla voce, sovrascrivibile default "ISTITUZIONALE" |
vat_percent | Int | |
vat_cents | BigInt | |
source | String (obbl.) | MANUAL | PAYMENT_DUE | STRIPE_FEE | STAFF_COMP | SPONSOR | RECURRING | BANK_IMPORT default "MANUAL" |
source_id | BigInt | |
reversal_of_id | BigInt | storno: movimento di segno opposto che annulla un altro |
reconciled_at | DateTime | |
bank_tx_id | BigInt | |
created_by | BigInt | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
expense_schedules
Impegno di spesa ricorrente o una tantum (affitto impianti, affiliazione, assicurazione, commercialista). Definito una volta, si srotola in scadenze.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
label | String (obbl.) | |
direction | String (obbl.) | USCITA (affitti, affiliazioni…) o ENTRATA (rate sponsor, contributi a tranche). default "USCITA" |
account_id | BigInt (obbl.) | |
cash_account_id | BigInt | |
counterparty_id | BigInt | |
amount_cents | BigInt (obbl.) | |
recurrence | String (obbl.) | UNA_TANTUM | MENSILE | BIMESTRALE | TRIMESTRALE | SEMESTRALE | ANNUALE default "MENSILE" |
start_date | DateTime (obbl.) | |
end_date | DateTime | |
due_day | Int | giorno del mese della scadenza (troncato a fine mese) |
season | String | |
team_id | BigInt | |
nature | String (obbl.) | default "ISTITUZIONALE" |
note | String | |
active | Boolean (obbl.) | default true |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
expense_occurrences
Singola scadenza di un impegno: è la riga dello scadenzario. Confermandola come pagata nasce il movimento di prima nota (`entry_id`).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
schedule_id | BigInt (obbl.) | |
due_date | DateTime (obbl.) | |
amount_cents | BigInt (obbl.) | |
status | String (obbl.) | pending | paid | skipped default "pending" |
paid_at | DateTime | |
entry_id | BigInt | |
note | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
budget_lines
Preventivo di stagione: quanto il club conta di incassare/spendere su una voce. `team_id` nullo = budget generale del club; valorizzato = della squadra.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
season | String (obbl.) | |
account_id | BigInt (obbl.) | |
team_id | BigInt | |
amount_cents | BigInt (obbl.) | |
note | String | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
import_batches
Un caricamento di file. Più lotti per club: chi ha un file per annata li carica separatamente, e ognuno si annulla per conto suo.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
kind | String (obbl.) | default "ATLETI" |
status | String (obbl.) | default "BOZZA" |
file_name | String (obbl.) | |
file_stored | String (obbl.) | |
sheet_name | String | |
csv_delimiter | String | |
encoding | String | |
columns_json | String | |
mapping_json | String | |
options_json | String | |
season | String | |
total_rows | Int (obbl.) | default 0 |
ready_rows | Int (obbl.) | default 0 |
warn_rows | Int (obbl.) | default 0 |
error_rows | Int (obbl.) | default 0 |
dup_rows | Int (obbl.) | default 0 |
match_rows | Int (obbl.) | default 0 |
athletes_created | Int (obbl.) | default 0 |
athletes_updated | Int (obbl.) | default 0 |
parents_created | Int (obbl.) | default 0 |
parents_linked | Int (obbl.) | default 0 |
guardians_pending | Int (obbl.) | default 0 |
teams_created | Int (obbl.) | default 0 |
created_team_ids | String | |
undo_report | String | |
created_by | BigInt | |
applied_by | BigInt | |
undone_by | BigInt | |
applied_at | DateTime | |
undone_at | DateTime | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
import_rows
La riga del file: com'era (`raw_json`) e come è stata interpretata (`parsed_json`). Dopo l'applicazione tiene anche cosa ha creato — è ciò che rende l'annullamento una cosa vera e non una promessa.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
batch_id | BigInt (obbl.) | |
row_index | Int (obbl.) | |
raw_json | String | |
parsed_json | String | |
issues_json | String | |
status | String (obbl.) | default "PRONTA" |
action | String (obbl.) | default "CREA" |
match_athlete_id | BigInt | |
match_kind | String | |
created_athlete_id | BigInt | |
created_parent_ids | String | |
guardian_pending | Boolean (obbl.) | Genitore con nome e telefono ma SENZA email: `parents.email` è UNIQUE e NOT NULL, quindi non è creabile. Resta qui, in attesa dell'email. default false |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
import_profiles
Mappatura colonne→campi salvata: il secondo file dello stesso gestionale entra senza rifare il lavoro.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
nameunico | String (obbl.) | |
kind | String (obbl.) | default "ATLETI" |
mapping_json | String (obbl.) | |
created_by | BigInt | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
athlete_completion_tokens
Gettone che autorizza la famiglia a completare i dati di un atleta GIÀ in anagrafica, senza un account. Stessa idea del `completion_token` della preiscrizione, applicata a chi è entrato per importazione. Vedi migrations/20260831140000_athlete_completion.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_id | BigInt (obbl.) | |
season | String (obbl.) | |
tokenunico | String (obbl.) | |
expires_at | DateTime | |
sent_at | DateTime | |
sent_to | String | |
send_count | Int (obbl.) | default 0 |
opened_at | DateTime | |
completed_at | DateTime | |
created_by | BigInt | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
attivita_regole
Cosa può fare un atleta a seconda di DOVE STA e di COME STA CON I PAGAMENTI. Terzo pezzo accanto a `registration_requirements.attivita_scala` (i documenti): i tre assi sono indipendenti e il verdetto è il più severo dei tre.
| Colonna | Tipo | Note |
|---|
ambito | String (obbl.) | POSIZIONE | PAGAMENTO |
chiave | String (obbl.) | |
scala | String (obbl.) | Sei cifre, una per attività: 2 consentito · 1 segnalato · 0 bloccato. Vedi common/attivita.dominio.ts. default "222222" |
updated_at | DateTime (obbl.) | default now( |
foto_attivita
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
tipo_attivita | String (obbl.) | |
attivita_id | BigInt (obbl.) | |
team_id | BigInt (obbl.) | |
stagione | String (obbl.) | |
file_path | String (obbl.) | |
anteprima_path | String (obbl.) | |
mime | String (obbl.) | |
larghezza | Int | |
altezza | Int | |
byte | Int | |
scattata_il | DateTime (obbl.) | |
luogo_nome | String | |
lat | Decimal | |
lng | Decimal | |
didascalia | String (obbl.) | |
stato | String (obbl.) | PRM-07 §C: pubblicata | in_moderazione (caricata da una famiglia) | respinta default "pubblicata" |
moderata_at | DateTime | |
moderata_da_tipo | String | |
moderata_da_id | BigInt | |
moderata_da_nome | String | |
motivo_rifiuto | String | |
autore_tipo | String (obbl.) | |
autore_id | BigInt (obbl.) | |
autore_nome | String (obbl.) | |
created_at | DateTime | default now( |
conserva_fino | DateTime (obbl.) | |
cancellata_at | DateTime | |
cancellata_da_tipo | String | |
cancellata_da_id | BigInt | |
cancellata_da_nome | String | |
foto_atleti
| Colonna | Tipo | Note |
|---|
foto_id | BigInt (obbl.) | |
athlete_id | BigInt (obbl.) | |
foto_condivisioni
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
foto_id | BigInt (obbl.) | |
persona_tipo | String (obbl.) | |
persona_id | BigInt (obbl.) | |
persona_nome | String (obbl.) | |
created_at | DateTime | default now( |
richieste_cancellazione
La richiesta di cancellazione dei dati fatta dalla persona (vedi la migrazione 20260918100000_cancellazione_dati e cancellazione-dati.dominio.ts).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
stato | String (obbl.) | default "DA_CONFERMARE" |
richiedente_tipo | String (obbl.) | |
richiedente_id | BigInt (obbl.) | |
richiedente_nome | String (obbl.) | |
richiedente_email | String | |
canale | String (obbl.) | default "sito" |
token_hash | String | |
token_scade_il | DateTime | |
richiesta_il | DateTime (obbl.) | |
confermata_il | DateTime | |
avvisati_il | DateTime | |
ultimo_promemoria_il | DateTime | |
eseguita_il | DateTime | |
eseguita_da | String | |
annullata_il | DateTime | |
annullata_da | String | |
motivo_annullamento | String | |
created_at | DateTime | default now( |
updated_at | DateTime | default now( |
richieste_cancellazione_persone
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
richiesta_id | BigInt (obbl.) | |
tipo | String (obbl.) | |
persona_id | BigInt (obbl.) | |
nome | String (obbl.) | |
email | String | |
eseguita_il | DateTime | |
esito | Json | |
club_document_instances
L'ISTANZA di un modello del Gestore personalizzata dal club (SPO-M01…M05): il testo che le famiglie leggono e firmano. Pubblicata = immutabile; una modifica crea un'istanza nuova e manda la precedente a `superseded`.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
definition_code | String (obbl.) | SPO-M01, SPO-M02… (dal manifesto). |
template_version_id | String | La versione del modello del Gestore da cui nasce (id nel control-plane); null per le istanze migrate dal testo che il club usava prima. |
template_version_label | String | |
instance_version | Int (obbl.) | Progressivo per club e per definizione: 1, 2, 3… |
merge_values | Json | I valori dei campi di unione ({{club.*}} e quelli «da compilare»). |
enabled_blocks | Json | I blocchi opzionali accesi: ["dpo", "pubblicazione_esterna", "minori"…]. |
custom_paragraph | String | «Testo aggiuntivo del club», in posizione fissa, con limite di lunghezza. |
rendered_html | String | Il testo reso (HTML) e il PDF immutabile con la sua impronta. |
rendered_pdf_path | String | |
sha256 | String | |
status | String (obbl.) | draft | published | superseded default "draft" |
origin | String (obbl.) | template = compilata dal modello · migrated = il testo che il club usava prima di PRM-01. default "template" |
responsibility_confirmed_at | DateTime | La spunta «Confermo che il testo e' stato verificato dal club, che ne e' titolare e responsabile». |
published_at | DateTime | |
published_by | String | |
requires_reacceptance | Boolean (obbl.) | Alla pubblicazione: le famiglie devono riaccettare? Se no, motivazione obbligatoria (aggiornamento non sostanziale). default true |
non_substantial_reason | String | |
effective_until | DateTime | |
created_at | DateTime (obbl.) | default now( |
updated_at | DateTime (obbl.) | default now( |
athlete_consent_acceptances
L'ACCETTAZIONE di un'istanza per UN atleta da parte di chi ne ha titolo. Un genitore con due figli produce due righe. Il secondo genitore (quando il club lo richiede per la diffusione esterna) produce una riga propria che cita la prima in `completes_acceptance_id` (decisione #26).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_id | BigInt (obbl.) | |
instance_id | BigInt (obbl.) | |
definition_code | String (obbl.) | |
instance_sha256_snapshot | String | |
accepted_by_user_type | String (obbl.) | Chi firma: identita' del JWT (PARENT#12, ATHLETE#7) o chi registra il cartaceo. |
accepted_by_user_id | BigInt (obbl.) | |
signer_capacity | String (obbl.) | self_adult | parent_guardian | self_minor_14_plus |
signer_full_name | String (obbl.) | |
consent_items_result | Json (obbl.) | Le spunte: {code: {value: true|false, at: ISO}} per ogni consent_item; la presa visione ha value true. |
accepted_at | DateTime (obbl.) | |
ip_address | String | |
user_agent | String | |
acceptance_type | String (obbl.) | online | signed_offline | migrated default "online" |
offline_file_path | String | |
offline_registered_by | String | |
pending_second_signer | Boolean (obbl.) | Doppio firmatario: la prima firma dichiara di aspettarne una seconda; la seconda cita la prima. default false |
completes_acceptance_id | BigInt | |
season | String | La stagione in cui e' stata raccolta (per la riconferma annuale, TP-13). |
created_at | DateTime (obbl.) | default now( |
athlete_consent_revocations
La REVOCA di un singolo consenso: record a se', mai una modifica dell'accettazione.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
athlete_id | BigInt (obbl.) | |
consent_item_code | String (obbl.) | |
revoked_by_user_type | String (obbl.) | |
revoked_by_user_id | BigInt (obbl.) | |
revoked_by_full_name | String | |
revoked_at | DateTime (obbl.) | |
ip_address | String | |
user_agent | String | |
note | String | |
created_at | DateTime (obbl.) | default now( |
user_acceptances
L'accettazione dei documenti del GESTORE da parte di una persona (SPO-U01 Termini d'uso; SPO-U02 come presa visione): una volta per club (decisione #17). `on_behalf_of_athlete_ids`: il genitore che accetta anche per i figli under 14 (Art. 3.3 dei Termini).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_type | String (obbl.) | |
user_id | BigInt (obbl.) | |
definition_code | String (obbl.) | |
version_id | String (obbl.) | |
version_label | String (obbl.) | |
document_sha256 | String (obbl.) | |
accepted_at | DateTime (obbl.) | |
ip_address | String | |
user_agent | String | |
on_behalf_of_athlete_ids | Json | |
acceptance_type | String (obbl.) | online | migrated default "online" |
created_at | DateTime (obbl.) | default now( |
legal_declarations
Le DICHIARAZIONI che il registro chiede senza un documento dietro (responsabilita' genitoriale a TP-03, titolo a caricare a TP-16, custodia dell'archivio a TP-36…): chi, cosa, quando, su quale punto di raccolta.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
declaration_key | String (obbl.) | |
touchpoint | String (obbl.) | |
user_type | String | |
user_id | BigInt | |
athlete_id | BigInt | |
reference | String | Per le dichiarazioni anonime (preiscrizione): un riferimento alla pratica. |
declared_at | DateTime (obbl.) | |
ip_address | String | |
user_agent | String | |
created_at | DateTime (obbl.) | default now( |
legal_reading_events
Gli EVENTI DI LETTURA: il documento e' stato aperto, scorso fino in fondo, scaricato — prima che una casella si abiliti (Art. 3.2 (iii)).
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_type | String | |
user_id | BigInt | |
definition_code | String (obbl.) | Cosa e' stato letto: un documento del Gestore (codice + versione) o un'istanza del club. |
version_label | String | |
instance_id | BigInt | |
event | String (obbl.) | opened | scrolled_to_end | downloaded |
occurred_at | DateTime (obbl.) | |
ip_address | String | |
communication_preferences
PRM-05 §D: preferenze per canale delle comunicazioni facoltative. Assente = acceso.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_type | String (obbl.) | |
user_id | BigInt (obbl.) | |
channel | String (obbl.) | push | email |
enabled | Boolean (obbl.) | default true |
updated_at | DateTime (obbl.) | default now( |
foto_segnalazioni
PRM-07 §C: la segnalazione di una foto. Le righe restano anche da chiuse: sono la prova.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
foto_id | BigInt (obbl.) | |
categoria | String (obbl.) | inappropriata | minore_non_consenziente | dati_personali | grave | altro |
note | String | |
segnalata_da_tipo | String (obbl.) | |
segnalata_da_id | BigInt (obbl.) | |
segnalata_da_nome | String (obbl.) | |
created_at | DateTime (obbl.) | default now( |
stato | String (obbl.) | aperta | chiusa default "aperta" |
esito | String | |
chiusa_at | DateTime | |
chiusa_da_nome | String | |
access_log
PRM-06: il registro degli accessi dichiarato dall'informativa del Gestore. Dodici mesi, poi il motore di retention lo pota. Nessun dato oltre il minimo: l'email compare mascherata, e solo quando il login fallisce.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
user_type | String | |
user_id | BigInt | |
email_mascherata | String | |
esito | String (obbl.) | riuscito | credenziali_errate | bloccato | demo_scaduta |
ip_address | String | |
user_agent | String | |
occurred_at | DateTime (obbl.) | default now( |
esportazioni
PRM-08 §4 (Art. 11-bis.5): chi ha portato fuori i dati di tutte le famiglie, quando e quanti. Append-only con trigger: e' una prova, non un elenco.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
tipo | String (obbl.) | periodica | completa |
oggetto | String (obbl.) | |
user_type | String (obbl.) | |
user_id | BigInt (obbl.) | |
user_nome | String (obbl.) | |
user_ruolo | String | |
ip_address | String | |
entita | Json | |
righe | Int | |
con_allegati | Boolean (obbl.) | default false |
byte | BigInt | |
sha256 | String | |
esito | String (obbl.) | riuscita | fallita default "riuscita" |
errore | String | |
custodia_accettata | Boolean (obbl.) | default false |
occurred_at | DateTime (obbl.) | default now( |
esportazioni_avvisi
L'evidenza dei promemoria mandati al club (Art. 11-bis.2). Append-only.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
tipo | String (obbl.) | promemoria_trimestrale | ritardo |
destinatari | String (obbl.) | |
giorni_dall_ultima | Int | |
inviato_at | DateTime (obbl.) | default now( |
pagamenti_online
Ogni tentativo di pagamento online di una quota (PRM-02, sezione E): cosa ha pagato la famiglia, cosa ha trattenuto il Gestore, con quale regola e quale strumento, e come e' finita. La registrazione per transazione che il report mensile e la fattura delle commissioni leggono. Nessuna chiave esterna verso payment_dues: e' una registrazione contabile e sopravvive alla cancellazione dell'addebito.
| Colonna | Tipo | Note |
|---|
idPK | BigInt (obbl.) | default autoincrement( |
due_id | BigInt (obbl.) | |
stato | String (obbl.) | avviato | in_lavorazione | pagato | fallito | contestato | rimborsato | abbandonato default "avviato" |
strumento | String | |
quota_cents | Int (obbl.) | |
contributo_cents | Int (obbl.) | |
commissione_cents | Int (obbl.) | |
commissione_iva_cents | Int | IVA della Commissione, quando la Commissione e' IVA esclusa (modello a fasce, Listino rev. 4). Null = Commissione IVA compresa (modelli di prima). |
application_fee_cents | Int (obbl.) | |
totale_pagatore_cents | Int (obbl.) | |
netto_club_cents | Int (obbl.) | |
contributo_a_carico | String (obbl.) | famiglia | club |
regola | String (obbl.) | listino | precedente |
listino_versione_id | String | |
listino_versione | String | |
piano | String | |
stripe_checkout_session_idunico | String | |
stripe_payment_intent_id | String | |
stripe_charge_id | String | |
stripe_fee_cents | Int | La commissione di Stripe, letta dalla balance transaction. Solo da mostrare: mai nei totali. |
fee_restituita_cents | Int | Commissione e Contributo si restituiscono solo se Stripe restituisce l'application fee (Art. 7.6). |
motivo | String | |
avviato_il | DateTime (obbl.) | default now( |
in_lavorazione_il | DateTime | |
pagato_il | DateTime | |
fallito_il | DateTime | |
contestato_il | DateTime | |
rimborsato_il | DateTime | |
updated_at | DateTime (obbl.) | default now( |