Passa al contenuto principale

Schema DB fin (core)

🎯 Cosa fa​

Persistence layer del dominio formazione finanziata. 29 tabelle totali β€” questa pagina dettaglia le 8 core della spec corrente.

πŸ—ΊοΈ Tabelle core (8)​

AreaTabellaRuolo
Progettifin.projectsProgetto finanziato
Progettifin.phasesAnagrafica fasi
Progettifin.projectPhasesFasi istanziate per progetto
Strutturafin.modulesModuli formativi
Strutturafin.editionsEdizioni dei moduli
Partecipazionefin.projectCompaniesAziende nel progetto
Partecipazionefin.enrollmentsIscrizioni lavoratori
Partecipazionefin.companyMembershipsAdesioni al fondo

πŸ”— Relazioni​

Referenze esterne:

  • fin.projects.accountId β†’ fin.accounts(id) (fuori scope)
  • fin.projects.noticeId β†’ fin.notices(id) (fuori scope)
  • fin.companyMemberships.companyId β†’ reg.companies(id)
  • fin.companyMemberships.accountId β†’ fin.accounts(id) (fuori scope)
  • fin.projectCompanies.companyId β†’ reg.companies(id)
  • fin.enrollments.workerId β†’ job.workers(id)
  • fin.modules.thematicAreaId β†’ fin.thematicAreas(id) (fuori scope)
  • fin.modules.teachingMethodId β†’ fin.teachingMethods(id) (fuori scope)

πŸ—‚οΈ Dettaglio tabelle​

fin.projects​

  • PK: id
  • FK: accountId, noticeId (nullable)
  • Campi chiave:
    • code (stringa), label (stringa estesa)
    • status (default 'BOZZA') β€” rif. enum ProjectStatus
    • Date: startDate, endDate, submissionDate, approvalDate, closureDate, rendicontazioneDeadline
    • totalHours (decimali)
    • description (NVARCHAR MAX)

fin.phases​

  • PK: id
  • Campi: codeValue (string identificativo), label, sortOrder, managedType (active / tracking / tracking_readonly), hideable (default 0), description

fin.projectPhases​

  • PK: id
  • FK: projectId β†’ fin.projects(id), phaseId β†’ fin.phases(id)
  • Campi: status (default 'not_started', enum ProjectPhaseStatus), completionRate (0-100), startedAt, completedAt, forceUnlocked (default 0), notes

fin.modules​

  • PK: id
  • FK: projectId, thematicAreaId (nullable), teachingMethodId (nullable)
  • Campi: hours (decimali), notes

fin.editions​

  • PK: id
  • FK: moduleId β†’ fin.modules(id)
  • Campi: maxPeople (nullable), notes

fin.projectCompanies​

  • PK: id
  • FK: projectId, companyId
  • Campi: aidRegime (enum AidRegime: de_minimis, aiuti_formazione), notes

fin.enrollments​

  • PK: id
  • FK: editionId, workerId
  • Campi: attendanceHours, attendanceRate (percentuale), passed (flag), notes

fin.companyMemberships​

  • PK: id
  • FK: companyId β†’ reg.companies(id), accountId β†’ fin.accounts(id)
  • Campi: inpsCode, memberSince, memberUntil, availableBalance (decimali), status (default 'active', enum MembershipStatus)

πŸ“š Tabelle fuori scope (~21)​

Vedi Panoramica per elenco completo per area.

πŸ“ File chiave​

  • TrainingHub.Database/fin/Tables/*.sql β€” 29 tabelle
  • TrainingHub.Shared/Enums.cs β€” enum dominio

⚠️ Debito tecnico​

  • fin.projects.status come stringa libera. Check constraint assente: qualsiasi valore Γ¨ accettato in DB. Validazione solo via enum C# con Enum.Parse.
  • Indici sui filtri frequenti. projectCompanies.companyId, enrollments.editionId, enrollments.workerId sono join frequenti: valutare indici espliciti.
  • editions senza date. Le edizioni non hanno date di inizio e fine in questa tabella (forse in sessions, fuori scope). ScomoditΓ  per reportistica da elementi core.
  • projectPhases.completionRate. Come viene calcolato? Manuale o derivato dal numero di requisiti soddisfatti? Documentazione assente.
  • companyMemberships.availableBalance. Chi la aggiorna? Movimenti attesi quando un progetto viene approvato / saldato.
  • totalHours su projects. Ridondante rispetto alla somma di modules.hours: rischio di divergenza.

πŸ”— Vedi anche​