Vai al contenuto

Anteprima migrazione corso legacy -> SafeOps: Preposti

Data: 2026-09-02

Modalita: sola lettura. Nessuna scrittura DB, nessun file copiato, nessun restart.

Identita legacy

Corso catalogo legacy da considerare:

  • tabella: categorie_corsi
  • id: 37
  • nome: Preposti per la sicurezza
  • scadenza: 5 anni
  • categoria documentale certificato: 39 - Certificato Preposti per la sicurezza

Nel legacy i record in corsi sotto questa categoria sono edizioni/eventi storici ripetuti, non corsi catalogo distinti.

Numeri legacy

Totale categoria:

  • eventi legacy in corsi: 40
  • date in date_corsi: 51
  • iscrizioni in dipendente_corso: 431
  • documenti discente collegati: 415

Liste complete estratte:

  • corsi/eventi legacy: /home/safeops/tmp/formazione_legacy_match_20260902/preposti/preposti_corsi_legacy.tsv
  • date/orari legacy: /home/safeops/tmp/formazione_legacy_match_20260902/preposti/preposti_date_legacy.tsv

I file contengono rispettivamente 40 eventi legacy e 51 date/orari, con proposta destinazione CORFORPRE o AGGCRSPRE.

Split rilevato nella categoria:

  • formazione preposti: 23 eventi, 34 date, 201 iscrizioni, 201 documenti, date dal 2024-09-09 al 2026-07-01
  • aggiornamento preposti: 17 eventi, 17 date, 230 iscrizioni, 214 documenti, date dal 2025-01-24 al 2026-06-26

Regola di split proposta:

  • se corsi.nome contiene AGGIORNAMENTO oppure durata_ore = 6 -> aggiornamento preposti
  • altrimenti -> formazione preposti

Destinazione SafeOps

Catalogo SafeOps esistente:

  • CORFORPRE -> Corso per la Sicurezza sul Lavoro per Preposti
  • SafeOps id DEV: 39
  • tipo: in_presenza
  • durata: 12 ore
  • capienza: 24
  • date SafeOps gia presenti: 5

  • AGGCRSPRE -> Corso di Aggiornamento Sicurezza sul Lavoro per Preposti

  • SafeOps id DEV: 38
  • tipo: in_presenza
  • durata: 6 ore
  • capienza: 24
  • date SafeOps gia presenti: 3

Nota: alcuni eventi legacy di formazione preposti hanno durata 8 ore, altri 12 ore. Questa differenza va mantenuta nello storico/import evento, senza cambiare il catalogo SafeOps prima di una decisione funzionale.

Come diventerebbe in SafeOps

Per ogni evento legacy in corsi:

  • non creare un nuovo corso catalogo se rientra nello split sopra;
  • agganciare l'evento al corso SafeOps CORFORPRE o AGGCRSPRE;
  • creare o agganciare le date in data_corso;
  • preservare orari mattina/pomeriggio quando presenti;
  • preservare capienza legacy come metadato evento, se diversa da catalogo SafeOps;
  • importare iscrizioni in dipendente_corso;
  • impostare esito = completato solo quando esiste certificato/attestato collegato;
  • calcolare data_scadenza_attestato dalla data completamento + 5 anni quando coerente;
  • importare certificati come documenti del libretto sicurezza dipendente;
  • importare registri come archivio corso/evento.

Marcatura obbligatoria

Ogni record importato deve avere ponte legacy:

  • legacy_source = securehub
  • legacy_categoria_corso_id = 37
  • legacy_corso_id
  • legacy_date_corso_id, quando applicabile
  • legacy_dipendente_corso_id, quando applicabile
  • legacy_documento_id / legacy_allegato_id, quando applicabile
  • safeops_tenant_key = tenant_besant
  • safeops_corso_id = 39 per formazione o 38 per aggiornamento
  • match_method = categoria_split_nome_durata
  • match_status = dry_run | pronto | importato | errore | da_revisionare

Controlli prima di import

  • verificare 5 eventi campione formazione e 5 aggiornamento;
  • verificare che i dipendenti siano agganciabili per codice fiscale;
  • bloccare duplicati su coppia corso_id + dipendente_id;
  • non importare date anomale;
  • non sovrascrivere corsi/date SafeOps esistenti senza ponte legacy;
  • non importare certificati senza file fisico verificabile;
  • loggare righe scartate con motivo.

Decisione richiesta

Questa categoria puo essere migrata in due flussi:

  • Preposti formazione -> CORFORPRE
  • Preposti aggiornamento -> AGGCRSPRE

Prima dell'import va approvata la regola di split sopra.

Import storico 2026-09-03

Eseguita migrazione controllata solo su storico_formativo_discente.

Non sono stati creati:

  • data_corso;
  • edizione_corso;
  • dipendente_corso;
  • variazioni WooCommerce;
  • documenti/attestati fisici.

Dry-run corretto

Piani generati con split da legacy_corso_id:

  • DEV: /home/safeops/tmp/formazione_import_dryrun_20260903/preposti_split_dev_v2/
  • produzione: /home/safeops/tmp/formazione_import_dryrun_20260903/preposti_split_prod_v2/

Risultato:

  • partecipazioni legacy totali: 431;
  • storico importabile: 426;
  • bloccati per CF mancante: 2;
  • bloccati per dipendente non trovato in SafeOps: 3;
  • duplicati legacy SafeOps: 0.

Split importato:

  • CORFORPRE: 201 storici, date completamento dal 2024-09-09 al 2026-06-29;
  • AGGCRSPRE: 225 storici, date completamento dal 2025-01-24 al 2026-06-26.

Bloccati:

  • securehub:dipendente_corso:3280, CF mancante;
  • securehub:dipendente_corso:3279, CF mancante;
  • securehub:dipendente_corso:5032, dipendente non trovato;
  • securehub:dipendente_corso:5034, dipendente non trovato;
  • securehub:dipendente_corso:5031, dipendente non trovato.

Cleanup batch errato

Durante il primo apply lo split partecipanti era stato calcolato sul campo nome del dipendente invece che sul corso legacy. Il batch e' stato eliminato subito con cleanup mirato sugli external_id del piano Preposti:

  • DEV backup: /home/safeops/tmp/formazione_import_apply_20260903/preposti_split_dev_cleanup/deleted_storico_formativo_discente_backup.tsv
  • produzione backup: /home/safeops/tmp/formazione_import_apply_20260903/preposti_split_prod_cleanup/deleted_storico_formativo_discente_backup.tsv
  • righe rimosse DEV: 426;
  • righe rimosse produzione: 426.

Apply finale

Apply corretto:

  • DEV: /home/safeops/tmp/formazione_import_apply_20260903/preposti_split_dev_v2/
  • produzione: /home/safeops/tmp/formazione_import_apply_20260903/preposti_split_prod_v2/

Verifica finale DEV e produzione:

  • AGGCRSPRE: 225;
  • CORFORPRE: 201;
  • duplicati provider_code + external_id: 0.