AFFELNET-LYCEEAFFELNET-LYCEE - Code source du classement des vœux des élèves Page 2 sur 8 /**...

24

Transcript of AFFELNET-LYCEEAFFELNET-LYCEE - Code source du classement des vœux des élèves Page 2 sur 8 /**...

Page 1: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;
Page 2: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 3: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 4: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

}

Page 5: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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)) {

Page 6: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 7: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 8: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

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 {

Page 9: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

}

Page 10: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 11: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 12: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 13: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 14: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 15: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 16: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 17: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

Page 18: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

/**

Page 19: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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;

}

Page 20: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 21: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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)

Page 22: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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 {

Page 23: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

Page 24: AFFELNET-LYCEEAFFELNET-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 forcé refusé. */ private String flagRefusVoeu;

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

}