Skip to content
Snippets Groups Projects
Select Git revision
  • 02c1eb86ebf8f37c49e98273a7fa9f4eec848dc7
  • master default protected
  • b24
  • ll-workflow
  • alc-scindage-donnees-pj
  • FJ_LL_Tbl_Contrat
  • alc-docker-node
  • ll-apiplatform
  • php84
  • ll-rgpd
  • b23
  • alc-filtre-type-intervenant
  • ll-sans-mdb5
  • formules-ancienne-infra
  • ll-formules
  • alc-intervenant-dmep
  • ll-suppr-v_vol-s
  • b20
  • ll-postgresql
  • b23.0.1
  • b22
  • 24.8
  • 24.7
  • 24.6
  • 24.5
  • 24.4
  • 24.3
  • 24.2
  • 24.1
  • 24.0
  • 23.15
  • 24.0-beta19
  • 24.0-beta18
  • 24.0-beta17
  • 24.0-beta16
  • 24.0-beta15
  • 24.0-beta14
  • 24.0-beta13
  • 23.14
  • 24.0-beta12
  • 24.0-beta11
41 results

07.0.sql

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    07.0.sql 160.87 KiB
    -- Script de migration de la version 6.3.2 à la 7.0
    
    -- Import ouvert pour les services
    ALTER TABLE service ADD (source_id   NUMBER(*,0) );
    ALTER TABLE service ADD (source_code VARCHAR2(100 CHAR));
    
    ALTER TRIGGER SERVICE_CK DISABLE;
    ALTER TRIGGER INTERVENANT_HORO_SERVICE DISABLE;
    ALTER TRIGGER INTERVENANT_HORO_VH DISABLE;
    ALTER TRIGGER SERVICE_HISTO_CK DISABLE;
    ALTER TRIGGER SERVICE_HISTO_CK_S DISABLE;
    ALTER TRIGGER VOLUME_HORAIRE_CK DISABLE;
    
    
    
    UPDATE service SET source_id = (SELECT id FROM source WHERE code = 'OSE');
    UPDATE service SET source_code = id;
    
    ALTER TABLE service MODIFY ( source_id NOT NULL );
    ALTER TABLE service MODIFY ( source_code NOT NULL );
    ALTER TABLE service ADD CONSTRAINT service_source_fk FOREIGN KEY ( source_id ) REFERENCES source ( id ) NOT DEFERRABLE;
    ALTER TABLE service ADD CONSTRAINT service_source_un UNIQUE ( source_code,histo_destruction );
    
    -- Import possible pour les volumes horaires
    ALTER TABLE volume_horaire ADD (source_id   NUMBER(*,0) );
    ALTER TABLE volume_horaire ADD (source_code VARCHAR2(100 CHAR));
    UPDATE volume_horaire SET source_id = (SELECT id FROM source WHERE code = 'OSE'), source_code = id;
    
    ALTER TRIGGER SERVICE_CK ENABLE;
    ALTER TRIGGER INTERVENANT_HORO_SERVICE ENABLE;
    ALTER TRIGGER INTERVENANT_HORO_VH ENABLE;
    ALTER TRIGGER SERVICE_HISTO_CK ENABLE;
    ALTER TRIGGER SERVICE_HISTO_CK_S ENABLE;
    ALTER TRIGGER VOLUME_HORAIRE_CK ENABLE;
    
    ALTER TABLE volume_horaire MODIFY ( source_id NOT NULL );
    ALTER TABLE volume_horaire MODIFY ( source_code NOT NULL );
    ALTER TABLE volume_horaire ADD CONSTRAINT volume_horaire_source_fk FOREIGN KEY ( source_id ) REFERENCES source ( id ) NOT DEFERRABLE;
    ALTER TABLE volume_horaire ADD CONSTRAINT volume_horaire_source_un UNIQUE ( source_code,histo_destruction );
    
    -- Import ouvert pour les services référentiels
    ALTER TABLE service_referentiel ADD (source_id   NUMBER(*,0) );
    ALTER TABLE service_referentiel ADD (source_code VARCHAR2(100 CHAR));
    
    UPDATE service_referentiel SET source_id = (SELECT id FROM source WHERE code = 'OSE');
    UPDATE service_referentiel SET source_code = id;
    
    ALTER TABLE service_referentiel MODIFY ( source_id NOT NULL );
    ALTER TABLE service_referentiel MODIFY ( source_code NOT NULL );
    ALTER TABLE service_referentiel ADD CONSTRAINT service_referentiel_source_fk FOREIGN KEY ( source_id ) REFERENCES source ( id ) NOT DEFERRABLE;
    ALTER TABLE service_referentiel ADD CONSTRAINT service_referentiel_source_un UNIQUE ( source_code,histo_destruction );
    
    -- Import possible pour les volumes horaires référentiels
    ALTER TABLE volume_horaire_ref ADD (source_id   NUMBER(*,0) );
    ALTER TABLE volume_horaire_ref ADD (source_code VARCHAR2(100 CHAR));
    
    ALTER TRIGGER VOLUME_HORAIRE_REF_CK DISABLE;
    UPDATE volume_horaire_ref SET source_id = (SELECT id FROM source WHERE code = 'OSE');
    UPDATE volume_horaire_ref SET source_code = id;
    ALTER TRIGGER VOLUME_HORAIRE_REF_CK ENABLE;
    
    ALTER TABLE volume_horaire_ref MODIFY ( source_id NOT NULL );
    ALTER TABLE volume_horaire_ref MODIFY ( source_code NOT NULL );
    ALTER TABLE volume_horaire_ref ADD CONSTRAINT volume_horaire_ref_source_fk FOREIGN KEY ( source_id ) REFERENCES source ( id ) NOT DEFERRABLE;
    ALTER TABLE volume_horaire_ref ADD CONSTRAINT volume_horaire_ref_source_un UNIQUE ( source_code,histo_destruction );
    
    
    ALTER TABLE volume_horaire ADD (
      auto_validation   NUMBER(1) DEFAULT 0 NOT NULL
      );
    
    ALTER TABLE volume_horaire_ref ADD (
      auto_validation   NUMBER(1) DEFAULT 0 NOT NULL
      );
    
    ALTER TABLE tbl_validation_enseignement ADD (
      auto_validation   NUMBER(1) DEFAULT 0 NOT NULL
      );
    
    ALTER TABLE tbl_validation_referentiel ADD (
      auto_validation   NUMBER(1) DEFAULT 0 NOT NULL
      );
    
    ALTER TABLE volume_horaire ADD (
      horaire_debut   DATE
      );
    
    ALTER TABLE volume_horaire ADD (
      horaire_fin   DATE
      );
    
    ALTER TABLE volume_horaire_ref ADD (
      horaire_debut   DATE
      );
    
    ALTER TABLE volume_horaire_ref ADD (
      horaire_fin   DATE
      );
    
    
    ALTER TABLE type_formation ADD (
      service_statutaire   NUMBER(1) DEFAULT 1 NOT NULL
      );
    
    ALTER TABLE fonction_referentiel ADD (
      service_statutaire   NUMBER(1) DEFAULT 1 NOT NULL
      );
    
    
    INSERT INTO parametre (
      id,
      nom,
      valeur,
      description,
      histo_creation,
      histo_createur_id,
      histo_modification,
      histo_modificateur_id
    ) VALUES (
      parametre_id_seq.nextval,
      'modalite_services_prev_ens',
      'semestriel',
      'Modalité de gestion des services (prévisionnel, enseignements)',
      sysdate,
      (select id from utilisateur where username='oseappli'),
      sysdate,
      (select id from utilisateur where username='oseappli')
    );
    
    INSERT INTO parametre (
      id,
      nom,
      valeur,
      description,
      histo_creation,
      histo_createur_id,
      histo_modification,
      histo_modificateur_id
    ) VALUES (
      parametre_id_seq.nextval,
      'modalite_services_real_ref',
      'semestriel',
      'Modalité de gestion des services (réalisé, référentiel)',
      sysdate,
      (select id from utilisateur where username='oseappli'),
      sysdate,
      (select id from utilisateur where username='oseappli')
    );
    
    INSERT INTO parametre (
      id,
      nom,
      valeur,
      description,
      histo_creation,
      histo_createur_id,
      histo_modification,
      histo_modificateur_id
    ) VALUES (
      parametre_id_seq.nextval,
      'modalite_services_prev_ref',
      'semestriel',
      'Modalité de gestion des services (prévisionnel, référentiel)',
      sysdate,
      (select id from utilisateur where username='oseappli'),
      sysdate,
      (select id from utilisateur where username='oseappli')
    );
    
    INSERT INTO parametre (
      id,
      nom,
      valeur,
      description,
      histo_creation,
      histo_createur_id,
      histo_modification,
      histo_modificateur_id
    ) VALUES (
      parametre_id_seq.nextval,
      'modalite_services_real_ens',
      'semestriel',
      'Modalité de gestion des services (réalisé, enseignements)',
      sysdate,
      (select id from utilisateur where username='oseappli'),
      sysdate,
      (select id from utilisateur where username='oseappli')
    );
    
    INSERT INTO parametre (
      id,
      nom,
      valeur,
      description,
      histo_creation,
      histo_createur_id,
      histo_modification,
      histo_modificateur_id
    ) VALUES (
      parametre_id_seq.nextval,
      'pays_france',
      null,
      'Pays "France"',
      sysdate,
      (select id from utilisateur where username='oseappli'),
      sysdate,
      (select id from utilisateur where username='oseappli')
    );
    
    INSERT INTO parametre (
        id,
        nom,
        valeur,
        description,
        histo_creation,
        histo_createur_id,
        histo_modification,
        histo_modificateur_id
        ) VALUES (
                     parametre_id_seq.nextval,
                     'doc-intervenant-vacataires',
                     '',
                     'URL de la documentation OSE pour les vacataires',
                     sysdate,
                     (select id from utilisateur where username='oseappli'),
                     sysdate,
                     (select id from utilisateur where username='oseappli')
                     );
    
    INSERT INTO parametre (
        id,
        nom,
        valeur,
        description,
        histo_creation,
        histo_createur_id,
        histo_modification,
        histo_modificateur_id
        ) VALUES (
                     parametre_id_seq.nextval,
                     'doc-intervenant-permanents',
                     '',
                     'URL de la documentation OSE pour les permanents',
                     sysdate,
                     (select id from utilisateur where username='oseappli'),
                     sysdate,
                     (select id from utilisateur where username='oseappli')
                     );
    
    INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE)
    SELECT
      privilege_id_seq.nextval id,
      (SELECT id FROM CATEGORIE_PRIVILEGE WHERE code = t1.c ) CATEGORIE_ID,
      t1.p CODE,
      t1.l LIBELLE,
      (SELECT count(*) FROM PRIVILEGE WHERE categorie_id = (SELECT id FROM CATEGORIE_PRIVILEGE WHERE code = t1.c )) + rownum ORDRE
    FROM (
           SELECT 'enseignement' c, 'import-intervenant-previsionnel-agenda' p, 'Import service prévisionnel depuis agenda' l FROM dual
           UNION ALL SELECT 'enseignement' c, 'import-intervenant-realise-agenda' p, 'Import service réalisé depuis agenda' l FROM dual
         ) t1;
    
    
    ALTER TABLE type_intervention ADD (
      visible_exterieur   NUMBER(1) DEFAULT 1 NOT NULL
      );
    UPDATE type_intervention SET visible_exterieur = 0 WHERE code NOT IN ('CM','TD','TP','Stage','Projet','Mémoire');
    
    update tbl set ordre =  1 where tbl_name = 'formule';
    update tbl set ordre =  2 where tbl_name = 'piece_jointe_demande';
    update tbl set ordre =  3 where tbl_name = 'piece_jointe_fournie';
    update tbl set ordre =  4 where tbl_name = 'agrement';
    update tbl set ordre =  5 where tbl_name = 'cloture_realise';
    update tbl set ordre =  6 where tbl_name = 'contrat';
    update tbl set ordre =  7 where tbl_name = 'dossier';
    update tbl set ordre =  8 where tbl_name = 'paiement';
    update tbl set ordre =  9 where tbl_name = 'piece_jointe';
    update tbl set ordre = 10 where tbl_name = 'service_saisie';
    update tbl set ordre = 11 where tbl_name = 'service_referentiel';
    update tbl set ordre = 12 where tbl_name = 'validation_enseignement';
    update tbl set ordre = 13 where tbl_name = 'validation_referentiel';
    update tbl set ordre = 14 where tbl_name = 'service';
    update tbl set ordre = 15 where tbl_name = 'workflow';
    update tbl set ordre = 16 where tbl_name = 'chargens_seuils_def';
    update tbl set ordre = 17 where tbl_name = 'chargens';
    
    
    
    
    
    CREATE TABLE modele_contrat (
      id                      NUMBER(*,0) NOT NULL,
      libelle                 VARCHAR2(250 CHAR) NOT NULL,
      statut_intervenant_id   NUMBER(*,0),
      structure_id            NUMBER(*,0),
      fichier                 BLOB,
      requete                 VARCHAR2(4000 CHAR),
      bloc1_nom               VARCHAR2(50 CHAR),
      bloc1_zone              VARCHAR2(80 CHAR),
      bloc1_requete           VARCHAR2(4000 CHAR),
      bloc2_nom               VARCHAR2(50 CHAR),
      bloc2_zone              VARCHAR2(80 CHAR),
      bloc2_requete           VARCHAR2(4000 CHAR),
      bloc3_nom               VARCHAR2(50 CHAR),
      bloc3_zone              VARCHAR2(80 CHAR),
      bloc3_requete           VARCHAR2(4000 CHAR),
      bloc4_nom               VARCHAR2(50 CHAR),
      bloc4_zone              VARCHAR2(80 CHAR),
      bloc4_requete           VARCHAR2(4000 CHAR),
      bloc5_nom               VARCHAR2(50 CHAR),
      bloc5_zone              VARCHAR2(80 CHAR),
      bloc5_requete           VARCHAR2(4000 CHAR),
      bloc6_nom               VARCHAR2(50 CHAR),
      bloc6_zone              VARCHAR2(80 CHAR),
      bloc6_requete           VARCHAR2(4000 CHAR),
      bloc7_nom               VARCHAR2(50 CHAR),
      bloc7_zone              VARCHAR2(80 CHAR),
      bloc7_requete           VARCHAR2(4000 CHAR),
      bloc8_nom               VARCHAR2(50 CHAR),
      bloc8_zone              VARCHAR2(80 CHAR),
      bloc8_requete           VARCHAR2(4000 CHAR),
      bloc9_nom               VARCHAR2(50 CHAR),
      bloc9_zone              VARCHAR2(80 CHAR),
      bloc9_requete           VARCHAR2(4000 CHAR),
      bloc10_nom              VARCHAR2(50 CHAR),
      bloc10_zone             VARCHAR2(80 CHAR),
      bloc10_requete          VARCHAR2(4000 CHAR)
    )
    LOGGING;
    
    CREATE SEQUENCE MODELE_CONTRAT_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE;
    
    ALTER TABLE modele_contrat ADD CONSTRAINT modele_contrat_pk PRIMARY KEY ( id );
    ALTER TABLE modele_contrat
      ADD CONSTRAINT mct_structure_fk FOREIGN KEY ( structure_id )
    REFERENCES structure ( id )
      NOT DEFERRABLE;
    ALTER TABLE modele_contrat
      ADD CONSTRAINT mct_statut_intervenant_fk FOREIGN KEY ( statut_intervenant_id )
    REFERENCES statut_intervenant ( id )
      NOT DEFERRABLE;
    
    
    INSERT INTO modele_contrat (
        id,
        libelle
        ) VALUES (
                     modele_contrat_id_seq.nextval,
                     'Modèle par défaut'
                     );
    
    INSERT INTO PRIVILEGE (ID, CATEGORIE_ID, CODE, LIBELLE, ORDRE)
    SELECT
           privilege_id_seq.nextval id,
           (SELECT id FROM CATEGORIE_PRIVILEGE WHERE code = t1.c ) CATEGORIE_ID,
           t1.p CODE,
           t1.l LIBELLE,
           (SELECT count(*) FROM PRIVILEGE WHERE categorie_id = (SELECT id FROM CATEGORIE_PRIVILEGE WHERE code = t1.c )) + rownum ORDRE
    FROM (
    
         SELECT 'contrat' c, 'modeles-visualisation' p, 'Visualisation des modèles' l FROM dual
         UNION ALL SELECT 'contrat' c, 'modeles-edition' p, 'Édition des modèles' l FROM dual
         UNION ALL SELECT 'contrat' c, 'projet-generation' p, 'Génération de projet de contrat' l FROM dual
         UNION ALL SELECT 'contrat' c, 'contrat-generation' p, 'Génération de contrat' l FROM dual
         ) t1;
    
    CREATE OR REPLACE VIEW V_CONTRAT_SERVICES AS
      SELECT
             c.id                                             contrat_id,
             str.libelle_court                                "serviceComposante",
             ep.code                                          "serviceCode",
             ep.libelle                                       "serviceLibelle",
             sum(vh.heures)                                   heures,
             replace(ltrim(to_char(sum(vh.heures), '999999.00')),'.',',') "serviceHeures"
      FROM
           contrat               c
             JOIN intervenant           i ON i.id = c.intervenant_id
             JOIN type_volume_horaire tvh ON tvh.code = 'PREVU'
             JOIN service               s ON s.intervenant_id = i.id AND s.histo_destruction IS NULL
             JOIN volume_horaire       vh ON vh.service_id = s.id AND vh.histo_destruction IS NULL AND vh.type_volume_horaire_id = tvh.id
             JOIN validation_vol_horaire vvh ON vvh.volume_horaire_id = vh.id
             JOIN validation            v ON v.id = vvh.validation_id AND v.histo_destruction IS NULL
             LEFT JOIN validation           cv ON cv.id = c.validation_id AND cv.histo_destruction IS NULL
             LEFT JOIN element_pedagogique  ep ON ep.id = s.element_pedagogique_id
             JOIN structure           str ON str.id = COALESCE(ep.structure_id,i.structure_id)
      WHERE
          c.histo_destruction IS NULL
        AND (cv.id IS NULL OR vh.contrat_id = c.id)
      GROUP BY
               c.id, str.libelle_court, ep.code, ep.libelle
    ;
    
    CREATE OR REPLACE VIEW V_CONTRAT_MAIN AS
      WITH hs AS (
          SELECT contrat_id, sum(heures) "serviceTotal" FROM V_CONTRAT_SERVICES GROUP BY contrat_id
      )
      SELECT
             ct.id contrat_id,
             ct."annee",
             ct."nom",
             ct."prenom",
             ct."civilite",
             ct."e",
             ct."dateNaissance",
             ct."adresse",
             ct."numInsee",
             ct."statut",
             ct."totalHETD",
             ct."tauxHoraireValeur",
             ct."tauxHoraireDate",
             ct."dateSignature",
             CASE WHEN ct.est_contrat=1 THEN 1 ELSE null END "contrat1",
             CASE WHEN ct.est_contrat=1 THEN null ELSE 1 END "avenant1",
             CASE WHEN ct.est_contrat=1 THEN '3' ELSE '2' END "n",
             to_char(SYSDATE, 'dd/mm/YYYY - hh24:mi:ss') "horodatage",
             'Exemplaire à conserver' "exemplaire1",
             'Exemplaire à retourner' || ct."exemplaire2" "exemplaire2",
             ct."serviceTotal",
    
             CASE ct.est_contrat
               WHEN 1 THEN -- contrat
                 'Contrat de travail '
               ELSE
                 'Avenant au contrat de travail initial modifiant le volume horaire initial'
                   || ' de recrutement en qualité '
                 END                                         "titre",
             CASE WHEN ct.est_atv = 1 THEN
                 'd''agent temporaire vacataire'
                  ELSE
                 'de chargé' || ct."e" || ' d''enseignement vacataire'
                 END                                         "qualite",
    
             CASE
               WHEN ct.est_projet = 1 AND ct.est_contrat = 1 THEN 'Projet de contrat'
               WHEN ct.est_projet = 0 AND ct.est_contrat = 1 THEN 'Contrat n°' || ct.id
               WHEN ct.est_projet = 1 AND ct.est_contrat = 0 THEN 'Projet d''avenant'
               WHEN ct.est_projet = 0 AND ct.est_contrat = 0 THEN 'Avenant n°' || ct.contrat_id || '.' || ct.numero_avenant
                 END                                         "titreCourt"
      FROM
           (
           SELECT
                  c.*,
                  a.libelle                                                                                     "annee",
                  COALESCE(d.nom_usuel,i.nom_usuel)                                                             "nom",
                  COALESCE(d.prenom,i.prenom)                                                                   "prenom",
                  civ.libelle_court                                                                             "civilite",
                  CASE WHEN civ.sexe = 'F' THEN 'e' ELSE '' END                                                 "e",
                  to_char(COALESCE(d.date_naissance,i.date_naissance), 'dd/mm/YYYY')                            "dateNaissance",
                  COALESCE(d.adresse,ose_divers.formatted_adresse(
                                       ai.NO_VOIE, ai.NOM_VOIE, ai.BATIMENT, ai.MENTION_COMPLEMENTAIRE, ai.LOCALITE,
                                       ai.CODE_POSTAL, ai.VILLE, ai.PAYS_LIBELLE))                                               "adresse",
                  COALESCE(d.numero_insee,i.numero_insee || ' ' || COALESCE(LPAD(i.numero_insee_cle,2,'0'),'')) "numInsee",
                  si.libelle                                                                                    "statut",
                  replace(ltrim(to_char(COALESCE(fr.total,0), '999999.00')),'.',',')                                        "totalHETD",
                  replace(ltrim(to_char(COALESCE(th.valeur,0), '999999.00')),'.',',')                                       "tauxHoraireValeur",
                  COALESCE(to_char(th.histo_creation, 'dd/mm/YYYY'), 'TAUX INTROUVABLE')                        "tauxHoraireDate",
                  to_char(COALESCE(v.histo_creation, c.histo_creation), 'dd/mm/YYYY')                           "dateSignature",
                  CASE WHEN s.aff_adresse_contrat = 1 THEN
                      ' signé à l''adresse suivante :' || CHR(13) || CHR(10) ||
                      s.libelle_court || ' - ' || REPLACE(ose_divers.formatted_adresse(
                                                            astr.NO_VOIE, astr.NOM_VOIE, null, null, astr.LOCALITE,
                                                            astr.CODE_POSTAL, astr.VILLE, null), CHR(13), ' - ')
                       ELSE '' END                                                                                   "exemplaire2",
                  replace(ltrim(to_char(COALESCE(hs."serviceTotal",0), '999999.00')),'.',',')                               "serviceTotal",
                  CASE WHEN c.contrat_id IS NULL THEN 1 ELSE 0 END                                              est_contrat,
                  CASE WHEN v.id IS NULL THEN 1 ELSE 0 END                                                      est_projet,
                  si.tem_atv                                                                                    est_atv
    
           FROM
                contrat               c
                  JOIN type_contrat         tc ON tc.id = c.type_contrat_id
                  JOIN intervenant           i ON i.id = c.intervenant_id
                  JOIN annee                 a ON a.id = i.annee_id
                  JOIN statut_intervenant   si ON si.id = i.statut_id
                  JOIN structure             s ON s.id = c.structure_id
                  LEFT JOIN adresse_structure  astr ON astr.structure_id = s.id AND astr.principale = 1 AND astr.histo_destruction IS NULL
                  LEFT JOIN dossier               d ON d.intervenant_id = i.id AND d.histo_destruction IS NULL
                  JOIN civilite            civ ON civ.id = COALESCE(d.civilite_id,i.civilite_id)
                  LEFT JOIN validation            v ON v.id = c.validation_id AND v.histo_destruction IS NULL
                  LEFT JOIN adresse_intervenant  ai ON ai.intervenant_id = i.id AND ai.histo_destruction IS NULL
    
                  JOIN type_volume_horaire tvh ON tvh.code = 'PREVU'
                  JOIN etat_volume_horaire evh ON evh.code = 'valide'
                  LEFT JOIN formule_resultat     fr ON fr.intervenant_id = i.id AND fr.type_volume_horaire_id = tvh.id AND fr.etat_volume_horaire_id = evh.id
                  LEFT JOIN taux_horaire_hetd    th ON c.histo_creation BETWEEN th.histo_creation AND COALESCE(th.histo_destruction,SYSDATE)
                  LEFT JOIN                      hs ON hs.contrat_id = c.id
           WHERE
               c.histo_destruction IS NULL
           ) ct
    ;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_FORMULE_SERVICE
    ( "ID", "INTERVENANT_ID", "TAUX_FI", "TAUX_FA", "TAUX_FC", "STRUCTURE_AFF_ID", "STRUCTURE_ENS_ID", "PONDERATION_SERVICE_DU", "PONDERATION_SERVICE_COMPL", "SERVICE_STATUTAIRE"
    )  AS
      SELECT
             s.id                                                    id,
             s.intervenant_id                                        intervenant_id,
             CASE WHEN ep.id IS NOT NULL THEN ep.taux_fi ELSE 1 END  taux_fi,
             CASE WHEN ep.id IS NOT NULL THEN ep.taux_fa ELSE 0 END  taux_fa,
             CASE WHEN ep.id IS NOT NULL THEN ep.taux_fc ELSE 0 END  taux_fc,
             i.structure_id                                          structure_aff_id,
             ep.structure_id                                         structure_ens_id,
             NVL( EXP (SUM (LN (m.ponderation_service_du))), 1)      ponderation_service_du,
             NVL( EXP (SUM (LN (m.ponderation_service_compl))), 1)   ponderation_service_compl,
             COALESCE(tf.service_statutaire,1)                       service_statutaire
      FROM
           service              s
             JOIN intervenant          i ON i.id = s.intervenant_id
             LEFT JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id
             LEFT JOIN etape                e ON e.id = ep.etape_id
             LEFT JOIN type_formation      tf ON tf.id = e.type_formation_id
             LEFT JOIN element_modulateur  em ON em.element_id = s.element_pedagogique_id
                                                   AND em.histo_destruction IS NULL
             LEFT JOIN modulateur           m ON m.id = em.modulateur_id
      WHERE
          s.histo_destruction IS NULL
      GROUP BY
               s.id,
               s.intervenant_id,
               ep.id,
               ep.taux_fi, ep.taux_fa, ep.taux_fc,
               i.structure_id, ep.structure_id,
               tf.service_statutaire;
    
    CREATE OR REPLACE FORCE VIEW V_FORMULE_SERVICE_REF
    ( "ID", "INTERVENANT_ID", "STRUCTURE_ID", "SERVICE_STATUTAIRE"
    )  AS
      SELECT
             sr.id                             id,
             sr.intervenant_id                 intervenant_id,
             sr.structure_id                   structure_id,
             COALESCE(fr.service_statutaire,1) service_statutaire
      FROM
           service_referentiel  sr
             JOIN intervenant           i ON i.id = sr.intervenant_id
             JOIN fonction_referentiel fr ON fr.id = sr.fonction_id
      WHERE
          sr.histo_destruction IS NULL
        AND i.id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, i.id );
    
    
    CREATE OR REPLACE FORCE VIEW V_TBL_SERVICE
    ( "ANNEE_ID", "INTERVENANT_ID", "INTERVENANT_STRUCTURE_ID", "STRUCTURE_ID", "TYPE_INTERVENANT_ID", "TYPE_INTERVENANT_CODE", "PEUT_SAISIR_SERVICE", "ELEMENT_PEDAGOGIQUE_ID", "SERVICE_ID", "ELEMENT_PEDAGOGIQUE_PERIODE_ID", "ETAPE_ID", "TYPE_VOLUME_HORAIRE_ID", "TYPE_VOLUME_HORAIRE_CODE", "ELEMENT_PEDAGOGIQUE_HISTO", "ETAPE_HISTO", "HAS_HEURES_MAUVAISE_PERIODE", "NBVH", "HEURES", "VALIDE"
    )  AS
      WITH t AS (
          SELECT
                 s.id                                                                                      service_id,
                 s.intervenant_id                                                                          intervenant_id,
                 ep.structure_id                                                                           structure_id,
                 ep.id                                                                                     element_pedagogique_id,
                 ep.periode_id                                                                             element_pedagogique_periode_id,
                 etp.id                                                                                    etape_id,
    
                 vh.type_volume_horaire_id                                                                 type_volume_horaire_id,
                 vh.heures                                                                                 heures,
                 tvh.code                                                                                  type_volume_horaire_code,
    
                 CASE WHEN ep.histo_destruction IS NULL THEN 1 ELSE 0 END                                  element_pedagogique_histo,
                 CASE WHEN etp.histo_destruction IS NULL OR cp.id IS NOT NULL THEN 1 ELSE 0 END            etape_histo,
    
                 CASE WHEN ep.periode_id IS NOT NULL THEN
                     SUM( CASE WHEN vh.periode_id <> ep.periode_id THEN 1 ELSE 0 END ) OVER( PARTITION BY vh.service_id, vh.periode_id, vh.type_volume_horaire_id, vh.type_intervention_id )
                      ELSE 0 END has_heures_mauvaise_periode,
    
                 CASE WHEN v.id IS NULL AND vh.auto_validation=0 THEN 0 ELSE 1 END valide
          FROM
               service                                       s
                 LEFT JOIN element_pedagogique                ep ON ep.id = s.element_pedagogique_id
                 LEFT JOIN etape                             etp ON etp.id = ep.etape_id
                 LEFT JOIN chemin_pedagogique                 cp ON cp.etape_id = etp.id
                                                                      AND cp.element_pedagogique_id = ep.id
                                                                      AND cp.histo_destruction IS NULL
    
                 JOIN volume_horaire                     vh ON vh.service_id = s.id
                                                                 AND vh.histo_destruction IS NULL
    
                 JOIN type_volume_horaire               tvh ON tvh.id = vh.type_volume_horaire_id
    
                 LEFT JOIN validation_vol_horaire            vvh ON vvh.volume_horaire_id = vh.id
    
                 LEFT JOIN validation                          v ON v.id = vvh.validation_id
                                                                      AND v.histo_destruction IS NULL
          WHERE
              s.histo_destruction IS NULL
      )
      SELECT
             i.annee_id                                                                                annee_id,
             i.id                                                                                      intervenant_id,
             i.structure_id                                                                            intervenant_structure_id,
             NVL( t.structure_id, i.structure_id )                                                     structure_id,
             ti.id                                                                                     type_intervenant_id,
             ti.code                                                                                   type_intervenant_code,
             si.peut_saisir_service                                                                    peut_saisir_service,
    
             t.element_pedagogique_id,
             t.service_id,
             t.element_pedagogique_periode_id,
             t.etape_id,
             t.type_volume_horaire_id,
             t.type_volume_horaire_code,
             t.element_pedagogique_histo,
             t.etape_histo,
    
             CASE WHEN SUM(t.has_heures_mauvaise_periode) > 0 THEN 1 ELSE 0 END has_heures_mauvaise_periode,
    
             CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE count(*) END nbvh,
             CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE sum(t.heures) END heures,
             sum(valide) valide
      FROM
           t
             JOIN intervenant                              i ON i.id = t.intervenant_id
             JOIN statut_intervenant                      si ON si.id = i.statut_id
             JOIN type_intervenant                        ti ON ti.id = si.type_intervenant_id
      GROUP BY
               i.annee_id,
               i.id,
               i.structure_id,
               t.structure_id,
               i.structure_id,
               ti.id,
               ti.code,
               si.peut_saisir_service,
               t.element_pedagogique_id,
               t.service_id,
               t.element_pedagogique_periode_id,
               t.etape_id,
               t.type_volume_horaire_id,
               t.type_volume_horaire_code,
               t.element_pedagogique_histo,
               t.etape_histo;
    
    
    CREATE OR REPLACE FORCE VIEW V_TBL_SERVICE_REFERENTIEL
    ( "ANNEE_ID", "INTERVENANT_ID", "PEUT_SAISIR_SERVICE", "TYPE_VOLUME_HORAIRE_ID", "STRUCTURE_ID", "NBVH", "VALIDE"
    )  AS
      WITH t AS (
    
          SELECT
                 i.annee_id,
                 i.id intervenant_id,
                 si.peut_saisir_referentiel peut_saisir_service,
                 vh.type_volume_horaire_id,
                 s.structure_id,
                 CASE WHEN v.id IS NULL AND vh.auto_validation=0 THEN 0 ELSE 1 END valide
          FROM
               intervenant                     i
    
                 JOIN statut_intervenant          si ON si.id = i.statut_id
    
                 LEFT JOIN service_referentiel          s ON s.intervenant_id = i.id
                                                               AND s.histo_destruction IS NULL
    
                 LEFT JOIN volume_horaire_ref          vh ON vh.service_referentiel_id = s.id
                                                               AND vh.histo_destruction IS NULL
    
                 LEFT JOIN validation_vol_horaire_ref vvh ON vvh.volume_horaire_ref_id = vh.id
    
                 LEFT JOIN validation                   v ON v.id = vvh.validation_id
                                                               AND v.histo_destruction IS NULL
          WHERE
              i.histo_destruction IS NULL
    
      )
      SELECT
             annee_id,
             intervenant_id,
             peut_saisir_service,
             type_volume_horaire_id,
             structure_id,
             CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE count(*) END nbvh,
             sum(valide) valide
      FROM
           t
      WHERE
          NOT (structure_id IS NOT NULL AND type_volume_horaire_id IS NULL)
      GROUP BY
               annee_id,
               intervenant_id,
               peut_saisir_service,
               type_volume_horaire_id,
               structure_id;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_TBL_VALIDATION_ENSEIGNEMENT
    ( "ANNEE_ID", "INTERVENANT_ID", "STRUCTURE_ID", "TYPE_VOLUME_HORAIRE_ID", "SERVICE_ID", "VOLUME_HORAIRE_ID", "AUTO_VALIDATION", "VALIDATION_ID"
    )  AS
      SELECT DISTINCT
                      i.annee_id,
                      i.id intervenant_id,
                      CASE WHEN rsv.priorite = 'affectation' THEN
                          COALESCE( i.structure_id, ep.structure_id )
                           ELSE
                          COALESCE( ep.structure_id, i.structure_id )
                          END structure_id,
                      vh.type_volume_horaire_id,
                      s.id service_id,
                      vh.id volume_horaire_id,
                      vh.auto_validation,
                      v.id validation_id
      FROM
           service s
             JOIN volume_horaire vh ON vh.service_id = s.id AND vh.histo_destruction IS NULL
             JOIN intervenant i ON i.id = s.intervenant_id AND i.histo_destruction IS NULL
             JOIN statut_intervenant si ON si.id = i.statut_id
             JOIN regle_structure_validation rsv ON rsv.type_intervenant_id = si.type_intervenant_id AND rsv.type_volume_horaire_id = vh.type_volume_horaire_id
             LEFT JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id
             LEFT JOIN validation_vol_horaire vvh ON vvh.volume_horaire_id = vh.id
             LEFT JOIN validation v ON v.id = vvh.validation_id AND v.histo_destruction IS NULL
      WHERE
          s.histo_destruction IS NULL;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_TBL_VALIDATION_REFERENTIEL
    ( "ANNEE_ID", "INTERVENANT_ID", "STRUCTURE_ID", "TYPE_VOLUME_HORAIRE_ID", "SERVICE_REFERENTIEL_ID", "VOLUME_HORAIRE_REF_ID", "AUTO_VALIDATION", "VALIDATION_ID"
    )  AS
      SELECT DISTINCT
                      i.annee_id,
                      i.id intervenant_id,
                      CASE WHEN rsv.priorite = 'affectation' THEN
                          COALESCE( i.structure_id, s.structure_id )
                           ELSE
                          COALESCE( s.structure_id, i.structure_id )
                          END structure_id,
                      vh.type_volume_horaire_id,
                      s.id service_referentiel_id,
                      vh.id volume_horaire_ref_id,
                      vh.auto_validation,
                      v.id validation_id
      FROM
           service_referentiel s
             JOIN volume_horaire_ref vh ON vh.service_referentiel_id = s.id AND vh.histo_destruction IS NULL
             JOIN intervenant i ON i.id = s.intervenant_id AND i.histo_destruction IS NULL
             JOIN statut_intervenant si ON si.id = i.statut_id
             JOIN regle_structure_validation rsv ON rsv.type_intervenant_id = si.type_intervenant_id AND rsv.type_volume_horaire_id = vh.type_volume_horaire_id
             LEFT JOIN validation_vol_horaire_ref vvh ON vvh.volume_horaire_ref_id = vh.id
             LEFT JOIN validation v ON v.id = vvh.validation_id AND v.histo_destruction IS NULL
      WHERE
          s.histo_destruction IS NULL;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_TBL_WORKFLOW
    ( "ETAPE_CODE", "ANNEE_ID", "INTERVENANT_ID", "STRUCTURE_ID", "OBJECTIF", "REALISATION"
    )  AS
      WITH pj AS (
          SELECT
                 annee_id,
                 intervenant_id,
                 SUM(demandee) demandees,
                 SUM(fournie)  fournies,
                 SUM(validee)  validees
          FROM
               tbl_piece_jointe
          WHERE
              1 = OSE_WORKFLOW.match_intervenant(intervenant_id)
            AND demandee > 0
          GROUP BY
                   annee_id,
                   intervenant_id
      ),
          mep AS (
            SELECT
                   annee_id,
                   intervenant_id,
                   structure_id,
                   SUM(heures_a_payer / heures_a_payer_pond) sap,
                   SUM(heures_demandees) dmep,
                   SUM(heures_payees) mep
                --COUNT(*)  sap,
                --SUM(CASE WHEN mise_en_paiement_id IS NULL THEN 0 ELSE 1 END) dmep,
                --SUM(CASE WHEN periode_paiement_id IS NULL THEN 0 ELSE 1 END) mep
            FROM
                 tbl_paiement
            WHERE
                1 = OSE_WORKFLOW.match_intervenant(intervenant_id)
            GROUP BY
                     annee_id,
                     intervenant_id,
                     structure_id
        )
      SELECT
             e.code                                                    etape_code,
             d.annee_id                                                annee_id,
             d.intervenant_id                                          intervenant_id,
             null                                                      structure_id,
             1                                                         objectif,
             CASE
               WHEN e.code = 'DONNEES_PERSO_SAISIE' THEN
                 CASE WHEN d.dossier_id IS NULL THEN 0 ELSE 1 END
    
               WHEN e.code = 'DONNEES_PERSO_VALIDATION' THEN
                 CASE WHEN d.validation_id IS NULL THEN 0 ELSE 1 END
    
                 END                                                       realisation
      FROM
           tbl_dossier d
             JOIN (
                  SELECT 'DONNEES_PERSO_SAISIE'     code FROM dual
                  UNION SELECT 'DONNEES_PERSO_VALIDATION' code FROM dual
                  ) e ON 1=1
      WHERE
          d. peut_saisir_dossier = 1
        AND 1 = OSE_WORKFLOW.match_intervenant(d.intervenant_id)
    
      UNION ALL
    
      SELECT
             e.code                                                    etape_code,
             tss.annee_id                                              annee_id,
             tss.intervenant_id                                        intervenant_id,
             NULL                                                      structure_id,
             1                                                         objectif,
             CASE
               WHEN e.code = 'SERVICE_SAISIE' THEN
                 CASE WHEN tss.heures_service_prev + tss.heures_referentiel_prev > 0 THEN 1 ELSE 0 END
    
               WHEN e.code = 'SERVICE_SAISIE_REALISE' THEN
                 CASE WHEN tss.heures_service_real + tss.heures_referentiel_real > 0 THEN 1 ELSE 0 END
    
                 END                                                       realisation
      FROM
           TBL_SERVICE_SAISIE tss
             JOIN (
                  SELECT 'SERVICE_SAISIE'                 code FROM dual
                  UNION SELECT 'SERVICE_SAISIE_REALISE'         code FROM dual
                  ) e ON 1=1
      WHERE
          (tss.peut_saisir_service = 1 OR tss.peut_saisir_referentiel = 1)
        AND 1 = OSE_WORKFLOW.match_intervenant(tss.intervenant_id)
    
      UNION ALL
    
      SELECT
             CASE
               WHEN tvh.code = 'PREVU'   THEN 'SERVICE_VALIDATION'
               WHEN tvh.code = 'REALISE' THEN 'SERVICE_VALIDATION_REALISE'
                 END                                                        etape_code,
             tve.annee_id                                               annee_id,
             tve.intervenant_id                                         intervenant_id,
             tve.structure_id                                           structure_id,
             COUNT(*)                                                   objectif,
             SUM(CASE WHEN tve.validation_id IS NOT NULL THEN 1 ELSE 0 END) realisation
      FROM
           tbl_validation_enseignement tve
             JOIN type_volume_horaire tvh ON tvh.id = tve.type_volume_horaire_id
      WHERE
          1 = OSE_WORKFLOW.match_intervenant(tve.intervenant_id)
        AND tve.auto_validation = 0
      GROUP BY
               tve.annee_id,
               tve.intervenant_id,
               tve.structure_id,
               tvh.code
    
      UNION ALL
    
      SELECT
             CASE
               WHEN tvh.code = 'PREVU'   THEN 'REFERENTIEL_VALIDATION'
               WHEN tvh.code = 'REALISE' THEN 'REFERENTIEL_VALIDATION_REALISE'
                 END                                                        etape_code,
             tvr.annee_id                                               annee_id,
             tvr.intervenant_id                                         intervenant_id,
             tvr.structure_id                                           structure_id,
             count(*)                                                   objectif,
             SUM(CASE WHEN tvr.validation_id IS NOT NULL THEN 1 ELSE 0 END) realisation
      FROM
           tbl_validation_referentiel tvr
             JOIN type_volume_horaire tvh ON tvh.id = tvr.type_volume_horaire_id
      WHERE
          1 = OSE_WORKFLOW.match_intervenant(tvr.intervenant_id)
        AND tvr.auto_validation = 0
      GROUP BY
               tvr.annee_id,
               tvr.intervenant_id,
               tvr.structure_id,
               tvh.code
    
      UNION ALL
    
      SELECT
             e.code                                                    etape_code,
             pj.annee_id                                               annee_id,
             pj.intervenant_id                                         intervenant_id,
             null                                                      structure_id,
             CASE
               WHEN e.code = 'PJ_SAISIE' THEN pj.demandees
               WHEN e.code = 'PJ_VALIDATION' THEN pj.demandees
                 END                                                       objectif,
             CASE
               WHEN e.code = 'PJ_SAISIE' THEN pj.fournies
               WHEN e.code = 'PJ_VALIDATION' THEN pj.validees
                 END                                                       realisation
      FROM
           pj
             JOIN (
                  SELECT 'PJ_SAISIE'      code FROM dual
                  UNION SELECT 'PJ_VALIDATION'  code FROM dual
                  ) e ON (
               (e.code = 'PJ_SAISIE'     AND pj.demandees > 0)
                 OR (e.code = 'PJ_VALIDATION' AND pj.fournies  > 0)
               )
    
      UNION ALL
    
      SELECT
             ta.code                                                   etape_code,
             a.annee_id                                                annee_id,
             a.intervenant_id                                          intervenant_id,
             a.structure_id                                            structure_id,
             1                                                         objectif,
             CASE WHEN a.agrement_id IS NULL THEN 0 ELSE 1 END         realisation
      FROM
           tbl_agrement a
             JOIN type_agrement ta ON ta.id = a.type_agrement_id
      WHERE
          1 = OSE_WORKFLOW.match_intervenant(a.intervenant_id)
    
      UNION ALL
    
      SELECT
             'CLOTURE_REALISE'                                         etape_code,
             c.annee_id                                                annee_id,
             c.intervenant_id                                          intervenant_id,
             null                                                      structure_id,
             1                                                         objectif,
             c.cloture                                                 realisation
      FROM
           tbl_cloture_realise c
      WHERE
          c.peut_cloturer_saisie = 1
        AND 1 = OSE_WORKFLOW.match_intervenant(c.intervenant_id)
    
      UNION ALL
    
      SELECT
             e.code                                                    etape_code,
             mep.annee_id                                              annee_id,
             mep.intervenant_id                                        intervenant_id,
             mep.structure_id                                          structure_id,
             CASE
               WHEN e.code = 'DEMANDE_MEP' THEN mep.sap
               WHEN e.code = 'SAISIE_MEP' THEN mep.dmep
                 END                                                       objectif,
             CASE
               WHEN e.code = 'DEMANDE_MEP' THEN mep.dmep
               WHEN e.code = 'SAISIE_MEP' THEN mep.mep
                 END                                                       realisation
      FROM
           mep
             JOIN (
                  SELECT 'DEMANDE_MEP'  code FROM dual
                  UNION SELECT 'SAISIE_MEP'   code FROM dual
                  ) e ON (
               (e.code = 'DEMANDE_MEP' AND mep.sap > 0)
                 OR (e.code = 'SAISIE_MEP'  AND mep.dmep > 0)
               )
    
    
      UNION ALL
    
      SELECT
             'CONTRAT'                                                 etape_code,
             annee_id                                                  annee_id,
             intervenant_id                                            intervenant_id,
             structure_id                                              structure_id,
             nbvh                                                      objectif,
             edite                                                     realisation
      FROM
           tbl_contrat c
      WHERE
          peut_avoir_contrat = 1
        AND nbvh > 0
        AND 1 = OSE_WORKFLOW.match_intervenant(c.intervenant_id);
    
    
    
    CREATE OR REPLACE FORCE VIEW V_TYPE_INTERVENTION_REGLE_EP
    ( "ELEMENT_PEDAGOGIQUE_ID", "TYPE_INTERVENTION_REGLE_ID"
    )  AS
      SELECT
             ep.id element_pedagogique_id,
             tir.id type_intervention_regle_id
      FROM
           element_pedagogique ep
             JOIN type_intervention_regle tir ON tir.code = 'foad'
      WHERE
          ep.taux_foad > 0
    
      UNION
    
      SELECT
             ep.id element_pedagogique_id,
             tir.id type_intervention_regle_id
      FROM
           element_pedagogique ep
             JOIN type_intervention_regle tir ON tir.code = 'fc'
      WHERE
          ep.taux_fc > 0;
    
    
    
    
    CREATE OR REPLACE FORCE VIEW V_VOL_HORAIRE_ETAT_MULTI
    ( "VOLUME_HORAIRE_ID", "ETAT_VOLUME_HORAIRE_ID"
    )  AS
      select vh.id VOLUME_HORAIRE_ID, evh.id ETAT_VOLUME_HORAIRE_ID
      from volume_horaire vh
             join service s on s.id = vh.service_id and s.histo_destruction IS NULL
             join etat_volume_horaire evh on evh.code = 'saisi'
      where vh.histo_destruction IS NULL
      union all
      select vh.id, evh.id
      from volume_horaire vh
             join service s on s.id = vh.service_id and s.histo_destruction IS NULL
             join etat_volume_horaire evh on evh.code = 'valide'
      where vh.histo_destruction IS NULL
              and EXISTS(
                    SELECT * FROM validation v JOIN validation_vol_horaire vvh ON vvh.validation_id = v.id
                    WHERE vvh.volume_horaire_id = vh.id AND v.histo_destruction IS NULL
                ) OR vh.auto_validation = 1
      union all
      select vh.id, evh.id
      from volume_horaire vh
             join service s on s.id = vh.service_id and s.histo_destruction IS NULL
             join contrat c on vh.contrat_id = c.id and c.histo_destruction IS NULL
             join etat_volume_horaire evh on evh.code = 'contrat-edite'
      where vh.histo_destruction IS NULL
      union all
      select vh.id, evh.id
      from volume_horaire vh
             join service s on s.id = vh.service_id and s.histo_destruction IS NULL
             join contrat c on vh.contrat_id = c.id and c.histo_destruction IS NULL and c.date_retour_signe is not null
             join etat_volume_horaire evh on evh.code = 'contrat-signe'
      where vh.histo_destruction IS NULL;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_VOL_HORAIRE_REF_ETAT_MULTI
    ( "VOLUME_HORAIRE_REF_ID", "ETAT_VOLUME_HORAIRE_ID"
    )  AS
      select vh.id VOLUME_HORAIRE_REF_ID, evh.id ETAT_VOLUME_HORAIRE_ID
      from volume_horaire_ref vh
             join service_referentiel s on s.id = vh.service_referentiel_id and s.histo_destruction IS NULL
             join etat_volume_horaire evh on evh.code = 'saisi'
      where vh.histo_destruction IS NULL
      union all
      select vh.id, evh.id
      from volume_horaire_ref vh
             join service_referentiel s on s.id = vh.service_referentiel_id and s.histo_destruction IS NULL
             join etat_volume_horaire evh on evh.code = 'valide'
      where vh.histo_destruction IS NULL
              and vh.auto_validation=1 OR EXISTS(
                                            SELECT * FROM validation v JOIN validation_vol_horaire_ref vvh ON vvh.validation_id = v.id
                                            WHERE vvh.volume_horaire_ref_id = vh.id AND v.histo_destruction IS NULL
                );
    
    
    CREATE OR REPLACE FORCE VIEW V_VOLUME_HORAIRE_ETAT
    ( "VOLUME_HORAIRE_ID", "ETAT_VOLUME_HORAIRE_ID"
    )  AS
      SELECT
             vh.id volume_horaire_id,
             evh.id etat_volume_horaire_id
      FROM
           volume_horaire vh
             LEFT JOIN contrat c ON c.id = vh.contrat_id AND c.histo_destruction IS NULL
             LEFT JOIN validation cv ON cv.id = c.validation_id AND cv.histo_destruction IS NULL
             JOIN etat_volume_horaire evh ON evh.code = CASE
                                                          WHEN c.date_retour_signe IS NOT NULL THEN 'contrat-signe'
                                                          WHEN cv.id IS NOT NULL THEN 'contrat-edite'
                                                          WHEN vh.auto_validation = 1 OR EXISTS(
                                                                                           SELECT * FROM validation v JOIN validation_vol_horaire vvh ON vvh.validation_id = v.id
                                                                                           WHERE vvh.volume_horaire_id = vh.id AND v.histo_destruction IS NULL
                   ) THEN 'valide'
                                                          ELSE 'saisi'
               END;
    
    
    
    CREATE OR REPLACE FORCE VIEW V_VOLUME_HORAIRE_REF_ETAT
    ( "VOLUME_HORAIRE_REF_ID", "ETAT_VOLUME_HORAIRE_ID"
    )  AS
      SELECT
             vhr.id volume_horaire_ref_id,
             evh.id etat_volume_horaire_id
      FROM
           volume_horaire_ref vhr
             JOIN etat_volume_horaire evh ON evh.code = CASE
                                                          WHEN vhr.auto_validation = 1 OR EXISTS(
                                                                                            SELECT * FROM validation v JOIN validation_vol_horaire_ref vvhr ON vvhr.validation_id = v.id
                                                                                            WHERE vvhr.volume_horaire_ref_id = vhr.id AND v.histo_destruction IS NULL
                   ) THEN 'valide'
                                                          ELSE 'saisi'
               END;
    
    
    
    /
    
    CREATE OR REPLACE PACKAGE OSE_FORMULE AS
    
      PACKAGE_SUJET VARCHAR2(80) DEFAULT 'OSE_FORMULE';
    
      TYPE t_intervenant IS RECORD (
      structure_id                   NUMERIC,
      annee_id                       NUMERIC,
      heures_decharge                FLOAT DEFAULT 0,
      heures_service_statutaire      FLOAT DEFAULT 0,
      heures_service_modifie         FLOAT DEFAULT 0,
      depassement_service_du_sans_hc FLOAT DEFAULT 0
      );
    
      TYPE t_type_etat_vh IS RECORD (
      type_volume_horaire_id    NUMERIC,
      etat_volume_horaire_id    NUMERIC
      );
      TYPE t_lst_type_etat_vh   IS TABLE OF t_type_etat_vh INDEX BY PLS_INTEGER;
    
      TYPE t_service_ref IS RECORD (
      id                        NUMERIC,
      structure_id              NUMERIC,
      service_statutaire        BOOLEAN
      );
      TYPE t_lst_service_ref      IS TABLE OF t_service_ref INDEX BY PLS_INTEGER;
    
      TYPE t_service IS RECORD (
      id                        NUMERIC,
      taux_fi                   FLOAT   DEFAULT 1,
      taux_fa                   FLOAT   DEFAULT 0,
      taux_fc                   FLOAT   DEFAULT 0,
      ponderation_service_du    FLOAT   DEFAULT 1,
      ponderation_service_compl FLOAT   DEFAULT 1,
      structure_aff_id          NUMERIC,
      structure_ens_id          NUMERIC,
      service_statutaire        BOOLEAN
      );
      TYPE t_lst_service          IS TABLE OF t_service INDEX BY PLS_INTEGER;
    
      TYPE t_volume_horaire_ref IS RECORD (
      id                        NUMERIC,
      service_referentiel_id    NUMERIC,
      type_volume_horaire_id    NUMERIC,
      etat_volume_horaire_id    NUMERIC,
      etat_volume_horaire_ordre NUMERIC,
      heures                    FLOAT   DEFAULT 0
      );
      TYPE t_lst_volume_horaire_ref   IS TABLE OF t_volume_horaire_ref INDEX BY PLS_INTEGER;
    
      TYPE t_volume_horaire IS RECORD (
      id                        NUMERIC,
      service_id                NUMERIC,
      type_volume_horaire_id    NUMERIC,
      etat_volume_horaire_id    NUMERIC,
      etat_volume_horaire_ordre NUMERIC,
      heures                    FLOAT   DEFAULT 0,
      taux_service_du           FLOAT   DEFAULT 1,
      taux_service_compl        FLOAT   DEFAULT 1
      );
      TYPE t_lst_volume_horaire   IS TABLE OF t_volume_horaire INDEX BY PLS_INTEGER;
    
    
    
      TYPE t_resultat_hetd IS RECORD (
      service_fi                FLOAT DEFAULT 0,
      service_fa                FLOAT DEFAULT 0,
      service_fc                FLOAT DEFAULT 0,
      heures_compl_fi           FLOAT DEFAULT 0,
      heures_compl_fa           FLOAT DEFAULT 0,
      heures_compl_fc           FLOAT DEFAULT 0,
      heures_compl_fc_majorees  FLOAT DEFAULT 0
      );
      TYPE t_lst_resultat_hetd   IS TABLE OF t_resultat_hetd INDEX BY PLS_INTEGER;
    
      TYPE t_resultat_hetd_ref IS RECORD (
      service_referentiel       FLOAT DEFAULT 0,
      heures_compl_referentiel  FLOAT DEFAULT 0
      );
      TYPE t_lst_resultat_hetd_ref   IS TABLE OF t_resultat_hetd_ref INDEX BY PLS_INTEGER;
    
      TYPE t_resultat IS RECORD (
      intervenant_id            NUMERIC,
      type_volume_horaire_id    NUMERIC,
      etat_volume_horaire_id    NUMERIC,
      service_du                FLOAT DEFAULT 0,
      solde                     FLOAT DEFAULT 0,
      sous_service              FLOAT DEFAULT 0,
      heures_compl              FLOAT DEFAULT 0,
      volume_horaire            t_lst_resultat_hetd,
      volume_horaire_ref        t_lst_resultat_hetd_ref
      );
    
      d_intervenant         t_intervenant;
      d_type_etat_vh        t_lst_type_etat_vh;
      d_service_ref         t_lst_service_ref;
      d_service             t_lst_service;
      d_volume_horaire_ref  t_lst_volume_horaire_ref;
      d_volume_horaire      t_lst_volume_horaire;
      d_resultat            t_resultat;
    
      FUNCTION  GET_INTERVENANT_ID RETURN NUMERIC;
      FUNCTION  GET_DATE_OBS RETURN DATE;
      FUNCTION  SET_DATE_OBS( DATE_OBS DATE DEFAULT NULL ) RETURN DATE;
    
      PROCEDURE SET_DEBUG_LEVEL( DEBUG_LEVEL NUMERIC );
      FUNCTION GET_DEBUG_LEVEL RETURN NUMERIC;
    
      FUNCTION GET_TAUX_HORAIRE_HETD( DATE_OBS DATE DEFAULT NULL ) RETURN FLOAT;
      PROCEDURE UPDATE_ANNEE_TAUX_HETD;
    
      PROCEDURE CALCULER( INTERVENANT_ID NUMERIC );
      PROCEDURE CALCULER_TOUT( ANNEE_ID NUMERIC DEFAULT NULL );        -- mise à jour de TOUTES les données ! ! ! !
      PROCEDURE CALCULER_TBL( PARAMS UNICAEN_TBL.T_PARAMS );
    
      PROCEDURE SET_INTERVENANT(INTERVENANT_ID NUMERIC DEFAULT NULL);
      FUNCTION GET_INTERVENANT RETURN NUMERIC;
      FUNCTION MATCH_INTERVENANT(INTERVENANT_ID NUMERIC DEFAULT NULL) RETURN NUMERIC;
    END OSE_FORMULE;
    /
    
    CREATE OR REPLACE PACKAGE BODY OSE_FORMULE AS
    
      v_date_obs DATE;
      debug_level NUMERIC DEFAULT 0;
      d_all_volume_horaire_ref  t_lst_volume_horaire_ref;
      d_all_volume_horaire      t_lst_volume_horaire;
      arrondi NUMERIC DEFAULT 2;
    
      INTERVENANT_ID NUMERIC DEFAULT NULL;
    
      FUNCTION GET_INTERVENANT_ID RETURN NUMERIC IS
        BEGIN
          RETURN INTERVENANT_ID;
        END;
    
      FUNCTION GET_DATE_OBS RETURN DATE AS
        BEGIN
          RETURN COALESCE( v_date_obs, SYSDATE );
        END;
    
      FUNCTION SET_DATE_OBS( DATE_OBS DATE DEFAULT NULL ) RETURN DATE IS
        BEGIN
          v_date_obs := DATE_OBS;
          RETURN v_date_obs;
        END;
    
      PROCEDURE SET_DEBUG_LEVEL( DEBUG_LEVEL NUMERIC ) IS
        BEGIN
          ose_formule.debug_level := SET_DEBUG_LEVEL.DEBUG_LEVEL;
        END;
    
      FUNCTION GET_DEBUG_LEVEL RETURN NUMERIC IS
        BEGIN
          RETURN ose_formule.debug_level;
        END;
    
      FUNCTION GET_TAUX_HORAIRE_HETD( DATE_OBS DATE DEFAULT NULL ) RETURN FLOAT IS
        taux_hetd FLOAT;
        BEGIN
          SELECT valeur INTO taux_hetd
          FROM taux_horaire_hetd t
          WHERE
              DATE_OBS BETWEEN t.histo_creation AND COALESCE(t.histo_destruction,GREATEST(SYSDATE,DATE_OBS))
            AND rownum = 1
          ORDER BY
                   histo_creation DESC;
          RETURN taux_hetd;
        END;
    
      PROCEDURE UPDATE_ANNEE_TAUX_HETD IS
        BEGIN
          UPDATE annee SET taux_hetd = GET_TAUX_HORAIRE_HETD(date_fin);
        END;
    
    
    
      PROCEDURE CALCULER_TOUT( ANNEE_ID NUMERIC DEFAULT NULL ) IS
        a_id NUMERIC;
        BEGIN
          a_id := NVL(CALCULER_TOUT.ANNEE_ID, OSE_PARAMETRE.GET_ANNEE);
          FOR mp IN (
          SELECT DISTINCT
                          intervenant_id
          FROM
               service s
                 JOIN intervenant i ON i.id = s.intervenant_id
          WHERE
              s.histo_destruction IS NULL
            AND i.annee_id = a_id
    
          UNION
    
          SELECT DISTINCT
                          intervenant_id
          FROM
               service_referentiel sr
                 JOIN intervenant i ON i.id = sr.intervenant_id
          WHERE
              sr.histo_destruction IS NULL
            AND i.annee_id = a_id
    
          )
          LOOP
            CALCULER( mp.intervenant_id );
          END LOOP;
        END;
    
    
    
      FUNCTION ENREGISTRER_RESULTAT( fr formule_resultat%rowtype ) RETURN NUMERIC IS
        id NUMERIC;
        ti_code VARCHAR(5);
        BEGIN
    
          SELECT
                 ti.code INTO ti_code
          FROM
               type_intervenant        ti
                 JOIN statut_intervenant si ON si.type_intervenant_id = ti.id
                 JOIN intervenant         i ON i.statut_id = si.id
          WHERE
              i.id = fr.intervenant_id;
    
    
    
          MERGE INTO formule_resultat tfr USING dual ON (
    
            tfr.intervenant_id         = fr.intervenant_id
            AND tfr.type_volume_horaire_id = fr.type_volume_horaire_id
            AND tfr.etat_volume_horaire_id = fr.etat_volume_horaire_id
    
          ) WHEN MATCHED THEN UPDATE SET
    
            service_du                     = ROUND( fr.service_du, arrondi ),
            service_fi                     = ROUND( fr.service_fi, arrondi ),
            service_fa                     = ROUND( fr.service_fa, arrondi ),
            service_fc                     = ROUND( fr.service_fc, arrondi ),
            service_referentiel            = ROUND( fr.service_referentiel, arrondi ),
            heures_compl_fi                = ROUND( fr.heures_compl_fi, arrondi ),
            heures_compl_fa                = ROUND( fr.heures_compl_fa, arrondi ),
            heures_compl_fc                = ROUND( fr.heures_compl_fc, arrondi ),
            heures_compl_fc_majorees       = ROUND( fr.heures_compl_fc_majorees, arrondi ),
            heures_compl_referentiel       = ROUND( fr.heures_compl_referentiel, arrondi ),
            total                          = ROUND( fr.total, arrondi ),
            solde                          = ROUND( fr.solde, arrondi ),
            sous_service                   = ROUND( fr.sous_service, arrondi ),
            heures_compl                   = ROUND( fr.heures_compl, arrondi ),
            to_delete                      = 0
    
          WHEN NOT MATCHED THEN INSERT (
    
            ID,
            INTERVENANT_ID,
            TYPE_VOLUME_HORAIRE_ID,
            ETAT_VOLUME_HORAIRE_ID,
            SERVICE_DU,
            SERVICE_FI,
            SERVICE_FA,
            SERVICE_FC,
            SERVICE_REFERENTIEL,
            HEURES_COMPL_FI,
            HEURES_COMPL_FA,
            HEURES_COMPL_FC,
            HEURES_COMPL_FC_majorees,
            HEURES_COMPL_REFERENTIEL,
            TOTAL,
            SOLDE,
            SOUS_SERVICE,
            HEURES_COMPL,
            TO_DELETE,
            type_intervenant_code
    
          ) VALUES (
    
            FORMULE_RESULTAT_ID_SEQ.NEXTVAL,
            fr.intervenant_id,
            fr.type_volume_horaire_id,
            fr.etat_volume_horaire_id,
            ROUND( fr.service_du, arrondi ),
            ROUND( fr.service_fi, arrondi ),
            ROUND( fr.service_fa, arrondi ),
            ROUND( fr.service_fc, arrondi ),
            ROUND( fr.service_referentiel, arrondi ),
            ROUND( fr.heures_compl_fi, arrondi ),
            ROUND( fr.heures_compl_fa, arrondi ),
            ROUND( fr.heures_compl_fc, arrondi ),
            ROUND( fr.heures_compl_fc_majorees, arrondi ),
            ROUND( fr.heures_compl_referentiel, arrondi ),
            ROUND( fr.total, arrondi ),
            ROUND( fr.solde, arrondi ),
            ROUND( fr.sous_service, arrondi ),
            ROUND( fr.heures_compl, arrondi ),
            0,
            ti_code
          );
    
          SELECT id INTO id FROM formule_resultat tfr WHERE
              tfr.intervenant_id         = fr.intervenant_id
                                                        AND tfr.type_volume_horaire_id = fr.type_volume_horaire_id
                                                        AND tfr.etat_volume_horaire_id = fr.etat_volume_horaire_id;
          RETURN id;
        END;
    
    
      FUNCTION ENREGISTRER_RESULTAT_SERVICE( fs formule_resultat_service%rowtype ) RETURN NUMERIC IS
        id NUMERIC;
        BEGIN
          MERGE INTO formule_resultat_service tfs USING dual ON (
    
            tfs.formule_resultat_id    = fs.formule_resultat_id
            AND tfs.service_id             = fs.service_id
    
          ) WHEN MATCHED THEN UPDATE SET
    
            service_fi                     = ROUND( fs.service_fi, arrondi ),
            service_fa                     = ROUND( fs.service_fa, arrondi ),
            service_fc                     = ROUND( fs.service_fc, arrondi ),
            heures_compl_fi                = ROUND( fs.heures_compl_fi, arrondi ),
            heures_compl_fa                = ROUND( fs.heures_compl_fa, arrondi ),
            heures_compl_fc                = ROUND( fs.heures_compl_fc, arrondi ),
            heures_compl_fc_majorees       = ROUND( fs.heures_compl_fc_majorees, arrondi ),
            total                          = ROUND( fs.total, arrondi ),
            TO_DELETE                      = 0
    
          WHEN NOT MATCHED THEN INSERT (
    
            ID,
            FORMULE_RESULTAT_ID,
            SERVICE_ID,
            SERVICE_FI,
            SERVICE_FA,
            SERVICE_FC,
            HEURES_COMPL_FI,
            HEURES_COMPL_FA,
            HEURES_COMPL_FC,
            HEURES_COMPL_FC_majorees,
            TOTAL,
            TO_DELETE
    
          ) VALUES (
    
            FORMULE_RESULTAT_SERVIC_ID_SEQ.NEXTVAL,
            fs.formule_resultat_id,
            fs.service_id,
            ROUND( fs.service_fi, arrondi ),
            ROUND( fs.service_fa, arrondi ),
            ROUND( fs.service_fc, arrondi ),
            ROUND( fs.heures_compl_fi, arrondi ),
            ROUND( fs.heures_compl_fa, arrondi ),
            ROUND( fs.heures_compl_fc, arrondi ),
            ROUND( fs.heures_compl_fc_majorees, arrondi ),
            ROUND( fs.total, arrondi ),
            0
    
          );
    
          SELECT id INTO id FROM formule_resultat_service tfs WHERE
              tfs.formule_resultat_id    = fs.formule_resultat_id
                                                                AND tfs.service_id             = fs.service_id;
          RETURN id;
        END;
    
    
      FUNCTION ENREGISTRER_RESULTAT_VH( fvh formule_resultat_vh%rowtype ) RETURN NUMERIC IS
        id NUMERIC;
        BEGIN
          MERGE INTO formule_resultat_vh tfvh USING dual ON (
    
            tfvh.formule_resultat_id    = fvh.formule_resultat_id
            AND tfvh.volume_horaire_id      = fvh.volume_horaire_id
    
          ) WHEN MATCHED THEN UPDATE SET
    
            service_fi                     = ROUND( fvh.service_fi, arrondi ),
            service_fa                     = ROUND( fvh.service_fa, arrondi ),
            service_fc                     = ROUND( fvh.service_fc, arrondi ),
            heures_compl_fi                = ROUND( fvh.heures_compl_fi, arrondi ),
            heures_compl_fa                = ROUND( fvh.heures_compl_fa, arrondi ),
            heures_compl_fc                = ROUND( fvh.heures_compl_fc, arrondi ),
            heures_compl_fc_majorees       = ROUND( fvh.heures_compl_fc_majorees, arrondi ),
            total                          = ROUND( fvh.total, arrondi ),
            TO_DELETE                      = 0
    
          WHEN NOT MATCHED THEN INSERT (
    
            ID,
            FORMULE_RESULTAT_ID,
            VOLUME_HORAIRE_ID,
            SERVICE_FI,
            SERVICE_FA,
            SERVICE_FC,
            HEURES_COMPL_FI,
            HEURES_COMPL_FA,
            HEURES_COMPL_FC,
            HEURES_COMPL_FC_MAJOREES,
            TOTAL,
            TO_DELETE
    
          ) VALUES (
    
            FORMULE_RESULTAT_VH_ID_SEQ.NEXTVAL,
            fvh.formule_resultat_id,
            fvh.volume_horaire_id,
            ROUND( fvh.service_fi, arrondi ),
            ROUND( fvh.service_fa, arrondi ),
            ROUND( fvh.service_fc, arrondi ),
            ROUND( fvh.heures_compl_fi, arrondi ),
            ROUND( fvh.heures_compl_fa, arrondi ),
            ROUND( fvh.heures_compl_fc, arrondi ),
            ROUND( fvh.heures_compl_fc_majorees, arrondi ),
            ROUND( fvh.total, arrondi ),
            0
    
          );
    
          SELECT id INTO id FROM formule_resultat_vh tfvh WHERE
              tfvh.formule_resultat_id    = fvh.formule_resultat_id
                                                            AND tfvh.volume_horaire_id      = fvh.volume_horaire_id;
          RETURN id;
        END;
    
    
      FUNCTION ENREGISTRER_RESULTAT_SERV_REF( fr formule_resultat_service_ref%rowtype ) RETURN NUMERIC IS
        id NUMERIC;
        BEGIN
          MERGE INTO formule_resultat_service_ref tfr USING dual ON (
    
            tfr.formule_resultat_id    = fr.formule_resultat_id
            AND tfr.service_referentiel_id = fr.service_referentiel_id
    
          ) WHEN MATCHED THEN UPDATE SET
    
            service_referentiel            = ROUND( fr.service_referentiel, arrondi ),
            heures_compl_referentiel       = ROUND( fr.heures_compl_referentiel, arrondi ),
            TO_DELETE                      = 0
    
          WHEN NOT MATCHED THEN INSERT (
    
            ID,
            FORMULE_RESULTAT_ID,
            SERVICE_REFERENTIEL_ID,
            SERVICE_REFERENTIEL,
            HEURES_COMPL_REFERENTIEL,
            TOTAL,
            TO_DELETE
    
          ) VALUES (
    
            FORMULE_RESULTAT_SERVIC_ID_SEQ.NEXTVAL,
            fr.formule_resultat_id,
            fr.service_referentiel_id,
            ROUND( fr.service_referentiel, arrondi ),
            ROUND( fr.heures_compl_referentiel, arrondi ),
            fr.total,
            0
    
          );
    
          SELECT id INTO id FROM formule_resultat_service_ref tfr WHERE
              tfr.formule_resultat_id    = fr.formule_resultat_id
                                                                    AND tfr.service_referentiel_id = fr.service_referentiel_id;
    
          RETURN id;
        END;
    
    
      FUNCTION ENREGISTRER_RESULTAT_VH_REF( fvh formule_resultat_vh_ref%rowtype ) RETURN NUMERIC IS
        id NUMERIC;
        BEGIN
          MERGE INTO formule_resultat_vh_ref tfvh USING dual ON (
    
            tfvh.formule_resultat_id    = fvh.formule_resultat_id
            AND tfvh.volume_horaire_ref_id      = fvh.volume_horaire_ref_id
    
          ) WHEN MATCHED THEN UPDATE SET
    
            service_referentiel            = ROUND( fvh.service_referentiel, arrondi ),
            heures_compl_referentiel       = ROUND( fvh.heures_compl_referentiel, arrondi ),
            total                          = fvh.total,
            TO_DELETE                      = 0
    
          WHEN NOT MATCHED THEN INSERT (
    
            ID,
            FORMULE_RESULTAT_ID,
            VOLUME_HORAIRE_REF_ID,
            SERVICE_REFERENTIEL,
            HEURES_COMPL_REFERENTIEL,
            TOTAL,
            TO_DELETE
    
          ) VALUES (
    
            FORMULE_RESULTAT_VH_ID_SEQ.NEXTVAL,
            fvh.formule_resultat_id,
            fvh.volume_horaire_ref_id,
            ROUND( fvh.service_referentiel, arrondi ),
            ROUND( fvh.heures_compl_referentiel, arrondi ),
            fvh.total,
            0
    
          );
    
          SELECT id INTO id FROM formule_resultat_vh_ref tfvh WHERE
              tfvh.formule_resultat_id    = fvh.formule_resultat_id
                                                                AND tfvh.volume_horaire_ref_id  = fvh.volume_horaire_ref_id;
          RETURN id;
        END;
    
    
      PROCEDURE POPULATE_INTERVENANT( INTERVENANT_ID NUMERIC, d_intervenant OUT t_intervenant ) IS
        BEGIN
          SELECT
                 structure_id,
                 annee_id,
                 heures_service_statutaire,
                 depassement_service_du_sans_hc
              INTO
                d_intervenant.structure_id,
                d_intervenant.annee_id,
                d_intervenant.heures_service_statutaire,
                d_intervenant.depassement_service_du_sans_hc
          FROM
               v_formule_intervenant fi
          WHERE
              fi.id = POPULATE_INTERVENANT.INTERVENANT_ID;
    
          SELECT
                 NVL( SUM(heures), 0),
                 NVL( SUM(heures_decharge), 0)
              INTO
                d_intervenant.heures_service_modifie,
                d_intervenant.heures_decharge
          FROM
               v_formule_service_modifie fsm
          WHERE
              fsm.intervenant_id = POPULATE_INTERVENANT.INTERVENANT_ID;
    
          EXCEPTION WHEN NO_DATA_FOUND THEN
          d_intervenant.structure_id := null;
          d_intervenant.annee_id := null;
          d_intervenant.heures_service_statutaire := 0;
          d_intervenant.depassement_service_du_sans_hc := 0;
          d_intervenant.heures_service_modifie := 0;
          d_intervenant.heures_decharge := 0;
        END;
    
    
      PROCEDURE POPULATE_SERVICE_REF( INTERVENANT_ID NUMERIC, d_service_ref OUT t_lst_service_ref ) IS
        i PLS_INTEGER;
        BEGIN
          d_service_ref.delete;
    
          FOR d IN (
          SELECT
                 fr.id,
                 fr.structure_id,
                 fr.service_statutaire
          FROM
               v_formule_service_ref fr
          WHERE
              fr.intervenant_id = POPULATE_SERVICE_REF.INTERVENANT_ID
          ) LOOP
            d_service_ref( d.id ).id                 := d.id;
            d_service_ref( d.id ).structure_id       := d.structure_id;
            d_service_ref( d.id ).service_statutaire := d.service_statutaire = 1;
          END LOOP;
        END;
    
    
      PROCEDURE POPULATE_SERVICE( INTERVENANT_ID NUMERIC, d_service OUT t_lst_service ) IS
        BEGIN
          d_service.delete;
    
          FOR d IN (
          SELECT
                 id,
                 taux_fi,
                 taux_fa,
                 taux_fc,
                 structure_aff_id,
                 structure_ens_id,
                 ponderation_service_du,
                 ponderation_service_compl,
                 service_statutaire
          FROM
               v_formule_service fs
          WHERE
              fs.intervenant_id = POPULATE_SERVICE.INTERVENANT_ID
          ) LOOP
            d_service( d.id ).id                        := d.id;
            d_service( d.id ).taux_fi                   := d.taux_fi;
            d_service( d.id ).taux_fa                   := d.taux_fa;
            d_service( d.id ).taux_fc                   := d.taux_fc;
            d_service( d.id ).ponderation_service_du    := d.ponderation_service_du;
            d_service( d.id ).ponderation_service_compl := d.ponderation_service_compl;
            d_service( d.id ).structure_aff_id          := d.structure_aff_id;
            d_service( d.id ).structure_ens_id          := d.structure_ens_id;
            d_service( d.id ).service_statutaire        := d.service_statutaire = 1;
          END LOOP;
        END;
    
      PROCEDURE POPULATE_VOLUME_HORAIRE_REF( INTERVENANT_ID NUMERIC, d_volume_horaire_ref OUT t_lst_volume_horaire_ref ) IS
        BEGIN
          d_volume_horaire_ref.delete;
    
          FOR d IN (
          SELECT
                 id,
                 service_referentiel_id,
                 heures,
                 fvh.type_volume_horaire_id,
                 fvh.etat_volume_horaire_id,
                 fvh.etat_volume_horaire_ordre
          FROM
               v_formule_volume_horaire_ref fvh
          WHERE
              fvh.intervenant_id                = POPULATE_VOLUME_HORAIRE_REF.INTERVENANT_ID
          ) LOOP
            d_volume_horaire_ref( d.id ).id                        := d.id;
            d_volume_horaire_ref( d.id ).service_referentiel_id    := d.service_referentiel_id;
            d_volume_horaire_ref( d.id ).heures                    := d.heures;
            d_volume_horaire_ref( d.id ).type_volume_horaire_id    := d.type_volume_horaire_id;
            d_volume_horaire_ref( d.id ).etat_volume_horaire_id    := d.etat_volume_horaire_id;
            d_volume_horaire_ref( d.id ).etat_volume_horaire_ordre := d.etat_volume_horaire_ordre;
          END LOOP;
        END;
    
      PROCEDURE POPULATE_VOLUME_HORAIRE( INTERVENANT_ID NUMERIC, d_volume_horaire OUT t_lst_volume_horaire ) IS
        BEGIN
          d_volume_horaire.delete;
    
          FOR d IN (
          SELECT
                 id,
                 service_id,
                 heures,
                 taux_service_du,
                 taux_service_compl,
                 fvh.type_volume_horaire_id,
                 fvh.etat_volume_horaire_id,
                 fvh.etat_volume_horaire_ordre
          FROM
               v_formule_volume_horaire fvh
          WHERE
              fvh.intervenant_id                = POPULATE_VOLUME_HORAIRE.INTERVENANT_ID
          ) LOOP
            d_volume_horaire( d.id ).id                        := d.id;
            d_volume_horaire( d.id ).service_id                := d.service_id;
            d_volume_horaire( d.id ).heures                    := d.heures;
            d_volume_horaire( d.id ).taux_service_du           := d.taux_service_du;
            d_volume_horaire( d.id ).taux_service_compl        := d.taux_service_compl;
            d_volume_horaire( d.id ).type_volume_horaire_id    := d.type_volume_horaire_id;
            d_volume_horaire( d.id ).etat_volume_horaire_id    := d.etat_volume_horaire_id;
            d_volume_horaire( d.id ).etat_volume_horaire_ordre := d.etat_volume_horaire_ordre;
          END LOOP;
        END;
    
    
      PROCEDURE POPULATE_TYPE_ETAT_VH( d_volume_horaire t_lst_volume_horaire, d_volume_horaire_ref t_lst_volume_horaire_ref, d_type_etat_vh OUT t_lst_type_etat_vh ) IS
        TYPE t_ordres IS TABLE OF NUMERIC INDEX BY PLS_INTEGER;
    
        ordres_found t_ordres;
        ordres_exists t_ordres;
        type_volume_horaire_id PLS_INTEGER;
        etat_volume_horaire_ordre PLS_INTEGER;
        id PLS_INTEGER;
        BEGIN
          d_type_etat_vh.delete;
    
          -- récupération des ID et ordres de volumes horaires
          FOR evh IN (
          SELECT   id, ordre
          FROM     etat_volume_horaire evh
          ORDER BY ordre
          ) LOOP
            ordres_exists( evh.ordre ) := evh.id;
          END LOOP;
    
          -- récupération des ordres maximum par type d'intervention
          id := d_volume_horaire.FIRST;
          LOOP EXIT WHEN id IS NULL;
            IF NOT ordres_found.EXISTS(d_volume_horaire(id).type_volume_horaire_id) THEN
              ordres_found( d_volume_horaire(id).type_volume_horaire_id ) := d_volume_horaire(id).etat_volume_horaire_ordre;
            ELSIF ordres_found( d_volume_horaire(id).type_volume_horaire_id ) < d_volume_horaire(id).etat_volume_horaire_ordre THEN
              ordres_found( d_volume_horaire(id).type_volume_horaire_id ) := d_volume_horaire(id).etat_volume_horaire_ordre;
            END IF;
            id := d_volume_horaire.NEXT(id);
          END LOOP;
    
          id := d_volume_horaire_ref.FIRST;
          LOOP EXIT WHEN id IS NULL;
            IF NOT ordres_found.EXISTS(d_volume_horaire_ref(id).type_volume_horaire_id) THEN
              ordres_found( d_volume_horaire_ref(id).type_volume_horaire_id ) := d_volume_horaire_ref(id).etat_volume_horaire_ordre;
            ELSIF ordres_found( d_volume_horaire_ref(id).type_volume_horaire_id ) < d_volume_horaire_ref(id).etat_volume_horaire_ordre THEN
              ordres_found( d_volume_horaire_ref(id).type_volume_horaire_id ) := d_volume_horaire_ref(id).etat_volume_horaire_ordre;
            END IF;
            id := d_volume_horaire_ref.NEXT(id);
          END LOOP;
    
          -- peuplement des t_lst_type_etat_vh
          type_volume_horaire_id := ordres_found.FIRST;
          LOOP EXIT WHEN type_volume_horaire_id IS NULL;
            etat_volume_horaire_ordre := ordres_exists.FIRST;
            LOOP EXIT WHEN etat_volume_horaire_ordre IS NULL;
              IF etat_volume_horaire_ordre <= ordres_found(type_volume_horaire_id) THEN
                d_type_etat_vh( type_volume_horaire_id + 100000 * etat_volume_horaire_ordre ).type_volume_horaire_id := type_volume_horaire_id;
                d_type_etat_vh( type_volume_horaire_id + 100000 * etat_volume_horaire_ordre ).etat_volume_horaire_id := ordres_exists( etat_volume_horaire_ordre );
              END IF;
              etat_volume_horaire_ordre := ordres_exists.NEXT(etat_volume_horaire_ordre);
            END LOOP;
    
            type_volume_horaire_id := ordres_found.NEXT(type_volume_horaire_id);
          END LOOP;
    
        END;
    
    
      PROCEDURE POPULATE( INTERVENANT_ID NUMERIC ) IS
        BEGIN
          OSE_FORMULE.INTERVENANT_ID := POPULATE.INTERVENANT_ID;
    
          POPULATE_INTERVENANT    ( INTERVENANT_ID, d_intervenant );
          IF d_intervenant.heures_service_statutaire IS NOT NULL THEN -- sinon rien n'est à faire!!
            POPULATE_SERVICE_REF        ( INTERVENANT_ID, d_service_ref         );
            POPULATE_SERVICE            ( INTERVENANT_ID, d_service             );
            POPULATE_VOLUME_HORAIRE_REF ( INTERVENANT_ID, d_all_volume_horaire_ref  );
            POPULATE_VOLUME_HORAIRE     ( INTERVENANT_ID, d_all_volume_horaire      );
            POPULATE_TYPE_ETAT_VH       ( d_all_volume_horaire, d_all_volume_horaire_ref, d_type_etat_vh );
          END IF;
        END;
    
    
      PROCEDURE POPULATE_FILTER( TYPE_VOLUME_HORAIRE_ID NUMERIC, ETAT_VOLUME_HORAIRE_ID NUMERIC ) IS
        EVH_ORDRE NUMERIC;
        id PLS_INTEGER;
        BEGIN
          d_volume_horaire.delete;
          d_volume_horaire_ref.delete;
    
          SELECT ordre INTO EVH_ORDRE FROM etat_volume_horaire WHERE ID = ETAT_VOLUME_HORAIRE_ID;
    
          id := d_all_volume_horaire.FIRST;
          LOOP EXIT WHEN id IS NULL;
            IF
            d_all_volume_horaire(id).type_volume_horaire_id = TYPE_VOLUME_HORAIRE_ID
            AND d_all_volume_horaire(id).etat_volume_horaire_ordre >= EVH_ORDRE
            THEN
              d_volume_horaire(id) := d_all_volume_horaire(id);
            END IF;
            id := d_all_volume_horaire.NEXT(id);
          END LOOP;
    
          id := d_all_volume_horaire_ref.FIRST;
          LOOP EXIT WHEN id IS NULL;
            IF
            d_all_volume_horaire_ref(id).type_volume_horaire_id = TYPE_VOLUME_HORAIRE_ID
            AND d_all_volume_horaire_ref(id).etat_volume_horaire_ordre >= EVH_ORDRE
            THEN
              d_volume_horaire_ref(id) := d_all_volume_horaire_ref(id);
            END IF;
            id := d_all_volume_horaire_ref.NEXT(id);
          END LOOP;
        END;
    
    
      PROCEDURE INIT_RESULTAT ( INTERVENANT_ID NUMERIC, TYPE_VOLUME_HORAIRE_ID NUMERIC, ETAT_VOLUME_HORAIRE_ID NUMERIC ) IS
        BEGIN
          d_resultat.intervenant_id         := INTERVENANT_ID;
          d_resultat.type_volume_horaire_id := TYPE_VOLUME_HORAIRE_ID;
          d_resultat.etat_volume_horaire_id := ETAT_VOLUME_HORAIRE_ID;
          d_resultat.service_du             := 0;
          d_resultat.solde                  := 0;
          d_resultat.sous_service           := 0;
          d_resultat.heures_compl           := 0;
          d_resultat.volume_horaire.delete;
          d_resultat.volume_horaire_ref.delete;
        END;
    
    
      PROCEDURE CALC_RESULTAT IS
        function_name VARCHAR2(30);
        package_name VARCHAR2(30);
        BEGIN
          package_name  := OSE_PARAMETRE.GET_FORMULE_PACKAGE_NAME;
          function_name := OSE_PARAMETRE.GET_FORMULE_FUNCTION_NAME;
    
          EXECUTE IMMEDIATE
          'BEGIN ' || package_name || '.' || function_name || '( :1, :2, :3 ); END;'
          USING
          d_resultat.intervenant_id, d_resultat.type_volume_horaire_id, d_resultat.etat_volume_horaire_id;
    
        END;
    
    
      PROCEDURE SAVE_RESULTAT IS
        res             t_resultat_hetd;
        res_ref         t_resultat_hetd_ref;
        res_service     t_lst_resultat_hetd;
        res_service_ref t_lst_resultat_hetd_ref;
        id              PLS_INTEGER;
        sid             PLS_INTEGER;
        fr              formule_resultat%rowtype;
        frs             formule_resultat_service%rowtype;
        frsr            formule_resultat_service_ref%rowtype;
        frvh            formule_resultat_vh%rowtype;
        frvhr           formule_resultat_vh_ref%rowtype;
        dev_null        PLS_INTEGER;
        BEGIN
          -- Calcul des données pour les services et le résultat global
          fr.service_fi := 0;
          fr.service_fa := 0;
          fr.service_fc := 0;
          fr.service_referentiel := 0;
          fr.heures_compl_fi := 0;
          fr.heures_compl_fa := 0;
          fr.heures_compl_fc := 0;
          fr.heures_compl_fc_majorees := 0;
          fr.heures_compl_referentiel := 0;
    
          id := d_resultat.volume_horaire.FIRST;
          LOOP EXIT WHEN id IS NULL;
            sid := d_volume_horaire(id).service_id;
            IF NOT res_service.exists(sid) THEN res_service(sid).service_fi := 0; END IF;
    
            res_service(sid).service_fi               := res_service(sid).service_fi               + d_resultat.volume_horaire(id).service_fi;
            res_service(sid).service_fa               := res_service(sid).service_fa               + d_resultat.volume_horaire(id).service_fa;
            res_service(sid).service_fc               := res_service(sid).service_fc               + d_resultat.volume_horaire(id).service_fc;
            res_service(sid).heures_compl_fi          := res_service(sid).heures_compl_fi          + d_resultat.volume_horaire(id).heures_compl_fi;
            res_service(sid).heures_compl_fa          := res_service(sid).heures_compl_fa          + d_resultat.volume_horaire(id).heures_compl_fa;
            res_service(sid).heures_compl_fc          := res_service(sid).heures_compl_fc          + d_resultat.volume_horaire(id).heures_compl_fc;
            res_service(sid).heures_compl_fc_majorees := res_service(sid).heures_compl_fc_majorees + d_resultat.volume_horaire(id).heures_compl_fc_majorees;
    
            fr.service_fi                             := fr.service_fi                             + d_resultat.volume_horaire(id).service_fi;
            fr.service_fa                             := fr.service_fa                             + d_resultat.volume_horaire(id).service_fa;
            fr.service_fc                             := fr.service_fc                             + d_resultat.volume_horaire(id).service_fc;
            fr.heures_compl_fi                        := fr.heures_compl_fi                        + d_resultat.volume_horaire(id).heures_compl_fi;
            fr.heures_compl_fa                        := fr.heures_compl_fa                        + d_resultat.volume_horaire(id).heures_compl_fa;
            fr.heures_compl_fc                        := fr.heures_compl_fc                        + d_resultat.volume_horaire(id).heures_compl_fc;
            fr.heures_compl_fc_majorees               := fr.heures_compl_fc_majorees               + d_resultat.volume_horaire(id).heures_compl_fc_majorees;
            id := d_resultat.volume_horaire.NEXT(id);
          END LOOP;
    
          id := d_resultat.volume_horaire_ref.FIRST;
          LOOP EXIT WHEN id IS NULL;
            sid := d_volume_horaire_ref(id).service_referentiel_id;
            IF NOT res_service_ref.exists(sid) THEN res_service_ref(sid).service_referentiel := 0; END IF;
    
            res_service_ref(sid).service_referentiel      := res_service_ref(sid).service_referentiel      + d_resultat.volume_horaire_ref(id).service_referentiel;
            res_service_ref(sid).heures_compl_referentiel := res_service_ref(sid).heures_compl_referentiel + d_resultat.volume_horaire_ref(id).heures_compl_referentiel;
    
            fr.service_referentiel                        := fr.service_referentiel                        + d_resultat.volume_horaire_ref(id).service_referentiel;
            fr.heures_compl_referentiel                   := fr.heures_compl_referentiel                   + d_resultat.volume_horaire_ref(id).heures_compl_referentiel;
            id := d_resultat.volume_horaire_ref.NEXT(id);
          END LOOP;
    
          -- Sauvegarde du résultat global
          fr.id                       := NULL;
          fr.intervenant_id           := d_resultat.intervenant_id;
          fr.type_volume_horaire_id   := d_resultat.type_volume_horaire_id;
          fr.etat_volume_horaire_id   := d_resultat.etat_volume_horaire_id;
          fr.service_du               := d_resultat.service_du;
          fr.total                    := fr.service_fi
                                         + fr.service_fa
                                         + fr.service_fc
                                         + fr.service_referentiel
                                         + fr.heures_compl_fi
                                         + fr.heures_compl_fa
                                         + fr.heures_compl_fc
                                         + fr.heures_compl_fc_majorees
                                         + fr.heures_compl_referentiel;
          fr.solde                    := d_resultat.solde;
          fr.sous_service             := d_resultat.sous_service;
          fr.heures_compl             := d_resultat.heures_compl;
          fr.id := OSE_FORMULE.ENREGISTRER_RESULTAT( fr );
    
          -- sauvegarde des services
          id := res_service.FIRST;
          LOOP EXIT WHEN id IS NULL;
            frs.id                       := NULL;
            frs.formule_resultat_id      := fr.id;
            frs.service_id               := id;
            frs.service_fi               := res_service(id).service_fi;
            frs.service_fa               := res_service(id).service_fa;
            frs.service_fc               := res_service(id).service_fc;
            frs.heures_compl_fi          := res_service(id).heures_compl_fi;
            frs.heures_compl_fa          := res_service(id).heures_compl_fa;
            frs.heures_compl_fc          := res_service(id).heures_compl_fc;
            frs.heures_compl_fc_majorees := res_service(id).heures_compl_fc_majorees;
            frs.total                    := frs.service_fi
                                            + frs.service_fa
                                            + frs.service_fc
                                            + frs.heures_compl_fi
                                            + frs.heures_compl_fa
                                            + frs.heures_compl_fc
                                            + frs.heures_compl_fc_majorees;
            dev_null := OSE_FORMULE.ENREGISTRER_RESULTAT_SERVICE( frs );
            id := res_service.NEXT(id);
          END LOOP;
    
          -- sauvegarde des services référentiels
          id := res_service_ref.FIRST;
          LOOP EXIT WHEN id IS NULL;
            frsr.id                       := NULL;
            frsr.formule_resultat_id      := fr.id;
            frsr.service_referentiel_id   := id;
            frsr.service_referentiel      := res_service_ref(id).service_referentiel;
            frsr.heures_compl_referentiel := res_service_ref(id).heures_compl_referentiel;
            frsr.total                    := res_service_ref(id).service_referentiel
                                             + res_service_ref(id).heures_compl_referentiel;
            dev_null := OSE_FORMULE.ENREGISTRER_RESULTAT_SERV_REF( frsr );
            id := res_service_ref.NEXT(id);
          END LOOP;
    
          -- sauvegarde des volumes horaires
          id := d_resultat.volume_horaire.FIRST;
          LOOP EXIT WHEN id IS NULL;
            frvh.id                        := NULL;
            frvh.formule_resultat_id       := fr.id;
            frvh.volume_horaire_id         := id;
            frvh.service_fi                := d_resultat.volume_horaire(id).service_fi;
            frvh.service_fa                := d_resultat.volume_horaire(id).service_fa;
            frvh.service_fc                := d_resultat.volume_horaire(id).service_fc;
            frvh.heures_compl_fi           := d_resultat.volume_horaire(id).heures_compl_fi;
            frvh.heures_compl_fa           := d_resultat.volume_horaire(id).heures_compl_fa;
            frvh.heures_compl_fc           := d_resultat.volume_horaire(id).heures_compl_fc;
            frvh.heures_compl_fc_majorees  := d_resultat.volume_horaire(id).heures_compl_fc_majorees;
            frvh.total                     := frvh.service_fi
                                              + frvh.service_fa
                                              + frvh.service_fc
                                              + frvh.heures_compl_fi
                                              + frvh.heures_compl_fa
                                              + frvh.heures_compl_fc
                                              + frvh.heures_compl_fc_majorees;
            dev_null := OSE_FORMULE.ENREGISTRER_RESULTAT_VH( frvh );
            id := d_resultat.volume_horaire.NEXT(id);
          END LOOP;
    
          -- sauvegarde des volumes horaires référentiels
          id := d_resultat.volume_horaire_ref.FIRST;
          LOOP EXIT WHEN id IS NULL;
            frvhr.id                       := NULL;
            frvhr.formule_resultat_id      := fr.id;
            frvhr.volume_horaire_ref_id    := id;
            frvhr.service_referentiel      := d_resultat.volume_horaire_ref(id).service_referentiel;
            frvhr.heures_compl_referentiel := d_resultat.volume_horaire_ref(id).heures_compl_referentiel;
            frvhr.total                    := frvhr.service_referentiel
                                              + frvhr.heures_compl_referentiel;
            dev_null := OSE_FORMULE.ENREGISTRER_RESULTAT_VH_REF( frvhr );
            id := d_resultat.volume_horaire_ref.NEXT(id);
          END LOOP;
        END;
    
      PROCEDURE DEBUG_INTERVENANT IS
        BEGIN
          ose_test.echo('d_intervenant');
          ose_test.echo('      .structure_id                   = ' || d_intervenant.structure_id || ' (' || ose_test.get_structure_by_id(d_intervenant.structure_id).libelle_court || ')' );
          ose_test.echo('      .heures_service_statutaire      = ' || d_intervenant.heures_service_statutaire );
          ose_test.echo('      .heures_service_modifie         = ' || d_intervenant.heures_service_modifie );
          ose_test.echo('      .depassement_service_du_sans_hc = ' || d_intervenant.depassement_service_du_sans_hc );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_SERVICE( SERVICE_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_service(' || SERVICE_ID || ')' );
          ose_test.echo('      .taux_fi                   = ' || d_service(SERVICE_ID).taux_fi );
          ose_test.echo('      .taux_fa                   = ' || d_service(SERVICE_ID).taux_fa );
          ose_test.echo('      .taux_fc                   = ' || d_service(SERVICE_ID).taux_fc );
          ose_test.echo('      .ponderation_service_du    = ' || d_service(SERVICE_ID).ponderation_service_du );
          ose_test.echo('      .ponderation_service_compl = ' || d_service(SERVICE_ID).ponderation_service_compl );
          ose_test.echo('      .structure_aff_id          = ' || d_service(SERVICE_ID).structure_aff_id || ' (' || ose_test.get_structure_by_id(d_service(SERVICE_ID).structure_aff_id).libelle_court || ')' );
          ose_test.echo('      .structure_ens_id          = ' || d_service(SERVICE_ID).structure_ens_id || ' (' || CASE WHEN d_service(SERVICE_ID).structure_ens_id IS NOT NULL THEN ose_test.get_structure_by_id(d_service(SERVICE_ID).structure_ens_id).libelle_court ELSE 'null' END || ')' );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_SERVICE_REF( SERVICE_REF_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_service_ref(' || SERVICE_REF_ID || ')' );
          ose_test.echo('      .structure_id          = ' || d_service_ref(SERVICE_REF_ID).structure_id || ' (' || ose_test.get_structure_by_id(d_service_ref(SERVICE_REF_ID).structure_id).libelle_court || ')' );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_VOLUME_HORAIRE( VH_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_volume_horaire(' || VH_ID || ')' );
          ose_test.echo('      .service_id                = ' || d_volume_horaire(VH_ID).service_id );
          ose_test.echo('      .type_volume_horaire_id    = ' || d_volume_horaire(VH_ID).type_volume_horaire_id );
          ose_test.echo('      .etat_volume_horaire_id    = ' || d_volume_horaire(VH_ID).etat_volume_horaire_id );
          ose_test.echo('      .etat_volume_horaire_ordre = ' || d_volume_horaire(VH_ID).etat_volume_horaire_ordre );
          ose_test.echo('      .heures                    = ' || d_volume_horaire(VH_ID).heures );
          ose_test.echo('      .taux_service_du           = ' || d_volume_horaire(VH_ID).taux_service_du );
          ose_test.echo('      .taux_service_compl        = ' || d_volume_horaire(VH_ID).taux_service_compl );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_VOLUME_HORAIRE_REF( VH_REF_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_volume_horaire_ref(' || VH_REF_ID || ')' );
          ose_test.echo('      .service_referentiel_id    = ' || d_volume_horaire_ref(VH_REF_ID).service_referentiel_id );
          ose_test.echo('      .type_volume_horaire_id    = ' || d_volume_horaire_ref(VH_REF_ID).type_volume_horaire_id );
          ose_test.echo('      .etat_volume_horaire_id    = ' || d_volume_horaire_ref(VH_REF_ID).etat_volume_horaire_id );
          ose_test.echo('      .etat_volume_horaire_ordre = ' || d_volume_horaire_ref(VH_REF_ID).etat_volume_horaire_ordre );
          ose_test.echo('      .heures                    = ' || d_volume_horaire_ref(VH_REF_ID).heures );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_RESULTAT IS
        BEGIN
          ose_test.echo('d_resultat' );
          ose_test.echo('      .service_du   = ' || d_resultat.service_du );
          ose_test.echo('      .solde        = ' || d_resultat.solde );
          ose_test.echo('      .sous_service = ' || d_resultat.sous_service );
          ose_test.echo('      .heures_compl = ' || d_resultat.heures_compl );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_RESULTAT_VH( VH_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_resultat.volume_horaire(' || VH_ID || ')' );
          ose_test.echo('      .service_fi                = ' || d_resultat.volume_horaire(VH_ID).service_fi );
          ose_test.echo('      .service_fa                = ' || d_resultat.volume_horaire(VH_ID).service_fa );
          ose_test.echo('      .service_fc                = ' || d_resultat.volume_horaire(VH_ID).service_fc );
          ose_test.echo('      .heures_compl_fi           = ' || d_resultat.volume_horaire(VH_ID).heures_compl_fi );
          ose_test.echo('      .heures_compl_fa           = ' || d_resultat.volume_horaire(VH_ID).heures_compl_fa );
          ose_test.echo('      .heures_compl_fc           = ' || d_resultat.volume_horaire(VH_ID).heures_compl_fc );
          ose_test.echo('      .heures_compl_fc_majorees  = ' || d_resultat.volume_horaire(VH_ID).heures_compl_fc_majorees );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_RESULTAT_VH_REF( VH_REF_ID PLS_INTEGER ) IS
        BEGIN
          ose_test.echo('d_resultat.volume_horaire_ref(' || VH_REF_ID || ')' );
          ose_test.echo('      .service_referentiel                = ' || d_resultat.volume_horaire_ref(VH_REF_ID).service_referentiel );
          ose_test.echo('      .heures_compl_referentiel           = ' || d_resultat.volume_horaire_ref(VH_REF_ID).heures_compl_referentiel );
          ose_test.echo('');
        END;
    
      PROCEDURE DEBUG_ALL( INTERVENANT_ID NUMERIC, TYPE_VOLUME_HORAIRE_ID NUMERIC, ETAT_VOLUME_HORAIRE_ID NUMERIC ) IS
        id  PLS_INTEGER;
        i   intervenant%rowtype;
        a   annee%rowtype;
        tvh type_volume_horaire%rowtype;
        evh etat_volume_horaire%rowtype;
        BEGIN
          IF GET_DEBUG_LEVEL >= 1 THEN
            SELECT * INTO   i FROM intervenant         WHERE id = INTERVENANT_ID;
            SELECT * INTO   a FROM annee               WHERE id = i.annee_id;
            SELECT * INTO tvh FROM type_volume_horaire WHERE id = TYPE_VOLUME_HORAIRE_ID;
            SELECT * INTO evh FROM etat_volume_horaire WHERE id = ETAT_VOLUME_HORAIRE_ID;
    
            ose_test.echo('');
            ose_test.echo('---------------------------------------------------------------------');
            ose_test.echo('Intervenant: ' || INTERVENANT_ID || ' : ' || i.prenom || ' ' || i.nom_usuel || ' (n° harp. ' || i.source_code || ')' );
            ose_test.echo(
                'Année: ' || a.libelle
                || ', type ' || tvh.libelle
                || ', état ' || evh.libelle
            );
            ose_test.echo('');
          END IF;
          IF GET_DEBUG_LEVEL >= 2 THEN
            DEBUG_INTERVENANT;
          END IF;
    
          IF GET_DEBUG_LEVEL >= 5 THEN
            id := d_service.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_SERVICE( id );
              id := d_service.NEXT(id);
            END LOOP;
    
            id := d_service_ref.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_SERVICE_REF( id );
              id := d_service_ref.NEXT(id);
            END LOOP;
          END IF;
    
          IF GET_DEBUG_LEVEL >= 6 THEN
            id := d_volume_horaire.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_VOLUME_HORAIRE( id );
              id := d_volume_horaire.NEXT(id);
            END LOOP;
    
            id := d_volume_horaire_ref.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_VOLUME_HORAIRE_REF( id );
              id := d_volume_horaire_ref.NEXT(id);
            END LOOP;
          END IF;
    
          IF GET_DEBUG_LEVEL >= 3 THEN
            DEBUG_RESULTAT;
          END IF;
    
          IF GET_DEBUG_LEVEL >= 4 THEN
            id := d_resultat.volume_horaire.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_RESULTAT_VH( id );
              id := d_resultat.volume_horaire.NEXT(id);
            END LOOP;
    
            id := d_resultat.volume_horaire_ref.FIRST;
            LOOP EXIT WHEN id IS NULL;
              DEBUG_RESULTAT_VH_REF( id );
              id := d_resultat.volume_horaire_ref.NEXT(id);
            END LOOP;
          END IF;
        END;
    
    
    
      PROCEDURE CALCULER( INTERVENANT_ID NUMERIC ) IS
        id PLS_INTEGER;
        found BOOLEAN;
        function_name VARCHAR2(30);
        package_name VARCHAR2(30);
        BEGIN
          package_name  := OSE_PARAMETRE.GET_FORMULE_PACKAGE_NAME;
          function_name := OSE_PARAMETRE.GET_FORMULE_FUNCTION_NAME;
    
          -- détection de suppression des lignes de résultat obsolètes
          UPDATE formule_resultat SET TO_DELETE = 1 WHERE intervenant_id = CALCULER.INTERVENANT_ID;
          UPDATE FORMULE_RESULTAT_SERVICE_REF SET TO_DELETE = 1 WHERE formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          UPDATE FORMULE_RESULTAT_SERVICE     SET TO_DELETE = 1 WHERE formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          UPDATE FORMULE_RESULTAT_VH_REF      SET TO_DELETE = 1 WHERE formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          UPDATE FORMULE_RESULTAT_VH          SET TO_DELETE = 1 WHERE formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
    
          POPULATE( INTERVENANT_ID );
          IF d_intervenant.heures_service_statutaire IS NOT NULL THEN -- sinon rien n'est à faire!!
            -- lancement du calcul sur les nouvelles lignes ou sur les lignes existantes
            id := d_type_etat_vh.FIRST;
            LOOP EXIT WHEN id IS NULL;
              POPULATE_FILTER( d_type_etat_vh(id).type_volume_horaire_id, d_type_etat_vh(id).etat_volume_horaire_id );
              DEBUG_ALL( INTERVENANT_ID, d_type_etat_vh(id).type_volume_horaire_id, d_type_etat_vh(id).etat_volume_horaire_id );
              OSE_FORMULE.INIT_RESULTAT( INTERVENANT_ID, d_type_etat_vh(id).type_volume_horaire_id, d_type_etat_vh(id).etat_volume_horaire_id );
              OSE_FORMULE.CALC_RESULTAT;
              OSE_FORMULE.SAVE_RESULTAT;
              id := d_type_etat_vh.NEXT(id);
            END LOOP;
          END IF;
    
          -- suppression des données devenues obsolètes
          OSE_EVENT.ON_BEFORE_FORMULE_RES_DELETE( CALCULER.INTERVENANT_ID );
    
          UPDATE FORMULE_RESULTAT_SERVICE SET
                                              to_delete = 0,
                                              service_fi = 0,
                                              service_fa = 0,
                                              service_fc = 0,
                                              heures_compl_fi = 0,
                                              heures_compl_fa = 0,
                                              heures_compl_fc = 0,
                                              heures_compl_fc_majorees = 0,
                                              total = 0
          WHERE
              TO_DELETE = 1
            AND 0 < (SELECT COUNT(*) FROM mise_en_paiement mep WHERE mep.formule_res_service_id = FORMULE_RESULTAT_SERVICE.id)
            AND formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
    
          DELETE FROM FORMULE_RESULTAT_SERVICE_REF WHERE TO_DELETE = 1 AND formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          DELETE FROM FORMULE_RESULTAT_SERVICE WHERE TO_DELETE = 1 AND formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          DELETE FROM FORMULE_RESULTAT_VH_REF WHERE TO_DELETE = 1 AND formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          DELETE FROM FORMULE_RESULTAT_VH WHERE TO_DELETE = 1 AND formule_resultat_id IN (SELECT id FROM formule_resultat WHERE intervenant_id = CALCULER.INTERVENANT_ID);
          DELETE FROM FORMULE_RESULTAT WHERE TO_DELETE = 1 AND intervenant_id = CALCULER.INTERVENANT_ID;
    
          OSE_EVENT.ON_AFTER_FORMULE_CALC( CALCULER.INTERVENANT_ID );
        END;
    
    
    
      PROCEDURE CALCULER_TBL( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        intervenant_id NUMERIC;
        TYPE r_cursor IS REF CURSOR;
        diff_cur r_cursor;
        BEGIN
          OPEN diff_cur FOR 'WITH interv AS (SELECT id intervenant_id, intervenant.* FROM intervenant)
        SELECT intervenant_id FROM interv WHERE ' || unicaen_tbl.PARAMS_TO_CONDS( params );
          LOOP
            FETCH diff_cur INTO intervenant_id; EXIT WHEN diff_cur%NOTFOUND;
            BEGIN
              CALCULER( intervenant_id );
            END;
          END LOOP;
          CLOSE diff_cur;
        END;
    
    
    
      FUNCTION GET_INTERVENANT RETURN NUMERIC IS
        BEGIN
          RETURN OSE_FORMULE.INTERVENANT_ID;
        END;
    
      PROCEDURE SET_INTERVENANT( INTERVENANT_ID NUMERIC DEFAULT NULL) IS
        BEGIN
          IF SET_INTERVENANT.INTERVENANT_ID = -1 THEN
            OSE_FORMULE.INTERVENANT_ID := NULL;
          ELSE
            OSE_FORMULE.INTERVENANT_ID := SET_INTERVENANT.INTERVENANT_ID;
          END IF;
        END;
    
      FUNCTION MATCH_INTERVENANT(INTERVENANT_ID NUMERIC DEFAULT NULL) RETURN NUMERIC IS
        BEGIN
          IF OSE_FORMULE.INTERVENANT_ID IS NULL OR OSE_FORMULE.INTERVENANT_ID = MATCH_INTERVENANT.INTERVENANT_ID THEN
            RETURN 1;
          ELSE
            RETURN 0;
          END IF;
        END;
    END OSE_FORMULE;
    /
    
    
    
    CREATE OR REPLACE PACKAGE BODY UNICAEN_TBL AS
    
      FUNCTION MAKE_PARAMS(
        c1 VARCHAR2 DEFAULT NULL, v1 VARCHAR2 DEFAULT NULL,
        c2 VARCHAR2 DEFAULT NULL, v2 VARCHAR2 DEFAULT NULL,
        c3 VARCHAR2 DEFAULT NULL, v3 VARCHAR2 DEFAULT NULL,
        c4 VARCHAR2 DEFAULT NULL, v4 VARCHAR2 DEFAULT NULL,
        c5 VARCHAR2 DEFAULT NULL, v5 VARCHAR2 DEFAULT NULL,
        sqlcond CLOB DEFAULT NULL
      ) RETURN t_params IS
        params t_params;
        BEGIN
          IF c1 IS NOT NULL THEN
            params.c1 := c1;
            params.v1 := v1;
          END IF;
          IF c2 IS NOT NULL THEN
            params.c2 := c2;
            params.v2 := v2;
          END IF;
          IF c3 IS NOT NULL THEN
            params.c3 := c3;
            params.v3 := v3;
          END IF;
          IF c4 IS NOT NULL THEN
            params.c4 := c4;
            params.v4 := v4;
          END IF;
          IF c5 IS NOT NULL THEN
            params.c5 := c5;
            params.v5 := v5;
          END IF;
          params.sqlcond := sqlcond;
    
          RETURN params;
        END;
    
    
    
      PROCEDURE DEMANDE_CALCUL( TBL_NAME VARCHAR2 ) IS
        p t_params;
        BEGIN
          DEMANDE_CALCUL( tbl_name, p );
        END;
    
    
    
      PROCEDURE DEMANDE_CALCUL( TBL_NAME VARCHAR2, CONDS CLOB ) IS
        p t_params;
        BEGIN
          p.sqlcond := CONDS;
          DEMANDE_CALCUL( tbl_name, p );
        END;
    
    
    
      PROCEDURE DEMANDE_CALCUL( TBL_NAME VARCHAR2, PARAMS t_params ) IS
        BEGIN
          INSERT INTO tbl_dems (
              ID,
              TBL_NAME,
              c1, v1,
              c2, v2,
              c3, v3,
              c4, v4,
              c5, v5,
              sqlcond
              ) VALUES (
                           TBL_DEMS_ID_SEQ.NEXTVAL,
                           TBL_NAME,
                           PARAMS.c1, PARAMS.v1,
                           PARAMS.c2, PARAMS.v2,
                           PARAMS.c3, PARAMS.v3,
                           PARAMS.c4, PARAMS.v4,
                           PARAMS.c5, PARAMS.v5,
                           PARAMS.sqlcond
                           );
        END;
    
    
    
      FUNCTION PARAMS_FROM_DEMS( TBL_NAME VARCHAR2 ) RETURN t_params IS
        res t_params;
        conds CLOB := '';
        cond CLOB;
        BEGIN
          FOR d IN (
          SELECT *
          FROM   tbl_dems
          WHERE  tbl_name = PARAMS_FROM_DEMS.TBL_NAME
          )
          LOOP
    
            cond := '';
    
            IF d.c1 IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              IF d.v1 IS NULL THEN
                cond := cond || d.c1 || ' IS NULL';
              ELSE
                cond := cond || d.c1 || '=' || d.v1;
              END IF;
            END IF;
    
            IF d.c2 IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              IF d.v2 IS NULL THEN
                cond := cond || d.c2 || ' IS NULL';
              ELSE
                cond := cond || d.c2 || '=' || d.v2;
              END IF;
            END IF;
    
            IF d.c3 IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              IF d.v3 IS NULL THEN
                cond := cond || d.c3 || ' IS NULL';
              ELSE
                cond := cond || d.c3 || '=' || d.v3;
              END IF;
            END IF;
    
            IF d.c4 IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              IF d.v4 IS NULL THEN
                cond := cond || d.c4 || ' IS NULL';
              ELSE
                cond := cond || d.c4 || '=' || d.v4;
              END IF;
            END IF;
    
            IF d.c5 IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              IF d.v5 IS NULL THEN
                cond := cond || d.c5 || ' IS NULL';
              ELSE
                cond := cond || d.c5 || '=' || d.v5;
              END IF;
            END IF;
    
            IF d.sqlcond IS NOT NULL THEN
              IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
              cond := cond || '(' || d.sqlcond || ')';
            END IF;
    
            IF conds IS NOT NULL THEN
              conds := conds || ' OR ';
            END IF;
            conds := conds || '(' || cond || ')';
          END LOOP;
    
          res.sqlcond := conds;
          DELETE FROM tbl_dems WHERE tbl_name = PARAMS_FROM_DEMS.TBL_NAME;
          RETURN res;
        END;
    
    
    
      FUNCTION PARAMS_TO_CONDS ( PARAMS UNICAEN_TBL.T_PARAMS ) RETURN CLOB IS
        cond CLOB;
        BEGIN
          IF params.c1 IS NOT NULL THEN
            IF params.v1 IS NULL THEN
              cond := cond || params.c1 || ' IS NULL';
            ELSE
              cond := cond || params.c1 || '=' || params.v1;
            END IF;
          END IF;
    
          IF params.c2 IS NOT NULL THEN
            IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
            IF params.v2 IS NULL THEN
              cond := cond || params.c2 || ' IS NULL';
            ELSE
              cond := cond || params.c2 || '=' || params.v2;
            END IF;
          END IF;
    
          IF params.c3 IS NOT NULL THEN
            IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
            IF params.v3 IS NULL THEN
              cond := cond || params.c3 || ' IS NULL';
            ELSE
              cond := cond || params.c3 || '=' || params.v3;
            END IF;
          END IF;
    
          IF params.c4 IS NOT NULL THEN
            IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
            IF params.v4 IS NULL THEN
              cond := cond || params.c4 || ' IS NULL';
            ELSE
              cond := cond || params.c4 || '=' || params.v4;
            END IF;
          END IF;
    
          IF params.c5 IS NOT NULL THEN
            IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
            IF params.v5 IS NULL THEN
              cond := cond || params.c5 || ' IS NULL';
            ELSE
              cond := cond || params.c5 || '=' || params.v5;
            END IF;
          END IF;
    
          IF params.sqlcond IS NOT NULL THEN
            IF cond IS NOT NULL THEN cond := cond || ' AND '; END IF;
            cond := cond || '(' || params.sqlcond || ')';
          END IF;
    
          IF cond IS NULL THEN cond := '1=1'; END IF;
    
          RETURN cond;
        END;
    
    
    
      PROCEDURE CALCULER( TBL_NAME VARCHAR2 ) IS
        p t_params;
        BEGIN
          ANNULER_DEMANDES( TBL_NAME );
          CALCULER(TBL_NAME, p);
        END;
    
    
    
      PROCEDURE CALCULER( TBL_NAME VARCHAR2, CONDS CLOB ) IS
        p t_params;
        BEGIN
          p.sqlcond := CONDS;
          CALCULER(TBL_NAME, p);
        END;
    
    
    
      PROCEDURE CALCULER( TBL_NAME VARCHAR2, PARAMS t_params ) IS
        calcul_proc varchar2(30);
        BEGIN
          IF NOT UNICAEN_TBL.ACTIV_CALCULS THEN RETURN; END IF;
    
          SELECT custom_calcul_proc INTO calcul_proc FROM tbl WHERE tbl_name = CALCULER.TBL_NAME;
    
          UNICAEN_TBL.CALCUL_PROC_PARAMS := PARAMS;
          IF calcul_proc IS NOT NULL THEN
            EXECUTE IMMEDIATE
            'BEGIN ' || calcul_proc || '(UNICAEN_TBL.CALCUL_PROC_PARAMS); END;'
            ;
          ELSE
            EXECUTE IMMEDIATE
            'BEGIN UNICAEN_TBL.C_' || TBL_NAME || '(UNICAEN_TBL.CALCUL_PROC_PARAMS); END;'
            ;
          END IF;
    
        END;
    
    
    
      PROCEDURE ANNULER_DEMANDES IS
        BEGIN
          DELETE FROM tbl_dems;
        END;
    
    
    
      PROCEDURE ANNULER_DEMANDES( TBL_NAME VARCHAR2 ) IS
        BEGIN
          DELETE FROM tbl_dems WHERE tbl_name = ANNULER_DEMANDES.tbl_name;
        END;
    
    
    
      FUNCTION HAS_DEMANDES RETURN BOOLEAN IS
        has_dems NUMERIC;
        BEGIN
          SELECT count(*) INTO has_dems from tbl_dems where rownum = 1;
    
          RETURN has_dems = 1;
        END;
    
    
    
      PROCEDURE CALCULER_DEMANDES IS
        dems t_params;
        BEGIN
          FOR d IN (
          SELECT DISTINCT tbl_name FROM tbl_dems
          ) LOOP
            dems := PARAMS_FROM_DEMS( d.tbl_name );
            calculer( d.tbl_name, dems );
          END LOOP;
    
          IF HAS_DEMANDES THEN -- pour les boucles !!
            CALCULER_DEMANDES;
          END IF;
        END;
    
    
    
      -- AUTOMATIC GENERATION --
    
      PROCEDURE C_AGREMENT( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_AGREMENT SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_AGREMENT t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH i_s AS (
              SELECT DISTINCT
                fr.intervenant_id,
                ep.structure_id
              FROM
                formule_resultat fr
                JOIN type_volume_horaire  tvh ON tvh.code = ''PREVU'' AND tvh.id = fr.type_volume_horaire_id
                JOIN etat_volume_horaire  evh ON evh.code = ''valide'' AND evh.id = fr.etat_volume_horaire_id
    
                JOIN formule_resultat_service frs ON frs.formule_resultat_id = fr.id
                JOIN service s ON s.id = frs.service_id
                JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id
              WHERE
                frs.total > 0
            )
            SELECT
              i.annee_id              annee_id,
              tas.type_agrement_id    type_agrement_id,
              i.id                    intervenant_id,
              null                    structure_id,
              tas.obligatoire         obligatoire,
              a.id                    agrement_id
            FROM
              type_agrement                  ta
              JOIN type_agrement_statut      tas ON tas.type_agrement_id = ta.id
                                                AND tas.histo_destruction IS NULL
    
              JOIN intervenant                 i ON i.histo_destruction IS NULL
                                                AND (tas.premier_recrutement IS NULL OR NVL(i.premier_recrutement,0) = tas.premier_recrutement)
                                                AND i.statut_id = tas.statut_intervenant_id
    
              LEFT JOIN agrement               a ON a.type_agrement_id = ta.id
                                                AND a.intervenant_id = i.id
                                                AND a.histo_destruction IS NULL
            WHERE
              ta.code = ''CONSEIL_ACADEMIQUE''
    
            UNION ALL
    
            SELECT
              i.annee_id              annee_id,
              tas.type_agrement_id    type_agrement_id,
              i.id                    intervenant_id,
              i_s.structure_id        structure_id,
              tas.obligatoire         obligatoire,
              a.id                    agrement_id
            FROM
              type_agrement                   ta
              JOIN type_agrement_statut      tas ON tas.type_agrement_id = ta.id
                                                AND tas.histo_destruction IS NULL
    
              JOIN intervenant                 i ON i.histo_destruction IS NULL
                                                AND (tas.premier_recrutement IS NULL OR NVL(i.premier_recrutement,0) = tas.premier_recrutement)
                                                AND i.statut_id = tas.statut_intervenant_id
    
              JOIN                           i_s ON i_s.intervenant_id = i.id
    
              LEFT JOIN agrement               a ON a.type_agrement_id = ta.id
                                                AND a.intervenant_id = i.id
                                                AND a.structure_id = i_s.structure_id
                                                AND a.histo_destruction IS NULL
            WHERE
              ta.code = ''CONSEIL_RESTREINT'') tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.TYPE_AGREMENT_ID = v.TYPE_AGREMENT_ID
            AND t.INTERVENANT_ID   = v.INTERVENANT_ID
            AND COALESCE(t.STRUCTURE_ID,0) = COALESCE(v.STRUCTURE_ID,0)
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID         = v.ANNEE_ID,
          OBLIGATOIRE      = v.OBLIGATOIRE,
          AGREMENT_ID      = v.AGREMENT_ID,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          TYPE_AGREMENT_ID,
          INTERVENANT_ID,
          STRUCTURE_ID,
          OBLIGATOIRE,
          AGREMENT_ID,
          TO_DELETE
    
        ) VALUES (
    
          TBL_AGREMENT_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.TYPE_AGREMENT_ID,
          v.INTERVENANT_ID,
          v.STRUCTURE_ID,
          v.OBLIGATOIRE,
          v.AGREMENT_ID,
          0
    
        );
    
        DELETE TBL_AGREMENT WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_CHARGENS( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_CHARGENS SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_CHARGENS t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH t AS (
            SELECT
              n.annee_id                        annee_id,
              n.noeud_id                        noeud_id,
              sn.scenario_id                    scenario_id,
              sne.type_heures_id                type_heures_id,
              ti.id                             type_intervention_id,
    
              n.element_pedagogique_id          element_pedagogique_id,
              n.element_pedagogique_etape_id    etape_id,
              sne.etape_id                      etape_ens_id,
              n.structure_id                    structure_id,
              n.groupe_type_formation_id        groupe_type_formation_id,
    
              vhe.heures                        heures,
              vhe.heures * ti.taux_hetd_service hetd,
    
              GREATEST(COALESCE(sns.ouverture, 1),1)                                           ouverture,
              GREATEST(COALESCE(sns.dedoublement, snsetp.dedoublement, csdd.dedoublement,1),1) dedoublement,
              COALESCE(sns.assiduite,1)                                                        assiduite,
              sne.effectif*COALESCE(sns.assiduite,1)                                           effectif,
    
              SUM(sne.effectif*COALESCE(sns.assiduite,1)) OVER (PARTITION BY n.noeud_id, sn.scenario_id, ti.id) t_effectif
    
            FROM
                        scenario_noeud_effectif    sne
                   JOIN etape                        e ON e.id = sne.etape_id
                                                      AND e.histo_destruction IS NULL
    
                   JOIN scenario_noeud              sn ON sn.id = sne.scenario_noeud_id
                                                      AND sn.histo_destruction IS NULL
    
                   JOIN tbl_noeud                       n ON n.noeud_id = sn.noeud_id
    
                   JOIN volume_horaire_ens         vhe ON vhe.element_pedagogique_id = n.element_pedagogique_id
                                                      AND vhe.histo_destruction IS NULL
                                                      AND vhe.heures > 0
    
                   JOIN type_intervention           ti ON ti.id = vhe.type_intervention_id
    
              LEFT JOIN tbl_noeud                 netp ON netp.etape_id = e.id
    
              LEFT JOIN scenario_noeud           snetp ON snetp.scenario_id = sn.scenario_id
                                                      AND snetp.noeud_id = netp.noeud_id
                                                      AND snetp.histo_destruction IS NULL
    
              LEFT JOIN scenario_noeud_seuil    snsetp ON snsetp.scenario_noeud_id = snetp.id
                                                      AND snsetp.type_intervention_id = ti.id
    
              LEFT JOIN tbl_chargens_seuils_def   csdd ON csdd.annee_id = n.annee_id
                                                      AND csdd.scenario_id = sn.scenario_id
                                                      AND csdd.type_intervention_id = ti.id
                                                      AND csdd.groupe_type_formation_id = n.groupe_type_formation_id
                                                      AND csdd.structure_id = n.structure_id
    
              LEFT JOIN scenario_noeud_seuil       sns ON sns.scenario_noeud_id = sn.id
                                                      AND sns.type_intervention_id = ti.id
            )
            SELECT
              annee_id,
              noeud_id,
              scenario_id,
              type_heures_id,
              type_intervention_id,
    
              element_pedagogique_id,
              etape_id,
              etape_ens_id,
              structure_id,
              groupe_type_formation_id,
    
              ouverture,
              dedoublement,
              assiduite,
              effectif,
              heures heures_ens,
              --t_effectif,
    
              CASE WHEN t_effectif < ouverture THEN 0 ELSE
                CEIL( t_effectif / dedoublement ) * effectif / t_effectif
              END groupes,
    
              CASE WHEN t_effectif < ouverture THEN 0 ELSE
                CEIL( t_effectif / dedoublement ) * heures * effectif / t_effectif
              END heures,
    
              CASE WHEN t_effectif < ouverture THEN 0 ELSE
                CEIL( t_effectif / dedoublement ) * hetd * effectif / t_effectif
              END  hetd
    
            FROM
              t) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.ANNEE_ID                 = v.ANNEE_ID
            AND t.NOEUD_ID                 = v.NOEUD_ID
            AND t.SCENARIO_ID              = v.SCENARIO_ID
            AND t.TYPE_HEURES_ID           = v.TYPE_HEURES_ID
            AND t.TYPE_INTERVENTION_ID     = v.TYPE_INTERVENTION_ID
            AND t.ELEMENT_PEDAGOGIQUE_ID   = v.ELEMENT_PEDAGOGIQUE_ID
            AND t.ETAPE_ID                 = v.ETAPE_ID
            AND t.ETAPE_ENS_ID             = v.ETAPE_ENS_ID
            AND t.STRUCTURE_ID             = v.STRUCTURE_ID
            AND t.GROUPE_TYPE_FORMATION_ID = v.GROUPE_TYPE_FORMATION_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          OUVERTURE                = v.OUVERTURE,
          DEDOUBLEMENT             = v.DEDOUBLEMENT,
          ASSIDUITE                = v.ASSIDUITE,
          EFFECTIF                 = v.EFFECTIF,
          HEURES_ENS               = v.HEURES_ENS,
          GROUPES                  = v.GROUPES,
          HEURES                   = v.HEURES,
          HETD                     = v.HETD,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          NOEUD_ID,
          SCENARIO_ID,
          TYPE_HEURES_ID,
          TYPE_INTERVENTION_ID,
          ELEMENT_PEDAGOGIQUE_ID,
          ETAPE_ID,
          ETAPE_ENS_ID,
          STRUCTURE_ID,
          GROUPE_TYPE_FORMATION_ID,
          OUVERTURE,
          DEDOUBLEMENT,
          ASSIDUITE,
          EFFECTIF,
          HEURES_ENS,
          GROUPES,
          HEURES,
          HETD,
          TO_DELETE
    
        ) VALUES (
    
          TBL_CHARGENS_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.NOEUD_ID,
          v.SCENARIO_ID,
          v.TYPE_HEURES_ID,
          v.TYPE_INTERVENTION_ID,
          v.ELEMENT_PEDAGOGIQUE_ID,
          v.ETAPE_ID,
          v.ETAPE_ENS_ID,
          v.STRUCTURE_ID,
          v.GROUPE_TYPE_FORMATION_ID,
          v.OUVERTURE,
          v.DEDOUBLEMENT,
          v.ASSIDUITE,
          v.EFFECTIF,
          v.HEURES_ENS,
          v.GROUPES,
          v.HEURES,
          v.HETD,
          0
    
        );
    
        DELETE TBL_CHARGENS WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_CHARGENS_SEUILS_DEF( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_CHARGENS_SEUILS_DEF SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_CHARGENS_SEUILS_DEF t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              sta.annee_id,
              sta.scenario_id,
              s.structure_id,
              gtf.groupe_type_formation_id,
              sta.type_intervention_id,
              COALESCE(sc1.dedoublement, sc2.dedoublement, sc3.dedoublement, sc4.dedoublement) dedoublement
            FROM
              (SELECT DISTINCT scenario_id, type_intervention_id, annee_id FROM seuil_charge WHERE histo_destruction IS NULL) sta
              JOIN (SELECT DISTINCT structure_id FROM noeud WHERE structure_id IS NOT NULL) s ON 1=1
              JOIN (SELECT id groupe_type_formation_id FROM groupe_type_formation) gtf ON 1=1
    
              LEFT JOIN seuil_charge sc1 ON
                sc1.histo_destruction            IS NULL
                AND sc1.annee_id                 = sta.annee_id
                AND sc1.scenario_id              = sta.scenario_id
                AND sc1.type_intervention_id     = sta.type_intervention_id
                AND sc1.structure_id             = s.structure_id
                AND sc1.groupe_type_formation_id = gtf.groupe_type_formation_id
    
              LEFT JOIN seuil_charge sc2 ON
                sc2.histo_destruction            IS NULL
                AND sc2.annee_id                 = sta.annee_id
                AND sc2.scenario_id              = sta.scenario_id
                AND sc2.type_intervention_id     = sta.type_intervention_id
                AND sc2.structure_id             = s.structure_id
                AND sc2.groupe_type_formation_id IS NULL
    
              LEFT JOIN seuil_charge sc3 ON
                sc3.histo_destruction            IS NULL
                AND sc3.annee_id                 = sta.annee_id
                AND sc3.scenario_id              = sta.scenario_id
                AND sc3.type_intervention_id     = sta.type_intervention_id
                AND sc3.structure_id             IS NULL
                AND sc3.groupe_type_formation_id = gtf.groupe_type_formation_id
    
              LEFT JOIN seuil_charge sc4 ON
                sc4.histo_destruction            IS NULL
                AND sc4.annee_id                 = sta.annee_id
                AND sc4.scenario_id              = sta.scenario_id
                AND sc4.type_intervention_id     = sta.type_intervention_id
                AND sc4.structure_id             IS NULL
                AND sc4.groupe_type_formation_id IS NULL
            WHERE
              COALESCE(sc1.dedoublement, sc2.dedoublement, sc3.dedoublement, sc4.dedoublement, 1) <> 1) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.ANNEE_ID                 = v.ANNEE_ID
            AND t.SCENARIO_ID              = v.SCENARIO_ID
            AND t.STRUCTURE_ID             = v.STRUCTURE_ID
            AND t.GROUPE_TYPE_FORMATION_ID = v.GROUPE_TYPE_FORMATION_ID
            AND t.TYPE_INTERVENTION_ID     = v.TYPE_INTERVENTION_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          DEDOUBLEMENT             = v.DEDOUBLEMENT,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          SCENARIO_ID,
          STRUCTURE_ID,
          GROUPE_TYPE_FORMATION_ID,
          TYPE_INTERVENTION_ID,
          DEDOUBLEMENT,
          TO_DELETE
    
        ) VALUES (
    
          TBL_CHARGENS_SEUILS_DEF_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.SCENARIO_ID,
          v.STRUCTURE_ID,
          v.GROUPE_TYPE_FORMATION_ID,
          v.TYPE_INTERVENTION_ID,
          v.DEDOUBLEMENT,
          0
    
        );
    
        DELETE TBL_CHARGENS_SEUILS_DEF WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_CLOTURE_REALISE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_CLOTURE_REALISE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_CLOTURE_REALISE t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH t AS (
              SELECT
                i.annee_id              annee_id,
                i.id                    intervenant_id,
                si.peut_cloturer_saisie peut_cloturer_saisie,
                CASE WHEN v.id IS NULL THEN 0 ELSE 1 END cloture
              FROM
                          intervenant         i
                     JOIN statut_intervenant si ON si.id = i.statut_id
                     JOIN type_validation    tv ON tv.code = ''CLOTURE_REALISE''
    
                LEFT JOIN validation          v ON v.intervenant_id = i.id
                                               AND v.type_validation_id = tv.id
                                               AND v.histo_destruction IS NULL
    
              WHERE
                i.histo_destruction IS NULL
            )
            SELECT
              annee_id,
              intervenant_id,
              peut_cloturer_saisie,
              CASE WHEN sum(cloture) = 0 THEN 0 ELSE 1 END cloture
            FROM
              t
            GROUP BY
              annee_id,
              intervenant_id,
              peut_cloturer_saisie) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID = v.INTERVENANT_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID             = v.ANNEE_ID,
          PEUT_CLOTURER_SAISIE = v.PEUT_CLOTURER_SAISIE,
          CLOTURE              = v.CLOTURE,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_CLOTURER_SAISIE,
          CLOTURE,
          TO_DELETE
    
        ) VALUES (
    
          TBL_CLOTURE_REALISE_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_CLOTURER_SAISIE,
          v.CLOTURE,
          0
    
        );
    
        DELETE TBL_CLOTURE_REALISE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_CONTRAT( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_CONTRAT SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_CONTRAT t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH t AS (
              SELECT
                i.annee_id                                                                annee_id,
                i.id                                                                      intervenant_id,
                si.peut_avoir_contrat                                                     peut_avoir_contrat,
                NVL(ep.structure_id, i.structure_id)                                      structure_id,
                CASE WHEN evh.code IN (''contrat-edite'',''contrat-signe'') THEN 1 ELSE 0 END edite,
                CASE WHEN evh.code IN (''contrat-signe'')                 THEN 1 ELSE 0 END signe
              FROM
                          intervenant                 i
    
                     JOIN statut_intervenant         si ON si.id = i.statut_id
    
                     JOIN service                     s ON s.intervenant_id = i.id
                                                       AND s.histo_destruction IS NULL
    
                     JOIN type_volume_horaire       tvh ON tvh.code = ''PREVU''
    
                     JOIN volume_horaire             vh ON vh.service_id = s.id
                                                       AND vh.histo_destruction IS NULL
                                                       AND vh.heures <> 0
                                                       AND vh.type_volume_horaire_id = tvh.id
    
                     JOIN v_volume_horaire_etat     vhe ON vhe.volume_horaire_id = vh.id
    
                     JOIN etat_volume_horaire       evh ON evh.id = vhe.etat_volume_horaire_id
                                                       AND evh.code IN (''valide'', ''contrat-edite'', ''contrat-signe'')
    
                     JOIN element_pedagogique        ep ON ep.id = s.element_pedagogique_id
    
              WHERE
                i.histo_destruction IS NULL
                AND NOT (si.peut_avoir_contrat = 0 AND evh.code = ''valide'')
    
              UNION ALL
    
              SELECT
                i.annee_id                                                                annee_id,
                i.id                                                                      intervenant_id,
                si.peut_avoir_contrat                                                     peut_avoir_contrat,
                s.structure_id                                                            structure_id,
                CASE WHEN evh.code IN (''contrat-edite'',''contrat-signe'') THEN 1 ELSE 0 END edite,
                CASE WHEN evh.code IN (''contrat-signe'')                 THEN 1 ELSE 0 END signe
              FROM
                          intervenant                 i
    
                     JOIN statut_intervenant         si ON si.id = i.statut_id
    
                     JOIN service_referentiel         s ON s.intervenant_id = i.id
                                                       AND s.histo_destruction IS NULL
    
                     JOIN type_volume_horaire       tvh ON tvh.code = ''PREVU''
    
                     JOIN volume_horaire_ref         vh ON vh.service_referentiel_id = s.id
                                                       AND vh.histo_destruction IS NULL
                                                       AND vh.heures <> 0
                                                       AND vh.type_volume_horaire_id = tvh.id
    
                     JOIN v_volume_horaire_ref_etat vhe ON vhe.volume_horaire_ref_id = vh.id
    
                     JOIN etat_volume_horaire       evh ON evh.id = vhe.etat_volume_horaire_id
                                                       AND evh.code IN (''valide'', ''contrat-edite'', ''contrat-signe'')
    
              WHERE
                i.histo_destruction IS NULL
                AND NOT (si.peut_avoir_contrat = 0 AND evh.code = ''valide'')
            )
            SELECT
              annee_id,
              intervenant_id,
              peut_avoir_contrat,
              structure_id,
              count(*) as nbvh,
              sum(edite) as edite,
              sum(signe) as signe
            FROM
              t
            GROUP BY
              annee_id,
              intervenant_id,
              peut_avoir_contrat,
              structure_id) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID = v.INTERVENANT_ID
            AND COALESCE(t.STRUCTURE_ID,0) = COALESCE(v.STRUCTURE_ID,0)
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID           = v.ANNEE_ID,
          PEUT_AVOIR_CONTRAT = v.PEUT_AVOIR_CONTRAT,
          NBVH               = v.NBVH,
          EDITE              = v.EDITE,
          SIGNE              = v.SIGNE,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_AVOIR_CONTRAT,
          STRUCTURE_ID,
          NBVH,
          EDITE,
          SIGNE,
          TO_DELETE
    
        ) VALUES (
    
          TBL_CONTRAT_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_AVOIR_CONTRAT,
          v.STRUCTURE_ID,
          v.NBVH,
          v.EDITE,
          v.SIGNE,
          0
    
        );
    
        DELETE TBL_CONTRAT WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_DMEP_LIQUIDATION( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_DMEP_LIQUIDATION SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_DMEP_LIQUIDATION t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              annee_id,
              type_ressource_id,
              structure_id,
              SUM(heures) heures
            FROM
            (
              SELECT
                i.annee_id,
                cc.type_ressource_id,
                COALESCE( ep.structure_id, i.structure_id ) structure_id,
                mep.heures
              FROM
                          mise_en_paiement         mep
                     JOIN centre_cout               cc ON cc.id = mep.centre_cout_id
                     JOIN formule_resultat_service frs ON frs.id = mep.formule_res_service_id
                     JOIN service                    s ON s.id = frs.service_id
                     JOIN intervenant                i ON i.id = s.intervenant_id
                LEFT JOIN element_pedagogique       ep ON ep.id = s.element_pedagogique_id
              WHERE
                mep.histo_destruction IS NULL
    
              UNION ALL
    
              SELECT
                i.annee_id,
                cc.type_ressource_id,
                sr.structure_id structure_id,
                heures
              FROM
                          mise_en_paiement              mep
                     JOIN centre_cout                    cc ON cc.id = mep.centre_cout_id
                     JOIN formule_resultat_service_ref frsr ON frsr.id = mep.formule_res_service_ref_id
                     JOIN service_referentiel            sr ON sr.id = frsr.service_referentiel_id
                     JOIN intervenant                     i ON i.id = sr.intervenant_id
    
              WHERE
                mep.histo_destruction IS NULL
    
            ) t1
            GROUP BY
              annee_id, type_ressource_id, structure_id) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.ANNEE_ID          = v.ANNEE_ID
            AND t.TYPE_RESSOURCE_ID = v.TYPE_RESSOURCE_ID
            AND t.STRUCTURE_ID      = v.STRUCTURE_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          HEURES            = v.HEURES,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          TYPE_RESSOURCE_ID,
          STRUCTURE_ID,
          HEURES,
          TO_DELETE
    
        ) VALUES (
    
          TBL_DMEP_LIQUIDATION_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.TYPE_RESSOURCE_ID,
          v.STRUCTURE_ID,
          v.HEURES,
          0
    
        );
    
        DELETE TBL_DMEP_LIQUIDATION WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_DOSSIER( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_DOSSIER SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_DOSSIER t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              i.annee_id,
              i.id intervenant_id,
              si.peut_saisir_dossier,
              d.id dossier_id,
              v.id validation_id
            FROM
                        intervenant         i
                   JOIN statut_intervenant si ON si.id = i.statut_id
              LEFT JOIN dossier             d ON d.intervenant_id = i.id
                                          AND d.histo_destruction IS NULL
    
                   JOIN type_validation tv ON tv.code = ''DONNEES_PERSO_PAR_COMP''
              LEFT JOIN validation       v ON v.intervenant_id = i.id
                                          AND v.type_validation_id = tv.id
                                          AND v.histo_destruction IS NULL
            WHERE
              i.histo_destruction IS NULL) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID = v.INTERVENANT_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID            = v.ANNEE_ID,
          PEUT_SAISIR_DOSSIER = v.PEUT_SAISIR_DOSSIER,
          DOSSIER_ID          = v.DOSSIER_ID,
          VALIDATION_ID       = v.VALIDATION_ID,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_SAISIR_DOSSIER,
          DOSSIER_ID,
          VALIDATION_ID,
          TO_DELETE
    
        ) VALUES (
    
          TBL_DOSSIER_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_SAISIR_DOSSIER,
          v.DOSSIER_ID,
          v.VALIDATION_ID,
          0
    
        );
    
        DELETE TBL_DOSSIER WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_PAIEMENT( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_PAIEMENT SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_PAIEMENT t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              i.annee_id                                  annee_id,
              frs.id                                      formule_res_service_id,
              null                                        formule_res_service_ref_id,
              i.id                                        intervenant_id,
              COALESCE( ep.structure_id, i.structure_id ) structure_id,
              mep.id                                      mise_en_paiement_id,
              mep.periode_paiement_id                     periode_paiement_id,
              frs.heures_compl_fi + frs.heures_compl_fc + frs.heures_compl_fa + frs.heures_compl_fc_majorees heures_a_payer,
              count(*) OVER(PARTITION BY frs.id)          heures_a_payer_pond,
              NVL(mep.heures,0)                           heures_demandees,
              CASE WHEN mep.periode_paiement_id IS NULL THEN 0 ELSE mep.heures END heures_payees
            FROM
                        formule_resultat_service        frs
                   JOIN type_volume_horaire             tvh ON tvh.code = ''REALISE''
                   JOIN etat_volume_horaire             evh ON evh.code = ''valide''
                   JOIN formule_resultat                 fr ON fr.id = frs.formule_resultat_id
                                                           AND fr.type_volume_horaire_id = tvh.id
                                                           AND fr.etat_volume_horaire_id = evh.id
    
                   JOIN intervenant                       i ON i.id = fr.intervenant_id
                   JOIN service                           s ON s.id = frs.service_id
              LEFT JOIN element_pedagogique              ep ON ep.id = s.element_pedagogique_id
              LEFT JOIN mise_en_paiement                mep ON mep.formule_res_service_id = frs.id
                                                           AND mep.histo_destruction IS NULL
    
            UNION ALL
    
            SELECT
              i.annee_id                                  annee_id,
              null                                        formule_res_service_id,
              frs.id                                      formule_res_service_ref_id,
              i.id                                        intervenant_id,
              s.structure_id                              structure_id,
              mep.id                                      mise_en_paiement_id,
              mep.periode_paiement_id                     periode_paiement_id,
              frs.heures_compl_referentiel                heures_a_payer,
              count(*) OVER(PARTITION BY frs.id)          heures_a_payer_pond,
              NVL(mep.heures,0)                           heures_demandees,
              CASE WHEN mep.periode_paiement_id IS NULL THEN 0 ELSE mep.heures END heures_payees
            FROM
                        formule_resultat_service_ref    frs
                   JOIN type_volume_horaire             tvh ON tvh.code = ''REALISE''
                   JOIN etat_volume_horaire             evh ON evh.code = ''valide''
                   JOIN formule_resultat                 fr ON fr.id = frs.formule_resultat_id
                                                           AND fr.type_volume_horaire_id = tvh.id
                                                           AND fr.etat_volume_horaire_id = evh.id
    
                   JOIN intervenant                       i ON i.id = fr.intervenant_id
                   JOIN service_referentiel               s ON s.id = frs.service_referentiel_id
              LEFT JOIN mise_en_paiement                mep ON mep.formule_res_service_ref_id = frs.id
                                                           AND mep.histo_destruction IS NULL) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID             = v.INTERVENANT_ID
            AND COALESCE(t.MISE_EN_PAIEMENT_ID,0) = COALESCE(v.MISE_EN_PAIEMENT_ID,0)
            AND COALESCE(t.FORMULE_RES_SERVICE_ID,0) = COALESCE(v.FORMULE_RES_SERVICE_ID,0)
            AND COALESCE(t.FORMULE_RES_SERVICE_REF_ID,0) = COALESCE(v.FORMULE_RES_SERVICE_REF_ID,0)
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID                   = v.ANNEE_ID,
          STRUCTURE_ID               = v.STRUCTURE_ID,
          PERIODE_PAIEMENT_ID        = v.PERIODE_PAIEMENT_ID,
          HEURES_A_PAYER             = v.HEURES_A_PAYER,
          HEURES_A_PAYER_POND        = v.HEURES_A_PAYER_POND,
          HEURES_DEMANDEES           = v.HEURES_DEMANDEES,
          HEURES_PAYEES              = v.HEURES_PAYEES,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          STRUCTURE_ID,
          MISE_EN_PAIEMENT_ID,
          PERIODE_PAIEMENT_ID,
          HEURES_A_PAYER,
          HEURES_A_PAYER_POND,
          HEURES_DEMANDEES,
          HEURES_PAYEES,
          FORMULE_RES_SERVICE_ID,
          FORMULE_RES_SERVICE_REF_ID,
          TO_DELETE
    
        ) VALUES (
    
          TBL_PAIEMENT_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.STRUCTURE_ID,
          v.MISE_EN_PAIEMENT_ID,
          v.PERIODE_PAIEMENT_ID,
          v.HEURES_A_PAYER,
          v.HEURES_A_PAYER_POND,
          v.HEURES_DEMANDEES,
          v.HEURES_PAYEES,
          v.FORMULE_RES_SERVICE_ID,
          v.FORMULE_RES_SERVICE_REF_ID,
          0
    
        );
    
        DELETE TBL_PAIEMENT WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_PIECE_JOINTE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_PIECE_JOINTE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_PIECE_JOINTE t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH pjf AS (
              SELECT
                pjf.annee_id,
                pjf.type_piece_jointe_id,
                pjf.intervenant_id,
                COUNT(*) count,
                SUM(CASE WHEN validation_id IS NULL THEN 0 ELSE 1 END) validation,
                SUM(CASE WHEN fichier_id IS NULL THEN 0 ELSE 1 END) fichier
              FROM
                tbl_piece_jointe_fournie pjf
              GROUP BY
                pjf.annee_id,
                pjf.type_piece_jointe_id,
                pjf.intervenant_id
            )
            SELECT
              NVL( pjd.annee_id, pjf.annee_id ) annee_id,
              NVL( pjd.type_piece_jointe_id, pjf.type_piece_jointe_id ) type_piece_jointe_id,
              NVL( pjd.intervenant_id, pjf.intervenant_id ) intervenant_id,
              CASE WHEN pjd.intervenant_id IS NULL THEN 0 ELSE 1 END demandee,
              CASE WHEN pjf.fichier = pjf.count THEN 1 ELSE 0 END fournie,
              CASE WHEN pjf.validation = pjf.count THEN 1 ELSE 0 END validee,
              NVL(pjd.heures_pour_seuil,0) heures_pour_seuil
            FROM
              tbl_piece_jointe_demande pjd
              FULL JOIN pjf ON pjf.type_piece_jointe_id = pjd.type_piece_jointe_id AND pjf.intervenant_id = pjd.intervenant_id) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.TYPE_PIECE_JOINTE_ID = v.TYPE_PIECE_JOINTE_ID
            AND t.INTERVENANT_ID       = v.INTERVENANT_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID             = v.ANNEE_ID,
          DEMANDEE             = v.DEMANDEE,
          FOURNIE              = v.FOURNIE,
          VALIDEE              = v.VALIDEE,
          HEURES_POUR_SEUIL    = v.HEURES_POUR_SEUIL,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          TYPE_PIECE_JOINTE_ID,
          INTERVENANT_ID,
          DEMANDEE,
          FOURNIE,
          VALIDEE,
          HEURES_POUR_SEUIL,
          TO_DELETE
    
        ) VALUES (
    
          TBL_PIECE_JOINTE_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.TYPE_PIECE_JOINTE_ID,
          v.INTERVENANT_ID,
          v.DEMANDEE,
          v.FOURNIE,
          v.VALIDEE,
          v.HEURES_POUR_SEUIL,
          0
    
        );
    
        DELETE TBL_PIECE_JOINTE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_PIECE_JOINTE_DEMANDE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_PIECE_JOINTE_DEMANDE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_PIECE_JOINTE_DEMANDE t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH i_h AS (
              SELECT
                s.intervenant_id,
                sum(vh.heures) heures,
                sum(ep.taux_fc) fc
              FROM
                     service               s
                JOIN type_volume_horaire tvh ON tvh.code = ''PREVU''
                JOIN volume_horaire       vh ON vh.service_id = s.id
                                            AND vh.type_volume_horaire_id = tvh.id
                                            AND vh.histo_destruction IS NULL
                JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id -- Service sur l''établissement
              WHERE
                s.histo_destruction IS NULL
                AND vh.motif_non_paiement_id IS NULL -- pas de motif de non paiement
              GROUP BY
                s.intervenant_id
            )
            SELECT
              i.annee_id                      annee_id,
              i.id                            intervenant_id,
              tpj.id                          type_piece_jointe_id,
              MAX(COALESCE(i_h.heures, 0))    heures_pour_seuil
            FROM
                        intervenant                 i
    
              LEFT JOIN dossier                     d ON d.intervenant_id = i.id
                                                     AND d.histo_destruction IS NULL
    
                   JOIN type_piece_jointe_statut tpjs ON tpjs.statut_intervenant_id = i.statut_id
                                                     AND tpjs.histo_destruction IS NULL
                                                     AND i.annee_id BETWEEN COALESCE(tpjs.annee_debut_id,i.annee_id) AND COALESCE(tpjs.annee_fin_id,i.annee_id)
    
                   JOIN type_piece_jointe         tpj ON tpj.id = tpjs.type_piece_jointe_id
                                                     AND tpj.histo_destruction IS NULL
    
              LEFT JOIN                           i_h ON i_h.intervenant_id = i.id
            WHERE
              -- Gestion de l''historique
              i.histo_destruction IS NULL
    
              -- Seuil HETD
              AND (COALESCE(i_h.heures,0) > COALESCE(tpjs.seuil_hetd,-1))
    
              -- En fonction du premier recrutement ou non
              AND (tpjs.premier_recrutement = 0 OR COALESCE(i.premier_recrutement,0) = 1)
    
              -- Le RIB n''est demandé QUE s''il est différent!!
              AND CASE
                    WHEN tpjs.changement_rib = 0 OR d.id IS NULL THEN 1
                    ELSE CASE WHEN replace(i.bic, '' '', '''') || ''-'' || replace(i.iban, '' '', '''') = d.rib THEN 0 ELSE 1 END
                  END = 1
    
              -- Filtre FC
              AND (tpjs.fc = 0 OR i_h.fc > 0)
            GROUP BY
              i.annee_id,
              i.id,
              tpj.id) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.TYPE_PIECE_JOINTE_ID = v.TYPE_PIECE_JOINTE_ID
            AND t.INTERVENANT_ID       = v.INTERVENANT_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID             = v.ANNEE_ID,
          HEURES_POUR_SEUIL    = v.HEURES_POUR_SEUIL,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          TYPE_PIECE_JOINTE_ID,
          INTERVENANT_ID,
          HEURES_POUR_SEUIL,
          TO_DELETE
    
        ) VALUES (
    
          TBL_PIECE_JOINTE_DEMAND_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.TYPE_PIECE_JOINTE_ID,
          v.INTERVENANT_ID,
          v.HEURES_POUR_SEUIL,
          0
    
        );
    
        DELETE TBL_PIECE_JOINTE_DEMANDE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_PIECE_JOINTE_FOURNIE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_PIECE_JOINTE_FOURNIE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_PIECE_JOINTE_FOURNIE t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              i.annee_id,
              pj.type_piece_jointe_id,
              pj.intervenant_id,
              pj.id piece_jointe_id,
              v.id validation_id,
              f.id fichier_id
            FROM
                        piece_jointe          pj
                   JOIN intervenant            i ON i.id = pj.intervenant_id
                                                AND i.histo_destruction IS NULL
    
                   JOIN piece_jointe_fichier pjf ON pjf.piece_jointe_id = pj.id
                   JOIN fichier                f ON f.id = pjf.fichier_id
                                                AND f.histo_destruction IS NULL
    
              LEFT JOIN validation             v ON v.id = pj.validation_id
                                                AND v.histo_destruction IS NULL
            WHERE
              pj.histo_destruction IS NULL) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.TYPE_PIECE_JOINTE_ID = v.TYPE_PIECE_JOINTE_ID
            AND t.INTERVENANT_ID       = v.INTERVENANT_ID
            AND COALESCE(t.VALIDATION_ID,0) = COALESCE(v.VALIDATION_ID,0)
            AND COALESCE(t.FICHIER_ID,0) = COALESCE(v.FICHIER_ID,0)
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID             = v.ANNEE_ID,
          PIECE_JOINTE_ID      = v.PIECE_JOINTE_ID,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          TYPE_PIECE_JOINTE_ID,
          INTERVENANT_ID,
          VALIDATION_ID,
          FICHIER_ID,
          PIECE_JOINTE_ID,
          TO_DELETE
    
        ) VALUES (
    
          TBL_PIECE_JOINTE_FOURNI_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.TYPE_PIECE_JOINTE_ID,
          v.INTERVENANT_ID,
          v.VALIDATION_ID,
          v.FICHIER_ID,
          v.PIECE_JOINTE_ID,
          0
    
        );
    
        DELETE TBL_PIECE_JOINTE_FOURNIE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_SERVICE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN return;
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_SERVICE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_SERVICE t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH t AS (
            SELECT
              s.id                                                                                      service_id,
              s.intervenant_id                                                                          intervenant_id,
              ep.structure_id                                                                           structure_id,
              ep.id                                                                                     element_pedagogique_id,
              ep.periode_id                                                                             element_pedagogique_periode_id,
              etp.id                                                                                    etape_id,
    
              vh.type_volume_horaire_id                                                                 type_volume_horaire_id,
              vh.heures                                                                                 heures,
              tvh.code                                                                                  type_volume_horaire_code,
    
              CASE WHEN ep.histo_destruction IS NULL THEN 1 ELSE 0 END                                  element_pedagogique_histo,
              CASE WHEN etp.histo_destruction IS NULL OR cp.id IS NOT NULL THEN 1 ELSE 0 END            etape_histo,
    
              CASE WHEN ep.periode_id IS NOT NULL THEN
                SUM( CASE WHEN vh.periode_id <> ep.periode_id THEN 1 ELSE 0 END ) OVER( PARTITION BY vh.service_id, vh.periode_id, vh.type_volume_horaire_id, vh.type_intervention_id )
              ELSE 0 END has_heures_mauvaise_periode,
    
              CASE WHEN v.id IS NULL AND vh.auto_validation=0 THEN 0 ELSE 1 END valide
            FROM
              service                                       s
              LEFT JOIN element_pedagogique                ep ON ep.id = s.element_pedagogique_id
              LEFT JOIN etape                             etp ON etp.id = ep.etape_id
              LEFT JOIN chemin_pedagogique                 cp ON cp.etape_id = etp.id
                                                             AND cp.element_pedagogique_id = ep.id
                                                             AND cp.histo_destruction IS NULL
    
                   JOIN volume_horaire                     vh ON vh.service_id = s.id
                                                             AND vh.histo_destruction IS NULL
    
                   JOIN type_volume_horaire               tvh ON tvh.id = vh.type_volume_horaire_id
    
              LEFT JOIN validation_vol_horaire            vvh ON vvh.volume_horaire_id = vh.id
    
              LEFT JOIN validation                          v ON v.id = vvh.validation_id
                                                             AND v.histo_destruction IS NULL
            WHERE
              s.histo_destruction IS NULL
            )
            SELECT
              i.annee_id                                                                                annee_id,
              i.id                                                                                      intervenant_id,
              i.structure_id                                                                            intervenant_structure_id,
              NVL( t.structure_id, i.structure_id )                                                     structure_id,
              ti.id                                                                                     type_intervenant_id,
              ti.code                                                                                   type_intervenant_code,
              si.peut_saisir_service                                                                    peut_saisir_service,
    
              t.element_pedagogique_id,
              t.service_id,
              t.element_pedagogique_periode_id,
              t.etape_id,
              t.type_volume_horaire_id,
              t.type_volume_horaire_code,
              t.element_pedagogique_histo,
              t.etape_histo,
    
              CASE WHEN SUM(t.has_heures_mauvaise_periode) > 0 THEN 1 ELSE 0 END has_heures_mauvaise_periode,
    
              CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE count(*) END nbvh,
              CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE sum(t.heures) END heures,
              sum(valide) valide
            FROM
              t
              JOIN intervenant                              i ON i.id = t.intervenant_id
              JOIN statut_intervenant                      si ON si.id = i.statut_id
              JOIN type_intervenant                        ti ON ti.id = si.type_intervenant_id
            GROUP BY
              i.annee_id,
              i.id,
              i.structure_id,
              t.structure_id,
              i.structure_id,
              ti.id,
              ti.code,
              si.peut_saisir_service,
              t.element_pedagogique_id,
              t.service_id,
              t.element_pedagogique_periode_id,
              t.etape_id,
              t.type_volume_horaire_id,
              t.type_volume_horaire_code,
              t.element_pedagogique_histo,
              t.etape_histo) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                COALESCE(t.TYPE_VOLUME_HORAIRE_ID,0) = COALESCE(v.TYPE_VOLUME_HORAIRE_ID,0)
            AND t.SERVICE_ID             = v.SERVICE_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID                       = v.ANNEE_ID,
          INTERVENANT_ID                 = v.INTERVENANT_ID,
          PEUT_SAISIR_SERVICE            = v.PEUT_SAISIR_SERVICE,
          STRUCTURE_ID                   = v.STRUCTURE_ID,
          NBVH                           = v.NBVH,
          VALIDE                         = v.VALIDE,
          ELEMENT_PEDAGOGIQUE_ID         = v.ELEMENT_PEDAGOGIQUE_ID,
          ELEMENT_PEDAGOGIQUE_PERIODE_ID = v.ELEMENT_PEDAGOGIQUE_PERIODE_ID,
          ETAPE_ID                       = v.ETAPE_ID,
          ELEMENT_PEDAGOGIQUE_HISTO      = v.ELEMENT_PEDAGOGIQUE_HISTO,
          ETAPE_HISTO                    = v.ETAPE_HISTO,
          HAS_HEURES_MAUVAISE_PERIODE    = v.HAS_HEURES_MAUVAISE_PERIODE,
          INTERVENANT_STRUCTURE_ID       = v.INTERVENANT_STRUCTURE_ID,
          TYPE_INTERVENANT_ID            = v.TYPE_INTERVENANT_ID,
          TYPE_INTERVENANT_CODE          = v.TYPE_INTERVENANT_CODE,
          TYPE_VOLUME_HORAIRE_CODE       = v.TYPE_VOLUME_HORAIRE_CODE,
          HEURES                         = v.HEURES,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_SAISIR_SERVICE,
          TYPE_VOLUME_HORAIRE_ID,
          STRUCTURE_ID,
          NBVH,
          VALIDE,
          ELEMENT_PEDAGOGIQUE_ID,
          ELEMENT_PEDAGOGIQUE_PERIODE_ID,
          ETAPE_ID,
          ELEMENT_PEDAGOGIQUE_HISTO,
          ETAPE_HISTO,
          HAS_HEURES_MAUVAISE_PERIODE,
          SERVICE_ID,
          INTERVENANT_STRUCTURE_ID,
          TYPE_INTERVENANT_ID,
          TYPE_INTERVENANT_CODE,
          TYPE_VOLUME_HORAIRE_CODE,
          HEURES,
          TO_DELETE
    
        ) VALUES (
    
          TBL_SERVICE_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_SAISIR_SERVICE,
          v.TYPE_VOLUME_HORAIRE_ID,
          v.STRUCTURE_ID,
          v.NBVH,
          v.VALIDE,
          v.ELEMENT_PEDAGOGIQUE_ID,
          v.ELEMENT_PEDAGOGIQUE_PERIODE_ID,
          v.ETAPE_ID,
          v.ELEMENT_PEDAGOGIQUE_HISTO,
          v.ETAPE_HISTO,
          v.HAS_HEURES_MAUVAISE_PERIODE,
          v.SERVICE_ID,
          v.INTERVENANT_STRUCTURE_ID,
          v.TYPE_INTERVENANT_ID,
          v.TYPE_INTERVENANT_CODE,
          v.TYPE_VOLUME_HORAIRE_CODE,
          v.HEURES,
          0
    
        );
    
        DELETE TBL_SERVICE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_SERVICE_REFERENTIEL( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_SERVICE_REFERENTIEL SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_SERVICE_REFERENTIEL t
        USING (
    
          SELECT
            tv.*
          FROM
            (WITH t AS (
    
              SELECT
                i.annee_id,
                i.id intervenant_id,
                si.peut_saisir_referentiel peut_saisir_service,
                vh.type_volume_horaire_id,
                s.structure_id,
                CASE WHEN v.id IS NULL AND vh.auto_validation=0 THEN 0 ELSE 1 END valide
              FROM
                          intervenant                     i
    
                     JOIN statut_intervenant          si ON si.id = i.statut_id
    
                LEFT JOIN service_referentiel          s ON s.intervenant_id = i.id
                                                        AND s.histo_destruction IS NULL
    
                LEFT JOIN volume_horaire_ref          vh ON vh.service_referentiel_id = s.id
                                                        AND vh.histo_destruction IS NULL
    
                LEFT JOIN validation_vol_horaire_ref vvh ON vvh.volume_horaire_ref_id = vh.id
    
                LEFT JOIN validation                   v ON v.id = vvh.validation_id
                                                        AND v.histo_destruction IS NULL
              WHERE
                i.histo_destruction IS NULL
    
            )
            SELECT
              annee_id,
              intervenant_id,
              peut_saisir_service,
              type_volume_horaire_id,
              structure_id,
              CASE WHEN type_volume_horaire_id IS NULL THEN 0 ELSE count(*) END nbvh,
              sum(valide) valide
            FROM
              t
            WHERE
              NOT (structure_id IS NOT NULL AND type_volume_horaire_id IS NULL)
            GROUP BY
              annee_id,
              intervenant_id,
              peut_saisir_service,
              type_volume_horaire_id,
              structure_id) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID         = v.INTERVENANT_ID
            AND COALESCE(t.TYPE_VOLUME_HORAIRE_ID,0) = COALESCE(v.TYPE_VOLUME_HORAIRE_ID,0)
            AND COALESCE(t.STRUCTURE_ID,0) = COALESCE(v.STRUCTURE_ID,0)
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID               = v.ANNEE_ID,
          PEUT_SAISIR_SERVICE    = v.PEUT_SAISIR_SERVICE,
          NBVH                   = v.NBVH,
          VALIDE                 = v.VALIDE,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_SAISIR_SERVICE,
          TYPE_VOLUME_HORAIRE_ID,
          STRUCTURE_ID,
          NBVH,
          VALIDE,
          TO_DELETE
    
        ) VALUES (
    
          TBL_SERVICE_REFERENTIEL_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_SAISIR_SERVICE,
          v.TYPE_VOLUME_HORAIRE_ID,
          v.STRUCTURE_ID,
          v.NBVH,
          v.VALIDE,
          0
    
        );
    
        DELETE TBL_SERVICE_REFERENTIEL WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_SERVICE_SAISIE( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_SERVICE_SAISIE SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_SERVICE_SAISIE t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT
              i.annee_id,
              i.id intervenant_id,
              si.peut_saisir_service,
              si.peut_saisir_referentiel,
              SUM( CASE WHEN tvhs.code = ''PREVU''   THEN NVL(vh .heures,0) ELSE 0 END ) heures_service_prev,
              SUM( CASE WHEN tvhs.code = ''PREVU''   THEN NVL(vhr.heures,0) ELSE 0 END ) heures_referentiel_prev,
              SUM( CASE WHEN tvhs.code = ''REALISE'' THEN NVL(vh .heures,0) ELSE 0 END ) heures_service_real,
              SUM( CASE WHEN tvhs.code = ''REALISE'' THEN NVL(vhr.heures,0) ELSE 0 END ) heures_referentiel_real
            FROM
              intervenant i
              JOIN statut_intervenant si ON si.id = i.statut_id
              LEFT JOIN service s ON s.intervenant_id = i.id AND s.histo_destruction IS NULL
              LEFT JOIN volume_horaire vh ON vh.service_id = s.id AND vh.histo_destruction IS NULL
              LEFT JOIN type_volume_horaire tvhs ON tvhs.id = vh.type_volume_horaire_id
    
              LEFT JOIN service_referentiel sr ON sr.intervenant_id = i.id AND sr.histo_destruction IS NULL
              LEFT JOIN volume_horaire_ref vhr ON vhr.service_referentiel_id = sr.id AND vhr.histo_destruction IS NULL
              LEFT JOIN type_volume_horaire tvhrs ON tvhrs.id = vhr.type_volume_horaire_id
            WHERE
              i.histo_destruction IS NULL
            GROUP BY
              i.annee_id,
              i.id,
              si.peut_saisir_service,
              si.peut_saisir_referentiel) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID = v.INTERVENANT_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID                = v.ANNEE_ID,
          PEUT_SAISIR_SERVICE     = v.PEUT_SAISIR_SERVICE,
          PEUT_SAISIR_REFERENTIEL = v.PEUT_SAISIR_REFERENTIEL,
          HEURES_SERVICE_PREV     = v.HEURES_SERVICE_PREV,
          HEURES_REFERENTIEL_PREV = v.HEURES_REFERENTIEL_PREV,
          HEURES_SERVICE_REAL     = v.HEURES_SERVICE_REAL,
          HEURES_REFERENTIEL_REAL = v.HEURES_REFERENTIEL_REAL,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          PEUT_SAISIR_SERVICE,
          PEUT_SAISIR_REFERENTIEL,
          HEURES_SERVICE_PREV,
          HEURES_REFERENTIEL_PREV,
          HEURES_SERVICE_REAL,
          HEURES_REFERENTIEL_REAL,
          TO_DELETE
    
        ) VALUES (
    
          TBL_SERVICE_SAISIE_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.PEUT_SAISIR_SERVICE,
          v.PEUT_SAISIR_REFERENTIEL,
          v.HEURES_SERVICE_PREV,
          v.HEURES_REFERENTIEL_PREV,
          v.HEURES_SERVICE_REAL,
          v.HEURES_REFERENTIEL_REAL,
          0
    
        );
    
        DELETE TBL_SERVICE_SAISIE WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_VALIDATION_ENSEIGNEMENT( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_VALIDATION_ENSEIGNEMENT SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_VALIDATION_ENSEIGNEMENT t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT DISTINCT
              i.annee_id,
              i.id intervenant_id,
              CASE WHEN rsv.priorite = ''affectation'' THEN
                COALESCE( i.structure_id, ep.structure_id )
              ELSE
                COALESCE( ep.structure_id, i.structure_id )
              END structure_id,
              vh.type_volume_horaire_id,
              s.id service_id,
              vh.id volume_horaire_id,
              vh.auto_validation,
              v.id validation_id
            FROM
              service s
              JOIN volume_horaire vh ON vh.service_id = s.id AND vh.histo_destruction IS NULL
              JOIN intervenant i ON i.id = s.intervenant_id AND i.histo_destruction IS NULL
              JOIN statut_intervenant si ON si.id = i.statut_id
              JOIN regle_structure_validation rsv ON rsv.type_intervenant_id = si.type_intervenant_id AND rsv.type_volume_horaire_id = vh.type_volume_horaire_id
              LEFT JOIN element_pedagogique ep ON ep.id = s.element_pedagogique_id
              LEFT JOIN validation_vol_horaire vvh ON vvh.volume_horaire_id = vh.id
              LEFT JOIN validation v ON v.id = vvh.validation_id AND v.histo_destruction IS NULL
            WHERE
              s.histo_destruction IS NULL) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID         = v.INTERVENANT_ID
            AND t.STRUCTURE_ID           = v.STRUCTURE_ID
            AND t.TYPE_VOLUME_HORAIRE_ID = v.TYPE_VOLUME_HORAIRE_ID
            AND t.SERVICE_ID             = v.SERVICE_ID
            AND COALESCE(t.VALIDATION_ID,0) = COALESCE(v.VALIDATION_ID,0)
            AND t.VOLUME_HORAIRE_ID      = v.VOLUME_HORAIRE_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID               = v.ANNEE_ID,
          AUTO_VALIDATION        = v.AUTO_VALIDATION,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          STRUCTURE_ID,
          TYPE_VOLUME_HORAIRE_ID,
          SERVICE_ID,
          VALIDATION_ID,
          VOLUME_HORAIRE_ID,
          AUTO_VALIDATION,
          TO_DELETE
    
        ) VALUES (
    
          TBL_VALIDATION_ENSEIGNE_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.STRUCTURE_ID,
          v.TYPE_VOLUME_HORAIRE_ID,
          v.SERVICE_ID,
          v.VALIDATION_ID,
          v.VOLUME_HORAIRE_ID,
          v.AUTO_VALIDATION,
          0
    
        );
    
        DELETE TBL_VALIDATION_ENSEIGNEMENT WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
    
    
      PROCEDURE C_VALIDATION_REFERENTIEL( PARAMS UNICAEN_TBL.T_PARAMS ) IS
        conds CLOB;
        BEGIN
          conds := params_to_conds( params );
    
          EXECUTE IMMEDIATE 'BEGIN
    
        UPDATE TBL_VALIDATION_REFERENTIEL SET to_delete = 1 WHERE ' || conds || ';
    
        MERGE INTO
          TBL_VALIDATION_REFERENTIEL t
        USING (
    
          SELECT
            tv.*
          FROM
            (SELECT DISTINCT
              i.annee_id,
              i.id intervenant_id,
              CASE WHEN rsv.priorite = ''affectation'' THEN
                COALESCE( i.structure_id, s.structure_id )
              ELSE
                COALESCE( s.structure_id, i.structure_id )
              END structure_id,
              vh.type_volume_horaire_id,
              s.id service_referentiel_id,
              vh.id volume_horaire_ref_id,
              vh.auto_validation,
              v.id validation_id
            FROM
              service_referentiel s
              JOIN volume_horaire_ref vh ON vh.service_referentiel_id = s.id AND vh.histo_destruction IS NULL
              JOIN intervenant i ON i.id = s.intervenant_id AND i.histo_destruction IS NULL
              JOIN statut_intervenant si ON si.id = i.statut_id
              JOIN regle_structure_validation rsv ON rsv.type_intervenant_id = si.type_intervenant_id AND rsv.type_volume_horaire_id = vh.type_volume_horaire_id
              LEFT JOIN validation_vol_horaire_ref vvh ON vvh.volume_horaire_ref_id = vh.id
              LEFT JOIN validation v ON v.id = vvh.validation_id AND v.histo_destruction IS NULL
            WHERE
              s.histo_destruction IS NULL) tv
          WHERE
            ' || conds || '
    
        ) v ON (
                t.INTERVENANT_ID         = v.INTERVENANT_ID
            AND t.STRUCTURE_ID           = v.STRUCTURE_ID
            AND t.TYPE_VOLUME_HORAIRE_ID = v.TYPE_VOLUME_HORAIRE_ID
            AND t.SERVICE_REFERENTIEL_ID = v.SERVICE_REFERENTIEL_ID
            AND COALESCE(t.VALIDATION_ID,0) = COALESCE(v.VALIDATION_ID,0)
            AND t.VOLUME_HORAIRE_REF_ID  = v.VOLUME_HORAIRE_REF_ID
    
        ) WHEN MATCHED THEN UPDATE SET
    
          ANNEE_ID               = v.ANNEE_ID,
          AUTO_VALIDATION        = v.AUTO_VALIDATION,
          to_delete = 0
    
        WHEN NOT MATCHED THEN INSERT (
    
          ID,
          ANNEE_ID,
          INTERVENANT_ID,
          STRUCTURE_ID,
          TYPE_VOLUME_HORAIRE_ID,
          SERVICE_REFERENTIEL_ID,
          VALIDATION_ID,
          VOLUME_HORAIRE_REF_ID,
          AUTO_VALIDATION,
          TO_DELETE
    
        ) VALUES (
    
          TBL_VALIDATION_REFERENT_ID_SEQ.NEXTVAL,
          v.ANNEE_ID,
          v.INTERVENANT_ID,
          v.STRUCTURE_ID,
          v.TYPE_VOLUME_HORAIRE_ID,
          v.SERVICE_REFERENTIEL_ID,
          v.VALIDATION_ID,
          v.VOLUME_HORAIRE_REF_ID,
          v.AUTO_VALIDATION,
          0
    
        );
    
        DELETE TBL_VALIDATION_REFERENTIEL WHERE to_delete = 1 AND ' || conds || ';
    
        END;';
    
        END;
    
      -- END OF AUTOMATIC GENERATION --
    
    END UNICAEN_TBL;
    /