Commit f520fb75 authored by Laurent Lecluse's avatar Laurent Lecluse
Browse files

Nouvelles SRC_INTERVENANT et MV_INTERVENANT

parent ca9bb21f
Loading
Loading
Loading
Loading
+2 −1
Changes for doc/Connecteurs Import/Création tables/INTERVENANT.md: 2 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -11,7 +11,8 @@ Vous devez l'utiliser telle quelle.

|Colonne                   |Type    |Longueur|Nullable|Commentaire                  |
|--------------------------|--------|--------|--------|-----------------------------|
|CODE                      |VARCHAR2|60      |Non     | Matricule spécifique à l'individu |
|CODE                      |VARCHAR2|60      |Non     | Identifiant unique de l'individu dans le système d'information l'individu |
|CODE_RH                   |VARCHAR2|60      |Oui     | Matricule permettant éventuellement d'identifier l'intervenant dans Siham, Harpège, Mangue, etc. |
|Z_SOURCE_ID               |VARCHAR2|15      |Non     |==> SOURCE.CODE              |
|SOURCE_CODE               |VARCHAR2|100     |Oui     |                             |
|UTILISATEUR_CODE          |VARCHAR2|60      |Oui     | Identifiant pour faire lien avec le LDAP |
+40 −48
Changes for doc/Connecteurs Import/Générique/SRC_INTERVENANT.md: 40 added lines, 48 removed lines.
Original line number Diff line number Diff line
@@ -2,7 +2,7 @@

Pour pouvoir fonctionner, il faut pouvoir gérer simultanément: 
 - les statuts multiples
 - l'annualisation des fiches
 - l'annualisation des fiches (en se basant sur les informations de validité fournies par la MV_INTERVENANT)
 - La synchronisation partielle dans certains cas

SRC_INTERVENANT se base sur MV_INTERVENANT, puis confronte les données à la table INTERVENANT pour présenter à la vue différentielle
@@ -32,7 +32,7 @@ Tout cela se fait dans la vue SRC_INTERVENANT.
SRC_INTERVENANT est ensuite utilisée par le système d'import de la même manière que les autres vues sources de OSE pour réaliser 
les opérations de synchronisation adéquates (INSERT, UPDATE, DELETE, UNDELETE).

## Liste des variables nécessaires :
## Grands principes de fonctionnement. Liste des variables nécessaires :

### statut_source_autre

@@ -52,6 +52,18 @@ Valeurs possibles : 0 ou 1

Détermine si les statuts issus de MV_INTERVENANT et INTERVENANT sont identiques ou non

### types_identiques

CASE WHEN ssi.type_intervenant_id = isi.type_intervenant_id THEN 1 ELSE 0 END

### sync_statut

Valeurs possibles : 0 ou 1

Détermine s'il faut mettre à jour le statut via la synchro ou bien si celui-ci ne doit pas être modifié, 
parcequ'il aurait par exemple été changé manuellement dans l'application.                                                   


### intervenant_local

Valeurs possibles : 0 ou 1
@@ -59,11 +71,20 @@ Valeurs possibles : 0 ou 1
Détermine si l'intervenant a été saisi directement dans OSE, auquel cas il ne devra pas être impacté par la synchro, 
ou bien s'il provient d'un précédent import.

### statut_deja_utilise

### intervenant_donnees

Valeurs possibles : 0 ou 1

Détermine si des données (services, PJ, dossier, etc.) sont associées à la fiche de l'intervenant ou non 


### intervenant_histo

Valeurs possibles : 0 ou 1

Détermine si le statut issu de MV_INTERVENANT est déjà affecté à l'intervenant dans une autre fiche ou non.
Détermine si la fiche intervenant est historisée ou non


### nb_sources

@@ -84,66 +105,37 @@ Valeurs possibles : 0 à n

Nombre de lignes où les statuts issus de MV_INTERVENANT et d'INTERVENANT sont égaux.

### diff_statut_autre
### statuts_egaux_id

Valeurs possibles : 0 à n
Type NUMERIC ou NULL

Nombre de lignes où le statut issu de MV_INTERVENANT est à la fois égal à AUTRE et différent de celui issu de INTERVENANT.
Si au moins un statut est présent à la fois dans la source ET dans OSE, un d'entre eux est remonté ici




## Liste des scénarios

### a

Données présentes uniquement dans le connecteur : à insérer donc.

