-
-
Save Benoitlecorre/30b76f7fda430d4a06063a7cfc5e3844 to your computer and use it in GitHub Desktop.
-- 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; |
pour qu'on puisse collaborer plus facilement
https://github.com/jeantil/admission_post_bac
Il y a aussi le IS_PROD:=o
qui devrait être IS_PROD:=0
https://gist.github.com/Benoitlecorre/30b76f7fda430d4a06063a7cfc5e3844#file-algo_apb_proper-sql-L162
Y'a vraiment des gens qui sont payes pour ecrire ce genre de truc? J'ose esperer que ce PLSQL a ete auto genere par un process tiers, parce que si les mecs ont vraiment code ca avec ce genre de nommage de variable c'est a se flinguer.
Horrible à lire, Good Luck & Have Fun pour décrypter ce bordel.
Et le code applicatif, il est où ? C'est bien gentil de filer des requêtes SQL au pif comme ça... Mais qui dit lesquelles sont utilisées et à quel moment ?
+1 @charlycoste
C'est vraiment une horreur à lire sinon. Je vois pas comment quelqu'un aurait pu écrire ça comme ça par défaut. Peut être qu'un process d’offuscation a été utilisé derrière. Bon courage à ceux qui tentent de le décoder ce machin. :)
@nnorm : "obfuscation".
Bien que le code soit illisible il ne semble pas avoir été retraité parce que les commentaires sont insérés un peut partout, c'est peut-être un code généré une première fois avec un outil puis repris à la main par le dev.
C'est dommage de confier une partie de son cursus scolaire à du code aussi moche ^^
@charlycoste cet algorithme provient de l'éducation nationale qui l'a communiqué à une association de lycéens qui en avait fait la demande. La lettre date du 12 septembre 2016, je pense donc que c'est bien l'algorithme utilisé par l'éducation nationale.
Source : http://rue89.nouvelobs.com/2016/10/18/voici-code-source-dapb-tenu-secret-jusqua-present-265443
Lettre : http://api.rue89.nouvelobs.com/sites/news/files/assets/document/2016/10/algorithme.pdf
Surtout, il a quel âge ce code? Aucune jointure, tout dans les WHERE. Après c'est pas si compliqué que ça, mais il nous faut le modèle de BDD pour comprendre au minumum.
Ce code n'est pas fait pour être compris. Le ministère de l'éducation nationale s'est moqué de l'association de lycéens.
Les développeurs qui ont livré ce truc savaient très bien ce qu'ils faisaient et ont bien rigolé.
Vous pensez sérieusement que s'il étaient voulaient communiquer honnêtement sur l'algo, ils auraient envoyé le code en pdf avec obligation d'en passer par un OCR ?
Sérieusement, ne perdez pas votre temps. Il faut interpeller la ministre sur cette mascarade par tweeter, lors de ses réunions et lui demander des comptes. C'est à l'administration d'en expliquer le fonctionnement, pas au contribuables de jouer aux devinettes.
Quant aux lycéens, il devraient refuser de s'inscrire sur APB tant qu'ils n'ont pas une information précise de son fonctionnement.
C'est pitoyable, j'en suis désolé pour ses jeunes. Et après on nous parle de big data, de startup de e-gov etc...
c'est possible de faire un repo plutot qu'un gist svp ?
histoire de donner l'acces aux pull_requests quoi...
c'est une blague ?
Voici une version plus avancée et sur un répo https://github.com/jeantil/admission_post_bac
Ça semble être l'officiel d'après le site de l'asso http://www.droitsdeslyceens.com/blog/dl-revele-l-algorithme-de-l-apb-pour-les-licences-en-tension.html
@maximecolin
Déjà, ils n'ont pas demandé l'algorithme, ils ont demandé le code source (pour être sûr que l'algorithme indiqué était bien celui appliqué). Ensuite, il ont demandé par mail ou au pire sur CD. Quand on voit le résultat de la demande "mail ou CD", on peut douter de la pertinence du code qu'il contient. Ensuite, si tu veux, je peux t'en trouver des projets avec des quantités de code mort. Je ne doute pas que ce code fasse partie de l'application utilisée par l'éducation nationale (il est tellement moche) mais le code qui fait l'appel à ces requêtes n'est pas présent. Qu'est ce qui prouve qu'en réalité, on n'a pas un truc de ce genre ? :
# en pseudo code
resultats = sql_truc_much_fourni_par_l'EN();
for (int i=0; i<resultats.length; i++) {
i_love_injections = "SELECT comme, un, porc FROM nawak WHERE porc = " + i;
candidats_gagnant[i] = sql_exec(i_love_injections);
}
J'avoue que je me suis surtout intéressée au classement: order by.
et rapidement, problème sur le commentaire suivant:
-- les candidats EFE qui n'ont au final pas classé la formation dans leur Iiste ordonnée. lls sont classé, mais en dernier.
ils affectent 0 au classement - et quand on fait un order by sans préciser, c'est en ordre ascendant (asc).
donc le 0 passe avant le 1 et donc les candidats qui n'ont pas classé passeraient avant ceux qui ont mis le voeux en 1
Cela semble vraiment gros à vrai dire.
la seule solution réelle c'est une installation de test (celle utilisée par les informaticiens pour valider leur logiciel) et laisser les lycéens jouer avec en changeant des données (sur des données fictives, comme font les informaticiens).
Ce serait un beau sujet de TPE à vrai dire...
IBG2016 > Effectivement en l'état et avec ce ORDER BY il semble que ça apparaisse en premier. C'est assez gros non ? Peut-être que c'est effacé par la suite, non ?
@charlycoste L'EN a envoyé le truc imprimé juste pour les faire chier, mais ça n'en discrédite pas pour autant la véracité. Et a mon avis il n'y pas de code applicatif, seulement une base de données type Access ou Oracle et ce script directement exécuté sur le logiciel, export CSV et basta.
Ma copine est prof, je vois tout les jours les outils mis à disposition des profs par l'Education Nationale, croyez moi, c'est tout aussi désuet. Tout leurs outils informatiques ont 15 ans de retard au minimum. Personnellement ça ne me surprend pas du tout qu'un code aussi vieillot et dépassé soit encore utilisé. Et si c'est pas celui ci, c'en est un du même genre. L'Etat et EN présente bien à la TV en montrant l'école numérique, les tablettes, les reformes, ... mais en réalité c'est beaucoup de comm pour épater le chaland. La réalité en est bien éloigné. Ce sont bien souvent des profs volontaires sans aucune formation qui maintiennent les parcs informatiques dépassés et complètement vérolés des lycées parce qu'il n'y pas de budget pour avoir des professionnels. Les outils qui calculent vos impôts sont sans doute dans la même veine, n'en doutez pas.
C'est normal qu'ils n'utilisent pas de requettes préparées ?
N'importe quel champ libre peut vriller la table...
@IBG2016 on commente ce where un peu plus en détail sur le github officiel : https://github.com/jeantil/admission_post_bac
Je pense qu'on est tous d'accord, ce code ne respecte aucune norme SQL et assez inexploitable en l'état. Pour info, dans un des commentaires de l'article du monde.fr on trouve le créateur (bénévole) de APB qui gère un budget annuel de 600 000€ et 7 ingénieurs sur ce projet. Ça me fait quand même assez halluciner qu'une équipe de 7 personnes laisse passer du code comme ça. Après, peut-être que tout s'explique par le passif du projet (créé bénévolement si je comprends bien, par un professeur qui n'est pas un informaticien) et de la nécessité de la rétro-compatibilité.
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 ? Si t'es numéroté 25, t'es pris, par contre si t'es 24, non, mais 21 oui?
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 !
Si l'algorithme arrive sur ce message... Comment se fait le classement?
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 ! Et la prochaine fois, précisez bien que vous voulez le code source sur des feuilles petit format, gros carreaux, écrites au stylo bille bleu !
PS : A noter que le code source Python livré dans "comprendre apb", ne correspond pas aux champs de cette procédure SQL ! Rien à voir !
Attention aux amalgames :
Et le code applicatif, il est où ? C'est bien gentil de filer des requêtes SQL au pif comme ça... Mais qui dit lesquelles sont utilisées et à quel moment ?
Le code fournit est une procédure stockée oracle. c'est moche, dur à lire mais c'est effectivement du code applicatif et c'était très à la mode a une époque.
Je vois pas comment quelqu'un aurait pu écrire ça comme ça par défaut
des programmeurs
- qui n'avaient pas trop le choix car le systeme leur imposait
- qui avaient pris cette habitude sur des systèmes où ils n'avaient pas trop le choix où
- a qui un architecte qui avait pris cette habitude sur un systeme où il n'y avait pas trop le choix a imposé d'utiliser une nomenclature de ce type.
et oui la taille des noms de colonne et des noms de table était limitée dans les SGBD a une époque. Même dans oracle.
Le ministère de l'éducation nationale s'est moqué de l'association de lycéens.
C'est ridicule mais j'y vois plus le produit d'une incompréhension généralisée de la programmation que la volonté de nuire. ou bien le ministère n'est pas propriétaire du code mais a une license pour son utilisation et a du demander a la société éditrice ... sans contexte, impossible de juger.
Difficile de se dire que l'éducation nationale place nos enfants en ne sachant pas ce qu'ils font !! (incompréhension généralisée) !
C'est ridicule mais j'y vois plus le produit d'une incompréhension généralisée de la programmation que la volonté de nuire. ou bien le ministère n'est pas propriétaire du code mais a une license pour son utilisation et a du demander a la société éditrice ... sans contexte, impossible de juger.
Ou alors une volonté de répondre sans donner la réponse... C'est un moyen de faire. Je ne souhaite pas que mon interlocuteur comprenne, alors je lui donne juste une toute petite partie de la réponse, comme ça, il est content, je lui ai répondu, tout en étant sûr que son objectif de compréhension ne soit pas atteint.
De toute façon, inutile de (trop) s'enflammer, le code est clairement INCOMPLET.
Il manque 4 éléments appelés depuis cette PS :
Procédures stockées :
pk_new_classement_commun.MAJ_etat_classement
pk_new_classement_commun.valid_classement_def
pk_new_classement_commun.valid_classement_formation
Fonction (?) :
six_voeu_L1
Le code est immonde, illisible. Les commentaires sont bourrés de fautes.
Je suis sur que l'agence qui la pondu est la première à exiger le mouton à 5 pattes dans ses process de recrutement.
Est-ce que quelqu'un a son nom, que je la place dans ma blacklist?
pour info/relecture : https://gist.github.com/jeantil/1a7c32d87524a2774da3cf80f4c62e50
sur un parcours rapide de votre version je vois quelques erreurs du logiciel OCR au moins sur les dernières lignes :
c_gp_fig_cia_oto => c_gp_flg_cla_oto
Decode(i_c_gp_eta_cia, 3, 4, c_gp_eta_cla) => Decode(l_c_gp_eta_cia, 3, 4, c_gp_eta_cla)
etc