Skip to content

Instantly share code, notes, and snippets.

@Rudloff
Forked from Benoitlecorre/algo_apb_proper.sql
Last active October 18, 2016 12:11
Show Gist options
  • Save Rudloff/f4c0ad16604fe481d9089652657d2ed5 to your computer and use it in GitHub Desktop.
Save Rudloff/f4c0ad16604fe481d9089652657d2ed5 to your computer and use it in GitHub Desktop.
Code source d'Admission post-bac envoyé par le ministère de l'Education nationale
-- Génération automatique de classements aléatoires en production, pour les FNS
-- ===================================
FUNCTION gen_class_aiea_v1_relatif_grp( o_g_ea_cod_ins IN VARCHAR2,
o_g_ti_cod IN NUMBER,
o_c_gp_cod IN NUMBER,
o_g_tg_cod IN NUMBER,
iogin IN VARCHAR2,
type_login IN NUMBER,
mode_dev IN NUMBER,
confirm IN NUMBER,
saio IN NUMBER,
nip IN VARCHAR2,
indic IN NUMBER,
mess_err OUT VARCHAR2,
mess_aff OUT VARCHAR2)
RETURN NUMBER
IS
retour NUMBER;
x VARCHAR2(2);
dummy NUMBER;
dummy2 NUMBER;
l_c_gp_fig_sei c_grp.c_gp_flg_sel%TYPE;
l_g_tg_cod c_grp.g_tg_cod%TYPE;
i_c_gp_eta_cla c_grp.c_gp_eta_cla%TYPE;
i_g_flh_sel sp_g_tri_ins.g_flh_sel%TYPE;
l_g_fr_reg_for g_for.g_fr_reg_fo r%TYPE;
i_g_ea_cod_ges g_tri_ins.g_ea_cod_ges%TYPE;
l_c_ja_cod c_jur_adm.c_ja_cod%TYPE;
l_c_tj_cod c_jur_adm.c_tj_cod%typ e;
i NUMBER;
is_prod NUMBER;
l_six_voe NUMBER;
unique_constraint EXCEPTION;
PRAGMA EXCEPTION_INIT (unique_constraint, -00001);
-- classement aléatoire sur voeu 1 groupé relatif
CURSOR classement_aleatoire_efe IS
-- on traite d'abord les candidats AEFE s'il y en a
SELECT c.g_cn_cod,
a_ve_ord_vg_rel, -- Ordre du voeu avec voeux groupés relatifs Hcence
a_ve_ord_aff, -- Ordre du voeu avec voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
dbms_random.value(1, 999999),
i.i_ep_cod
FROM g_can c,
i_ins i,
a_rec r,
a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND nvl(g_cn_flg_aefe, o)=1 -- Bac EFE
AND i_ep_cod IN (2,
3) -- Pointés recu (complet ou incomplet)
AND i.i_is_val=1
-- non encore classé
AND NOT EXISTS
(
SELECT 1
FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,
5) ) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-- les candidats EFE qui n'ont au final pas classé la formation dans leur Iiste ordonnée. lls sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
dbms_random.value(1, 999999),
i.i_ep_cod
FROM g_can c,
i_ins i,
a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND nvl(g_cn_flg_aefe, o)=1 -- Bac EFE
AND i_ep_cod IN (2,
3) -- Pointés recu (complet ou incomplet)
AND i.i_is_val=1
-- non encore classé
AND NOT EXISTS
(
SELECT 1
FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,
5)) -- Permet de récupérer les AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS
(
SELECT 1
FROM a_voe v
WHERE c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2,
3,
4,
5;
CURSOR class_aleatoire_autres_cddts IS
-- les candidats non classés par la requéte ci-dessus : les autre bac que EEE
SELECT c.g_cn_cod,
decode(l_six_voe,
1, six_voeu_l1(c.g_cn_cod, g_aa_cod_bac_int, g_cn_flg_int_aca, o_g_tg_cod),
o),
a_ve_ord_vg_rel, -- Ordre du voeu avec voeux groupés relatifs licence
a_ve_ord_aff, -- Ordre du voeu avec voeux groupé relatif licence et tous les autres voeux
a_vg_ord, -- Ordre du sous-voeu dans le voeu groupé
dbms_random.vaiue(1, 999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du dipléme
FROM g_can c,
i_ins i,
a_rec r,
a_voe v
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2,
3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
-- TODo2016 => Traiter les groupes néo-réeo ensemble différement (voir correction_classements_neo-reo.sqI dans exploit/admissions/simulation/pb ponctuels)
AND c.g_ic_cod > 0
AND i.i_is_val=1
-- non encore classé
AND NOT EXISTS
(
SELECT 1
FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,
5)) -- permet de récupérer les ac
AND i.g_ti_cod=r.g_ti_cod
AND c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod
UNION
-- les candidats qui n'ont au final pas classé la formation dans leur liste ordonnée. lls sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
0,
dbms_random.value(1, 999999),
i.i_ep_cod,
i.i_is_dip_val -- Pour ceux-ci on prend en plus en compte la validité du diplome
FROM g_can c,
i_ins i,
a_rec r
WHERE i.g_ti_cod=o_g_ti_cod
AND i.g_gf_cod=o_c_gp_cod
AND i_ep_cod IN (2,
3) -- Pointés recu (complet ou incomplet)
AND i.g_cn_cod=c.g_cn_cod
AND c.g_ic_cod > 0
AND i.i_is_val=1
-- non encore classé
AND NOT EXISTS
(
SELECT 1
FROM c_can_grp
WHERE i.g_cn_cod=g_cn_cod
AND i.g_gf_cod=c_gp_cod
AND i_ip_cod IN (4,
5)) -- Permet de récupérer Ies AC
AND i.g_ti_cod=r.g_ti_cod
AND NOT EXISTS
(
SELECT 1
FROM a_voe v
WHERE c.g_cn_cod=v.g_cn_cod
AND r.g_ta_cod=v.g_ta_cod)
ORDER BY 2 DESC,
3,
4,
5,
6;
BEGIN
-- par défaut, on est pas en prod
is_prod:=o;
-- On vérifie que si on force un classement, on n'est pas en base de prod
x:='01';
BEGIN
SELECT DISTINCT 1
INTO dummy
FROM all_catalog i
WHERE owner IN ('XXXXXX');
-- on est en prod
is_prod:=1;
-- on ne laisse passer qu'en indic = 10
IF Nvl(indic, 0) NOT IN (10) THEN
mess_aff:='On ne peut forcer un classement sur la base d''exploitation.';
ROLLBACK;
RETURN 1;
END IF;
EXCEPTION
WHEN no_data_found THEN
NULL;
END;
mess_aff:= 'problème d"acces aux données, veuillez vous reconnecter ultérieurement.'; -- On vérifie si le groupe est issu d'une formation de type IDF 2, 3, 5 cu 6 et 5'” concerné par des néo d'lDF alors, on utilisera les six voeux dans le classement sur ordre des voeux
BEGIN
x:='02';
SELECT 1
INTO i_six_voe
FROM g_tri_ins ti
WHERE g_ti_cod=o_g_ti_cod
AND nvl(g_ti_flg_rec_idf, 0) IN (2,
3,
5,
6)
AND o_g_tg_cod IN (21,
25,
26,
41,
45,
46);
EXCEPTION
WHEN no_data_found THEN
i_six_voe:=0; -- pour les autres groupes, on n'utilise pas les 6 voeux
END;
x:='O3'; -- on vérifie que Ie classement ne soit pas déjé passé (pas de candidats classés dans c_can_grp)
BEGIN -- Si le groupe est non sélectif, aucun candidat ne doit avoir été traité
SELECT DISTINCT 1
INTO dummy
FROM c_can_grp cg,
c_grp 3
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND nvl(c_gp_fig_sei,o)=o
UNION -- Si le groupe est sélecif ou é pré-requis, on peut avoir des candidats NC ou AC
SELECT DISTINCT 1
FROM c_can_grp cg,
c_grp 3
WHERE g.c_gp_cod=0_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod i
AND nvl(c_gp_fig_sel, o) IN (1,
6);
mess_aff:='Un classement a déjé été saisi pour le groupe de cette formation'
|| lo_g_ea_cod_ins
||', '
|| o_g_ti_cod
|| ', '
|| o_c_gp_cod;
ROLLBACK;
RETURN 1;
EXCEPTION
WHEN no_data_found THEN
NULL; -- ok
END; -- c'est ok, on va générer. On commence par récupérer des infos en base
BEGIN
x:='04';
SELECT g_tg_cod,
c_gp_flg_sel,
g_ea_cod_ges,
ja.c_ja_cod,
c_tj_cod,
nvl(g_ti_fih_sei, g_fr_flg_sel),
c_gp_eta_cla
INTO i_g_tg_cod,
l_c_gp_flg_sel,
i_g_ea_cod_ges,
l_c_ja_cod,
i_c_tj_cod,
l_g_flh_sel,
l_c_gp_eta_cla
FROM g_for fr,
g_tri_ins ti,
c_jur_adm ja,
c_grp gp
WHERE ti.g_ti_cod=o_g_ti_cod
AND ti.g_fr_cod_ins=fr.g_fr_cod
AND ti.g_ti_cod=ja.g_ti_cod
AND ja.c_ja_cod=gp.c_ja_cod
AND gp.c_gp_cod=o_c_gp_cod;
EXCEPTION
WHEN no_data_found THEN
mess_aff:='Erreur de traitement, la ligne groupe n"existe pas : c_gp_cod'
||o_c_gp_cod;
ROLLBACK;
RETURN 1;
END; -- on vérifie les conditions de traitement du groupe
IF is_prod=o -- Base detect
OR -- Ou -- en prod pour les classements formation non sélectives ou les AEFE
(
is_prod=1
AND
indic=10
AND
i_g_flh_sel=0
)
THEN
NULL; -- on laisse passer. Dans tous les autre cas, c'est une erreur.
ELSE
mess_aff:='On ne peut traiter ce type de classement aléatoire dans ces conditions: Is_prod : '
||is_prod
||', indic : '
||indic
||'Flag Sel : '
||l_c_gp__flg_sel;
ROLLBACK;
RETURN 1;
END IF;
-- on vérifie l'état de pointage des dossiers si on est en prod, on est obligé d'accepter des dossiers non reçus, pour les vérifs de diplomes
x:='05';
SELECT count(*)
INTO dummy i
FROM i_ins i wh ere g_ti_cod=o_g_ti_cod
AND g_gf_cod=o_c_gp_cod
AND i_is_val=1
AND i_ep_cod NOT IN (0,
2,
3,
7);
IF dummy > 0 THEN
mess_aff:='Pb, des dossiers ne sont pas pointés : étab : '
||o_g_ea_cod_ins
||', for :'
||o_g_ti_cod
||', grp : '
||o_c_gp_cod;
ROLLBACK;
RETURN 1;
endif;
I:=1;
x:='61';
FOR c_rec IN classement_aleatoire_efe
LOOP
BEGIN
INSERT INTO c_can_grp g_cn_cod,
c_gp_cod,
i_ip_cod,
c_cg_ran) VALUES c_rec.g_cn_cod, o_c_gp_cod, 5, i);
EXCEPTION -- Si le candidat est déjé indiqué é classer, on met é jour Ie i_ip_cod et Ie rang sur la Iigne existante
WHEN unique_constraint THEN
x:='O7';
UPDATE c_can_grp
SET i_ip_cod=5,
c_cg_ran=i
WHERE g_cn_cod=c_rec.g_cn_cod
AND c_gp_cod=o_c_gp_cod
AND i_ip_cod=6;
IF SQL%rowcount!=1 THEN
mess_err:='pk_generation_classement.gen_class_aIea_V1_relatif_grp X:('iixii')'
||'Erreur traitement d''un candidat AC pour I''étab'
|| o_g_ea_cod_ins
||' et la formation '
||o_g_ti_cod
||': '
||o_c_gp_cod
||', le candidat '
||c_rec.g_cn_cod
||' et le groupe : '
||o_c_gp_cod
||', rg : '
||i;
ROLLBACK;
RETURN -1;
endif;
END;
I:=i+1;
END LOOP;
x:='08';
FOR c_rec IN class_aleatoire_autres_cddts
LOOP -- dipléme non validé => non classéIF c_rec.i_is_dip_val=1 then
BEGIN
INSERT INTO c_can_grp
(
1 g_cn_cod,
c_gp__cod,
i_ip_cod,
c_cg_ra n
)
VALUES
(
c_rec.g_cn_cod,
o_c_gp_cod,
NULL
);
EXCEPTION -- Si le candidat est déjé non classé, on ne met a jour
WHEN unique_constraint THEN
NULL;
END;
ELSE
BEGIN
x:='09';
INSERT INTO c_can_grp g_cn_cod,
c_gp_cod,
i_ip_cod,
c_cg_ran) VALUES( c_rec.g_cn_cod, o_c_gp_cod, 5, i);
EXCEPTION -- Si le candidat est déjé é classer, on ne met é jour
WHEN unique_constraint THEN
x:='10';
UPDATE c_ca n_grp
SET i_ip_cod=5,
c_cg_ran=i
WHERE g_cn_cod=c_rec.g_cn_cod
AND c_gp_cod=o_c_gp_cod
AND i_ip_cod=6;
IF SQL%rowcount!=1 THEN
mess_err:='pk_generation_classement.gen_class_alea_V1_relatif_grp X : ('
|| x
||')'
||'Erreur traitement d"un candidat AC pour l"étab'
|| o_g_ea_cod_ins
||' et la formation '
|| o_g_ti_cod
||': '
|| o_c_gp_cod
|| ', le candidat '
|| c_rec.g_cn_cod
|| ' et le groupe : '
|| o_c_gp_cod
|| ', rg : '
||i;
ROLLBACK;
RETURN ~1;
endif;
END;
I:=i+1;
endif;
END LOOP;
-- le classement est marqué terminé
x:='11';
retour:=pk_new_classement_commun.Maj_etat_classement( l_g_ea_cod_ges, o__g_ea_cod_ins, o_g_ti_cod, i_c_ja_cod, l_c_tj_cod, o_c_gp_cod, 2, 5, login, type_login, mode_dev, confirm, saio, nip, 0, indic, mess_err, mess_aff);
IF retour!=0 THEN
ROLLBACK;
RETURN retour;
endif;
-- On vérifie que le classement soit valide. la Trace est mise par cette PS
x:='12';
retour:=pk_new_classement_commun.Valid_classement_def( i_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod, i_c_ja_cod, l_c_tj_cod, o_c_gp_cod, 5, login, type_login, mode_dev, confirm, saio, nip, 0, indie, mess_err, mess_aff);
IF retour!=0 THEN
ROLLBACK;
RETURN retour;
endif;
x:='13';
retour:=pk_new_classement_commun.Valid_classement__formation( l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod, 5, login, type_login, mode_dev, confirm, saio, nip, 0, indic, mess_err, mess_aff);
IF retour!=0 THEN
ROLLBACK;
RETURN retour;
endif;
-- on indique que Ie classement est fait de maniére automatique
-- et on gére le cas particulier des AC/NC eta__cla passe de 3 a 4X:='14';UPDATE c_grp
SET c_gp_fig_cia_oto=1, c_gp_eta_cla=decode(i_c_gp_eta_cia,
3,
4,
c_gp_eta_cla) WHERE c_gp_cod=o_c__gp_cod
AND
c_gp_eta_cla=2;
COMMIT;
RETURN 0;
EXCEPTION
WHEN OTHERS thenmess_err:='pk_generation_classement.gen_class_aIea_V1_reIatif_grp X : ('
|| x
|| ')'
||'Erreur ORACLE '
||to_char(SQLCODE)
||' '
||SQLERRM
||' pour l"étab'
|| o_g_ea_cod_ins
||' et la formation '
||o_g_ti_cod
||': '
||o_c_gp_cod;
ROLLBACK;
RETURN -9;
END gen_class_alea_v1_reiatif_grp;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment