Passa al contenuto principale

Catalogo corsi

🔗 Apri nel BackOffice​

🎯 Cosa fa​

Definisce la struttura stabile dei corsi formativi: categorie tematiche, argomenti formativi (topic) di alto livello (es. "Antincendio", "Primo soccorso"), varianti normative (la declinazione di un topic in funzione di livello di rischio / CCNL / base-aggiornamento) e i corsi veri e propri (un'offerta commerciale per uno specifico organizer e una specifica variante).

Questa è la "parte statica" del modulo Formazione: ciò che si offre, indipendentemente da quando e dove viene erogato.

🕒 Quando usarlo​

  • Aggiungere un nuovo corso al catalogo.
  • Creare o modificare una categoria di corsi.
  • Definire un nuovo topic formativo (es. "Lavori in quota").
  • Aggiungere una variante normativa a un topic esistente (es. "Antincendio R.A. — aggiornamento").
  • Configurare il colore con cui un topic viene mostrato nel calendario.
  • Ritirare un corso dal catalogo quando non piĂą valido.

🧩 Concetti​

  • Categoria — tassonomia piatta (es. "Sicurezza", "SanitĂ ").
  • Topic (trainingTopic) — la formazione di alto livello (es. "Antincendio"). Porta i metadati normativi macro: requireUpdates, fullRetrainingYears, ats, e il colore mostrato nel calendario.
  • Variante (trainingVariant) — declinazione concreta di un topic. Una variante combina topic Ă— livello di rischio Ă— CCNL Ă— flag base/aggiornamento. Es. "Antincendio Rischio Alto — Base", "Antincendio Rischio Alto — Aggiornamento".
  • Corso (course) — l'offerta del singolo organizer per una specifica variante. Stesso topic+variante possono esistere come piĂą corsi se organizer diversi.
  • Argomento di dettaglio (trainingArgument) — voce granulare del programma effettivo (es. "Estintori e idranti", "Esercitazione pratica"). Usato in trainingSessionsCoursesArguments per registrare cosa è stato trattato nella sessione.

Il modello "lezione atomica con propedeuticità" è stato rimosso dal redesign del 2026-05-08: la durata e la propedeuticità vivono ora sulla variante normativa (minimumHours, validitySpan) e gli argomenti effettivamente erogati sono registrati per ciascun corso erogato dentro la sessione.

👣 Passi​

Creare una categoria​

  1. Apri il menu Formazione → Categorie.
  2. Crea nuova categoria.
  3. Inserisci il Nome (es. "Sicurezza", "SanitĂ ").
  4. Salva.

Creare un argomento formativo (topic)​

  1. Apri il menu Formazione → Argomenti formativi.
  2. Crea nuovo topic.
  3. Compila:
    • Codice identificativo (es. ANT, PS).
    • Nome (es. "Antincendio").
    • Descrizione (libera).
    • Categoria di appartenenza.
    • Rischio coperto (opzionale).
    • Richiede aggiornamenti — flag normativo.
    • Normato — default sì. Se no, la durata è solo consigliata.
    • Anni per riformazione completa (oltre questo intervallo non basta l'aggiornamento).
    • Accreditato ATS — flag.
    • Colore (hex, es. #e53935). Mostrato nel calendario per gli appuntamenti delle sessioni di questo topic. Lascia vuoto per il colore neutro.
  4. Salva.

Creare una variante normativa​

  1. Apri il menu Formazione → Varianti formative.
  2. Crea nuova variante.
  3. Compila:
    • Topic di riferimento.
    • Codice (es. ANT-A-BASE).
    • Nome (es. "Antincendio Rischio Alto — Base").
    • Descrizione (libera).
    • Livello di rischio (opzionale: NULL = non dipende dal livello).
    • CCNL (opzionale: NULL = applicabile a tutti i CCNL).
    • Aggiornamento — flag: variante "base" (no) o "aggiornamento" (sì).
    • Ore minime richieste dalla norma.
    • Durata di validitĂ  in mesi.
    • Richiede aula attrezzata — flag: se acceso, solo le aule listate in locationsTrainingVariants sono utilizzabili per la sessione (es. prove pratiche).
  4. Salva.

Creare un corso​

  1. Apri il menu Formazione → Corsi.
  2. Crea nuovo corso.
  3. Compila:
    • Codice (identificativo breve stabile, es. ANT-A-BASE-3SD).
    • Nome completo.
    • Descrizione (opzionale).
    • Organizzatore (l'ente che eroga il corso).
    • Variante normativa (vincolo di legge applicabile).
    • Numero massimo partecipanti (se previsto dalla normativa).
    • Soglia istruttore aggiuntivo (oltre N partecipanti serve un secondo docente).
    • In catalogo — flag: il corso è offerto pubblicamente.
    • E-learning — flag: erogato in modalitĂ  asincrona online.
    • Prezzo a iscritto — listino in euro (0 se gratuito; lo sconto convenzione si applica in fase di stima costi e fattura).
  4. Salva.

Aggiungere argomenti di dettaglio​

  1. Apri il menu Formazione → Argomenti di dettaglio.
  2. Crea nuovo argomento.
  3. Compila:
    • Etichetta (es. "Esercitazione pratica").
    • Descrizione.
    • Rischio (opzionale).
  4. Salva.

Gli argomenti di dettaglio diventano disponibili come voci da selezionare in fase di sessione: il sistema registra cosa è stato effettivamente trattato per ciascun corso erogato nella giornata (tabella trainingSessionsCoursesArguments).

🗂️ Campi chiave​

Categoria​

CampoObbligatorioNote
NomeSìTesto libero.

Topic (argomento formativo)​

CampoObbligatorioNote
CodiceSìStringa breve.
NomeSìDescrizione completa.
CategoriaSìFK.
Rischio copertoNoFK opzionale verso job.risks.
Richiede aggiornamentiSìFlag normativo.
NormatoNoDefault: sì.
Anni riformazione completaNoOltre = serve corso base, non basta aggiornamento.
ATSNoDefault: no.
ColoreNoHex (es. #e53935). Usato dal calendario.

Variante normativa​

CampoObbligatorioNote
TopicSìFK.
CodiceNo
NomeNo
DescrizioneNo
Livello di rischioNoNULL = non dipende dal livello.
CCNLNoNULL = applicabile a tutti i CCNL.
AggiornamentoSìDefault: no (base).
Ore minimeNoDurata minima normativa.
ValiditĂ  (mesi)NoPeriodo di validitĂ  dell'attestato.
Richiede aula attrezzataSìDefault: no.

Corso​

CampoObbligatorioNote
CodiceSìIdentificativo breve, stabile.
NomeSìDescrizione completa.
OrganizzatoreSìEnte erogatore.
Variante normativaSìRiferimento al decreto applicabile.
DescrizioneNoTesto libero.
Max partecipantiNoLimite normativo.
Soglia istruttore aggiuntivoNoOltre N partecipanti serve un secondo docente.
In catalogoNoDefault: sì.
E-learningNoDefault: no.
Prezzo a iscrittoSìDefault 0 (corso gratuito). In euro. Lo sconto convenzione si applica in fase di stima costi e fattura.
AttivoNoDefault: sì. Per ritirare un corso dal catalogo.

Argomento di dettaglio​

CampoObbligatorioNote
EtichettaSìTesto libero.
DescrizioneSìTesto libero.
RischioNoFK opzionale verso job.risks.

⚡ Casi particolari​

  • Ritirare un corso dal catalogo. Deseleziona il flag Attivo o In catalogo. Le sessioni giĂ  pianificate restano valide per lo storico.
  • PiĂą corsi per la stessa variante. Organizzatori diversi possono offrire la stessa variante normativa: si creano corsi distinti (stesso trainingVariantId, organizerSlug differenti). Il prezzo a iscritto, la soglia istruttore, il flag e-learning sono per-corso.
  • Variante senza CCNL o senza livello di rischio. Lasciali a NULL quando la variante è universale; il vincolo univocitĂ  consente al piĂą una variante "base / aggiornamento" per ogni combinazione (topic Ă— riskLevel Ă— CCNL Ă— isUpdate).
  • Aula attrezzata. Se la variante ha requiresEquippedRoom = 1, in pianificazione potrai scegliere solo le aule presenti nella whitelist locationsTrainingVariants. Altrimenti tutte le aule sono ammesse.
  • Corso gratuito. Lascia il prezzo a 0. Il riepilogo costi della pianificazione mostrerĂ  0,00 € sulle iscrizioni e le convenzioni non avranno effetto.
  • Soglia istruttore aggiuntivo. Se in una sessione il numero di partecipanti supera la soglia del corso, il sistema segnala il conflitto teacher_threshold come warning (non bloccante) via SessionPlanner.DetectConflictsAsync.

⚠️ Domande aperte​

  • Categorie vs tassonomia. Oggi le categorie sono piatte (una sola etichetta). Valutare gerarchia parent-child se i temi si diversificano (es. "Sicurezza elettrica → BT / MT").
  • Storicizzazione listini. Oggi courses.listPrice è un valore puntuale. La storicizzazione (validFrom/validTo) è una voce di backlog (vedi BACKLOG.md — Pricing estensioni future).
  • E-learning e appuntamenti. Un corso e-learning ha comunque appuntamenti? Oppure l'e-learning sostituisce il calendario? Da chiarire nel workflow operativo.

🔗 Vedi anche​