AFFELNET AFFECTATION DES ELEVES APRES LA CLASSE DE TROISIEME ANNEE SCOLAIRE 2013-2014.
AFFELNET-LYCEEAFFELNET-LYCEE - Code source du classement des vœux des élèves Page 2 sur 8 /**...
Transcript of AFFELNET-LYCEEAFFELNET-LYCEE - Code source du classement des vœux des élèves Page 2 sur 8 /**...
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 1 sur 8
AFFELNET-LYCEE
Code source du calcul classement des vœux des élèves
Entrée de classement - Partie commune pour tous les types d'offre de formation
Classe EntreeClassement.java - 26 avril 2016 14:03:56
package fr.edu.academie.affelnet.domain.affectation ; import java.util.Date; import org.apache.commons.lang.builder.EqualsBuilde r; import org.apache.commons.lang.builder.HashCodeBuil der; import fr.edu.academie.affelnet.domain.Flag; import fr.edu.academie.affelnet.domain.voeu.Resulta tsProvisoiresOpa; import fr.edu.academie.affelnet.domain.voeu.Resulta tsProvisoiresOpaPK; import fr.edu.academie.affelnet.domain.voeu.VoeuEle ve; /** * Classe de base des entrées pour le classement de s résultats des voeux des élèves. * * <p> * Les informations sur l'élève et son voeu sont ex traites à l'instanciation de l'entrée. On prend toutes les * informations nécessaires au classement sans gard er de référence aux données. Seule la référence au contexte de * classement est gardée mais et il ne doit pas lui -même contenir des références aux données. * </p> */ public abstract class EntreeClassement implements C omparable<EntreeClassement> { /** Valeur indiquant que l'objet courant (recev eur, ou this) est à classer en premier. */ public static final int RECEVEUR_CLASSE_EN_PREM IER = -1; /** Valeur indiquant que l'objet passé en param ètre est à classer en premier. */ public static final int PARAMETRE_CLASSE_EN_PRE MIER = 1; /** Identifiant national de l'élève ayant formu lé le voeu. */ private String ine; /** Code de l'offre de formation concernée. */ private String codeOffreFormation; /** Le rang du voeu. */ private int rang; /** Le numéro du tour dans lequel le voeu a été formulé. */ private short numeroTour; /** Horodatage de l'enregistrement du voeu (ou à défaut la date courante). */
private Date horodatage;
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 2 sur 8
/** Flag indiquant si le voeu de l'élève est fo rcé refusé. */ private String flagRefusVoeu; /** La valeur générée pour le voeu et utiliser pour départager des voeux avec un barème égal. */ private int valeurDepartage; /** * @param resultatsProvisoiresOpa * le résultat du voeu de l'élève à classer */ public EntreeClassement(ResultatsProvisoiresOpa resultatsProvisoiresOpa) { ResultatsProvisoiresOpaPK id = resultatsPro visoiresOpa.getId(); this.ine = id.getIne(); this.rang = id.getRang(); this.numeroTour = id.getNumeroTour(); VoeuEleve voeuEleve = resultatsProvisoiresO pa.getVoeuEleve(); this.codeOffreFormation = voeuEleve.getVoeu ().getCode(); // On prend l'horodatage de la candidature ou à défaut la date courante this.horodatage = voeuEleve.getCandidature( ).getHorodatage(); if (this.horodatage == null) { this.horodatage = new Date(); } this.flagRefusVoeu = voeuEleve.getFlagRefus Voeu(); this.valeurDepartage = voeuEleve.getValeurD epartage(); } /** @return l'identifiant national de l'élève * / public String getIne() { return ine; } /** * @return codeOffreFormation */ public String getCodeOffreFormation() { return codeOffreFormation; } /** @return Le rang du voeu. */ public int getRang() { return rang; } @Override public boolean equals(Object obj) { if (obj instanceof EntreeClassement) {
EntreeClassement autre = (EntreeClassem ent) obj;
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 3 sur 8
return new EqualsBuilder().append(this. ine, autre.ine).append(this.numeroTour, autre.numeroTour) .append(this.rang, autre.rang). isEquals(); } else { return false; } } @Override public int hashCode() { return new HashCodeBuilder().append(ine).ap pend(rang).append(numeroTour).toHashCode(); } @Override public String toString() { return new StringBuffer().append("tour : ") .append(numeroTour).append(", ine : ").append(ine) .append(", rang : ").append(rang).t oString(); } /** @return vrai si le voeu doit être retiré du classement, sinon faux */ public boolean estExclusClassement() { // On exclut du classement les voeux élève refusés individuellement (FL_REFVOE='O') return Flag.OUI.equals(flagRefusVoeu); } /** * Compare l'entrée courante de classement avec une autre selon le critère de leur valeur de départage aléatoire. * * @param autreEntree * l'autre entrée de classement * @return -1 si l'entrée courante est la plus petite strictement (classée en premier), 1 sinon */ protected int compareToByDefault(EntreeClasseme nt autreEntree) { // On utilise la valeur de départage généré e aléatoirement pour classer les voeux de barèmes égaux if(valeurDepartage > autreEntree.valeurDepa rtage){ return RECEVEUR_CLASSE_EN_PREMIER; }else if(valeurDepartage < autreEntree.vale urDepartage){ return PARAMETRE_CLASSE_EN_PREMIER; }else{ // En cas d'égalité on regarde l'horoda tage Date oHorodatage = autreEntree.horodata ge; // On prend le premier selon l'horodata ge (i.e le plus vieux) if (oHorodatage.after(horodatage)) { return RECEVEUR_CLASSE_EN_PREMIER; }else{ return PARAMETRE_CLASSE_EN_PREMIER; } } }
}
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 4 sur 8
Entrée de classement - Cas des offres de formation utilisant le barème
Classe EntreeClassementBareme.java - 21 décembre 2015 15:34:25
package fr.edu.academie.affelnet.domain.affectation ; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import fr.edu.academie.affelnet.domain.Flag; import fr.edu.academie.affelnet.domain.voeu.Resulta tsProvisoiresOpa; /** Entrée de classement pour un résultat de voeu d 'élève traité avec barème. */ public class EntreeClassementBareme extends EntreeC lassement { /** Logger de la classe. */ private static final Log LOG = LogFactory.getLo g(EntreeClassementBareme.class); /** Le barème. */ private double bareme; /** * L'indicateur de sécurisation. */ private String flagSecurisation; /** * @param resultatsProvisoiresOpa * le résultat correspondant au voeu de l'élève à classer */ public EntreeClassementBareme(ResultatsProvisoi resOpa resultatsProvisoiresOpa) { super(resultatsProvisoiresOpa); // bareme (0 si null) if (resultatsProvisoiresOpa.getBareme() != null) { this.bareme = resultatsProvisoiresOpa.g etBareme().doubleValue(); } else { this.bareme = 0; } flagSecurisation = resultatsProvisoiresOpa. getFlagSecurisation(); } @Override public String toString() { return new StringBuffer().append(super.toSt ring()).append(", barème : ").append(bareme).toString(); } @Override public int compareTo(EntreeClassement autre) { if (!(autre instanceof EntreeClassementBare me)) {
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 5 sur 8
LOG.error("Entrée de classement incohér ente pour une offre avec barème : " + autre.toString() + " - " + autre.getClass()); throw new IllegalArgumentException("Le classement n'est pas cohérent vis à vis du type d'offre"); } EntreeClassementBareme autreEntreeClassemen t = (EntreeClassementBareme) autre; if (this == autreEntreeClassement) { return 0; } double oBareme = autreEntreeClassement.bare me; if(Flag.OUI.equals(flagSecurisation) && Flag.NON.equals(autreEntreeClassement.flagSecurisat ion)){ // Si l'appelant est sécurisé il est pr ioritaire return RECEVEUR_CLASSE_EN_PREMIER; }else if(Flag.NON.equals(flagSecurisation) && Flag.OUI.equals(autreEntreeClassement.flagSecurisat ion)){ // Si le paramètre est sécurisé il est prioritaire return PARAMETRE_CLASSE_EN_PREMIER; }else{ // Dans le cas où les deux voeux sont s écurisés ou ne le sont pas, on compare les barèmes if (oBareme < bareme) { // L'autre entrée à un barème plus petit return RECEVEUR_CLASSE_EN_PREMIER; } else if (oBareme == bareme) { // A barème égal, on prend les crit ères par défaut (valeur aléatoire, horodatage ...) return compareToByDefault(autreEntr eeClassement); } // l'autre gagne return PARAMETRE_CLASSE_EN_PREMIER; } } }
Entrée de classement - Cas des offres de formation avec décision en commission
Classe EntreeClassementCommission.java - 23 novembre 2015 10:34:25
package fr.edu.academie.affelnet.domain.affectation ; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import fr.edu.academie.affelnet.domain.voeu.Resulta tsProvisoiresOpa; import fr.edu.academie.affelnet.domain.voeu.VoeuEle ve;
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 6 sur 8
/** Entrée de classement pour un résultat provisoir e associé à un voeu d'élève traité en commission. */ public class EntreeClassementCommission extends Ent reeClassement { /** Logger de la classe. */ private static final Log LOG = LogFactory.getLo g(EntreeClassementCommission.class); /** La décision saisie en commission. */ private DecisionCommission decisionCommission; /** Le numéro de liste complémentaire saisi en commission. */ private double numeroListeComplementaireCommiss ion; /** * @param resultatsProvisoiresOpa * le résultat correspondant au résu ltat du voeu de l'élève à classer */ public EntreeClassementCommission(ResultatsProv isoiresOpa resultatsProvisoiresOpa) { super(resultatsProvisoiresOpa); // On examine le voeu de l'élève pour récup érer les décisions prises en commission VoeuEleve voeuEleve = resultatsProvisoiresO pa.getVoeuEleve(); // Décision en commission this.decisionCommission = DecisionCommission.getPourCode(voeuEleve.getCodeDec isionProvisoire()); // Numéro de lise complémentaire (0 si null ) this.numeroListeComplementaireCommission = 0; if (voeuEleve.getNumeroListeSuppProvisoire( ) != null) { this.numeroListeComplementaireCommissio n = voeuEleve.getNumeroListeSuppProvisoire().doubleValu e(); } } @Override public String toString() { return new StringBuffer().append(super.toSt ring()).append(", Code décision : ") .append(decisionCommission).append( ", Num. LS : ") .append(numeroListeComplementaireCo mmission).toString(); } /** * @return vrai si la décision prise en commiss ion pour le voeu est à exclure du classement (REFUSE, * NON_TRAITE, RECENSEMENT ou ABSENT) */ protected boolean estDecisionCommissionAExclure () { return decisionCommission == DecisionCommis sion.NON_TRAITE || decisionCommission == DecisionCo mmission.REFUSE || decisionCommission == DecisionCo mmission.RECENSEMENT || decisionCommission == DecisionCo mmission.DOSSIER_ABSENT; } /** @return vrai si le voeu doit être retiré du classement, sinon faux */
@Override
AF
FE
LNE
T-LY
CE
E - C
od
e so
urce
du
classe
me
nt d
es v
œu
x d
es é
lève
s P
ag
e 7
sur 8
pu
blic b
oo
lea
n e
stExclu
sCla
ssem
en
t() { // O
n e
xclut a
ussi d
u cla
ssem
en
t les o
ffres
traité
es e
n co
mm
ission
, // le
s voe
ux d
'élè
ves a
yan
t de
s dé
cision
s no
n cla
ssab
les
retu
rn su
pe
r.estE
xclusC
lasse
me
nt() || e
stDe
cision
Co
mm
ission
AE
xclure
(); } @
Ove
rride
p
ub
lic int co
mp
are
To
(En
tree
Cla
ssem
en
t vo) {
if (!(vo in
stan
ceo
f En
tree
Cla
ssem
en
tCo
mm
issio
n)) {
LO
G.e
rror("E
ntré
e d
e cla
ssem
en
t inco
hé
re
nte
po
ur u
ne
offre
traité
e co
mm
ission
: " +
vo.to
Strin
g()
+ " - " +
vo.g
etC
lass());
thro
w n
ew
Illeg
alA
rgu
me
ntE
xcep
tion
("Le
cla
ssem
en
t n'e
st pa
s coh
ére
nt vis à
vis du
typ
e d
'offre
"); } E
ntre
eC
lasse
me
ntC
om
missio
n o
= (E
ntre
eC
lass
em
en
tCo
mm
ission
) vo;
if (this =
= o
) { re
turn
0;
} D
ecisio
nC
om
missio
n o
De
cision
Co
mm
ission
= o
.d
ecisio
nC
om
missio
n;
do
ub
le o
Nu
me
roL
isteC
om
ple
me
nta
ire =
o.n
um
er
oL
isteC
om
ple
me
nta
ireC
om
missio
n;
// Cla
ssem
en
t san
s ba
rèm
e =
> le
s voe
ux o
nt
été
traité
s en
com
missio
n
// com
pa
raiso
n d
es co
de
De
cision
pro
visoire
if (d
ecisio
nC
om
missio
n =
= D
ecisio
nC
om
missio
n.P
RIS
&&
oD
ecisio
nC
om
missio
n !=
D
ecisio
nC
om
missio
n.P
RIS
) { // L
'ap
pe
lan
t a é
té p
ris (l'au
tre n
e l'
est p
as)
retu
rn R
EC
EV
EU
R_
CL
AS
SE
_E
N_
PR
EM
IER
; } e
lse if (d
ecisio
nC
om
missio
n !=
De
cision
Co
mm
ission
.PR
IS
&&
oD
ecisio
nC
om
missio
n =
= D
ecisio
nC
om
missio
n.P
RIS
) { // L
'au
tre a
été
pris (l'a
pp
ela
nt n
e l'
est p
as)
retu
rn P
AR
AM
ET
RE
_C
LA
SS
E_
EN
_P
RE
MIE
R;
} else
if (de
cision
Co
mm
ission
==
De
cision
Co
mm
ission
.CO
MP
LE
ME
NT
AIR
E
&&
oD
ecisio
nC
om
missio
n !=
De
cision
Co
mm
ission
.CO
MP
LE
ME
NT
AIR
E) {
// L'a
pp
ela
nt e
st sur liste
sup
plé
me
nta
ire (l'a
utre
ne
l'est p
as)
retu
rn R
EC
EV
EU
R_
CL
AS
SE
_E
N_
PR
EM
IER
; } e
lse if (d
ecisio
nC
om
missio
n !=
De
cision
Co
mm
ission
.CO
MP
LE
ME
NT
AIR
E
&&
oD
ecisio
nC
om
missio
n =
= D
ecisio
nC
om
missio
n.C
OM
PL
EM
EN
TA
IRE
) { // L
'au
tre e
st sur liste
sup
plé
me
nta
ire (l'a
pp
ela
nt n
e l'e
st pa
s) re
turn
PA
RA
ME
TR
E_
CL
AS
SE
_E
N_
PR
EM
IER
; } e
lse {
AFFELNET-LYCEE - Code source du classement des vœux des élèves Page 8 sur 8
// comparaison des num liste supp provi soire if (oNumeroListeComplementaire > numero ListeComplementaireCommission) { return RECEVEUR_CLASSE_EN_PREMIER; } else if (oNumeroListeComplementaire = = numeroListeComplementaireCommission) { return compareToByDefault(o); } } // l'autre gagne return PARAMETRE_CLASSE_EN_PREMIER; }
}
AFFELNET-LYCEE - Code source du calcul du barème Page 1 sur 15
AFFELNET-LYCEE
Code source du calcul du barème
Classe CalculBaremeDaoImpl.java - 24 mars 2016 17:54:34
package fr.edu.academie.affelnet.dao.hibernate.pam; import java.math.BigDecimal; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.apache.commons.collections.CollectionUti ls; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Query; import org.hibernate.ScrollableResults; import org.hibernate.Session; import org.springframework.beans.factory.annotation .Autowired; import org.springframework.beans.factory.config.Bea nDefinition; import org.springframework.context.annotation.Scope ; import org.springframework.stereotype.Repository; import fr.edu.academie.affelnet.dao.hibernate.Hiber nateUtil; import fr.edu.academie.affelnet.dao.hibernate.nomen clature.BonusFiliereDaoImpl; import fr.edu.academie.affelnet.dao.hibernate.nomen clature.LienZoneGeoDaoImpl; import fr.edu.academie.affelnet.dao.hibernate.nomen clature.ParametreFormationOrigineDaoImpl; import fr.edu.academie.affelnet.dao.hibernate.nomen clature.RapprochEtabDaoImpl; import fr.edu.academie.affelnet.dao.hibernate.utils .MatiereUtils; import fr.edu.academie.affelnet.dao.interfaces.nome nclature.BonusPamDao; import fr.edu.academie.affelnet.dao.interfaces.nome nclature.FormationOrigineModifieeDao; import fr.edu.academie.affelnet.dao.interfaces.nome nclature.ParametresFormationAccueilDao; import fr.edu.academie.affelnet.dao.interfaces.nome nclature.RangDao; import fr.edu.academie.affelnet.dao.interfaces.pam. CalculBaremeDao; import fr.edu.academie.affelnet.domain.Flag; import fr.edu.academie.affelnet.domain.nomenclature .Avis; import fr.edu.academie.affelnet.domain.nomenclature .BonusFiliere; import fr.edu.academie.affelnet.domain.nomenclature .BonusPam; import fr.edu.academie.affelnet.domain.nomenclature .Derogation; import fr.edu.academie.affelnet.domain.nomenclature .Etablissement; import fr.edu.academie.affelnet.domain.nomenclature .Formation; import fr.edu.academie.affelnet.domain.nomenclature .LienRangParametresFormationAccueil; import fr.edu.academie.affelnet.domain.nomenclature .LienZoneGeo; import fr.edu.academie.affelnet.domain.nomenclature .Matiere; import fr.edu.academie.affelnet.domain.nomenclature .MefStat; import fr.edu.academie.affelnet.domain.nomenclature .Palier; import fr.edu.academie.affelnet.domain.nomenclature .ParametreFormationOrigine; import fr.edu.academie.affelnet.domain.nomenclature .ParametresFormationAccueil; import fr.edu.academie.affelnet.domain.nomenclature .RapprochEtab; import fr.edu.academie.affelnet.domain.nomenclature .TypeAvis.CodeTypeAvis; import fr.edu.academie.affelnet.domain.nomenclature .Voeu; import fr.edu.academie.affelnet.domain.nomenclature .VoeuDeFiliere;
import fr.edu.academie.affelnet.domain.nomenclature .ZoneGeo;
AFFELNET-LYCEE - Code source du calcul du barème Page 2 sur 15
import fr.edu.academie.affelnet.domain.planificationCampag neAffectation.OperationProgrammeeAffectation; import fr.edu.academie.affelnet.domain.voeu.Candida ture; import fr.edu.academie.affelnet.domain.voeu.Derogat ionVoeuEleve; import fr.edu.academie.affelnet.domain.voeu.Eleve; import fr.edu.academie.affelnet.domain.voeu.Resulta tsProvisoiresOpa; import fr.edu.academie.affelnet.domain.voeu.VoeuEle ve; import fr.edu.academie.affelnet.service.nomenclatur e.VoeuDeFiliereManager; /** * Implémentation de l'étape de traitement réalisan t le calcul du barème pour une opération de programmée * d'affectation donnée. */ @Repository("CalculBaremeDao") @Scope(BeanDefinition.SCOPE_PROTOTYPE) public class CalculBaremeDaoImpl extends BatchOpaDa oImpl implements CalculBaremeDao { /** Le barème total maximal. */ private static final double BAREME_TOTAL_MAXIMU M = 999999.999D; /** Bonus maximal pour les notes. */ private static final double BONUS_MAX_NOTES = 9 9999.999D; /** * Informations associées à l'OPA traitée. * A conserver indépendamment des sessions Hibe rnate. */ public class InformationsOPA { /** Le bonus académique associé au premier voeu. */ private int bonusAcademique; /** Le bonus attribué au premier voeu. */ private int bonusPremierVoeu; /** Le bonus attribué aux élèves boursiers. */ private int bonusBoursier; /** * Crée une information d'OPA à partir d'un bean OPA source. * * @param operationProgrammeeAffectation * l'OPA source * */ public InformationsOPA(OperationProgrammeeA ffectation operationProgrammeeAffectation) { bonusAcademique = operationProgrammeeAf fectation.getBonusAcademique(); bonusPremierVoeu = operationProgrammeeA ffectation.getBonusPremierVoeu(); bonusBoursier = operationProgrammeeAffe ctation.getBonusBoursier(); } /** * @return la valeur du bonus académique co rrespondant à l'OPA */ public int getBonusAcademique() {
return bonusAcademique;
AFFELNET-LYCEE - Code source du calcul du barème Page 3 sur 15
} /** * @return la valeur du bonus attribué au p remier voeu correspondant à l'OPA */ public int getBonusPremierVoeu() { return bonusPremierVoeu; } /** * @return la valeur du bonus attribué pour les élèves boursiers correspondant à l'OPA. */ public int getBonusBoursier() { return bonusBoursier; } } /** Nombre d'itérations au bout duquel on netto ie la session. */ private static final int INTERVALLE_NETTOYAGE_S ESSION = 5000; /** Loggeur de la classe. */ private static final Log LOG = LogFactory.getLo g(CalculBaremeDaoImpl.class); /** Table de mise en cache des données globales . */ private Map<String, Object> cacheMap; /** Table stockant le ParamformationAccueil cor respondant à chaque code voeu. */ private Map<String, ParametresFormationAccueil> mapParamFormAccueilParVoeu = new HashMap<String, ParametresFormationAccueil>(); /** * Le Dao utilisé pour les bonus de préparation du barème. */ private BonusPamDao bonusPamDao; /** * Le Dao utilisé pour les rangs. */ private RangDao rangDao; /** * Le DAO des formations origine modifiées. */ private FormationOrigineModifieeDao formationOr igineModifieeDao; /** Le DAO des paramètres par formation d'accue il. */ private ParametresFormationAccueilDao parametre sFormationAccueilDao; /** * Le manager utilisé pour les voeux de filière . */ private VoeuDeFiliereManager voeuDeFiliereManag er; /** Les informations sur l'OPA conservées au lo ng du traitement. */ private InformationsOPA informationsOPA;
AFFELNET-LYCEE - Code source du calcul du barème Page 4 sur 15
/** Constructeur du DAO. */ public CalculBaremeDaoImpl() { // initialisation des données globales cacheMap = new HashMap<String, Object>(); } /** * @param bonusPamDao * the bonusPamDao to set */ @Autowired public void setBonusPamDao(BonusPamDao bonusPam Dao) { this.bonusPamDao = bonusPamDao; } /** * @param rangDao * the rangDao to set */ @Autowired public void setRangDao(RangDao rangDao) { this.rangDao = rangDao; } /** * @param voeuDeFiliereManager * the voeuDeFiliereManager to set */ @Autowired public void setVoeuDeFiliereManager(VoeuDeFilie reManager voeuDeFiliereManager) { this.voeuDeFiliereManager = voeuDeFiliereMa nager; } /** * @param formationOrigineModifieeDao * Le DAO des formations origine mod ifiées. */ @Autowired public void setFormationOrigineModifieeDao(Form ationOrigineModifieeDao formationOrigineModifieeDao) { this.formationOrigineModifieeDao = formatio nOrigineModifieeDao; } /** * @param parametresFormationAccueilDao * parametresFormationAccueilDao */ @Autowired public void setParametresFormationAccueilDao(Pa rametresFormationAccueilDao parametresFormationAccueilDao) { this.parametresFormationAccueilDao = parame tresFormationAccueilDao; } @Override public void lancerTraitement() { messages.start("Calcul du barème");
// Récupération de la session Hibernate
AFFELNET-LYCEE - Code source du calcul du barème Page 5 sur 15
Session session = HibernateUtil.currentSess ion(); // Informations sur l'OPA traitée long idOpa = getIdentifiantOperationProgram meeAffectation(); LOG.debug("Calcul du barème pour l'OPA " + idOpa); OperationProgrammeeAffectation operationPro grammeeAffectation = operationProgrammeeAffectationManager .charger(idOpa); setInformationsOPA(new InformationsOPA(oper ationProgrammeeAffectation)); // Récupération des résultats provisoires d e l'OPA à traiter et des voeux élèves associés : // élèves non-forcés ayant fait des voeux s ur des offres avec calcul de barème. LOG.debug("Collecte pour des résultats prov isoires et des voeux"); // calcul du nombre résultats à traiter pou r l'avancement Query requeteComptageResultatsATraiter = se ssion .getNamedQuery("compterResultatsPro visoiresPourBaremeOPA.select.hql"); requeteComptageResultatsATraiter.setParamet er("idOpa", idOpa); int nombreResultatsATraiter = ((Long) requeteComptageResultatsATraiter.uniqueResult()).in tValue(); LOG.debug("Nombre de résultats provisoires OPA à traiter : " + nombreResultatsATraiter); Query requeteResultatsATraiter = session.getNamedQuery("resultatsProvisoiresPourBare meOPA.select.hql"); requeteResultatsATraiter.setParameter("idOp a", idOpa); // On utilise la méthode ".scroll()" plutôt que // - la méthode ".list()" suite à des probl èmes de mémoire. // - la méthode ".iterate()" qui fait une r equète à chaque fois ScrollableResults scroll = requeteResultats ATraiter.scroll(); int nbResultatsTraites = 0; while (scroll.next()) { ResultatsProvisoiresOpa resultatProviso ire = (ResultatsProvisoiresOpa) scroll.get(0); calculerBareme(resultatProvisoire); session.saveOrUpdate(resultatProvisoire ); // Nettoyage régulier de la session Hib ernate if ((nbResultatsTraites % INTERVALLE_NE TTOYAGE_SESSION == 0) && (nbResultatsTraites > 0)) { LOG.debug("Nettoyage des caches et de la session Hibernate"); // On va nettoyer la session Hibern ate mais il faut au préalable // purger les tables de mise en cac he des objets utiles // sinon on peut obtenir des "lazy exception" cacheMap = new HashMap<String, Obje ct>(); mapParamFormAccueilParVoeu = new Ha shMap<String, ParametresFormationAccueil>(); HibernateUtil.cleanupSession(); } // maj de l'avancement messages.setAvancement(++nbResultatsTra ites, nombreResultatsATraiter); }
AFFELNET-LYCEE - Code source du calcul du barème Page 6 sur 15
LOG.debug("Calcul du barème - libération de s ressources"); scroll.close(); // Nettoyage de la session en cours HibernateUtil.cleanupSession(); LOG.debug("Calcul du barème - FIN - libérat ion mémoire"); // fin messages.end(); } /** * Positionne les informations liées à l'OPA né cessaires pour <strong>ce</strong> calcul du barème. * * @param informationsOPA * les informations liées à l'OPA */ protected void setInformationsOPA(InformationsO PA informationsOPA) { this.informationsOPA = informationsOPA; } /** * Calcul du barème pour le résultat provisoire d'un voeu d'élève. * * @param resultat * Résultat provisoire pour le voeu d'un élève à traiter */ protected void calculerBareme(ResultatsProvisoi resOpa resultat) { // Le voeu de l'élève VoeuEleve voeuEleve = resultat.getVoeuEleve (); // La formation origine de l'eleve Eleve eleve = voeuEleve.getEleve(); BigFormation bfO = BigFormation.build(eleve ); BigFormation bfOMod = BigFormation.buildWit hModif(eleve, cacheMap, formationOrigineModifieeDao); // La formation d'acceuil liée au voeu Voeu voeu = voeuEleve.getVoeu(); BigFormation bfA = BigFormation.build(voeu) ; // Calcul des différents bonus double baremeNotes = calculerBonusPourNotes (eleve, voeu, bfA); int bonusRetardScolaire = calculerBonusReta rdScolaire(eleve); int bonusFiliere = calculerBonusFiliere(bfO , bfA); int bonusAvisChefEtab = calculerBonusAvis(C odeTypeAvis.AVIS_DU_CHEF_D_ETABLISSEMENT, voeuEleve); int bonusAvisDSDEN = calculerBonusAvis(Code TypeAvis.AVIS_DSDEN, voeuEleve); int bonusAvisPasserelle = calculerBonusAvis (CodeTypeAvis.AVIS_PASSERELLE, voeuEleve); int bonusAvisGestion = calculerBonusAvis(Co deTypeAvis.AVIS_DE_GESTION, voeuEleve); int bonusDoublement = calculerBonusDoubleme nt(eleve, bfOMod, voeu, bfA); int bonusBoursier = calculerBonusBoursier(e leve);
AFFELNET-LYCEE - Code source du calcul du barème Page 7 sur 15
int bonusRapprochement = calculerBonusRappr ochement(eleve, voeu, bfA); int bonusVoeu1 = calculerBonusVoeu1(voeuEle ve); int bonusAcademique = calculerBonusAcademiq ue(eleve); int bonusLienZoneGeo = calculerBonusLienZon eGeo(eleve, voeu); int bonusDerogation = calculerBonusDerogati on(voeuEleve); int bonusVoeuDeFiliere = calculerBonusVoeuD eFiliere(voeuEleve); // Calcul du barème : somme du barème des n otes et des différents bonus double bareme = arrondir(baremeNotes + bonu sRetardScolaire + bonusFiliere + bonusAvisChefEtab + bonusAvisDSDEN + bonusAvisPassere lle + bonusAvisGestion + bonusDoublement + bonusBoursier + bonusRapprochement + bonusVoeu1 + bonusAcademique + bonusLienZoneGeo + bonusDerogation + bonusVoeuDeFiliere); if (bareme < 0) { bareme = 0; } else if (bareme > BAREME_TOTAL_MAXIMUM) { bareme = BAREME_TOTAL_MAXIMUM; } // Mise a jour du résultat resultat.setBaremeNotes(baremeNotes); resultat.setBonusRetardScolaire((short) bon usRetardScolaire); resultat.setBonusFiliere((short) bonusFilie re); resultat.setBonusAvisChefEtablissement((sho rt) bonusAvisChefEtab); resultat.setBonusAvisDsden((short) bonusAvi sDSDEN); resultat.setBonusAvisPasserelle((short) bon usAvisPasserelle); resultat.setBonusAvisDeGestion((short) bonu sAvisGestion); resultat.setBonusDoublement((short) bonusDo ublement); resultat.setBonusBoursier((short) bonusBour sier); resultat.setBonusRapprochement((short) bonu sRapprochement); resultat.setBonusVoeu1((short) bonusVoeu1); resultat.setBonusAcademique((short) bonusAc ademique); resultat.setBonusLienZoneGeo((short) bonusL ienZoneGeo); resultat.setBonusDerogation((short) bonusDe rogation); resultat.setBonusVoeuDeFiliere((short) bonu sVoeuDeFiliere); resultat.setBareme(bareme); } /** * Calcule le bonus de dérogation pour le voeu élève fourni. * <ul> * <li>* Ne concerne que les voeux dérogatoires .</li> * </ul> * * @param ve * Voeu élève concerné * @return valeur du bonus dérogation */ public int calculerBonusDerogation(VoeuEleve ve ) {
int somme = 0;
AFFELNET-LYCEE - Code source du calcul du barème Page 8 sur 15
if (ve.getFlagVoeuDerogation().equals(Flag. OUI)) { Map<Integer, DerogationVoeuEleve> derog ationsVoeuEleve = ve.getDerogationsVoeuEleve(); Iterator<DerogationVoeuEleve> derogatio nsEleveIterator = derogationsVoeuEleve.values().iterator(); while (derogationsEleveIterator.hasNext ()) { DerogationVoeuEleve derogationVoeuE leve = derogationsEleveIterator.next(); Derogation derogation = derogationV oeuEleve.getId().getDerogation(); // bonus parcours scolaire pris en compte uniquement // si flag élève parcourt scolaire particuliers à O if (derogation.getId().equals(Derogation.CODE_DEROGATI ON_PARCOURS_SCOLAIRE_PARTICULIER)) { if (ve.getFlagValidationParcour sScolaireParticulier() != null && ve.getFlagValidationParcoursScolaireParticulier().e quals(Flag.OUI)) { somme += derogation.getBonu s(); } } else { // bonus dans les autres cas somme += derogation.getBonus(); } } // while -- dérogations associées au voeu élève } // if -- post-3ème return somme; } /** * Attribue le bonus académique si l'élève est concerné. * * @param eleve * l'élève à traiter * @return valeur du bonus académique si le fla g est positionné sur l'élève */ private int calculerBonusAcademique(Eleve eleve ) { if (eleve.getFlagBonusAcademique().equals(F lag.OUI)) { return informationsOPA.getBonusAcademiq ue(); } return 0; } /** * Calcul du bonus pour un avis. * * @param codeTypeAvis * le type de l'avis * @param ve * le voeu de l'élève * @return la valeur du bonus pour l'avis */ private int calculerBonusAvis(CodeTypeAvis code TypeAvis, VoeuEleve ve) { Avis avis = ve.getAvis(codeTypeAvis); if (avis == null) {
return 0;
AFFELNET-LYCEE - Code source du calcul du barème Page 9 sur 15
} else { return avis.getBonus(); } } /** * Calcul du bonus doublement pour l'élève. * * @param eleve * élève concerné * @param voeu * voeu élève concerné * @param bfO * l'aggregat BigFormation origine * @param bfA * l'aggregat BigFormation accueil ( correspondant au voeu) * @return valeur du bonus doublement */ private int calculerBonusDoublement(Eleve eleve , BigFormation bfO, Voeu voeu, BigFormation bfA) { // infos origine Etablissement etabO = eleve.getEtablissemen t(); Formation formationO = bfO.getFormation(); // infos accueil Etablissement etabA = voeu.getEtablissement (); Formation formationA = bfA.getFormation(); List<Matiere> lEnsDet = bfA.getMatieres(); // il faut le même établissement if (etabO == null || !etabO.equals(etabA)) { return 0; } // il faut la même formation if (!formationO.equals(formationA)) { return 0; } // récupération du bon paramefA (si celui d onnée en paramètre est null) ParametresFormationAccueil pfa = mapParamFo rmAccueilParVoeu.get(voeu.getCode()); if (pfa == null) { pfa = parametresFormationAccueilDao.fin d(formationA, lEnsDet, cacheMap); } if (pfa != null) { Integer bonusDoublement = pfa.getBonusD oublement(); if (bonusDoublement != null) { return bonusDoublement; } } // utilisation du bonus par defaut BonusPam bp = getBonusPam(); return bp.getBonusDoublement(); }
/**
AFFELNET-LYCEE - Code source du calcul du barème Page 10 sur 15
* Calcule le bonus pour les élèves boursiers. * * @param eleve * élève concerné * @return la valeur du bonus boursier à attrib uer */ protected int calculerBonusBoursier(Eleve eleve ) { // Si l'élève n'est pas boursier => non app licable if (!Flag.toBoolean(eleve.getFlagBoursier() )) { return 0; } // L'élève est boursier, on examine son pal ier d'origine. Palier palierEleve = eleve.getPalierOrigine (); if (palierEleve == null) { // Palier inconnu (normalement, ce cas ne devrait pas se produire LOG.warn("Un palier manquant a été déte cté pour l'élève " + eleve.getIne() + " lors du calcule du critère boursier."); return 0; } // On n'attribue le bonus boursier qu'aux é lèves du palier 3ème. if (Palier.CODE_PALIER_3EME.equals(palierEl eve.getCode())) { return informationsOPA.getBonusBoursier (); } // A défaut, pas de bonus return 0; } /** * Calcule le bonus pour le suivi d'une filière entre la formation origine et accueil. * * @param bfO * l'aggregat BigFormation origine * @param bfA * l'aggregat BigFormation accueil * @return bonus accordé au suivi de la filière entre bfO et bfA */ private int calculerBonusFiliere(BigFormation b fO, BigFormation bfA) { // infos origine Formation formationO = bfO.getFormation(); List<Matiere> lOpt = bfO.getMatieres(); // infos accueil Formation formationA = bfA.getFormation(); List<Matiere> lEnsDet = bfA.getMatieres(); // récupération du bonus filière adéquat BonusFiliere bf = BonusFiliereDaoImpl.find( formationO, lOpt, formationA, lEnsDet, cacheMap); if (bf != null) { return bf.getBonus(); } // rien ne va return 0;
}
AFFELNET-LYCEE - Code source du calcul du barème Page 11 sur 15
/** * Calcule si l'élève peut bénéficier d'un bonu s pour un lien zone géographique. * * @param eleve * élève concerné * @param voeu * voeu concerné * @return bonus lien zone géo accordé */ private int calculerBonusLienZoneGeo(Eleve elev e, Voeu voeu) { // vérification de l'origine (adresse origi ne de l'élève) ZoneGeo zgO = eleve.getZoneGeo(); if (zgO != null) { // récupération du bon lien zone géo. LienZoneGeo lzg = LienZoneGeoDaoImpl.fi nd(zgO, voeu, cacheMap); if (lzg != null) { return lzg.getBonus(); } } // rien ne va return 0; } /** * Attribue le bonus prévu pour le premier voeu de l'élève (rang 1). * * @param ve * voeu de l'élève * @return bonus pour le voeu de rang 1 */ private int calculerBonusVoeu1(VoeuEleve ve) { if (ve.getId().getRang() > 1) { return 0; } // récupération du bonus return informationsOPA.getBonusPremierVoeu( ); } /** * Calcul du bonus rapprochement accordé au voe u élève selon son établissement d'origine. * * @param eleve * élève concerné * @param voeu * voeu formulé par l'élève * @param bfA * l'aggregat BigFormation accueil ( correspondant au voeu) * @return valeur du bonus rapprochement pour c e voeu */ private int calculerBonusRapprochement(Eleve el eve, Voeu voeu, BigFormation bfA) { // Code établissement / département origine String codeEtablissementOuDepartementOrigin e = eleve.numeroUaiOuDepartementMenOrigine();
// infos accueil
AFFELNET-LYCEE - Code source du calcul du barème Page 12 sur 15
Etablissement etabA = voeu.getEtablissement (); Formation formationA = bfA.getFormation(); List<Matiere> lEnsDet = bfA.getMatieres(); RapprochEtab re; re = RapprochEtabDaoImpl.find(codeEtablisse mentOuDepartementOrigine, etabA, formationA, lEnsDet, cacheMap); if (re != null) { return re.getBonus(); } // rien ne va return 0; } /** * Calcule le bonus de retard scolaire dont l'é lève peut bénéficier d'après les paramètres origine. * * @param eleve * élève concerné * @return valeur du bonus accordé à l'élève po ur le retard scolaire */ private int calculerBonusRetardScolaire(Eleve e leve) { // On commence par regarder si le flag de r etard scolaire est positionné à OUI pour l'élève String flRetardScolaire = eleve.getFlagReta rdScolaire(); if (flRetardScolaire == null || flRetardSco laire.equals(Flag.NON)) { return 0; } // On peut attribuer le bonus, donc il faut rechercher le paramefo qui convient. // On se base pour cela sur la formation et les options origine de l'élève Formation formation = eleve.getFormation(); Matiere option2 = eleve.getOptionOrigine2() ; Matiere option3 = eleve.getOptionOrigine3() ; List<Matiere> lOptions = MatiereUtils.gener ateCouple(option2, option3); ParametreFormationOrigine pfo = ParametreFo rmationOrigineDaoImpl.find(formation, lOptions, cacheMap); if (pfo == null) { return 0; } else { // Attribution du bonus du paramefo ret rouvé return pfo.getBonusRetardScolaire(); } } /** * Calcule le bonus accordé à un élève pour un voeu en fonction de ses notes. * * @param eleve * élève concerné * @param voeu * voeu formulé par l'élève * @param bfA
* l'aggregat BigFormation accueil ( correspondant au voeu)
AFFELNET-LYCEE - Code source du calcul du barème Page 13 sur 15
* @return valeur du bonus lié aux notes pour c e voeu */ private double calculerBonusPourNotes(Eleve ele ve, Voeu voeu, BigFormation bfA) { // infos Formation formationA = bfA.getFormation(); List<Matiere> lEnsDet = bfA.getMatieres(); // si le voeu n'est pas de type 2 : dommage if (!voeu.getIndicateurPam().equals(Voeu.IN DICATEUR_PAM_AVEC_NOTE)) { return 0; } // récupération du bon paramefA (si celui d onnée en paramètre est null) ParametresFormationAccueil pfa = mapParamFo rmAccueilParVoeu.get(voeu.getCode()); if (pfa == null) { pfa = parametresFormationAccueilDao.fin d(formationA, lEnsDet, cacheMap); } // pas de pfa pour ce voeu if (pfa == null) { return 0; } // ajout à la map stockant la formation d'a ccueil mapParamFormAccueilParVoeu.put(voeu.getCode (), pfa); // recuperation du nombre de notes int nombreRang = getNombreRang(); // Récupération de la candidature courante Candidature candidatureCourante = eleve.can didatureCourante(); // calcul du résultat double bonus = 0; for (int i = 1; i <= nombreRang; i++) { // récuperation de la note lissee Double noteLissee = candidatureCourante .getNoteLissee(i); // récupération du coefficient à appliq uer Integer coef = ((LienRangParametresForm ationAccueil) CollectionUtils.get(pfa.getCoefficients(), i - 1)).getValCoef(); // ajout au bonus if (noteLissee != null && coef != null) { bonus += coef.doubleValue() * noteL issee.doubleValue(); } } // pondération par le coefficient du groupe bonus *= eleve.getGroupeOrigine().getCoeffi cient().doubleValue(); // intervalle possible if (bonus < 0) { bonus = 0; } else if (bonus > BONUS_MAX_NOTES) { bonus = BONUS_MAX_NOTES;
} else {
AFFELNET-LYCEE - Code source du calcul du barème Page 14 sur 15
bonus = arrondir(bonus); } return bonus; } /** * Méthode de calcul du bonus pour le voeu de f ilière / montée pédagogique. * * On attribue le bonus de "montée pédagogique" aux élèves passant de 2nde pro en 1ère pro * avec une formation d'accueil * <ul> * <li>soit ayant la même spécialité dans le même établissement</li> * <li>soit étant une éventuelle adaptation d e filière définie dans la nomenclature * "Voeux de filière".</li> * </ul> * * @param ve * le voeu formulé par l'élève * @return la valeur du bonus attribué à ce voe u, en ce qui concerne les voeux de filière */ private int calculerBonusVoeuDeFiliere(VoeuElev e ve) { int bonusVoeuDeFiliere = 0; if (ve.getVoeu().getEtablissement().equals( ve.getEleve().getEtablissement())) { Formation formationOrigine = ve.getElev e().getFormation(); Formation formationAccueil = ve.getVoeu ().getFormationAccueil(); // Chargement d'uen éventuelle adatatio n de la filière définie pour la formation d'origine VoeuDeFiliere voeuDeFiliere = voeuDeFiliereManager.chargerNullable(formationOrigi ne.getId()); if (formationOrigine.getMefStat().getCodeMefStat4().eq uals(MefStat.CODE_MEFSTAT4_2NDPRO) && formationAccueil.getMefStat().getCodeMefStat4().equ als(MefStat.CODE_MEFSTAT4_1PRO) && (voeuDeFiliere != null && formationAccueil.equals(voeuDeFiliere.getFormationD Accueil()) || voeuDeFiliere == null && formationAccueil.get Id().getCodeSpecialite() .equals(formati onOrigine.getId().getCodeSpecialite()))) { BonusPam bp = getBonusPam(); bonusVoeuDeFiliere = bp.getBonusAut oVoeuxDeFiliere(); } } return bonusVoeuDeFiliere; } /** @return objet contenant les bonus pour PAM */ private BonusPam getBonusPam() { BonusPam bp; String cacheKey = "bonusPam"; if (cacheMap.containsKey(cacheKey)) { bp = (BonusPam) cacheMap.get(cacheKey); } else {
bp = (BonusPam) bonusPamDao.lister().ge t(0);
AFFELNET-LYCEE - Code source du calcul du barème Page 15 sur 15
cacheMap.put(cacheKey, bp); } return bp; } /** * Calcul d'arrondi à 3 chiffres décimaux utili sé pour les barèmes. * L'arrondi s'effectue à la valeur la plus pro che ou à la valeur * supérieure en cas d'égale distance. * * @param d * valeur à arrondir * @return valeur arrondie */ private static double arrondir(double d) { return new BigDecimal(String.valueOf(d)).se tScale(3, BigDecimal.ROUND_HALF_UP).doubleValue(); } /** @return nombre de rangs utilisés pour les n otes */ private int getNombreRang() { int nombreRang; String cacheKey = "nombreRang"; if (cacheMap.containsKey(cacheKey)) { nombreRang = ((Integer) cacheMap.get(ca cheKey)); } else { nombreRang = rangDao.getNombreElements( ); cacheMap.put(cacheKey, nombreRang); } return nombreRang; }
}