diff --git a/bdd/update/08.1.sql b/bdd/update/08.1.sql index c2cefb7e6caac0f2180246bd7292447afb9ba772..73974bf2f8eab3668d50ed710cc61715dd43757b 100644 --- a/bdd/update/08.1.sql +++ b/bdd/update/08.1.sql @@ -3,7 +3,5703 @@ +-- OseAdmin\Bdd\Ddl\DdlSequence.drop. +DROP SEQUENCE MESSAGE_ID_SEQ + +/ + +DROP SEQUENCE PACKAGE_DEPS_ID_SEQ + +/ + +DROP SEQUENCE PERSONNEL_ID_SEQ + +/ + +DROP SEQUENCE TBL_CHARGENS_SEUILS_ID_SEQ + +/ + +DROP SEQUENCE TBL_CONFIG_CLES_ID_SEQ + +/ + +DROP SEQUENCE TBL_CONFIG_ID_SEQ + +/ + +DROP SEQUENCE TBL_DEPENDANCES_ID_SEQ + +/ + +DROP SEQUENCE TMP_CALCUL_ID_SEQ + +/ + +DROP SEQUENCE TYPE_INTERVENTION_REGLE_ID_SEQ + +/ + +DROP SEQUENCE TYPE_STRUCTURE_ID_SEQ + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlPackage.drop. + +DROP PACKAGE UNICAEN_OSE_FORMULE + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlSequence.create. + +CREATE SEQUENCE FORMULE_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE + +/ + +CREATE SEQUENCE FTEST_INTERVENANT_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE + +/ + +CREATE SEQUENCE FTEST_STRUCTURE_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE + +/ + +CREATE SEQUENCE FTEST_VOLUME_HORAIRE_ID_SEQ INCREMENT BY 1 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCACHE + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlTable.create. + +CREATE TABLE "FORMULE" +( "ID" NUMBER(*,0) NOT NULL ENABLE, + "LIBELLE" VARCHAR2(100 CHAR) NOT NULL ENABLE, + "PACKAGE_NAME" VARCHAR2(30 CHAR) NOT NULL ENABLE, + "PROCEDURE_NAME" VARCHAR2(30 CHAR) NOT NULL ENABLE +) + +/ + +CREATE TABLE "FORMULE_TEST_INTERVENANT" +( "ID" NUMBER(*,0) NOT NULL ENABLE, + "LIBELLE" VARCHAR2(150 CHAR) NOT NULL ENABLE, + "FORMULE_ID" NUMBER(*,0) NOT NULL ENABLE, + "ANNEE_ID" NUMBER(*,0) NOT NULL ENABLE, + "TYPE_INTERVENANT_ID" NUMBER(*,0) DEFAULT 1 NOT NULL ENABLE, + "STRUCTURE_TEST_ID" NUMBER(*,0) NOT NULL ENABLE, + "TYPE_VOLUME_HORAIRE_ID" NUMBER(*,0) DEFAULT 1 NOT NULL ENABLE, + "ETAT_VOLUME_HORAIRE_ID" NUMBER(*,0) DEFAULT 1 NOT NULL ENABLE, + "HEURES_DECHARGE" FLOAT(126) NOT NULL ENABLE, + "HEURES_SERVICE_STATUTAIRE" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "HEURES_SERVICE_MODIFIE" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "DEPASSEMENT_SERVICE_DU_SANS_HC" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE, + "PARAM_1" VARCHAR2(50 CHAR), + "PARAM_2" VARCHAR2(50 CHAR), + "PARAM_3" VARCHAR2(50 CHAR), + "PARAM_4" VARCHAR2(50 CHAR), + "PARAM_5" VARCHAR2(50 CHAR), + "A_SERVICE_DU" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "C_SERVICE_DU" FLOAT(126), + "DEBUG_INFO" CLOB +) + +/ + +COMMENT ON TABLE "FORMULE_TEST_INTERVENANT" IS 'sequence=FTEST_INTERVENANT_ID_SEQ;' + +/ + +CREATE TABLE "FORMULE_TEST_STRUCTURE" +( "ID" NUMBER(*,0) NOT NULL ENABLE, + "LIBELLE" VARCHAR2(80 CHAR) NOT NULL ENABLE, + "UNIVERSITE" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE +) + +/ + +COMMENT ON TABLE "FORMULE_TEST_STRUCTURE" IS 'sequence=FTEST_STRUCTURE_ID_SEQ;' + +/ + +CREATE TABLE "FORMULE_TEST_VOLUME_HORAIRE" +( "ID" NUMBER(*,0) NOT NULL ENABLE, + "INTERVENANT_TEST_ID" NUMBER(*,0) NOT NULL ENABLE, + "STRUCTURE_TEST_ID" NUMBER(*,0) NOT NULL ENABLE, + "REFERENTIEL" NUMBER(1,0) DEFAULT 0 NOT NULL ENABLE, + "SERVICE_STATUTAIRE" NUMBER(1,0) DEFAULT 1 NOT NULL ENABLE, + "TAUX_FI" FLOAT(126) DEFAULT 1 NOT NULL ENABLE, + "TAUX_FA" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "TAUX_FC" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "TAUX_SERVICE_DU" FLOAT(126) DEFAULT 1 NOT NULL ENABLE, + "TAUX_SERVICE_COMPL" FLOAT(126) DEFAULT 1 NOT NULL ENABLE, + "PONDERATION_SERVICE_DU" FLOAT(126) DEFAULT 1 NOT NULL ENABLE, + "PONDERATION_SERVICE_COMPL" FLOAT(126) DEFAULT 1 NOT NULL ENABLE, + "PARAM_1" VARCHAR2(50 CHAR), + "PARAM_2" VARCHAR2(50 CHAR), + "PARAM_3" VARCHAR2(50 CHAR), + "PARAM_4" VARCHAR2(50 CHAR), + "PARAM_5" VARCHAR2(50 CHAR), + "HEURES" FLOAT(126) DEFAULT 0 NOT NULL ENABLE, + "A_SERVICE_FI" FLOAT(126), + "A_SERVICE_FA" FLOAT(126), + "A_SERVICE_FC" FLOAT(126), + "A_SERVICE_REFERENTIEL" FLOAT(126), + "A_HEURES_COMPL_FI" FLOAT(126), + "A_HEURES_COMPL_FA" FLOAT(126), + "A_HEURES_COMPL_FC" FLOAT(126), + "A_HEURES_COMPL_FC_MAJOREES" FLOAT(126), + "A_HEURES_COMPL_REFERENTIEL" FLOAT(126), + "C_SERVICE_FI" FLOAT(126), + "C_SERVICE_FA" FLOAT(126), + "C_SERVICE_FC" FLOAT(126), + "C_SERVICE_REFERENTIEL" FLOAT(126), + "C_HEURES_COMPL_FI" FLOAT(126), + "C_HEURES_COMPL_FA" FLOAT(126), + "C_HEURES_COMPL_FC" FLOAT(126), + "C_HEURES_COMPL_FC_MAJOREES" FLOAT(126), + "C_HEURES_COMPL_REFERENTIEL" FLOAT(126), + "DEBUG_INFO" CLOB +) + +/ + +COMMENT ON TABLE "FORMULE_TEST_VOLUME_HORAIRE" IS 'sequence=FTEST_VOLUME_HORAIRE_ID_SEQ;' + +/ + +CREATE TABLE "LISTE_NOIRE" +( "CODE" VARCHAR2(50 CHAR) NOT NULL ENABLE +) + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlPrimaryConstraint.create. + +ALTER TABLE FORMULE ADD CONSTRAINT FORMULE_PK PRIMARY KEY (ID) USING INDEX ( + CREATE UNIQUE INDEX FORMULE_PK ON FORMULE(ID ASC) + ) ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FORMULE_TEST_INTERVENANT_PK PRIMARY KEY (ID) USING INDEX ( + CREATE UNIQUE INDEX FORMULE_TEST_INTERVENANT_PK ON FORMULE_TEST_INTERVENANT(ID ASC) + ) ENABLE + +/ + +ALTER TABLE FORMULE_TEST_STRUCTURE ADD CONSTRAINT FORMULE_TEST_STRUCTURE_PK PRIMARY KEY (ID) USING INDEX ( + CREATE UNIQUE INDEX FORMULE_TEST_STRUCTURE_PK ON FORMULE_TEST_STRUCTURE(ID ASC) + ) ENABLE + +/ + +ALTER TABLE FORMULE_TEST_VOLUME_HORAIRE ADD CONSTRAINT FORMULE_TEST_VOLUME_HORAIRE_PK PRIMARY KEY (ID) USING INDEX ( + CREATE UNIQUE INDEX FORMULE_TEST_VOLUME_HORAIRE_PK ON FORMULE_TEST_VOLUME_HORAIRE(ID ASC) + ) ENABLE + +/ + +ALTER TABLE LISTE_NOIRE ADD CONSTRAINT INTERVENANT_LISTE_NOIRE_PK PRIMARY KEY (CODE) USING INDEX ( + CREATE UNIQUE INDEX INTERVENANT_LISTE_NOIRE_PK ON LISTE_NOIRE(CODE ASC) + ) ENABLE + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlPackage.create. + +CREATE OR REPLACE PACKAGE "FORMULE_MONTPELLIER" AS + + PROCEDURE CALCUL_RESULTAT; + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT; + +END FORMULE_MONTPELLIER + + / + +CREATE OR REPLACE PACKAGE BODY "FORMULE_MONTPELLIER" AS + decalageLigne NUMERIC DEFAULT 20; + + + /* Stockage des valeurs intermédiaires */ + TYPE t_cell IS RECORD ( + valeur FLOAT, + enCalcul BOOLEAN DEFAULT FALSE + ); + TYPE t_cells IS TABLE OF t_cell INDEX BY PLS_INTEGER; + TYPE t_coll IS RECORD ( + cells t_cells + ); + TYPE t_colls IS TABLE OF t_coll INDEX BY VARCHAR2(50); + feuille t_colls; + + debugActif BOOLEAN DEFAULT TRUE; + debugLine NUMERIC; + + + PROCEDURE dbg( val CLOB ) IS + BEGIN + ose_formule.volumes_horaires.items(debugLine).debug_info := + ose_formule.volumes_horaires.items(debugLine).debug_info || val; + END; + + + PROCEDURE dbgi( val CLOB ) IS + BEGIN + ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val; + END; + + PROCEDURE dbgDump( val CLOB ) IS + BEGIN + dbg(' +' || val || ' +'); + END; + + PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS + ligne NUMERIC; + BEGIN + ligne := l; + IF l <> 0 THEN + ligne := ligne + decalageLigne; + END IF; + + dbgi( '[cell|' || c || '|' || ligne || '|' || val ); + END; + + PROCEDURE dbgCalc( fncName VARCHAR2, c VARCHAR2, res FLOAT ) IS + BEGIN + dbgi( '[calc|' || fncName || '|' || c || '|' || res ); + END; + + FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS + val FLOAT; + BEGIN + IF feuille.exists(c) THEN + IF feuille(c).cells.exists(l) THEN + IF feuille(c).cells(l).enCalcul THEN + raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul'); + END IF; + RETURN feuille(c).cells(l).valeur; + END IF; + END IF; + + feuille(c).cells(l).enCalcul := true; + val := calcCell( c, l ); + IF debugActif THEN + dbgCell( c, l, val ); + END IF; + feuille(c).cells(l).valeur := val; + feuille(c).cells(l).enCalcul := false; + + RETURN val; + END; + + FUNCTION mainCell( libelle VARCHAR2, c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + val FLOAT; + BEGIN + debugLine := l; + val := cell(c,l); + + RETURN val; + END; + + FUNCTION calcFnc( fncName VARCHAR2, c VARCHAR2 ) RETURN FLOAT IS + val FLOAT; + cellRes FLOAT; + BEGIN + IF feuille.exists('__' || fncName || '__' || c || '__') THEN + IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN + RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur; + END IF; + END IF; + CASE + -- Liste des fonctions supportées + + WHEN fncName = 'total' THEN + val := 0; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + val := val + COALESCE(cell(c, l),0); + END LOOP; + + WHEN fncName = 'max' THEN + val := NULL; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + cellRes := cell(c,l); + IF val IS NULL OR val < cellRes THEN + val := cellRes; + END IF; + END LOOP; + + -- fin de la liste des fonctions supportées + ELSE + raise_application_error( -20001, 'La formule "' || fncName || '" n''existe pas!'); + END CASE; + IF debugActif THEN + dbgCalc(fncName, c, val ); + END IF; + feuille('__' || fncName || '__' || c || '__').cells(1).valeur := val; + + RETURN val; + END; + + + FUNCTION calcVersion RETURN NUMERIC IS + BEGIN + RETURN 1; + END; + + + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + vh ose_formule.t_volume_horaire; + v NUMERIC; + val FLOAT; + BEGIN + v := calcVersion; + + IF l > 0 THEN + vh := ose_formule.volumes_horaires.items(l); + END IF; + CASE + + + -- J = SI(ESTVIDE(C21);0;RECHERCHEH(SI(ET(C21="TP";TP_vaut_TD="Oui");"TD";C21);types_intervention;2;0)) + WHEN c = 'j' AND v >= 1 THEN + RETURN GREATEST(vh.taux_service_du * vh.ponderation_service_du,1); + + + + -- K = SI(H21="Oui";I21*J21;0) + WHEN c = 'k' AND v >= 1 THEN + IF vh.service_statutaire THEN + RETURN vh.heures * cell('j',l); + ELSE + RETURN 0; + END IF; + + + + -- l = SI(L20+K21>service_du;service_du;L20+K21) + WHEN c = 'l' AND v >= 1 THEN + IF l < 1 THEN + RETURN 0; + END IF; + IF cell('l', l-1) + cell('k',l) > ose_formule.intervenant.service_du THEN + RETURN ose_formule.intervenant.service_du; + ELSE + RETURN cell('l', l-1) + cell('k',l); + END IF; + + + + -- m = SI(J21>0;SI(L20+K21= 1 THEN + IF cell('j',l) > 0 THEN + IF cell('l',l-1) + cell('k',l) < ose_formule.intervenant.service_du THEN + RETURN 0; + ELSE + RETURN (cell('l',l-1) + cell('k',l) - ose_formule.intervenant.service_du) / cell('j',l); + END IF; + ELSE + RETURN 0; + END IF; + + + + -- n = SI(ESTVIDE(C21);0;RECHERCHEH(C21;types_intervention;3;0)) + WHEN c = 'n' AND v >= 1 THEN + RETURN vh.taux_service_compl * vh.ponderation_service_compl; + + + + -- o = SI(OU(service_realise"Oui");0;(M21+SI(H21<>"Oui";I21;0))*N21) + -- service_realise = MAX($L$21:$L$50) + -- service_du = ose_formule.intervenant.service_du + -- HC_autorisees = ose_formule.intervenant.depassement_service_du_sans_hc = false + WHEN c = 'o' AND v >= 1 THEN + IF (calcFnc('max','l') < ose_formule.intervenant.service_du) OR ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN 0; + ELSE + IF vh.service_statutaire THEN + RETURN cell('m',l) * cell('n',l); + ELSE + RETURN (cell('m',l) + vh.heures) * cell('n',l); + END IF; + END IF; + + + + -- q =SI(ESTVIDE(C21);0;SI(C21="TP";1;RECHERCHEH(C21;types_intervention;2;0))) + -- Nouvelle interprêtation de la formule : on n'a pas 'TP' donc tout ce qui est <1 devient 1 + WHEN c = 'q' AND v >= 1 THEN + RETURN GREATEST( vh.taux_service_compl, 1); + + + + -- r =I21*Q21 + WHEN c = 'r' AND v >= 1 THEN + RETURN vh.heures * cell('q',l); + + + + -- r136 =SOMME.SI(B$21:B$50;composante_affectation;R$21:R$50) + WHEN c = 'r136' AND v >= 1 THEN + val := 0; + FOR i IN 1 .. ose_formule.volumes_horaires.length LOOP + IF ose_formule.volumes_horaires.items(i).structure_is_affectation THEN + val := val + cell('r',i); + END IF; + END LOOP; + RETURN val; + + + + -- r137 =SOMME.SI(B$21:B$50;"<>"&composante_affectation;R$21:R$50) + WHEN c = 'r137' AND v >= 1 THEN + val := 0; + FOR i IN 1 .. ose_formule.volumes_horaires.length LOOP + IF NOT ose_formule.volumes_horaires.items(i).structure_is_affectation THEN + val := val + cell('r',i); + END IF; + END LOOP; + RETURN val; + + + + -- s =SI(B21=composante_affectation;SI($R$53=0;0;R21*$S$53/$R$53);SI($R$54=0;0;R21*$S$54/$R$54)) + WHEN c = 's' AND v >= 1 THEN + IF vh.structure_is_affectation THEN + IF cell('r136') = 0 THEN + RETURN 0; + ELSE + RETURN cell('r',l) * cell('s136')/cell('r136'); + END IF; + ELSE + IF cell('r137') = 0 THEN + RETURN 0; + ELSE + RETURN cell('r',l) * cell('s137')/cell('r137'); + END IF; + END IF; + + + + -- s136 =SI(OU(HC=0;r136= 1 THEN + IF calcFnc('total','o') = 0 OR cell('r136') < ose_formule.intervenant.service_du THEN + RETURN 0; + ELSE + -- SI(R137=0;HC;SI((HC-R137)<(HC*(R136-service_du)/R132);HC*(R136-service_du)/R132;HC-R137)) + IF cell('r137') = 0 THEN + RETURN calcFnc('total','o'); + ELSE + -- SI((HC-R137)<(HC*(R136-service_du)/R132);HC*(R136-service_du)/R132;HC-R137) + IF (calcFnc('total','o')-cell('r137'))<(calcFnc('total','o')*(cell('r136')-ose_formule.intervenant.service_du)/calcFnc('total','r')) THEN + -- HC*(R136-service_du)/R132 + RETURN calcFnc('total','o')*(cell('r136')-ose_formule.intervenant.service_du)/calcFnc('total','r'); + ELSE + -- HC-R137 + RETURN calcFnc('total','o')-cell('r137'); + END IF; + END IF; + END IF; + + + + -- s137 =SI(HC=0;0;r137*(HC-s136)/r137) + -- s137 =SI(R137=0;0;SI(HC=0;0;HC-S136)) + WHEN c = 's137' AND v >= 1 THEN + IF calcFnc('total','o') = 0 THEN + RETURN 0; + ELSE + RETURN cell('r137')*(calcFnc('total','o')-cell('s136'))/cell('r137'); + END IF; + + + + -- s138 =SOMME(S136:S137) + WHEN c = 's138' AND v >= 1 THEN + RETURN cell('s136') + cell('s138'); + + + + -- t136 =SI(R136=0;0;S136/R136) + WHEN c = 't136' AND v >= 1 THEN + IF cell('r136') = 0 THEN + RETURN 0; + ELSE + RETURN cell('s136') / cell('r136'); + END IF; + + + + -- t137 =SI(R137=0;0;S137/R137) + WHEN c = 't137' AND v >= 1 THEN + IF cell('r137') = 0 THEN + RETURN 0; + ELSE + RETURN cell('s137') / cell('r137'); + END IF; + + + + -- u =SI(R137=0;0;S137/R137) + -- u =SI(OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non"));0;SI(H21="Non";O21;SI($M21>0;(($M21*$N21)+($I21-$M21)*J21)*$D21;$K21*$D21))) + WHEN c = 'u' AND v >= 1 THEN + -- OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non")) + IF vh.volume_horaire_ref_id IS NOT NULL OR (calcFnc('total','o')=0 AND NOT vh.service_statutaire) THEN + RETURN 0; + ELSE + -- SI(H21="Non";O21;SI($M21>0;(($M21*$N21)+($I21-$M21)*J21)*$D21;$K21*$D21)) + IF NOT vh.service_statutaire THEN + RETURN cell('o',l); + ELSE + -- SI($M21>0;(($M21*$N21)+($I21-$M21)*J21)*$D21;$K21*$D21) + IF cell('m',l) > 0 THEN + -- (($M21*$N21)+($I21-$M21)*J21)*$D21 + RETURN ((cell('m',l)*cell('n',l))+(vh.heures-cell('m',l))*cell('j',l))*vh.taux_fi; + ELSE + -- $K21*$D21 + RETURN cell('k',l) * vh.taux_fi; + END IF; + END IF; + END IF; + + + + -- v =SI(OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non"));0;SI(H21="Non";O21;SI($M21>0;(($M21*$N21)+($I21-$M21)*K21)*$E21;$K21*$E21))) + -- HC = calcFnc('total','o') + -- H21="Non" = NOT vh.service_statutaire + -- P21 = O21!! + WHEN c = 'v' AND v >= 1 THEN + -- OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non")) + IF vh.volume_horaire_ref_id IS NOT NULL OR (calcFnc('total','o')=0 AND NOT vh.service_statutaire) THEN + RETURN 0; + ELSE + -- SI(H21="Non";P21;SI($M21>0;(($M21*$N21)+($I21-$M21)*K21)*$E21;$K21*$E21)) + IF NOT vh.service_statutaire THEN + RETURN cell('o',l); + ELSE + -- SI($M21>0;(($M21*$N21)+($I21-$M21)*K21)*$E21;$K21*$E21) + IF cell('m',l) > 0 THEN + -- (($M21*$N21)+($I21-$M21)*K21)*$E21 + RETURN ((cell('m',l)*cell('n',l))+(vh.heures-cell('m',l))*cell('k',l))*vh.taux_fa; + ELSE + -- $K21*$E21 + RETURN cell('k',l) * vh.taux_fa; + END IF; + END IF; + END IF; + + + + -- w =SI(OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non"));0;SI(H21="Non";Q21;SI($M21>0;(($M21*$N21)+($I21-$M21)*L21)*$F21;$K21*$F21))) + WHEN c = 'w' AND v >= 1 THEN + -- OU(ESTVIDE($C21);$C21="Référentiel";ET(HC=0;H21="Non")) + IF vh.volume_horaire_ref_id IS NOT NULL OR (calcFnc('total','o')=0 AND NOT vh.service_statutaire) THEN + RETURN 0; + ELSE + --SI(H21="Non";Q21;SI($M21>0;(($M21*$N21)+($I21-$M21)*L21)*$F21;$K21*$F21)) + IF NOT vh.service_statutaire THEN + RETURN cell('q',l); + ELSE + -- SI($M21>0;(($M21*$N21)+($I21-$M21)*L21)*$F21;$K21*$F21) + IF cell('m',l) > 0 THEN + RETURN ((cell('m',l)*cell('n',l))+(vh.heures-cell('m',l))*cell('l',l))*vh.taux_fc; + ELSE + -- $K21*$F21 + RETURN cell('k',l) * vh.taux_fc; + END IF; + END IF; + END IF; + + + + -- x =SI($C21="Référentiel";$K21-$M21;0) + WHEN c = 'x' AND v >= 1 THEN + IF vh.volume_horaire_ref_id IS NOT NULL THEN + RETURN cell('k',l) - cell('m',l); + ELSE + RETURN 0; + END IF; + + + + -- y =SI($C21="Référentiel";0;$S21) + WHEN c = 'y' AND v >= 1 THEN + IF vh.volume_horaire_id IS NOT NULL THEN + RETURN cell('s',l); + ELSE + RETURN 0; + END IF; + + + + -- z =0 + WHEN c = 'z' AND v >= 1 THEN + RETURN 0; + + + + -- aa =0 + WHEN c = 'aa' AND v >= 1 THEN + RETURN 0; + + + + -- ab =0 + WHEN c = 'ab' AND v >= 1 THEN + RETURN 0; + + + + -- ac =SI($C21="Référentiel";$S21;0) + WHEN c = 'ac' AND v >= 1 THEN + IF vh.volume_horaire_ref_id IS NOT NULL THEN + RETURN cell('s',l); + ELSE + RETURN 0; + END IF; + + + + + + ELSE + raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); + END CASE; END; + + + + PROCEDURE CALCUL_RESULTAT IS + BEGIN + feuille.delete; + + -- transmission des résultats aux volumes horaires et volumes horaires référentiel + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'u',l); + ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'v',l); + ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'w',l); + ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'x',l); + ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'y',l); + ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'z',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'aa',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'ab',l); + ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'ac',l); + END LOOP; + END; + +END FORMULE_MONTPELLIER + + / + +CREATE OR REPLACE PACKAGE "FORMULE_UBO" AS + + PROCEDURE CALCUL_RESULTAT; + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT; + +END FORMULE_UBO + + / + +CREATE OR REPLACE PACKAGE BODY "FORMULE_UBO" AS + decalageLigne NUMERIC DEFAULT 0; + + + /* Stockage des valeurs intermédiaires */ + TYPE t_cell IS RECORD ( + valeur FLOAT, + enCalcul BOOLEAN DEFAULT FALSE + ); + TYPE t_cells IS TABLE OF t_cell INDEX BY PLS_INTEGER; + TYPE t_coll IS RECORD ( + cells t_cells + ); + TYPE t_colls IS TABLE OF t_coll INDEX BY VARCHAR2(50); + feuille t_colls; + + debugActif BOOLEAN DEFAULT TRUE; + debugLine NUMERIC; + + + PROCEDURE dbg( val CLOB ) IS + BEGIN + ose_formule.volumes_horaires.items(debugLine).debug_info := + ose_formule.volumes_horaires.items(debugLine).debug_info || val; + END; + + + PROCEDURE dbgi( val CLOB ) IS + BEGIN + ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val; + END; + + PROCEDURE dbgDump( val CLOB ) IS + BEGIN + dbg(' +' || val || ' +'); + END; + + PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS + ligne NUMERIC; + BEGIN + ligne := l; + IF l <> 0 THEN + ligne := ligne + decalageLigne; + END IF; + + dbgi( '[cell|' || c || '|' || ligne || '|' || val ); + END; + + PROCEDURE dbgCalc( fncName VARCHAR2, c VARCHAR2, res FLOAT ) IS + BEGIN + dbgi( '[calc|' || fncName || '|' || c || '|' || res ); + END; + + FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS + val FLOAT; + BEGIN + IF feuille.exists(c) THEN + IF feuille(c).cells.exists(l) THEN + IF feuille(c).cells(l).enCalcul THEN + raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul'); + END IF; + RETURN feuille(c).cells(l).valeur; + END IF; + END IF; + + feuille(c).cells(l).enCalcul := true; + val := calcCell( c, l ); + IF debugActif THEN + dbgCell( c, l, val ); + END IF; + feuille(c).cells(l).valeur := val; + feuille(c).cells(l).enCalcul := false; + + RETURN val; + END; + + FUNCTION mainCell( libelle VARCHAR2, c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + val FLOAT; + BEGIN + debugLine := l; + val := cell(c,l); + + RETURN val; + END; + + FUNCTION calcFnc( fncName VARCHAR2, c VARCHAR2 ) RETURN FLOAT IS + val FLOAT; + cellRes FLOAT; + BEGIN + IF feuille.exists('__' || fncName || '__' || c || '__') THEN + IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN + RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur; + END IF; + END IF; + CASE + -- Liste des fonctions supportées + + WHEN fncName = 'total' THEN + val := 0; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + val := val + COALESCE(cell(c, l),0); + END LOOP; + + WHEN fncName = 'max' THEN + val := NULL; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + cellRes := cell(c,l); + IF val IS NULL OR val < cellRes THEN + val := cellRes; + END IF; + END LOOP; + + -- fin de la liste des fonctions supportées + ELSE + raise_application_error( -20001, 'La formule "' || fncName || '" n''existe pas!'); + END CASE; + IF debugActif THEN + dbgCalc(fncName, c, val ); + END IF; + feuille('__' || fncName || '__' || c || '__').cells(1).valeur := val; + + RETURN val; + END; + + + FUNCTION calcVersion RETURN NUMERIC IS + BEGIN + RETURN 1; + END; + + + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + vh ose_formule.t_volume_horaire; + v NUMERIC; + val FLOAT; + BEGIN + v := calcVersion; + + IF l > 0 THEN + vh := ose_formule.volumes_horaires.items(l); + END IF; + CASE + + + -- t11=SI(ET($H26=$I$11;NON($F26));I26;0) + WHEN c = 't11' AND v >= 1 THEN + IF vh.structure_is_affectation AND NOT vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t12=SI(ET($H26<>$I$11;NON($F26));I26;0) + WHEN c = 't12' AND v >= 1 THEN + IF NOT vh.structure_is_affectation AND NOT vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t13=SI(ET($H26=$I$11;$F26);I26;0) + WHEN c = 't13' AND v >= 1 THEN + IF vh.structure_is_affectation AND vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t14=SI(ET($H26<>$I$11;$F26);I26;0) + WHEN c = 't14' AND v >= 1 THEN + IF NOT vh.structure_is_affectation AND vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t15=SI($H38=$I$11;I38;0) + WHEN c = 't15' AND v >= 1 THEN + IF vh.structure_is_affectation THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t16=SI(ET($H38<>$I$11;$H38<>$I$2);I38;0) + WHEN c = 't16' AND v >= 1 THEN + IF NOT vh.structure_is_affectation AND NOT vh.structure_is_univ THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t17=SI($H38=$I$2;I38;0) + WHEN c = 't17' AND v >= 1 THEN + IF vh.structure_is_univ THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + -- t21=I47*I$24 + WHEN c = 't21' AND v >= 1 THEN + RETURN cell('t11', l) * vh.taux_service_du; + + + + -- t22=S47*I$24 + WHEN c = 't22' AND v >= 1 THEN + RETURN cell('t12', l) * vh.taux_service_du; + + + + -- t23=AC47*I$24 + WHEN c = 't23' AND v >= 1 THEN + RETURN cell('t13', l) * vh.taux_service_du; + + + + -- t24=AM47*I$24 + WHEN c = 't24' AND v >= 1 THEN + RETURN cell('t14', l) * vh.taux_service_du; + + + + -- t25=AW47*$R$5 + WHEN c = 't25' AND v >= 1 THEN + RETURN cell('t15', l); + + + + -- t26=AY47*$R$5 + WHEN c = 't26' AND v >= 1 THEN + RETURN cell('t16', l); + + + + -- t27=BA47*$R$5 + WHEN c = 't27' AND v >= 1 THEN + RETURN cell('t17', l); + + + + -- t31=MAX(I15-Q69;0) + WHEN c = 't31' AND v >= 1 THEN + RETURN LEAST(ose_formule.intervenant.service_du - calcFnc('total','t21'), 0); + + + + -- t32=MAX(Q71-AA69;0) + WHEN c = 't32' AND v >= 1 THEN + RETURN LEAST(cell('t31') - calcFnc('total','t22'), 0); + + + + -- t33=MAX(AA71-AK69;0) + WHEN c = 't33' AND v >= 1 THEN + RETURN LEAST(cell('t32') - calcFnc('total','t23'), 0); + + + + -- t34=MAX(AK71-AU69;0) + WHEN c = 't34' AND v >= 1 THEN + RETURN LEAST(cell('t33') - calcFnc('total','t24'), 0); + + + + -- t35=MAX(AU71-AW64;0) + WHEN c = 't35' AND v >= 1 THEN + RETURN LEAST(cell('t34') - calcFnc('total','t25'), 0); + + + + -- t36=MAX(AW71-AY64;0) + WHEN c = 't36' AND v >= 1 THEN + RETURN LEAST(cell('t35', l) - calcFnc('total','t26'), 0); + + + + -- t37=MAX(AY71-BA64;0) + WHEN c = 't37' AND v >= 1 THEN + RETURN LEAST(cell('t36', l) - calcFnc('total','t27'), 0); + + + + -- t41=SI($Q$69<>0;I59/$Q$69;0) + WHEN c = 't41' AND v >= 1 THEN + IF calcFnc('total','t21') <> 0 THEN + RETURN cell('t21', l) / calcFnc('total','t21'); + ELSE + RETURN 0; + END IF; + + + + -- t42=SI($AA$69<>0;S59/$AA$69;0) + WHEN c = 't42' AND v >= 1 THEN + IF calcFnc('total','t22') <> 0 THEN + RETURN cell('t22', l) / calcFnc('total','t22'); + ELSE + RETURN 0; + END IF; + + + + -- t43=SI($AK$69<>0;AC59/$AK$69;0) + WHEN c = 't43' AND v >= 1 THEN + IF calcFnc('total','t23') <> 0 THEN + RETURN cell('t23', l) / calcFnc('total','t23'); + ELSE + RETURN 0; + END IF; + + + + -- t44=SI($AU$69<>0;AM59/$AU$69;0) + WHEN c = 't44' AND v >= 1 THEN + IF calcFnc('total','t24') <> 0 THEN + RETURN cell('t24', l) / calcFnc('total','t24'); + ELSE + RETURN 0; + END IF; + + + + -- t45=SI($AW$64<>0;AW59/$AW$64;0) + WHEN c = 't45' AND v >= 1 THEN + IF calcFnc('total','t25') <> 0 THEN + RETURN cell('t25', l) / calcFnc('total','t25'); + ELSE + RETURN 0; + END IF; + + + + -- t46=SI($AY$64<>0;AY59/$AY$64;0) + WHEN c = 't46' AND v >= 1 THEN + IF calcFnc('total','t26') <> 0 THEN + RETURN cell('t26', l) / calcFnc('total','t26'); + ELSE + RETURN 0; + END IF; + + + + -- t47=SI($BA$64<>0;BA59/$BA$64;0) + WHEN c = 't47' AND v >= 1 THEN + IF calcFnc('total','t27') <> 0 THEN + RETURN cell('t27', l) / calcFnc('total','t27'); + ELSE + RETURN 0; + END IF; + + + + -- t51=MIN($I$15;$Q$69)*I74 + WHEN c = 't51' AND v >= 1 THEN + RETURN LEAST(ose_formule.intervenant.service_du, calcFnc('total','t21')) * cell('t41', l); + + + + -- t52=MIN($Q$71;$AA$69)*S74 + WHEN c = 't52' AND v >= 1 THEN + RETURN LEAST(cell('t31'), calcFnc('total','t22')) * cell('t42', l); + + + + -- t53=MIN($AA$71;$AK$69)*AC74 + WHEN c = 't53' AND v >= 1 THEN + RETURN LEAST(cell('t32'), calcFnc('total','t23')) * cell('t43', l); + + + + -- t54=MIN($AK$71;$AU$69)*AM74 + WHEN c = 't54' AND v >= 1 THEN + RETURN LEAST(cell('t33'), calcFnc('total','t24')) * cell('t44', l); + + + + -- t55=MIN($AU$71;$AW$64)*AW74 + WHEN c = 't55' AND v >= 1 THEN + RETURN LEAST(cell('t34'), calcFnc('total','t25')) * cell('t45', l); + + + + -- t56=MIN($AW$71;$AY$64)*AY74 + WHEN c = 't56' AND v >= 1 THEN + RETURN LEAST(cell('t35'), calcFnc('total','t26')) * cell('t46', l); + + + + -- t57=MIN($AY$71;$BA$64)*BA74 + WHEN c = 't57' AND v >= 1 THEN + RETURN LEAST(cell('t36'), calcFnc('total','t27')) * cell('t47', l); + + + + -- t61=I86*$C26 + WHEN c = 't61' AND v >= 1 THEN + RETURN cell('t51', l) * vh.taux_fi; + + + + -- t62=S86*$C26 + WHEN c = 't62' AND v >= 1 THEN + RETURN cell('t52', l) * vh.taux_fi; + + + + -- t71=I86*$D26 + WHEN c = 't71' AND v >= 1 THEN + RETURN cell('t51', l) * vh.taux_fa; + + + + -- t72=S86*$D26 + WHEN c = 't72' AND v >= 1 THEN + RETURN cell('t52', l) * vh.taux_fa; + + + + -- t81=I86*$E26 + WHEN c = 't81' AND v >= 1 THEN + RETURN cell('t51', l) * vh.taux_fc; + + + + -- t82=S86*$E26 + WHEN c = 't82' AND v >= 1 THEN + RETURN cell('t52', l) * vh.taux_fc; + + + + -- t83=AC86*$E26 + WHEN c = 't83' AND v >= 1 THEN + RETURN cell('t53', l) * vh.taux_fc; + + + + -- t84=AM86*$E26 + WHEN c = 't84' AND v >= 1 THEN + RETURN cell('t54', l) * vh.taux_fc; + + + + -- t91=SI(I59<>0;I86/I59;0) + WHEN c = 't91' AND v >= 1 THEN + IF cell('t21', l) <> 0 THEN + RETURN cell('t51', l) / cell('t21', l); + ELSE + RETURN 0; + END IF; + + + + -- t92=SI(S59<>0;S86/S59;0) + WHEN c = 't92' AND v >= 1 THEN + IF cell('t22', l) <> 0 THEN + RETURN cell('t52', l) / cell('t22', l); + ELSE + RETURN 0; + END IF; + + + + -- t93=SI(AC59<>0;AC86/AC59;0) + WHEN c = 't93' AND v >= 1 THEN + IF cell('t23', l) <> 0 THEN + RETURN cell('t53', l) / cell('t23', l); + ELSE + RETURN 0; + END IF; + + + + -- t94=SI(AM59<>0;AM86/AM59;0) + WHEN c = 't94' AND v >= 1 THEN + IF cell('t24', l) <> 0 THEN + RETURN cell('t54', l) / cell('t24', l); + ELSE + RETURN 0; + END IF; + + + + -- t95=SI(AW59<>0;AW86/AW59;0) + WHEN c = 't95' AND v >= 1 THEN + IF cell('t25', l) <> 0 THEN + RETURN cell('t55', l) / cell('t25', l); + ELSE + RETURN 0; + END IF; + + + + -- t96=SI(AY59<>0;AY86/AY59;0) + WHEN c = 't96' AND v >= 1 THEN + IF cell('t26', l) <> 0 THEN + RETURN cell('t56', l) / cell('t26', l); + ELSE + RETURN 0; + END IF; + + + + -- t97=SI(BA59<>0;BA86/BA59;0) + WHEN c = 't97' AND v >= 1 THEN + IF cell('t27', l) <> 0 THEN + RETURN cell('t57', l) / cell('t27', l); + ELSE + RETURN 0; + END IF; + + + + -- t101=SI($BA$71<>0;0;1-I134) + WHEN c = 't101' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t91', l); + END IF; + + + + -- t102=SI($BA$71<>0;0;1-S134) + WHEN c = 't102' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t92', l); + END IF; + + + + -- t103=SI($BA$71<>0;0;1-AC134) + WHEN c = 't103' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t93', l); + END IF; + + + + -- t104=SI($BA$71<>0;0;1-AM134) + WHEN c = 't104' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t94', l); + END IF; + + + + -- t105=SI($BA$71<>0;0;1-AW134) + WHEN c = 't105' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t95', l); + END IF; + + + + -- t106=SI($BA$71<>0;0;1-AY134) + WHEN c = 't106' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t96', l); + END IF; + + + + -- t107=SI($BA$71<>0;0;1-BA134) + WHEN c = 't107' AND v >= 1 THEN + IF cell('t37') <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - cell('t97', l); + END IF; + + + + -- t111=I47*I$25*I146 + WHEN c = 't111' AND v >= 1 THEN + RETURN cell('t11', l) * vh.taux_service_compl * cell('t101', l); + + + + -- t112=S47*I$25*S146 + WHEN c = 't112' AND v >= 1 THEN + RETURN cell('t12', l) * vh.taux_service_compl * cell('t102', l); + + + + -- t113=AC47*I$25*AC146 + WHEN c = 't113' AND v >= 1 THEN + RETURN cell('t13', l) * vh.taux_service_compl * cell('t103', l); + + + + -- t114=AM47*I$25*AM146 + WHEN c = 't114' AND v >= 1 THEN + RETURN cell('t14', l) * vh.taux_service_compl * cell('t104', l); + + + + -- t115=AW47*$R$6*AW146 + WHEN c = 't115' AND v >= 1 THEN + RETURN cell('t15', l) * cell('t105', l); + + + + -- t116=AY47*$R$6*AY146 + WHEN c = 't116' AND v >= 1 THEN + RETURN cell('t16', l) * cell('t106', l); + + + + -- t117=BA47*$R$6*BA146 + WHEN c = 't117' AND v >= 1 THEN + RETURN cell('t17', l) * cell('t107', l); + + + + -- t123=AC158*SI($F26;$G26;1) + WHEN c = 't123' AND v >= 1 THEN + IF vh.taux_fc = 1 THEN + RETURN cell('t113', l) * vh.ponderation_service_compl; + ELSE + RETURN cell('t113', l); + END IF; + + + + -- t124=AM158*SI($F26;$G26;1) + WHEN c = 't124' AND v >= 1 THEN + IF vh.taux_fc = 1 THEN + RETURN cell('t114', l) * vh.ponderation_service_compl; + ELSE + RETURN cell('t114', l); + END IF; + + + + -- t131=I158*$C26 + WHEN c = 't131' AND v >= 1 THEN + RETURN cell('t111', l) * vh.taux_fi; + + + + -- t132=S158*$C26 + WHEN c = 't132' AND v >= 1 THEN + RETURN cell('t112', l) * vh.taux_fi; + + + + -- t141=I158*$D26 + WHEN c = 't141' AND v >= 1 THEN + RETURN cell('t111', l) * vh.taux_fa; + + + + -- t142=S158*$D26 + WHEN c = 't142' AND v >= 1 THEN + RETURN cell('t112', l) * vh.taux_fa; + + + + -- t151=I158*$E26 + WHEN c = 't151' AND v >= 1 THEN + RETURN cell('t111', l) * vh.taux_fc; + + + + -- t152=S158*$E26 + WHEN c = 't152' AND v >= 1 THEN + RETURN cell('t112', l) * vh.taux_fc; + + + + -- t153=SI(AC170=AC158;AC158;0)*$E26 + WHEN c = 't153' AND v >= 1 THEN + IF cell('t123', l) = cell('t113', l) THEN + RETURN cell('t113', l); + ELSE + RETURN 0; + END IF; + + + + -- t154=SI(AM170=AM158;AM158;0)*$E26 + WHEN c = 't154' AND v >= 1 THEN + IF cell('t124', l) = cell('t114', l) THEN + RETURN cell('t114', l); + ELSE + RETURN 0; + END IF; + + + + -- t163=SI(AC170<>AC158;AC170;0)*$E26 + WHEN c = 't163' AND v >= 1 THEN + IF cell('t123', l) <> cell('t113', l) THEN + RETURN cell('t123', l); + ELSE + RETURN 0; + END IF; + + + + -- t164=SI(AM170<>AM158;AM170;0)*$E26 + WHEN c = 't164' AND v >= 1 THEN + IF cell('t124', l) <> cell('t114', l) THEN + RETURN cell('t124', l); + ELSE + RETURN 0; + END IF; + + + + -- rs=SOMME(I98:AU98) + WHEN c = 'rs' AND v >= 1 THEN + RETURN cell('t61',l) + cell('t62',l); + + + + -- ss=SOMME(I110:AU110) + WHEN c = 'ss' AND v >= 1 THEN + RETURN cell('t71',l) + cell('t72',l); + + + + -- ts=SOMME(I122:AU122) + WHEN c = 'ts' AND v >= 1 THEN + RETURN cell('t81',l) + cell('t82',l) + cell('t83',l) + cell('t84',l); + + + + -- us=SI($I$13="Oui";SOMME(I182:AU182);0) + WHEN c = 'us' AND v >= 1 THEN + RETURN cell('t131',l) + cell('t132',l); + + + + -- vs=SI($I$13="Oui";SOMME(I194:AU194);0) + WHEN c = 'vs' AND v >= 1 THEN + IF ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN cell('t141',l) + cell('t142',l); + ELSE + RETURN 0; + END IF; + + + + -- ws=SI($I$13="Oui";SOMME(I206:AU206);0) + WHEN c = 'ws' AND v >= 1 THEN + IF ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN cell('t151',l) + cell('t152',l) + cell('t153',l) + cell('t154',l); + ELSE + RETURN 0; + END IF; + + + + -- xs=SI($I$13="Oui";SOMME(I218:AU218);0) + WHEN c = 'xs' AND v >= 1 THEN + IF ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN cell('t163',l) + cell('t164',l); + ELSE + RETURN 0; + END IF; + + + + -- rr=SOMME(AW86:BA86) + WHEN c = 'rr' AND v >= 1 THEN + RETURN cell('t55',l) + cell('t56',l) + cell('t57',l); + + + + -- ur=SI($I$13="Oui";SOMME(AW158:BA158);0) + WHEN c = 'ur' AND v >= 1 THEN + IF ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN cell('t115',l) + cell('t116',l) + cell('t117',l); + ELSE + RETURN 0; + END IF; + + + + ELSE + raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); + END CASE; END; + + + + PROCEDURE CALCUL_RESULTAT IS + BEGIN + feuille.delete; + + -- transmission des résultats aux volumes horaires et volumes horaires référentiel + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'rs',l); + ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'ss',l); + ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'ts',l); + ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'rr',l); + ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'us',l); + ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'vs',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'ws',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'xs',l); + ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'ur',l); + END LOOP; + END; + +END FORMULE_UBO + + / + +CREATE OR REPLACE PACKAGE "FORMULE_ULHN" AS + + PROCEDURE CALCUL_RESULTAT; + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT; + +END FORMULE_ULHN + + / + +CREATE OR REPLACE PACKAGE BODY "FORMULE_ULHN" AS + decalageLigne NUMERIC DEFAULT 21; + + + /* Stockage des valeurs intermédiaires */ + TYPE t_cell IS RECORD ( + valeur FLOAT, + enCalcul BOOLEAN DEFAULT FALSE + ); + TYPE t_cells IS TABLE OF t_cell INDEX BY PLS_INTEGER; + TYPE t_coll IS RECORD ( + cells t_cells + ); + TYPE t_colls IS TABLE OF t_coll INDEX BY VARCHAR2(50); + feuille t_colls; + + debugActif BOOLEAN DEFAULT TRUE; + debugLine NUMERIC; + + + PROCEDURE dbg( val CLOB ) IS + BEGIN + ose_formule.volumes_horaires.items(debugLine).debug_info := + ose_formule.volumes_horaires.items(debugLine).debug_info || val; + END; + + + PROCEDURE dbgi( val CLOB ) IS + BEGIN + ose_formule.intervenant.debug_info := ose_formule.intervenant.debug_info || val; + END; + + PROCEDURE dbgDump( val CLOB ) IS + BEGIN + dbg(' +' || val || ' +'); + END; + + PROCEDURE dbgCell( c VARCHAR2, l NUMERIC, val FLOAT ) IS + ligne NUMERIC; + BEGIN + ligne := l; + IF l <> 0 THEN + ligne := ligne + decalageLigne; + END IF; + + dbgi( '[cell|' || c || '|' || ligne || '|' || val ); + END; + + PROCEDURE dbgCalc( fncName VARCHAR2, c VARCHAR2, res FLOAT ) IS + BEGIN + dbgi( '[calc|' || fncName || '|' || c || '|' || res ); + END; + + FUNCTION cell( c VARCHAR2, l NUMERIC DEFAULT 0 ) RETURN FLOAT IS + val FLOAT; + BEGIN + IF feuille.exists(c) THEN + IF feuille(c).cells.exists(l) THEN + IF feuille(c).cells(l).enCalcul THEN + raise_application_error( -20001, 'Dépendance cyclique : la cellule [' || c || ';' || l || '] est déjà en cours de calcul'); + END IF; + RETURN feuille(c).cells(l).valeur; + END IF; + END IF; + + feuille(c).cells(l).enCalcul := true; + val := calcCell( c, l ); + IF debugActif THEN + dbgCell( c, l, val ); + END IF; + feuille(c).cells(l).valeur := val; + feuille(c).cells(l).enCalcul := false; + + RETURN val; + END; + + FUNCTION mainCell( libelle VARCHAR2, c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + val FLOAT; + BEGIN + debugLine := l; + val := cell(c,l); + + RETURN val; + END; + + FUNCTION calcFnc( fncName VARCHAR2, c VARCHAR2 ) RETURN FLOAT IS + val FLOAT; + cellRes FLOAT; + BEGIN + IF feuille.exists('__' || fncName || '__' || c || '__') THEN + IF feuille('__' || fncName || '__' || c || '__').cells.exists(1) THEN + RETURN feuille('__' || fncName || '__' || c || '__').cells(1).valeur; + END IF; + END IF; + CASE + -- Liste des fonctions supportées + + WHEN fncName = 'total' THEN + val := 0; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + val := val + COALESCE(cell(c, l),0); + END LOOP; + + WHEN fncName = 'max' THEN + val := NULL; + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + cellRes := cell(c,l); + IF val IS NULL OR val < cellRes THEN + val := cellRes; + END IF; + END LOOP; + + -- fin de la liste des fonctions supportées + ELSE + raise_application_error( -20001, 'La formule "' || fncName || '" n''existe pas!'); + END CASE; + IF debugActif THEN + dbgCalc(fncName, c, val ); + END IF; + feuille('__' || fncName || '__' || c || '__').cells(1).valeur := val; + + RETURN val; + END; + + + FUNCTION calcVersion RETURN NUMERIC IS + BEGIN + RETURN 1; + END; + + + + FUNCTION calcCell( c VARCHAR2, l NUMERIC ) RETURN FLOAT IS + vh ose_formule.t_volume_horaire; + v NUMERIC; + val FLOAT; + BEGIN + v := calcVersion; + + IF l > 0 THEN + vh := ose_formule.volumes_horaires.items(l); + END IF; + CASE + + + -- j=SI(ESTVIDE(C22);0;RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0)) + -- = RECHERCHEH(SI(ET(C22="TP";TP_vaut_TD="Oui");"TD";C22);types_intervention;2;0) + WHEN c = 'j' AND v >= 1 THEN + RETURN GREATEST(vh.taux_service_du * vh.ponderation_service_du,1); + + -- k=SI(ESTVIDE(C22);0;RECHERCHEH(C22;types_intervention;3;0)) + -- =RECHERCHEH(C22;types_intervention;3;0) + WHEN c = 'k' AND v >= 1 THEN + RETURN vh.taux_service_compl; + + -- l=SI(H22="Oui";I22*J22;0) + WHEN c = 'l' AND v >= 1 THEN + IF vh.service_statutaire THEN + RETURN vh.heures * cell( 'j', l ); + ELSE + RETURN 0; + END IF; + + + -- l82=SOMME(L22:L81) + WHEN c = 'l82' AND v >= 1 THEN + RETURN calcFnc('total','l'); + + -- n=SI($L$82>0;L22/$L$82;0) + WHEN c = 'n' AND v >= 1 THEN + IF cell('l82') > 0 THEN + RETURN cell('l',l) / cell('l82'); + ELSE + RETURN 0; + END IF; + + -- o=MIN(service_du;$L$82)*N22 + WHEN c = 'o' AND v >= 1 THEN + RETURN LEAST(ose_formule.intervenant.service_du, cell('l82')) * cell('n',l); + + -- p=SI(L22<>0;O22/L22;0) + WHEN c = 'p' AND v >= 1 THEN + IF cell('l',l) <> 0 THEN + RETURN cell('o',l) / cell('l',l); + ELSE + RETURN 0; + END IF; + + -- q=SI($L$82>service_du;1-P22;0) + WHEN c = 'q' AND v >= 1 THEN + IF cell('l82') > ose_formule.intervenant.service_du THEN + RETURN 1 - cell('p',l); + ELSE + RETURN 0; + END IF; + + -- r=I22*Q22*K22 + WHEN c = 'r' AND v >= 1 THEN + RETURN vh.heures * cell('q',l) * cell('k',l); + + -- t=SI(T21+L22>service_du;service_du;T21+L22) + WHEN c = 't' AND l = 0 AND v >= 1 THEN + RETURN 0; + + WHEN c = 't' AND v >= 1 THEN + IF (cell('t',l-1) + cell('l',l)) > ose_formule.intervenant.service_du THEN + RETURN ose_formule.intervenant.service_du; + ELSE + RETURN cell('t',l-1) + cell('l',l); + END IF; + + -- u=SI(J22>0;SI(T21+L22= 1 THEN + IF cell('j',l) > 0 THEN + IF (cell('t',l-1) + cell('l',l)) < ose_formule.intervenant.service_du THEN + RETURN 0; + ELSE + RETURN (cell('t',l-1) + cell('l',l) - ose_formule.intervenant.service_du) / cell('j',l); + END IF; + ELSE + RETURN 0; + END IF; + + -- v=SI(OU(service_realise"Oui");0;(U22+SI(H22<>"Oui";I22;0))*K22) + WHEN c = 'v' AND v >= 1 THEN + IF cell('service_realise') < ose_formule.intervenant.service_du OR ose_formule.intervenant.depassement_service_du_sans_hc THEN + RETURN 0; + ELSE + IF vh.service_statutaire THEN + RETURN 0; + ELSE + RETURN vh.heures; + END IF; + END IF; + + -- x=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";($L22-$U22)*D22;$O22*D22)) + WHEN c = 'x' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN (cell('l',l) - cell('u',l)) * vh.taux_fi; + ELSE + RETURN cell('o',l) * vh.taux_fi; + END IF; + END IF; + + -- y=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";($L22-$U22)*E22;$O22*E22)) + WHEN c = 'y' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN (cell('l',l) - cell('u',l)) * vh.taux_fa; + ELSE + RETURN cell('o',l) * vh.taux_fa; + END IF; + END IF; + + -- z=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";($L22-$U22)*F22;$O22*F22)) + WHEN c = 'z' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN (cell('l',l) - cell('u',l)) * vh.taux_fc; + ELSE + RETURN cell('o',l) * vh.taux_fc; + END IF; + END IF; + + -- aa=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$L22-$U22;$R22);0) + WHEN c = 'aa' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN cell('l',l) - cell('u',l); + ELSE + RETURN cell('r',l); + END IF; + ELSE + RETURN 0; + END IF; + + -- ab=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*D22;$R22*D22)) + WHEN c = 'ab' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN cell('v',l) * vh.taux_fi; + ELSE + RETURN cell('r',l) * vh.taux_fi; + END IF; + END IF; + + -- ac=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*E22;$R22*E22)) + WHEN c = 'ac' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN cell('v',l) * vh.taux_fa; + ELSE + RETURN cell('r',l) * vh.taux_fa; + END IF; + END IF; + + -- ad=SI(OU(ESTVIDE($C22);$C22="Référentiel");0;SI(contexte_calcul="Réalisé";$V22*F22;$R22*F22)) + WHEN c = 'ad' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + RETURN 0; + ELSE + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN cell('v',l) * vh.taux_fc; + ELSE + RETURN cell('r',l) * vh.taux_fc; + END IF; + END IF; + + -- ae=0 + WHEN c = 'ae' AND v >= 1 THEN + RETURN 0; + + -- af=SI($C22="Référentiel";SI(contexte_calcul="Réalisé";$V22;$R22);0) + WHEN c = 'af' AND v >= 1 THEN + IF vh.service_referentiel_id IS NOT NULL THEN + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN cell('v',l); + ELSE + RETURN cell('r',l); + END IF; + ELSE + RETURN 0; + END IF; + + -- d17=SI(contexte_calcul="Réalisé";MAX($T$22:$T$81);SOMME($O$22:$O$81)) + WHEN c='service_realise' AND v >= 1 THEN + IF ose_formule.intervenant.type_volume_horaire_id = 2 THEN + RETURN calcFnc('max','t'); + ELSE + RETURN calcFnc('total','o'); + END IF; + + ELSE + raise_application_error( -20001, 'La colonne c=' || c || ', l=' || l || ' n''existe pas!'); + END CASE; END; + + + + PROCEDURE CALCUL_RESULTAT IS + BEGIN + feuille.delete; + + -- transmission des résultats aux volumes horaires et volumes horaires référentiel + FOR l IN 1 .. ose_formule.volumes_horaires.length LOOP + ose_formule.volumes_horaires.items(l).service_fi := mainCell('Service FI', 'x',l); + ose_formule.volumes_horaires.items(l).service_fa := mainCell('Service FA', 'y',l); + ose_formule.volumes_horaires.items(l).service_fc := mainCell('Service FC', 'z',l); + ose_formule.volumes_horaires.items(l).service_referentiel := mainCell('Service référentiel', 'aa',l); + ose_formule.volumes_horaires.items(l).heures_compl_fi := mainCell('Heures compl. FI', 'ab',l); + ose_formule.volumes_horaires.items(l).heures_compl_fa := mainCell('Heures compl. FA', 'ac',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc := mainCell('Heures compl. FC', 'ad',l); + ose_formule.volumes_horaires.items(l).heures_compl_fc_majorees := mainCell('Heures compl. FC Maj.', 'ae',l); + ose_formule.volumes_horaires.items(l).heures_compl_referentiel := mainCell('Heures compl. référentiel', 'af',l); + END LOOP; + END; + +END FORMULE_ULHN + + / + +CREATE OR REPLACE PACKAGE "FORMULE_UNICAEN" AS + debug_enabled BOOLEAN DEFAULT FALSE; + debug_etat_volume_horaire_id NUMERIC DEFAULT 1; + debug_volume_horaire_id NUMERIC; + debug_volume_horaire_ref_id NUMERIC; + + PROCEDURE CALCUL_RESULTAT_V2; + PROCEDURE CALCUL_RESULTAT; + + PROCEDURE PURGE_EM_NON_FC; + +END FORMULE_UNICAEN + + / + +CREATE OR REPLACE PACKAGE BODY "FORMULE_UNICAEN" AS + + /* Stockage des valeurs intermédiaires */ + TYPE t_valeurs IS TABLE OF FLOAT INDEX BY PLS_INTEGER; + TYPE t_tableau IS RECORD ( + valeurs t_valeurs, + total FLOAT DEFAULT 0 + ); + TYPE t_tableaux IS TABLE OF t_tableau INDEX BY PLS_INTEGER; + TYPE t_tableau_config IS RECORD ( + tableau NUMERIC, + version NUMERIC, + referentiel BOOLEAN DEFAULT FALSE, + setTotal BOOLEAN DEFAULT FALSE + ); + TYPE t_tableaux_configs IS VARRAY(100) OF t_tableau_config; + + t t_tableaux; + vh_index NUMERIC; + + + + -- Crée une définition de tableau + FUNCTION TC( tableau NUMERIC, version NUMERIC, options VARCHAR2 DEFAULT NULL) RETURN t_tableau_config IS + tcRes t_tableau_config; + BEGIN + tcRes.tableau := tableau; + tcRes.version := version; + CASE + WHEN options like '%t%' THEN tcRes.setTotal := TRUE; + WHEN options like '%r%' THEN tcRes.referentiel := TRUE; + ELSE RETURN tcRes; + END CASE; + + RETURN tcRes; + END; + + -- Setter d'une valeur intermédiaire au niveau case + PROCEDURE SV( tableau NUMERIC, valeur FLOAT ) IS + BEGIN + t(tableau).valeurs(vh_index) := valeur; + t(tableau).total := t(tableau).total + valeur; + END; + + -- Setter d'une valeur intermédiaire au niveau tableau + PROCEDURE ST( tableau NUMERIC, valeur FLOAT ) IS + BEGIN + t(tableau).total := valeur; + END; + + -- Getter d'une valeur intermédiaire, au niveau case + FUNCTION GV( tableau NUMERIC ) RETURN FLOAT IS + BEGIN + IF NOT t.exists(tableau) THEN RETURN 0; END IF; + IF NOT t(tableau).valeurs.exists( vh_index ) THEN RETURN 0; END IF; + RETURN t(tableau).valeurs( vh_index ); + END; + + -- Getter d'une valeur intermédiaire, au niveau tableau + FUNCTION GT( tableau NUMERIC ) RETURN FLOAT IS + BEGIN + IF NOT t.exists(tableau) THEN RETURN 0; END IF; + RETURN t(tableau).total; + END; + + + + + PROCEDURE DEBUG_VH IS + tableau NUMERIC; + vh ose_formule.t_volume_horaire; + BEGIN + IF NOT debug_enabled THEN RETURN; END IF; + IF ose_formule.intervenant.etat_volume_horaire_id <> debug_etat_volume_horaire_id THEN RETURN; END IF; + + FOR i IN 1 .. ose_formule.volumes_horaires.length LOOP + vh_index := i; + vh := ose_formule.volumes_horaires.items(i); + IF vh.volume_horaire_id = debug_volume_horaire_id OR vh.volume_horaire_ref_id = debug_volume_horaire_ref_id THEN + ose_formule.DEBUG_INTERVENANT; + ose_test.echo(''); + ose_test.echo('-- DEBUG DE VOLUME HORAIRE --'); + ose_test.echo('volume_horaire_id = ' || vh.volume_horaire_id); + ose_test.echo('volume_horaire_ref_id = ' || vh.volume_horaire_ref_id); + ose_test.echo('service_id = ' || vh.service_id); + ose_test.echo('service_referentiel_id = ' || vh.service_referentiel_id); + ose_test.echo('taux_fi = ' || vh.taux_fi); + ose_test.echo('taux_fa = ' || vh.taux_fa); + ose_test.echo('taux_fc = ' || vh.taux_fc); + ose_test.echo('ponderation_service_du = ' || vh.ponderation_service_du); + ose_test.echo('ponderation_service_compl = ' || vh.ponderation_service_compl); + ose_test.echo('structure_id = ' || vh.structure_id); + ose_test.echo('structure_is_affectation = ' || CASE WHEN vh.structure_is_affectation THEN 'OUI' ELSE 'NON' END); + ose_test.echo('structure_is_univ = ' || CASE WHEN vh.structure_is_univ THEN 'OUI' ELSE 'NON' END); + ose_test.echo('service_statutaire = ' || CASE WHEN vh.service_statutaire THEN 'OUI' ELSE 'NON' END); + ose_test.echo('heures = ' || vh.heures); + ose_test.echo('taux_service_du = ' || vh.taux_service_du); + ose_test.echo('taux_service_compl = ' || vh.taux_service_compl); + + tableau := t.FIRST; + LOOP EXIT WHEN tableau IS NULL; + IF gv(tableau) <> 0 OR gt(tableau) <> 0 THEN + ose_test.echo(' t(' || LPAD(tableau,3,' ') || ') v=' || RPAD(round(gv(tableau),3),10,' ') || 't=' || round(gt(tableau),3)); + END IF; + tableau := t.NEXT(tableau); + END LOOP; + + ose_test.echo('service_fi = ' || vh.service_fi); + ose_test.echo('service_fa = ' || vh.service_fa); + ose_test.echo('service_fc = ' || vh.service_fc); + ose_test.echo('service_referentiel = ' || vh.service_referentiel); + ose_test.echo('heures_compl_fi = ' || vh.heures_compl_fi); + ose_test.echo('heures_compl_fa = ' || vh.heures_compl_fa); + ose_test.echo('heures_compl_fc = ' || vh.heures_compl_fc); + ose_test.echo('heures_compl_fc_majorees = ' || vh.heures_compl_fc_majorees); + ose_test.echo('heures_compl_referentiel = ' || vh.heures_compl_referentiel); + ose_test.echo('-- FIN DE DEBUG DE VOLUME HORAIRE --'); + ose_test.echo(''); + END IF; + END LOOP; + END; + + + + -- Formule de calcul définie par tableaux + FUNCTION EXECFORMULE( tableau NUMERIC, version NUMERIC ) RETURN FLOAT IS + vh ose_formule.t_volume_horaire; + BEGIN + vh := ose_formule.volumes_horaires.items(vh_index); + CASE + + + WHEN tableau = 11 AND version = 2 THEN + IF vh.structure_is_affectation AND vh.taux_fc < 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 11 AND version = 3 THEN + IF vh.structure_is_affectation THEN + RETURN vh.heures * (vh.taux_fi + vh.taux_fa); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 12 AND version = 2 THEN + IF NOT vh.structure_is_affectation AND vh.taux_fc < 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 12 AND version = 3 THEN + IF NOT vh.structure_is_affectation THEN + RETURN vh.heures * (vh.taux_fi + vh.taux_fa); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 13 AND version = 2 THEN + IF vh.structure_is_affectation AND vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 13 AND version = 3 THEN + IF vh.structure_is_affectation THEN + RETURN vh.heures * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 14 AND version = 2 THEN + IF NOT vh.structure_is_affectation AND vh.taux_fc = 1 THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 14 AND version = 3 THEN + IF NOT vh.structure_is_affectation THEN + RETURN vh.heures * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 15 AND version = 2 THEN + IF vh.structure_is_affectation THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 16 AND version = 2 THEN + IF NOT vh.structure_is_affectation AND NOT vh.structure_is_univ THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 17 AND version = 2 THEN + IF vh.structure_is_univ THEN + RETURN vh.heures; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 21 AND version = 2 THEN + RETURN gv(11) * vh.taux_service_du; + + + + WHEN tableau = 22 AND version = 2 THEN + RETURN gv(12) * vh.taux_service_du; + + + + WHEN tableau = 23 AND version = 2 THEN + RETURN gv(13) * vh.taux_service_du; + + + + WHEN tableau = 24 AND version = 2 THEN + RETURN gv(14) * vh.taux_service_du; + + + + WHEN tableau = 25 AND version = 2 THEN + RETURN gv(15); + + + + WHEN tableau = 26 AND version = 2 THEN + RETURN gv(16); + + + + WHEN tableau = 27 AND version = 2 THEN + RETURN gv(17); + + + + WHEN tableau = 31 AND version = 2 THEN + RETURN GREATEST( ose_formule.intervenant.service_du - gt(21), 0 ); + + + + WHEN tableau = 32 AND version = 2 THEN + RETURN GREATEST( gt(31) - gt(22), 0 ); + + + + WHEN tableau = 33 AND version = 2 THEN + RETURN GREATEST( gt(32) - gt(23), 0 ); + + + + WHEN tableau = 34 AND version = 2 THEN + RETURN GREATEST( gt(33) - gt(24), 0 ); + + + + WHEN tableau = 35 AND version = 2 THEN + RETURN GREATEST( gt(34) - gt(25), 0 ); + + + + WHEN tableau = 36 AND version = 2 THEN + RETURN GREATEST( gt(35) - gt(26), 0 ); + + + + WHEN tableau = 37 AND version = 2 THEN + RETURN GREATEST( gt(36) - gt(27), 0 ); + + + + WHEN tableau = 41 AND version = 2 THEN + IF gt(21) <> 0 THEN + RETURN gv(21) / gt(21); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 42 AND version = 2 THEN + IF gt(22) <> 0 THEN + RETURN gv(22) / gt(22); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 43 AND version = 2 THEN + IF gt(23) <> 0 THEN + RETURN gv(23) / gt(23); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 44 AND version = 2 THEN + IF gt(24) <> 0 THEN + RETURN gv(24) / gt(24); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 45 AND version = 2 THEN + IF gt(25) <> 0 THEN + RETURN gv(25) / gt(25); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 46 AND version = 2 THEN + IF gt(26) <> 0 THEN + RETURN gv(26) / gt(26); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 47 AND version = 2 THEN + IF gt(27) <> 0 THEN + RETURN gv(27) / gt(27); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 51 AND version = 2 THEN + RETURN LEAST( ose_formule.intervenant.service_du, gt(21) ) * gv(41); + + + + WHEN tableau = 52 AND version = 2 THEN + RETURN LEAST( gt(31), gt(22) ) * gv(42); + + + + WHEN tableau = 53 AND version = 2 THEN + RETURN LEAST( gt(32), gt(23) ) * gv(43); + + + + WHEN tableau = 54 AND version = 2 THEN + RETURN LEAST( gt(33), gt(24) ) * gv(44); + + + + WHEN tableau = 55 AND version = 2 THEN + RETURN LEAST( gt(34), gt(25) ) * gv(45); + + + + WHEN tableau = 56 AND version = 2 THEN + RETURN LEAST( gt(35), gt(26) ) * gv(46); + + + + WHEN tableau = 57 AND version = 2 THEN + RETURN LEAST( gt(36), gt(27) ) * gv(47); + + + + WHEN tableau = 61 AND version = 2 THEN + RETURN gv(51) * vh.taux_fi; + + + + WHEN tableau = 61 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(51) / (vh.taux_fi + vh.taux_fa) * vh.taux_fi; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 62 AND version = 2 THEN + RETURN gv(52) * vh.taux_fi; + + + + WHEN tableau = 62 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(52) / (vh.taux_fi + vh.taux_fa) * vh.taux_fi; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 71 AND version = 2 THEN + RETURN gv(51) * vh.taux_fa; + + + + WHEN tableau = 71 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(51) / (vh.taux_fi + vh.taux_fa) * vh.taux_fa; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 72 AND version = 2 THEN + RETURN gv(52) * vh.taux_fa; + + + + WHEN tableau = 72 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(52) / (vh.taux_fi + vh.taux_fa) * vh.taux_fa; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 81 AND version = 2 THEN + RETURN gv(51) * vh.taux_fc; + + + + WHEN tableau = 82 AND version = 2 THEN + RETURN gv(52) * vh.taux_fc; + + + + WHEN tableau = 83 AND version = 2 THEN + RETURN gv(53) * vh.taux_fc; + + + + WHEN tableau = 83 AND version = 3 THEN + RETURN gv(53); + + + + WHEN tableau = 84 AND version = 2 THEN + RETURN gv(54) * vh.taux_fc; + + + + WHEN tableau = 84 AND version = 3 THEN + RETURN gv(54); + + + + WHEN tableau = 91 AND version = 2 THEN + IF gv(21) <> 0 THEN + RETURN gv(51) / gv(21); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 92 AND version = 2 THEN + IF gv(22) <> 0 THEN + RETURN gv(52) / gv(22); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 93 AND version = 2 THEN + IF gv(23) <> 0 THEN + RETURN gv(53) / gv(23); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 94 AND version = 2 THEN + IF gv(24) <> 0 THEN + RETURN gv(54) / gv(24); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 95 AND version = 2 THEN + IF gv(25) <> 0 THEN + RETURN gv(55) / gv(25); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 96 AND version = 2 THEN + IF gv(26) <> 0 THEN + RETURN gv(56) / gv(26); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 97 AND version = 2 THEN + IF gv(27) <> 0 THEN + RETURN gv(57) / gv(27); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 101 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(91); + END IF; + + + + WHEN tableau = 102 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(92); + END IF; + + + + WHEN tableau = 103 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(93); + END IF; + + + + WHEN tableau = 104 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(94); + END IF; + + + + WHEN tableau = 105 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(95); + END IF; + + + + WHEN tableau = 106 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(96); + END IF; + + + + WHEN tableau = 107 AND version = 2 THEN + IF gt(37) <> 0 THEN + RETURN 0; + ELSE + RETURN 1 - gv(97); + END IF; + + + + WHEN tableau = 111 AND version = 2 THEN + RETURN gv(11) * vh.taux_service_compl * gv(101); + + + + WHEN tableau = 112 AND version = 2 THEN + RETURN gv(12) * vh.taux_service_compl * gv(102); + + + + WHEN tableau = 113 AND version = 2 THEN + RETURN gv(13) * vh.taux_service_compl * gv(103); + + + + WHEN tableau = 114 AND version = 2 THEN + RETURN gv(14) * vh.taux_service_compl * gv(104); + + + + WHEN tableau = 115 AND version = 2 THEN + RETURN gv(15) * gv(105); + + + + WHEN tableau = 116 AND version = 2 THEN + RETURN gv(16) * gv(106); + + + + WHEN tableau = 117 AND version = 2 THEN + RETURN gv(17) * gv(107); + + + + WHEN tableau = 123 AND version = 2 THEN + IF vh.taux_fc = 1 THEN + RETURN gv(113) * vh.ponderation_service_compl; + ELSE + RETURN gv(113); + END IF; + + + + WHEN tableau = 123 AND version = 3 THEN + IF vh.taux_fc > 0 THEN + RETURN gv(113) * vh.ponderation_service_compl; + ELSE + RETURN gv(113); + END IF; + + + + WHEN tableau = 124 AND version = 2 THEN + IF vh.taux_fc = 1 THEN + RETURN gv(114) * vh.ponderation_service_compl; + ELSE + RETURN gv(114); + END IF; + + + + WHEN tableau = 124 AND version = 3 THEN + IF vh.taux_fc > 0 THEN + RETURN gv(114) * vh.ponderation_service_compl; + ELSE + RETURN gv(114); + END IF; + + + + WHEN tableau = 131 AND version = 2 THEN + RETURN gv(111) * vh.taux_fi; + + + + WHEN tableau = 131 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(111) / (vh.taux_fi + vh.taux_fa) * vh.taux_fi; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 132 AND version = 2 THEN + RETURN gv(112) * vh.taux_fi; + + + + WHEN tableau = 132 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(112) / (vh.taux_fi + vh.taux_fa) * vh.taux_fi; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 141 AND version = 2 THEN + RETURN gv(111) * vh.taux_fa; + + + + WHEN tableau = 141 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(111) / (vh.taux_fi + vh.taux_fa) * vh.taux_fa; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 142 AND version = 2 THEN + RETURN gv(112) * vh.taux_fa; + + + + WHEN tableau = 142 AND version = 3 THEN + IF vh.taux_fi + vh.taux_fa > 0 THEN + RETURN gv(112) / (vh.taux_fi + vh.taux_fa) * vh.taux_fa; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 151 AND version = 2 THEN + RETURN gv(111) * vh.taux_fc; + + + + WHEN tableau = 152 AND version = 2 THEN + RETURN gv(112) * vh.taux_fc; + + + + WHEN tableau = 153 AND version = 2 THEN + IF gv(123) = gv(113) THEN + RETURN gv(113) * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 153 AND version = 3 THEN + IF gv(123) = gv(113) THEN + RETURN gv(113); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 154 AND version = 2 THEN + IF gv(124) = gv(114) THEN + RETURN gv(114) * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 154 AND version = 3 THEN + IF gv(124) = gv(114) THEN + RETURN gv(114); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 163 AND version = 2 THEN + IF gv(123) <> gv(113) THEN + RETURN gv(123) * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 163 AND version = 3 THEN + IF gv(123) <> gv(113) THEN + RETURN gv(123); + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 164 AND version = 2 THEN + IF gv(124) <> gv(114) THEN + RETURN gv(124) * vh.taux_fc; + ELSE + RETURN 0; + END IF; + + + + WHEN tableau = 164 AND version = 3 THEN + IF gv(124) <> gv(114) THEN + RETURN gv(124); + ELSE + RETURN 0; + END IF; + + + + ELSE + raise_application_error( -20001, 'Le tableau ' || tableau || ' version ' || version || ' n''existe pas!'); + END CASE; END; + + + + + + + + PROCEDURE CALCUL_RESULTAT_V2 IS + tableaux t_tableaux_configs; + valeur FLOAT; + BEGIN + + -- Définition des tableaux à utiliser + tableaux := t_tableaux_configs( + tc( 11,2 ), tc( 12,2 ), tc( 13,2 ), tc( 14,2 ), tc( 15,2,'r' ), tc( 16,2,'r' ), tc( 17,2,'r' ), + tc( 21,2 ), tc( 22,2 ), tc( 23,2 ), tc( 24,2 ), tc( 25,2,'r' ), tc( 26,2,'r' ), tc( 27,2,'r' ), + tc( 31,2,'t'), tc( 32,2,'t'), tc( 33,2,'t'), tc( 34,2,'t'), tc( 35,2,'tr'), tc( 36,2,'tr'), tc( 37,2,'tr'), + tc( 41,2 ), tc( 42,2 ), tc( 43,2 ), tc( 44,2 ), tc( 45,2,'r' ), tc( 46,2,'r' ), tc( 47,2,'r' ), + tc( 51,2 ), tc( 52,2 ), tc( 53,2 ), tc( 54,2 ), tc( 55,2,'r' ), tc( 56,2,'r' ), tc( 57,2,'r' ), + tc( 61,2 ), tc( 62,2 ), + tc( 71,2 ), tc( 72,2 ), + tc( 81,2 ), tc( 82,2 ), tc( 83,2 ), tc( 84,2 ), + tc( 91,2 ), tc( 92,2 ), tc( 93,2 ), tc( 94,2 ), tc( 95,2,'r' ), tc( 96,2,'r' ), tc( 97,2,'r' ), + tc(101,2 ), tc(102,2 ), tc(103,2 ), tc(104,2 ), tc(105,2,'r' ), tc(106,2,'r' ), tc(107,2,'r' ), + tc(111,2 ), tc(112,2 ), tc(113,2 ), tc(114,2 ), tc(115,2,'r' ), tc(116,2,'r' ), tc(117,2,'r' ), + tc(123,2 ), tc(124,2 ), + tc(131,2 ), tc(132,2 ), + tc(141,2 ), tc(142,2 ), + tc(151,2 ), tc(152,2 ), tc(153,2 ), tc(154,2 ), + tc(163,2 ), tc(164,2 ) + ); + + -- calcul par tableau pour chaque volume horaire + t.delete; + FOR it IN tableaux.FIRST .. tableaux.LAST LOOP + FOR ivh IN 1 .. ose_formule.volumes_horaires.length LOOP + vh_index := ivh; + IF + ose_formule.volumes_horaires.items(ivh).service_id IS NOT NULL AND NOT tableaux(it).referentiel + OR ose_formule.volumes_horaires.items(ivh).service_referentiel_id IS NOT NULL AND tableaux(it).referentiel + OR tableaux(it).setTotal -- car on en a besoin tout le temps + THEN + valeur := EXECFORMULE(tableaux(it).tableau, tableaux(it).version); + IF tableaux(it).setTotal THEN + ST( tableaux(it).tableau, valeur ); + ELSE + SV( tableaux(it).tableau, valeur ); + END IF; + END IF; + END LOOP; + END LOOP; + + -- transmisssion des résultats aux volumes horaires et volumes horaires référentiel + FOR i IN 1 .. ose_formule.volumes_horaires.length LOOP + vh_index := i; + IF ose_formule.volumes_horaires.items(i).service_id IS NOT NULL THEN + ose_formule.volumes_horaires.items(i).service_fi := gv( 61) + gv( 62); + ose_formule.volumes_horaires.items(i).service_fa := gv( 71) + gv( 72); + ose_formule.volumes_horaires.items(i).service_fc := gv( 81) + gv( 82) + gv( 83) + gv( 84); + ose_formule.volumes_horaires.items(i).heures_compl_fi := gv(131) + gv(132); + ose_formule.volumes_horaires.items(i).heures_compl_fa := gv(141) + gv(142); + ose_formule.volumes_horaires.items(i).heures_compl_fc := gv(151) + gv(152) + gv(153) + gv(154); + ose_formule.volumes_horaires.items(i).heures_compl_fc_majorees := gv(163) + gv(164); + ELSIF ose_formule.volumes_horaires.items(i).service_referentiel_id IS NOT NULL THEN + ose_formule.volumes_horaires.items(i).service_referentiel := gv( 55) + gv( 56) + gv( 57); + ose_formule.volumes_horaires.items(i).heures_compl_referentiel := gv(115) + gv(116) + gv(117); + END IF; + END LOOP; + + DEBUG_VH; + END; + + + + PROCEDURE CALCUL_RESULTAT IS + tableaux t_tableaux_configs; + valeur FLOAT; + BEGIN + -- si l'année est antérieure à 2016/2017 alors on utilise la V2!! + IF ose_formule.intervenant.annee_id < 2016 THEN + CALCUL_RESULTAT_V2; + RETURN; + END IF; + + + -- Définition des tableaux à utiliser + tableaux := t_tableaux_configs( + tc( 11,3 ), tc( 12,3 ), tc( 13,3 ), tc( 14,3 ), tc( 15,2,'r' ), tc( 16,2,'r' ), tc( 17,2,'r' ), + tc( 21,2 ), tc( 22,2 ), tc( 23,2 ), tc( 24,2 ), tc( 25,2,'r' ), tc( 26,2,'r' ), tc( 27,2,'r' ), + tc( 31,2,'t'), tc( 32,2,'t'), tc( 33,2,'t'), tc( 34,2,'t'), tc( 35,2,'tr'), tc( 36,2,'tr'), tc( 37,2,'tr'), + tc( 41,2 ), tc( 42,2 ), tc( 43,2 ), tc( 44,2 ), tc( 45,2,'r' ), tc( 46,2,'r' ), tc( 47,2,'r' ), + tc( 51,2 ), tc( 52,2 ), tc( 53,2 ), tc( 54,2 ), tc( 55,2,'r' ), tc( 56,2,'r' ), tc( 57,2,'r' ), + tc( 61,3 ), tc( 62,3 ), + tc( 71,3 ), tc( 72,3 ), + tc( 83,3 ), tc( 84,3 ), + tc( 91,2 ), tc( 92,2 ), tc( 93,2 ), tc( 94,2 ), tc( 95,2,'r' ), tc( 96,2,'r' ), tc( 97,2,'r' ), + tc(101,2 ), tc(102,2 ), tc(103,2 ), tc(104,2 ), tc(105,2,'r' ), tc(106,2,'r' ), tc(107,2,'r' ), + tc(111,2 ), tc(112,2 ), tc(113,2 ), tc(114,2 ), tc(115,2,'r' ), tc(116,2,'r' ), tc(117,2,'r' ), + tc(123,3 ), tc(124,3 ), + tc(131,3 ), tc(132,3 ), + tc(141,3 ), tc(142,3 ), + tc(153,3 ), tc(154,3 ), + tc(163,3 ), tc(164,3 ) + ); + + -- calcul par tableau pour chaque volume horaire + t.delete; + FOR it IN tableaux.FIRST .. tableaux.LAST LOOP + FOR ivh IN 1 .. ose_formule.volumes_horaires.length LOOP + vh_index := ivh; + IF + ose_formule.volumes_horaires.items(ivh).service_id IS NOT NULL AND NOT tableaux(it).referentiel + OR ose_formule.volumes_horaires.items(ivh).service_referentiel_id IS NOT NULL AND tableaux(it).referentiel + OR tableaux(it).setTotal -- car on en a besoin tout le temps + THEN + valeur := EXECFORMULE(tableaux(it).tableau, tableaux(it).version); + IF tableaux(it).setTotal THEN + ST( tableaux(it).tableau, valeur ); + ELSE + SV( tableaux(it).tableau, valeur ); + END IF; + END IF; + END LOOP; + END LOOP; + + -- transmission des résultats aux volumes horaires et volumes horaires référentiel + FOR i IN 1 .. ose_formule.volumes_horaires.length LOOP + vh_index := i; + IF ose_formule.volumes_horaires.items(i).service_id IS NOT NULL THEN + ose_formule.volumes_horaires.items(i).service_fi := gv( 61) + gv( 62); + ose_formule.volumes_horaires.items(i).service_fa := gv( 71) + gv( 72); + ose_formule.volumes_horaires.items(i).service_fc := gv( 83) + gv( 84); + ose_formule.volumes_horaires.items(i).heures_compl_fi := gv(131) + gv(132); + ose_formule.volumes_horaires.items(i).heures_compl_fa := gv(141) + gv(142); + ose_formule.volumes_horaires.items(i).heures_compl_fc := gv(153) + gv(154); + ose_formule.volumes_horaires.items(i).heures_compl_fc_majorees := gv(163) + gv(164); + ELSIF ose_formule.volumes_horaires.items(i).service_referentiel_id IS NOT NULL THEN + ose_formule.volumes_horaires.items(i).service_referentiel := gv( 55) + gv( 56) + gv( 57); + ose_formule.volumes_horaires.items(i).heures_compl_referentiel := gv(115) + gv(116) + gv(117); + END IF; + END LOOP; + + DEBUG_VH; + END; + + + + PROCEDURE PURGE_EM_NON_FC IS + BEGIN + FOR em IN ( + SELECT + em.id + FROM + ELEMENT_MODULATEUR em + JOIN element_pedagogique ep ON ep.id = em.element_id AND ep.histo_destruction IS NULL + WHERE + em.histo_destruction IS NULL + AND ep.taux_fc < 1 + ) LOOP + UPDATE + element_modulateur + SET + histo_destruction = SYSDATE, + histo_destructeur_id = ose_parametre.get_ose_user + WHERE + id = em.id + ; + END LOOP; + END; + + +END FORMULE_UNICAEN + + / + + + + +-- OseAdmin\Bdd\Ddl\DdlRefConstraint.create. + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_ANNEE_FK FOREIGN KEY (ANNEE_ID) + REFERENCES ANNEE (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_ETAT_VOLUME_HORAIRE_FK FOREIGN KEY (ETAT_VOLUME_HORAIRE_ID) + REFERENCES ETAT_VOLUME_HORAIRE (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_FORMULE_FK FOREIGN KEY (FORMULE_ID) + REFERENCES FORMULE (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_FORMULE_TEST_STRUCTURE_FK FOREIGN KEY (STRUCTURE_TEST_ID) + REFERENCES FORMULE_TEST_STRUCTURE (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_TYPE_INTERVENANT_FK FOREIGN KEY (TYPE_INTERVENANT_ID) + REFERENCES TYPE_INTERVENANT (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_INTERVENANT ADD CONSTRAINT FTI_TYPE_VOLUME_HORAIRE_FK FOREIGN KEY (TYPE_VOLUME_HORAIRE_ID) + REFERENCES TYPE_VOLUME_HORAIRE (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_VOLUME_HORAIRE ADD CONSTRAINT FTVH_FORMULE_TEST_INTERV_FK FOREIGN KEY (INTERVENANT_TEST_ID) + REFERENCES FORMULE_TEST_INTERVENANT (ID) ON DELETE CASCADE ENABLE + +/ + +ALTER TABLE FORMULE_TEST_VOLUME_HORAIRE ADD CONSTRAINT FTVH_FORMULE_TEST_STRUCTURE_FK FOREIGN KEY (STRUCTURE_TEST_ID) + REFERENCES FORMULE_TEST_STRUCTURE (ID) ON DELETE CASCADE ENABLE + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlUniqueConstraint.create. + +ALTER TABLE FORMULE_TEST_STRUCTURE ADD CONSTRAINT FORMULE_TEST_STRUCTURE__UN UNIQUE (LIBELLE) USING INDEX ( + CREATE UNIQUE INDEX FORMULE_TEST_STRUCTURE__UN ON FORMULE_TEST_STRUCTURE(LIBELLE ASC) + ) ENABLE + +/ + +ALTER TABLE FORMULE ADD CONSTRAINT FORMULE__UN UNIQUE (LIBELLE) USING INDEX ( + CREATE UNIQUE INDEX FORMULE__UN ON FORMULE(LIBELLE ASC) + ) ENABLE + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlIndex.create. + +CREATE UNIQUE INDEX FORMULE_PK ON FORMULE (ID) + +/ + +CREATE UNIQUE INDEX FORMULE_TEST_INTERVENANT_PK ON FORMULE_TEST_INTERVENANT (ID) + +/ + +CREATE UNIQUE INDEX FORMULE_TEST_STRUCTURE_PK ON FORMULE_TEST_STRUCTURE (ID) + +/ + +CREATE UNIQUE INDEX FORMULE_TEST_STRUCTURE__UN ON FORMULE_TEST_STRUCTURE (LIBELLE) + +/ + +CREATE UNIQUE INDEX FORMULE_TEST_VOLUME_HORAIRE_PK ON FORMULE_TEST_VOLUME_HORAIRE (ID) + +/ + +CREATE UNIQUE INDEX FORMULE__UN ON FORMULE (LIBELLE) + +/ + +CREATE UNIQUE INDEX INTERVENANT_LISTE_NOIRE_PK ON LISTE_NOIRE (CODE) + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlTable.alter.noNotNull|noDropColumns + +COMMENT ON TABLE "AFFECTATION_RECHERCHE" IS 'Un chercheur peut avoir plusieurs affectations de recherche' + +/ + +ALTER TABLE "FICHIER" MODIFY ("CONTENU" NULL) + +/ + +ALTER TABLE "SYNC_LOG" MODIFY ("DATE_SYNC" DATE) + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlPackage.alter. + +CREATE OR REPLACE PACKAGE "OSE_DIVERS" AS + + PROCEDURE CALCULER_TABLEAUX_BORD; + + FUNCTION GET_OSE_UTILISATEUR_ID RETURN NUMERIC; + FUNCTION GET_OSE_SOURCE_ID RETURN NUMERIC; + + FUNCTION INTERVENANT_HAS_PRIVILEGE( intervenant_id NUMERIC, privilege_name VARCHAR2 ) RETURN NUMERIC; + + FUNCTION implode(i_query VARCHAR2, i_seperator VARCHAR2 DEFAULT ',') RETURN VARCHAR2; + + PROCEDURE intervenant_horodatage_service( INTERVENANT_ID NUMERIC, TYPE_VOLUME_HORAIRE_ID NUMERIC, REFERENTIEL NUMERIC, HISTO_MODIFICATEUR_ID NUMERIC, HISTO_MODIFICATION DATE ); + + FUNCTION NIVEAU_FORMATION_ID_CALC( gtf_id NUMERIC, gtf_pertinence_niveau NUMERIC, niveau NUMERIC DEFAULT NULL ) RETURN NUMERIC; + + FUNCTION STR_REDUCE( str CLOB ) RETURN CLOB; + + FUNCTION STR_FIND( haystack CLOB, needle VARCHAR2 ) RETURN NUMERIC; + + FUNCTION LIKED( haystack CLOB, needle CLOB ) RETURN NUMERIC; + + FUNCTION CALCUL_TAUX_FI( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT; + + FUNCTION CALCUL_TAUX_FC( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT; + + FUNCTION CALCUL_TAUX_FA( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT; + + PROCEDURE SYNC_LOG( msg CLOB ); + + FUNCTION FORMATTED_RIB (bic VARCHAR2, iban VARCHAR2) RETURN VARCHAR2; + + FUNCTION FORMATTED_ADRESSE( + no_voie VARCHAR2, + nom_voie VARCHAR2, + batiment VARCHAR2, + mention_complementaire VARCHAR2, + localite VARCHAR2, + code_postal VARCHAR2, + ville VARCHAR2, + pays_libelle VARCHAR2) + RETURN VARCHAR2; + + PROCEDURE CALCUL_FEUILLE_DE_ROUTE( CONDS CLOB ); + + FUNCTION GET_TRIGGER_BODY( TRIGGER_NAME VARCHAR2 ) RETURN VARCHAR2; +END OSE_DIVERS + + / + +CREATE OR REPLACE PACKAGE BODY "OSE_DIVERS" AS + OSE_UTILISATEUR_ID NUMERIC; + OSE_SOURCE_ID NUMERIC; + + + + + PROCEDURE CALCULER_TABLEAUX_BORD IS + BEGIN + FOR d IN ( + SELECT tbl_name + FROM tbl + WHERE tbl_name <> 'formule' -- TROP LONG !! + ORDER BY ordre + ) + LOOP + UNICAEN_TBL.CALCULER(d.tbl_name); + dbms_output.put_line('Calcul du tableau de bord "' || d.tbl_name || '" effectué'); + COMMIT; + END LOOP; + END; + + + + FUNCTION GET_OSE_UTILISATEUR_ID RETURN NUMERIC IS + BEGIN + IF OSE_DIVERS.OSE_UTILISATEUR_ID IS NULL THEN + SELECT + to_number(valeur) INTO OSE_DIVERS.OSE_UTILISATEUR_ID + FROM + parametre + WHERE + nom = 'oseuser'; + END IF; + + RETURN OSE_DIVERS.OSE_UTILISATEUR_ID; + END; + + + + FUNCTION GET_OSE_SOURCE_ID RETURN NUMERIC IS + BEGIN + IF OSE_DIVERS.OSE_SOURCE_ID IS NULL THEN + SELECT + id INTO OSE_DIVERS.OSE_SOURCE_ID + FROM + source + WHERE + code = 'OSE'; + END IF; + + RETURN OSE_DIVERS.OSE_SOURCE_ID; + END; + + + + FUNCTION INTERVENANT_HAS_PRIVILEGE( intervenant_id NUMERIC, privilege_name VARCHAR2 ) RETURN NUMERIC IS + statut statut_intervenant%rowtype; + itype type_intervenant%rowtype; + res NUMERIC; + BEGIN + res := 1; + SELECT si.* INTO statut FROM statut_intervenant si JOIN intervenant i ON i.statut_id = si.id WHERE i.id = intervenant_id; + SELECT ti.* INTO itype FROM type_intervenant ti WHERE ti.id = statut.type_intervenant_id; + + /* DEPRECATED */ + IF 'saisie_service' = privilege_name THEN + res := statut.peut_saisir_service; + RETURN res; + ELSIF 'saisie_service_exterieur' = privilege_name THEN + --IF INTERVENANT_HAS_PRIVILEGE( intervenant_id, 'saisie_service' ) = 0 OR itype.code = 'E' THEN -- cascade + IF itype.code = 'E' THEN + res := 0; + END IF; + RETURN res; + ELSIF 'saisie_service_referentiel' = privilege_name THEN + IF itype.code = 'E' THEN + res := 0; + END IF; + RETURN res; + ELSIF 'saisie_service_referentiel_autre_structure' = privilege_name THEN + res := 1; + RETURN res; + ELSIF 'saisie_motif_non_paiement' = privilege_name THEN + res := statut.peut_saisir_motif_non_paiement; + RETURN res; + END IF; + /* FIN DE DEPRECATED */ + + SELECT + count(*) + INTO + res + FROM + intervenant i + JOIN statut_privilege sp ON sp.statut_id = i.statut_id + JOIN privilege p ON p.id = sp.privilege_id + JOIN categorie_privilege cp ON cp.id = p.categorie_id + WHERE + i.id = INTERVENANT_HAS_PRIVILEGE.intervenant_id + AND cp.code || '-' || p.code = privilege_name; + + RETURN res; + END; + + FUNCTION implode(i_query VARCHAR2, i_seperator VARCHAR2 DEFAULT ',') RETURN VARCHAR2 AS + l_return CLOB:=''; + l_temp CLOB; + TYPE r_cursor is REF CURSOR; + rc r_cursor; + BEGIN + OPEN rc FOR i_query; + LOOP + FETCH rc INTO L_TEMP; + EXIT WHEN RC%NOTFOUND; + l_return:=l_return||L_TEMP||i_seperator; + END LOOP; + RETURN RTRIM(l_return,i_seperator); + END; + + PROCEDURE intervenant_horodatage_service( INTERVENANT_ID NUMERIC, TYPE_VOLUME_HORAIRE_ID NUMERIC, REFERENTIEL NUMERIC, HISTO_MODIFICATEUR_ID NUMERIC, HISTO_MODIFICATION DATE ) AS + BEGIN + MERGE INTO histo_intervenant_service his USING dual ON ( + + his.INTERVENANT_ID = intervenant_horodatage_service.INTERVENANT_ID + AND NVL(his.TYPE_VOLUME_HORAIRE_ID,0) = NVL(intervenant_horodatage_service.TYPE_VOLUME_HORAIRE_ID,0) + AND his.REFERENTIEL = intervenant_horodatage_service.REFERENTIEL + + ) WHEN MATCHED THEN UPDATE SET + + HISTO_MODIFICATEUR_ID = intervenant_horodatage_service.HISTO_MODIFICATEUR_ID, + HISTO_MODIFICATION = intervenant_horodatage_service.HISTO_MODIFICATION + + WHEN NOT MATCHED THEN INSERT ( + + ID, + INTERVENANT_ID, + TYPE_VOLUME_HORAIRE_ID, + REFERENTIEL, + HISTO_MODIFICATEUR_ID, + HISTO_MODIFICATION + ) VALUES ( + HISTO_INTERVENANT_SERVI_ID_SEQ.NEXTVAL, + intervenant_horodatage_service.INTERVENANT_ID, + intervenant_horodatage_service.TYPE_VOLUME_HORAIRE_ID, + intervenant_horodatage_service.REFERENTIEL, + intervenant_horodatage_service.HISTO_MODIFICATEUR_ID, + intervenant_horodatage_service.HISTO_MODIFICATION + + ); + END; + + + FUNCTION NIVEAU_FORMATION_ID_CALC( gtf_id NUMERIC, gtf_pertinence_niveau NUMERIC, niveau NUMERIC DEFAULT NULL ) RETURN NUMERIC AS + BEGIN + IF 1 <> gtf_pertinence_niveau OR niveau IS NULL OR niveau < 1 OR gtf_id < 1 THEN RETURN NULL; END IF; + RETURN gtf_id * 256 + niveau; + END; + + FUNCTION STR_REDUCE( str CLOB ) RETURN CLOB IS + BEGIN + RETURN utl_raw.cast_to_varchar2((nlssort(str, 'nls_sort=binary_ai'))); + END; + + FUNCTION STR_FIND( haystack CLOB, needle VARCHAR2 ) RETURN NUMERIC IS + BEGIN + IF STR_REDUCE( haystack ) LIKE STR_REDUCE( '%' || needle || '%' ) THEN RETURN 1; END IF; + RETURN 0; + END; + + FUNCTION LIKED( haystack CLOB, needle CLOB ) RETURN NUMERIC IS + BEGIN + RETURN CASE WHEN STR_REDUCE(haystack) LIKE STR_REDUCE(needle) THEN 1 ELSE 0 END; + END; + + PROCEDURE DO_NOTHING IS + BEGIN + RETURN; + END; + + PROCEDURE CALCUL_TAUX( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, r_fi OUT FLOAT, r_fc OUT FLOAT, r_fa OUT FLOAT, arrondi NUMERIC DEFAULT 15 ) IS + nt FLOAT; + bi FLOAT; + bc FLOAT; + ba FLOAT; + reste FLOAT; + BEGIN + bi := eff_fi * fi; + bc := eff_fc * fc; + ba := eff_fa * fa; + nt := bi + bc + ba; + + IF nt = 0 THEN -- au cas ou, alors on ne prend plus en compte les effectifs!! + bi := fi; + bc := fc; + ba := fa; + nt := bi + bc + ba; + END IF; + + IF nt = 0 THEN -- toujours au cas ou... + bi := 1; + bc := 0; + ba := 0; + nt := bi + bc + ba; + END IF; + + -- Calcul + r_fi := bi / nt; + r_fc := bc / nt; + r_fa := ba / nt; + + -- Arrondis + r_fi := ROUND( r_fi, arrondi ); + r_fc := ROUND( r_fc, arrondi ); + r_fa := ROUND( r_fa, arrondi ); + + -- détermination du reste + reste := 1 - r_fi - r_fc - r_fa; + + -- répartition éventuelle du reste + IF reste <> 0 THEN + IF r_fi > 0 THEN r_fi := r_fi + reste; + ELSIF r_fc > 0 THEN r_fc := r_fc + reste; + ELSE r_fa := r_fa + reste; END IF; + END IF; + + END; + + + FUNCTION CALCUL_TAUX_FI( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT IS + ri FLOAT; + rc FLOAT; + ra FLOAT; + BEGIN + CALCUL_TAUX( eff_fi, eff_fc, eff_fa, fi, fc, fa, ri, rc, ra, arrondi ); + RETURN ri; + END; + + FUNCTION CALCUL_TAUX_FC( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT IS + ri FLOAT; + rc FLOAT; + ra FLOAT; + BEGIN + CALCUL_TAUX( eff_fi, eff_fc, eff_fa, fi, fc, fa, ri, rc, ra, arrondi ); + RETURN rc; + END; + + FUNCTION CALCUL_TAUX_FA( eff_fi FLOAT, eff_fc FLOAT, eff_fa FLOAT, fi NUMERIC, fc NUMERIC, fa NUMERIC, arrondi NUMERIC DEFAULT 15 ) RETURN FLOAT IS + ri FLOAT; + rc FLOAT; + ra FLOAT; + BEGIN + CALCUL_TAUX( eff_fi, eff_fc, eff_fa, fi, fc, fa, ri, rc, ra, arrondi ); + RETURN ra; + END; + + PROCEDURE SYNC_LOG( msg CLOB ) IS + BEGIN + INSERT INTO SYNC_LOG( id, date_sync, message ) VALUES ( sync_log_id_seq.nextval, systimestamp, msg ); + END; + + FUNCTION FORMATTED_RIB (bic VARCHAR2, iban VARCHAR2) RETURN VARCHAR2 IS + BEGIN + if bic is null and iban is null then + return null; + end if; + RETURN regexp_replace(bic, '[[:space:]]+', '') || '-' || regexp_replace(iban, '[[:space:]]+', ''); + END; + + FUNCTION FORMATTED_ADRESSE( + no_voie VARCHAR2, + nom_voie VARCHAR2, + batiment VARCHAR2, + mention_complementaire VARCHAR2, + localite VARCHAR2, + code_postal VARCHAR2, + ville VARCHAR2, + pays_libelle VARCHAR2) + RETURN VARCHAR2 + IS + BEGIN + return + -- concaténation des éléments non null séparés par ', ' + trim(trim(',' FROM REPLACE(', ' || NVL(no_voie,'#') || ', ' || NVL(nom_voie,'#') || ', ' || NVL(batiment,'#') || ', ' || NVL(mention_complementaire,'#'), ', #', ''))) || + -- saut de ligne complet + chr(13) || chr(10) || + -- concaténation des éléments non null séparés par ', ' + trim(trim(',' FROM REPLACE(', ' || NVL(localite,'#') || ', ' || NVL(code_postal,'#') || ', ' || NVL(ville,'#') || ', ' || NVL(pays_libelle,'#'), ', #', ''))); + END; + + + + PROCEDURE CALCUL_FEUILLE_DE_ROUTE( CONDS CLOB ) IS + BEGIN + FOR d IN ( + SELECT tbl_name + FROM tbl + WHERE feuille_de_route = 1 + ORDER BY ordre + ) LOOP + UNICAEN_TBL.CALCULER(d.tbl_name,CONDS); + END LOOP; + END; + + + + FUNCTION GET_TRIGGER_BODY( TRIGGER_NAME VARCHAR2 ) RETURN VARCHAR2 IS + vlong long; + BEGIN + SELECT trigger_body INTO vlong FROM all_triggers WHERE trigger_name = GET_TRIGGER_BODY.TRIGGER_NAME; + + RETURN substr(vlong, 1, 32767); + END; + +END OSE_DIVERS + + / + +CREATE OR REPLACE PACKAGE "OSE_EVENT" AS + + PROCEDURE ON_AFTER_FORMULE_CALC( INTERVENANT_ID NUMERIC ); + +END OSE_EVENT + + / + +CREATE OR REPLACE PACKAGE BODY "OSE_EVENT" AS + + PROCEDURE ON_AFTER_FORMULE_CALC( INTERVENANT_ID NUMERIC ) IS + p unicaen_tbl.t_params; + BEGIN + p := UNICAEN_TBL.make_params('INTERVENANT_ID', ON_AFTER_FORMULE_CALC.intervenant_id); + /* + UNICAEN_TBL.CALCULER( 'agrement', p ); + UNICAEN_TBL.CALCULER( 'paiement', p ); + UNICAEN_TBL.CALCULER( 'workflow', p );*/ + END; + +END OSE_EVENT + + / + +CREATE OR REPLACE PACKAGE "OSE_FORMULE" AS + + TYPE t_intervenant IS RECORD ( + id NUMERIC, + annee_id NUMERIC, + structure_id NUMERIC, + type_volume_horaire_id NUMERIC, + etat_volume_horaire_id NUMERIC, + + heures_decharge FLOAT DEFAULT 0, + heures_service_statutaire FLOAT DEFAULT 0, + heures_service_modifie FLOAT DEFAULT 0, + depassement_service_du_sans_hc BOOLEAN DEFAULT FALSE, + type_intervenant_code VARCHAR(2), + + service_du FLOAT, + debug_info CLOB + ); + + TYPE t_volume_horaire IS RECORD ( + -- identifiants + volume_horaire_id NUMERIC, + volume_horaire_ref_id NUMERIC, + service_id NUMERIC, + service_referentiel_id NUMERIC, + structure_id NUMERIC, + + -- paramètres + structure_is_affectation BOOLEAN DEFAULT TRUE, + structure_is_univ BOOLEAN DEFAULT FALSE, + service_statutaire BOOLEAN DEFAULT TRUE, + taux_fi FLOAT DEFAULT 1, + taux_fa FLOAT DEFAULT 0, + taux_fc FLOAT DEFAULT 0, + + -- pondérations et heures + + taux_service_du FLOAT DEFAULT 1, -- en fonction des types d'intervention + taux_service_compl FLOAT DEFAULT 1, -- en fonction des types d'intervention + ponderation_service_du FLOAT DEFAULT 1, -- relatif aux modulateurs + ponderation_service_compl FLOAT DEFAULT 1, -- relatif aux modulateurs + heures FLOAT DEFAULT 0, -- heures réelles saisies + + -- résultats + service_fi FLOAT DEFAULT 0, + service_fa FLOAT DEFAULT 0, + service_fc FLOAT DEFAULT 0, + service_referentiel 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, + heures_compl_referentiel FLOAT DEFAULT 0, + + debug_info CLOB + ); + TYPE t_lst_volume_horaire IS TABLE OF t_volume_horaire INDEX BY PLS_INTEGER; + TYPE t_volumes_horaires IS RECORD ( + length NUMERIC DEFAULT 0, + items t_lst_volume_horaire + ); + + intervenant t_intervenant; + volumes_horaires t_volumes_horaires; + + FUNCTION GET_INTERVENANT_ID 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 TEST( INTERVENANT_TEST_ID NUMERIC ); + PROCEDURE TEST_TOUT; + + PROCEDURE DEBUG_INTERVENANT; + PROCEDURE DEBUG_VOLUMES_HORAIRES(VOLUME_HORAIRE_ID NUMERIC DEFAULT NULL); +END OSE_FORMULE + + / + +CREATE OR REPLACE PACKAGE BODY "OSE_FORMULE" AS + + TYPE t_lst_vh_etats IS TABLE OF t_volumes_horaires INDEX BY PLS_INTEGER; + TYPE t_lst_vh_types IS TABLE OF t_lst_vh_etats INDEX BY PLS_INTEGER; + + TYPE t_resultat IS RECORD ( + id NUMERIC, + formule_resultat_id NUMERIC, + type_volume_horaire_id NUMERIC, + etat_volume_horaire_id NUMERIC, + service_id NUMERIC, + service_referentiel_id NUMERIC, + volume_horaire_id NUMERIC, + volume_horaire_ref_id NUMERIC, + structure_id NUMERIC, + + service_fi FLOAT DEFAULT 0, + service_fa FLOAT DEFAULT 0, + service_fc FLOAT DEFAULT 0, + service_referentiel 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, + heures_compl_referentiel FLOAT DEFAULT 0, + + changed BOOLEAN DEFAULT FALSE, + debug_info CLOB + ); + TYPE t_resultats IS TABLE OF t_resultat INDEX BY VARCHAR2(15); + + all_volumes_horaires t_lst_vh_types; + arrondi NUMERIC DEFAULT 2; + t_res t_resultats; + + + + FUNCTION GET_INTERVENANT_ID RETURN NUMERIC IS + BEGIN + RETURN intervenant.id; + 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 LOAD_INTERVENANT_FROM_BDD IS + dsdushc NUMERIC DEFAULT 0; + BEGIN + intervenant.service_du := 0; + + SELECT + intervenant_id, + annee_id, + structure_id, + type_intervenant_code, + heures_service_statutaire, + depassement_service_du_sans_hc, + heures_service_modifie, + heures_decharge + INTO + intervenant.id, + intervenant.annee_id, + intervenant.structure_id, + intervenant.type_intervenant_code, + intervenant.heures_service_statutaire, + dsdushc, + intervenant.heures_service_modifie, + intervenant.heures_decharge + FROM + v_formule_intervenant fi + WHERE + fi.intervenant_id = intervenant.id; + + intervenant.depassement_service_du_sans_hc := (dsdushc = 1); + intervenant.service_du := CASE + WHEN intervenant.depassement_service_du_sans_hc -- HC traitées comme du service + OR intervenant.heures_decharge < 0 -- s'il y a une décharge => aucune HC + + THEN 9999 + ELSE intervenant.heures_service_statutaire + intervenant.heures_service_modifie + END; + + EXCEPTION WHEN NO_DATA_FOUND THEN + intervenant.id := NULL; + intervenant.annee_id := null; + intervenant.structure_id := null; + intervenant.heures_service_statutaire := 0; + intervenant.depassement_service_du_sans_hc := FALSE; + intervenant.heures_service_modifie := 0; + intervenant.heures_decharge := 0; + intervenant.type_intervenant_code := 'E'; + intervenant.service_du := 0; + END; + + + + PROCEDURE LOAD_INTERVENANT_FROM_TEST IS + dsdushc NUMERIC DEFAULT 0; + BEGIN + SELECT + fti.id, + fti.annee_id, + fti.structure_test_id, + fti.type_volume_horaire_id, + fti.etat_volume_horaire_id, + fti.heures_decharge, + fti.heures_service_statutaire, + fti.heures_service_modifie, + fti.depassement_service_du_sans_hc, + fti.a_service_du, + ti.code + INTO + intervenant.id, + intervenant.annee_id, + intervenant.structure_id, + intervenant.type_volume_horaire_id, + intervenant.etat_volume_horaire_id, + intervenant.heures_decharge, + intervenant.heures_service_statutaire, + intervenant.heures_service_modifie, + dsdushc, + intervenant.service_du, + intervenant.type_intervenant_code + FROM + formule_test_intervenant fti + JOIN type_intervenant ti ON ti.id = fti.type_intervenant_id + WHERE + fti.id = intervenant.id; + + intervenant.depassement_service_du_sans_hc := (dsdushc = 1); + intervenant.service_du := CASE + WHEN intervenant.depassement_service_du_sans_hc -- HC traitées comme du service + OR intervenant.heures_decharge < 0 -- s'il y a une décharge => aucune HC + + THEN 9999 + ELSE intervenant.heures_service_statutaire + intervenant.heures_service_modifie + END; + + EXCEPTION WHEN NO_DATA_FOUND THEN + intervenant.id := NULL; + intervenant.annee_id := null; + intervenant.structure_id := null; + intervenant.heures_service_statutaire := 0; + intervenant.depassement_service_du_sans_hc := FALSE; + intervenant.heures_service_modifie := 0; + intervenant.heures_decharge := 0; + intervenant.type_intervenant_code := 'E'; + intervenant.service_du := 0; + END; + + + + PROCEDURE LOAD_VH_FROM_BDD IS + vh t_volume_horaire; + etat_volume_horaire_id NUMERIC DEFAULT 1; + structure_univ NUMERIC; + length NUMERIC; + BEGIN + all_volumes_horaires.delete; + + SELECT to_number(valeur) INTO structure_univ FROM parametre WHERE nom = 'structure_univ'; + + FOR d IN ( + SELECT * + FROM v_formule_volume_horaire fvh + WHERE fvh.intervenant_id = intervenant.id + ) LOOP + vh.volume_horaire_id := d.volume_horaire_id; + vh.volume_horaire_ref_id := d.volume_horaire_ref_id; + vh.service_id := d.service_id; + vh.service_referentiel_id := d.service_referentiel_id; + vh.taux_fi := d.taux_fi; + vh.taux_fa := d.taux_fa; + vh.taux_fc := d.taux_fc; + vh.ponderation_service_du := d.ponderation_service_du; + vh.ponderation_service_compl := d.ponderation_service_compl; + vh.structure_id := d.structure_id; + vh.structure_is_affectation := NVL(d.structure_id,0) = NVL(intervenant.structure_id,-1); + vh.structure_is_univ := NVL(d.structure_id,0) = NVL(structure_univ,-1); + vh.service_statutaire := d.service_statutaire = 1; + vh.heures := d.heures; + vh.taux_service_du := d.taux_service_du; + vh.taux_service_compl := d.taux_service_compl; + + FOR etat_volume_horaire_id IN 1 .. d.etat_volume_horaire_id LOOP + BEGIN + length := all_volumes_horaires(d.type_volume_horaire_id)(etat_volume_horaire_id).length; + EXCEPTION WHEN NO_DATA_FOUND THEN + length := 0; + END; + length := length + 1; + all_volumes_horaires(d.type_volume_horaire_id)(etat_volume_horaire_id).length := length; + all_volumes_horaires(d.type_volume_horaire_id)(etat_volume_horaire_id).items(length) := vh; + END LOOP; + END LOOP; + END; + + + + PROCEDURE LOAD_VH_FROM_TEST IS + vh t_volume_horaire; + etat_volume_horaire_id NUMERIC DEFAULT 1; + structure_univ NUMERIC; + length NUMERIC; + BEGIN + volumes_horaires.items.delete; + length := 0; + + SELECT id INTO structure_univ FROM formule_test_structure WHERE universite = 1; + + FOR d IN ( + SELECT * + FROM formule_test_volume_horaire ftvh + WHERE ftvh.intervenant_test_id = intervenant.id + ORDER BY ftvh.id + ) LOOP + length := length + 1; + volumes_horaires.length := length; + + IF d.referentiel = 0 THEN + volumes_horaires.items(length).volume_horaire_id := d.id; + volumes_horaires.items(length).service_id := d.id; + ELSE + volumes_horaires.items(length).volume_horaire_ref_id := d.id; + volumes_horaires.items(length).service_referentiel_id := d.id; + END IF; + volumes_horaires.items(length).taux_fi := d.taux_fi; + volumes_horaires.items(length).taux_fa := d.taux_fa; + volumes_horaires.items(length).taux_fc := d.taux_fc; + volumes_horaires.items(length).ponderation_service_du := d.ponderation_service_du; + volumes_horaires.items(length).ponderation_service_compl := d.ponderation_service_compl; + volumes_horaires.items(length).structure_id := d.structure_test_id; + volumes_horaires.items(length).structure_is_affectation := NVL(d.structure_test_id,0) = NVL(intervenant.structure_id,-1); + volumes_horaires.items(length).structure_is_univ := NVL(d.structure_test_id,0) = NVL(structure_univ,-1); + volumes_horaires.items(length).service_statutaire := d.service_statutaire = 1; + volumes_horaires.items(length).heures := d.heures; + volumes_horaires.items(length).taux_service_du := d.taux_service_du; + volumes_horaires.items(length).taux_service_compl := d.taux_service_compl; + END LOOP; + END; + + + + PROCEDURE tres_add_heures( code VARCHAR2, vh t_volume_horaire, tvh NUMERIC, evh NUMERIC) IS + BEGIN + IF NOT t_res.exists(code) THEN + t_res(code).service_fi := 0; + t_res(code).service_fa := 0; + t_res(code).service_fc := 0; + t_res(code).service_referentiel := 0; + t_res(code).heures_compl_fi := 0; + t_res(code).heures_compl_fa := 0; + t_res(code).heures_compl_fc := 0; + t_res(code).heures_compl_fc_majorees := 0; + t_res(code).heures_compl_referentiel := 0; + END IF; + + t_res(code).service_fi := t_res(code).service_fi + vh.service_fi; + t_res(code).service_fa := t_res(code).service_fa + vh.service_fa; + t_res(code).service_fc := t_res(code).service_fc + vh.service_fc; + t_res(code).service_referentiel := t_res(code).service_referentiel + vh.service_referentiel; + t_res(code).heures_compl_fi := t_res(code).heures_compl_fi + vh.heures_compl_fi; + t_res(code).heures_compl_fa := t_res(code).heures_compl_fa + vh.heures_compl_fa; + t_res(code).heures_compl_fc := t_res(code).heures_compl_fc + vh.heures_compl_fc; + t_res(code).heures_compl_fc_majorees := t_res(code).heures_compl_fc_majorees + vh.heures_compl_fc_majorees; + t_res(code).heures_compl_referentiel := t_res(code).heures_compl_referentiel + vh.heures_compl_referentiel; + + t_res(code).type_volume_horaire_id := tvh; + t_res(code).etat_volume_horaire_id := evh; + END; + + PROCEDURE DEBUG_TRES IS + code varchar2(15); + table_name varchar2(30); + 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; + BEGIN + code := t_res.FIRST; + LOOP EXIT WHEN code IS NULL; + table_name := CASE + WHEN code LIKE '%-s-%' THEN 'FORMULE_RESULTAT_SERVICE' + WHEN code LIKE '%-sr-%' THEN 'FORMULE_RESULTAT_SERVICE_REF' + WHEN code LIKE '%-vh-%' THEN 'FORMULE_RESULTAT_VH' + WHEN code LIKE '%-vhr-%' THEN 'FORMULE_RESULTAT_VH_REF' + ELSE 'FORMULE_RESULTAT' + END; + + ose_test.echo('T_RES( ' || code || ' - Table ' || table_name || ' ) '); + ose_test.echo(' id = ' || t_res(code).id); + ose_test.echo(' formule_resultat_id = ' || t_res(code).formule_resultat_id); + ose_test.echo(' type_volume_horaire_id = ' || t_res(code).type_volume_horaire_id); + ose_test.echo(' etat_volume_horaire_id = ' || t_res(code).etat_volume_horaire_id); + ose_test.echo(' volume_horaire_id = ' || t_res(code).volume_horaire_id); + ose_test.echo(' volume_horaire_ref_id = ' || t_res(code).volume_horaire_ref_id); + ose_test.echo(' service_id = ' || t_res(code).service_id); + ose_test.echo(' service_referentiel_id = ' || t_res(code).service_referentiel_id); + ose_test.echo(' structure_id = ' || t_res(code).structure_id); + ose_test.echo(' service_fi = ' || t_res(code).service_fi); + ose_test.echo(' service_fa = ' || t_res(code).service_fa); + ose_test.echo(' service_fc = ' || t_res(code).service_fc); + ose_test.echo(' service_referentiel = ' || t_res(code).service_referentiel); + ose_test.echo(' heures_compl_fi = ' || t_res(code).heures_compl_fi); + ose_test.echo(' heures_compl_fa = ' || t_res(code).heures_compl_fa); + ose_test.echo(' heures_compl_fc = ' || t_res(code).heures_compl_fc); + ose_test.echo(' heures_compl_fc_majorees = ' || t_res(code).heures_compl_fc_majorees); + ose_test.echo(' heures_compl_referentiel = ' || t_res(code).heures_compl_referentiel); + + code := t_res.NEXT(code); + END LOOP; + END; + + PROCEDURE SAVE_TO_BDD IS + bcode VARCHAR(15); + code VARCHAR(15); + type_volume_horaire_id NUMERIC; + etat_volume_horaire_id NUMERIC; + vh t_volume_horaire; + 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; + BEGIN + t_res.delete; + + /* On préinitialise avec ce qui existe déjà */ + FOR d IN ( + SELECT + fr.type_volume_horaire_id || '-' || fr.etat_volume_horaire_id code, + fr.id id, + fr.id formule_resultat_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + null service_id, + null service_referentiel_id, + null volume_horaire_id, + null volume_horaire_ref_id + + FROM + formule_resultat fr + WHERE + fr.intervenant_id = intervenant.id + + UNION ALL SELECT + fr.type_volume_horaire_id || '-' || fr.etat_volume_horaire_id || '-s-' || frs.service_id code, + frs.id id, + fr.id formule_resultat_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + frs.service_id service_id, + null service_referentiel_id, + null volume_horaire_id, + null volume_horaire_ref_id + FROM + formule_resultat_service frs + JOIN formule_resultat fr ON fr.id = frs.formule_resultat_id + WHERE + fr.intervenant_id = intervenant.id + + UNION ALL SELECT + fr.type_volume_horaire_id || '-' || fr.etat_volume_horaire_id || '-sr-' || frsr.service_referentiel_id code, + frsr.id id, + fr.id formule_resultat_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + null service_id, + frsr.service_referentiel_id service_referentiel_id, + null volume_horaire_id, + null volume_horaire_ref_id + FROM + formule_resultat_service_ref frsr + JOIN formule_resultat fr ON fr.id = frsr.formule_resultat_id + WHERE + fr.intervenant_id = intervenant.id + + UNION ALL SELECT + fr.type_volume_horaire_id || '-' || fr.etat_volume_horaire_id || '-vh-' || frvh.volume_horaire_id code, + frvh.id id, + fr.id formule_resultat_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + null service_id, + null service_referentiel_id, + frvh.volume_horaire_id volume_horaire_id, + null volume_horaire_ref_id + FROM + formule_resultat_vh frvh + JOIN formule_resultat fr ON fr.id = frvh.formule_resultat_id + WHERE + fr.intervenant_id = intervenant.id + + UNION ALL SELECT + fr.type_volume_horaire_id || '-' || fr.etat_volume_horaire_id || '-vhr-' || frvhr.volume_horaire_ref_id code, + frvhr.id id, + fr.id formule_resultat_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + null service_id, + null service_referentiel_id, + null volume_horaire_id, + frvhr.volume_horaire_ref_id volume_horaire_ref_id + FROM + formule_resultat_vh_ref frvhr + JOIN formule_resultat fr ON fr.id = frvhr.formule_resultat_id + WHERE + fr.intervenant_id = intervenant.id + ) LOOP + t_res(d.code).id := d.id; + t_res(d.code).formule_resultat_id := d.formule_resultat_id; + t_res(d.code).type_volume_horaire_id := d.type_volume_horaire_id; + t_res(d.code).etat_volume_horaire_id := d.etat_volume_horaire_id; + t_res(d.code).service_id := d.service_id; + t_res(d.code).service_referentiel_id := d.service_referentiel_id; + t_res(d.code).volume_horaire_id := d.volume_horaire_id; + t_res(d.code).volume_horaire_ref_id := d.volume_horaire_ref_id; + END LOOP; + + /* On charge avec les résultats de formule */ + type_volume_horaire_id := all_volumes_horaires.FIRST; + LOOP EXIT WHEN type_volume_horaire_id IS NULL; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).FIRST; + LOOP EXIT WHEN etat_volume_horaire_id IS NULL; + FOR i IN 1 .. all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id).length LOOP + vh := all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id).items(i); + bcode := type_volume_horaire_id || '-' || etat_volume_horaire_id; + + -- formule_resultat + code := bcode; + tres_add_heures(code,vh, type_volume_horaire_id, etat_volume_horaire_id); + + -- formule_resultat_service + IF vh.service_id IS NOT NULL THEN + code := bcode || '-s-' || vh.service_id; + t_res(code).service_id := vh.service_id; + tres_add_heures(code,vh, type_volume_horaire_id, etat_volume_horaire_id); + END IF; + + -- formule_resultat_service_ref + IF vh.service_referentiel_id IS NOT NULL THEN + code := bcode || '-sr-' || vh.service_referentiel_id; + t_res(code).service_referentiel_id := vh.service_referentiel_id; + tres_add_heures(code,vh, type_volume_horaire_id, etat_volume_horaire_id); + END IF; + + -- formule_resultat_volume_horaire + IF vh.volume_horaire_id IS NOT NULL THEN + code := bcode || '-vh-' || vh.volume_horaire_id; + t_res(code).volume_horaire_id := vh.volume_horaire_id; + tres_add_heures(code,vh, type_volume_horaire_id, etat_volume_horaire_id); + END IF; + + -- formule_resultat_volume_horaire_ref + IF vh.volume_horaire_ref_id IS NOT NULL THEN + code := bcode || '-vhr-' || vh.volume_horaire_ref_id; + t_res(code).volume_horaire_ref_id := vh.volume_horaire_ref_id; + tres_add_heures(code,vh, type_volume_horaire_id, etat_volume_horaire_id); + END IF; + + END LOOP; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).NEXT(etat_volume_horaire_id); + END LOOP; + type_volume_horaire_id := all_volumes_horaires.NEXT(type_volume_horaire_id); + END LOOP; + + /* On fait la sauvegarde en BDD */ + /* D'abord le formule_resultat */ + code := t_res.FIRST; + LOOP EXIT WHEN code IS NULL; + IF code = (t_res(code).type_volume_horaire_id || '-' || t_res(code).etat_volume_horaire_id) THEN + fr.id := t_res(code).id; + fr.intervenant_id := intervenant.id; + fr.type_volume_horaire_id := t_res(code).type_volume_horaire_id; + fr.etat_volume_horaire_id := t_res(code).etat_volume_horaire_id; + fr.service_fi := ROUND(t_res(code).service_fi,2); + fr.service_fa := ROUND(t_res(code).service_fa,2); + fr.service_fc := ROUND(t_res(code).service_fc,2); + fr.service_referentiel := ROUND(t_res(code).service_referentiel,2); + fr.heures_compl_fi := ROUND(t_res(code).heures_compl_fi,2); + fr.heures_compl_fa := ROUND(t_res(code).heures_compl_fa,2); + fr.heures_compl_fc := ROUND(t_res(code).heures_compl_fc,2); + fr.heures_compl_fc_majorees := ROUND(t_res(code).heures_compl_fc_majorees,2); + fr.heures_compl_referentiel := ROUND(t_res(code).heures_compl_referentiel,2); + 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.service_du := ROUND(CASE + WHEN intervenant.depassement_service_du_sans_hc OR intervenant.heures_decharge < 0 + THEN GREATEST(fr.total, intervenant.heures_service_statutaire + intervenant.heures_service_modifie) + ELSE intervenant.heures_service_statutaire + intervenant.heures_service_modifie + END,2); + + fr.solde := fr.total - fr.service_du; + IF fr.solde >= 0 THEN + fr.sous_service := 0; + fr.heures_compl := fr.solde; + ELSE + fr.sous_service := fr.solde * -1; + fr.heures_compl := 0; + END IF; + fr.type_intervenant_code := intervenant.type_intervenant_code; + + IF fr.id IS NULL THEN + fr.id := formule_resultat_id_seq.nextval; + t_res(code).id := fr.id; + INSERT INTO formule_resultat VALUES fr; + ELSE + UPDATE formule_resultat SET ROW = fr WHERE id = fr.id; + END IF; + END IF; + code := t_res.NEXT(code); + END LOOP; + + --DEBUG_TRES; + + /* Ensuite toutes les dépendances... */ + code := t_res.FIRST; + LOOP EXIT WHEN code IS NULL; + bcode := t_res(code).type_volume_horaire_id || '-' || t_res(code).etat_volume_horaire_id; + CASE + WHEN code LIKE '%-s-%' THEN -- formule_resultat_service + frs.id := t_res(code).id; + frs.formule_resultat_id := t_res(bcode).id; + frs.service_id := t_res(code).service_id; + frs.service_fi := ROUND(t_res(code).service_fi, 2); + frs.service_fa := ROUND(t_res(code).service_fa, 2); + frs.service_fc := ROUND(t_res(code).service_fc, 2); + frs.heures_compl_fi := ROUND(t_res(code).heures_compl_fi, 2); + frs.heures_compl_fa := ROUND(t_res(code).heures_compl_fa, 2); + frs.heures_compl_fc := ROUND(t_res(code).heures_compl_fc, 2); + frs.heures_compl_fc_majorees := ROUND(t_res(code).heures_compl_fc_majorees, 2); + 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; + IF frs.id IS NULL THEN + frs.id := formule_resultat_servic_id_seq.nextval; + INSERT INTO formule_resultat_service VALUES frs; + ELSE + UPDATE formule_resultat_service SET ROW = frs WHERE id = frs.id; + END IF; + WHEN code LIKE '%-sr-%' THEN -- formule_resultat_service_ref + frsr.id := t_res(code).id; + frsr.formule_resultat_id := t_res(bcode).id; + frsr.service_referentiel_id := t_res(code).service_referentiel_id; + frsr.service_referentiel := ROUND(t_res(code).service_referentiel, 2); + frsr.heures_compl_referentiel := ROUND(t_res(code).heures_compl_referentiel, 2); + frsr.total := frsr.service_referentiel + frsr.heures_compl_referentiel; + IF frsr.id IS NULL THEN + frsr.id := formule_resultat_servic_id_seq.nextval; + INSERT INTO formule_resultat_service_ref VALUES frsr; + ELSE + UPDATE formule_resultat_service_ref SET ROW = frsr WHERE id = frsr.id; + END IF; + WHEN code LIKE '%-vh-%' THEN -- formule_resultat_vh + frvh.id := t_res(code).id; + frvh.formule_resultat_id := t_res(bcode).id; + frvh.volume_horaire_id := t_res(code).volume_horaire_id; + frvh.service_fi := ROUND(t_res(code).service_fi, 2); + frvh.service_fa := ROUND(t_res(code).service_fa, 2); + frvh.service_fc := ROUND(t_res(code).service_fc, 2); + frvh.heures_compl_fi := ROUND(t_res(code).heures_compl_fi, 2); + frvh.heures_compl_fa := ROUND(t_res(code).heures_compl_fa, 2); + frvh.heures_compl_fc := ROUND(t_res(code).heures_compl_fc, 2); + frvh.heures_compl_fc_majorees := ROUND(t_res(code).heures_compl_fc_majorees, 2); + 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; + IF frvh.id IS NULL THEN + frvh.id := formule_resultat_vh_id_seq.nextval; + INSERT INTO formule_resultat_vh VALUES frvh; + ELSE + UPDATE formule_resultat_vh SET ROW = frvh WHERE id = frvh.id; + END IF; + WHEN code LIKE '%-vhr-%' THEN -- formule_resultat_vh_ref + frvhr.id := t_res(code).id; + frvhr.formule_resultat_id := t_res(bcode).id; + frvhr.volume_horaire_ref_id := t_res(code).volume_horaire_ref_id; + frvhr.service_referentiel := ROUND(t_res(code).service_referentiel, 2); + frvhr.heures_compl_referentiel := ROUND(t_res(code).heures_compl_referentiel, 2); + frvhr.total := frvhr.service_referentiel + frvhr.heures_compl_referentiel; + IF frvhr.id IS NULL THEN + frvhr.id := formule_resultat_vh_ref_id_seq.nextval; + INSERT INTO formule_resultat_vh_ref VALUES frvhr; + ELSE + UPDATE formule_resultat_vh_ref SET ROW = frvhr WHERE id = frvhr.id; + END IF; + ELSE code := code; + END CASE; + code := t_res.NEXT(code); + END LOOP; + END; + + + + PROCEDURE SAVE_TO_TEST(passed NUMERIC) IS + vh t_volume_horaire; + BEGIN + UPDATE formule_test_intervenant SET + c_service_du = CASE WHEN passed = 1 THEN intervenant.service_du ELSE NULL END, + debug_info = intervenant.debug_info + WHERE id = intervenant.id; + + FOR i IN 1 .. volumes_horaires.length LOOP + vh := volumes_horaires.items(i); + UPDATE formule_test_volume_horaire SET + c_service_fi = CASE WHEN passed = 1 THEN vh.service_fi ELSE NULL END, + c_service_fa = CASE WHEN passed = 1 THEN vh.service_fa ELSE NULL END, + c_service_fc = CASE WHEN passed = 1 THEN vh.service_fc ELSE NULL END, + c_service_referentiel = CASE WHEN passed = 1 THEN vh.service_referentiel ELSE NULL END, + c_heures_compl_fi = CASE WHEN passed = 1 THEN vh.heures_compl_fi ELSE NULL END, + c_heures_compl_fa = CASE WHEN passed = 1 THEN vh.heures_compl_fa ELSE NULL END, + c_heures_compl_fc = CASE WHEN passed = 1 THEN vh.heures_compl_fc ELSE NULL END, + c_heures_compl_fc_majorees = CASE WHEN passed = 1 THEN vh.heures_compl_fc_majorees ELSE NULL END, + c_heures_compl_referentiel = CASE WHEN passed = 1 THEN vh.heures_compl_referentiel ELSE NULL END, + debug_info = vh.debug_info + WHERE + id = COALESCE(vh.volume_horaire_id,vh.volume_horaire_ref_id); + END LOOP; + END; + + + + PROCEDURE CALCULER( INTERVENANT_ID NUMERIC ) IS + type_volume_horaire_id NUMERIC; + etat_volume_horaire_id NUMERIC; + fdata formule%rowtype; + BEGIN + intervenant.id := intervenant_id; + fdata := ose_parametre.get_formule; + + LOAD_INTERVENANT_FROM_BDD; + LOAD_VH_FROM_BDD; + + type_volume_horaire_id := all_volumes_horaires.FIRST; + LOOP EXIT WHEN type_volume_horaire_id IS NULL; + intervenant.type_volume_horaire_id := type_volume_horaire_id; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).FIRST; + LOOP EXIT WHEN etat_volume_horaire_id IS NULL; + intervenant.etat_volume_horaire_id := etat_volume_horaire_id; + volumes_horaires := all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id); + EXECUTE IMMEDIATE 'BEGIN ' || fdata.package_name || '.' || fdata.procedure_name || '; END;'; + all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id) := volumes_horaires; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).NEXT(etat_volume_horaire_id); + END LOOP; + type_volume_horaire_id := all_volumes_horaires.NEXT(type_volume_horaire_id); + END LOOP; + + SAVE_TO_BDD; + + OSE_EVENT.ON_AFTER_FORMULE_CALC( CALCULER.INTERVENANT_ID ); + 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 ALL + + 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; + + + + PROCEDURE TEST( INTERVENANT_TEST_ID NUMERIC ) IS + procedure_name VARCHAR2(30); + package_name VARCHAR2(30); + BEGIN + intervenant.id := INTERVENANT_TEST_ID; + + SELECT + package_name, procedure_name INTO package_name, procedure_name + FROM + formule f JOIN formule_test_intervenant fti ON fti.formule_id = f.id + WHERE + fti.id = intervenant.id; + + LOAD_INTERVENANT_FROM_TEST; + LOAD_VH_FROM_TEST; + + BEGIN + EXECUTE IMMEDIATE 'BEGIN ' || package_name || '.' || procedure_name || '; END;'; + SAVE_TO_TEST(1); + EXCEPTION WHEN OTHERS THEN + SAVE_TO_TEST(0); + RAISE_APPLICATION_ERROR(-20001, dbms_utility.format_error_backtrace,true); + END; + END; + + + + PROCEDURE TEST_TOUT IS + BEGIN + FOR d IN (SELECT id FROM formule_test_intervenant) + LOOP + TEST( d.id ); + END LOOP; + 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; + + + + PROCEDURE DEBUG_INTERVENANT IS + BEGIN + ose_test.echo('OSE Formule DEBUG Intervenant'); + ose_test.echo('id = ' || intervenant.id); + ose_test.echo('annee_id = ' || intervenant.annee_id); + ose_test.echo('structure_id = ' || intervenant.structure_id); + ose_test.echo('type_volume_horaire_id = ' || intervenant.type_volume_horaire_id); + ose_test.echo('heures_decharge = ' || intervenant.heures_decharge); + ose_test.echo('heures_service_statutaire = ' || intervenant.heures_service_statutaire); + ose_test.echo('heures_service_modifie = ' || intervenant.heures_service_modifie); + ose_test.echo('depassement_service_du_sans_hc = ' || CASE WHEN intervenant.depassement_service_du_sans_hc THEN 'OUI' ELSE 'NON' END); + ose_test.echo('service_du = ' || intervenant.service_du); + END; + + PROCEDURE DEBUG_VOLUMES_HORAIRES(VOLUME_HORAIRE_ID NUMERIC DEFAULT NULL) IS + type_volume_horaire_id NUMERIC; + etat_volume_horaire_id NUMERIC; + vh t_volume_horaire; + BEGIN + ose_test.echo('OSE Formule DEBUG Intervenant'); + + type_volume_horaire_id := all_volumes_horaires.FIRST; + LOOP EXIT WHEN type_volume_horaire_id IS NULL; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).FIRST; + LOOP EXIT WHEN etat_volume_horaire_id IS NULL; + ose_test.echo('tvh=' || type_volume_horaire_id || ', evh=' || etat_volume_horaire_id); + FOR i IN 1 .. all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id).length LOOP + vh := all_volumes_horaires(type_volume_horaire_id)(etat_volume_horaire_id).items(i); + IF VOLUME_HORAIRE_ID IS NULL OR VOLUME_HORAIRE_ID = vh.volume_horaire_id OR VOLUME_HORAIRE_ID = vh.volume_horaire_ref_id THEN + ose_test.echo('volume_horaire_id = ' || vh.volume_horaire_id); + ose_test.echo('volume_horaire_ref_id = ' || vh.volume_horaire_ref_id); + ose_test.echo('service_id = ' || vh.service_id); + ose_test.echo('service_referentiel_id = ' || vh.service_referentiel_id); + ose_test.echo('taux_fi = ' || vh.taux_fi); + ose_test.echo('taux_fa = ' || vh.taux_fa); + ose_test.echo('taux_fc = ' || vh.taux_fc); + ose_test.echo('ponderation_service_du = ' || vh.ponderation_service_du); + ose_test.echo('ponderation_service_compl = ' || vh.ponderation_service_compl); + ose_test.echo('structure_id = ' || vh.structure_id); + ose_test.echo('structure_is_affectation = ' || CASE WHEN vh.structure_is_affectation THEN 'OUI' ELSE 'NON' END); + ose_test.echo('structure_is_univ = ' || CASE WHEN vh.structure_is_univ THEN 'OUI' ELSE 'NON' END); + ose_test.echo('service_statutaire = ' || CASE WHEN vh.service_statutaire THEN 'OUI' ELSE 'NON' END); + ose_test.echo('heures = ' || vh.heures); + ose_test.echo('taux_service_du = ' || vh.taux_service_du); + ose_test.echo('taux_service_compl = ' || vh.taux_service_compl); + ose_test.echo('service_fi = ' || vh.service_fi); + ose_test.echo('service_fa = ' || vh.service_fa); + ose_test.echo('service_fc = ' || vh.service_fc); + ose_test.echo('service_referentiel = ' || vh.service_referentiel); + ose_test.echo('heures_compl_fi = ' || vh.heures_compl_fi); + ose_test.echo('heures_compl_fa = ' || vh.heures_compl_fa); + ose_test.echo('heures_compl_fc = ' || vh.heures_compl_fc); + ose_test.echo('heures_compl_fc_majorees = ' || vh.heures_compl_fc_majorees); + ose_test.echo('heures_compl_referentiel = ' || vh.heures_compl_referentiel); + ose_test.echo(''); + END IF; + END LOOP; + etat_volume_horaire_id := all_volumes_horaires(type_volume_horaire_id).NEXT(etat_volume_horaire_id); + END LOOP; + type_volume_horaire_id := all_volumes_horaires.NEXT(type_volume_horaire_id); + END LOOP; + END; + +END OSE_FORMULE + + / + +CREATE OR REPLACE PACKAGE "OSE_PARAMETRE" AS + + function get_etablissement return Numeric; + function get_annee return Numeric; + function get_annee_import return Numeric; + function get_ose_user return Numeric; + function get_formule RETURN formule%rowtype; + +END OSE_PARAMETRE + + / + +CREATE OR REPLACE PACKAGE BODY "OSE_PARAMETRE" AS + + cache_ose_user NUMERIC; + cache_annee_id NUMERIC; + + FUNCTION get_etablissement return Numeric AS + etab_id numeric; + BEGIN + select to_number(valeur) into etab_id from parametre where nom = 'etablissement'; + RETURN etab_id; + END get_etablissement; + + FUNCTION get_annee return Numeric AS + annee_id numeric; + BEGIN + IF cache_annee_id IS NOT NULL THEN RETURN cache_annee_id; END IF; + select to_number(valeur) into annee_id from parametre where nom = 'annee'; + cache_annee_id := annee_id; + RETURN cache_annee_id; + END get_annee; + + FUNCTION get_annee_import RETURN NUMERIC AS + annee_id NUMERIC; + BEGIN + SELECT to_number(valeur) INTO annee_id FROM parametre WHERE nom = 'annee_import'; + RETURN annee_id; + END get_annee_import; + + FUNCTION get_ose_user return NUMERIC AS + ose_user_id numeric; + BEGIN + IF cache_ose_user IS NOT NULL THEN RETURN cache_ose_user; END IF; + select to_number(valeur) into ose_user_id from parametre where nom = 'oseuser'; + cache_ose_user := ose_user_id; + RETURN cache_ose_user; + END get_ose_user; + + FUNCTION get_formule RETURN formule%rowtype IS + fdata formule%rowtype; + BEGIN + SELECT + f.* INTO fdata + FROM + formule f + JOIN parametre p ON f.id = to_number(p.valeur) + WHERE p.nom = 'formule'; + RETURN fdata; + END; + +END OSE_PARAMETRE + + / + + + + +-- OseAdmin\Bdd\Ddl\DdlView.alter. + +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", + ct."modifieComplete", + 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 c.structure_id <> COALESCE(cp.structure_id,0) THEN 'modifié' ELSE 'complété' END "modifieComplete", + 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 + LEFT JOIN contrat cp ON cp.id = c.contrat_id + WHERE + c.histo_destruction IS NULL + ) ct + +/ + +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 + 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 + 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 + -- On récapitule tous les enseignements validés de la composante et pas seulement le différentiel... + --AND (cv.id IS NULL OR vh.contrat_id = c.id) + AND COALESCE(ep.structure_id,i.structure_id) = c.structure_id + AND (vh.auto_validation = 1 OR v.id IS NOT NULL) +GROUP BY + c.id, str.libelle_court, ep.code, ep.libelle + +/ + +CREATE OR REPLACE VIEW V_ETAT_PAIEMENT AS +SELECT + annee_id, + type_intervenant_id, + structure_id, + periode_id, + intervenant_id, + centre_cout_id, + domaine_fonctionnel_id, + + annee_id || '/' || (annee_id+1) annee, + etat, + composante, + date_mise_en_paiement, + periode, + statut, + intervenant_code, + intervenant_nom, + intervenant_numero_insee, + centre_cout_code, + centre_cout_libelle, + domaine_fonctionnel_code, + domaine_fonctionnel_libelle, + hetd, + CASE WHEN pourc_ecart >= 0 THEN + CASE WHEN RANK() OVER (PARTITION BY periode_id, intervenant_id, etat, structure_id ORDER BY CASE WHEN (pourc_ecart >= 0 AND pourc_diff >= 0) OR (pourc_ecart < 0 AND pourc_diff < 0) THEN pourc_diff ELSE -1 END DESC) <= (ABS(pourc_ecart) / 0.001) THEN hetd_pourc + (pourc_ecart / ABS(pourc_ecart) * 0.001) ELSE hetd_pourc END + ELSE + CASE WHEN RANK() OVER (PARTITION BY periode_id, intervenant_id, etat, structure_id ORDER BY CASE WHEN (pourc_ecart >= 0 AND pourc_diff >= 0) OR (pourc_ecart < 0 AND pourc_diff < 0) THEN pourc_diff ELSE -1 END) <= (ABS(pourc_ecart) / 0.001) THEN hetd_pourc + (pourc_ecart / ABS(pourc_ecart) * 0.001) ELSE hetd_pourc END + END hetd_pourc, + hetd_montant, + rem_fc_d714, + exercice_aa, + exercice_aa_montant, + exercice_ac, + exercice_ac_montant +FROM + ( + SELECT + dep3.*, + + 1-CASE WHEN hetd > 0 THEN SUM( hetd_pourc ) OVER ( PARTITION BY periode_id, intervenant_id, etat, structure_id) ELSE 0 END pourc_ecart + + + FROM ( + + SELECT + periode_id, + structure_id, + type_intervenant_id, + intervenant_id, + annee_id, + centre_cout_id, + domaine_fonctionnel_id, + etat, + composante, + date_mise_en_paiement, + periode, + statut, + intervenant_code, + intervenant_nom, + intervenant_numero_insee, + centre_cout_code, + centre_cout_libelle, + domaine_fonctionnel_code, + domaine_fonctionnel_libelle, + hetd, + ROUND( CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat, structure_id) ELSE 0 END, 3 ) hetd_pourc, + ROUND( hetd * taux_horaire, 2 ) hetd_montant, + ROUND( fc_majorees * taux_horaire, 2 ) rem_fc_d714, + exercice_aa, + ROUND( exercice_aa * taux_horaire, 2 ) exercice_aa_montant, + exercice_ac, + ROUND( exercice_ac * taux_horaire, 2 ) exercice_ac_montant, + + + (CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat, structure_id) ELSE 0 END) + - + ROUND( CASE WHEN hetd > 0 THEN hetd / SUM( hetd ) OVER( PARTITION BY periode_id, intervenant_id, etat, structure_id) ELSE 0 END, 3 ) pourc_diff + + FROM ( + WITH dep AS ( -- détails par état de paiement + SELECT + CASE WHEN th.code = 'fc_majorees' THEN 1 ELSE 0 END is_fc_majoree, + p.id periode_id, + s.id structure_id, + i.id intervenant_id, + i.annee_id annee_id, + cc.id centre_cout_id, + df.id domaine_fonctionnel_id, + ti.id type_intervenant_id, + CASE + WHEN mep.date_mise_en_paiement IS NULL THEN 'a-mettre-en-paiement' + ELSE 'mis-en-paiement' + END etat, + + TRIM(p.libelle_long || ' ' || to_char( add_months( a.date_debut, p.ecart_mois ), 'yyyy' )) periode, + mep.date_mise_en_paiement date_mise_en_paiement, + s.libelle_court composante, + ti.libelle statut, + i.source_code intervenant_code, + i.nom_usuel || ' ' || i.prenom intervenant_nom, + TRIM( NVL(i.numero_insee,'') || NVL(TO_CHAR(i.numero_insee_cle,'00'),'') ) intervenant_numero_insee, + cc.source_code centre_cout_code, + cc.libelle centre_cout_libelle, + df.source_code domaine_fonctionnel_code, + df.libelle domaine_fonctionnel_libelle, + CASE WHEN th.code = 'fc_majorees' THEN 0 ELSE mep.heures END hetd, + CASE WHEN th.code = 'fc_majorees' THEN mep.heures ELSE 0 END fc_majorees, + mep.heures * 4 / 10 exercice_aa, + mep.heures * 6 / 10 exercice_ac, + --CASE WHEN th.code = 'fc_majorees' THEN 0 ELSE mep.heures END * 4 / 10 exercice_aa, + --CASE WHEN th.code = 'fc_majorees' THEN 0 ELSE mep.heures END * 6 / 10 exercice_ac, + OSE_FORMULE.GET_TAUX_HORAIRE_HETD( NVL(mep.date_mise_en_paiement,SYSDATE) ) taux_horaire + FROM + v_mep_intervenant_structure mis + JOIN mise_en_paiement mep ON mep.id = mis.mise_en_paiement_id AND mep.histo_destruction IS NULL + JOIN type_heures th ON th.id = mep.type_heures_id + JOIN centre_cout cc ON cc.id = mep.centre_cout_id -- pas d'historique pour les centres de coût, qui devront tout de même apparaitre mais en erreur + JOIN intervenant i ON i.id = mis.intervenant_id AND i.histo_destruction IS NULL + JOIN annee a ON a.id = i.annee_id + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN type_intervenant ti ON ti.id = si.type_intervenant_id + JOIN structure s ON s.id = mis.structure_id + LEFT JOIN validation v ON v.id = mep.validation_id AND v.histo_destruction IS NULL + LEFT JOIN domaine_fonctionnel df ON df.id = mis.domaine_fonctionnel_id + LEFT JOIN periode p ON p.id = mep.periode_paiement_id + ) + SELECT + periode_id, + structure_id, + type_intervenant_id, + intervenant_id, + annee_id, + centre_cout_id, + domaine_fonctionnel_id, + etat, + periode, + composante, + date_mise_en_paiement, + statut, + intervenant_code, + intervenant_nom, + intervenant_numero_insee, + centre_cout_code, + centre_cout_libelle, + domaine_fonctionnel_code, + domaine_fonctionnel_libelle, + SUM( hetd ) hetd, + SUM( fc_majorees ) fc_majorees, + SUM( exercice_aa ) exercice_aa, + SUM( exercice_ac ) exercice_ac, + taux_horaire + FROM + dep + GROUP BY + periode_id, + structure_id, + type_intervenant_id, + intervenant_id, + annee_id, + centre_cout_id, + domaine_fonctionnel_id, + etat, + periode, + composante, + date_mise_en_paiement, + statut, + intervenant_code, + intervenant_nom, + intervenant_numero_insee, + centre_cout_code, + centre_cout_libelle, + domaine_fonctionnel_code, + domaine_fonctionnel_libelle, + taux_horaire, + is_fc_majoree + ) + dep2 + ) + dep3 + ) + dep4 +ORDER BY + annee_id, + type_intervenant_id, + structure_id, + periode_id, + intervenant_nom + +/ + +CREATE OR REPLACE VIEW V_EXPORT_PAIEMENT_WINPAIE AS +SELECT + annee_id, + type_intervenant_id, + structure_id, + periode_id, + intervenant_id, + + insee, + nom, + '20' carte, + code_origine, + '0204' retenue, + '0' sens, + 'B' mc, + nbu, + montant, + libelle || ' ' || LPAD(TO_CHAR(FLOOR(nbu)),2,'00') || ' H' || + CASE to_char(ROUND( nbu-FLOOR(nbu), 2 )*100,'00') + WHEN ' 00' THEN '' ELSE ' ' || LPAD(ROUND( nbu-FLOOR(nbu), 2 )*100,2,'00') END libelle +FROM ( + SELECT + i.annee_id annee_id, + si.type_intervenant_id type_intervenant_id, + t2.structure_id structure_id, + t2.periode_paiement_id periode_id, + i.id intervenant_id, + + '''' || NVL(i.numero_insee,'') || TRIM(NVL(TO_CHAR(i.numero_insee_cle,'00'),'')) insee, + i.nom_usuel || ',' || i.prenom nom, + t2.code_origine code_origine, + CASE WHEN ind <> CEIL(t2.nbu/max_nbu) THEN max_nbu ELSE t2.nbu - max_nbu*(ind-1) END nbu, + t2.nbu tnbu, + OSE_FORMULE.GET_TAUX_HORAIRE_HETD( NVL(t2.date_mise_en_paiement,SYSDATE) ) montant, + COALESCE(t2.unite_budgetaire,'') || ' ' || to_char(i.annee_id) || ' ' || to_char(i.annee_id+1) libelle + FROM ( + SELECT + structure_id, + periode_paiement_id, + intervenant_id, + code_origine, + ROUND( SUM(nbu), 2) nbu, + unite_budgetaire, + date_mise_en_paiement + FROM ( + WITH mep AS ( + SELECT + -- pour les filtres + mep.id, + mis.structure_id, + mep.periode_paiement_id, + mis.intervenant_id, + mep.heures, + cc.unite_budgetaire, + mep.date_mise_en_paiement + FROM + v_mep_intervenant_structure mis + JOIN mise_en_paiement mep ON mep.id = mis.mise_en_paiement_id AND mep.histo_destruction IS NULL + JOIN centre_cout cc ON cc.id = mep.centre_cout_id + JOIN type_heures th ON th.id = mep.type_heures_id + WHERE + mep.date_mise_en_paiement IS NOT NULL + AND mep.periode_paiement_id IS NOT NULL + AND th.eligible_extraction_paie = 1 + ) + SELECT + mep.id, + mep.structure_id, + mep.periode_paiement_id, + mep.intervenant_id, + 2 code_origine, + mep.heures * 4 / 10 nbu, + mep.unite_budgetaire, + mep.date_mise_en_paiement + FROM + mep + WHERE + mep.heures * 4 / 10 > 0 + + UNION + + SELECT + mep.id, + mep.structure_id, + mep.periode_paiement_id, + mep.intervenant_id, + 1 code_origine, + mep.heures * 6 / 10 nbu, + mep.unite_budgetaire, + mep.date_mise_en_paiement + FROM + mep + WHERE + mep.heures * 6 / 10 > 0 + ) t1 + GROUP BY + structure_id, + periode_paiement_id, + intervenant_id, + code_origine, + unite_budgetaire, + date_mise_en_paiement + ) t2 + JOIN (SELECT level ind, 99 max_nbu FROM dual CONNECT BY 1=1 AND LEVEL <= 11) tnbu ON ceil(t2.nbu / max_nbu) >= ind + JOIN intervenant i ON i.id = t2.intervenant_id + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN structure s ON s.id = t2.structure_id + ) t3 +ORDER BY + annee_id, type_intervenant_id, structure_id, periode_id, nom, code_origine, nbu DESC + +/ + +CREATE OR REPLACE VIEW V_EXPORT_SERVICE AS + WITH t AS ( SELECT + 'vh_' || vh.id id, + s.id service_id, + s.intervenant_id intervenant_id, + vh.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + s.element_pedagogique_id element_pedagogique_id, + s.etablissement_id etablissement_id, + NULL structure_aff_id, + NULL structure_ens_id, + vh.periode_id periode_id, + vh.type_intervention_id type_intervention_id, + NULL fonction_referentiel_id, + + s.description service_description, + + vh.heures heures, + 0 heures_ref, + 0 heures_non_payees, + frvh.service_fi service_fi, + frvh.service_fa service_fa, + frvh.service_fc service_fc, + 0 service_referentiel, + frvh.heures_compl_fi heures_compl_fi, + frvh.heures_compl_fa heures_compl_fa, + frvh.heures_compl_fc heures_compl_fc, + frvh.heures_compl_fc_majorees heures_compl_fc_majorees, + 0 heures_compl_referentiel, + frvh.total total, + fr.solde solde, + NULL service_ref_formation, + NULL commentaires + FROM + formule_resultat_vh frvh + JOIN formule_resultat fr ON fr.id = frvh.formule_resultat_id + JOIN volume_horaire vh ON vh.id = frvh.volume_horaire_id AND vh.motif_non_paiement_id IS NULL AND vh.histo_destruction IS NULL + JOIN service s ON s.id = vh.service_id AND s.intervenant_id = fr.intervenant_id AND s.histo_destruction IS NULL + + UNION ALL + + SELECT + 'vh_' || vh.id id, + s.id service_id, + s.intervenant_id intervenant_id, + vh.type_volume_horaire_id type_volume_horaire_id, + vhe.etat_volume_horaire_id etat_volume_horaire_id, + s.element_pedagogique_id element_pedagogique_id, + s.etablissement_id etablissement_id, + NULL structure_aff_id, + NULL structure_ens_id, + vh.periode_id periode_id, + vh.type_intervention_id type_intervention_id, + NULL fonction_referentiel_id, + + s.description service_description, + + vh.heures heures, + 0 heures_ref, + 1 heures_non_payees, + 0 service_fi, + 0 service_fa, + 0 service_fc, + 0 service_referentiel, + 0 heures_compl_fi, + 0 heures_compl_fa, + 0 heures_compl_fc, + 0 heures_compl_fc_majorees, + 0 heures_compl_referentiel, + 0 total, + fr.solde solde, + NULL service_ref_formation, + NULL commentaires + FROM + volume_horaire vh + JOIN service s ON s.id = vh.service_id + JOIN v_volume_horaire_etat vhe ON vhe.volume_horaire_id = vh.id + JOIN formule_resultat fr ON fr.intervenant_id = s.intervenant_id AND fr.type_volume_horaire_id = vh.type_volume_horaire_id AND fr.etat_volume_horaire_id = vhe.etat_volume_horaire_id + WHERE + vh.motif_non_paiement_id IS NOT NULL + AND vh.histo_destruction IS NULL + AND s.histo_destruction IS NULL + + UNION ALL + + SELECT + 'vh_ref_' || vhr.id id, + sr.id service_id, + sr.intervenant_id intervenant_id, + fr.type_volume_horaire_id type_volume_horaire_id, + fr.etat_volume_horaire_id etat_volume_horaire_id, + NULL element_pedagogique_id, + OSE_PARAMETRE.GET_ETABLISSEMENT etablissement_id, + NULL structure_aff_id, + sr.structure_id structure_ens_id, + NULL periode_id, + NULL type_intervention_id, + sr.fonction_id fonction_referentiel_id, + + NULL service_description, + + 0 heures, + vhr.heures heures_ref, + 0 heures_non_payees, + 0 service_fi, + 0 service_fa, + 0 service_fc, + frvr.service_referentiel service_referentiel, + 0 heures_compl_fi, + 0 heures_compl_fa, + 0 heures_compl_fc, + 0 heures_compl_fc_majorees, + frvr.heures_compl_referentiel heures_compl_referentiel, + frvr.total total, + fr.solde solde, + sr.formation service_ref_formation, + sr.commentaires commentaires + FROM + formule_resultat_vh_ref frvr + JOIN formule_resultat fr ON fr.id = frvr.formule_resultat_id + JOIN volume_horaire_ref vhr ON vhr.id = frvr.volume_horaire_ref_id + JOIN service_referentiel sr ON sr.id = vhr.service_referentiel_id AND sr.intervenant_id = fr.intervenant_id AND sr.histo_destruction IS NULL + + UNION ALL + + SELECT + 'vh_0_' || i.id id, + NULL service_id, + i.id intervenant_id, + tvh.id type_volume_horaire_id, + evh.id etat_volume_horaire_id, + NULL element_pedagogique_id, + OSE_PARAMETRE.GET_ETABLISSEMENT etablissement_id, + NULL structure_aff_id, + NULL structure_ens_id, + NULL periode_id, + NULL type_intervention_id, + NULL fonction_referentiel_id, + + NULL service_description, + + 0 heures, + 0 heures_ref, + 0 heures_non_payees, + 0 service_fi, + 0 service_fa, + 0 service_fc, + 0 service_referentiel, + 0 heures_compl_fi, + 0 heures_compl_fa, + 0 heures_compl_fc, + 0 heures_compl_fc_majorees, + NULL heures_compl_referentiel, + 0 total, + 0 solde, + NULL service_ref_formation, + NULL commentaires + FROM + intervenant i + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN etat_volume_horaire evh ON evh.code IN ('saisi','valide') + JOIN type_volume_horaire tvh ON tvh.code IN ('PREVU','REALISE') + LEFT JOIN modification_service_du msd ON msd.intervenant_id = i.id AND msd.histo_destruction IS NULL + LEFT JOIN motif_modification_service mms ON mms.id = msd.motif_id + WHERE + i.histo_destruction IS NULL + AND si.service_statutaire > 0 + GROUP BY + i.id, si.service_statutaire, evh.id, tvh.id + HAVING + si.service_statutaire + SUM(msd.heures * mms.multiplicateur) = 0 + + + ), ponds AS ( + SELECT + ep.id element_pedagogique_id, + MAX(COALESCE( m.ponderation_service_du, 1)) ponderation_service_du, + MAX(COALESCE( m.ponderation_service_compl, 1)) ponderation_service_compl + FROM + element_pedagogique ep + LEFT JOIN element_modulateur em ON em.element_id = ep.id + AND em.histo_destruction IS NULL + LEFT JOIN modulateur m ON m.id = em.modulateur_id + WHERE + ep.histo_destruction IS NULL + GROUP BY + ep.id + ) + SELECT + t.id id, + t.service_id service_id, + i.id intervenant_id, + ti.id type_intervenant_id, + i.annee_id annee_id, + his.histo_modification service_date_modification, + t.type_volume_horaire_id type_volume_horaire_id, + t.etat_volume_horaire_id etat_volume_horaire_id, + etab.id etablissement_id, + saff.id structure_aff_id, + sens.id structure_ens_id, + ose_divers.niveau_formation_id_calc( gtf.id, gtf.pertinence_niveau, etp.niveau ) niveau_formation_id, + etp.id etape_id, + ep.id element_pedagogique_id, + t.periode_id periode_id, + t.type_intervention_id type_intervention_id, + t.fonction_referentiel_id fonction_referentiel_id, + + tvh.libelle || ' ' || evh.libelle type_etat, + i.source_code intervenant_code, + i.nom_usuel || ' ' || i.prenom intervenant_nom, + i.date_naissance intervenant_date_naissance, + si.libelle intervenant_statut_libelle, + ti.code intervenant_type_code, + ti.libelle intervenant_type_libelle, + g.source_code intervenant_grade_code, + g.libelle_court intervenant_grade_libelle, + di.source_code intervenant_discipline_code, + di.libelle_court intervenant_discipline_libelle, + saff.libelle_court service_structure_aff_libelle, + + sens.libelle_court service_structure_ens_libelle, + etab.libelle etablissement_libelle, + gtf.libelle_court groupe_type_formation_libelle, + tf.libelle_court type_formation_libelle, + etp.niveau etape_niveau, + etp.source_code etape_code, + etp.libelle etape_libelle, + ep.source_code element_code, + COALESCE(ep.libelle,to_char(t.service_description)) element_libelle, + de.source_code element_discipline_code, + de.libelle_court element_discipline_libelle, + fr.libelle_long fonction_referentiel_libelle, + ep.taux_fi element_taux_fi, + ep.taux_fc element_taux_fc, + ep.taux_fa element_taux_fa, + t.service_ref_formation service_ref_formation, + t.commentaires commentaires, + p.libelle_court periode_libelle, + CASE WHEN ponds.ponderation_service_compl = 1 THEN NULL ELSE ponds.ponderation_service_compl END element_ponderation_compl, + src.libelle element_source_libelle, + + t.heures heures, + t.heures_ref heures_ref, + t.heures_non_payees heures_non_payees, + si.service_statutaire service_statutaire, + fi.heures_service_modifie service_du_modifie, + t.service_fi service_fi, + t.service_fa service_fa, + t.service_fc service_fc, + t.service_referentiel service_referentiel, + t.heures_compl_fi heures_compl_fi, + t.heures_compl_fa heures_compl_fa, + t.heures_compl_fc heures_compl_fc, + t.heures_compl_fc_majorees heures_compl_fc_majorees, + t.heures_compl_referentiel heures_compl_referentiel, + t.total total, + t.solde solde, + v.histo_modification date_cloture_realise + + FROM + t + JOIN intervenant i ON i.id = t.intervenant_id AND i.histo_destruction IS NULL + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN type_intervenant ti ON ti.id = si.type_intervenant_id + JOIN etablissement etab ON etab.id = t.etablissement_id + JOIN type_volume_horaire tvh ON tvh.id = t.type_volume_horaire_id + JOIN etat_volume_horaire evh ON evh.id = t.etat_volume_horaire_id + LEFT JOIN histo_intervenant_service his ON his.intervenant_id = i.id AND his.type_volume_horaire_id = tvh.id AND his.referentiel = 0 + LEFT JOIN grade g ON g.id = i.grade_id + LEFT JOIN discipline di ON di.id = i.discipline_id + LEFT JOIN structure saff ON saff.id = i.structure_id AND ti.code = 'P' + LEFT JOIN element_pedagogique ep ON ep.id = t.element_pedagogique_id + LEFT JOIN discipline de ON de.id = ep.discipline_id + LEFT JOIN structure sens ON sens.id = NVL(t.structure_ens_id, ep.structure_id) + LEFT JOIN periode p ON p.id = t.periode_id + LEFT JOIN source src ON src.id = ep.source_id OR (ep.source_id IS NULL AND src.code = 'OSE') + LEFT JOIN etape etp ON etp.id = ep.etape_id + LEFT JOIN type_formation tf ON tf.id = etp.type_formation_id AND tf.histo_destruction IS NULL + LEFT JOIN groupe_type_formation gtf ON gtf.id = tf.groupe_id AND gtf.histo_destruction IS NULL + LEFT JOIN v_formule_intervenant fi ON fi.intervenant_id = i.id + LEFT JOIN ponds ponds ON ponds.element_pedagogique_id = ep.id + LEFT JOIN fonction_referentiel fr ON fr.id = t.fonction_referentiel_id + LEFT JOIN type_validation tv ON tvh.code = 'REALISE' AND 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 + +/ + +CREATE OR REPLACE VIEW V_FORMULE_INTERVENANT AS +SELECT + i.id intervenant_id, + i.annee_id annee_id, + CASE WHEN ti.code = 'P' THEN i.structure_id ELSE NULL END structure_id, + ti.code type_intervenant_code, + si.service_statutaire heures_service_statutaire, + si.depassement_service_du_sans_hc depassement_service_du_sans_hc, + COALESCE( SUM( msd.heures * mms.multiplicateur ), 0 ) heures_service_modifie, + COALESCE( SUM( msd.heures * mms.multiplicateur * mms.decharge ), 0 ) heures_decharge +FROM + intervenant i + LEFT JOIN modification_service_du msd ON msd.intervenant_id = i.id AND msd.histo_destruction IS NULL + LEFT JOIN motif_modification_service mms ON mms.id = msd.motif_id + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN type_intervenant ti ON ti.id = si.type_intervenant_id +WHERE + i.histo_destruction IS NULL + AND i.id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, i.id ) +GROUP BY + i.id, i.annee_id, i.structure_id, ti.code, si.service_statutaire, si.depassement_service_du_sans_hc + +/ + +CREATE OR REPLACE VIEW V_FORMULE_VOLUME_HORAIRE AS + SELECT + to_number( 1 || vh.id ) id, + vh.id volume_horaire_id, + null volume_horaire_ref_id, + s.id service_id, + null service_referentiel_id, + s.intervenant_id intervenant_id, + ti.id type_intervention_id, + vh.type_volume_horaire_id type_volume_horaire_id, + vhe.etat_volume_horaire_id etat_volume_horaire_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, + ep.structure_id structure_id, + MAX(COALESCE( m.ponderation_service_du, 1)) ponderation_service_du, + MAX(COALESCE( m.ponderation_service_compl, 1)) ponderation_service_compl, + COALESCE(tf.service_statutaire,1) service_statutaire, + + vh.heures heures, + vh.horaire_debut horaire_debut, + vh.horaire_fin horaire_fin, + COALESCE(tis.taux_hetd_service,ti.taux_hetd_service,1) taux_service_du, + COALESCE(tis.taux_hetd_complementaire,ti.taux_hetd_complementaire,1) taux_service_compl + FROM + volume_horaire vh + JOIN service s ON s.id = vh.service_id + JOIN intervenant i ON i.id = s.intervenant_id + JOIN type_intervention ti ON ti.id = vh.type_intervention_id + JOIN v_volume_horaire_etat vhe ON vhe.volume_horaire_id = vh.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 + LEFT JOIN type_intervention_statut tis ON tis.type_intervention_id = ti.id AND tis.statut_intervenant_id = i.statut_id + WHERE + vh.histo_destruction IS NULL + AND s.histo_destruction IS NULL + AND vh.heures <> 0 + AND vh.motif_non_paiement_id IS NULL + AND s.intervenant_id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, s.intervenant_id ) + GROUP BY + vh.id, s.id, s.intervenant_id, ti.id, vh.type_volume_horaire_id, vhe.etat_volume_horaire_id, ep.id, + ep.taux_fi, ep.taux_fa, ep.taux_fc, ep.structure_id, tf.service_statutaire, vh.heures, + vh.horaire_debut, vh.horaire_fin, tis.taux_hetd_service, tis.taux_hetd_complementaire, + ti.taux_hetd_service, ti.taux_hetd_complementaire + + UNION ALL + + SELECT + to_number( 2 || vhr.id ) id, + null volume_horaire_id, + vhr.id volume_horaire_ref_id, + null service_id, + sr.id service_referentiel_id, + sr.intervenant_id intervenant_id, + null type_intervention_id, + vhr.type_volume_horaire_id type_volume_horaire_id, + evh.id etat_volume_horaire_id, + + 0 taux_fi, + 0 taux_fa, + 0 taux_fc, + sr.structure_id structure_id, + 1 ponderation_service_du, + 1 ponderation_service_compl, + COALESCE(fr.service_statutaire,1) service_statutaire, + + vhr.heures heures, + vhr.horaire_debut horaire_debut, + vhr.horaire_fin horaire_fin, + 1 taux_service_du, + 1 taux_service_compl + FROM + volume_horaire_ref vhr + JOIN service_referentiel sr ON sr.id = vhr.service_referentiel_id + JOIN v_volume_horaire_ref_etat vher ON vher.volume_horaire_ref_id = vhr.id + JOIN etat_volume_horaire evh ON evh.id = vher.etat_volume_horaire_id + JOIN fonction_referentiel fr ON fr.id = sr.fonction_id + WHERE + vhr.histo_destruction IS NULL + AND sr.histo_destruction IS NULL + AND vhr.heures <> 0 + AND sr.intervenant_id = COALESCE( OSE_FORMULE.GET_INTERVENANT_ID, sr.intervenant_id ) + + ORDER BY + horaire_fin, horaire_debut, volume_horaire_id, volume_horaire_ref_id + +/ + +CREATE OR REPLACE VIEW V_INDICATEUR_560 AS +SELECT + rownum id, + i.annee_id annee_id, + i.id intervenant_id, + i.structure_id structure_id, + si.maximum_hetd plafond, + fr.total heures +FROM + intervenant i + JOIN etat_volume_horaire evh ON evh.code = 'saisi' + JOIN formule_resultat fr ON fr.intervenant_id = i.id AND fr.etat_volume_horaire_id = evh.id + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN type_volume_horaire tvh ON tvh.id = fr.type_volume_horaire_id AND tvh.code= 'PREVU' +WHERE + fr.total - fr.heures_compl_fc_majorees > si.maximum_hetd + +/ + +CREATE OR REPLACE VIEW V_INDICATEUR_570 AS +SELECT + rownum id, + i.annee_id annee_id, + i.id intervenant_id, + i.structure_id structure_id, + si.maximum_hetd plafond, + fr.total heures +FROM + intervenant i + JOIN etat_volume_horaire evh ON evh.code = 'saisi' + JOIN formule_resultat fr ON fr.intervenant_id = i.id AND fr.etat_volume_horaire_id = evh.id + JOIN statut_intervenant si ON si.id = i.statut_id + JOIN type_volume_horaire tvh ON tvh.id = fr.type_volume_horaire_id AND tvh.code= 'REALISE' +WHERE + fr.total - fr.heures_compl_fc_majorees > si.maximum_hetd + +/ + +CREATE OR REPLACE VIEW V_TBL_CONTRAT AS + 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 + AND vh.motif_non_paiement_id IS NULL + + 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 + +/ + + + + +-- OseAdmin\Bdd\Ddl\DdlTrigger.alter. + +CREATE OR REPLACE TRIGGER "F_STATUT_INTERVENANT" + AFTER UPDATE OF + service_statutaire, + depassement, + type_intervenant_id, + non_autorise + ON STATUT_INTERVENANT + FOR EACH ROW +BEGIN return; /* Désactivation du trigger... */ + +IF NOT UNICAEN_TBL.ACTIV_TRIGGERS THEN RETURN; END IF; + +FOR p IN ( + + SELECT DISTINCT + fr.intervenant_id + FROM + intervenant i + JOIN formule_resultat fr ON fr.intervenant_id = i.id + WHERE + (i.statut_id = :NEW.id OR i.statut_id = :OLD.id) + AND i.histo_destruction IS NULL + + ) LOOP + + UNICAEN_TBL.DEMANDE_CALCUL('formule', UNICAEN_TBL.make_params('INTERVENANT_ID', p.intervenant_id) ); + +END LOOP; +END + + / + +CREATE OR REPLACE TRIGGER "INDIC_TRG_MODIF_DOSSIER" + AFTER INSERT OR UPDATE OF NOM_USUEL, NOM_PATRONYMIQUE, PRENOM, CIVILITE_ID, ADRESSE, RIB, DATE_NAISSANCE ON "DOSSIER" + + FOR EACH ROW + /** + * But : mettre à jour la liste des PJ attendues. + */ +DECLARE + i integer := 1; + intervenantId NUMERIC; + found integer; + estCreationDossier integer; + type array_t is table of varchar2(1024); + + attrNames array_t := array_t(); + attrOldVals array_t := array_t(); + attrNewVals array_t := array_t(); + + -- valeurs importées (format texte) : + impSourceName source.libelle%type; + impNomUsuel indic_modif_dossier.ATTR_NEW_VALUE%type; + impNomPatro indic_modif_dossier.ATTR_NEW_VALUE%type; + impPrenom indic_modif_dossier.ATTR_NEW_VALUE%type; + impCivilite indic_modif_dossier.ATTR_NEW_VALUE%type; + impDateNaiss indic_modif_dossier.ATTR_NEW_VALUE%type; + impAdresse indic_modif_dossier.ATTR_NEW_VALUE%type; + impRib indic_modif_dossier.ATTR_NEW_VALUE%type; + -- anciennes valeurs dans le dossier (format texte) : + oldSourceName source.libelle%type; + oldNomUsuel indic_modif_dossier.ATTR_NEW_VALUE%type; + oldNomPatro indic_modif_dossier.ATTR_NEW_VALUE%type; + oldPrenom indic_modif_dossier.ATTR_NEW_VALUE%type; + oldCivilite indic_modif_dossier.ATTR_NEW_VALUE%type; + oldDateNaiss indic_modif_dossier.ATTR_NEW_VALUE%type; + oldAdresse indic_modif_dossier.ATTR_NEW_VALUE%type; + oldRib indic_modif_dossier.ATTR_NEW_VALUE%type; + -- nouvelles valeurs dans le dossier (format texte) : + newSourceName source.libelle%type; + newNomUsuel indic_modif_dossier.ATTR_NEW_VALUE%type; + newNomPatro indic_modif_dossier.ATTR_NEW_VALUE%type; + newPrenom indic_modif_dossier.ATTR_NEW_VALUE%type; + newCivilite indic_modif_dossier.ATTR_NEW_VALUE%type; + newDateNaiss indic_modif_dossier.ATTR_NEW_VALUE%type; + newAdresse indic_modif_dossier.ATTR_NEW_VALUE%type; + newRib indic_modif_dossier.ATTR_NEW_VALUE%type; +BEGIN + -- + -- Témoin indiquant s'il s'agit d'une création de dossier (insert). + -- + estCreationDossier := case when inserting then 1 else 0 end; + + -- + -- Fetch source OSE. + -- + select s.libelle into newSourceName from source s where s.code = 'OSE'; + + -- + -- Fetch et formattage texte des valeurs importées. + -- + select + i.id, + s.libelle, + nvl(i.NOM_USUEL, '(Aucun)'), + nvl(i.NOM_PATRONYMIQUE, '(Aucun)'), + nvl(i.PRENOM, '(Aucun)'), + nvl(c.libelle_court, '(Aucune)'), + nvl(to_char(i.DATE_NAISSANCE, 'DD/MM/YYYY'), '(Aucune)'), + nvl(ose_divers.formatted_rib(i.bic, i.iban), '(Aucun)'), + case when a.id is not null + then ose_divers.formatted_adresse(a.NO_VOIE, a.NOM_VOIE, a.BATIMENT, a.MENTION_COMPLEMENTAIRE, a.LOCALITE, a.CODE_POSTAL, a.VILLE, a.PAYS_LIBELLE) + else '(Aucune)' + end + into + intervenantId, + oldSourceName, + impNomUsuel, + impNomPatro, + impPrenom, + impCivilite, + impDateNaiss, + impRib, + impAdresse + from intervenant i + join source s on s.id = i.source_id + left join civilite c on c.id = i.civilite_id + left join adresse_intervenant a on a.intervenant_id = i.id AND a.histo_destruction IS NULL + where i.id = :NEW.intervenant_id; + + -- + -- Anciennes valeurs dans le cas d'une création de dossier : ce sont les valeurs importées. + -- + if (1 = estCreationDossier) then + --dbms_output.put_line('inserting'); + oldNomUsuel := impNomUsuel; + oldNomPatro := impNomPatro; + oldPrenom := impPrenom; + oldCivilite := impCivilite; + oldDateNaiss := impDateNaiss; + oldAdresse := impAdresse; + oldRib := impRib; + -- + -- Anciennes valeurs dans le cas d'une mise à jour du dossier. + -- + else + --dbms_output.put_line('updating'); + oldNomUsuel := trim(:OLD.NOM_USUEL); + oldNomPatro := trim(:OLD.NOM_PATRONYMIQUE); + oldPrenom := trim(:OLD.PRENOM); + oldDateNaiss := case when :OLD.DATE_NAISSANCE is null then '(Aucune)' else to_char(:OLD.DATE_NAISSANCE, 'DD/MM/YYYY') end; + oldAdresse := trim(:OLD.ADRESSE); + oldRib := trim(:OLD.RIB); + if :OLD.CIVILITE_ID is not null then + select c.libelle_court into oldCivilite from civilite c where c.id = :OLD.CIVILITE_ID; + else + oldCivilite := '(Aucune)'; + end if; + select s.libelle into oldSourceName from source s where s.code = 'OSE'; + end if; + + -- + -- Nouvelles valeurs saisies. + -- + newNomUsuel := trim(:NEW.NOM_USUEL); + newNomPatro := trim(:NEW.NOM_PATRONYMIQUE); + newPrenom := trim(:NEW.PRENOM); + newDateNaiss := case when :NEW.DATE_NAISSANCE is null then '(Aucune)' else to_char(:NEW.DATE_NAISSANCE, 'DD/MM/YYYY') end; + newAdresse := trim(:NEW.ADRESSE); + newRib := trim(:NEW.RIB); + if :NEW.CIVILITE_ID is not null then + select c.libelle_court into newCivilite from civilite c where c.id = :NEW.CIVILITE_ID; + else + newCivilite := '(Aucune)'; + end if; + + -- + -- Détection des différences. + -- + if newNomUsuel <> oldNomUsuel then + --dbms_output.put_line('NOM_USUEL ' || sourceLib || ' = ' || oldNomUsuel || ' --> NOM_USUEL OSE = ' || :NEW.NOM_USUEL); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Nom usuel'; + attrOldVals(i) := oldNomUsuel; + attrNewVals(i) := newNomUsuel; + i := i + 1; + end if; + if newNomPatro <> oldNomPatro then + --dbms_output.put_line('NOM_PATRONYMIQUE ' || sourceLib || ' = ' || oldNomPatro || ' --> NOM_PATRONYMIQUE OSE = ' || :NEW.NOM_PATRONYMIQUE); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Nom de naissance'; + attrOldVals(i) := oldNomPatro; + attrNewVals(i) := newNomPatro; + i := i + 1; + end if; + if newPrenom <> oldPrenom then + --dbms_output.put_line('PRENOM ' || sourceLib || ' = ' || oldPrenom || ' --> PRENOM OSE = ' || :NEW.PRENOM); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Prénom'; + attrOldVals(i) := oldPrenom; + attrNewVals(i) := newPrenom; + i := i + 1; + end if; + if newCivilite <> oldCivilite then + --dbms_output.put_line('CIVILITE_ID ' || sourceLib || ' = ' || oldCivilite || ' --> CIVILITE_ID OSE = ' || :NEW.CIVILITE_ID); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Civilité'; + attrOldVals(i) := oldCivilite; + attrNewVals(i) := newCivilite; + i := i + 1; + end if; + if newDateNaiss <> oldDateNaiss then + --dbms_output.put_line('DATE_NAISSANCE ' || sourceLib || ' = ' || oldDateNaiss || ' --> DATE_NAISSANCE OSE = ' || :NEW.DATE_NAISSANCE); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Date de naissance'; + attrOldVals(i) := oldDateNaiss; + attrNewVals(i) := newDateNaiss; + i := i + 1; + end if; + if newAdresse <> oldAdresse then + --dbms_output.put_line('ADRESSE ' || sourceLib || ' = ' || oldAdresse || ' --> ADRESSE OSE = ' || :NEW.ADRESSE); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'Adresse postale'; + attrOldVals(i) := oldAdresse; + attrNewVals(i) := newAdresse; + i := i + 1; + end if; + if oldRib is null or newRib <> oldRib then + --dbms_output.put_line('RIB ' || sourceLib || ' = ' || oldRib || ' --> RIB OSE = ' || :NEW.RIB); + attrNames.extend(1); + attrOldVals.extend(1); + attrNewVals.extend(1); + attrNames(i) := 'RIB'; + attrOldVals(i) := oldRib; + attrNewVals(i) := newRib; + i := i + 1; + end if; + + -- + -- Enregistrement des différences. + -- + for i in 1 .. attrNames.count loop + --dbms_output.put_line(attrNames(i) || ' ' || oldSourceName || ' = ' || attrOldVals(i) || ' --> ' || attrNames(i) || ' ' || newSourceName || ' = ' || attrNewVals(i)); + + -- vérification que la même modif n'est pas déjà consignée + select count(*) into found from indic_modif_dossier + where INTERVENANT_ID = intervenantId + and ATTR_NAME = attrNames(i) + and ATTR_OLD_VALUE = to_char(attrOldVals(i)) + and ATTR_NEW_VALUE = to_char(attrNewVals(i)); + if found > 0 then + continue; + end if; + + insert into INDIC_MODIF_DOSSIER( + id, + INTERVENANT_ID, + ATTR_NAME, + ATTR_OLD_SOURCE_NAME, + ATTR_OLD_VALUE, + ATTR_NEW_SOURCE_NAME, + ATTR_NEW_VALUE, + EST_CREATION_DOSSIER, -- témoin indiquant s'il s'agit d'une création ou d'une modification de dossier + HISTO_CREATION, -- NB: date de modification du dossier + HISTO_CREATEUR_ID, -- NB: auteur de la modification du dossier + HISTO_MODIFICATION, + HISTO_MODIFICATEUR_ID + ) + values ( + indic_modif_dossier_id_seq.nextval, + intervenantId, + attrNames(i), + oldSourceName, + to_char(attrOldVals(i)), + newSourceName, + to_char(attrNewVals(i)), + estCreationDossier, + :NEW.HISTO_MODIFICATION, + :NEW.HISTO_MODIFICATEUR_ID, + :NEW.HISTO_MODIFICATION, + :NEW.HISTO_MODIFICATEUR_ID + ); + end loop; + +END + + /