Vai al contenuto

Pulizia formazione produzione e WooCommerce

Data: 2026-09-02

Scope

Pulizia applicata su produzione SafeOps e su WooCommerce solo per date/ricorrenze.

Non sono stati cancellati:

  • corsi catalogo SafeOps;
  • dipendenti;
  • prodotti padre WooCommerce;
  • mappe prodotto WooCommerce;
  • log sync.

Backup

Backup SQL mirato produzione:

  • /home/safeops/tmp/formazione_cleanup_prod_backup_20260902.sql
  • dimensione: 1.935.752 byte

Tabelle incluse:

  • corso
  • data_corso
  • edizione_corso
  • edizione_data_corso
  • formazione_data_corso_meta
  • dipendente_corso
  • dipendente_corso_firma
  • formazione_external_enrollment_map
  • formazione_quote_seat_reservation
  • formazione_quote_participant
  • formazione_external_course_map

Pulizia SafeOps produzione

Righe impattate: 757.

Conteggi prima/dopo:

  • corso: 35 -> 35
  • dipendente: 3.321 -> 3.321
  • data_corso: 179 -> 0
  • edizione_corso: 118 -> 0
  • edizione_data_corso: 140 -> 0
  • formazione_data_corso_meta: 106 -> 0
  • dipendente_corso: 195 -> 0
  • dipendente_corso_firma: 0 -> 0

Riferimenti test scollegati:

  • formazione_external_enrollment_map.data_corso_id: 3 -> 0
  • formazione_external_enrollment_map.dipendente_corso_id: 3 -> 0
  • formazione_quote_seat_reservation.data_corso_id: 4 -> 0
  • formazione_quote_participant.data_corso_id: 5 -> 0
  • formazione_quote_participant.dipendente_corso_id: 4 -> 0

Inventario finale produzione:

  • corsi catalogo: 35
  • date corso: 0
  • edizioni corso: 0
  • partecipazioni corso: 0
  • dipendenti collegati a corsi: 0
  • firme: 0
  • metadati date: 0
  • mappe corso WooCommerce: 34
  • mappe iscrizione WooCommerce: 6
  • prenotazioni quote: 4
  • partecipanti quote: 5

File prodotti:

  • /home/safeops/tmp/formazione_cleanup_all_20260902/prod/formazione_cleanup_all_actions.tsv
  • /home/safeops/tmp/formazione_cleanup_all_20260902/prod/formazione_cleanup_all_snapshot.tsv
  • /home/safeops/tmp/formazione_cleanup_inventory_20260902/prod_final/

Pulizia WooCommerce

Pulizia eseguita solo sulle variation/date collegate alle edizioni SafeOps precedenti.

Non sono stati cancellati i prodotti padre.

Risultato:

  • variation/date target: 75
  • cancellate con successo: 75
  • errori: 0

File prodotti:

  • dry-run/backup iniziale: /home/safeops/tmp/formazione_cleanup_wp_20260902/dryrun/
  • apply: /home/safeops/tmp/formazione_cleanup_wp_20260902/apply/
  • verifica campione post-delete: /home/safeops/tmp/formazione_cleanup_wp_20260902/post_verify_sample/

Verifica campione:

  • 5 variation controllate dopo DELETE;
  • risposta GET: 404 already_missing;
  • esito atteso: variation/date rimosse.

Verifiche servizio

  • safeops-web.service: attivo
  • GET / produzione locale: 200 OK

Stato finale

SafeOps produzione ora mantiene il catalogo corsi e i dipendenti, ma non ha piu ricorrenze/date/edizioni/partecipazioni test.

WooCommerce mantiene i prodotti padre, ma le 75 variation/date generate da SafeOps sono state rimosse.

Verifica residui 2026-09-03

Dopo una nuova verifica WooCommerce sono state trovate 3 variation residue non collegate a edizione_corso in DEV o produzione:

  • 1073 / 1731: Corso Lavori in Quota e DPI anticaduta, data 30/10/2026;
  • 1168 / 1730: Corso Addetti Antincendio Livello 1, variation senza data/prezzo;
  • 1733 / 1735: REGOLAMENTO (UE) 2023/1230, prodotto padre draft e variation senza data/prezzo.

