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:
corsodata_corsoedizione_corsoedizione_data_corsoformazione_data_corso_metadipendente_corsodipendente_corso_firmaformazione_external_enrollment_mapformazione_quote_seat_reservationformazione_quote_participantformazione_external_course_map
Pulizia SafeOps produzione¶
Righe impattate: 757.
Conteggi prima/dopo:
corso: 35 -> 35dipendente: 3.321 -> 3.321data_corso: 179 -> 0edizione_corso: 118 -> 0edizione_data_corso: 140 -> 0formazione_data_corso_meta: 106 -> 0dipendente_corso: 195 -> 0dipendente_corso_firma: 0 -> 0
Riferimenti test scollegati:
formazione_external_enrollment_map.data_corso_id: 3 -> 0formazione_external_enrollment_map.dipendente_corso_id: 3 -> 0formazione_quote_seat_reservation.data_corso_id: 4 -> 0formazione_quote_participant.data_corso_id: 5 -> 0formazione_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: attivoGET /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 corsoCORDPILVQdel 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 WooCommerce1740; - rimosse dal DB produzione:
edizione_corso.id=122e123; - rimossi i link
edizione_data_corsodelle due edizioni duplicate; - cancellate da WooCommerce: variation
1738e1739; - 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-001collegata adata_corso.id=195; - WooCommerce: una sola variation formazione residua,
1740, label09/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:
- approvare categoria legacy;
- preview dati legacy;
- dry-run import DEV;
- verifica visuale;
- 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:
- l'operatore salva la pianificazione rapida, modifica una data dal calendario, cancella una data oppure modifica una edizione vendibile;
- SafeOps marca il corso e la mappa WooCommerce come
sync_pendinge registra un evento informazione_external_sync_log; - il job
formazione_woocommerce_sync_job --mode push-changedinclude sempre i corsi con mappasync_pending, anche se la modifica non rientra nella finestra temporale del lookback; - WooCommerce viene riallineato dal job esterno e la console mostra lo stato
Da sincronizzare,Sincronizzato,ErroreoDisabilitato.
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.serviceesafeops-web.service; - HTTP locale DEV e produzione:
302; - log post-restart senza traceback applicativi.