Passa al contenuto principale

Schema DB fin (core)

🎯 Cosa fa​

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

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

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

πŸ”— Relazioni​

Referenze esterne:

  • fin.projects.accountId β†’ fin.accounts(id) (fuori scope)
  • fin.projects.callWindowId β†’ fin.callWindows(id) (fuori scope)
  • fin.projects.trainingSessionId β†’ edu.trainingSessions(id)
  • fin.projects.implementingBodyId β†’ fin.implementingBodies(id) (fuori scope)
  • fin.modules.courseId β†’ edu.courses(id)
  • fin.companyMemberships.companyId β†’ reg.companies(id)
  • fin.companyMemberships.accountId β†’ fin.accounts(id) (fuori scope)
  • fin.projectCompanies.companyId β†’ reg.companies(id)
  • fin.modules.thematicAreaId β†’ fin.thematicAreas(id) (fuori scope)
  • fin.modules.teachingMethodId β†’ fin.teachingMethods(id) (fuori scope)

πŸ—‚οΈ Dettaglio tabelle​

fin.projects​

  • PK: id
  • FK (tutte NOT NULL): accountId, callWindowId β†’ fin.callWindows(id), trainingSessionId, implementingBodyId
  • Campi chiave:
    • code (stringa), label (stringa estesa)
    • status (default 'BOZZA', CK_projects_status con 21 valori) β€” rif. enum ProjectStatus
    • Date: submissionDate, approvalDate, closureDate, settlementDate, rendicontazioneDeadline
    • hourlyRate (default 20.00, CK > 0 e ≀ 25)
    • notes (NVARCHAR MAX)

Rimosse dal modello: noticeId (sostituita da callWindowId in A), startDate, endDate e totalHours (rimosse in C).

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 (GUID proprio; dal 2026-07-13 non piΓΉ condiviso con edu.courses)
  • FK: courseId β†’ edu.courses(id), projectId, thematicAreaId (nullable), teachingMethodId (nullable)
  • UNIQUE: (projectId, courseId) β€” un corso una volta per progetto; lo stesso corso puΓ² essere modulo di piΓΉ progetti
  • 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.companyMemberships​

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

πŸ“Œ Iscrizioni lavoratori (dominio edu)​

Le iscrizioni dei lavoratori a edizioni FondItalia non vivono in una tabella fin dedicata: risiedono in edu.workerTrainingDetails, con trainingSessionId = fin.editions.id (shared PK: fin.editions estende edu.trainingSessions). Le presenze sono tracciate dalle colonne attendanceHours, attendanceRate e passed della stessa tabella.

La tabella fin.enrollments Γ¨ stata rimossa: non esistono piΓΉ record separati di iscrizione nello schema fin.

πŸͺŸ Viste​

VistaScopo
vw_projectsDataLista progetti per griglia: project + account + sportello + counts (modules, editions, companies, enrollments) + budget totale + speso + percentuale uso
vw_projectEnrollmentsIscrizioni per edizione: edition + module + project + worker + company + regime + attendance
vw_projectExpensesSummaryAggregato per progetto + categoria: count voci, totale, count voci linkate a iscrizioni (via edu.enrollmentCosts.expenseId)
vw_expensesDataGriglia voci di spesa: fin.expenses + la risorsa collegata, per la pagina spese e il foglio di rendicontazione
vw_projectFundingContributo del progetto: ore-persona (ore modulo Γ— iscritti di quel modulo, sommate), ritiri, hourlyRate, budget e speso per capitolo A/B/D
vw_projectFinancialBalanceCategoriesBudget vs speso vs delta, per progetto e categoria (sopra vw_projectExpensesSummary + fin.budgets)
vw_projectCofinancingByCompanyCofinanziamento del progetto raggruppato per azienda partecipante
vw_projectPhaseStatusFormato lungo progetto Γ— fase per il pivot della dashboard: CROSS JOIN su tutte le fasi, quelle mai seminate escono not_started
vw_dashboardKpiParte non parametrica dei KPI di periodo: una riga per progetto con le date d'ancoraggio di ogni indicatore e il contributo approvato
vw_accountBalanceProjectionTotale conto: disponibilitΓ  corrente + proiezione dei versamenti maturati dall'ultimo aggiornamento per-azienda. Solo adesioni attive

πŸ“š Tabelle fuori scope (41)​

Vedi Panoramica per elenco completo per area.

πŸ“ File chiave​

  • TrainingHub.Database/fin/Tables/*.sql β€” 48 tabelle
  • TrainingHub.Database/fin/Views/*.sql β€” 10 viste
  • TrainingHub.Shared/Enums.cs β€” enum dominio

⚠️ Debito tecnico​

  • fin.projects.status come stringa libera. Risolto: CK_projects_status vincola la colonna ai 21 valori dell'enum ProjectStatus.
  • Indici sui filtri frequenti. IX_projectCompanies_companyId esiste giΓ  (fin/Tables/projectCompanies.sql:16).
  • 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. Risolto: la colonna Γ¨ stata rimossa in C; le ore si sommano da modules.hours.

πŸ”— Vedi anche​