From b88b8d767c377a819b187aed4d52a492ac1c10a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laurent=20L=C3=A9cluse?= Date: Thu, 3 Oct 2019 12:39:16 +0000 Subject: [PATCH] =?UTF-8?q?Doc=20changement=20d'ann=C3=A9es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (cherry picked from commit 3ae4380c2d9063d8108ab128559f439b1b55e182) --- bo/doc.md => doc/bo.md | 0 doc/changement-annee.md | 351 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 351 insertions(+) rename bo/doc.md => doc/bo.md (100%) create mode 100644 doc/changement-annee.md diff --git a/bo/doc.md b/doc/bo.md similarity index 100% rename from bo/doc.md rename to doc/bo.md diff --git a/doc/changement-annee.md b/doc/changement-annee.md new file mode 100644 index 000000000..02a9ec0ef --- /dev/null +++ b/doc/changement-annee.md @@ -0,0 +1,351 @@ +# Changement d'année universitaire + +Lors du changement d'année universitaire, il est parfois nécessaire de prolonger une offre de formation +ou bien de transférer des paramétrages de l'année courante vers la future année. + +Une interface de configuration sera proposée à terme dans OSE pour réaliser ces tâches. +Pour le moment, le transfert de données d'une année sur l'autre doit se faire par le biais des requêtes fournies ci-dessous. + +```sql +-- Liste des éléments et étapes concernées +WITH v AS (SELECT + + -- année à reverser (=2017 pour 2017/2018) + 2018 annee, + + -- Source à dupliquer + 'OSE' source, + + -- Eléments + --NULL elements_codes -- à utiliser si pas de filtre par code + ' + +CODE.1 +CODE.2 +AUTRE_CODE + +' elements_codes -- à utiliser pour ne transférer que certains codes + +FROM dual) +SELECT + str.libelle_court composante, + e.code etape_code, + e.libelle etape_libelle, + ep.code element_code, + ep.libelle element_libelle +FROM + v + JOIN source s ON s.code = v.source + JOIN element_pedagogique ep ON ep.source_id = s.id AND ep.annee_id = v.annee AND ep.histo_destruction IS NULL + JOIN etape e ON e.id = ep.etape_id + JOIN structure str ON str.id = ep.structure_id +WHERE + v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' +ORDER BY + composante, etape_code, element_code +; + + + +-- activer l'année +-- MAJ des paramètres généraux + + +-- Opération à répéter plusieurs fois, tant que des requêtes sont générées, car des dépendances entre données +-- +WITH v AS (SELECT p.*, p.annee annee_id, u.id utilisateur_id, s.id source_id FROM (SELECT + + -- année à reverser (=2017 pour 2017/2018) + 2018 annee, + + -- Source à dupliquer + 'OSE' source, + + -- Utilisateur créateur + 'lecluse' utilisateur, + + -- filtres (1 ou 0) + 1 etapes, + 1 elements, + 1 chemins, + 1 volumes_horaires_ens, + 0 modulateurs, + 0 centres_couts, + + -- Eléments + -- NULL elements_codes -- à utiliser si pas de filtre par code + ' +CODE.1 +CODE.2 +AUTRE_CODE + + ' elements_codes -- à utiliser pour ne transférer que certains codes + +FROM dual) p JOIN utilisateur u ON u.username = p.utilisateur JOIN source s ON s.code = p.source) +SELECT * FROM ( +SELECT '-- Passage de ' || v.annee_id || ' à ' || (v.annee_id+1) || ' --' isql FROM v + + + + + +UNION ALL SELECT '------------------------- étapes -------------------------' isql FROM dual UNION ALL +SELECT DISTINCT CASE WHEN e2.id IS NULL THEN ' +INSERT INTO etape ( + id, + libelle, + type_formation_id, + niveau, + specifique_echanges, + structure_id, + source_id, source_code, + histo_creation, histo_createur_id, + histo_modification, histo_modificateur_id, + domaine_fonctionnel_id, + annee_id, + code +) VALUES ( + etape_id_seq.nextval, + q''[' || e.libelle || ']'', + ' || COALESCE(to_char(e.type_formation_id),'NULL') || ', + ' || COALESCE(to_char(e.niveau),'NULL') || ', + ' || COALESCE(to_char(e.specifique_echanges),'NULL') || ', + ' || COALESCE(to_char(e.structure_id),'NULL') || ', + ' || e.source_id || ', q''[' || e.source_code || ']'', + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ', + ' || COALESCE(to_char(e.domaine_fonctionnel_id),'NULL') || ', + ' || (v.annee_id + 1) || ', + q''[' || e.code || ']'' +);' ELSE '-- CODE ' || e2.code || ' existant' END isql +FROM + v + JOIN etape e ON e.annee_id = v.annee_id AND e.source_id = v.source_id AND e.histo_destruction IS NULL + JOIN element_pedagogique ep ON ep.etape_id = e.id AND ep.histo_destruction IS NULL AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + LEFT JOIN etape e2 ON e2.code = e.code AND e2.annee_id = e.annee_id+1 AND e2.histo_destruction IS NULL +WHERE + v.etapes = 1 + + + + + +UNION ALL SELECT '------------------------- éléments pédagogiques -------------------------' isql FROM dual UNION ALL +SELECT CASE WHEN ep2.id IS NULL THEN ' + INSERT INTO element_pedagogique ( + ID, + CODE, + LIBELLE, + ETAPE_ID, + STRUCTURE_ID, + PERIODE_ID, + TAUX_FI, TAUX_FC, TAUX_FA, + TAUX_FOAD, + FI, FC, FA, + SOURCE_ID, SOURCE_CODE, + HISTO_CREATION, HISTO_CREATEUR_ID, + HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID, + ANNEE_ID, + DISCIPLINE_ID + ) VALUES ( + element_pedagogique_id_seq.nextval, + q''[' || ep.code || ']'', + q''[' || ep.libelle || ']'', + ' || e2.id || ', + ' || ep.structure_id || ', + ' || NVL(to_char(ep.periode_id), 'NULL') || ', + ' || TRIM(TO_CHAR(ep.taux_fi, '999.99')) || ', ' || TRIM(TO_CHAR(ep.taux_fc, '999.99')) || ', ' || TRIM(TO_CHAR(ep.taux_fa, '999.99')) || ', + ' || TRIM(TO_CHAR(ep.taux_foad, '999.99')) || ', + ' || TRIM(TO_CHAR(ep.fi, '999.99')) || ', ' || TRIM(TO_CHAR(ep.fc, '999.99')) || ', ' || TRIM(TO_CHAR(ep.fa, '999.99')) || ', + ' || v.source_id || ', q''[' || ep.source_code || ']'', + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ', + ' || (v.annee_id + 1) || ', + ' || NVL(to_char(ep.discipline_id), 'NULL') || ' + ); + ' ELSE '-- CODE ' || ep2.code || ' existant' END isql +FROM + v + JOIN element_pedagogique ep ON ep.annee_id = v.annee_id AND ep.source_id = v.source_id AND ep.histo_destruction IS NULL + JOIN etape e ON e.id = ep.etape_id + JOIN etape e2 ON e2.code = e.code AND e2.annee_id = e.annee_id+1 AND e2.histo_destruction IS NULL + LEFT JOIN element_pedagogique ep2 ON ep2.code = ep.code AND ep2.annee_id = ep.annee_id+1 AND ep2.histo_destruction IS NULL +WHERE + v.elements = 1 + AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + + + + + +UNION ALL SELECT '------------------------- chemins pédagogiques -------------------------' isql FROM dual UNION ALL +SELECT CASE WHEN cp2.id IS NULL THEN ' + INSERT INTO chemin_pedagogique( + ID, + ELEMENT_PEDAGOGIQUE_ID, + ETAPE_ID, + ORDRE, + SOURCE_ID, SOURCE_CODE, + HISTO_CREATION, HISTO_CREATEUR_ID, + HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID + ) VALUES ( + chemin_pedagogique_id_seq.nextval, + ' || ep2.id || ', + ' || e2.id || ', + ' || rownum || ', + ' || v.source_id || ', q''[' || e2.source_code || '_' || ep2.source_code || '_' || (v.annee_id + 1) || ']'', + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ' + ); + + ' ELSE '-- chemin d''élément CODE ' || ep2.code || ', étape CODE ' || e2.code || ' existant' END isql +FROM + v + JOIN chemin_pedagogique cp ON cp.source_id = v.source_id AND cp.histo_destruction IS NULL + JOIN element_pedagogique ep ON ep.id = cp.element_pedagogique_id AND ep.annee_id = v.annee_id + JOIN etape e ON e.id = cp.etape_id + JOIN element_pedagogique ep2 ON ep2.code = ep.code AND ep2.annee_id = ep.annee_id+1 AND ep2.histo_destruction IS NULL + JOIN etape e2 ON e2.code = e.code AND e2.annee_id = e.annee_id+1 AND e2.histo_destruction IS NULL + LEFT JOIN chemin_pedagogique cp2 ON cp2.etape_id = e2.id AND cp2.element_pedagogique_id = ep2.id AND cp2.histo_destruction IS NULL +WHERE + v.chemins = 1 + AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + + + + + +UNION ALL SELECT '------------------------- volumes_horaire_ens -------------------------' isql FROM dual UNION ALL +SELECT CASE WHEN vhe2.id IS NULL THEN ' +INSERT INTO volume_horaire_ens ( + id, + type_intervention_id, + heures, + source_id, source_code, + histo_creation, histo_createur_id, + histo_modification, histo_modificateur_id, + element_pedagogique_id, + groupes +) VALUES ( + volume_horaire_ens_id_seq.nextval, + ' || vhe.type_intervention_id || ', + ' || vhe.heures || ', + ' || v.source_id || ', q''[' || ep2.source_code || '_' || vhe.type_intervention_id || '_' || (v.annee_id + 1) || ']'', + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ', + ' || ep2.id || ', + ' || COALESCE(to_char(vhe.groupes),'NULL') || ' +); +' ELSE '-- VHE d''élément CODE ' || ep2.code || ', TI ID ' || vhe.type_intervention_id || ' existant' END isql +FROM + v + JOIN volume_horaire_ens vhe ON vhe.source_id = v.source_id AND vhe.histo_destruction IS NULL + JOIN element_pedagogique ep ON ep.id = vhe.element_pedagogique_id AND ep.annee_id = v.annee_id + JOIN element_pedagogique ep2 ON ep2.code = ep.code AND ep2.annee_id = ep.annee_id+1 AND ep2.histo_destruction IS NULL + LEFT JOIN volume_horaire_ens vhe2 ON vhe2.element_pedagogique_id = ep2.id AND vhe2.type_intervention_id = vhe.type_intervention_id AND vhe2.histo_destruction IS NULL +WHERE + v.volumes_horaires_ens = 1 + AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + + + + +UNION ALL SELECT '------------------------- modulateurs -------------------------' isql FROM dual UNION ALL +SELECT CASE WHEN em2.id IS NULL THEN ' +INSERT INTO ELEMENT_MODULATEUR( + ID, + ELEMENT_ID, + MODULATEUR_ID, + HISTO_CREATION, HISTO_CREATEUR_ID, + HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID +)VALUES( + ELEMENT_MODULATEUR_ID_SEQ.NEXTVAL, + ' || ep2.id || ', + ' || em.modulateur_id || ', + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ' +);' ELSE '-- EM d''élément CODE ' || ep2.code || ', Modulateur ID ' || em.modulateur_id || ' existant' END isql +FROM + v + JOIN element_modulateur em ON em.histo_destruction IS NULL + JOIN element_pedagogique ep ON ep.id = em.element_id AND ep.annee_id = v.annee_id + JOIN element_pedagogique ep2 ON ep2.code = ep.code AND ep2.annee_id = ep.annee_id + 1 AND ep2.histo_destruction IS NULL + LEFT JOIN element_modulateur em2 ON em2.element_id = ep2.id AND em2.modulateur_id = em.modulateur_id AND em2.histo_destruction IS NULL +WHERE + v.modulateurs = 1 + AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + + + + + +UNION ALL SELECT '------------------------- centres de coûts -------------------------' isql FROM dual UNION ALL +SELECT CASE WHEN cce2.id IS NULL THEN ' +INSERT INTO CENTRE_COUT_EP( + ID, + CENTRE_COUT_ID, + ELEMENT_PEDAGOGIQUE_ID, + TYPE_HEURES_ID, + SOURCE_ID, + SOURCE_CODE, + HISTO_CREATION, HISTO_CREATEUR_ID, + HISTO_MODIFICATION, HISTO_MODIFICATEUR_ID +)VALUES( + CENTRE_COUT_EP_ID_SEQ.NEXTVAL, + ' || cce.centre_cout_id || ', + ' || ep2.id || ', + ' || CCE.type_heures_id || ', + ' || CCE.source_id || ', + ''N-1toN_'' || CENTRE_COUT_EP_ID_SEQ.CURRVAL, + SYSDATE, ' || v.utilisateur_id || ', + SYSDATE, ' || v.utilisateur_id || ' +);' ELSE '-- EM d''élément CODE ' || ep2.code || ', Centre coûts ID ' || cce.centre_cout_id || ' existant' END isql +FROM + v + JOIN centre_cout_ep cce ON cce.histo_destruction IS NULL + JOIN element_pedagogique ep ON ep.id = cce.element_pedagogique_id AND ep.annee_id = v.annee_id + JOIN element_pedagogique ep2 ON ep2.code = ep.code AND ep2.annee_id = ep.annee_id+1 AND ep2.histo_destruction IS NULL + LEFT JOIN centre_cout_ep cce2 ON cce2.centre_cout_id = cce.centre_cout_id + AND cce2.element_pedagogique_id = cce.element_pedagogique_id + AND cce2.type_heures_id = cce.type_heures_id + AND cce2.histo_destruction IS NULL +WHERE + v.centres_couts = 1 + AND (v.elements_codes IS NULL OR ' +' || v.elements_codes || ' +' LIKE '% +' || ep.code || ' +%' + ) + +) t +``` \ No newline at end of file -- GitLab