-
-
Save ernest33/9a0cc626e1f59602ba87d035d9845c6f to your computer and use it in GitHub Desktop.
Code source d'Admission post-bac envoyé par le ministère de l'Education nationale
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- 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