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