Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jeantil
Last active May 26, 2020 20:37
Show Gist options
  • Star 24 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save jeantil/1a7c32d87524a2774da3cf80f4c62e50 to your computer and use it in GitHub Desktop.
Save jeantil/1a7c32d87524a2774da3cf80f4c62e50 to your computer and use it in GitHub Desktop.
Code source d’Admission post-bac
--
-- le code ci-dessous a a été fortement amélioré par un effor collaboratif sur
-- https://github.com/jeantil/admission_post_bac
-- Pull requests, issues et contributions wiki sont les bienvenues.
-- Une partie du code a été rétro analysé a partir de diverses sources cf https://github.com/jeantil/admission_post_bac/wiki
--
FUNCTION gen class alea 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,
login 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_flg_sel c_grp.c_gp_flg_sel%TYPE;
l_g_tg_cod c_grp.g_tg_cod%TYPE;
l_c_gp_eta_cla c_grp.c_gp_eta_cla%TYPE;
l_g_flh_sel sp_g_tri_ins.g_flh_sel%TYPE;
l_g_fr_reg_for g_for.g_fr_reg_for%TYPE;
l_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%TYPE;
i NUMBER;
IS_prod NUMBER;
l_six_voe NUMBER;
UNIOUE CONSTRAINT EXCEPTION;
PRAGMA EXCEPTION_INIT (UNIOUE_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 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.value(1,999999),
i.iep_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, 0)=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 liste ordonnée. Ils sont classé, mais en dernier.
SELECT c.g_cn_cod,
0,
0,
0,
DBMS RANDOM.value(1,999999),
i.iep_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, 0)=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é
-- 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), 0),
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.value(1999999),
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.sql 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. Ils 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 diplôme
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 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 desc, 3, 4, 5, 6;
BEGIN
-- par défaut, on est pas en prod
IS prod:=0;
-- 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
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''accès 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 ou 6 et s''il concerné par des néO d''IDF
-- alors, on utilisera les six voeux dans le classement sur ordre des voeux
BEGIN
Х:="02";
SELECT 1
INTO l_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_tig_cod IN (21, 25, 26, 41, 45,46);
EXCEPTION
WHEN NO DATA FOUND
THEN l_six_voe:=0; -- pour les autres groupes, on n'utilise pas les 6 voeux
END;
X:='03';
-- on vérifie que le 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 g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0)=0
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 g
WHERE g.c_gp_cod=o_c_gp_cod
AND g.c_gp_cod=cg.c_gp_cod
AND NVL(c_gp_flg_sel, 0) IN (1,2)
AND i_ip_cod NOT IN (4, 6);
mess_aff='Un classement a déjà été saisi pour le groupe de cette formation :'
|| o_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_flh_sel, g_fr_flg_sel), c.gp_eta_cla
INTO l_g_tg_cod, l_c_gp_flg_sel,
l_g_ea_cod_ges, l_c_ja_cod, l_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=0 -- Base de test
OR -- Ou
-- en prod pour les classements formation non sélectives ou les AEFE
(IS prod=1 AND indic=10 AND l_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 :
'||
'ls_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 sion est en prod, on est obligé d'accepter
-- des dossiers non reçus, pour les vérifs de diplômes
X:='05';
SELECT COUNT(*) INTO dummy
FROM i_ins i
WHERE 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;
END IF;
I:=1;
X:='61';
FOR c_rec IN classement_aleatoire_efe
LOOP BEGIN
INSERT INTO c_can_grp (
g Cn Cod, C. gp_Cod,
iip Cod, C CE 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 le i_ip_cod et le rang sur la ligne existante
WHEN UNIOUE_CONSTRAINT
THEN X:='07';
UPDATE c can grp
SET i_ip Cod=5,
C Cg ran=i
WHEREg Cn cod=c rec.g. cn cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%ROWCOUNT!=1
THEN mess err:='pk_generation_classement.gen_class_alea_V1_relatif_grp
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;
END IF;
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 (
g_cn_cod, c_gp_cod,
i_ip_cod, c_cg_ran)
VALUES ( c_rec.g_cn_cod, o_c_gp_cod,4,NULL );
EXCEPTION -- Si le candidat est déjà non classé, on ne met à jour
WHEN UNIOUE_CONSTRAINT
THEN NULL;
END;
ELSE
BEGIN
Х:='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 UNIOUE_CONSTRAINT
THEN X:='10';
UPDATE c_can_grp
SET iip Cod=5,
C Cg ran=i
WHEREg_Cn Cod=c rec.g. cn Cod
AND C gp Cod=O C. gp Cod
AND iip cod=6;
IF SOL%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;
END IF;
END;
i:=i+1;
END IF;
END LOOP;
-- le classement est marqué terminé
Х:='11';
retour:=pk_new_classement_commun.MAJ_etat_classement(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
2, 5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- 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(
l_g_ea_cod_ges, o_g_ea_cod_ins, o_g_ti_cod,
l_c_ja_cod, l_c_tj_cod, o_c_gp_cod,
5,
login, type_login, mode_dev,
confirm, saio,niр,
0, indic,
mess err, mess aff);
IF retourl!=0
THEN ROLLBACK;
RETURN retour;
END IF;
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,niр,
0, indic,
mess err, mess aff);
IF retour!=0
THEN ROLLBACK;
RETURN retour;
END IF;
-- on indique que le classement est fait de manière automatique
-- et on gère le cas particulier des AC/NC eta_cla passe de 3 à 4
X:='14';
UPDATE c_grp SET c_gp_flg_cla_oto=1,
c_gp_eta_cla=DECODE(l_c_gp_eta_cla, 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
THEN mess err:='pk generation classement.gen class alea V1 relatif grp X: ('||X||')'
||'Erreur ORACLE'||TO_CHAR(sqlcode)||''||sqlerrm||' pour l''étab'
||o_g_ea_cod_ins||' et la formation'|| og ti Cod||': '||o_c_gp_cod;
ROLLBACK;
RETURN -9;
END gen_class_alea_V1_relatif_grp;
@jeantil
Copy link
Author

jeantil commented Oct 19, 2016

Depuis le code a trouvé une nouvelle maison permettant la collaboration a plusieurs
=> https://github.com/jeantil/admission_post_bac

@vbillet
Copy link

vbillet commented Oct 20, 2016

Sur l'aspect Random, je suis un peu sceptique, les données changent chaque années, alors conserver ou pas la même graine aléatoire, revient un peut au même.
Mais il y a plusieurs choses qui m'interpellent :
1 - Tout d'abord ce code est incomplet. Lorsque l'on livre du code traitant une base de données, il faut livrer sa structure ! Je me vois mal livrer un code SQL chez un client, sans la structure de données (ET avec la doc bien sûr^^) ! Je risquerais fort de me faire jeter, et ce serait tout à fait normal !!!
ex :
FROM g_can c, i_ins i, a_rec r, a_voe v A quoi correspondent ces tables, quelles sont leurs champs ?
2 - De plus, le code ne permet pas de savoir à quoi correspondent certaines constantes comme :
AND NVL(g_ti_flg_rec_idf, 0) IN (2, 3, 5, 6) AND o_g_tig_cod IN (21, 25, 26, 41, 45,46);
Ha ! L'utilisation des nombres magiques, histoire de dire cherchez toujours vous ne trouverez pas ! Sans la correspondance avec les écrans de saisies destinés aux étudiants, ce code source est incomplet. Ou alors, il faut aussi livrer le code source des écrans de saisie !
Ca représente quoi le 21, le 25, le 26, le 41, le 45, le 46, etc... ???? C'est quoi les autres ?
3 - le code ci dessous semble indiquer qu'il y a certaines conditions d'utilisation de l'algorithme qui font que le classement n'est pas aléatoire. Comment sont réglés ces paramètres ? Les utilisateurs de ce bout de code auraient-ils les moyens de By-Passer certaines fonctionnalités revendiquées par l'éducation nationale ?
mess_aff='On ne peut traiter ce type de classement aléatoire dans ces conditions : '|| 'ls_prod : ' || IS_prod || ', indic : ' || indic || 'Flag Sel : '|| l_c_gp_flg_sel;
En tout cas cette procédure possède plusieurs modes de fonctionnement, ça c'est sûr !
4 - Ce code source met à jour des tables ... Certes, mais quelles sont les procédures d'exploitation des données derrières? Y a-t-il un certain niveau d'accréditation qui permettrait de modifier ces données? Ou encore, une visibilité au delà de la capacité d'accueil des établissement, permettant au corps enseignant d'avoir une marge de manœuvre notamment dans les cas de désistements?
5 - Je cherche pas plus loin, j'aurais un ingé qui me livrerai ça, il le sentirai passer !

En conclusion...
Cette livraison de code source par l'éducation nationale est un GROS FOUTAGE DE GUEULE !

PS : A noter que le code source Python livré dans "comprendre apb", ne correspond pas aux champs de cette procédure SQL ! Rien à voir !

@LuxNegra
Copy link

1 - Tout d'abord ce code est incomplet. Lorsque l'on livre du code traitant une base de données, il faut livrer sa structure ! Je me vois mal livrer un code SQL chez un client, sans la structure de données (ET avec la doc bien sûr^^) ! Je risquerais fort de me faire jeter, et ce serait tout à fait normal !!!

Pour répondre à ce commentaire je pense qu'ils ont envoyé le minimum syndical pour montrer qu'ils le font mais le simple fait de l'envoyer comme ça en pdf sans aucune doc technique ou info complémentaire montre clairement qu'ils le faisaient pas avec plaisir et que plus ils pouvaient mettre des bâtons dans les roues plus ils le feraient.

Ensuite j'ai pas tout lu en détail, mais j'ai surtout lu les commentaires du code, en particulier les acronymes. Pour la notification NC, ils parlent sûrement de la Nouvelle Calédonie, tandis que les IDF 2, 3, 5 ou 6 (ligne 177) désigne l'Ile de France, et les chiffres soit la répartition géographique pour que les choix ne soient pas éloignés de l'établissement initial ou une certaine "case sociale" si ce sont des formations avec des profils particuliers, ou des formations spécifiques qui ne se trouvent pas partout.

Pour les néo-réeo, ce sont les candidats qui sont réorientés depuis l'année en cours, et les réOrientés ceux qui le sont depuis plusieurs années. Et il est clairement dans la politique de l'éducation nationale de prioriser les bacheliers et de faire passer après les réorientés.

Par contre vu qu'ils indiquent un TODO2016, il y a des possibilités que ce bout d'algorithme ne soit pas la dernière version, ou alors ils ont oublié de retirer les commentaires ...

@jeantil
Copy link
Author

jeantil commented Oct 20, 2016

le code ci-dessus est obsolete, il a trouvé une nouvelle maison permettant la collaboration a plusieurs
=> https://github.com/jeantil/admission_post_bac

Un gros travail de rétro ingénierie a déjà été fait je vous invite a lire les discussions dans https://github.com/jeantil/admission_post_bac/issues

@yhamadi75
Copy link

Bonjour,
Est ce que quelqu'un peut confirmer que le code ci-dessus s'execute avec en paramètre une formation donnée? (Voir variables *flh_sel)

Si oui, y à t'il le code appelant? Dans quel ordre les formations (en tension) sont elles traitées?

Cdlt.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment