entity AuditLog {
  entitaTipo TipoEntita
  entitaId Long
  azione AzioneAudit
  dettagli String
  ipAddress String
  createdAt Instant
}

entity Disponibilita {
  giornoSettimana GiornoSettimana
  dataSpecifica LocalDate
  oraInizio Instant
  oraFine Instant
  orarioInizio String
  orarioFine String
  tipo TipoDisponibilita
  note String
}

entity Notifica {
  tipoCanale TipoCanaleNotifica
  tipoEvento TipoEventoNotifica
  messaggio String
  inviata Boolean
  inviataAt Instant
  errore String
  createdAt Instant
}

entity Prenotazione {
  oraInizio Instant
  oraFine Instant
  stato StatoPrenotazione
  motivoEvento String
  numeroPartecipanti Integer
  noteUtente String
}

entity Conferma {
  motivoConferma String
  tipoConferma TipoConferma
}

entity Struttura {
  nome String
  descrizione String
  indirizzo String
  capienzaMax Integer
  attiva Boolean
  fotoUrl String
  createdAt Instant
  updatedAt Instant
}

entity UtenteApp {
  username String required unique
  email String required
  telefono String
  ruolo Ruolo required
  attivo Boolean required
  nome String
  cognome String
  luogoNascita String
  dataNascita String
  residente String
  societa String
  sede String
  codfiscale String
  telefonoSoc String
  emailSoc String
}

entity Liberatoria {
  accettata Instant
}

entity ModelloLiberatoria {
  nome String
  testo String
  documento Blob
  validoDal Instant
  validoAl Instant
}

entity Messaggio {
  spedito Instant
  testo String
  letto Instant
}

enum TipoEntita {
  PRENOTAZIONE,
  CONFERMA
}

enum TipoConferma {
  CONFERMATA,
  RIFIUTATA
}
enum AzioneAudit {
  CREATE,
  UPDATE,
  DELETE,
  CONFIRM,
  REJECT
}
enum GiornoSettimana {
  LUNEDI,
  MARTEDI,
  MERCOLEDI,
  GIOVEDI,
  VENERDI,
  SABATO,
  DOMENICA
}
enum TipoDisponibilita {
  DISPONIBILE,
  CHIUSURA
}
enum TipoCanaleNotifica {
  EMAIL,
  WHATSAPP,
  SISTEMA
}
enum TipoEventoNotifica {
  RICHIESTA_CREATA,
  PRENOTAZIONE_CONFERMATA,
  PRENOTAZIONE_RIFIUTATA,
  REMINDER,
  ANNULLAMENTO
}
enum StatoPrenotazione {
  RICHIESTA,
  CONFERMATA,
  RIFIUTATA,
  ANNULLATA
}
enum Ruolo {
  USER,
  INCARICATO,
  ADMIN
}

relationship OneToOne {
  Prenotazione to Conferma
  UtenteApp{internalUser(login)} to User with builtInEntity
}


relationship ManyToOne {
  AuditLog{utente(username)} to UtenteApp
  Disponibilita{struttura(nome)} to Struttura{disponibilita}
  Notifica{conferma} to Conferma
  Prenotazione{utente(username)} to UtenteApp
  Prenotazione{struttura(nome)} to Struttura
  Conferma{confermataDa(username)} to UtenteApp
  Messaggio{utente(username)} to UtenteApp
  ModelloLiberatoria{struttura} to Struttura{moduliLiberatorie}
  Liberatoria{utente(username)} to UtenteApp{liberatorie}
  Liberatoria{modelloLiberatoria} to ModelloLiberatoria
}

dto AuditLog, Disponibilita, Notifica, Prenotazione, Conferma, Struttura, UtenteApp, Messaggio, Liberatoria, ModelloLiberatoria with mapstruct
paginate AuditLog, Notifica, Prenotazione, Struttura, Conferma with pagination
paginate Disponibilita with infinite-scroll
service AuditLog, Conferma, Disponibilita, Notifica, Prenotazione, Struttura, UtenteApp, Messaggio, Liberatoria, ModelloLiberatoria with serviceImpl
search AuditLog, Conferma, Disponibilita, Notifica, Prenotazione, Struttura, UtenteApp with no
filter AuditLog, Notifica, Prenotazione, Struttura, Conferma
