/**
* Evaluation est un exercice noté ( devoir, interrogation, etc.. )
- * piloté par un enseignant et debouchant sur un evaluation des eleves de
+ * piloté par un enseignant et debouchant sur une evaluation des eleves de
* l'enseignement
*
* @author bcro
ModaliteMatiere modaliteMatiere
Boolean creeParWebservice = Boolean.FALSE // evaluation cree par un WebService
TypeActivite typeActivite
+ Boolean ramenerSur20 = Boolean.FALSE
- static transients = ['verrouille', 'noteMaxSaisie']
+ static transients = [
+ 'verrouille',
+ 'noteMaxSaisie',
+ 'coefficientReel', // pour ramenage sur 20
+ 'noteMaxPossibleAffichee' // pour ramenage sur 20
+ ]
static constraints = {
description(nullable: true)
modaliteMatiere(nullable: true)
creeParWebservice(nullable: false)
typeActivite(nullable: false, validator: typeActiviteValidator)
+ ramenerSur20(nullable: false)
}
static hasMany = [notes: Note, periodes: Periode]
static mapping = {
table('entnotes.evaluation')
id column: 'id',
- generator: 'sequence',
- params: [sequence: 'entnotes.evaluation_id_seq']
+ generator: 'sequence',
+ params: [sequence: 'entnotes.evaluation_id_seq']
enseignement column : 'enseignement_id'
// l'enregistrement dans le tableau de jointure est enlevé par
// cascade quand l'évaluation est supprimée
periodes joinTable: [
- name: 'entnotes.rel_evaluation_periode',
- key: 'evaluation_id',
- column: 'periode_id'
+ name: 'entnotes.rel_evaluation_periode',
+ key: 'evaluation_id',
+ column: 'periode_id'
]
titre column: 'titre'
dateEvaluation column: 'date_evaluation'
moyenne column: 'moyenne'
modaliteMatiere column: 'modalite_matiere_id'
creeParWebservice column: 'cree_par_webservice'
+ ramenerSur20 column: 'ramener_sur_20'
}
static typeActiviteValidator = {TypeActivite val, Evaluation obj ->
return this.notes*.valeurNumerique?.max()
}
-
public String toString() {
return "Evaluation{titre=$titre , id=$id, enseignement=$enseignement}";
}
}
return this.dateCreation <=> eval.dateCreation
}
+
+ /**
+ * Coefficient avec le ramenage sur 20 si requis par l'evaluation
+ * @return
+ */
+ BigDecimal getCoefficientReel() {
+ if (!isRamenageSur20Necessaire()) {
+ return coefficient
+ }
+ return (coefficient * 20) / noteMaxPossible
+ }
+
+ /**
+ * NoteMax avec le ramenage sur 20 si requis par l'evaluation
+ * @return
+ */
+ BigDecimal getNoteMaxPossibleAffichee() {
+ if (!isRamenageSur20Necessaire()) {
+ return noteMaxPossible
+ }
+ return (noteMaxPossible * 20) / noteMaxPossible
+ }
+
+ /**
+ * Ramenage sur 20 est applique si l'utilisateur a choisi qu'il veut qu'on
+ * applique le ramenage et si la note maximale est different de 20.
+ * @return
+ */
+ Boolean isRamenageSur20Necessaire() {
+ return (ramenerSur20 && noteMaxPossible != 20)
+ }
}
BigDecimal valeurNumerique
NoteTextuelle valeurTextuelle
- static transients = ['valeur']
+ static transients = [
+ 'valeur',
+ 'valeurNumeriqueAffichee', // pour ramenere sur 20
+ 'valeurAffichee' // pour ramenere sur 20
+ ]
static constraints = {
valeurNumerique(nullable: true, validator: valeurNumeriqueValidator)
table('entnotes.note')
id column: 'id',
- generator: 'sequence',
- params: [sequence: 'entnotes.note_id_seq']
+ generator: 'sequence',
+ params: [sequence: 'entnotes.note_id_seq']
evaluation column: 'evaluation_id'
eleve column: 'eleve_id'
void setValeurTextuelle(String code) {
Etablissement etablissement =
- evaluation.enseignement.service.structureEnseignement.etablissement
+ evaluation.enseignement.service.structureEnseignement.etablissement
NoteTextuelle noteTextuelle =
- NoteTextuelle.findByCodeAndEtablissement(code, etablissement)
+ NoteTextuelle.findByCodeAndEtablissement(code, etablissement)
if (!noteTextuelle) {
throw new IllegalArgumentException(
- "Il n'existe pas de NoteTextuelle avec le code $code pour l'établissement $etablissement"
+ "Il n'existe pas de NoteTextuelle avec le code $code pour l'établissement $etablissement"
)
}
}
}
+ def getValeurAffichee() {
+ if (valeurTextuelle) {
+ return valeurTextuelle.code
+ } else {
+ return valeurNumeriqueAffichee
+ }
+ }
+
String toString() {
return "${getValeur()} pour ${eleve.id} @ $evaluation"
}
Note note = (Note) obj
return this.evaluation.compareTo(note.evaluation)
}
+
+ /**
+ * Note ramenee sur 20 (si requis par l'evaluation)
+ * @return
+ */
+ BigDecimal getValeurNumeriqueAffichee() {
+ if (!evaluation.isRamenageSur20Necessaire()) {
+ return valeurNumerique
+ }
+ return (valeurNumerique * 20) / evaluation.noteMaxPossible
+ }
}
INTRODUCTION("INT", "Activité d'introduction", true),
ACTIVITE_INTERACTIVE("INTER", "Activité interactive", true),
- COURS("COURS" ,"Cours", false),
+ COURS("COURS", "Cours", false),
DEVOIR_MAISON("DMAIS", "Devoir à la maison", true),
- DEVOIR_A_RENDRE ("RDRE", "Devoir à rendre", false),
+ DEVOIR_A_RENDRE("RDRE", "Devoir à rendre", false),
DEVOIR_SURVEILLE("SURV", "Devoir surveillé", false),
EVALUATION("EVAL", "Evaluation", false),
EXERCICE("EX", "Exercice", false),
// Personnels de direction
GroupeInfo groupePersonnelDeDirection =
annuaireService.getGroupeInfoDirectionForEtablissement(
- etablissement.idExterne
+ etablissement.idExterne
)
if (!groupePersonnelDeDirection) {
if (log.isInfoEnabled()) {
log.info "Le groupe de personnel de direction de l'établissement : " +
- " ${etablissement.nomAffichage} est null"
+ " ${etablissement.nomAffichage} est null"
}
}
// Personnel d'éducation
GroupeInfo groupePersonnelDEducation =
annuaireService.getGroupeInfoEducationForEtablissement(
- etablissement.idExterne
+ etablissement.idExterne
)
if (!groupePersonnelDEducation) {
if (log.isInfoEnabled()) {
log.info "Le groupe de personnel d'éducation de l'établissement : " +
- "${etablissement.nomAffichage} est null"
+ "${etablissement.nomAffichage} est null"
}
}
// Chef de travaux
GroupeInfo groupeChefTravaux =
annuaireService.getGroupeInfoChefDeTravauxForEtablissement(
- etablissement.idExterne
+ etablissement.idExterne
)
if (!groupeChefTravaux) {
if (log.isInfoEnabled()) {
log.info "Le groupe de chef de travaux de l'établissement : " +
- "${etablissement.nomAffichage} est null"
+ "${etablissement.nomAffichage} est null"
}
}
GroupeInfo getGroupeInfoDAdminsLocaux(Etablissement etablissement) {
GroupeInfo groupeAdminLocaux =
annuaireService.getGroupeInfoAdminsLocauxForEtablissement(
- etablissement.idExterne
+ etablissement.idExterne
)
if (!groupeAdminLocaux) {
if (log.isInfoEnabled()) {
log.info "Le groupe d'admins locaux de l'établissement : " +
- "${etablissement.nomAffichage} est null"
+ "${etablissement.nomAffichage} est null"
}
}
// Documentatlistes
GroupeInfo groupeDocumentatlistes =
annuaireService.getGroupeInfoDocumentationForEtablissement(
- etablissement.idExterne
+ etablissement.idExterne
)
if (!groupeDocumentatlistes) {
if (log.isInfoEnabled()) {
log.info "Le groupe de documentalistes de l'établissement : " +
- "${etablissement.nomAffichage} est null"
+ "${etablissement.nomAffichage} est null"
}
}
}
List<GroupeInfo> getGroupeInfoProfsPrincipaux(SecuriteSession securiteSession,
- StructureInformations structureInfos) {
+ StructureInformations structureInfos) {
List<GroupeInfo> groupeProfsPrincipaux =
annuaireService.getGroupeInfoProfPrincipauxPourStructureEnseignement(
- securiteSession,
- structureInfos
+ securiteSession,
+ structureInfos
)
if (groupeProfsPrincipaux.size() == 0) {
log.warn("Il n'existe pas de groupes de profs principaux pour " +
- "la structure d'enseignement d'id externe: ${structureInfos.idExterne}")
+ "la structure d'enseignement d'id externe: ${structureInfos.idExterne}")
}
return groupeProfsPrincipaux
}
List<GroupeInfo> getGroupeInfoEleves(SecuriteSession securiteSession,
- StructureInformations structureInfos) {
+ StructureInformations structureInfos) {
List<GroupeInfo> groupesEleves =
annuaireService.getGroupeInfoElevePourStructureEnseignement(
- securiteSession,
- structureInfos
+ securiteSession,
+ structureInfos
)
if (groupesEleves.size() == 0) {
if (log.isInfoEnabled()) {
log.info("Il n'existe pas de groupes d'élèves pour " +
- "la structure d'enseignement d'id externe: ${structureInfos.idExterne}")
+ "la structure d'enseignement d'id externe: ${structureInfos.idExterne}")
}
}
}
List<GroupeInfo> getGroupeInfoEnseignants(SecuriteSession securiteSession,
- StructureInformations structureInfos) {
+ StructureInformations structureInfos) {
List<GroupeInfo> groupeEnseignants =
annuaireService.getGroupeInfoEnseignantPourStructureEnseignement(
- securiteSession,
- structureInfos
+ securiteSession,
+ structureInfos
)
if (groupeEnseignants.size() == 0) {
if (log.isInfoEnabled()) {
log.info("Il n'existe pas de groupes d'enseignants pour " +
- "la structure d'enseignement : ${structureInfos.idExterne}")
+ "la structure d'enseignement : ${structureInfos.idExterne}")
}
}
}
List<GroupeInfo> getGroupeInfoParents(SecuriteSession securiteSession,
- StructureInformations structureInfos) {
+ StructureInformations structureInfos) {
List<GroupeInfo> groupesParents =
annuaireService.getGroupeInfoParentsPourStructureEnseignement(
- securiteSession,
- structureInfos
+ securiteSession,
+ structureInfos
)
if (groupesParents.size() == 0) {
if (log.isInfoEnabled()) {
log.info("Il n'existe pas de groupes de parents pour " +
- "la structure d'enseignement : ${structureInfos.idExterne}")
+ "la structure d'enseignement : ${structureInfos.idExterne}")
}
}
if (groupeInfo == null) {
groupeInfo = super.getGroupeInfoDeDirection(etablissement)
mapGroupesDirection.put(
- etablissement.id,
- groupeInfo
+ etablissement.id,
+ groupeInfo
)
}
return groupeInfo
List<Long> typeUtiliseIds = findAllTypeUtiliseIds(etablissement)
- List<TypeActivite> typesActivites = TypeActivite.findAllByEtablissement(etablissement)
+ List<TypeActivite> typesActivites = TypeActivite.findAllByEtablissement(etablissement)
List<TypeActiviteDevoir> typeActiviteDevoirList =
- typesActivites.collect {TypeActivite typeActivite ->
- new TypeActiviteDevoir(
- id: typeActivite.id,
- code: typeActivite.code,
- libelle: typeActivite.libelle,
- modifiable: typeActivite.modifiable,
- etablissement: typeActivite.etablissement,
- isUtilise: typeActivite.id in typeUtiliseIds
- )
- }
+ typesActivites.collect {TypeActivite typeActivite ->
+ new TypeActiviteDevoir(
+ id: typeActivite.id,
+ code: typeActivite.code,
+ libelle: typeActivite.libelle,
+ modifiable: typeActivite.modifiable,
+ etablissement: typeActivite.etablissement,
+ isUtilise: typeActivite.id in typeUtiliseIds
+ )
+ }
return typeActiviteDevoirList
}
TypeActivite.withSession {session -> session.flush()}
}
-
/**
* Vérifie s'il y a au moins un type pour l'établissement donné.
* @author bper
} as Boolean
}
-
/**
* Recherche le type d'activité par code et cahier de texte. Si le cahier est lié
* à un service => recherche le type correspondant à l'étab du service.
}
}
-
/**
* Affecte toutes les activités d'un CDT aux types de son établissement.
* @author bper
activites.each {
it.typeActivite = findTypeEquivalent(it, cdt)
}
-
+
activites*.save(failOnError: true)
sessionFactory.currentSession.flush()
}
-
/**
* Retuorne le type d'activité équivalent au type de l'activité donnée
* dans le contexte de CDT cible.
return typeCible
}
-
/**
* Recherche unsensible à la casse et aux accents par code et établissement.
* @author bper
}
}
-
/**
* Retourne un type par défaut en fonction de contexte de l'activité.
* @author bper
*/
TypeActivite findTypeParDefautByContexteAndEtab(ContexteActivite contexte,
- Etablissement etab) {
+ Etablissement etab) {
switch (contexte?.code) {
- case ContexteActivite.CODE_CLASSE :
+ case ContexteActivite.CODE_CLASSE:
return findByCodeAndEtab(TypeActiviteParDefaut.COURS.code, etab)
- case ContexteActivite.CODE_MAISON :
+ case ContexteActivite.CODE_MAISON:
return findByCodeAndEtab(TypeActiviteParDefaut.EXERCICE.code, etab)
default:
}
}
-
/**
* Recherche tous les types d'activite par cahier de texte. Si le cahier est lié
* à un service recherche les types correspondant à l'étab du service.
}
}
-
/**
* Retourne tous les types d'activité correspodant à l'établissement de
* rattachement de la personne. Si la personne n'est pas rattachée à un étab
return TypeActivite.createCriteria().list {
if (etab) {
- eq('etablissement', etab)
+ eq('etablissement', etab)
} else {
isNull('etablissement')
}
isNotNull('etablissement')
createAlias('etablissement', 'etablissement')
projections {
- distinct ('etablissement.id')
+ distinct('etablissement.id')
}
}
return Etablissement.createCriteria().list {
if (etabIdsAvectypes) {
- not{'in'('id',etabIdsAvectypes)}
+ not {'in'('id', etabIdsAvectypes)}
}
}
}
AnneeScolaireService anneeScolaireService
- AnneeScolaire getAnneeScolaire(PopulationTestAnneeScolaire anneeScolaire){
+ AnneeScolaire getAnneeScolaire(PopulationTestAnneeScolaire anneeScolaire) {
AnneeScolaire anneeScolaireEnCours = anneeScolaireService.anneeScolaireEnCours()
- switch(anneeScolaire) {
+ switch (anneeScolaire) {
case PopulationTestAnneeScolaire.ANNEE_EN_COURS: return anneeScolaireEnCours
case PopulationTestAnneeScolaire.ANNEE_MOINS_1:
return getAnneeMoinsUn(anneeScolaireEnCours)
*/
public enum PopulationTestCahierDeTextes {
SRC_ENS2_CLS2_MAT1_ETAB1_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_2,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_2_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_2,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_2_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
SRC_ENS1_CLS1_MAT1_ETAB1_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
SRC_ENS1_CLS1_MAT2_ETAB1_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_10,
- PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_10,
+ PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
SRC_ENS1_CLS2_MAT1_ETAB1_NON_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_2_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_2_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
SRC_ENS1_CLS1_MAT1_ETAB2(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_11,
- PopulationTestMatiere.FRANCAIS_ETAB_11,
- PopulationTestEtablissement.ETABLISSEMENT_11,
- false,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_11,
+ PopulationTestMatiere.FRANCAIS_ETAB_11,
+ PopulationTestEtablissement.ETABLISSEMENT_11,
+ false,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
SRC_ENS2_GROUPE1_MAT1_ETAB3_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_2,
- PopulationTestActeur.DIRECTION_1,
- PopulationTestGroupe.GROUPE_1_5,
- PopulationTestMatiere.FRANCAIS,
- PopulationTestEtablissement.ETABLISSEMENT_1,
- true,
- false,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_2,
+ PopulationTestActeur.DIRECTION_1,
+ PopulationTestGroupe.GROUPE_1_5,
+ PopulationTestMatiere.FRANCAIS,
+ PopulationTestEtablissement.ETABLISSEMENT_1,
+ true,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
PRIV_DIR_NON_PART(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestActeur.DIRECTION_4,
- null,
- null,
- null,
- false,
- false,
- null,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestActeur.DIRECTION_4,
+ null,
+ null,
+ null,
+ false,
+ false,
+ null,
+ false,
+ false
),
PRIV_DIR_PART(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestActeur.DIRECTION_4,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- null,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestActeur.DIRECTION_4,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ null,
+ false,
+ false
),
PRIV_ENS1_NON_PART(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- null,
- false,
- false,
- null,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ null,
+ false,
+ false,
+ null,
+ false,
+ false
),
PRIV_ENS1_PART_VISE(
- CahierDeTextesType.CAHIER_PRIVE_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- true,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ false
),
PRIV_ENS1_PART_NON_VISE(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- null,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ null,
+ false,
+ false
),
PRIV_ENS2_PART_NON_VISE(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.ENSEIGNANT_2,
- PopulationTestActeur.ENSEIGNANT_2,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- null,
- false,
- false
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.ENSEIGNANT_2,
+ PopulationTestActeur.ENSEIGNANT_2,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ null,
+ false,
+ false
),
ARCH_NON_PART(
- CahierDeTextesType.CAHIER_ARCHIVE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_10,
- PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- false,
- PopulationTestAnneeScolaire.ANNEE_MOINS_1,
- false,
- false
+ CahierDeTextesType.CAHIER_ARCHIVE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_10,
+ PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ false,
+ PopulationTestAnneeScolaire.ANNEE_MOINS_1,
+ false,
+ false
),
ARCH_PART_VISE(
- CahierDeTextesType.CAHIER_ARCHIVE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_10,
- PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- true,
- PopulationTestAnneeScolaire.ANNEE_MOINS_1,
- false,
- false
+ CahierDeTextesType.CAHIER_ARCHIVE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_10,
+ PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_MOINS_1,
+ false,
+ false
),
ARCH_PART_NON_VISE(
- CahierDeTextesType.CAHIER_ARCHIVE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_1_ETAB_10,
- PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- PopulationTestAnneeScolaire.ANNEE_MOINS_1,
- false,
- false
+ CahierDeTextesType.CAHIER_ARCHIVE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_1_ETAB_10,
+ PopulationTestMatiere.MATHEMATIQUES_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_MOINS_1,
+ false,
+ false
),
UTIL_PRIV_ENS1_NON_PART(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- null,
- false,
- false,
- null,
- false,
- true
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ null,
+ false,
+ false,
+ null,
+ false,
+ true
),
UTIL_PRIV_ENS1_PART_VISE(
- CahierDeTextesType.CAHIER_PRIVE_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- true,
- null,
- false,
- true
+ CahierDeTextesType.CAHIER_PRIVE_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ true,
+ null,
+ false,
+ true
),
UTIL_PRIV_ENS1_PART_NON_VISE(
- CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.ENSEIGNANT_1,
- null,
- null,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- null,
- false,
- true
+ CahierDeTextesType.CAHIER_PRIVE_NON_VISE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.ENSEIGNANT_1,
+ null,
+ null,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ null,
+ false,
+ true
),
UTIL_SRC_ENS1_CLS3_MAT1_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_3_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- true,
- true,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- true
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_3_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ true,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ true
),
UTIL_SRC_ENS1_CLS4_MAT1_NON_VISE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_4_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- false,
- true
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_4_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ false,
+ true
),
SRC_ENS1_CLS5_MAT1_INCORPORE(
- CahierDeTextesType.CAHIER_DE_SERVICE,
- PopulationTestActeur.ENSEIGNANT_1,
- PopulationTestActeur.DIRECTION_4,
- PopulationTestClasse.CLASSE_5_ETAB_10,
- PopulationTestMatiere.FRANCAIS_ETAB_10,
- PopulationTestEtablissement.ETABLISSEMENT_10,
- false,
- true,
- PopulationTestAnneeScolaire.ANNEE_EN_COURS,
- true,
- false
+ CahierDeTextesType.CAHIER_DE_SERVICE,
+ PopulationTestActeur.ENSEIGNANT_1,
+ PopulationTestActeur.DIRECTION_4,
+ PopulationTestClasse.CLASSE_5_ETAB_10,
+ PopulationTestMatiere.FRANCAIS_ETAB_10,
+ PopulationTestEtablissement.ETABLISSEMENT_10,
+ false,
+ true,
+ PopulationTestAnneeScolaire.ANNEE_EN_COURS,
+ true,
+ false
)
CahierDeTextesType type
Boolean estDansDossier
private PopulationTestCahierDeTextes(
- CahierDeTextesType type,
- PopulationTestActeur enseignant,
- PopulationTestActeur directeur,
- PopulationTestStructureEnseignement structureEnseignement,
- PopulationTestMatiere matiere,
- PopulationTestEtablissement etablissement,
- Boolean estVise,
- Boolean estPartage,
- PopulationTestAnneeScolaire anneeScolaire,
- Boolean estIncorpore,
- Boolean estDansDossier
+ CahierDeTextesType type,
+ PopulationTestActeur enseignant,
+ PopulationTestActeur directeur,
+ PopulationTestStructureEnseignement structureEnseignement,
+ PopulationTestMatiere matiere,
+ PopulationTestEtablissement etablissement,
+ Boolean estVise,
+ Boolean estPartage,
+ PopulationTestAnneeScolaire anneeScolaire,
+ Boolean estIncorpore,
+ Boolean estDansDossier
) {
this.type = type
this.enseignant = enseignant
private CahierDeTextes getCdtPriveEtab1() {
cahierDeTextesService.creerCahierDeTextesPrive(
localInitDonneesCommunesTestService.getSecuriteSession(
- PopulationTestActeur.ENSEIGNANT_1),
+ PopulationTestActeur.ENSEIGNANT_1),
"Test",
"Test"
)
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Copyright © FYLAB and the Conseil Régional d'Île-de-France, 2009
+ ~ This file is part of L'Interface Libre et Interactive de l'Enseignement (Lilie).
+ ~
+ ~ Lilie is free software. You can redistribute it and/or modify since
+ ~ you respect the terms of either (at least one of the both license) :
+ ~ - under the terms of the GNU Affero General Public License as
+ ~ published by the Free Software Foundation, either version 3 of the
+ ~ License, or (at your option) any later version.
+ ~ - the CeCILL-C as published by CeCILL-C; either version 1 of the
+ ~ License, or any later version
+ ~
+ ~ There are special exceptions to the terms and conditions of the
+ ~ licenses as they are applied to this software. View the full text of
+ ~ the exception in file LICENSE.txt in the directory of this software
+ ~ distribution.
+ ~
+ ~ Lilie is distributed in the hope that it will be useful,
+ ~ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ~ Licenses for more details.
+ ~
+ ~ You should have received a copy of the GNU General Public License
+ ~ and the CeCILL-C along with Lilie. If not, see :
+ ~ <http://www.gnu.org/licenses/> and
+ ~ <http://www.cecill.info/licences.fr.html>.
+ -->
+
+<databaseChangeLog
+ xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-2.0.xsd">
+
+ <changeSet id="1" author="msan">
+
+ <comment>
+ Ajout de ramener_sur_20 dans evaluation
+ </comment>
+
+ <addColumn schemaName="entnotes" tableName="evaluation">
+ <column name="ramener_sur_20" type="boolean" defaultValueBoolean="false">
+ <constraints nullable="false" />
+ </column>
+ </addColumn>
+
+ <update tableName="evaluation" schemaName="entnotes">
+ <column name="ramener_sur_20" value="true" />
+ </update>
+
+ </changeSet>
+
+</databaseChangeLog>
<include file="changelogs/scolarite/2013-02-21-0025834-2.xml"/>
<include file="changelogs/scolarite/2013-02-21-0025834-3.xml"/>
<include file="changelogs/scolarite/2013-02-22-0025834.xml"/>
+ <include file="changelogs/scolarite/2013-02-27-0025965.xml"/>
</databaseChangeLog>
return [
evaluation: note.evaluation.titre,
//coeff: note.evaluation.coefficient,
- valeurNumerique: note.valeurNumerique,
- valeur: note.valeur,
- noteMax: note.evaluation.noteMaxPossible
+ valeurNumerique: note.valeurNumeriqueAffichee,
+ valeur: note.valeurAffichee,
+ noteMax: note.evaluation.noteMaxPossibleAffichee
]
}
}
eliot.notes.libelle.dateEvaluation=Date
eliot.notes.libelle.noteMax=Note maximale
eliot.notes.libelle.publiable=Publiable
+eliot.notes.libelle.ramenerSur20=Ramener /20
eliot.notes.libelle.comboService=Classe/groupe
eliot.notes.libelle.comboPeriode=Période
notes?.each {Note note ->
noteInfos << new NoteImpressionInfo(
libelle: note.evaluation.titre,
- note: note.getValeur(),
- noteMax: note.evaluation.noteMaxPossible
+ note: note.getValeurAffichee(),
+ noteMax: note.evaluation.noteMaxPossibleAffichee
)
}
return noteInfos
calculeMoyenneNotes(
noteClasseEvals,
true
- ).valeurNumerique
+ )?.valeurNumerique
tdnGraphData.moyenneClasseSur = evaluation.noteMaxPossible
tdnGraphData.moyenneClasse = calculationService.rameneSur20(
-package org.lilie.services.eliot.notes.resultat\r
-\r
-import org.lilie.services.eliot.notes.Note\r
-import java.math.RoundingMode\r
-import org.lilie.services.eliot.notes.NoteTextuelle\r
-import org.lilie.services.eliot.resultat.Moyenne\r
-\r
-/**\r
- * Calculation general des moyennes\r
- * @author msan\r
- */\r
-class CalculationService {\r
-\r
- static transactional = true\r
-\r
- // précision 10 = 0.0000000001 - la même précision qui est utilisée par JavaScript\r
- // Il faut avoir la même précision pour que les moyennes presentées dans\r
- // Notes et appreciations (calculées par JavaScript) et dans les Synthèses\r
- // (caluclées par Groovy) soient les mêmes\r
- private static final int PRECISION_PAR_DEFAUT = 10\r
- private static final BigDecimal MOYENNE_MAX = 20 // par tradition si la moyenne dépasse 20, elle est trimée à 20\r
- private static final BigDecimal SEUIL_OPTIONEL = 10 // si le service est défini comme optionel,\r
- // seulement la difference positive entre la note et le seuil est pris en compte dans le numérateur\r
-\r
- /**\r
- * Min des valeurs.\r
- * @param bigDecimals valeurs\r
- * @return Min des valeurs\r
- */\r
- BigDecimal calculeMin(List<BigDecimal> bigDecimals) {\r
- return (BigDecimal) bigDecimals.min()\r
- }\r
-\r
- /**\r
- * Max des valeurs.\r
- * @param bigDecimals valeurs\r
- * @return Max des cvaleurs.\r
- */\r
- BigDecimal calculeMax(List<BigDecimal> bigDecimals) {\r
- return (BigDecimal) bigDecimals.max()\r
- }\r
-\r
- /**\r
- * Calcule la moyenne arithmétique : (a1 + a2 + ... + aN)/N\r
- * Important! La méthode ne verifie pas (car trop lourd) si les services\r
- * sont évaluables ou pas.\r
- * @param listeNotes liste des Notes\r
- * @param ignoreAnnotations s'il faut ignorer les annotations\r
- * (pour exemple pour les moyennes des classes)\r
- * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)\r
- * @return moyenne arithmétique\r
- * @author msan\r
- * @author bper\r
- */\r
- Moyenne calculeMoyenneNotes(List<Note> listeNotes,\r
- Boolean ignoreAnnotations = false,\r
- int precision = PRECISION_PAR_DEFAUT) {\r
-\r
- if (!ignoreAnnotations) {\r
- listeNotes.sort()\r
- }\r
-\r
- List listeValeurs = listeNotes?.collect {\r
- if (it.valeurNumerique != null) {\r
- return it.valeurNumerique\r
- } else {\r
- return it.valeurTextuelle\r
- }\r
- }\r
- return calculeMoyenne(listeValeurs, ignoreAnnotations, precision)\r
- }\r
-\r
- /**\r
- * Calcule la moyenne pondérée : (a1*coef1 + a2*coef2 + ...) / (coef1 + coef2 + ...)\r
- * Important! La méthode ne verifie pas (car trop lourd) si les services\r
- * sont évaluables ou pas.\r
- * Important! Pour éviter les N+1 requetes if faut passer la liste des notes\r
- * "fetchées" avec les evaluations\r
- * N.B. Les notes sont ramenées à 20 (la noteMax est utilisé comme une échelle)\r
- * @param listeNotes liste des notes\r
- * @param ignoreAnnotations s'il faut ignorer les annotations\r
- * (pour exemple pour les moyennes des classes)\r
- * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)\r
- * @return moyenne pondérée\r
- * @author msan\r
- * @author bper\r
- */\r
- Moyenne calculeMoyenneNotesPonderee(List<Note> listeNotes,\r
- Boolean ignoreAnnotations = false,\r
- int precision = PRECISION_PAR_DEFAUT) {\r
-\r
- if (listeNotes == null) {\r
- log.debug("La liste des notes est null")\r
- return null\r
- }\r
-\r
- if (!ignoreAnnotations) {\r
- listeNotes.sort()\r
- }\r
-\r
- List<NoteInfo> noteInfos = []\r
- listeNotes?.each { Note note ->\r
- if (note.evaluation != null) {\r
-\r
- Moyenne moyenne = null\r
- if (note.valeurNumerique != null) {\r
- // Normalisation à 20\r
- moyenne = new Moyenne(\r
- rameneSur20(note.valeurNumerique, note.evaluation.noteMaxPossible)\r
- )\r
- } else {\r
- moyenne = new Moyenne(note.valeurTextuelle)\r
- }\r
-\r
- noteInfos << new NoteInfo(\r
- moyenne,\r
- note.evaluation.coefficient, // coeff\r
- false // notes ne sont pas optionel, ce sont les service qui sont optionels\r
- )\r
- }\r
- }\r
-\r
- return calculeMoyennePonderee(noteInfos, ignoreAnnotations, precision)\r
- }\r
-\r
- /**\r
- * Calcule la moyenne pondérée : (a1*coef1 + a2*coef2 + ...) / (coef1 + coef2 + ...).\r
- * L'optionalité du service est prise en compte.\r
- * @param listeNoteInfo liste des NoteInfo\r
- * @param ignoreAnnotations s'il faut ignorer les annotations\r
- * (pour exemple pour les moyennes des classes)\r
- * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)\r
- * @return moyenne pondérée\r
- * @author msan\r
- * @author bper\r
- */\r
- Moyenne calculeMoyennePonderee(List<NoteInfo> listeNoteInfo,\r
- Boolean ignoreAnnotations = false,\r
- int precision = PRECISION_PAR_DEFAUT) {\r
- Moyenne moyenne = null\r
- if (listeNoteInfo) {\r
- BigDecimal total = 0\r
- BigDecimal count = 0\r
- Boolean notesComptabilisees = false // pour voir s'il y avait des notes utilisées pour le calcul\r
- NoteTextuelle dernierNoteTextuelle = null\r
-\r
- listeNoteInfo.each { NoteInfo noteInfo ->\r
- BigDecimal valeurNumerique = noteInfo.moyenne?.valeurNumerique\r
- BigDecimal coeff = noteInfo.coeff\r
- NoteTextuelle noteTextuelle = noteInfo.moyenne?.valeurTextuelle\r
-\r
- if (noteTextuelle != null) {\r
- // on note la derniere note textuelle\r
- dernierNoteTextuelle = noteTextuelle\r
- } else if (valeurNumerique != null && coeff != null) {\r
- notesComptabilisees = true\r
- if (noteInfo.optionel) {\r
- BigDecimal diff = valeurNumerique.subtract(SEUIL_OPTIONEL)\r
- // seulement les notes audessus du seuil sont comptabilisées\r
- if (diff > 0) {\r
- // on ajoute la difference multipliée par le coefficient\r
- total += (diff * coeff)\r
- // count n'est pas incrementé\r
- }\r
- } else {\r
- // on ajoute la valeur multipliée par le coefficient\r
- total += (valeurNumerique * coeff)\r
- count += coeff\r
- }\r
- }\r
- }\r
-\r
- if (count > 0) {\r
- // notes numeriques saisies\r
- moyenne = new Moyenne(total.divide(count, precision, RoundingMode.HALF_UP))\r
- // il ne faut pas depasser Moyenne Maximal\r
- if (moyenne.valeurNumerique > MOYENNE_MAX) {\r
- moyenne.valeurNumerique = MOYENNE_MAX\r
- }\r
-\r
- } else if (dernierNoteTextuelle != null) {\r
- // seuelement les annotations saisises\r
- moyenne = new Moyenne(dernierNoteTextuelle)\r
-\r
- } else if (notesComptabilisees) {\r
- // ça arrive quand on calcul la moyenne d'une période où il n'y a\r
- // que des services optionels (ils sont ajoutés suelement dans le\r
- // total, pas dans le count)\r
- moyenne = null // on met null, comme dans NotaBene\r
- }\r
- }\r
-\r
- return moyenne\r
- }\r
-\r
- /**\r
- * Calcule la moyenne arithmétique : (a1 + a2 + ... + aN)/N\r
- * @param listeValeurs liste des valeurs BigDecimal/ NoteTextuelle\r
- * @param ignoreAnnotations s'il faut ignorer les annotations\r
- * (pour exemple pour les moyennes des classes)\r
- * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)\r
- * @return moyenne arithmétique\r
- * @author msan\r
- * @author bper\r
- */\r
- Moyenne calculeMoyenne(List listeValeurs,\r
- Boolean ignoreAnnotations = false,\r
- int precision = PRECISION_PAR_DEFAUT) {\r
- Moyenne moyenne = null\r
- if (listeValeurs) {\r
- BigDecimal total = 0\r
- BigDecimal count = 0\r
- NoteTextuelle dernierNoteTextuelle = null\r
- listeValeurs.each {def valeur ->\r
- if (valeur != null) {\r
- if (valeur instanceof BigDecimal) {\r
- total += valeur\r
- count++\r
- } else if (valeur instanceof NoteTextuelle && !ignoreAnnotations) {\r
- dernierNoteTextuelle = valeur\r
- }\r
- }\r
- }\r
-\r
- if (count > 0) {\r
- // notes numeriques saisies\r
- moyenne = new Moyenne(total.divide(count, precision, RoundingMode.HALF_UP))\r
- // il ne faut pas depasser Moyenne Maximal\r
- if (moyenne.valeurNumerique > MOYENNE_MAX) {\r
- moyenne.valeurNumerique = MOYENNE_MAX\r
- }\r
- } else if (dernierNoteTextuelle != null && !ignoreAnnotations) {\r
- // seuelement les annotations saisises\r
- moyenne = new Moyenne(dernierNoteTextuelle)\r
-\r
- }\r
-\r
- }\r
- return moyenne\r
- }\r
-\r
- /**\r
- * Ramene la note sur 20\r
- * @param valeurNote note saisie\r
- * @param noteMax note maximale (l'échelle)\r
- * @return note ramenée à 20\r
- */\r
- BigDecimal rameneSur20(def valeurNote, BigDecimal noteMax) {\r
- if (valeurNote instanceof BigDecimal) {\r
- return (valeurNote != null && noteMax != 20) ? ((valeurNote * 20) / noteMax) : valeurNote\r
- } else {\r
- return valeurNote\r
- }\r
- }\r
-\r
-}\r
+package org.lilie.services.eliot.notes.resultat
+
+import org.lilie.services.eliot.notes.Note
+import java.math.RoundingMode
+import org.lilie.services.eliot.notes.NoteTextuelle
+import org.lilie.services.eliot.resultat.Moyenne
+
+/**
+ * Calculation general des moyennes
+ * @author msan
+ */
+class CalculationService {
+
+ static transactional = true
+
+ // précision 10 = 0.0000000001 - la même précision qui est utilisée par JavaScript
+ // Il faut avoir la même précision pour que les moyennes presentées dans
+ // Notes et appreciations (calculées par JavaScript) et dans les Synthèses
+ // (caluclées par Groovy) soient les mêmes
+ private static final int PRECISION_PAR_DEFAUT = 10
+ private static final BigDecimal MOYENNE_MAX = 20 // par tradition si la moyenne dépasse 20, elle est trimée à 20
+ private static final BigDecimal SEUIL_OPTIONEL = 10 // si le service est défini comme optionel,
+ // seulement la difference positive entre la note et le seuil est pris en compte dans le numérateur
+
+ /**
+ * Min des valeurs.
+ * @param bigDecimals valeurs
+ * @return Min des valeurs
+ */
+ BigDecimal calculeMin(List<BigDecimal> bigDecimals) {
+ return (BigDecimal) bigDecimals.min()
+ }
+
+ /**
+ * Max des valeurs.
+ * @param bigDecimals valeurs
+ * @return Max des cvaleurs.
+ */
+ BigDecimal calculeMax(List<BigDecimal> bigDecimals) {
+ return (BigDecimal) bigDecimals.max()
+ }
+
+ /**
+ * Calcule la moyenne arithmétique : (a1 + a2 + ... + aN)/N
+ * Important! La méthode ne verifie pas (car trop lourd) si les services
+ * sont évaluables ou pas.
+ * @param listeNotes liste des Notes
+ * @param ignoreAnnotations s'il faut ignorer les annotations
+ * (pour exemple pour les moyennes des classes)
+ * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)
+ * @return moyenne arithmétique
+ * @author msan
+ * @author bper
+ */
+ Moyenne calculeMoyenneNotes(List<Note> listeNotes,
+ Boolean ignoreAnnotations = false,
+ int precision = PRECISION_PAR_DEFAUT) {
+
+ if (!ignoreAnnotations) {
+ listeNotes.sort()
+ }
+
+ List listeValeurs = listeNotes?.collect {
+ if (it.valeurNumerique != null) {
+ return it.valeurNumerique
+ } else {
+ return it.valeurTextuelle
+ }
+ }
+ return calculeMoyenne(listeValeurs, ignoreAnnotations, precision)
+ }
+
+ /**
+ * Calcule la moyenne pondérée : (a1*coef1 + a2*coef2 + ...) / (coef1 + coef2 + ...)
+ * Important! La méthode ne verifie pas (car trop lourd) si les services
+ * sont évaluables ou pas.
+ * Important! Pour éviter les N+1 requetes if faut passer la liste des notes
+ * "fetchées" avec les evaluations
+ * N.B. Les notes sont ramenées à 20 (la noteMax est utilisé comme une échelle)
+ * @param listeNotes liste des notes
+ * @param ignoreAnnotations s'il faut ignorer les annotations
+ * (pour exemple pour les moyennes des classes)
+ * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)
+ * @return moyenne pondérée
+ * @author msan
+ * @author bper
+ */
+ Moyenne calculeMoyenneNotesPonderee(List<Note> listeNotes,
+ Boolean ignoreAnnotations = false,
+ int precision = PRECISION_PAR_DEFAUT) {
+
+ if (listeNotes == null) {
+ log.debug("La liste des notes est null")
+ return null
+ }
+
+ if (!ignoreAnnotations) {
+ listeNotes.sort()
+ }
+
+ List<NoteInfo> noteInfos = []
+ listeNotes?.each { Note note ->
+ if (note.evaluation != null) {
+
+ Moyenne moyenne = null
+ if (note.valeurNumerique != null) {
+ moyenne = new Moyenne(note.valeurNumerique)
+ } else {
+ moyenne = new Moyenne(note.valeurTextuelle)
+ }
+
+ BigDecimal coeff = note.evaluation.coefficient
+ // S'il faut faire le ramenage sur 20 on change le coefficiant
+ // qui a le ramenage sur 20 de calcul comme consequence
+ if (note.evaluation.isRamenageSur20Necessaire()) {
+ coeff = (coeff * 20) / note.evaluation.noteMaxPossible
+ }
+
+ /*
+ Calcule sans ramenage sur 20:
+ moyenne = (n1*c1 + n2*c2 )/(max1*c1 + max2*c2 )*20
+ Calcule avec ramenage sur 20:
+ moyenne = (n1*c1*20/max1 + n2*c2*20/max2)/(max1*c1*20/max1 + max2*c2*20/max2)*20
+ = (n1*c1*20/max1 + n2*c2*20/max2)/( c1 + c2 )
+ */
+
+ noteInfos << new NoteInfo(
+ moyenne,
+ coeff, // coeff
+ false, // notes ne sont pas optionel, ce sont les service qui sont optionels
+ note.evaluation.noteMaxPossible
+ )
+ }
+ }
+
+ return calculeMoyennePonderee(noteInfos, ignoreAnnotations, precision)
+ }
+
+ /**
+ * Calcule la moyenne pondérée : (a1*coef1 + a2*coef2 + ...) / (coef1 + coef2 + ...).
+ * Si la noteMaximale est != 20 la moyenne est calculee comme: (a1*coef1*20/max1 + a2*coef2*20/max2 + ...) / (coef1*20/max1 + coef2*20/max2 + ...)*20.
+ * L'optionalité du service est prise en compte.
+ * @param listeNoteInfo liste des NoteInfo
+ * @param ignoreAnnotations s'il faut ignorer les annotations
+ * (pour exemple pour les moyennes des classes)
+ * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)
+ * @return moyenne pondérée
+ * @author msan
+ * @author bper
+ */
+ Moyenne calculeMoyennePonderee(List<NoteInfo> listeNoteInfo,
+ Boolean ignoreAnnotations = false,
+ int precision = PRECISION_PAR_DEFAUT) {
+ Moyenne moyenne = null
+ if (listeNoteInfo) {
+ BigDecimal enHaut = 0 // Partie en haut - numerateur
+ BigDecimal enBas = 0 // Partie en bas - denominateur
+
+ Boolean notesComptabilisees = false // pour voir s'il y avait des notes utilisées pour le calcul
+ NoteTextuelle dernierNoteTextuelle = null
+
+ listeNoteInfo.each { NoteInfo noteInfo ->
+ BigDecimal valeurNumerique = noteInfo.moyenne?.valeurNumerique
+ BigDecimal coeff = noteInfo.coeff
+ BigDecimal noteMax = noteInfo.noteMaximal
+ NoteTextuelle noteTextuelle = noteInfo.moyenne?.valeurTextuelle
+
+ if (noteTextuelle != null) {
+ // on note la derniere note textuelle
+ dernierNoteTextuelle = noteTextuelle
+ } else if (valeurNumerique != null && coeff != null) {
+ notesComptabilisees = true
+ if (noteInfo.optionel) {
+ BigDecimal diff = valeurNumerique.subtract(SEUIL_OPTIONEL)
+ // seulement les notes audessus du seuil sont comptabilisées
+ if (diff > 0) {
+ // on ajoute la difference multipliée par le coefficient
+ enHaut += (diff * coeff)
+ // count n'est pas incrementé
+ }
+ } else {
+ // on ajoute la valeur multipliée par le coefficient
+ enHaut += (valeurNumerique * coeff)
+ enBas += (coeff * noteMax)
+ }
+ }
+ }
+
+ if (enBas > 0) {
+ // notes numeriques saisies
+ // moyenne = (enHaut * 20) / enBas
+
+ enHaut *= 20
+ moyenne = new Moyenne(enHaut.divide(enBas, precision, RoundingMode.HALF_UP))
+ // il ne faut pas depasser Moyenne Maximal
+ if (moyenne.valeurNumerique > MOYENNE_MAX) {
+ moyenne.valeurNumerique = MOYENNE_MAX
+ }
+
+ } else if (dernierNoteTextuelle != null) {
+ // seuelement les annotations saisises
+ moyenne = new Moyenne(dernierNoteTextuelle)
+
+ } else if (notesComptabilisees) {
+ // ça arrive quand on calcul la moyenne d'une période où il n'y a
+ // que des services optionels (ils sont ajoutés seulement dans le
+ // total, pas dans le count)
+ moyenne = null // on met null, comme dans NotaBene
+ }
+ }
+
+ return moyenne
+ }
+
+ /**
+ * Calcule la moyenne arithmétique : (a1 + a2 + ... + aN)/N
+ * @param listeValeurs liste des valeurs BigDecimal/ NoteTextuelle
+ * @param ignoreAnnotations s'il faut ignorer les annotations
+ * (pour exemple pour les moyennes des classes)
+ * @param precision nombre de chiffres après la virgule (précision=2 => 0,01)
+ * @return moyenne arithmétique
+ * @author msan
+ * @author bper
+ */
+ Moyenne calculeMoyenne(List listeValeurs,
+ Boolean ignoreAnnotations = false,
+ int precision = PRECISION_PAR_DEFAUT) {
+ Moyenne moyenne = null
+ if (listeValeurs) {
+ BigDecimal total = 0
+ BigDecimal count = 0
+ NoteTextuelle dernierNoteTextuelle = null
+ listeValeurs.each {def valeur ->
+ if (valeur != null) {
+ if (valeur instanceof BigDecimal) {
+ total += valeur
+ count++
+ } else if (valeur instanceof NoteTextuelle && !ignoreAnnotations) {
+ dernierNoteTextuelle = valeur
+ }
+ }
+ }
+
+ if (count > 0) {
+ // notes numeriques saisies
+ moyenne = new Moyenne(total.divide(count, precision, RoundingMode.HALF_UP))
+ // il ne faut pas depasser Moyenne Maximal
+ if (moyenne.valeurNumerique > MOYENNE_MAX) {
+ moyenne.valeurNumerique = MOYENNE_MAX
+ }
+ } else if (dernierNoteTextuelle != null && !ignoreAnnotations) {
+ // seuelement les annotations saisises
+ moyenne = new Moyenne(dernierNoteTextuelle)
+
+ }
+
+ }
+ return moyenne
+ }
+
+ /**
+ * Ramene la note sur 20
+ * @param valeurNote note saisie
+ * @param noteMax note maximale (l'échelle)
+ * @return note ramenée à 20
+ */
+ BigDecimal rameneSur20(def valeurNote, BigDecimal noteMax) {
+ if (valeurNote instanceof BigDecimal) {
+ return (valeurNote != null && noteMax != 20) ? ((valeurNote * 20) / noteMax) : valeurNote
+ } else {
+ return valeurNote
+ }
+ }
+
+}
Boolean optionel // service est optionel == seulement la difference au
// dessus de 10 est prise en compte dans le numérateur
// (rien ajuoté dans le dénominateur)
+ BigDecimal noteMaximal
- NoteInfo(Moyenne moyenne, BigDecimal coeff, Boolean optionel) {
+ NoteInfo(Moyenne moyenne, BigDecimal coeff, Boolean optionel, BigDecimal noteMaximal = 20) {
this.moyenne = moyenne
this.coeff = coeff
this.optionel = optionel
+ this.noteMaximal = noteMaximal
}
}
// Libellés
<g:setJsVar value="ConfigServeur.libelle"/>
<g:setJsValueMessage name="titre" code="eliot.notes.libelle.titre"/>
+ <g:setJsValueMessage name="ramenerSur20" code="eliot.notes.libelle.ramenerSur20"/>
<g:setJsValueMessage name="coeff" code="eliot.notes.libelle.coeff"/>
<g:setJsValueMessage name="creer" code="eliot.notes.libelle.creer"/>
<g:setJsValueMessage name="modifier" code="eliot.notes.libelle.modifier"/>
*/
eliot.notes.saisie.evaluation.ConfigServeur = {
- messages:{
- attention: undefined,
- commitChanges : undefined,
- enregistrer : undefined,
- annuler : undefined,
- erreurSuperieur : undefined,
- loading : undefined,
- evaluationModifieSucces: undefined,
- evaluationModifieEchou: undefined,
- evaluationSupprimeSucces: undefined,
- evaluationSupprimeEchou: undefined,
- supprimerEvaluation: undefined,
- supprimerDevoir: undefined,
- confirmationSuppression: undefined,
- evaluationCreerSucces: undefined,
- evaluationCreerEchou: undefined,
- erreurNomEval: undefined,
- noteDejaSaisie: undefined
- },
+ messages:{
+ attention:undefined,
+ commitChanges:undefined,
+ enregistrer:undefined,
+ annuler:undefined,
+ erreurSuperieur:undefined,
+ loading:undefined,
+ evaluationModifieSucces:undefined,
+ evaluationModifieEchou:undefined,
+ evaluationSupprimeSucces:undefined,
+ evaluationSupprimeEchou:undefined,
+ supprimerEvaluation:undefined,
+ supprimerDevoir:undefined,
+ confirmationSuppression:undefined,
+ evaluationCreerSucces:undefined,
+ evaluationCreerEchou:undefined,
+ erreurNomEval:undefined,
+ noteDejaSaisie:undefined
+ },
- url:{
- urlListeEvaluations: undefined,
- urlCreeEvaluation: undefined,
- urlModifieEvaluation: undefined,
- urlSupprimerEvaluation: undefined,
- urlSupprimerEvaluationLierNote: undefined
- },
+ url:{
+ urlListeEvaluations:undefined,
+ urlCreeEvaluation:undefined,
+ urlModifieEvaluation:undefined,
+ urlSupprimerEvaluation:undefined,
+ urlSupprimerEvaluationLierNote:undefined
+ },
- libelle:{
- titre :undefined,
- coeff : undefined,
- creer : undefined,
- modifier : undefined,
- supprimer : undefined,
- dateEvaluation: undefined,
- noteMax: undefined,
- publiable: undefined,
- sousMatiere: undefined,
- oui: undefined,
- non: undefined,
- typeActivite: undefined
- },
+ libelle:{
+ titre:undefined,
+ coeff:undefined,
+ creer:undefined,
+ modifier:undefined,
+ supprimer:undefined,
+ dateEvaluation:undefined,
+ noteMax:undefined,
+ publiable:undefined,
+ ramenerSur20:undefined,
+ sousMatiere:undefined,
+ oui:undefined,
+ non:undefined,
+ typeActivite:undefined
+ },
- icon:{
- creation : undefined,
- modification : undefined,
- suppression : undefined
- },
+ icon:{
+ creation:undefined,
+ modification:undefined,
+ suppression:undefined
+ },
- data: {
- enseignementId: undefined,
- enseignantId: undefined,
- typePeriodeId: undefined,
- serviceId: undefined,
+ data:{
+ enseignementId:undefined,
+ enseignantId:undefined,
+ typePeriodeId:undefined,
+ serviceId:undefined,
- hasModaliteMatiere: undefined,
- modaliteMatieres: [],
+ hasModaliteMatiere:undefined,
+ modaliteMatieres:[],
- verrouille: undefined,
- avertissement: undefined,
+ verrouille:undefined,
+ avertissement:undefined,
- limitDebutDevoirs: undefined,
- limitFinDevoirs: undefined,
+ limitDebutDevoirs:undefined,
+ limitFinDevoirs:undefined,
- typeActivites: []
- }
+ typeActivites:[]
+ }
};
\ No newline at end of file
*/
eliot.notes.saisie.evaluation.EvalutionView = Ext.extend(Ext.util.Observable, {
- constructor: function(config) {
-
- this.ns = eliot.notes.saisie.evaluation;
- this.ConfigServeur = this.ns.ConfigServeur;
- this.Constantes = this.ns.Constantes;
-
- // Définition de la configuration par défaut
- var cfg = {
- evaluationController: undefined
- };
-
- // Charge la config passée en paramètre
- Ext.apply(cfg, config);
-
- this.evaluationController = cfg.evaluationController;
- this.rowIndexAModifier = undefined;
-
- this.addEvents(
- /**
- * @event evaluationSelectionneeChangee déclenché lorsque evaluation
- * sélectionnée
- * @param evaluation evaluation sélectionnée
- */
- this.Constantes.eventId.evaluationSelectionneeChangee,
-
- /**
- * @event actionEditCancel déclenché lorsque on clique sur
- * bonton 'cancel' en mode édition ou création
- */
- this.Constantes.eventId.actionEditCancel,
-
- /**
- * @event on est entre dans le mode d'edition
- */
- this.Constantes.eventId.modificationCommencee,
-
- /**
- * @event on est sorti de mode d'edition
- */
- this.Constantes.eventId.modificationFinie,
-
- /**
- * @event Note maximale modifiée
- * @param rowIndex
- * @param valeur de la note maximale
- * @param coefficientEditor
- */
- this.Constantes.eventId.noteMaximaleModifiee,
-
- /**
- * @event Coefficient modifié
- * @param rowIndex
- * @param valeur de la note maximale
- */
- this.Constantes.eventId.coefficientModifiee
+ constructor:function (config) {
+
+ this.ns = eliot.notes.saisie.evaluation;
+ this.ConfigServeur = this.ns.ConfigServeur;
+ this.Constantes = this.ns.Constantes;
+
+ // Définition de la configuration par défaut
+ var cfg = {
+ evaluationController:undefined
+ };
+
+ // Charge la config passée en paramètre
+ Ext.apply(cfg, config);
+
+ this.evaluationController = cfg.evaluationController;
+ this.rowIndexAModifier = undefined;
+
+ this.addEvents(
+ /**
+ * @event evaluationSelectionneeChangee déclenché lorsque evaluation
+ * sélectionnée
+ * @param evaluation evaluation sélectionnée
+ */
+ this.Constantes.eventId.evaluationSelectionneeChangee,
+
+ /**
+ * @event actionEditCancel déclenché lorsque on clique sur
+ * bonton 'cancel' en mode édition ou création
+ */
+ this.Constantes.eventId.actionEditCancel,
+
+ /**
+ * @event on est entre dans le mode d'edition
+ */
+ this.Constantes.eventId.modificationCommencee,
+
+ /**
+ * @event on est sorti de mode d'edition
+ */
+ this.Constantes.eventId.modificationFinie,
+
+ /**
+ * @event Note maximale modifiée
+ * @param rowIndex
+ * @param valeur de la note maximale
+ * @param coefficientEditor
+ */
+ this.Constantes.eventId.noteMaximaleModifiee,
+
+ /**
+ * @event Coefficient modifié
+ * @param rowIndex
+ * @param valeur de la note maximale
+ */
+ this.Constantes.eventId.coefficientModifiee
);
- // Plugin pour edition
- this.editor = new Ext.ux.grid.RowEditor({
- saveText: this.ConfigServeur.messages.enregistrer,
- cancelText: this.ConfigServeur.messages.annuler,
- commitChangesText: this.ConfigServeur.messages.commitChanges,
- errorText: this.ConfigServeur.messages.attention,
- errorSummary: false // Ne pas activer! Cette fonctionnalité est très mal faite.
- });
-
- /**
- * Ajouter un listener sur editor pour capter l'évènement
- * "afteredit" et "canceledit"
- */
- this.editor.addListener(
- 'afteredit',
- function(roweditor, changes, record, rowIndex) {
- this.fireEvent(this.Constantes.eventId.actionAfterEdit, record, changes);
- },
- this
+ // Plugin pour edition
+ this.editor = new Ext.ux.grid.RowEditor({
+ saveText:this.ConfigServeur.messages.enregistrer,
+ cancelText:this.ConfigServeur.messages.annuler,
+ commitChangesText:this.ConfigServeur.messages.commitChanges,
+ errorText:this.ConfigServeur.messages.attention,
+ errorSummary:false // Ne pas activer! Cette fonctionnalité est très mal faite.
+ });
+
+ /**
+ * Ajouter un listener sur editor pour capter l'évènement
+ * "afteredit" et "canceledit"
+ */
+ this.editor.addListener(
+ 'afteredit',
+ function (roweditor, changes, record, rowIndex) {
+ this.fireEvent(this.Constantes.eventId.actionAfterEdit, record, changes);
+ },
+ this
);
- this.editor.addListener(
- 'canceledit',
- function(roweditor, boolean) {
- this.fireEvent(this.Constantes.eventId.actionEditCancel);
- },
- this
+ this.editor.addListener(
+ 'canceledit',
+ function (roweditor, boolean) {
+ this.fireEvent(this.Constantes.eventId.actionEditCancel);
+ },
+ this
);
- this.editor.addListener(
- 'hide',
- function() {
- this.fireEvent(this.Constantes.eventId.modificationFinie);
- },
- this
+ this.editor.addListener(
+ 'hide',
+ function () {
+ this.fireEvent(this.Constantes.eventId.modificationFinie);
+ },
+ this
);
- if (this.ConfigServeur.data.verrouille === true) {
- this.editor.addListener(
- 'beforeedit',
- function() {
- return false;
- },
- this
- );
- }
- else {
- this.editor.addListener(
- 'beforeedit',
- function(editor, rowIndex) {
- this.setMinValueForNoteMax(rowIndex)
- this.fireEvent(this.Constantes.eventId.modificationCommencee);
- },
- this
- );
- }
+ if (this.ConfigServeur.data.verrouille === true) {
+ this.editor.addListener(
+ 'beforeedit',
+ function () {
+ return false;
+ },
+ this
+ );
+ }
+ else {
+ this.editor.addListener(
+ 'beforeedit',
+ function (editor, rowIndex) {
+ this.setMinValueForNoteMax(rowIndex)
+ this.fireEvent(this.Constantes.eventId.modificationCommencee);
+ },
+ this
+ );
+ }
- var modaliteMatiereStore = this.evaluationController.modaliteMatiereStore;
- var typeActiviteStore = this.evaluationController.typeActiviteStore;
-
- var columns = [];
-
- columns.push(
- {
- header: this.ConfigServeur.libelle.titre,
- dataIndex: 'titre',
- width: 200,
- resizable: true,
- sortable: true,
- align: 'left',
- editor: new Ext.form.TextField({
- allowBlank: false,
- blankText: this.ConfigServeur.messages.erreurNomEval,
- maxLength : 20
- }),
- renderer: function(value) {
- return Encoder.htmlEncode(value);
- }
- });
-
- if (this.ConfigServeur.data.hasModaliteMatiere === true) {
- columns.push(
- {
- header: this.ConfigServeur.libelle.sousMatiere,
- dataIndex: 'modaliteMatiereId',
- width: 200,
- resizable: true,
- sortable: true,
- align: 'left',
- editor: new Ext.form.ComboBox({
- store: this.evaluationController.modaliteMatiereStore,
- valueField: 'id',
- displayField: 'code',
- allowBlank: false,
- mode: 'local',
- triggerAction: 'all',
- editable: false
- }),
- renderer: function(value) {
- var data = modaliteMatiereStore.getById(value);
-
- if (data !== undefined) {
- return data.get('code');
- }
- else {
- return '';
- }
+ var modaliteMatiereStore = this.evaluationController.modaliteMatiereStore;
+ var typeActiviteStore = this.evaluationController.typeActiviteStore;
+
+ var columns = [];
+
+ columns.push(
+ {
+ header:this.ConfigServeur.libelle.titre,
+ dataIndex:'titre',
+ width:200,
+ resizable:true,
+ sortable:true,
+ align:'left',
+ editor:new Ext.form.TextField({
+ allowBlank:false,
+ blankText:this.ConfigServeur.messages.erreurNomEval,
+ maxLength:20
+ }),
+ renderer:function (value) {
+ return Encoder.htmlEncode(value);
+ }
+ });
+
+ if (this.ConfigServeur.data.hasModaliteMatiere === true) {
+ columns.push(
+ {
+ header:this.ConfigServeur.libelle.sousMatiere,
+ dataIndex:'modaliteMatiereId',
+ width:200,
+ resizable:true,
+ sortable:true,
+ align:'left',
+ editor:new Ext.form.ComboBox({
+ store:this.evaluationController.modaliteMatiereStore,
+ valueField:'id',
+ displayField:'code',
+ allowBlank:false,
+ mode:'local',
+ triggerAction:'all',
+ editable:false
+ }),
+ renderer:function (value) {
+ var data = modaliteMatiereStore.getById(value);
+
+ if (data !== undefined) {
+ return data.get('code');
+ }
+ else {
+ return '';
+ }
+ }
+ });
}
- });
- }
- var limitDebutDevoirs = this.ConfigServeur.data.limitDebutDevoirs != '' ?
- Date.parseDate(this.ConfigServeur.data.limitDebutDevoirs, 'd/m/Y') : null;
-
- var limitFinDevoirs = this.ConfigServeur.data.limitFinDevoirs ?
- Date.parseDate(this.ConfigServeur.data.limitFinDevoirs, 'd/m/Y') : null;
-
- var coefficientEditor = new Ext.form.NumberField({
- decimalSeparator: '.',
- allowBlank: false,
- allowNegative: false,
- decimalPrecision: 2,
- maxValue: 99,
- maxText: this.ConfigServeur.messages.erreurSuperieur + " " + 99,
- listeners: {
- change: function() {
- this.fireEvent(
- this.Constantes.eventId.coefficientModifiee,
- this.rowIndexAModifier);
- },
- scope: this
- }
- });
-
- columns.push(
- {
- header: this.ConfigServeur.libelle.dateEvaluation,
- dataIndex: 'dateEvaluation',
- align:'center',
- width: 100,
- sortable: true,
- renderer: Ext.util.Format.dateRenderer('d/m/Y'),
- editor: new Ext.form.DateField({
- allowBlank: false,
- format: 'd/m/Y',
- minValue: limitDebutDevoirs,
- maxValue: limitFinDevoirs
- })
- },
- {
- xtype: 'numbercolumn',
- header: this.ConfigServeur.libelle.noteMax,
- dataIndex: 'noteMax',
- align:'center',
- width: 100,
- editor: new Ext.form.NumberField({
- id: 'noteMaxEditor',
- decimalSeparator: '.',
- allowBlank: false,
- allowNegative: false,
- decimalPrecision: 2,
- validator : function(value) {
- if (value === '0') {
- return false;
- }
- },
- listeners: {
- change: function(item, newValue, oldValue) {
- this.fireEvent(
- this.Constantes.eventId.noteMaximaleModifiee,
- this.rowIndexAModifier,
- newValue,
- coefficientEditor);
- },
- scope: this
+ var limitDebutDevoirs = this.ConfigServeur.data.limitDebutDevoirs != '' ?
+ Date.parseDate(this.ConfigServeur.data.limitDebutDevoirs, 'd/m/Y') : null;
+
+ var limitFinDevoirs = this.ConfigServeur.data.limitFinDevoirs ?
+ Date.parseDate(this.ConfigServeur.data.limitFinDevoirs, 'd/m/Y') : null;
+
+ var coefficientEditor = new Ext.form.NumberField({
+ decimalSeparator:'.',
+ allowBlank:false,
+ allowNegative:false,
+ decimalPrecision:2,
+ maxValue:99,
+ maxText:this.ConfigServeur.messages.erreurSuperieur + " " + 99,
+ listeners:{
+ change:function () {
+ this.fireEvent(
+ this.Constantes.eventId.coefficientModifiee,
+ this.rowIndexAModifier);
+ },
+ scope:this
+ }
+ });
+
+ columns.push(
+ {
+ header:this.ConfigServeur.libelle.dateEvaluation,
+ dataIndex:'dateEvaluation',
+ align:'center',
+ width:100,
+ sortable:true,
+ renderer:Ext.util.Format.dateRenderer('d/m/Y'),
+ editor:new Ext.form.DateField({
+ allowBlank:false,
+ format:'d/m/Y',
+ minValue:limitDebutDevoirs,
+ maxValue:limitFinDevoirs
+ })
+ },
+ {
+ xtype:'numbercolumn',
+ header:this.ConfigServeur.libelle.noteMax,
+ dataIndex:'noteMax',
+ align:'center',
+ width:100,
+ editor:new Ext.form.NumberField({
+ id:'noteMaxEditor',
+ decimalSeparator:'.',
+ allowBlank:false,
+ allowNegative:false,
+ decimalPrecision:2,
+ validator:function (value) {
+ if (value === '0') {
+ return false;
+ }
+ },
+ listeners:{
+ change:function (item, newValue, oldValue) {
+ this.fireEvent(
+ this.Constantes.eventId.noteMaximaleModifiee,
+ this.rowIndexAModifier,
+ newValue,
+ coefficientEditor);
+ },
+ scope:this
+ }
+ })
+ },
+ {
+ xtype:'booleancolumn',
+ header:this.ConfigServeur.libelle.ramenerSur20,
+ dataIndex:'ramenerSur20',
+ align:'center',
+ width:75,
+ sortable:true,
+ trueText:this.ConfigServeur.libelle.oui,
+ falseText:this.ConfigServeur.libelle.non,
+ editor:{
+ xtype:'checkbox'
+ }
+ },
+ {
+ xtype:'numbercolumn',
+ header:this.ConfigServeur.libelle.coeff,
+ dataIndex:'coefficient',
+ align:'center',
+ width:75,
+ editor:coefficientEditor
+ },
+ {
+ header:this.ConfigServeur.libelle.typeActivite,
+ dataIndex:'typeActiviteId',
+ width:200,
+ resizable:true,
+ sortable:true,
+ align:'left',
+ editor:new Ext.form.ComboBox({
+ store:this.evaluationController.typeActiviteStore,
+ valueField:'id',
+ displayField:'libelle',
+ allowBlank:false,
+ mode:'local',
+ triggerAction:'all',
+ editable:false,
+ tpl:this.getTplComboType()
+ }),
+ renderer:function (value) {
+ var data = typeActiviteStore.getById(value);
+
+ if (data !== undefined) {
+ return data.get('libelle');
+ }
+ else {
+ return '';
+ }
+ }
+ },
+ {
+ xtype:'booleancolumn',
+ header:this.ConfigServeur.libelle.publiable,
+ dataIndex:'publiable',
+ align:'center',
+ width:75,
+ sortable:true,
+ trueText:this.ConfigServeur.libelle.oui,
+ falseText:this.ConfigServeur.libelle.non,
+ editor:{
+ xtype:'checkbox'
+ }
+ });
+
+ // Initialiser les colonnes du tableau des évaluations
+ var cm = new Ext.grid.ColumnModel({
+ defaults:{
+ menuDisabled:true,
+ resizable:false,
+ align:'left',
+ fixed:true
+ },
+ columns:columns
+ });
+
+ var viewConfig = undefined;
+
+ if (this.ConfigServeur.data.verrouille === true) {
+ viewConfig = {
+ getRowClass:function () {
+ return 'locked';
+ }
+ }
}
- })
+
+ // Construction du grid des évaluations
+ this.evaluationGrid = new Ext.grid.GridPanel({
+ store:this.evaluationController.evaluationStore,
+ enableColumnMove:false,
+ autoSize:false,
+ colModel:cm,
+ height:200,
+ plugins:[this.editor],
+ cls:'portal-default_table',
+ margins:'0 5 5 5',
+ border:true,
+ columnLines:true,
+ stripeRows:true,
+ loadMask:{
+ msg:this.ConfigServeur.messages.loading,
+ store:this.evaluationController.evaluationStore
+ },
+ viewConfig:viewConfig
+ });
+
+ this.observeEvaluationGrid();
},
- {
- xtype: 'numbercolumn',
- header: this.ConfigServeur.libelle.coeff,
- dataIndex: 'coefficient',
- align:'center',
- width: 75,
- editor: coefficientEditor
+
+
+ getTplComboType:function () {
+ return new Ext.XTemplate(
+ '<tpl for=".">',
+ '<div class="x-combo-list-item">{[this.getLibelle(values)]}',
+ '</div>',
+ '</tpl>',
+ {
+ getLibelle:function (values) {
+ return values.libelleAvecCode;
+ }
+ }
+ );
},
- {
- header: this.ConfigServeur.libelle.typeActivite,
- dataIndex: 'typeActiviteId',
- width: 200,
- resizable: true,
- sortable: true,
- align: 'left',
- editor: new Ext.form.ComboBox({
- store: this.evaluationController.typeActiviteStore,
- valueField: 'id',
- displayField: 'libelle',
- allowBlank: false,
- mode: 'local',
- triggerAction: 'all',
- editable: false,
- tpl: this.getTplComboType()
- }),
- renderer: function(value) {
- var data = typeActiviteStore.getById(value);
-
- if (data !== undefined) {
- return data.get('libelle');
- }
- else {
- return '';
- }
- }
+
+
+ /**
+ * La méthode permet d'observer l'évènement de changement d'evaluation selectionee
+ */
+ observeEvaluationGrid:function () {
+ this.evaluationGrid.addListener({
+ rowclick:{
+ fn:function (grid, rowIndex) {
+ this.getEvaluation(grid, rowIndex);
+ },
+ scope:this
+ }
+ });
},
- {
- xtype: 'booleancolumn',
- header: this.ConfigServeur.libelle.publiable,
- dataIndex: 'publiable',
- align: 'center',
- width: 75,
- sortable: true,
- trueText: this.ConfigServeur.libelle.oui,
- falseText: this.ConfigServeur.libelle.non,
- editor: {
- xtype: 'checkbox'
- }
- });
-
- // Initialiser les colonnes du tableau des évaluations
- var cm = new Ext.grid.ColumnModel({
- defaults:
- {
- menuDisabled: true,
- resizable: false,
- align: 'left',
- fixed: true
- },
- columns: columns
- });
-
- var viewConfig = undefined;
-
- if (this.ConfigServeur.data.verrouille === true) {
- viewConfig = {
- getRowClass: function() {
- return 'locked';
- }
- }
- }
- // Construction du grid des évaluations
- this.evaluationGrid = new Ext.grid.GridPanel({
- store: this.evaluationController.evaluationStore,
- enableColumnMove: false,
- autoSize: false,
- colModel: cm,
- height: 200,
- plugins: [this.editor],
- cls: 'portal-default_table',
- margins: '0 5 5 5',
- border: true,
- columnLines: true,
- stripeRows: true,
- loadMask: {
- msg: this.ConfigServeur.messages.loading,
- store: this.evaluationController.evaluationStore
- },
- viewConfig: viewConfig
- });
-
- this.observeEvaluationGrid();
- },
-
-
- getTplComboType: function () {
- return new Ext.XTemplate(
- '<tpl for=".">',
- '<div class="x-combo-list-item">{[this.getLibelle(values)]}',
- '</div>',
- '</tpl>',
- {
- getLibelle:function (values) {
- return values.libelleAvecCode;
- }
- }
- );
- },
-
-
- /**
- * La méthode permet d'observer l'évènement de changement d'evaluation selectionee
- */
- observeEvaluationGrid: function() {
- this.evaluationGrid.addListener({
- rowclick: {
- fn: function(grid, rowIndex) {
- this.getEvaluation(grid, rowIndex);
- },
- scope: this
- }
- });
- },
-
- /**
- * La méthode permet de récupérer un objet évaluation à partir de rowIndex
- * et déclencher un évènement "evaluationSelectionneeChangee"
- * @param grid l'objet grid
- * @param rowIndex index de la ligne dans grid
- */
- getEvaluation: function(grid, rowIndex) {
- var evaluation = grid.store.data.items[rowIndex];
- this.rowIndexAModifier = rowIndex;
- this.fireEvent(this.Constantes.eventId.evaluationSelectionneeChangee, evaluation);
- },
-
- /**
- * La méthode permet d'écouté un évènement "actionEditEvaluationSelectionnee",
- * et puis passer dans la mode d'éditon
- * @param evaluationController l'objet de evaluationController
- */
- observeEvaluationController: function(evaluationController) {
- evaluationController.addListener(
- this.Constantes.eventId.actionEditEvaluationSelectionnee,
- function() {
- this.editEvaluationSelectionnee();
- },
- this
+ /**
+ * La méthode permet de récupérer un objet évaluation à partir de rowIndex
+ * et déclencher un évènement "evaluationSelectionneeChangee"
+ * @param grid l'objet grid
+ * @param rowIndex index de la ligne dans grid
+ */
+ getEvaluation:function (grid, rowIndex) {
+ var evaluation = grid.store.data.items[rowIndex];
+ this.rowIndexAModifier = rowIndex;
+ this.fireEvent(this.Constantes.eventId.evaluationSelectionneeChangee, evaluation);
+ },
+
+ /**
+ * La méthode permet d'écouté un évènement "actionEditEvaluationSelectionnee",
+ * et puis passer dans la mode d'éditon
+ * @param evaluationController l'objet de evaluationController
+ */
+ observeEvaluationController:function (evaluationController) {
+ evaluationController.addListener(
+ this.Constantes.eventId.actionEditEvaluationSelectionnee,
+ function () {
+ this.editEvaluationSelectionnee();
+ },
+ this
);
- evaluationController.addListener(
- this.Constantes.eventId.actionSupprimerEvaluationSelectionnee,
- function(evaluation) {
- eliot.notes.Messages.afficherDialogConfirmation(
- this.ConfigServeur.messages.supprimerEvaluation,
- this.ConfigServeur.messages.supprimerDevoir + ' "' + evaluation.data.titre + '" ?',
- evaluationController.executeSupprimerEvaluation.createDelegate(this, [evaluation, false]),
- null,
- evaluation
- );
- },
- this
+ evaluationController.addListener(
+ this.Constantes.eventId.actionSupprimerEvaluationSelectionnee,
+ function (evaluation) {
+ eliot.notes.Messages.afficherDialogConfirmation(
+ this.ConfigServeur.messages.supprimerEvaluation,
+ this.ConfigServeur.messages.supprimerDevoir + ' "' + evaluation.data.titre + '" ?',
+ evaluationController.executeSupprimerEvaluation.createDelegate(this, [evaluation, false]),
+ null,
+ evaluation
+ );
+ },
+ this
);
- evaluationController.addListener(
- this.Constantes.eventId.actionCreerUneEvaluation,
- function() {
- this.editor.startEditing(0);
- },
- this
+ evaluationController.addListener(
+ this.Constantes.eventId.actionCreerUneEvaluation,
+ function () {
+ this.editor.startEditing(0);
+ },
+ this
);
- evaluationController.addListener(
- this.Constantes.eventId.ajaxRequestFailed,
- function() {
- this.evaluationGrid.loadMask.hide();
- },
- this
+ evaluationController.addListener(
+ this.Constantes.eventId.ajaxRequestFailed,
+ function () {
+ this.evaluationGrid.loadMask.hide();
+ },
+ this
);
- evaluationController.addListener(
- this.Constantes.eventId.evaluationSupprimee,
- function() {
- // on deselect tout apres la suppression
- this.evaluationGrid.getSelectionModel().clearSelections();
- this.rowIndexAModifier = undefined;
- this.fireEvent(this.Constantes.eventId.evaluationSelectionneeChangee, undefined);
- },
- this
+ evaluationController.addListener(
+ this.Constantes.eventId.evaluationSupprimee,
+ function () {
+ // on deselect tout apres la suppression
+ this.evaluationGrid.getSelectionModel().clearSelections();
+ this.rowIndexAModifier = undefined;
+ this.fireEvent(this.Constantes.eventId.evaluationSelectionneeChangee, undefined);
+ },
+ this
);
- },
-
- /**
- * La méthode permet d'éditer l'évaluation sélectionnée
- */
- editEvaluationSelectionnee: function() {
- var rowIndex = this.rowIndexAModifier;
- this.editor.startEditing(rowIndex, false);
- },
-
- /**
- * Défini la valeur minimale pour la note max en fonction des notes déjà saisies
- * @param {Number} rowIndex
- */
- setMinValueForNoteMax: function(rowIndex) {
- var evaluation = this.evaluationGrid.store.data.items[rowIndex];
- var editor = Ext.getCmp('noteMaxEditor');
- editor.minValue = evaluation.data.noteMaxSaisie;
- }
+ },
+
+ /**
+ * La méthode permet d'éditer l'évaluation sélectionnée
+ */
+ editEvaluationSelectionnee:function () {
+ var rowIndex = this.rowIndexAModifier;
+ this.editor.startEditing(rowIndex, false);
+ },
+
+ /**
+ * Défini la valeur minimale pour la note max en fonction des notes déjà saisies
+ * @param {Number} rowIndex
+ */
+ setMinValueForNoteMax:function (rowIndex) {
+ var evaluation = this.evaluationGrid.store.data.items[rowIndex];
+ var editor = Ext.getCmp('noteMaxEditor');
+ editor.minValue = evaluation.data.noteMaxSaisie;
+ }
});
\ No newline at end of file