SportOpsFormato dei dati

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.

athletesattendancecoachesdirectorsdocumentseventsfacilitiesinvitationsparent_athletesparentsruoliteam_playersteam_staffteamstraining_attendancetraining_exceptionstraining_templatestrainingsrisorse_impiantirisorse_campirisorse_spogliatoirisorse_parametri_categoriarisorse_parametri_squadrarisorse_occupazioniusersdevice_tokenspush_promemorianote_attivitaavvisiavvisi_lettureemail_change_tokenspermission_overridespermission_audit_logpermission_versionspassword_reset_tokenscampionaticategoriesclassifichecommenti_partitacomposizioni_tatticheconvocation_notificationsconvocazionieventi_partitaformazionigironisquadre_campionati_iscrizionimedia_partitanotification_group_membersnotification_groupsnotification_historynotification_templatespartita_live_statepartite_minutaggiopartiteseasonssquadre_avversariestrutturetelegram_groupstorneiparent_registration_requestspreregistrationstesseramento_feescategory_seasonsathlete_fee_overridesregistration_requirementsregistration_submissionspayment_itemspayment_duespayment_avvisienrollment_seasonsclub_settingsidentity_verification_settingsidentity_verificationsfiscal_settingsledger_accountscash_accountscounterpartiesledger_entriesexpense_schedulesexpense_occurrencesbudget_linesimport_batchesimport_rowsimport_profilesathlete_completion_tokensattivita_regolefoto_attivitafoto_atletifoto_condivisionirichieste_cancellazionerichieste_cancellazione_personeclub_document_instancesathlete_consent_acceptancesathlete_consent_revocationsuser_acceptanceslegal_declarationslegal_reading_eventscommunication_preferencesfoto_segnalazioniaccess_logesportazioniesportazioni_avvisipagamenti_online

