diff --git a/bin/ose b/bin/ose index b1873169c1fd7f97263925771c2b4e4449fb0783..74514f13b33daa8dd5625e4dee5a679754369635 100755 --- a/bin/ose +++ b/bin/ose @@ -20,6 +20,10 @@ switch ($action) { $version = $c->getArg(3); /* Action à effectuer */ break; + case 'synchronisation': + $job = $c->getArg(2); + $oa->exec('UnicaenImport SyncJob '.$job); + break; default: help($c, $oa); break; @@ -207,7 +211,7 @@ class OseAdmin public function exec($args) { - $this->console->exec("php ../public/index.php " . $args); + $this->console->exec("php ".dirname(__DIR__)."/public/index.php " . $args); } } diff --git a/code/GenDbStructure/DataGen.php b/code/GenDbStructure/DataGen.php index b86ee6815976549d2d11bdd2ad34481c7e7b4f2b..a83e64e5e617a11f6ce119a95b3c57395fcba106 100644 --- a/code/GenDbStructure/DataGen.php +++ b/code/GenDbStructure/DataGen.php @@ -18,60 +18,60 @@ class DataGen */ protected $tablesInfo = []; - protected $breaks = false; + protected $breaks = false; protected $tablesSel = [ - 'AFFECTATION' => "utilisateur_id IN (SELECT id FROM utilisateur WHERE username='".self::OSE_USER."')", - 'ANNEE' => '', - 'CATEGORIE_PRIVILEGE' => '', - 'CC_ACTIVITE' => '', - 'CIVILITE' => '', - 'CORPS' => '', - 'DEPARTEMENT' => '', - 'DISCIPLINE' => '', - 'DOMAINE_FONCTIONNEL' => '', - 'ETABLISSEMENT' => '', - 'ETAT_VOLUME_HORAIRE' => '', - 'FONCTION_REFERENTIEL' => '', - 'GRADE' => 'corps_id in (select c.id from corps c where c.histo_destruction is null)', - 'GROUPE' => '', - 'IMPORT_TABLES' => '', - 'INDICATEUR' => '', - 'MESSAGE' => '', - 'MOTIF_MODIFICATION_SERVICE' => '', - 'MOTIF_NON_PAIEMENT' => '', - 'PARAMETRE' => '', - 'PAYS' => '', - 'PERIMETRE' => '', - 'PERIODE' => '', - 'PLAFOND' => '', - 'PLAFOND_ETAT' => '', - 'PRIVILEGE' => '', - 'REGLE_STRUCTURE_VALIDATION' => '', - 'ROLE' => '', - 'ROLE_PRIVILEGE' => '', - 'SCENARIO' => 'structure_id IS NULL', - 'SOURCE' => "code='OSE'", - 'STATUT_INTERVENANT' => '', - 'STATUT_PRIVILEGE' => 'statut_id IN (SELECT si.id FROM statut_intervenant si WHERE si.histo_destruction IS NULL)', - 'TAUX_HORAIRE_HETD' => '', - 'TBL' => '', - 'TYPE_AGREMENT' => '', - 'TYPE_AGREMENT_STATUT' => '', - 'TYPE_CONTRAT' => '', - 'TYPE_DOTATION' => "SOURCE_CODE IN ('dotation-initiale','dotation-complementaire','abondement')", - 'TYPE_HEURES' => '', - 'TYPE_INTERVENANT' => '', - 'TYPE_INTERVENTION' => "code IN ('CM','TD','TP','Stage','Projet','Mémoire')", - 'TYPE_PIECE_JOINTE' => '', - 'TYPE_PIECE_JOINTE_STATUT' => '', - 'TYPE_RESSOURCE' => '', - 'TYPE_STRUCTURE' => '', - 'TYPE_VALIDATION' => '', - 'TYPE_VOLUME_HORAIRE' => '', - 'UTILISATEUR' => "username = '".self::OSE_USER."'", - 'WF_ETAPE' => '', - 'WF_ETAPE_DEP' => '', + 'AFFECTATION' => "utilisateur_id IN (SELECT id FROM utilisateur WHERE username='" . self::OSE_USER . "')", + 'ANNEE' => '', + 'CATEGORIE_PRIVILEGE' => '', + 'CC_ACTIVITE' => '', + 'CIVILITE' => '', + 'CORPS' => '', + 'DEPARTEMENT' => '', + 'DISCIPLINE' => '', + 'DOMAINE_FONCTIONNEL' => '', + 'ETABLISSEMENT' => '', + 'ETAT_VOLUME_HORAIRE' => '', + 'FONCTION_REFERENTIEL' => '', + 'GRADE' => 'corps_id in (select c.id from corps c where c.histo_destruction is null)', + 'GROUPE' => '', + 'IMPORT_TABLES' => '', + 'INDICATEUR' => '', + 'MESSAGE' => '', + 'MOTIF_MODIFICATION_SERVICE' => '', + 'MOTIF_NON_PAIEMENT' => '', + 'PARAMETRE' => '', + 'PAYS' => '', + 'PERIMETRE' => '', + 'PERIODE' => '', + 'PLAFOND' => '', + 'PLAFOND_ETAT' => '', + 'PRIVILEGE' => '', + 'REGLE_STRUCTURE_VALIDATION' => '', + 'ROLE' => '', + 'ROLE_PRIVILEGE' => '', + 'SCENARIO' => 'structure_id IS NULL', + 'SOURCE' => "code='OSE'", + 'STATUT_INTERVENANT' => '', + 'STATUT_PRIVILEGE' => 'statut_id IN (SELECT si.id FROM statut_intervenant si WHERE si.histo_destruction IS NULL)', + 'TAUX_HORAIRE_HETD' => '', + 'TBL' => '', + 'TYPE_AGREMENT' => '', + 'TYPE_AGREMENT_STATUT' => '', + 'TYPE_CONTRAT' => '', + 'TYPE_DOTATION' => "SOURCE_CODE IN ('dotation-initiale','dotation-complementaire','abondement')", + 'TYPE_HEURES' => '', + 'TYPE_INTERVENANT' => '', + 'TYPE_INTERVENTION' => "code IN ('CM','TD','TP','Stage','Projet','Mémoire')", + 'TYPE_PIECE_JOINTE' => '', + 'TYPE_PIECE_JOINTE_STATUT' => '', + 'TYPE_RESSOURCE' => '', + 'TYPE_STRUCTURE' => '', + 'TYPE_VALIDATION' => '', + 'TYPE_VOLUME_HORAIRE' => '', + 'UTILISATEUR' => "username = '" . self::OSE_USER . "'", + 'WF_ETAPE' => '', + 'WF_ETAPE_DEP' => '', ]; @@ -195,7 +195,7 @@ class DataGen 'ID', ]; - if ('UTILISATEUR' == $tableName){ + if ('UTILISATEUR' == $tableName) { return 'USERNAME'; } @@ -313,33 +313,33 @@ class DataGen return substr($table, 0, 23) . '_ID_SEQ.NEXTVAL'; } - if ('SOURCE_ID' == $column){ + if ('SOURCE_ID' == $column) { return "(SELECT id FROM source WHERE code = ''OSE'')"; } - if ('TYPE_HEURES_ELEMENT_ID' == $column && 'TYPE_HEURES' == $table){ + if ('TYPE_HEURES_ELEMENT_ID' == $column && 'TYPE_HEURES' == $table) { return 'TYPE_HEURES_ID_SEQ.CURRVAL'; } - if ('PRIVILEGE_ID' == $column){ + if ('PRIVILEGE_ID' == $column) { $cppSql = "SELECT cp.code || '-' || p.code FROM privilege p JOIN categorie_privilege cp ON cp.id = p.categorie_id WHERE p.id = privilege_id"; + return "(SELECT p.id FROM privilege p JOIN categorie_privilege cp ON p.categorie_id = cp.id WHERE cp.code || ''-'' || p.code = ''' ||($cppSql)|| ''')"; } - if ('ROLE_ID' == $column && $table == 'AFFECTATION'){ + if ('ROLE_ID' == $column && $table == 'AFFECTATION') { return "(SELECT id FROM role WHERE code = ''administrateur'')"; } - if ('PASSWORD' == $column && $table == 'UTILISATEUR'){ + if ('PASSWORD' == $column && $table == 'UTILISATEUR') { return "''x''"; } - if ('IMPORT_TABLES' == $table && 'SYNC_ENABLED' == $column){ + if ('IMPORT_TABLES' == $table && 'SYNC_ENABLED' == $column) { return '0'; } - if ($def['constraint_table']) { $ctable = $def['constraint_table']; $ccol = $def['constraint_column']; diff --git a/code/GenDbStructure/DdlGen.php b/code/GenDbStructure/DdlGen.php index 00c2ae7b6f4cf5e562e12723dfc3d0a839a37cc4..3e6a3e8fd8ecdbebdc09636aae7ac4a9636414af 100644 --- a/code/GenDbStructure/DdlGen.php +++ b/code/GenDbStructure/DdlGen.php @@ -355,14 +355,7 @@ END; ORDER BY object_name "; - $this->addDdlQuery(self::PACKAGES_BODIES, $q, function($name,$ddl){ - if ($name == 'OSE_IMPORT'){ - $ddl = str_replace('-- SYNC COMMENT', '/*', $ddl); - $ddl = str_replace('-- END SYNC COMMENT', '*/', $ddl); - } - - return $ddl; - }); + $this->addDdlQuery(self::PACKAGES_BODIES, $q); $q = "SELECT diff --git "a/data/D\303\251ploiement/Changements.pdf" "b/data/D\303\251ploiement/Changements.pdf" index cd602ab05d8ea497d56dc1aa5aea2048a16cd4c3..c089acb498495aadcc15e8533c83e58abd026955 100644 Binary files "a/data/D\303\251ploiement/Changements.pdf" and "b/data/D\303\251ploiement/Changements.pdf" differ diff --git "a/data/D\303\251ploiement/Proc\303\251dure d'installation.md" "b/data/D\303\251ploiement/Proc\303\251dure d'installation.md" index 11df299d4e4a443e40b9262d3281583acb3656d4..d50fc0b7499d435ef0cc206e91a938bb52513b22 100644 --- "a/data/D\303\251ploiement/Proc\303\251dure d'installation.md" +++ "b/data/D\303\251ploiement/Proc\303\251dure d'installation.md" @@ -1,3 +1,13 @@ +--- +title: "Procédure d'installation de OSE" +author: Laurent Lécluse - DSI - Unicaen +titlepage: true +titlepage-color: 06386e +titlepage-text-color: ffffff +titlepage-rule-color: ffffff +titlepage-rule-height: 1 +... + # Prérequis ## Serveur Web Installer sur une distribution GNU/Linux - Debian 9 (Stretch) de préférence. @@ -190,11 +200,27 @@ Ce mode vous permettra de : Une fois cette étape terminée, il convient de passer OSE en mode production. Cela se fait dans le fichier de configuration `config.local.php`, en positionnant à `false` `global/modeInstallation`. -# Mise en place de la tâche CRON -Une tâche CRON doit être lancée sur votre serveur régulièrement. +# Mise en place des tâches CRON +Des tâches CRON doivent être lancée sur votre serveur régulièrement. Elle sert à envoyer les notifications par mail pour les indicateurs à ceux qui se sont abonnés. -En voici la commande : +Dans tous les cas, c'est le script de OSE qui sera appelé. +Le script est situé dans le répertoire de OSE, `bin/ose`. +Il est suivi de l'action à exécuter, puis éventuellement de paramètres. + +Exemple d'utilisation pour lancer une tâche de synchronisation appelée `principal`: +```bash +/usr/bin/php /var/www/ose/bin/ose synchronisation principal +``` + +| Usage | Fréquence | Action de script | +| --------------------- | --------------------- | --------------------- | +| Indicateurs : envoi des notifications par mail | Les jours de semaine entre 5h et 17h | notifier-indicateurs | +| Synchronisation : Mise en place d'un job pour l'import des données. Plusieurs jobs pourront être créés au besoin | Tous les quarts d'heures entre 7h et 21h sauf le dimanche | synchronisation | + +Voici un exemple de crontab : + + ```cron ###################### @@ -202,7 +228,8 @@ En voici la commande : ###################### # Notifications par mail des personnes abonnées à des indicateurs. # Exécution du script du lundi au vendredi,chaque heure de 7h à 1h : -0 5-17 * * 1-5 root /usr/bin/php /var/www/OSE/bin/ose notifier-indicateurs 1> /tmp/oselog 2>&1 +0 5-17 * * 1-5 root /usr/bin/php /var/www/ose/bin/ose notifier-indicateurs 1> /tmp/oselog 2>&1 +*/15 7-21 * * 1-6 php /usr/bin/php /var/www/ose/bin/ose synchronisation job1 1> /tmp/oselog 2>&1 ``` OSE est maintenant installé. diff --git "a/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" "b/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" index f20b4ecf3e47243553746fc44603d56d76b4a1fb..536675ba2e04a9fc91a92e19c995cdb8ab502ec5 100644 Binary files "a/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" and "b/data/D\303\251ploiement/Proc\303\251dure d'installation.pdf" differ diff --git "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.md" "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.md" index f185313dbb62e45090c558ad44363f15cfcdf0bf..402a67f8c2d5ace2cf9f6a3fdbc728f9774d2c33 100644 --- "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.md" +++ "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.md" @@ -1,3 +1,13 @@ +--- +title: "Procédure de mise à jour de OSE" +author: Laurent Lécluse - DSI - Unicaen +titlepage: true +titlepage-color: 06386e +titlepage-text-color: ffffff +titlepage-rule-color: ffffff +titlepage-rule-height: 1 +... + # Procédure de mise à jour ## Mode maintenance diff --git "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" index ef5f3a047c1b1e57bfc15440e14c03bedceaa757..26aa26e12d08fbd56dd9e67be8d1cd348903a160 100644 Binary files "a/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" and "b/data/D\303\251ploiement/Proc\303\251dure de mise \303\240 jour.pdf" differ diff --git "a/data/D\303\251ploiement/ose-ddl.sql" "b/data/D\303\251ploiement/ose-ddl.sql" index ee06b59547e695ad87811d788b996a37c3a20ef3..a74bf3a89e76b1cc842f8ee0d9fd6f6c0ee126aa 100755 --- "a/data/D\303\251ploiement/ose-ddl.sql" +++ "b/data/D\303\251ploiement/ose-ddl.sql" @@ -1170,6 +1170,10 @@ CREATE TABLE "IMPORT_TABLES" ( "TABLE_NAME" VARCHAR2(30 CHAR) NOT NULL ENABLE, "SYNC_FILTRE" VARCHAR2(2000 CHAR), "SYNC_ENABLED" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE, + "SYNC_JOB" VARCHAR2(40 CHAR), + "SYNC_HOOK_BEFORE" VARCHAR2(4000 CHAR), + "SYNC_HOOK_AFTER" VARCHAR2(4000 CHAR), + "ORDRE" NUMBER, CONSTRAINT "IMPORT_TABLES_PK" PRIMARY KEY ("TABLE_NAME") ENABLE ) ; @@ -2854,16 +2858,6 @@ CREATE OR REPLACE PACKAGE "OSE_HISTO" AS END OSE_HISTO; / --- OSE_IMPORT -CREATE OR REPLACE PACKAGE "OSE_IMPORT" IS - - PROCEDURE REFRESH_MVS; - PROCEDURE SYNC_TABLES; - PROCEDURE SYNCHRONISATION; - -END ose_import; -/ - -- OSE_PAIEMENT CREATE OR REPLACE PACKAGE "OSE_PAIEMENT" AS @@ -5163,7 +5157,7 @@ SELECT pcc.table_name c_table_name, pcc.column_name c_column_name FROM - user_tab_cols tc + user_tab_cols tc JOIN USER_CONS_COLUMNS cc ON cc.table_name = tc.table_name AND cc.column_name = tc.column_name JOIN USER_CONSTRAINTS c ON c.constraint_name = cc.constraint_name JOIN USER_CONSTRAINTS pc ON pc.constraint_name = c.r_constraint_name @@ -5184,6 +5178,7 @@ SELECT FROM user_tab_cols tc JOIN importable_tables t ON t.table_name = tc.table_name + LEFT JOIN import_tables it ON it.table_name = tc.table_name LEFT JOIN c_values cv ON cv.table_name = tc.table_name AND cv.column_name = tc.column_name LEFT JOIN user_tab_cols stc ON stc.table_name = 'SRC_' || tc.table_name AND stc.column_name = tc.column_name WHERE @@ -5191,7 +5186,7 @@ WHERE AND tc.column_name <> 'ID' AND tc.table_name <> 'SYNC_LOG' ORDER BY - tc.table_name, tc.column_id; + it.ordre, tc.table_name, tc.column_id; -- V_INDICATEUR_1010 CREATE OR REPLACE FORCE VIEW "V_INDICATEUR_1010" ("ID", "ANNEE_ID", "INTERVENANT_ID", "STRUCTURE_ID") AS @@ -10141,98 +10136,6 @@ CREATE OR REPLACE PACKAGE BODY "OSE_HISTO" AS END OSE_HISTO; / --- OSE_IMPORT -CREATE OR REPLACE PACKAGE BODY "OSE_IMPORT" IS - - PROCEDURE REFRESH_MV( mview_name varchar2 ) IS - BEGIN - DBMS_MVIEW.REFRESH(mview_name, 'C'); - EXCEPTION WHEN OTHERS THEN - UNICAEN_IMPORT.SYNC_LOG( SQLERRM, mview_name ); - END; - - PROCEDURE REFRESH_MVS IS - BEGIN - -- Mise à jour des vues matérialisées - -- procédure à adapter aux besoins de chaque établissement - - REFRESH_MV('MV_UNICAEN_STRUCTURE_CODES'); - REFRESH_MV('MV_AFFECTATION'); - REFRESH_MV('MV_INTERVENANT'); - END; - - PROCEDURE SYNC_TABLES IS - BEGIN - /* procédure à adapter aux besoins de chaque établissement - - UNICAEN_IMPORT.SYNCHRONISATION('PAYS'); - UNICAEN_IMPORT.SYNCHRONISATION('DEPARTEMENT'); - - UNICAEN_IMPORT.SYNCHRONISATION('ETABLISSEMENT'); - UNICAEN_IMPORT.SYNCHRONISATION('STRUCTURE'); - UNICAEN_IMPORT.SYNCHRONISATION('ADRESSE_STRUCTURE'); - - UNICAEN_IMPORT.SYNCHRONISATION('DOMAINE_FONCTIONNEL'); - UNICAEN_IMPORT.SYNCHRONISATION('CENTRE_COUT'); - UNICAEN_IMPORT.SYNCHRONISATION('CENTRE_COUT_STRUCTURE'); - - -- Import automatique des users des nouveaux directeurs - INSERT INTO utilisateur ( - id, display_name, email, password, state, username - ) - SELECT - utilisateur_id_seq.nextval id, - display_name, - email, - password, - state, - username - FROM - mv_affectation - WHERE - username not in (select username from utilisateur); - - UNICAEN_IMPORT.SYNCHRONISATION('AFFECTATION'); - - UNICAEN_IMPORT.SYNCHRONISATION('CORPS'); - UNICAEN_IMPORT.SYNCHRONISATION('GRADE'); - - UNICAEN_IMPORT.SYNCHRONISATION('INTERVENANT'); - UNICAEN_IMPORT.SYNCHRONISATION('AFFECTATION_RECHERCHE'); - UNICAEN_IMPORT.SYNCHRONISATION('ADRESSE_INTERVENANT'); - - UNICAEN_IMPORT.SYNCHRONISATION('GROUPE_TYPE_FORMATION'); - UNICAEN_IMPORT.SYNCHRONISATION('TYPE_FORMATION'); - UNICAEN_IMPORT.SYNCHRONISATION('ETAPE'); - UNICAEN_IMPORT.SYNCHRONISATION('ELEMENT_PEDAGOGIQUE'); - UNICAEN_IMPORT.SYNCHRONISATION('EFFECTIFS'); - --UNICAEN_IMPORT.SYNCHRONISATION('ELEMENT_TAUX_REGIMES'); - UNICAEN_IMPORT.SYNCHRONISATION('CHEMIN_PEDAGOGIQUE'); - - UNICAEN_IMPORT.SYNCHRONISATION('VOLUME_HORAIRE_ENS'); - UNICAEN_IMPORT.SYNCHRONISATION('NOEUD'); - UNICAEN_IMPORT.SYNCHRONISATION('LIEN'); - UNICAEN_IMPORT.SYNCHRONISATION('SCENARIO_LIEN'); - - REFRESH_MV('TBL_NOEUD'); - UNICAEN_TBL.CALCULER('chargens'); - - -- Mise à jour des sources calculées en dernier - UNICAEN_IMPORT.SYNCHRONISATION('TYPE_INTERVENTION_EP'); - UNICAEN_IMPORT.SYNCHRONISATION('TYPE_MODULATEUR_EP'); - - */ - END; - - PROCEDURE SYNCHRONISATION IS - BEGIN - REFRESH_MVS; - SYNC_TABLES; - END SYNCHRONISATION; - -END ose_import; -/ - -- OSE_PAIEMENT CREATE OR REPLACE PACKAGE BODY "OSE_PAIEMENT" AS @@ -19038,33 +18941,46 @@ INSERT INTO ETAT_VOLUME_HORAIRE(ID, CODE, LIBELLE, ORDRE) VALUES (ETAT_VOLUME_HO -- Table IMPORT_TABLES -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[INTERVENANT]', q'[WHERE (IMPORT_ACTION IN ('delete','update','undelete') OR STATUT_ID IN (SELECT si.id FROM statut_intervenant si JOIN type_intervenant ti ON ti.id = si.type_intervenant_id WHERE ti.code = 'P'))]', 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[AFFECTATION_RECHERCHE]', q'[WHERE INTERVENANT_ID IS NOT NULL]', 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ADRESSE_INTERVENANT]', q'[WHERE INTERVENANT_ID IS NOT NULL]', 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ELEMENT_TAUX_REGIMES]', q'[WHERE IMPORT_ACTION IN ('delete','insert','undelete')]', 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[VOLUME_HORAIRE_ENS]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[TYPE_MODULATEUR_EP]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[TYPE_INTERVENTION_EP]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[TYPE_FORMATION]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[STRUCTURE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[SCENARIO_LIEN]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[PAYS]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[NOEUD]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[LIEN]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[GROUPE_TYPE_FORMATION]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[GRADE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ETAPE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ETABLISSEMENT]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ELEMENT_PEDAGOGIQUE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[EFFECTIFS]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[DOMAINE_FONCTIONNEL]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[DEPARTEMENT]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[CORPS]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[CHEMIN_PEDAGOGIQUE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[CENTRE_COUT_STRUCTURE]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[CENTRE_COUT]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[AFFECTATION]', NULL, 0); -INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED) VALUES (q'[ADRESSE_STRUCTURE]', NULL, 0); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[INTERVENANT]', q'[WHERE (IMPORT_ACTION IN ('delete','update','undelete') OR STATUT_ID IN (SELECT si.id FROM statut_intervenant si JOIN type_intervenant ti ON ti.id = si.type_intervenant_id WHERE ti.code = 'P'))]', 0, NULL, q'[UNICAEN_IMPORT.REFRESH_MV('MV_UNICAEN_STRUCTURE_CODES'); +UNICAEN_IMPORT.REFRESH_MV('MV_INTERVENANT');]', NULL, 12); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[AFFECTATION_RECHERCHE]', q'[WHERE INTERVENANT_ID IS NOT NULL]', 0, NULL, NULL, NULL, 13); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ADRESSE_INTERVENANT]', q'[WHERE INTERVENANT_ID IS NOT NULL]', 0, q'[test1]', NULL, NULL, 14); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ELEMENT_TAUX_REGIMES]', q'[WHERE IMPORT_ACTION IN ('delete','insert','undelete')]', 0, NULL, NULL, NULL, 20); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[VOLUME_HORAIRE_ENS]', NULL, 0, q'[test1]', NULL, NULL, 22); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[TYPE_MODULATEUR_EP]', NULL, 0, q'[test1]', NULL, NULL, 27); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[TYPE_INTERVENTION_EP]', NULL, 0, q'[test1]', NULL, NULL, 26); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[TYPE_FORMATION]', NULL, 0, q'[test1]', NULL, NULL, 16); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[STRUCTURE]', NULL, 0, q'[test1]', NULL, NULL, 4); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[SCENARIO_LIEN]', NULL, 0, q'[test1]', NULL, NULL, 25); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[PAYS]', NULL, 0, q'[test1]', NULL, NULL, 1); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[NOEUD]', NULL, 0, q'[test1]', NULL, q'[UNICAEN_IMPORT.REFRESH_MV('TBL_NOEUD'); +UNICAEN_TBL.CALCULER('chargens');]', 23); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[LIEN]', NULL, 0, q'[test1]', NULL, NULL, 24); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[GROUPE_TYPE_FORMATION]', NULL, 0, q'[test1]', NULL, NULL, 15); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[GRADE]', NULL, 0, q'[test1]', NULL, NULL, 11); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ETAPE]', NULL, 0, q'[test1]', NULL, NULL, 17); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ETABLISSEMENT]', NULL, 0, q'[test1]', NULL, NULL, 3); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ELEMENT_PEDAGOGIQUE]', NULL, 0, q'[test1]', NULL, NULL, 18); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[EFFECTIFS]', NULL, 0, q'[test1]', NULL, NULL, 19); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[DOMAINE_FONCTIONNEL]', NULL, 0, q'[test1]', NULL, NULL, 6); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[DEPARTEMENT]', NULL, 0, q'[test1]', NULL, NULL, 2); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[CORPS]', NULL, 0, q'[test1]', NULL, NULL, 10); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[CHEMIN_PEDAGOGIQUE]', NULL, 0, NULL, NULL, NULL, 21); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[CENTRE_COUT_STRUCTURE]', NULL, 0, q'[test1]', NULL, NULL, 8); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[CENTRE_COUT]', NULL, 0, q'[test1]', NULL, NULL, 7); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[AFFECTATION]', NULL, 0, q'[test1]', q'[UNICAEN_IMPORT.REFRESH_MV('MV_AFFECTATION'); +/* Import automatique des users des nouveaux directeurs */ +INSERT INTO utilisateur ( + id, display_name, email, password, state, username +) +SELECT + utilisateur_id_seq.nextval id, + aff.* +FROM + (SELECT DISTINCT display_name, email, password, state, username FROM mv_affectation) aff +WHERE + username not in (select username from utilisateur);]', NULL, 9); +INSERT INTO IMPORT_TABLES(TABLE_NAME, SYNC_FILTRE, SYNC_ENABLED, SYNC_JOB, SYNC_HOOK_BEFORE, SYNC_HOOK_AFTER, ORDRE) VALUES (q'[ADRESSE_STRUCTURE]', NULL, 0, q'[test1]', NULL, NULL, 5); -- Table INDICATEUR diff --git "a/data/Mises \303\240 jour/06.3.sql" "b/data/Mises \303\240 jour/06.3.sql" index 6218859ec454f96e50f073f22fbcbfccf0d2a69d..cd9fad55d85018becdd2e737c6c195b58a53d368 100644 --- "a/data/Mises \303\240 jour/06.3.sql" +++ "b/data/Mises \303\240 jour/06.3.sql" @@ -4,4 +4,84 @@ ALTER TABLE effectifs MODIFY ( element_pedagogique_id NOT NULL ); -DROP VIEW V_TYPE_INTERVENTION_REGLE_EP; \ No newline at end of file +DROP VIEW V_TYPE_INTERVENTION_REGLE_EP; + +ALTER TABLE import_tables ADD ( + ordre NUMBER +); +ALTER TABLE import_tables ADD ( + sync_job VARCHAR2(40 CHAR) +); +ALTER TABLE import_tables ADD ( + sync_hook_before VARCHAR2(4000 CHAR) +); +ALTER TABLE import_tables ADD ( + sync_hook_after VARCHAR2(4000 CHAR) +); + + +CREATE OR REPLACE FORCE VIEW "V_IMPORT_TAB_COLS" ("TABLE_NAME", "COLUMN_NAME", "DATA_TYPE", "LENGTH", "NULLABLE", "HAS_DEFAULT", "C_TABLE_NAME", "C_COLUMN_NAME", "IMPORT_ACTIF") AS +WITH importable_tables (table_name )AS ( + SELECT + t.table_name +FROM + user_tab_cols c + join user_tables t on t.table_name = c.table_name +WHERE + c.column_name = 'SOURCE_CODE' + +MINUS + +SELECT + mview_name table_name +FROM + USER_MVIEWS +), c_values (table_name, column_name, c_table_name, c_column_name) AS ( +SELECT + tc.table_name, + tc.column_name, + pcc.table_name c_table_name, + pcc.column_name c_column_name +FROM + user_tab_cols tc + JOIN USER_CONS_COLUMNS cc ON cc.table_name = tc.table_name AND cc.column_name = tc.column_name + JOIN USER_CONSTRAINTS c ON c.constraint_name = cc.constraint_name + JOIN USER_CONSTRAINTS pc ON pc.constraint_name = c.r_constraint_name + JOIN USER_CONS_COLUMNS pcc ON pcc.constraint_name = pc.constraint_name +WHERE + c.constraint_type = 'R' AND pc.constraint_type = 'P' +) +SELECT + tc.table_name, + tc.column_name, + tc.data_type, + CASE WHEN tc.char_length = 0 THEN NULL ELSE tc.char_length END length, + CASE WHEN tc.nullable = 'Y' THEN 1 ELSE 0 END nullable, + CASE WHEN tc.data_default IS NOT NULL THEN 1 ELSE 0 END has_default, + cv.c_table_name, + cv.c_column_name, + CASE WHEN stc.table_name IS NULL THEN 0 ELSE 1 END AS import_actif +FROM + user_tab_cols tc + JOIN importable_tables t ON t.table_name = tc.table_name + LEFT JOIN import_tables it ON it.table_name = tc.table_name + LEFT JOIN c_values cv ON cv.table_name = tc.table_name AND cv.column_name = tc.column_name + LEFT JOIN user_tab_cols stc ON stc.table_name = 'SRC_' || tc.table_name AND stc.column_name = tc.column_name +WHERE + tc.column_name not like 'HISTO_%' + AND tc.column_name <> 'ID' + AND tc.table_name <> 'SYNC_LOG' +ORDER BY + it.ordre, tc.table_name, tc.column_id; + + +/ +-- Suppression du JOB OSE_SRC_SYNC => Synchro effectuée maintenant par CRON +BEGIN + DBMS_SCHEDULER.DROP_JOB(job_name => '"OSE"."OSE_SRC_SYNC"', + defer => false, + force => true); +END; +/ + +drop package "OSE"."OSE_IMPORT"; \ No newline at end of file