### c

Une ou plusieurs lignes, et les statuts coincident tous.

### d

Une seule ligne, mais le statut diffère entre la source et la table.

### e

Une ligne en source et plusieurs en table, avec une ligne dont le statut coïncide et pas les autres.

### f

Une ligne en source et plusieurs en table, dont aucun statut ne coïncide avec le statut source.

### g

Plusieures lignes en source, une seule en destination de même statut qu'en source et aucune ligne en source de statut AUTRE.
11 scénario ont été identifiés :

### h
### 1 : Lorsque le statut est le même sur la source et la fiche OSE, alors la mise à jour meut se faire

Plusieures lignes en source, une seule en destination de même statut qu'en source et une ligne en source de statut AUTRE.
### 2 : On ne doit pas restaurer les intervenants créés dans OSE puis historisés qui ne sont pas remontés par la source

### i
### 3 : Si la source remonte 1 fiche et qu'aucune fiche OSE ne correspond => insertion d'un nouvel intervenant

Plusieurs lignes de part et d'autre, aucun statut AUTRE en source
### 4 : Si pour un intervenant il y a correspondances parfaite des statuts entre la source et OSE

### j
### 5 : Quand il y a 1 source et 1 fiche pour un intervenant, mais que le statut diffère

Plusieurs lignes de part et d'autre, un statut AUTRE en source
### 6 : Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut

### ...
### 7 : Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut

Tous les scénarios ne sont pas écrits. Il en manque et ceux listés ci-dessus vont probablement évoluer au gré des besoins.
### 8 : Quand il y a plusieurs sources pour un seul intervenant et qu'une au moins matche
   
### 9 : Quand il y a plusieurs sources pour un seul intervenant et qu'aucun ne matche

## Reste à faire :
### 10 : Quand il y a 2 sources et 2 intervenants et qu'un seul des deux matche

- Figer la liste des scénarios
- Pour chaque scénario, identifier les sous-scenarios ligne par ligne
- Pour chaque scénario et sous-scénarion, identifier l'action à mener
- Dropper les lignes inutiles
- Si plusieurs lignes sources correspondent à une même ligne destination :
  - identifier les valeurs identiques
  - identifier les valeurs différentes (discipline, structure, etc) et prendre à la place la valeur déjà présente dans INTERVENANT
- Ecrire le reste de la vue source
- Prévoir un système de log de syncgro pour savoir pourquoi telle ou telle fiche ne s'est pas synchronisée totalement (données sources multiples, plus de source alors qu'il y a des données dans OSE, etc.)
### 11 : Autres cas
 No newline at end of file
+80 −109
Changes for doc/Connecteurs Import/Générique/SRC_INTERVENANT.sql: 80 added lines, 109 removed lines.
Original line number Diff line number Diff line
@@ -3,9 +3,14 @@ SELECT
  CASE WHEN action = 'insert' THEN NULL ELSE intervenant_id END id,
  annee_id,
  code,
  code_rh,
  utilisateur_code,
  CASE WHEN annee_id < current_annee_id THEN intervenant_structure_id ELSE structure_id END structure_id,
  CASE WHEN action = 'update-no-statut' OR sync_statut = 0 OR annee_id < current_annee_id THEN statut_intervenant_id ELSE statut_source_id END statut_id,
  CASE
    WHEN action = 'insert' OR intervenant_histo = 1 THEN statut_source_id
    WHEN action = 'update-no-statut' OR sync_statut = 0 OR annee_id < current_annee_id THEN statut_intervenant_id
    ELSE statut_source_id
  END                                                                                       statut_id,
  CASE WHEN annee_id < current_annee_id THEN intervenant_grade_id ELSE grade_id END         grade_id,
  discipline_id,
  civilite_id,
@@ -41,31 +46,37 @@ SELECT
  autre_4,
  autre_5,
  employeur_id,
  source_id,
  CASE WHEN statuts_identiques = 0 AND i_source_id IS NOT NULL AND action <> 'insert' THEN i_source_id ELSE s_source_id END source_id,
  source_code,
  validite_debut,
  validite_fin
  CASE WHEN statuts_identiques = 0 AND intervenant_local = 1 AND action <> 'insert' THEN i_validite_debut ELSE s_validite_debut END validite_debut,
  CASE WHEN statuts_identiques = 0 AND intervenant_local = 1 AND action <> 'insert' THEN i_validite_fin ELSE s_validite_fin END validite_fin