athletes

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
firstNameString (obbl.)
lastNameString (obbl.)
dateOfBirthDateTime (obbl.)
birthPlaceString
birthProvinceString
nationalityString default "Italiana"
taxCodeString
genderathletes_gender
M F
medicalExpiryDateTime
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
photoString
liberatoria_immagini_ritirata_ilDateTimeLa 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_okBoolean (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_okBoolean (obbl.) default false
image_internal_okBoolean (obbl.)Immagini di attivita' (galleria della squadra) — consenso, decisione #3. default false
image_public_okBoolean (obbl.)Diffusione esterna (sito, social, stampe) — consenso distinto, decisione #3. default false
messaging_whatsapp_okBoolean (obbl.) default false
messaging_telegram_okBoolean (obbl.) default false
consent_flags_updated_atDateTime
figcCardString
matricolaString
residenceCityString
residenceProvinceString
emailString
phoneString
codeunicoString (obbl.)
addressString
birthCityString
postalCodeString
notesString
activeBoolean default true
category_idInt
category_lockedBooleanderoga: categoria impostata a mano, "Applica" non la sovrascrive default false
tessera_dateDateTime
tessera_expiryDateTimeDeroga alla durata di società: scadenza tessera impostata a mano per questo atleta (alcune categorie hanno regole proprie).
pratica_inviata_atDateTimePratica di tesseramento conclusa e inviata alla federazione: il tesserino non è ancora arrivato. Stato intermedio legittimo, non blocca nulla.
prestito_daStringPRESTITO da un'altra società: l'atleta è tesserato altrove e gioca da noi con il nulla osta agli atti.
prestito_dalDateTime
prestito_alDateTime
prestito_stessa_federazioneBooleanSe 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_versoStringDEROGA sul singolo atleta, nei due versi: CONSENTI (la sua scala sostituisce il verdetto) | BLOCCA (si aggiunge, vince la più severa).
deroga_scalaString
deroga_motivoStringObbligatorio nell'interfaccia: una deroga senza motivo, fra sei mesi, è un atleta fermo e nessuno che sappia perché.
deroga_daString
deroga_atDateTime
nulla_osta_pathStringIl nulla osta è allegato allo stato di prestito, non al catalogo documenti del club (riguarda un atleta solo).
nulla_osta_nameString
nulla_osta_dateDateTime
archived_atDateTime
archived_reasonString
createdByUserIdBigInt
parentIdBigInt
createdAtDateTime default now(
updatedAtDateTime default now(
dati_cancellati_ilDateTimeDa questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts).
uidunicoString
pwdString
telegram_usernameString
telegram_chat_idString

attendance

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
event_idInt (obbl.)
athlete_idBigInt (obbl.)
statusattendance_status
present absent late
default present
notesString
created_atDateTime default now(
updated_atDateTime default now(

coaches

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
firstNameString (obbl.)
lastNameString (obbl.)
emailunicoString (obbl.)
phoneString
photoString
licenseString
specializationcoaches_specialization
ALLENATORE_GENERALE PORTIERI DIFENSORI CENTROCAMPISTI ATTACCANTI
activeBoolean default true
createdByUserIdBigInt
createdAtDateTime default now(
updatedAtDateTime default now(
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
dati_cancellati_ilDateTimeDa questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts).
uidunicoString
pwdString
telegram_usernameString
telegram_chat_idString

directors

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
firstNameString (obbl.)
lastNameString (obbl.)
emailunicoString (obbl.)
phoneString
photoString
roledirectors_role
DIRETTORE_SPORTIVO DIRIGENTE ACCOMPAGNATORE
default DIRIGENTE
activeBoolean default true
createdByUserIdBigInt
createdAtDateTime default now(
updatedAtDateTime default now(
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
dati_cancellati_ilDateTimeDa questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts).
uidunicoString
pwdString
telegram_usernameString
telegram_chat_idString

documents

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
athlete_idBigInt
nameString (obbl.)
typeString (obbl.)
file_pathString (obbl.)
file_sizeInt
mime_typeString
expiry_dateDateTime
uploaded_atDateTime default now(
created_atDateTime default now(
updated_atDateTime default now(
scopeString default "ATHLETE"
team_idBigInt

events

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
titleString (obbl.)
descriptionString
dateDateTime (obbl.)
timeDateTime
locationString
team_idBigInt
typeString default "training"
visibilityString (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_atDateTime default now(
updated_atDateTime default now(

facilities

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nameString (obbl.)
addressString
cityString
provinceString
postal_codeString
phoneString
emailString
capacityInt
notesString
societaString
campoInt
oraDateTime
activeBoolean default true
created_atDateTime default now(
updated_atDateTime default now(

invitations

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
event_idInt (obbl.)
athlete_idBigInt (obbl.)
statusinvitations_status
pending accepted declined
default pending
created_atDateTime default now(
updated_atDateTime default now(

parent_athletes

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
parentIdBigInt (obbl.)
athleteIdBigInt (obbl.)
relationshipparent_athletes_relationship
PADRE MADRE TUTORE NONNO NONNA ZIO ZIA ALTRO
default PADRE
isPrimaryContactBoolean default false
canPickupBoolean default true
emergencyContactBoolean default false
createdAtDateTime default now(
activeBoolean default true

parents

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
firstNameString (obbl.)
lastNameString (obbl.)
emailunicoString (obbl.)
phoneString
addressString
cityString
provinceString
postalCodeString
fiscalCodeString
relationshipparents_relationship
PADRE MADRE TUTORE NONNO NONNA ZIO ZIA ALTRO
default PADRE
activeBoolean default true
createdAtDateTime default now(
updatedAtDateTime default now(
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
telegram_usernameString
telegram_chat_idString
dati_cancellati_ilDateTimeDa questa data i dati personali sono stati cancellati su richiesta della persona: resta solo cio' che va conservato (vedi cancellazione-dati.dominio.ts).
uidunicoString
pwdString

ruoli

Catalogo ruoli di gioco (parametrizzato; CRUD catalogo solo via DB).

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
codeunicoString (obbl.)
labelString (obbl.)
sortOrderInt (obbl.) default 0
activeBoolean (obbl.) default true

team_players

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
teamIdBigInt (obbl.)
athleteIdBigInt (obbl.)
positionString
ruoloIdInt
jerseyNumberInt
activeBoolean default true
createdAtDateTime default now(
updatedAtDateTime default now(

team_staff

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
teamIdBigInt (obbl.)
staffIdBigInt (obbl.)
staffTypeteam_staff_staffType (obbl.)
COACH DIRECTOR SPORT_DIRECTOR
roleString
activeBoolean default true
createdAtDateTime default now(
updatedAtDateTime default now(

teams

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameString (obbl.)
categoryString (obbl.)
seasonString (obbl.)
struttura_idInt
activeBoolean default true
convocation_modeteam_convocation_mode
ALL_CONVOCATED MANUAL_SELECTION
default MANUAL_SELECTION
ritrovo_minuti_primaIntRitrovo: quanti minuti prima dell'inizio. NULL = non impostato (il messaggio non scrive la riga). La singola partita puo' scavalcarlo.
non_convocati_al_campoString (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"
createdAtDateTime default now(
updatedAtDateTime default now(

training_attendance

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
trainingIdBigInt (obbl.)
athleteIdBigInt (obbl.)
statustraining_attendance_status
present absent late excused
default present
arrivalTimeDateTime
notesString
createdAtDateTime default now(
updatedAtDateTime default now(

training_exceptions

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
teamIdBigInt (obbl.)
exceptionDateDateTime (obbl.)
reasonString
isHolidayBoolean default false
createdAtDateTime default now(

training_templates

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
teamIdBigInt (obbl.)
titleString (obbl.)
descriptionString
dayOfWeektraining_templates_dayOfWeek (obbl.)
monday tuesday wednesday thursday friday saturday sunday
startTimeDateTime (obbl.)
durationInt default 90
locationString
coachIdBigInt
isActiveBoolean default true
impiantoIdInt
campoIdIntDove 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.
quotaInt
agioPrimaInt (obbl.) default 0
agioDopoInt (obbl.) default 0
motivoAgioString
validoDaDateTimeIl periodo in cui la regola vale. NULL = sempre.
validoADateTime
serieIdBigIntI periodi nati dallo stesso taglio condividono la serie.
createdAtDateTime default now(
updatedAtDateTime default now(

trainings

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
teamIdBigInt (obbl.)
templateIdBigInt
titleString (obbl.)
descriptionString
scheduledDateDateTime (obbl.)
durationInt default 90
locationString
coachIdBigInt
statustrainings_status
scheduled completed cancelled
default scheduled
cancelReasonString
cancelledAtDateTime
cancelledByBigInt
impiantoIdIntDove 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`.
campoIdInt
quotaInt
agioPrimaInt (obbl.) default 0
agioDopoInt (obbl.) default 0
motivoAgioString
spogliatoiForzatiString
presenze_registrate_atDateTimeQuando lo staff ha salvato le presenze: le righe nascono gia' «presenti», quindi solo questa data dice se qualcuno le ha guardate davvero.
notesString
createdAtDateTime default now(
updatedAtDateTime default now(

risorse_impianti

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nomeString (obbl.)
indirizzoString
aperturaInt (obbl.)Minuti da mezzanotte: un orario da orologio, non un istante. default 840
chiusuraInt (obbl.) default 1380
noteString
struttura_idInt
attivoBoolean (obbl.) default true
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

risorse_campi

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
impianto_idInt (obbl.)
nomeString (obbl.)
tipoString
superficieString
frazioniInt (obbl.)Divisibilita' MASSIMA, non una partizione fissa. default 1
illuminatoBoolean (obbl.) default false
riassetto_minInt (obbl.) default 10
noteString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

risorse_spogliatoi

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
impianto_idInt (obbl.)
nomeString (obbl.)
capienzaInt (obbl.)Capienza in SQUADRE, non in persone. default 1
esclusoBoolean (obbl.) default false
noteString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

risorse_parametri_categoria

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
categoriaunicoString (obbl.)
frazioni_allenamentoInt (obbl.) default 0
frazioni_partitaInt (obbl.) default 0
spogliatoio_prima_allenamentoInt (obbl.) default 30
spogliatoio_dopo_allenamentoInt (obbl.) default 45
spogliatoio_prima_partitaInt (obbl.) default 60
spogliatoio_dopo_partitaInt (obbl.) default 45
riassetto_allenamentoInt (obbl.) default 10
riassetto_partitaInt (obbl.) default 15
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

risorse_parametri_squadra

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
team_idunicoBigInt (obbl.)
ore_previsteDecimal (obbl.) default 3.0
spogliatoi_abitualiString
genere_forzatorisorse_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_parametriString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

risorse_occupazioni

Occupazioni SENZA un evento dietro: manutenzione, tornei, terzi.

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
campo_idInt (obbl.)
giornoDateTime (obbl.)
inizioInt (obbl.)
durataInt (obbl.)
quotaInt (obbl.) default 1
etichettaString (obbl.)
noteString
created_byBigInt
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

users

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
emailunicoString (obbl.)
passwordString (obbl.)
firstNameString (obbl.)
lastNameString (obbl.)
roleString default "USER"
activeBoolean default true
createdAtDateTime default now(
updatedAtDateTime default now(
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
uidString
pwdString
recovery_emailStringIndirizzo di RECUPERO: non fa login, riceve il promemoria dell'email principale e il link per rifare la password (vedi 20260904160000_utenti_staff).
phoneString
invited_atDateTime
last_login_atDateTime

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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_typeString (obbl.)
user_idBigInt (obbl.)
tokenunicoString (obbl.)
piattaformaString (obbl.)'ios' | 'android'
versione_appString
created_atDateTime default now(
updated_atDateTime default now(
visto_atDateTimeL'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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
tipoString (obbl.)'ALLENAMENTO_2H' (riferimento = trainings.id) · 'CONVOCAZIONE_48H' (riferimento = convocazioni.id)
riferimento_idBigInt (obbl.)
inviato_atDateTime 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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
tipo_attivitaString (obbl.)
attivita_idBigInt (obbl.)
team_idBigInt
autore_tipoString (obbl.)
autore_idBigInt (obbl.)
autore_nomeString (obbl.)
testoString
audio_pathString
audio_mimeString
durata_secInt
created_atDateTime 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`.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
titoloString (obbl.)
testoString (obbl.)
team_idBigInt
autore_tipoString (obbl.)
autore_idBigInt (obbl.)
autore_nomeString (obbl.)
created_atDateTime default now(
ritirato_atDateTime

avvisi_letture

Chi ha letto quale avviso, come coppia del JWT (tipo + id).

ColonnaTipoNote
avviso_idBigInt (obbl.)
lettore_tipoString (obbl.)
lettore_idBigInt (obbl.)
letto_atDateTime default now(

email_change_tokens

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_idBigInt (obbl.)
new_emailString (obbl.)
token_hashString (obbl.)
expires_atDateTime (obbl.)
confirmed_atDateTime
cancelled_atDateTime
created_atDateTime default now(

permission_overrides

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
roleString (obbl.)
resourceString (obbl.)
actionString (obbl.)
contextpermission_context (obbl.)
PUBLIC ALL TEAM OWN
default ALL
enabledBoolean default true
created_byBigInt
created_atDateTime default now(
updated_atDateTime default now(

permission_audit_log

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_idBigInt (obbl.)
actionString (obbl.)
roleString (obbl.)
resourceString
action_typeString
old_valueString
new_valueString
descriptionString
created_atDateTime default now(

permission_versions

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
version_nameunicoString (obbl.)
descriptionString
permissionsString (obbl.)
created_byBigInt
created_atDateTime default now(
is_activeBoolean default false

password_reset_tokens

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_idBigInt
user_typeString'USER', 'ATHLETE', 'COACH', 'DIRECTOR', 'PARENT'
athlete_idBigInt
coach_idBigInt
director_idBigInt
parent_idBigInt
token_hashString (obbl.)
expires_atDateTime (obbl.)
used_atDateTime
created_atDateTime (obbl.) default now(

campionati

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nomeString (obbl.)
stagioneString (obbl.)
categoriaString
livellocampionati_livello (obbl.)
regionale provinciale nazionale internazionale
gironeString (obbl.)Legacy: prima dei gironi in tabella `gironi`. Non usare per logica nuova. default ""
formatocampionati_formato (obbl.)
CINQUE SETTE NOVE UNDICI
num_tempiInt (obbl.) default 2
minuti_per_tempoInt (obbl.) default 45
regola_risultatocampionati_regola_risultato (obbl.)
per_tempo totale_gol
default totale_gol
is_attivoBoolean default true
created_atDateTime default now(
updated_atDateTime default now(

categories

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nameunicoString (obbl.)
descriptionString
age_minInt
age_maxInt
is_activeBoolean default true
sort_orderInt default 0
created_atDateTime default now(
updated_atDateTime default now(

classifiche

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
campionato_idInt
torneo_idInt
girone_idInt
squadra_idBigInt (obbl.)
partite_giocateInt default 0
partite_vinteInt default 0
partite_pareggiateInt default 0
partite_perseInt default 0
gol_fattiInt default 0
gol_subitiInt default 0
differenza_golInt default 0
puntiInt default 0
posizioneInt default 0
created_atDateTime default now(
updated_atDateTime default now(

commenti_partita

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
utente_idBigInt (obbl.)
testoString (obbl.)
is_liveBoolean default false
tempo_numeroInt
minutoInt
created_atDateTime default now(
updated_atDateTime default now(

composizioni_tattiche

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
tempo_numeroInt (obbl.)
difesaInt (obbl.)
centrocampoInt (obbl.)
attaccoInt (obbl.)
noteString
created_atDateTime default now(

convocation_notifications

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
athlete_idBigInt (obbl.)
parent_idBigInt
statusconvocation_notifications_status (obbl.)
convocato non_convocato
messageString
channelsString
sent_atDateTime
created_atDateTime default now(
updated_atDateTime default now(

convocazioni

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
atleta_idInt (obbl.)
convocatoBoolean default false
formazioneconvocazioni_formazione
titolare riserva
disponibilitaconvocazioni_disponibilita
SI NO DA_CONFERMARE
default DA_CONFERMARE
numero_magliaInt
ruoloString
ruoloIdInt
noteString
forzataBoolean (obbl.)Convocato pur senza certificato medico valido: gesto esplicito, non distrazione. La traccia serve alla segreteria per sapere quali certificati inseguire. default false
forzata_motivoString
forzata_daString
forzata_atDateTime
created_atDateTime default now(
updated_atDateTime default now(

eventi_partita

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
tempo_numeroInt (obbl.)
minutoInt (obbl.)
tipoeventi_partita_tipo (obbl.)
gol ammonizione espulsione sostituzione rigore autogol nota
gol_fattoBoolean default true
atleta_coinvolto_idBigInt
atleta_secondario_idBigInt
numero_magliaInt
minuti_giocatiInt
dettagliString
osservazioniString
punizioneeventi_partita_punizione
rigore calcio_di_rigore calcio_di_punizione calcio_d_angolo rimessa_laterale
esito_rigoreeventi_partita_esito_rigore
gol parato fuori palo
created_atDateTime default now(
created_byBigInt (obbl.)

formazioni

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
atleta_idBigInt (obbl.)
numero_magliaInt (obbl.)
ruoloIdInt (obbl.)
statusformazioni_status (obbl.)
titolare panchina
posizione_campoformazioni_posizione_campo
portiere terzino_dx terzino_sx centrale_dx centrale_sx mediano trequartista ala_dx ala_sx centravanti seconda_punta
created_atDateTime default now(
updated_atDateTime default now(

gironi

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
torneo_idInt
campionato_idInt
nomeString (obbl.)
ordineInt (obbl.)
is_attivoBoolean default true
created_atDateTime default now(

squadre_campionati_iscrizioni

Iscrizione ufficiale di una squadra società a un campionato (per stagione). Al più una riga per (team, campionato, stagione).

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
team_idBigInt (obbl.)
campionato_idInt (obbl.)
stagioneString (obbl.)
girone_idInt
formatocampionati_formato
CINQUE SETTE NOVE UNDICI
num_tempiInt
minuti_per_tempoInt
regola_risultatocampionati_regola_risultato
per_tempo totale_gol
is_attivoBoolean default true
created_atDateTime default now(
updated_atDateTime default now(

media_partita

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idInt (obbl.)
utente_idBigInt (obbl.)
tipomedia_partita_tipo (obbl.)
foto video link_streaming
urlString (obbl.)
titoloString
descrizioneString
is_principaleBoolean default false
created_atDateTime default now(
updated_atDateTime default now(

notification_group_members

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
group_idInt (obbl.)
user_idBigInt
athlete_idBigInt
emailString
telegram_chat_idString
phoneString
created_atDateTime default now(

notification_groups

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nameString (obbl.)
descriptionString
typenotification_groups_type
custom system
default custom
created_byBigInt
created_atDateTime default now(
updated_atDateTime 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

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
typenotification_history_type (obbl.)
email telegram both
template_idInt
subjectString
messageString
recipients_countInt default 0
recipients_dataString
statusnotification_history_status
sent failed partial
default sent
sent_byBigInt
sent_atDateTime default now(
error_messageString

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

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nameString (obbl.)
descriptionString
categorynotification_templates_category
convocation non_convocation document_expiry training_reminder match_update general
default general
subjectString
message_textString
message_htmlString
telegram_messageString
channel_typenotification_templates_channel_type
email telegram both
default both
variablesString
is_activeBoolean default true
created_byBigInt
created_atDateTime default now(
updated_atDateTime default now(

partita_live_state

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
partita_idunicoInt (obbl.)
statopartita_live_state_stato (obbl.)
preparazione in_corso pausa fine_tempo fine_incontro
default preparazione
tempo_numeroInt (obbl.) default 1
minuto_correnteInt default 0
secondo_correnteInt default 0
tempo_inizioDateTime
tempo_pausaDateTime
tempo_riprendiDateTime
tempo_fineDateTime
posizioni_giocatoriString
sostituzioni_effettuateString
minuti_giocati_per_atletaString
timer_elapsed_offset_secInt (obbl.) default 0
timer_segment_started_atDateTime
overtime_ack_minutoInt
created_atDateTime default now(
updated_atDateTime default now(

partite_minutaggio

Snapshot a fine partita: minuti per atleta e tempo (da JSON live state).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
partita_idInt (obbl.)
atleta_idBigInt (obbl.)
tempoInt (obbl.)
minuti_giocatiFloat (obbl.)
created_atDateTime default now(
updated_atDateTime default now(

partite

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
tipopartite_tipo (obbl.)
amichevole interna torneo campionato
data_oraDateTime (obbl.)
ritrovo_oraDateTimeL'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_idInt
squadra_casa_idBigInt
squadra_trasf_idBigInt
squadra_avversaria_idInt
squadra_avversaria_nomeString
campionato_idInt
torneo_idInt
girone_idInt
formatopartite_formato (obbl.)
CINQUE SETTE NOVE UNDICI
default dbgenerated("11"
num_tempiInt (obbl.) default 2
minuti_per_tempoInt (obbl.) default 45
regola_risultatopartite_regola_risultato (obbl.)
per_tempo totale_gol
default totale_gol
statopartite_stato (obbl.)
programmata in_corso terminata annullata
default programmata
risultato_casaInt default 0
risultato_trasfertaInt default 0
punteggi_tempiString
noteString
note_famigliaString«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_atDateTime default now(
updated_atDateTime default now(
created_byBigInt
squadra_societa_idInt
squadra_societa_in_casaBoolean default false
impiantoIdIntDove si gioca, fra le risorse gestite: le stesse colonne che ha l'allenamento, perche' la collocazione e' un attributo dell'evento.
campoIdInt
quotaInt
agioPrimaInt (obbl.) default 0
agioDopoInt (obbl.) default 0
motivoAgioString
spostataInGrigliaBoolean (obbl.)Qualcuno le ha cambiato data o ora dalla pianificazione. default false
partita_live_statepartita_live_state

seasons

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameunicoString (obbl.)
start_dateDateTime (obbl.)
end_dateDateTime (obbl.)
activeBoolean default true
created_atDateTime default now(
updated_atDateTime default now(

squadre_avversarie

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nomeString (obbl.)
annoInt (obbl.)
cittaString (obbl.)
category_idInt
struttura_idInt
created_atDateTime default now(
updated_atDateTime default now(
created_byInt

strutture

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nomeString (obbl.)
indirizzoString
cittaString
provinciaString
capString
telefonoString
emailString
tipostrutture_tipo (obbl.)
casa trasferta neutro
default neutro
is_attivaBoolean default true
societaString
noteString
campo_figcInt
oraDateTime
capacityInt
created_atDateTime default now(
updated_atDateTime default now(

telegram_groups

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
chat_idunicoString (obbl.)
nameString (obbl.)
descriptionString
member_countInt default 0
last_syncDateTime default now(
created_atDateTime default now(

tornei

ColonnaTipoNote
idPKInt (obbl.) default autoincrement(
nomeString (obbl.)
stagioneString (obbl.)
data_inizioDateTime (obbl.)
data_fineDateTime (obbl.)
struttura_idInt
formatotornei_formato (obbl.)
CINQUE SETTE NOVE UNDICI
num_tempiInt (obbl.) default 2
minuti_per_tempoInt (obbl.) default 45
regola_risultatotornei_regola_risultato (obbl.)
per_tempo totale_gol
default totale_gol
is_attivoBoolean default true
created_atDateTime default now(
updated_atDateTime default now(

parent_registration_requests

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
parent_firstNameString (obbl.)
parent_lastNameString (obbl.)
parent_emailunicoString (obbl.)
parent_phoneString
parent_addressString
parent_cityString
parent_provinceString
parent_postalCodeString
parent_fiscalCodeString
parent_relationshipString default "PADRE"
accepted_terms_timestampDateTime
medical_privacy_timestampDateTime
marketing_consentBoolean default false
is_adult_confirmedBoolean
accepted_terms_versionString
medical_privacy_versionString
operational_notifications_timestampDateTime
operational_notifications_versionString
children_textStringNome e cognome atleti (testo libero, una riga per atleta) per validazione admin
children_dataJson (obbl.)
email_verification_tokenString
email_verifiedBoolean default false
email_verified_atDateTime
statusparent_registration_request_status
PENDING APPROVED REJECTED
default PENDING
approved_atDateTime
approved_byBigInt
rejection_reasonString
rejected_atDateTime
rejected_byBigInt
password_setup_tokenString
password_setup_token_expires_atDateTime
pending_password_hashStringbcrypt della password scelta in fase di richiesta (app/web); applicata all'approvazione
linked_athlete_idsJsonID atleti anagrafica scelti dall'admin in modifica; in approvazione si collegano al genitore (priorità sul testo libero)
created_atDateTime default now(
updated_atDateTime default now(

preregistrations

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_first_nameString (obbl.)Atleta (soggetto principale della preiscrizione)
athlete_last_nameString (obbl.)
athlete_date_of_birthDateTime (obbl.)
athlete_genderString
athlete_fiscal_codeString
athlete_birth_placeString
athlete_residence_addressStringResidenza atleta (dati aggiuntivi raccolti al completamento — Ondata 3)
athlete_residence_cityString
athlete_residence_provinceString
athlete_residence_capString
is_minorBoolean (obbl.) default true
categoria_richiestaString
contact_emailString (obbl.)Contatto principale del flusso (genitore se minore, atleta se maggiorenne)
athlete_emailString
athlete_phoneString
guardian1_first_nameStringTutore/genitore 1 (obbligatorio se minorenne)
guardian1_last_nameString
guardian1_relationshipString
guardian1_emailString
guardian1_phoneString
guardian1_fiscal_codeString
guardian2_first_nameStringTutore/genitore 2 (opzionale)
guardian2_last_nameString
guardian2_relationshipString
guardian2_emailString
guardian2_phoneString
guardian2_fiscal_codeString
open_day_noteStringOpen day / note libere del richiedente
notesString
privacy_accepted_atDateTimeConsenso base al trattamento dati per la gestione della preiscrizione
statusString (obbl.)Workflow: PENDING | CONFERMATA | DECLINATA (esteso nelle ondate successive) default "PENDING"
seasonString
confirmed_atDateTimeAudit conferma/declino (id utente attore, senza FK: tabella standalone)
confirmed_byBigInt
declined_atDateTime
declined_byBigInt
decline_reasonString
completion_tokenStringPredisposizione Ondata 3 (completamento dati in area riservata) e ⑤ tesseramento
completion_token_expires_atDateTime
linked_athlete_idBigInt
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

tesseramento_fees

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
seasonString (obbl.)
enrollment_typeString (obbl.)NUOVO | RINNOVO | ENTRAMBI default "ENTRAMBI"
birth_yearIntannata; null = tutte le annate (default per stagione+tipo)
category_idIntcategoria/livello (es. Prima squadra, Agonistica); null = tutte
amount_centsInt (obbl.)
labelString
activeBoolean (obbl.) default true
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

category_seasons

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
seasonString (obbl.)
category_idInt (obbl.)
birth_yearInt (obbl.)
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

athlete_fee_overrides

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_idBigInt (obbl.)
seasonString (obbl.)
amount_centsInt (obbl.)0 = esente (solo controllo documentale)
noteString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

registration_requirements

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
kindString (obbl.)UPLOAD | ACK — resta per compatibilità; la verità è `modalita`
modalitaString (obbl.)COME si adempie: CARICA (il file lo porta la famiglia) · LEGGE (atto unilaterale) · SCEGLIE (sì/NO) · FIRMA. default "CARICA"
doc_keyunicoStringChiave di sistema per handling speciale (es. medical_certificate → PDF visita). null = voce custom del club.
labelString (obbl.)
descriptionString
mandatoryBoolean (obbl.)= livello diverso da FACOLTATIVO (tenuto in sincronia dal servizio) default true
livelloString (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_scalaString (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_tesseramentoBoolean (obbl.)L'altra domanda, che la scala non esprime: serve per CHIUDERE LA PRATICA? Il tesseramento è un atto, non un'attività. default false
requires_expiryBoolean (obbl.)solo UPLOAD: traccia data di scadenza (es. certificato medico) default false
versionStringper ACK: versione della presa visione
applies_scopeString (obbl.)categoria (futuro): ALL | per-categoria default "ALL"
applies_toString (obbl.)ENTRAMBI | NUOVI | RINNOVI (tipo iscrizione) default "ENTRAMBI"
renewal_reuseBoolean (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_pathStringIl modello che la famiglia legge: un file OPPURE un testo scritto in piattaforma. Non entrambi.
modello_nameString
modello_mimeString
modello_testoString
modello_hashStringImpronta di ciò che è pubblicato: finisce nell'adempimento ed è l'unica prova di *cosa* è stato firmato.
ammette_congiuntaBoolean (obbl.)Solo per FIRMA: l'atto può richiedere entrambi i genitori (uso pubblico di foto e video del minore). default false
sort_orderInt (obbl.) default 0
activeBoolean (obbl.) default true
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

registration_submissions

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
preregistration_idBigIntAdempimento legato a una preiscrizione (onboarding nuovo) OPPURE a un atleta×stagione (rinnovo/esistente). Uno dei due.
athlete_idBigInt
seasonString
requirement_idBigInt (obbl.)
kindString (obbl.)snapshot: UPLOAD | ACK
file_pathStringUPLOAD percorso su storage privato (non servito staticamente)
file_nameString
mime_typeString
file_sizeInt
expiry_dateDateTime
acknowledged_atDateTimeACK — doppia presa visione step 1: dichiaro di aver preso visione
confirmed_atDateTimestep 2: conferma vincolante
versionStringsnapshot versione ACK
statusString (obbl.)pending | done | sospeso (consenso congiunto in attesa del secondo genitore) default "pending"
esitoStringPer SCEGLIE: il NO chiude il requisito quanto il sì — «rifiutato» non è «mancante». ACCETTATO | RIFIUTATO
firma_profiloStringLA TRACCIA: vale come firma elettronica semplice solo se dice chi, quando, da dove e su quale versione.
firma_ipString
firma_user_agentString
doc_hashString
su_cartaBoolean (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_daString
verificaString (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_motivoString
verifica_daString
verifica_atDateTime
congiuntaBooleanConsenso congiunto: chi firma per primo dichiara se la sua firma basta.
secondo_nomeString
secondo_emailString
secondo_tokenunicoString
secondo_invitato_atDateTime
secondo_firmato_atDateTime
secondo_profiloString
secondo_ipString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

payment_items

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameString (obbl.)
descriptionString
amount_centsInt (obbl.)
recurrenceString (obbl.)una_tantum | mensile | annuale default "una_tantum"
entry_typeStringclassificazione contabile: istituzionale | commerciale
is_tesseramentoBoolean (obbl.)voce di sistema: quota tesseramento (governata da Quote tesseramento, non editabile a mano) default false
contributo_a_carico_clubBoolean (obbl.)Il Contributo al servizio di pagamento online lo sostiene la societa' invece della famiglia (Listino Art. 5.2). default false
ledger_account_idBigIntVoce del piano dei conti su cui l'incasso di questa quota finisce in prima nota (Tesoreria). Null = la voce non alimenta la contabilità.
seasonStringstagione di riferimento della voce (es. 2026/2027); base per economics/bilancio
activeBoolean (obbl.) default true
sort_orderInt (obbl.) default 0
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

payment_dues

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
item_idBigInt (obbl.)
athlete_idBigInt
parent_idBigInt
preregistration_idBigIntQuota tesseramento legata a una preiscrizione non ancora materializzata in atleta (Fase 2 #4b).
amount_centsInt (obbl.)
due_dateDateTime
periodString
statusString (obbl.)pending | processing (SEPA in lavorazione) | paid | canceled default "pending"
channelStringstripe | contanti | bonifico | altro
paid_atDateTime
noteString
stripe_payment_intent_idString
stripe_checkout_session_idString
fee_centsIntcosto per il club del pagamento online: Commissione + Contributo se lo sostiene lui. Solo canale stripe, fissato al pagamento
commissione_centsIntCommissione di Piattaforma e Contributo del pagamento che ha saldato la quota (PRM-02, sezione E).
contributo_centsInt
strumentoStringcarta | sepa | altro
receipt_numberString
ricevuta_annullata_numeroStringRicevuta annullata da una contestazione o da un rimborso: il numero resta qui, la quota torna da pagare.
ricevuta_annullata_ilDateTime
ricevuta_annullata_motivoString
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
due_idBigInt (obbl.)
tokenunicoString (obbl.)
email_toString (obbl.)
statusString (obbl.)registrato | inviato | errore default "registrato"
error_messageString
inviato_ilDateTime
preso_visione_ilDateTime
created_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_idBigInt (obbl.)
seasonString (obbl.)es. "2026/2027"
tipoString (obbl.)rinnovo | nuovo
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

club_settings

ColonnaTipoNote
idPKInt (obbl.) default 1
legal_nameString
fiscal_codeString
vat_numberString
addressString
logo_pathString
receipt_notesString
sportStringsettore sportivo della società (calcio, volley, basket…): guida i preset categorie
federationsStringfederazioni di affiliazione (codici csv: FIGC,CSI,FIPAV,FIB,FIR,…); il preset categorie è per (federazione × sport)
tessera_validita_mesiIntDurata 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_verificatoString (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_insolutoInt (obbl.)Da quanti giorni un addebito scaduto conta come insoluto ai fini di ciò che l'atleta può fare. default 30
convocazioni_apri_all_inizioBoolean (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_abilitateBoolean (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_ilDateTime
foto_abilitate_daString
foto_proroga_mesiInt (obbl.)Mesi oltre la fine della stagione per cui le foto si conservano (0 = fine stagione). default 0
avviso_riprese_allegaBoolean (obbl.)PRM-07 §F: allega l'avviso riprese (SPO-M05) alle convocazioni dei tornei. default false
websiteStringBLOCCO 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
registrationsStringmatricole/affiliazioni da stampare (es. "Matricola FIGC 930021 - Matricola CONI 94651")
footer_noteStringriga libera del footer (es. di chi è la proprietà del logo)
logo_urlStringLogo 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_presetStringASPETTO — 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_themeString'light' | 'dark' — default del club, l'utente può sovrascriverlo
legal_formStringIDENTITA' 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_nameString
legal_representative_fiscal_codeString
pecString
emailStringemail amministrativa
phoneString
privacy_emailStringper le richieste degli interessati
dpoStringsolo se nominato
sdi_codeStringcodice destinatario per la fatturazione elettronica
consent_second_parent_requiredBoolean (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_plusString (obbl.)atleta | genitore | entrambi default "genitore"
updated_atDateTime (obbl.) default now(

identity_verification_settings

Impostazioni per-tenant della verifica identità (riga singleton id=1).

ColonnaTipoNote
idPKInt (obbl.) default 1
required_levelString (obbl.)NONE | DECLARED | SUBSTANTIAL | HIGH default "NONE"
allowed_methodsString (obbl.)CSV: AUTOCERT,IDV,SPID default "AUTOCERT"
idv_providerStringes. stripe_identity | onfido (metodo B)
reverify_after_monthsIntnull = verifica valida a tempo indeterminato
autocert_textStringoverride del testo di autocertificazione
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
subject_typeString (obbl.)PREREGISTRATION | PARENT | ATHLETE
subject_idBigInt (obbl.)
methodString (obbl.)AUTOCERT | IDV | SPID
levelString (obbl.)DECLARED | SUBSTANTIAL | HIGH
statusString (obbl.)pending | verified | rejected | expired default "pending"
declared_full_nameStringMetodo A — autocertificazione (dati dichiarati + snapshot del testo accettato)
declared_fiscal_codeString
declared_relationshipString
declaration_versionString
declaration_textString
providerStringMetodo B — IDV (provider esterno documento+selfie)
provider_refString
evidence_pathStringeventuale evidenza su storage privato
verified_atDateTimeEsito e audit
expires_atDateTime
ip_addressString
user_agentString
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

fiscal_settings

Impostazioni contabili per-tenant (riga singleton id=1).

ColonnaTipoNote
idPKInt (obbl.) default 1
accounting_enabledBoolean (obbl.)interruttore della sezione Tesoreria default false
regimeString (obbl.)398 | ordinario | forfettario | ETS default "398"
schemeString (obbl.)CASSA (< 220.000 €) | COMPETENZA default "CASSA"
exercise_start_monthInt (obbl.)mese di apertura dell'esercizio sociale (1=gennaio, 7=luglio, 9=settembre) default 1
plafond_centsBigInt (obbl.)plafond proventi commerciali L. 398/91 (400.000 €) default 40000000
vat_default_percentInt (obbl.) default 22
locked_untilDateTimechiusura periodo: sotto questa data i movimenti non si toccano
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
sectionString (obbl.)A | B | C | D | E
directionString (obbl.)ENTRATA | USCITA
codeunicoString (obbl.)es. "A.E.2"
official_nameString (obbl.)
labelString (obbl.)
natureString (obbl.)ISTITUZIONALE | COMMERCIALE (voci * dello schema → plafond 398/91) default "ISTITUZIONALE"
parent_idBigIntsottoconto del club appeso a una voce ufficiale
is_systemBoolean (obbl.) default false
activeBoolean (obbl.) default true
sort_orderInt (obbl.) default 0
created_atDateTime (obbl.) default now(
updated_atDateTime (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).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameString (obbl.)
typeString (obbl.)CASSA | BANCA | POSTALE | CONTO_FEDERALE | STRIPE | ALTRO
ibanString
opening_balance_centsBigInt (obbl.) default 0
opening_dateDateTime
activeBoolean (obbl.) default true
sort_orderInt (obbl.) default 0
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

counterparties

Controparti dei movimenti: fornitori, sponsor, enti, persone.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameString (obbl.)
kindString (obbl.)FORNITORE | SPONSOR | ENTE | PERSONA | ALTRO default "FORNITORE"
fiscal_codeString
vat_numberString
emailString
phoneString
noteString
activeBoolean (obbl.) default true
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
entry_dateDateTime (obbl.)
directionString (obbl.)ENTRATA | USCITA (deve combaciare con la voce di piano dei conti)
amount_centsBigInt (obbl.)
account_idBigInt (obbl.)
cash_account_idBigInt (obbl.)
counterparty_idBigInt
descriptionString (obbl.)
doc_typeStringRICEVUTA | FATTURA | SCONTRINO | ALTRO
doc_numberString
doc_dateDateTime
attachment_pathStringGiustificativo su storage privato (non servito staticamente), come i documenti d'iscrizione
attachment_nameString
attachment_mimeString
attachment_sizeInt
seasonStringAnalitica: a quale stagione/squadra/categoria imputare il movimento (costo per categoria)
team_idBigInt
category_idInt
natureString (obbl.)default dalla voce, sovrascrivibile default "ISTITUZIONALE"
vat_percentInt
vat_centsBigInt
sourceString (obbl.)MANUAL | PAYMENT_DUE | STRIPE_FEE | STAFF_COMP | SPONSOR | RECURRING | BANK_IMPORT default "MANUAL"
source_idBigInt
reversal_of_idBigIntstorno: movimento di segno opposto che annulla un altro
reconciled_atDateTime
bank_tx_idBigInt
created_byBigInt
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

expense_schedules

Impegno di spesa ricorrente o una tantum (affitto impianti, affiliazione, assicurazione, commercialista). Definito una volta, si srotola in scadenze.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
labelString (obbl.)
directionString (obbl.)USCITA (affitti, affiliazioni…) o ENTRATA (rate sponsor, contributi a tranche). default "USCITA"
account_idBigInt (obbl.)
cash_account_idBigInt
counterparty_idBigInt
amount_centsBigInt (obbl.)
recurrenceString (obbl.)UNA_TANTUM | MENSILE | BIMESTRALE | TRIMESTRALE | SEMESTRALE | ANNUALE default "MENSILE"
start_dateDateTime (obbl.)
end_dateDateTime
due_dayIntgiorno del mese della scadenza (troncato a fine mese)
seasonString
team_idBigInt
natureString (obbl.) default "ISTITUZIONALE"
noteString
activeBoolean (obbl.) default true
created_atDateTime (obbl.) default now(
updated_atDateTime (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`).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
schedule_idBigInt (obbl.)
due_dateDateTime (obbl.)
amount_centsBigInt (obbl.)
statusString (obbl.)pending | paid | skipped default "pending"
paid_atDateTime
entry_idBigInt
noteString
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
seasonString (obbl.)
account_idBigInt (obbl.)
team_idBigInt
amount_centsBigInt (obbl.)
noteString
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
kindString (obbl.) default "ATLETI"
statusString (obbl.) default "BOZZA"
file_nameString (obbl.)
file_storedString (obbl.)
sheet_nameString
csv_delimiterString
encodingString
columns_jsonString
mapping_jsonString
options_jsonString
seasonString
total_rowsInt (obbl.) default 0
ready_rowsInt (obbl.) default 0
warn_rowsInt (obbl.) default 0
error_rowsInt (obbl.) default 0
dup_rowsInt (obbl.) default 0
match_rowsInt (obbl.) default 0
athletes_createdInt (obbl.) default 0
athletes_updatedInt (obbl.) default 0
parents_createdInt (obbl.) default 0
parents_linkedInt (obbl.) default 0
guardians_pendingInt (obbl.) default 0
teams_createdInt (obbl.) default 0
created_team_idsString
undo_reportString
created_byBigInt
applied_byBigInt
undone_byBigInt
applied_atDateTime
undone_atDateTime
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
batch_idBigInt (obbl.)
row_indexInt (obbl.)
raw_jsonString
parsed_jsonString
issues_jsonString
statusString (obbl.) default "PRONTA"
actionString (obbl.) default "CREA"
match_athlete_idBigInt
match_kindString
created_athlete_idBigInt
created_parent_idsString
guardian_pendingBoolean (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_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

import_profiles

Mappatura colonne→campi salvata: il secondo file dello stesso gestionale entra senza rifare il lavoro.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
nameunicoString (obbl.)
kindString (obbl.) default "ATLETI"
mapping_jsonString (obbl.)
created_byBigInt
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_idBigInt (obbl.)
seasonString (obbl.)
tokenunicoString (obbl.)
expires_atDateTime
sent_atDateTime
sent_toString
send_countInt (obbl.) default 0
opened_atDateTime
completed_atDateTime
created_byBigInt
created_atDateTime (obbl.) default now(
updated_atDateTime (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.

ColonnaTipoNote
ambitoString (obbl.)POSIZIONE | PAGAMENTO
chiaveString (obbl.)
scalaString (obbl.)Sei cifre, una per attività: 2 consentito · 1 segnalato · 0 bloccato. Vedi common/attivita.dominio.ts. default "222222"
updated_atDateTime (obbl.) default now(

foto_attivita

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
tipo_attivitaString (obbl.)
attivita_idBigInt (obbl.)
team_idBigInt (obbl.)
stagioneString (obbl.)
file_pathString (obbl.)
anteprima_pathString (obbl.)
mimeString (obbl.)
larghezzaInt
altezzaInt
byteInt
scattata_ilDateTime (obbl.)
luogo_nomeString
latDecimal
lngDecimal
didascaliaString (obbl.)
statoString (obbl.)PRM-07 §C: pubblicata | in_moderazione (caricata da una famiglia) | respinta default "pubblicata"
moderata_atDateTime
moderata_da_tipoString
moderata_da_idBigInt
moderata_da_nomeString
motivo_rifiutoString
autore_tipoString (obbl.)
autore_idBigInt (obbl.)
autore_nomeString (obbl.)
created_atDateTime default now(
conserva_finoDateTime (obbl.)
cancellata_atDateTime
cancellata_da_tipoString
cancellata_da_idBigInt
cancellata_da_nomeString

foto_atleti

ColonnaTipoNote
foto_idBigInt (obbl.)
athlete_idBigInt (obbl.)

foto_condivisioni

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
foto_idBigInt (obbl.)
persona_tipoString (obbl.)
persona_idBigInt (obbl.)
persona_nomeString (obbl.)
created_atDateTime default now(

richieste_cancellazione

La richiesta di cancellazione dei dati fatta dalla persona (vedi la migrazione 20260918100000_cancellazione_dati e cancellazione-dati.dominio.ts).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
statoString (obbl.) default "DA_CONFERMARE"
richiedente_tipoString (obbl.)
richiedente_idBigInt (obbl.)
richiedente_nomeString (obbl.)
richiedente_emailString
canaleString (obbl.) default "sito"
token_hashString
token_scade_ilDateTime
richiesta_ilDateTime (obbl.)
confermata_ilDateTime
avvisati_ilDateTime
ultimo_promemoria_ilDateTime
eseguita_ilDateTime
eseguita_daString
annullata_ilDateTime
annullata_daString
motivo_annullamentoString
created_atDateTime default now(
updated_atDateTime default now(

richieste_cancellazione_persone

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
richiesta_idBigInt (obbl.)
tipoString (obbl.)
persona_idBigInt (obbl.)
nomeString (obbl.)
emailString
eseguita_ilDateTime
esitoJson

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`.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
definition_codeString (obbl.)SPO-M01, SPO-M02… (dal manifesto).
template_version_idStringLa 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_labelString
instance_versionInt (obbl.)Progressivo per club e per definizione: 1, 2, 3…
merge_valuesJsonI valori dei campi di unione ({{club.*}} e quelli «da compilare»).
enabled_blocksJsonI blocchi opzionali accesi: ["dpo", "pubblicazione_esterna", "minori"…].
custom_paragraphString«Testo aggiuntivo del club», in posizione fissa, con limite di lunghezza.
rendered_htmlStringIl testo reso (HTML) e il PDF immutabile con la sua impronta.
rendered_pdf_pathString
sha256String
statusString (obbl.)draft | published | superseded default "draft"
originString (obbl.)template = compilata dal modello · migrated = il testo che il club usava prima di PRM-01. default "template"
responsibility_confirmed_atDateTimeLa spunta «Confermo che il testo e' stato verificato dal club, che ne e' titolare e responsabile».
published_atDateTime
published_byString
requires_reacceptanceBoolean (obbl.)Alla pubblicazione: le famiglie devono riaccettare? Se no, motivazione obbligatoria (aggiornamento non sostanziale). default true
non_substantial_reasonString
effective_untilDateTime
created_atDateTime (obbl.) default now(
updated_atDateTime (obbl.) default now(

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).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_idBigInt (obbl.)
instance_idBigInt (obbl.)
definition_codeString (obbl.)
instance_sha256_snapshotString
accepted_by_user_typeString (obbl.)Chi firma: identita' del JWT (PARENT#12, ATHLETE#7) o chi registra il cartaceo.
accepted_by_user_idBigInt (obbl.)
signer_capacityString (obbl.)self_adult | parent_guardian | self_minor_14_plus
signer_full_nameString (obbl.)
consent_items_resultJson (obbl.)Le spunte: {code: {value: true|false, at: ISO}} per ogni consent_item; la presa visione ha value true.
accepted_atDateTime (obbl.)
ip_addressString
user_agentString
acceptance_typeString (obbl.)online | signed_offline | migrated default "online"
offline_file_pathString
offline_registered_byString
pending_second_signerBoolean (obbl.)Doppio firmatario: la prima firma dichiara di aspettarne una seconda; la seconda cita la prima. default false
completes_acceptance_idBigInt
seasonStringLa stagione in cui e' stata raccolta (per la riconferma annuale, TP-13).
created_atDateTime (obbl.) default now(

La REVOCA di un singolo consenso: record a se', mai una modifica dell'accettazione.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
athlete_idBigInt (obbl.)
consent_item_codeString (obbl.)
revoked_by_user_typeString (obbl.)
revoked_by_user_idBigInt (obbl.)
revoked_by_full_nameString
revoked_atDateTime (obbl.)
ip_addressString
user_agentString
noteString
created_atDateTime (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).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_typeString (obbl.)
user_idBigInt (obbl.)
definition_codeString (obbl.)
version_idString (obbl.)
version_labelString (obbl.)
document_sha256String (obbl.)
accepted_atDateTime (obbl.)
ip_addressString
user_agentString
on_behalf_of_athlete_idsJson
acceptance_typeString (obbl.)online | migrated default "online"
created_atDateTime (obbl.) default now(

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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
declaration_keyString (obbl.)
touchpointString (obbl.)
user_typeString
user_idBigInt
athlete_idBigInt
referenceStringPer le dichiarazioni anonime (preiscrizione): un riferimento alla pratica.
declared_atDateTime (obbl.)
ip_addressString
user_agentString
created_atDateTime (obbl.) default now(

Gli EVENTI DI LETTURA: il documento e' stato aperto, scorso fino in fondo, scaricato — prima che una casella si abiliti (Art. 3.2 (iii)).

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_typeString
user_idBigInt
definition_codeString (obbl.)Cosa e' stato letto: un documento del Gestore (codice + versione) o un'istanza del club.
version_labelString
instance_idBigInt
eventString (obbl.)opened | scrolled_to_end | downloaded
occurred_atDateTime (obbl.)
ip_addressString

communication_preferences

PRM-05 §D: preferenze per canale delle comunicazioni facoltative. Assente = acceso.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_typeString (obbl.)
user_idBigInt (obbl.)
channelString (obbl.)push | email
enabledBoolean (obbl.) default true
updated_atDateTime (obbl.) default now(

foto_segnalazioni

PRM-07 §C: la segnalazione di una foto. Le righe restano anche da chiuse: sono la prova.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
foto_idBigInt (obbl.)
categoriaString (obbl.)inappropriata | minore_non_consenziente | dati_personali | grave | altro
noteString
segnalata_da_tipoString (obbl.)
segnalata_da_idBigInt (obbl.)
segnalata_da_nomeString (obbl.)
created_atDateTime (obbl.) default now(
statoString (obbl.)aperta | chiusa default "aperta"
esitoString
chiusa_atDateTime
chiusa_da_nomeString

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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
user_typeString
user_idBigInt
email_mascherataString
esitoString (obbl.)riuscito | credenziali_errate | bloccato | demo_scaduta
ip_addressString
user_agentString
occurred_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
tipoString (obbl.)periodica | completa
oggettoString (obbl.)
user_typeString (obbl.)
user_idBigInt (obbl.)
user_nomeString (obbl.)
user_ruoloString
ip_addressString
entitaJson
righeInt
con_allegatiBoolean (obbl.) default false
byteBigInt
sha256String
esitoString (obbl.)riuscita | fallita default "riuscita"
erroreString
custodia_accettataBoolean (obbl.) default false
occurred_atDateTime (obbl.) default now(

esportazioni_avvisi

L'evidenza dei promemoria mandati al club (Art. 11-bis.2). Append-only.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
tipoString (obbl.)promemoria_trimestrale | ritardo
destinatariString (obbl.)
giorni_dall_ultimaInt
inviato_atDateTime (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.

ColonnaTipoNote
idPKBigInt (obbl.) default autoincrement(
due_idBigInt (obbl.)
statoString (obbl.)avviato | in_lavorazione | pagato | fallito | contestato | rimborsato | abbandonato default "avviato"
strumentoString
quota_centsInt (obbl.)
contributo_centsInt (obbl.)
commissione_centsInt (obbl.)
commissione_iva_centsIntIVA della Commissione, quando la Commissione e' IVA esclusa (modello a fasce, Listino rev. 4). Null = Commissione IVA compresa (modelli di prima).
application_fee_centsInt (obbl.)
totale_pagatore_centsInt (obbl.)
netto_club_centsInt (obbl.)
contributo_a_caricoString (obbl.)famiglia | club
regolaString (obbl.)listino | precedente
listino_versione_idString
listino_versioneString
pianoString
stripe_checkout_session_idunicoString
stripe_payment_intent_idString
stripe_charge_idString
stripe_fee_centsIntLa commissione di Stripe, letta dalla balance transaction. Solo da mostrare: mai nei totali.
fee_restituita_centsIntCommissione e Contributo si restituiscono solo se Stripe restituisce l'application fee (Art. 7.6).
motivoString
avviato_ilDateTime (obbl.) default now(
in_lavorazione_ilDateTime
pagato_ilDateTime
fallito_ilDateTime
contestato_ilDateTime
rimborsato_ilDateTime
updated_atDateTime (obbl.) default now(