Pulizia eseguita su WooCommerce:

  • piano: /home/safeops/tmp/formazione_cleanup_wp_20260903/residue_delete_plan.tsv
  • dry-run/backup: /home/safeops/tmp/formazione_cleanup_wp_20260903/residue_delete_dryrun/
  • apply/backup: /home/safeops/tmp/formazione_cleanup_wp_20260903/residue_delete_apply/
  • esito: 3 cancellate, 0 errori.

Inventario post-delete:

  • prodotti formazione rilevati: 31;
  • variation residue orfane rimosse: 3;
  • variation ancora presenti: 3, tutte collegate in produzione a edizione_corso (1738, 1739, 1740) per il corso CORDPILVQ del 09/09/2026.

Le variation 1738, 1739, 1740 non sono state cancellate perche risultano agganciate a edizioni SafeOps produzione.

Correzione duplicati 09/09/2026

La pianificazione rapida aveva creato, oltre alla variation giornata intera, anche due variation vendibili separate per mattina e pomeriggio. Per il corso CORDPILVQ del 09/09/2026 deve esistere una sola data/occurrence vendibile:

  • mantenuta: edizione_corso.id=121, slot_vendita=multi, variation WooCommerce 1740;
  • rimosse dal DB produzione: edizione_corso.id=122 e 123;
  • rimossi i link edizione_data_corso delle due edizioni duplicate;
  • cancellate da WooCommerce: variation 1738 e 1739;
  • lasciata intatta data_corso.id=195, con orari 08:30-12:30 e 13:30-17:30.

Backup mirato DB:

  • /home/safeops/tmp/formazione_cleanup_wp_20260903/prod_duplicate_slots_db_backup.json

Backup/cancellazione WooCommerce:

  • piano: /home/safeops/tmp/formazione_cleanup_wp_20260903/duplicate_slots_delete_plan.tsv
  • apply: /home/safeops/tmp/formazione_cleanup_wp_20260903/duplicate_slots_delete_apply/

Verifica finale:

  • DB produzione: una sola edizione CORDPILVQ-2026-ED-001 collegata a data_corso.id=195;
  • WooCommerce: una sola variation formazione residua, 1740, label 09/09/2026 - 08:30/17:30;
  • patch applicata in DEV e produzione: la pianificazione rapida non richiama piu la generazione automatica delle edizioni mattina/pomeriggio prima della sync WooCommerce.

Prossimo passo

Procedere con migrazione legacy corso-per-corso:

  1. approvare categoria legacy;
  2. preview dati legacy;
  3. dry-run import DEV;
  4. verifica visuale;
  5. import controllato.

Sync automatico SafeOps -> WooCommerce 2026-09-03

SafeOps resta il sistema master per date, orari, aula, capienza e cancellazioni delle edizioni corso.

Procedura automatica:

  1. l'operatore salva la pianificazione rapida, modifica una data dal calendario, cancella una data oppure modifica una edizione vendibile;
  2. SafeOps marca il corso e la mappa WooCommerce come sync_pending e registra un evento in formazione_external_sync_log;
  3. il job formazione_woocommerce_sync_job --mode push-changed include sempre i corsi con mappa sync_pending, anche se la modifica non rientra nella finestra temporale del lookback;
  4. WooCommerce viene riallineato dal job esterno e la console mostra lo stato Da sincronizzare, Sincronizzato, Errore o Disabilitato.

In produzione il timer attivo e' safeops-formazione-woocommerce-changed.timer; esegue il push incrementale periodico verso WooCommerce per il tenant Besant.

Verifiche eseguite:

  • compilazione Python di app/modules/formazione/views.py;
  • compilazione Python di app/modules/formazione/cli.py;
  • dry-run job WooCommerce in DEV;
  • dry-run job WooCommerce in produzione;
  • restart safeops-dev.service e safeops-web.service;
  • HTTP locale DEV e produzione: 302;
  • log post-restart senza traceback applicativi.