FROM (
  SELECT
    t.*,
    CASE

      -- Nouvelle insertion
      -- Cas 1 : Si on est sur les mêmes fiches, alors on synchronise tout le temps
      WHEN statuts_identiques = 1 THEN 'update'


      -- Cas 2 : On ne restaure pas les locaux historisés s'il ne sont pas dans la source
      WHEN statuts_identiques = 0 AND intervenant_histo = 1 AND intervenant_local = 1 THEN 'drop'


      -- Cas 3 : Nouvelle insertion
      WHEN nb_sources = 1 AND nb_intervenants = 0 THEN 'insert'


      -- Quand les statuts matchent à 100%
      WHEN nb_sources = nb_intervenants AND nb_sources = nb_statuts_egaux THEN CASE
        -- Si ça matche alors ça passe
        WHEN statuts_identiques = 1 THEN 'update'
        -- Sinon ça ne compte pas
        ELSE 'drop'
      END
      -- Cas 4 : Quand les statuts matchent à 100%, il faut supprimer les faux positifs
      WHEN nb_sources = nb_intervenants AND nb_sources = nb_statuts_egaux THEN 'drop'


      -- Quand il y a différence de statut alors que c'est 1 <=> 1
      -- Cas 5 : Quand il y a différence de statut alors que c'est 1 <=> 1
      WHEN nb_sources = 1 AND nb_intervenants = 1 AND statuts_identiques = 0 THEN CASE
        -- Si c'est un intervenant local qui avait été créé, on n'y touche pas et on en recrée un nouveau
        WHEN intervenant_local = 1 THEN 'insert'

        -- Cas typique du vacataire qui a renseigné des données personnelles
        WHEN intervenant_local = 0 AND types_identiques = 1 AND statut_source_autre = 1 AND statut_intervenant_autre = 0 AND sync_statut = 0 THEN 'update'

@@ -76,30 +87,22 @@ FROM (
        WHEN intervenant_local = 0 AND types_identiques = 1 THEN 'update'

        -- Sinon on insère un nouveau statut
        ELSE 'insert'
        ELSE 'update'
      END


      -- Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut
      -- Cas 6 : Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut
      WHEN nb_sources = 1 AND nb_intervenants > 1 AND nb_statuts_egaux = 1 THEN CASE
        --Si on est sur des statuts identiques
        WHEN statuts_identiques = 1 THEN 'update'

        -- Si on a des données dans la fiche
        WHEN intervenant_donnees = 1 THEN 'update-no-statut'
        -- Si la fiche est vide et vient du SI alors on supprime
        WHEN intervenant_local = 0 AND intervenant_donnees = 0 THEN 'drop'

        -- Si c'est un intervenant local
        WHEN intervenant_local = 1 THEN 'update-no-statut'

        -- Sinon on met tout à jour sauf le statut
        -- si il y a des données alors update sans statut
        -- sinon si intervenant sync alors on droppe sinon intervenant local => on sync sans statut

        ELSE 'drop'
        -- Pour le reste on met à jour tout de même
        ELSE 'update-no-statut'
      END


      -- Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut
      -- Cas 7 : Quand il y a une seule source et plusieurs intervenants, et que la source matche sur au moins un statut
      WHEN nb_sources = 1 AND nb_intervenants > 1 AND nb_statuts_egaux = 0 THEN CASE
        -- Cas typique du vacataire qui a renseigné des données personnelles
        WHEN intervenant_local = 0 AND types_identiques = 1 AND statut_source_autre = 1 AND statut_intervenant_autre = 0 AND sync_statut = 0 THEN 'update'
@@ -115,10 +118,8 @@ FROM (
      END


      -- Quand il y a plusieurs sources pour un seul intervenant et qu'une au moins matche
      -- Cas 8 : Quand il y a plusieurs sources pour un seul intervenant et qu'une au moins matche
      WHEN nb_sources > 1 AND nb_intervenants = 1 AND nb_statuts_egaux = 1 THEN CASE
        -- Si on est sur des statuts identiques
        WHEN statuts_identiques = 1 THEN 'update'

        -- Si le nouveau statut est de type différent, alors on ajoute une nouvelle fiche
        WHEN types_identiques = 0 THEN 'insert'
@@ -129,7 +130,7 @@ FROM (
      END


      -- Quand il y a plusieurs sources pour un seul intervenant et qu'aucun ne matche
      -- Cas 9 : Quand il y a plusieurs sources pour un seul intervenant et qu'aucun ne matche
      WHEN nb_sources > 1 AND nb_intervenants = 1 AND nb_statuts_egaux = 0 THEN CASE
        -- Cas typique du vacataire qui a renseigné des données personnelles
        WHEN intervenant_local = 0 AND types_identiques = 1 AND statut_source_autre = 1 AND statut_intervenant_autre = 0 AND sync_statut = 0 THEN 'update'
@@ -143,33 +144,31 @@ FROM (
      END


      -- Quand il y a plusieurs sources pour un seul intervenant et qu'aucun ne matche
      WHEN nb_sources > 1 AND nb_intervenants > 1 THEN CASE
        -- Si on est sur des statuts identiques
        WHEN statuts_identiques = 1 THEN 'update'

        -- Cas typique du vacataire qui a renseigné des données personnelles
        WHEN intervenant_local = 0 AND types_identiques = 1 AND statut_source_autre = 1 AND statut_intervenant_autre = 0 AND sync_statut = 0 THEN 'update'

        ELSE 'drop'
      END
      -- Cas 10 : Quand il y a 2 sources et 2 intervenants et qu'un seul matche
      WHEN nb_sources = 2 AND nb_intervenants = 2 THEN CASE

        -- s'il y a deux fiches, mais qu'il y en a un deuxième alors on sync sur celle qui matche déjà les autres données
        WHEN statuts_identiques = 0 AND statut_source_id = statuts_egaux_id THEN 'update-no-statut'

    -- intéger la notion d'année : si < annee_import alors on insert que si total nouveau, sinon on ne fait que des updates sans statut et rien d'autre
    -- gestion des non autorisés ??
        -- Autres fiches de même type
        WHEN statuts_identiques = 0 AND statut_source_id <> statuts_egaux_id AND statut_intervenant_id <> statuts_egaux_id AND types_identiques = 1 THEN 'update'

        -- Autres fiches de type différent
        WHEN statuts_identiques = 0 AND statut_source_id <> statuts_egaux_id AND statut_intervenant_id <> statuts_egaux_id AND types_identiques = 1 THEN 'insert'

        ELSE 'drop'
      END

      -- Quand il y a une seule source et plusieurs intervenants de statuts différents et que l'un d'entre eux est un vacataire ayant saisi des données perso, alors on update
        -- Si le statut matche UPDATE
        -- sinon ??

      -- Cas 11 : Pour le reste
      ELSE CASE

        -- Cas typique du vacataire qui a renseigné des données personnelles
        WHEN intervenant_local = 0 AND types_identiques = 1 AND statut_source_autre = 1 AND statut_intervenant_autre = 0 AND sync_statut = 0 THEN 'update'

      -- créer une source locale synchronisable
      -- modifier UnicaenImport pour gérer les changements de sources
        ELSE 'drop'
      END

      ELSE NULL
    END action
  FROM (
    SELECT
@@ -178,6 +177,7 @@ FROM (
      a.id                                                                                   annee_id,
      current_annee.id                                                                       current_annee_id,
      s.code                                                                                 code,
      s.code_rh                                                                              code_rh,
      s.utilisateur_code                                                                     utilisateur_code,
      CASE WHEN i.sync_structure = 0 THEN i.structure_id ELSE str.id END                     structure_id,
      i.structure_id                                                                         intervenant_structure_id,
@@ -185,7 +185,7 @@ FROM (
      i.statut_id                                                                            statut_intervenant_id,
      g.id                                                                                   grade_id,
      i.grade_id                                                                             intervenant_grade_id,
      COALESCE( d.id, d99.id )                                                               discipline_id,
      d.id                                                                                   discipline_id,
      c.id                                                                                   civilite_id,
      s.nom_usuel                                                                            nom_usuel,
      s.prenom                                                                               prenom,
@@ -219,79 +219,39 @@ FROM (
      s.autre_4                                                                              autre_4,
      s.autre_5                                                                              autre_5,
      empl.id                                                                                employeur_id,
      ssrc.id                                                                                source_id,
      isrc.id                                                                                i_source_id,
      ssrc.id                                                                                s_source_id,
      s.code                                                                                 source_code,
      s.validite_debut                                                                       validite_debut,
      s.validite_fin                                                                         validite_fin,
      i.validite_debut                                                                       i_validite_debut,
      s.validite_debut                                                                       s_validite_debut,
      i.validite_fin                                                                         i_validite_fin,
      s.validite_fin                                                                         s_validite_fin,

      -- Variables calculées
      CASE WHEN ssi.id = sautre.id  THEN 1 ELSE 0 END                                        statut_source_autre,
      CASE WHEN i.statut_id = sautre.id  THEN 1 ELSE 0 END                                   statut_intervenant_autre,
      CASE WHEN ssi.code = 'AUTRES' THEN 1 ELSE 0 END                                        statut_source_autre,
      CASE WHEN isi.code = 'AUTRES' THEN 1 ELSE 0 END                                        statut_intervenant_autre,
      CASE WHEN ssi.id = isi.id THEN 1 ELSE 0 END                                            statuts_identiques,
      CASE WHEN ssi.type_intervenant_id = isi.type_intervenant_id THEN 1 ELSE 0 END          types_identiques,
      COALESCE(i.sync_statut,1)                                                              sync_statut,
      CASE WHEN COALESCE(isrc.importable,1) = 1 THEN 0 ELSE 1 END                            intervenant_local,
      CASE WHEN idata.tbls IS NULL THEN 0 ELSE 1 END                                         intervenant_donnees,
      /*CASE WHEN (
        SELECT count(*) FROM intervenant rsi
        WHERE rsi.histo_destruction IS NULL
          AND rsi.id <> i.id
          AND rsi.code = i.code AND rsi.annee_id = i.annee_id AND rsi.statut_id = ssi.id
      ) > 0 THEN 1 ELSE 0 END                                                                  statut_deja_utilise,*/
      CASE WHEN idata.intervenant_id IS NULL THEN 0 ELSE 1 END                               intervenant_donnees,
      CASE WHEN i.histo_destruction IS NULL THEN 0 ELSE 1 END                                intervenant_histo,
      COUNT(DISTINCT ssi.id) OVER (PARTITION BY s.code, a.id)                                nb_sources,
      COUNT(DISTINCT i.id) OVER (PARTITION BY i.code, i.annee_id)                            nb_intervenants,
      SUM(CASE WHEN ssi.id = i.statut_id THEN 1 ELSE 0 END) OVER (PARTITION BY s.code, a.id) nb_statuts_egaux
      SUM(CASE WHEN ssi.id = i.statut_id THEN 1 ELSE 0 END) OVER (PARTITION BY s.code, a.id) nb_statuts_egaux,
      MAX(CASE WHEN ssi.id = i.statut_id THEN ssi.id ELSE 0 END) OVER (PARTITION BY s.code, a.id) statuts_egaux_id
    FROM
                mv_intervenant          s
      JOIN statut_intervenant sautre ON sautre.code = 'AUTRES'
      JOIN statut_intervenant ssi ON ssi.code = s.z_statut_id
           JOIN (SELECT unicaen_import.get_current_annee id FROM dual) current_annee ON 1=1
           JOIN annee                   a ON a.id >= current_annee.id - 1 AND a.active = 1 AND COALESCE(s.validite_debut,a.date_fin-1) < a.date_fin AND COALESCE(s.validite_fin,a.date_debut+1) > a.date_debut
           JOIN statut_intervenant    ssi ON ssi.code           = s.z_statut_id
           JOIN source               ssrc ON ssrc.code          = s.z_source_id

      LEFT JOIN intervenant i ON i.histo_destruction IS NULL AND i.code = s.code AND i.annee_id = a.id
      LEFT JOIN statut_intervenant isi ON isi.id = i.statut_id
      LEFT JOIN intervenant             i ON i.code             = s.code AND i.annee_id = a.id
      LEFT JOIN source               isrc ON isrc.id            = i.source_id
      LEFT JOIN (
        SELECT intervenant_id, listagg(cc.t, ', ') within group( order by cc.t) tbls
        FROM (      select count(*) || ' AGREMENT'                t, intervenant_id from AGREMENT where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' CONTRAT'                 t, intervenant_id from CONTRAT where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' INTERVENANT_DOSSIER'     t, intervenant_id from INTERVENANT_DOSSIER where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' MODIFICATION_SERVICE_DU' t, intervenant_id from MODIFICATION_SERVICE_DU where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' PIECE_JOINTE'            t, intervenant_id from PIECE_JOINTE where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' SERVICE'                 t, intervenant_id from SERVICE where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' SERVICE_REFERENTIEL'     t, intervenant_id from SERVICE_REFERENTIEL where histo_destruction is null GROUP BY intervenant_id
          union all select count(*) || ' VALIDATION'              t, intervenant_id from VALIDATION where histo_destruction is null GROUP BY intervenant_id
        ) cc
        GROUP BY intervenant_id
      ) idata ON idata.intervenant_id = i.id
      LEFT JOIN statut_intervenant    isi ON isi.id             = i.statut_id
      LEFT JOIN structure             str ON str.source_code    = s.z_structure_id
      LEFT JOIN grade                   g ON g.source_code      = s.z_grade_id
      LEFT JOIN discipline              d ON
        d.histo_destruction IS NULL
        AND 1 = CASE WHEN -- si rien n'a été défini
          COALESCE( s.z_discipline_id_cnu, s.z_discipline_id_sous_cnu, s.z_discipline_id_spe_cnu, s.z_discipline_id_dis2deg ) IS NULL
          AND d.source_code = '00'

        THEN 1 WHEN -- si une CNU ou une spécialité a été définie...

          COALESCE( s.z_discipline_id_cnu, s.z_discipline_id_sous_cnu, s.z_discipline_id_spe_cnu ) IS NOT NULL

        THEN CASE WHEN -- alors on teste par les sections CNU et spécialités

          (
               ',' || d.CODES_CORRESP_2 || ',' LIKE '%,' || s.z_discipline_id_cnu || NVL(s.z_discipline_id_sous_cnu,'') || ',%'
            OR ',' || d.CODES_CORRESP_2 || ',' LIKE '%,' || s.z_discipline_id_cnu || NVL(s.z_discipline_id_sous_cnu,'00') || ',%'
          )
          AND ',' || NVL(d.CODES_CORRESP_3,'000') || ',' LIKE  '%,' || NVL(CASE WHEN d.CODES_CORRESP_3 IS NOT NULL THEN z_discipline_id_spe_cnu ELSE NULL END,'000') || ',%'

        THEN 1 ELSE 0 END ELSE CASE WHEN -- sinon on teste par les disciplines du 2nd degré

          s.z_discipline_id_dis2deg IS NOT NULL
          AND ',' || NVL(d.CODES_CORRESP_4,'') || ',' LIKE  '%,' || s.z_discipline_id_dis2deg || ',%'

        THEN 1 ELSE 0 END END -- fin du test
      LEFT JOIN discipline            d99 ON d99.source_code = '99'
      LEFT JOIN discipline              d ON d.source_code      = s.z_discipline_id
      LEFT JOIN civilite                c ON c.libelle_court    = s.z_civilite_id
      LEFT JOIN pays               pnaiss ON pnaiss.source_code = s.z_pays_naissance_id
      LEFT JOIN departement           dep ON dep.source_code    = s.z_departement_naissance_id
@@ -300,8 +260,19 @@ FROM (
      LEFT JOIN voirie                  v ON v.source_code      = s.z_adresse_voirie_id
      LEFT JOIN pays                 padr ON padr.source_code   = s.z_adresse_pays_id
      LEFT JOIN employeur            empl ON empl.source_code   = s.z_employeur_id
      LEFT JOIN (
        SELECT DISTINCT intervenant_id
        FROM (      select intervenant_id from AGREMENT where histo_destruction is null
          union all select intervenant_id from CONTRAT where histo_destruction is null
          union all select intervenant_id from INTERVENANT_DOSSIER where histo_destruction is null
          union all select intervenant_id from MODIFICATION_SERVICE_DU where histo_destruction is null
          union all select intervenant_id from PIECE_JOINTE where histo_destruction is null
          union all select intervenant_id from SERVICE where histo_destruction is null
          union all select intervenant_id from SERVICE_REFERENTIEL where histo_destruction is null
          union all select intervenant_id from VALIDATION where histo_destruction is null
        ) cc
      ) idata ON idata.intervenant_id = i.id
  ) t
) t
WHERE
  action <> 'drop'
;
 No newline at end of file
  action <> 'drop';
 No newline at end of file
+26 −4

File changed.

Preview size limit exceeded, changes collapsed.