Commit 2d5b56c3 authored by Antony Le Courtes's avatar Antony Le Courtes
Browse files

MV_INTERVENANT octopus + doc Connecteur.md

parent f7c797ed
Loading
Loading
Loading
Loading
+119 −0
Changes for doc/Connecteurs Import/Octopus/Connecteur.md: 119 added lines, 0 removed lines.
Original line number Diff line number Diff line
# Connecteur Octopus

Le connecteur Octopus permet de synchroniser en import :

* les pays
* les départements
* les structures (composantes)
* les corps et les grades
* Les intervenants vacataires et permanents

## Mise en place du DbLink

Le lien avec Octopus se fait au moyen d'un DbLink que vous devrez créer. Dans cet exemple, le DbLink s'appellera `octoprod`.

## Déclaration du connecteur dans OSE

OSE doit lister toutes ses sources de données. Il faut donc y ajouter Harpège :

```sql
BEGIN
  unicaen_import.add_source
('Octopus', 'Octopus');
commit;
END;
```

La liste des sources de OSE est accessible ici (URL pointant vers l'instance de démonstration de OSE) :
[https://\<votre ose\>/demo/import/sources](https://ose.unicaen.fr/demo/import/sources)

## Import des pays

Les pays sont enregistrés dans la table PAYS.

Si vous venez d'installer OSE, alors l'application est livrée avec un jeu de données par défaut, parmi lesquelles une liste
des pays. Avant d'utiliser votre propre liste issue d'Harpège, vous devez impérativement vider la table PAYS, sans quoi vous
vous retrouveriez avec des erreurs d'import pour cause de doublons.

```sql
DELETE
FROM PAYS;
```

Ensuite, créez la vue source [SRC_PAYS](SRC_PAYS.sql).

[Activez-là, puis tentez une synchronisation](../activer-synchroniser.md).

## Import des départements

Les départements sont enregistrés dans la table DEPARTEMENT.

Comme pour les pays, si vous venez d'installer OSE, alors l'application est livrée avec un jeu de données par défaut, parmi
lesquelles une liste des départements. Avant d'utiliser votre propre liste issue d'Harpège, vous devez impérativement vider la
table DEPARTEMENT, sans quoi vous vous retrouveriez avec des erreurs d'import pour cause de doublons.

```sql
DELETE
FROM DEPARTEMENT;
```

Ensuite, créez la vue source [SRC_DEPARTEMENT](SRC_DEPARTEMENT.sql).

[Activez-là, puis tentez une synchronisation](../activer-synchroniser.md).

## Import des structures

Les structures dans OSE matérialisent des composantes ou des départements. Il n'y a qu'un seul niveau de structure dans OSE.
Les structures portent entres autres l'offre de formation, les intervenants mais aussi les affectations (droits d'accès).

Créez la vue source [SRC_STRUCTURE](SRC_STRUCTURE.sql).

Dans cette vue, on importe les structures Harpège de niveau 2 et la structure Université (UNIV) de niveau 1.

[Activez-là, puis tentez une synchronisation](../activer-synchroniser.md).

## Import des corps et des grades

Pour chaque corps nous pouvons avoir plusieurs grades.

Les corps sont enregistrés dans la table CORPS, les grades dnas la table GRADE.

Comme pour les pays, si vous venez d'installer OSE, alors l'application est livrée avec un jeu de données par défaut, parmi
lesquelles une liste des corps et une autre des grades. Avant d'utiliser vos propres listes de corps et de grades issues d'
Harpège, vous devez impérativement vider les table GRADE et CORPS, sans quoi vous vous retrouveriez avec des erreurs d'import
pour cause de doublons.

```sql
DELETE
FROM GRADE;
DELETE
FROM CORPS;
```

Ensuite, créez la vue source [SRC_CORPS](SRC_CORPS.sql), puis la vue source [SRC_GRADE](SRC_GRADE.sql).

[Activez-les, puis tentez les synchronisations](../activer-synchroniser.md).

## Import des intervenants

Les intervenants peuvent être indifféremment des permanents ou des vacataires.

Compte tenu de la masse des données et pour des raisons d'optimisation aussi bien que de lisibilité, la vue source va
s'appuyer sur une vue matérialisée qui va lui "préparer" le travail.

L'ensemble de la population active dans Octopus (ou plus exactement les individus actifs 6 mois avant leur date de début et
400 jours après leur date de fin d'activité)
se retrouve dans ce connecteur.

Voici la vue matérialisée qui remonte les données d'Harpège :

[MV_INTERVENANT](MV_INTERVENANT.sql)

Les données en sortie sont préparées pour être exploitées par la vue source.

[SRC_INTERVENANT](SRC_INTERVENANT.sql)

La vue SRC_INTERVENANT remplit plusieurs rôles :

* Elle récupère les valeurs identifiantes pour les champs faisant références à d'autres tables à l'aide des valeurs (champs
  z_*) transmises à cet effet par la vue matérialisée
+82 −53
Changes for doc/Connecteurs Import/Octopus/MV_INTERVENANT_OCTO.sql: 82 added lines, 53 removed lines.
Original line number Diff line number Diff line
CREATE
MATERIALIZED VIEW MV_INTERVENANT_OCTO AS
WITH i AS (
    SELECT DISTINCT
        code,
    SELECT DISTINCT code,
                    z_statut_id,
                    --On prend la structure d'affectation principale sinon la première structure saisie
                    FIRST_VALUE(structure_id) OVER (PARTITION BY code, z_statut_id ORDER BY affectation_principale DESC, id_affectation ASC)      structure_id,
                    MIN(source_code)    OVER (partition by code, z_statut_id)                                                                     source_code,
                    MIN(validite_debut) OVER (partition by code, z_statut_id)                                                                     validite_debut,
                    MAX(validite_fin)   OVER (partition by code, z_statut_id)                                                                     validite_fin
    FROM(SELECT uni.c_src_individu                                            code,
                icto.code_ose                                                 z_statut_id, --Voir comment récuperer les statuts OSE
    FROM (SELECT aff.id																      id_affectation,
                 uni.c_src_individu                                                       code,
                 aff.structure_id                                                         structure_id,
                 CASE WHEN icto.code_ose IS NOT NULL THEN icto.code_ose ELSE 'AUTRES' END z_statut_id,
                 COALESCE(aff.date_debut, to_date('01/01/1900', 'dd/mm/YYYY'))            validite_debut,
                 COALESCE(aff.date_fin, to_date('01/01/1900', 'dd/mm/YYYY'))              validite_fin,
                --Voir pour le lien entre discipline et individu
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                 source_code,
                 --Le source code n'est plus utilisé par SRC_INTERVENANT on met donc la même valeur que code + type affectation
                 uni.c_individu_chaine || '-a'                                            source_code,
                 aff.t_principale                                                         affectation_principale
         FROM individu_affectation@octodev aff
                  JOIN individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                  JOIN individu_unique@octodev uni ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
                  --LEFT JOIN v_individu_contrat_type_ose icto ON icto.individu_id = uni.c_individu_chaine
          FROM octo.individu_affectation@octodev aff
                   JOIN octo.individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                   JOIN octo.individu_unique@octodev uni
                        ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
                   LEFT JOIN octo.v_individu_contrat_type_ose@octodev icto
                             ON icto.individu_id = uni.c_individu_chaine AND COALESCE(icto.d_fin, SYSDATE) >= SYSDATE
          WHERE aff.date_debut - 184 <= SYSDATE
            AND aft.nom = 'AFFECTATION'
            --Uniquement si on veut que les affectations principales
@@ -26,16 +30,21 @@ WITH i AS (

          UNION ALL
          --AFFECTATION ENSEIGNEMENT
         SELECT uni.c_src_individu                                            code,
                '**AUTRES**'                                                      z_statut_id, --Voir comment récuperer les statuts OSE
          SELECT aff.id																      id_affectation,
                 uni.c_src_individu                                                       code,
                 aff.structure_id                                                         structure_id,
                 CASE WHEN icto.code_ose IS NOT NULL THEN icto.code_ose ELSE 'AUTRES' END z_statut_id,
                 COALESCE(aff.date_debut, to_date('01/01/1900', 'dd/mm/YYYY'))            validite_debut,
                 COALESCE(aff.date_fin, to_date('01/01/1900', 'dd/mm/YYYY'))              validite_fin,
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                 source_code,
                 --Le source code n'est plus utilisé par SRC_INTERVENANT on met donc la même valeur que code
                 uni.c_individu_chaine || '-c'                                            source_code,
                 aff.t_principale                                                         affectation_principale
         FROM individu_affectation@octodev aff
                  JOIN individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                  JOIN individu_unique@octodev uni ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
          FROM octo.individu_affectation@octodev aff
                   JOIN octo.individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                   JOIN octo.individu_unique@octodev uni
                        ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
                   LEFT JOIN octo.v_individu_contrat_type_ose@octodev icto
                             ON icto.individu_id = uni.c_individu_chaine AND COALESCE(icto.d_fin, SYSDATE) >= SYSDATE
          WHERE aff.date_debut - 184 <= SYSDATE
            AND aft.nom = 'ENSEIGNEMENT'
            --Uniquement si on veut que les affectations principales
@@ -43,16 +52,21 @@ WITH i AS (

          UNION ALL
          --AFFECTATION RECHERCHE
         SELECT uni.c_src_individu                                                code,
                '**AUTRES**'                                                      z_statut_id, --Voir comment récuperer les statuts OSE
          SELECT aff.id																      id_affectation,
                 uni.c_src_individu                                                       code,
                 aff.structure_id                                                         structure_id,
                 CASE WHEN icto.code_ose IS NOT NULL THEN icto.code_ose ELSE 'AUTRES' END z_statut_id,
                 COALESCE(aff.date_debut, to_date('01/01/1900', 'dd/mm/YYYY'))            validite_debut,
                 COALESCE(aff.date_fin, to_date('01/01/1900', 'dd/mm/YYYY'))              validite_fin,
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                     source_code,
                 --Le source code n'est plus utilisé par SRC_INTERVENANT on met donc la même valeur que code
                 uni.c_individu_chaine || '-r'                                            source_code,
                 aff.t_principale                                                         affectation_principale
         FROM individu_affectation@octodev aff
                  JOIN individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                  JOIN individu_unique@octodev uni ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
          FROM octo.individu_affectation@octodev aff
                   JOIN octo.individu_affectation_type@octodev aft ON (aff.type_id = aft.id)
                   JOIN octo.individu_unique@octodev uni
                        ON (aff.individu_id = uni.c_individu_chaine AND uni.c_source = 'HARP')
                   LEFT JOIN octo.v_individu_contrat_type_ose@octodev icto
                             ON icto.individu_id = uni.c_individu_chaine AND COALESCE(icto.d_fin, SYSDATE) >= SYSDATE
          WHERE aff.date_debut - 184 <= SYSDATE
            AND aft.nom = 'RECHERCHE'
             --Uniquement si on veut que les affectations principales
@@ -60,50 +74,47 @@ WITH i AS (
         ) t
),
     telephone_pro_principal AS (
         SELECT
             indtel.individu_id        individu_id,
         SELECT indtel.individu_id individu_id,
                tel.numero         numero
         FROM individu_telephone@octodev    indtel
                  JOIN telephone@octodev tel ON (tel.id = indtel.telephone_id AND tel.t_principal = 'O')
         FROM octo.individu_telephone@octodev indtel
                  JOIN octo.telephone@octodev tel ON (tel.id = indtel.telephone_id AND tel.t_principal = 'O')
     )
SELECT
    /*Octopus id, id unique pour un individu immuable dans le temps, remplace le code harpege*/
    --Octopus id, id unique pour un individu immuable dans le temps, remplace le code harpege
    induni.c_individu_chaine                                                                             code,
    /* Code RH */
    --Code RH de l'intervenant dans le SI harpége pour le moment SIHAM par la suite
    ltrim(TO_CHAR(induni.c_src_individu, '99999999'))                                                    code_rh,
    i.source_code                                                                                        source_code,
    /* = supannempid du LDAP Unicaen */
    --UID du LDAP Unicaen
    indc.ldap_uid                                                                                        utilisateur_code,
    indg.structure_id                                 z_structure_id,
    --Structure d'affectation principale de l'intervenant
    i.structure_id                                                                                       z_structure_id,
    i.z_statut_id                                                                                        z_statut_id,
    /* Récupération du grade actuel */
    --pbs_divers__cicg.c_grade@harpprod(individu.no_individu, COALESCE(i.validite_fin,SYSDATE) ) z_grade_id,
    --Récupération du grade actuel
    indg.grade_id                                                                                        z_grade_id,
    /* Données nécessaires pour calculer la discipline */
    --Données nécessaires pour calculer la discipline
    indg.cnu_id                                                                                          z_discipline_id_cnu,
    NULL                                                                                                 z_discipline_id_sous_cnu,
    indg.cnu_specialite_id                                                                               z_discipline_id_spe_cnu,
    indg.discipline_sec_id                                                                               z_discipline_id_dis2deg,
    /* Données identifiantes de base */
    --Données identifiantes de base
    CASE ind.sexe WHEN 'M' THEN 'M.' ELSE 'Mme' END                                                      z_civilite_id,
    initcap(ind.nom_usage)                            nom_usuel,
    initcap(ind.prenom)                               prenom,
    INITCAP(ind.nom_usage)                                                                               nom_usuel,
    INITCAP(ind.prenom)                                                                                  prenom,
    ind.d_naissance                                                                                      date_naissance,


    /* Données identifiantes complémentaires */
    initcap(ind.nom_famille)                          nom_patronymique,
    --Pour le moment les communes ne sont pas dans OCTOPUS commune.libelle_commune
    INITCAP(ind.nom_famille)                                                                             nom_patronymique,
    ind.ville_de_naissance                                                                               commune_naissance,
    ind.c_pays_naissance                                                                                 z_pays_naissance_id,
    ind.c_dept_naissance                                                                                 z_departement_naissance_id,
    ind.c_pays_nationalite                                                                               z_pays_nationalite_id,

    --Données de contact pro et perso
    telpro.numero                                                                                        tel_pro,
    ind.tel_perso                                                                                        tel_perso,
    indc.email                                                                                           email_pro,
    ind.email_perso                                                                                      email_perso,
    /* Adresse */

    --Adresse
    '**Adr précision**'                                                                                  adresse_precisions,
    '**Adr N° voie**'                                                                                    adresse_numero,
    '**Adr complement**'                                                                                 z_adresse_numero_compl_id,
@@ -113,20 +124,38 @@ SELECT
    '**Adr code postal**'                                                                                adresse_code_postal,
    '**Adr ville**'                                                                                      adresse_commune,
    '**Adr pays**'                                                                                       z_adresse_pays_id,
    /* INSEE */

    --Données INSEE
    '**INSEE**'                                                                                          numero_insee,
    '**INSEE provisoire**'                                                                               numero_insee_provisoire,

    /* Banque */
    --Données bancaires
    '**iban**'                                                                                           iban,
    '**bic**'                                                                                            bic,
    '**RIB hors sepa**'                               rib_hors_sepa
    '**RIB hors sepa**'                                                                                  rib_hors_sepa,

    --Données complémentaires
    CAST(NULL AS varchar2(255))                                                                          autre_1,
    CAST(NULL AS varchar2(255))                                                                          autre_2,
    CAST(NULL AS varchar2(255))                                                                          autre_3,
    CAST(NULL AS varchar2(255))                                                                          autre_4,
    CAST(NULL AS varchar2(255))                                                                          autre_5,

    --Données Employeur
    CAST(NULL AS varchar2(255))                                                                          z_employeur_id,
    CASE WHEN i.validite_debut = to_date('01/01/1900', 'dd/mm/YYYY') THEN NULL ELSE i.validite_debut END validite_debut,
    CASE WHEN i.validite_fin = to_date('01/01/9999', 'dd/mm/YYYY') THEN NULL ELSE i.validite_fin END     validite_fin

FROM i
         JOIN individu_unique@octodev induni ON (i.code = induni.c_src_individu AND induni.c_source = 'HARP')
         LEFT JOIN individu@octodev ind ON ind.c_individu_chaine = induni.c_individu_chaine
         LEFT JOIN individu_grade@octodev indg ON induni.c_individu_chaine = indg.individu_id
         JOIN octo.individu_unique@octodev induni ON (i.code = induni.c_src_individu AND induni.c_source = 'HARP')
         LEFT JOIN octo.individu@octodev ind ON ind.c_individu_chaine = induni.c_individu_chaine
         LEFT JOIN octo.individu_grade@octodev indg ON induni.c_individu_chaine = indg.individu_id
         LEFT JOIN telephone_pro_principal telpro ON telpro.individu_id = induni.c_individu_chaine
         LEFT JOIN individu_compte@octodev indc ON indc.individu_id = induni.c_individu_chaine
    -- On ne prend que les comptes qui ne sont pas étudiants dans le cas d'intervenant qui sont également étudiant
         LEFT JOIN octo.individu_compte@octodev indc
                   ON indc.individu_id = induni.c_individu_chaine AND not regexp_like(ldap_uid, 'e[0-9]{8}')
WHERE i.validite_fin + 1 >= (SYSDATE - (365 * 2))
--AND code = 184
  --Filtre octopus id
  AND induni.c_individu_chaine = 247695
--Filtre code rh (harpége)
--AND induni.c_src_individu = 52958