Commit 24b340f3 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Merge branch 'master' of https://git.unicaen.fr/open-source/OSE into ll-pb-import

parents 7e23ac63 7cc15aa0
Loading
Loading
Loading
Loading
+1 −0
Changes for CHANGELOG.md: 1 added line, 0 removed lines.
Original line number Diff line number Diff line
@@ -50,6 +50,7 @@ Une nouvelle documentation sur les connecteurs est disponible ici : [Import de d
## Corrections de bugs

* Erreur sur l'édition d'une dotation au niveau budget (#33703)
* Correction ordre d'affichage des pièces jointes pour l'intervenant comme paramétré dans l'adminstration (#34324)

# OSE 14.15

+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
+0 −140
Changes for doc/Connecteurs Import/Octopus/MV_INTERVENANT_OCTO.sql: 0 added lines, 140 removed lines.
Original line number Diff line number Diff line
CREATE
MATERIALIZED VIEW MV_INTERVENANT_OCTO AS
WITH i AS (
    SELECT DISTINCT
        code,
        z_statut_id,
        '**id_cnu**'																								     z_discipline_id_cnu,
        '**id_sous_cnu**'																								 z_discipline_id_sous_cnu,
        '**id_spe_cnu**'																								 z_discipline_id_spe_cnu,
        '**id_dis2deg**'																								 z_discipline_id_dis2deg,
        --FIRST_VALUE(z_discipline_id_cnu) OVER (partition by code, z_statut_id order by validite_fin desc)      z_discipline_id_cnu,
        --FIRST_VALUE(z_discipline_id_sous_cnu) OVER (partition by code, z_statut_id order by validite_fin desc) z_discipline_id_sous_cnu,
        --FIRST_VALUE(z_discipline_id_spe_cnu) OVER (partition by code, z_statut_id order by validite_fin desc)  z_discipline_id_spe_cnu,
        --FIRST_VALUE(z_discipline_id_dis2deg) OVER (partition by code, z_statut_id order by validite_fin desc)  z_discipline_id_dis2deg,
        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,
                '**AUTRES**'                                                      z_statut_id, --Voir comment récuperer les statuts OSE
                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
                --psc.c_section_cnu                                                                                    z_discipline_id_cnu,
                --psc.c_sous_section_cnu                                                                               z_discipline_id_sous_cnu,
                --psc.c_specialite_cnu                                                                                 z_discipline_id_spe_cnu,
                --pss.c_disc_second_degre                                                                              z_discipline_id_dis2deg,
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                 source_code
         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')
         WHERE aff.date_debut - 184 <= SYSDATE
         AND aft.nom = 'AFFECTATION'

         UNION ALL
         --AFFECTATION ENSEIGNEMENT
         SELECT uni.c_src_individu                                            code,
                '**AUTRES**'                                                      z_statut_id, --Voir comment récuperer les statuts OSE
                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
                --psc.c_section_cnu                                                                                    z_discipline_id_cnu,
                --psc.c_sous_section_cnu                                                                               z_discipline_id_sous_cnu,
                --psc.c_specialite_cnu                                                                                 z_discipline_id_spe_cnu,
                --pss.c_disc_second_degre                                                                              z_discipline_id_dis2deg,
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                 source_code
         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')
         WHERE aff.date_debut - 184 <= SYSDATE
         AND aft.nom = 'ENSEIGNEMENT'

         UNION ALL
         --AFFECTATION RECHERCHE
         SELECT uni.c_src_individu                                            code,
                '**AUTRES**'                                                      z_statut_id, --Voir comment récuperer les statuts OSE
                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
                --psc.c_section_cnu                                                                                    z_discipline_id_cnu,
                --psc.c_sous_section_cnu                                                                               z_discipline_id_sous_cnu,
                --psc.c_specialite_cnu                                                                                 z_discipline_id_spe_cnu,
                --pss.c_disc_second_degre                                                                              z_discipline_id_dis2deg,
                --il faut retrouver a.no_seq_affectation en attendant on met id_orig
                uni.c_individu_chaine || '-a-' || aff.id_orig                 source_code
         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')
         WHERE aff.date_debut - 184 <= SYSDATE
         AND aft.nom = 'RECHERCHE') t
),
     telephone_pro_principal AS(
         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')
     )
SELECT ind.c_individu_chaine                                           individu_id,
    /* Code de l'intervenant = numéro Harpège */
       ltrim(TO_CHAR(induni.c_src_individu, '99999999'))               code,
       i.source_code                                                   source_code,
    /* = supannempid du LDAP Unicaen */
       lpad(ltrim(TO_CHAR(induni.c_src_individu, '99999999')), 8, '0') utilisateur_code,
    /* Code structure Harpège (il sera plus tard transformé par la vue source en ID de strucutre OSE) */
       '**Code STRUCTURE Harpège**'                                    z_structure_id,
    /* Code statut */
       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,
       '**Grade individu**'                                            z_grade_id,
    /* Données nécessaires pour calculer la discipline */
       i.z_discipline_id_cnu                                           z_discipline_id_cnu,
       i.z_discipline_id_sous_cnu                                      z_discipline_id_sous_cnu,
       i.z_discipline_id_spe_cnu                                       z_discipline_id_spe_cnu,
       i.z_discipline_id_dis2deg                                       z_discipline_id_dis2deg,
    /* 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,
       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
       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,

       telpro.numero                                                   tel_pro,
       ind.tel_perso                                                   tel_perso,
       '**Email pro**'                                                 email_pro,
       ind.email_perso                                                 email_perso,
    /* Adresse */
       '**Adr précision**'                                             adresse_precisions,
       '**Adr N° voie**'                                               adresse_numero,
       '**Adr complement**'                                            z_adresse_numero_compl_id,
       '**Adr voirie**'                                                z_adresse_voirie_id,
       '**Adr voie**'                                                  adresse_voie,
       '**Adr lieu dit**'                                              adresse_lieu_dit,
       '**Adr code postal**'                                           adresse_code_postal,
       '**Adr ville**'                                                 adresse_commune,
       '**Adr pays**'                                                  z_adresse_pays_id,
    /* INSEE */
       '**INSEE**'                                                     numero_insee,
       '**INSEE provisoire**'                                          numero_insee_provisoire,

    /* Banque */
       '**iban**'                                                      iban,
       '**bic**'                                                       bic,
       '**RIB hors sepa**'                                             rib_hors_sepa

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 telephone_pro_principal telpro ON telpro.individu_id = induni.c_individu_chaine
WHERE i.validite_fin + 1 >= (SYSDATE - (365 * 2))
+169 −0

File added.

Preview size limit exceeded, changes collapsed.

+11 −0
Changes for doc/Connecteurs Import/Octopus/SRC_OCTO_CORPS.sql: 11 added lines, 0 removed lines.
Original line number Diff line number Diff line
CREATE
OR REPLACE FORCE VIEW SRC_OCTO_CORPS AS
SELECT c.lib_long  libelle_long,
       c.lib_court libelle_court,
       s.id        source_id,
       c.c_corps   source_code
FROM corps@octodev c
         JOIN source s
              ON s.code = 'Octopus'
WHERE SYSDATE BETWEEN COALESCE(c.d_ouverture, SYSDATE) AND COALESCE(c.d_fermeture + 1, SYSDATE)
  AND c.c_corps = '843'
Loading