Dominio job β Panoramica sviluppatore
π― Cosa faβ
Il dominio job (workers & risks) gestisce anagrafica lavoratori,
mansioni, ruoli aziendali, reparti e rischi. Γ il ponte logico
tra reg (aziende) ed edu (formazione): da reg eredita il
contesto azienda/sedi, verso edu determina quali corsi sono
obbligatori tramite il cascade rischi.
Dominio di dimensione media: 13 tabelle tutte in scope.
πΊοΈ Mappa moduliβ
Database β TrainingHub.Database/job/β
| Area | Tabella | Ruolo |
|---|---|---|
| Lavoratori | job.workers | Anagrafica dipendenti |
| Lavoratori | job.workerJobHistory | Storico mansioni/ruoli/reparti |
| Mansioni | job.jobs | Mansioni (con riskLevel e inheritsCompanyRisks) |
| Mansioni | job.jobGroups | Raggruppamenti visuali di mansioni |
| Mansioni | job.jobSubcategories | N:N mansione β sottocategoria azienda |
| Mansioni | job.workersJobs | N:N lavoratore β mansione |
| Ruoli | job.roles | Ruoli aziendali (lavoratore, preposto, dirigente) |
| Struttura | job.departments | Reparti gerarchici (parentId) |
| Rischi | job.risks | Anagrafica rischi |
| Rischi | job.riskLevel | Livelli (1=basso, 2=medio, 3=alto) |
| Rischi | job.atecoCodes | Codici ATECO gerarchici (parentCode) con riskLevelId suggerito |
| Rischi | job.companiesRisks | Rischi aziendali |
| Rischi | job.jobsRisks | Rischi per mansione |
| Rischi | job.workersRisks | Override/esclusione rischio per lavoratore |
| Compliance | job.vw_workerComplianceSummary | Vista β rollup per-lavoratore: worstStatus + conteggi expired/missing/expiring/ok + minDaysRemaining. Filtrabile per companyId. Aggrega edu.vw_workerTrainingStatus |
Service layer β TrainingHub.Shared/Services/β
| File | Ruolo |
|---|---|
IRiskInheritanceService.cs / RiskInheritanceService.cs | Cascade rischi ATECO β azienda β mansione β lavoratore |
ITrainingExpirationService.cs / TrainingExpirationService.cs | Usa i rischi del lavoratore per calcolare compliance (condiviso con edu) |
QueryModifiers β TrainingHub.BackOffice/Services/QueryModifiers/job/β
| File | Scope |
|---|---|
CompaniesRisksQueryModifier.cs | Hook su companiesRisks β refresh rischi lavoratori dopo cambi rischio azienda |
UI CRUD β TrainingHub.BackOffice/Components/CRUD/job/β
EntitΓ CRUD standard:
Worker,WorkerJobHistory,WorkersData(vista aggregata)Job,JobGroup,JobSubcategory,JobsDataWorkersJob(associazione)Role,DepartmentRisk,RiskLevel,AtecoCodeCompaniesRisk,JobsRisk,WorkersRiskWorkerEffectiveRiskβ vista calcolata dei rischi effettivi del lavoratore (cascade applicato)WorkerComplianceSummaryβ CRUD auto-generato sulla viewvw_workerComplianceSummary(read-only). FK manuali su worker/company/role/department, badge stato in colonnaworstStatus. Embed nel wizardCompanyFormPopupcome step "ConformitΓ formativa". Pattern descritto in Architettura β view β CRUD
π§ API pubblicaβ
IRiskInheritanceServiceβ
Propaga il livello di rischio ATECO β azienda β mansione β lavoratore. Invocato da:
reg.CompaniesQueryModifier.PostExecutionQuerydopo update aziende β cascade a workers.job.CompaniesRisksQueryModifierdopo cambio rischi aziendali.- Extension method
worker.UpdateRiskLevel(simpleCRUD, companyId?)per invocazione diretta.
ITrainingExpirationServiceβ
Calcola compliance formativa combinando rischi del lavoratore (dominio job) con formazione ricevuta (dominio edu). Dettaglio in Logica applicativa edu.
π§© Pattern chiaveβ
Cascade rischiβ
Codice ATECO
βββ riskLevelId suggerito
βββ azienda.riskLevelId (default)
βββ jobs.riskLevelId (opzionale β override per mansione)
β βββ jobs.inheritsCompanyRisks
β βββ aggiunge i rischi companiesRisks ai rischi jobsRisks
βββ workers.riskLevelId (staticizzato per lavoratore)
βββ workersRisks (override singolo rischio + esclusioni)
Propagazione automatica:
- Cambio ATECO azienda β
CompaniesQueryModifierβUpdateRiskLevel - Cambio riskLevel azienda β idem
- Cambio
companiesRisksβCompaniesRisksQueryModifierβ ricalcolo - Cambio mansione lavoratore β staticizzazione
workers.riskLevelId
Storico mansioniβ
workerJobHistory Γ¨ un snapshot storico: al cambio di mansione /
ruolo / reparto di un lavoratore, un record viene inserito con
startDate/endDate e i valori correnti di riskLevelId, roleId,
departmentId. Permette audit temporale.
Vista WorkerEffectiveRiskβ
Componente UI non-CRUD che mostra i rischi finali del lavoratore applicando il cascade (rischi azienda + mansione + override lavoratore, meno esclusioni). Utile per DVR e per determinare formazione richiesta.
Gerarchia departmentsβ
Tabella auto-referenziante: departments.parentId crea un albero
reparti (es. "Produzione" β "Linea A" β "Turno notte"). UI deve
supportare visualizzazione ad albero.
Codici ATECO gerarchiciβ
atecoCodes.parentCode simile ai reparti: ATECO hanno gerarchia
(es. "F - Costruzioni" β "F.41 - Costruzione di edifici" β "F.41.1 -
Sviluppo di progetti immobiliari"). Flag selectable indica quali
codici possono essere assegnati direttamente alle aziende (foglie o
nodi selezionabili).
π¦ Dipendenzeβ
Brighela.SimpleCRUDβ CRUD base + QueryModifier- Stack UI comune (DevExpress, Tabiot, Oss)
Cross-dominio in entrata (FK da altri domini a job):
reg.companies.riskLevelIdβjob.riskLevel(id)reg.companies.atecoCodeβjob.atecoCodes(code)edu.courses.trainingVariantIdnon tocca job, ma varianti formative (fuori scope edu) mappano verso rischi
Cross-dominio in uscita (FK da job):
job.workers.companyIdβreg.companies(id)job.workers.companyLocationIdβreg.companyLocations(id)job.workers.academicQualificationIdβreg.academicQualifications(id)job.departments.companyIdβreg.companies(id)job.jobSubcategories.companySubcategoryIdβreg.companySubcategories(id)
π File chiaveβ
Database/job/Tables/*.sql(13)BackOffice/Services/QueryModifiers/job/CompaniesRisksQueryModifier.csBackOffice/Components/CRUD/job/Worker.razor{,.cs,.tt.cs}+Forms/WorkerForm.razorBackOffice/Components/CRUD/job/WorkerEffectiveRisk.razorβ vista rischi effettivi calcolatiShared/Services/IRiskInheritanceService.cs+ impl
β οΈ Domande aperte / debito tecnicoβ
- Regola calcolo rischio finale del lavoratore. Con piΓΉ mansioni con livelli diversi e override personali, non Γ¨ documentata la formula esatta (max? ultimo? merge?).
- Storico mansioni β trigger automatico. Al cambio mansione,
il sistema crea automaticamente il record in
workerJobHistoryo lo fa solo dopo azione esplicita? -
workers.riskLevelIdstaticizzato. Commento DB: "calcolato e staticizzato in base alla mansione". Staticizzato = materializzato. Quando viene refreshato? Coerenza con i rischi attuali? - Refresh massivo
workers.UpdateRiskLevelsenza companyId. PathUpdateWheresenza entity ricalcola TUTTI i workers. Costoso su DB grande. GiΓ segnalato nel dominioreg. - Validazione codice fiscale. Checksum non validato lato DB. Regex/Luhn lato UI? Verificare.
- Mansioni globali vs per-azienda. Oggi
jobsè tabella globale: non hacompanyId. Un'azienda "Acme" e "Beta" che hanno un "Saldatore" condividono lo stesso record. Se una vuole personalizzare rischi solo per la propria "Saldatore" deve creare una mansione custom. Pattern da documentare. -
atecoCodes.selectableβ semantica. Chi puΓ² deselezionare? Sono ATECO pre-popolati dal sistema o l'utente puΓ² aggiungerne?
π Vedi ancheβ
- Schema DB
- Componenti UI
- Logica applicativa
- Aggiungere un campo
- Guida utente: Panoramica lavoratori (docs-site-user)
- Dominio
reg: logica applicativa β cascadeCompaniesQueryModifierinvoca job - Dominio
edu: logica applicativa β usa rischi job per calcolare compliance