Skip to content

Instantly share code, notes, and snippets.

@Benoitlecorre
Last active May 26, 2024 14:43
Show Gist options
  • Save Benoitlecorre/30b76f7fda430d4a06063a7cfc5e3844 to your computer and use it in GitHub Desktop.
Save Benoitlecorre/30b76f7fda430d4a06063a7cfc5e3844 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;
@jeantil
Copy link

jeantil commented Oct 18, 2016

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

@jeantil
Copy link

jeantil commented Oct 18, 2016

pour qu'on puisse collaborer plus facilement
https://github.com/jeantil/admission_post_bac

@jpotier
Copy link

jpotier commented Oct 18, 2016

@bobdenardd
Copy link

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.

@spokendotcpp
Copy link

Horrible à lire, Good Luck & Have Fun pour décrypter ce bordel.

@charlycoste
Copy link

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 ?

@nnorm
Copy link

nnorm commented Oct 18, 2016

+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. :)

@AirMarty
Copy link

@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 ^^

@maximecolin
Copy link

@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

@khena
Copy link

khena commented Oct 18, 2016

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.

@maniak212
Copy link

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...

@neolectron
Copy link

c'est possible de faire un repo plutot qu'un gist svp ?
histoire de donner l'acces aux pull_requests quoi...

Copy link

ghost commented Oct 18, 2016

c'est une blague ?

@Thoumou
Copy link

Thoumou commented Oct 18, 2016

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

@charlycoste
Copy link

charlycoste commented Oct 18, 2016

@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);
}

@IBG2016
Copy link

IBG2016 commented Oct 18, 2016

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...

@GuillaumeTara
Copy link

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 ?

@maximecolin
Copy link

@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.

@belaz
Copy link

belaz commented Oct 19, 2016

C'est normal qu'ils n'utilisent pas de requettes préparées ?
N'importe quel champ libre peut vriller la table...

@khena
Copy link

khena commented Oct 19, 2016

@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é.

http://www.letudiant.fr/educpros/entretiens/2014-bernard-koehret-createur-d-admission-post-bac-apb-est-un-observatoire-extraordinaire-de-l-orientation-en-france.html

@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 ? 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 !

@jeantil
Copy link

jeantil commented Oct 20, 2016

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.

@vbillet
Copy link

vbillet commented Oct 20, 2016

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.

@maxxyme
Copy link

maxxyme commented Oct 20, 2016

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

@setni
Copy link

setni commented Nov 22, 2016

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?

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