Skip to content

Instantly share code, notes, and snippets.

@ernest33
Forked from Benoitlecorre/algo_apb_proper.sql
Created October 18, 2016 11:28
Show Gist options
  • Save ernest33/9a0cc626e1f59602ba87d035d9845c6f to your computer and use it in GitHub Desktop.
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
-- 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