Skip to content

Commit

Permalink
Merge pull request #26 from DSI-Ville-Noumea/dev-teo
Browse files Browse the repository at this point in the history
Dev teo
  • Loading branch information
theophilebodin authored Jul 11, 2018
2 parents ade7920 + 5961549 commit ece6b45
Show file tree
Hide file tree
Showing 8 changed files with 200 additions and 9 deletions.
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
<groupId>nc.noumea.mairie</groupId>
<artifactId>sirh-ptg-ws</artifactId>
<packaging>war</packaging>
<version>5.09</version>
<version>5.10</version>
<name>sirh-ptg-ws</name>
<properties>
<aspectj.version>1.8.10</aspectj.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ ReturnMessageDto checkAgentInactivity(ReturnMessageDto srm, Integer idAgent, Dat
ReturnMessageDto checkPrimeHsup7714(ReturnMessageDto srm, Integer idAgent, Date dateLundi, List<Pointage> pointages);

ReturnMessageDto checkDateLundiNotSuperieurDateJour(ReturnMessageDto srm, Date dateLundi);

ReturnMessageDto checkDateNotSuperieurDateJour(ReturnMessageDto srm, Date date, String errorMessage);

DateTime getDateDebut(Integer dateDeb, Integer codem1);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ public class PointageCalculeService implements IPointageCalculeService {

public static int HEURE_JOUR_DEBUT_PRIME_DPM = 5;
public static int HEURE_JOUR_FIN_PRIME_DPM = 21;

public static int HEURE_DEBUT_REGIME_INDEMNITAIRE_NUIT = 6;
public static int HEURE_FIN_REGIME_INDEMNITAIRE_NUIT = 20;
// pour la prime DPM : 4h minimum
public static int SEUIL_MINI_PRIME_DPM = 4 * 60;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
Expand All @@ -11,6 +12,7 @@
import org.joda.time.DateTime;
import org.joda.time.DateTimeConstants;
import org.joda.time.Interval;
import org.joda.time.LocalDate;
import org.joda.time.LocalTime;
import org.joda.time.Minutes;
import org.slf4j.Logger;
Expand Down Expand Up @@ -82,7 +84,8 @@ public class PointageDataConsistencyRules implements IPointageDataConsistencyRul
public static final String ERROR_PRIME_QUANTITE_POINTAGE = "Pour la prime %s du %s, la quantité ne peut être supérieure à 24.";
public static final String ERROR_PRIME_EPANDAGE_QUANTITE = "Pour la prime %s du %s, la quantité ne peut être supérieure à 2.";
public static final String ERROR_PRIME_JOURS_FERIE = "La prime %s du %s, ne peut être saisie qu'un samedi, dimanche ou jour férié.";
public static final String ERROR_PRIME_DPM_INTERVALLE = "Pour le pointage du %s, il faut au moins 5 minutes comprises entre 5h et 21h.";
public static final String ERROR_PRIME_DPM_INTERVALLE = "Pour le pointage du %s, il faut au moins 5 minutes comprises entre 5h et 21h.";
public static final String ERROR_PRIME_RI_NUIT_INTERVAL = "Pour le pointage du %s, il faut 8h pleines comprises entre 20h et 6h.";
public static final String ERROR_ABSENCE_GREVE = "Pour l'absence sans titre du %s, le type d'absence ne peut être %s. Ce type est reservé à la DRH.";

public static final List<String> ACTIVITE_CODES = Arrays.asList("01", "02", "03", "04", "23", "24", "60", "61", "62", "63", "64", "65", "66");
Expand Down Expand Up @@ -121,19 +124,28 @@ public ReturnMessageDto checkMaxAbsenceHebdo(ReturnMessageDto srm, Integer idAge
public ReturnMessageDto checkAbsences(ReturnMessageDto srm, Integer idAgent, List<Pointage> pointages) {
ReturnMessageDto result = new ReturnMessageDto();
for (Pointage p : pointages) {

boolean isRegimeIndemnitaire = p.getRefPrime() != null &&
p.getRefPrime().getNoRubr() != null &&
(p.getRefPrime().getNoRubr().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_NUIT) ||
p.getRefPrime().getNoRubr().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_DJF));

// pour chaque pointage on verifie si en recup
// si oui, on ajoute des erreurs
// #6843 attention on ne check pas les primes
if (!RefTypePointageEnum.PRIME.equals(p.getTypePointageEnum())) {
if (!RefTypePointageEnum.PRIME.equals(p.getTypePointageEnum()) || isRegimeIndemnitaire) {
result = absWsConsumer.checkAbsences(idAgent, p.getDateDebut(), p.getDateFin());
}

for (String info : result.getInfos()) {
srm.getInfos().add(info);
}
for (String erreur : result.getErrors()) {
srm.getErrors().add(erreur);
// #47288 : On ne bloque pas la saisie pour les régimes indemnitaires.
if (isRegimeIndemnitaire)
srm.getInfos().add(erreur);
else
srm.getErrors().add(erreur);
}
}
return srm;
Expand Down Expand Up @@ -237,6 +249,64 @@ public ReturnMessageDto checkPrime7652(ReturnMessageDto srm, Integer idAgent, Da
return srm;
}

// #47288 : Prime 7656 : Régime indémnitaire DJF
protected ReturnMessageDto checkPrime7656(ReturnMessageDto srm, List<Pointage> pointages) {

for (Pointage ptg : pointages) {
if (ptg.getTypePointageEnum() != RefTypePointageEnum.PRIME || !ptg.getRefPrime().getNoRubr().equals(7656))
continue;

DateTime deb = new DateTime(ptg.getDateDebut());

if (deb.getDayOfWeek() != DateTimeConstants.SUNDAY && !sirhWsConsumer.isHoliday(deb))
srm.getErrors().add(String.format("La prime 7656 du %s n'est pas valide. Elle ne peut être saisie qu'un dimanche ou jour férié.",
deb.toString("dd/MM/yyyy")));

}

return srm;
}

// #47288 : Prime 7657 : Régime indémnitaire du nuit
// Entre 20h et 06h : Le temps doit être de 8h
// Entre 21h et 05h : pas de limite basse.
protected ReturnMessageDto checkPrime7657(ReturnMessageDto srm, List<Pointage> pointages) {

for (Pointage ptg : pointages) {
if (ptg.getTypePointageEnum() != RefTypePointageEnum.PRIME || !ptg.getRefPrime().getNoRubr().equals(7657))
continue;

DateTime deb = new DateTime(ptg.getDateDebut());
DateTime fin = new DateTime(ptg.getDateFin());

DateTime debutReferenceAM = new DateTime(ptg.getDateDebut()).withHourOfDay(PointageCalculeService.HEURE_DEBUT_REGIME_INDEMNITAIRE_NUIT).withMinuteOfHour(0);
DateTime debutReferencePM = new DateTime(ptg.getDateDebut()).withHourOfDay(PointageCalculeService.HEURE_FIN_REGIME_INDEMNITAIRE_NUIT).withMinuteOfHour(0);
DateTime finReferenceAM = new DateTime(ptg.getDateFin()).withHourOfDay(PointageCalculeService.HEURE_DEBUT_REGIME_INDEMNITAIRE_NUIT).withMinuteOfHour(0);
DateTime finReferencePM = new DateTime(ptg.getDateFin()).withHourOfDay(PointageCalculeService.HEURE_FIN_REGIME_INDEMNITAIRE_NUIT).withMinuteOfHour(0);

// Si l'heure de début ou de fin est comprise entre 06h et 20h, on bloque la saisie.
// Il faut aussi penser à bloquer si la date de début est le avant 06h, et la date de fin après 20h
if ((deb.isAfter(debutReferenceAM) && deb.isBefore(debutReferencePM))
|| (fin.isBefore(finReferencePM) && fin.isAfter(finReferenceAM))
|| (deb.isBefore(debutReferencePM) && fin.isAfter(finReferenceAM))) {
srm.getErrors().add(String.format("La prime 7657 du %s n'est pas valide. Elle ne peut être saisie qu'entre 20h et 06h.",deb.toString("dd/MM/yyyy")));
}

// S'il y a une heure de début comprise entre 20h et 21h ou une heure de début comprise entre 05h et 06h, on vérifie que la saisie fait bien 8h
else if (((Integer)deb.getHourOfDay()).equals(20) ||
((Integer)fin.getHourOfDay()).equals(6) ||
(((Integer)fin.getHourOfDay()).equals(5) && fin.getMinuteOfHour() != 0)) {
Interval interval = new Interval(deb, fin);
// Il faut avoir 8h après arrondi. => Entre 7h30(450min) et 8h29(509min)
if (interval.toDuration().getStandardMinutes() < 450 || interval.toDuration().getStandardMinutes() > 509)
srm.getErrors().add(String.format(ERROR_PRIME_RI_NUIT_INTERVAL, sdf.format(ptg.getDateDebut())));
}

}

return srm;
}

@Override
public ReturnMessageDto checkPrime7704(ReturnMessageDto srm, Integer idAgent, Date dateLundi, List<Pointage> pointages) {

Expand Down Expand Up @@ -400,6 +470,9 @@ public void processDataConsistency(ReturnMessageDto srm, Integer idAgent, Date d
checkPrime7651(srm, idAgent, dateLundi, pointages);
checkPrime7652(srm, idAgent, dateLundi, pointages);
checkPrime7704(srm, idAgent, dateLundi, pointages);
// # : Ajout des régimes indemnitaires
checkPrime7656(srm, pointages);
checkPrime7657(srm, pointages);
// #35605 : pour la prime DPM 7714, on ne peut la saisir que sur
// samed/dimanche et jours féries
checkPrimeHsup7714(srm, idAgent, dateLundi, pointages);
Expand Down Expand Up @@ -570,6 +643,14 @@ public ReturnMessageDto checkDateLundiNotSuperieurDateJour(ReturnMessageDto srm,
}
return srm;
}

@Override
public ReturnMessageDto checkDateNotSuperieurDateJour(ReturnMessageDto srm, Date date, String errorMessage) {
if (date.after(new Date())) {
srm.getErrors().add(errorMessage);
}
return srm;
}

@Override
public ReturnMessageDto checkPrimeHsup7714(ReturnMessageDto srm, Integer idAgent, Date dateLundi, List<Pointage> pointages) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ public class SaisieService implements ISaisieService {
private String sirhAbsDateBlocagePointage;

private SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY HH:mm");

private static String REGIMES_INDEMNITAIRES_DATE_FUTURE = "Les régimes indemnitaires ne peuvent être saisis dans le futur.";

@Override
public ReturnMessageDto saveFichePointage(Integer idAgentOperator, FichePointageDtoKiosque fichePointageDto)
Expand Down Expand Up @@ -202,7 +204,16 @@ public ReturnMessageDto saveFichePointage(Integer idAgentOperator, FichePointage
&& (prime.getQuantite() == null || prime.getQuantite().equals(0))) {
continue;
}


// #47288 : Les régimes indemnitaires ne peuvent pas être saisis dans le futur.
if (prime.getNumRubrique() != null &&
(prime.getNumRubrique().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_NUIT) ||
prime.getNumRubrique().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_DJF))) {
ptgDataCosistencyRules.checkDateNotSuperieurDateJour(result, prime.getHeureDebut(), REGIMES_INDEMNITAIRES_DATE_FUTURE);
}
if (!result.getErrors().isEmpty())
continue;

// Try to retrieve in the existing original pointages if it
// exists
Pointage ptg = findPointageAndRemoveFromOriginals(originalAgentPointages, prime);
Expand Down Expand Up @@ -666,6 +677,15 @@ public ReturnMessageDto saveFichePointageKiosque(Integer idAgentOperator, FicheP
&& (prime.getQuantite() == null || prime.getQuantite().equals(0))) {
continue;
}

// #47288 : Les régimes indemnitaires ne peuvent pas être saisis dans le futur.
if (prime.getNumRubrique() != null &&
(prime.getNumRubrique().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_NUIT) ||
prime.getNumRubrique().equals(VentilationPrimeService.INDEMNITE_TRAVAIL_DJF))) {
ptgDataCosistencyRules.checkDateNotSuperieurDateJour(result, prime.getHeureDebutDate(), REGIMES_INDEMNITAIRES_DATE_FUTURE);
}
if (!result.getErrors().isEmpty())
continue;

// Try to retrieve in the existing original pointages if it
// exists
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,8 +40,8 @@ public class VentilationPrimeService implements IVentilationPrimeService {
public final static int INDEMNITE_FORFAITAIRE_TRAVAIL_DPM_SAMEDI = 7718;
public final static int INDEMNITE_FORFAITAIRE_TRAVAIL_DPM_DJF = 7719;

public final static int INDEMNITE_TRAVAIL_DJF = 7756;
public final static int INDEMNITE_TRAVAIL_NUIT = 7757;
public final static int INDEMNITE_TRAVAIL_DJF = 7656;
public final static int INDEMNITE_TRAVAIL_NUIT = 7657;

// List of rubrique to not aggregate because used for calculating other Primes
// #13327 HSup SIPRES (épandage) : creation d une prime FICTIVE 7760
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,8 @@
import org.mockito.stubbing.Answer;
import org.springframework.test.util.ReflectionTestUtils;

import com.google.common.collect.Lists;

public class PointageDataConsistencyRulesTest {

@Test
Expand Down Expand Up @@ -406,6 +408,89 @@ public void checkAgentINAAndHSup_INASupTo315_DPM_returnNothing_ForceRecup() {
assertEquals(p1.getHeureSupRecuperee(), true);
}

@Test
public void checkPrime7657_test_ok() {
// Given
RefTypePointage type = new RefTypePointage();
type.setIdRefTypePointage(RefTypePointageEnum.PRIME.getValue());
RefPrime prime = new RefPrime();
prime.setNoRubr(7657);

Pointage ptg = new Pointage();
ptg.setDateDebut(new DateTime(2018, 07, 06, 21, 15, 0).toDate());
ptg.setDateFin(new DateTime(2018, 07, 06, 04, 30, 0).toDate());
ptg.setRefPrime(prime);
ptg.setType(type);

List<Pointage> pointages = Lists.newArrayList();
pointages.add(ptg);

PointageDataConsistencyRules service = new PointageDataConsistencyRules();

// When
ReturnMessageDto result = service.checkPrime7657(new ReturnMessageDto(), pointages);

// Then
assertEquals(0, result.getErrors().size());
}

@Test
public void checkPrime7657_test_ko() {
// Given
RefTypePointage type = new RefTypePointage();
type.setIdRefTypePointage(RefTypePointageEnum.PRIME.getValue());
RefPrime prime = new RefPrime();
prime.setNoRubr(7657);

Pointage ptg = new Pointage();
ptg.setDateDebut(new DateTime(2018, 07, 6, 21, 15, 0).toDate());
ptg.setDateFin(new DateTime(2018, 07, 7, 6, 30, 0).toDate());
ptg.setType(type);
ptg.setRefPrime(prime);

Pointage ptg2 = new Pointage();
ptg2.setDateDebut(new DateTime(2018, 07, 9, 19, 59, 0).toDate());
ptg2.setDateFin(new DateTime(2018, 07, 10, 4, 30, 0).toDate());
ptg2.setType(type);
ptg2.setRefPrime(prime);

Pointage ptg3 = new Pointage();
ptg3.setDateDebut(new DateTime(2018, 07, 10, 20, 45, 0).toDate());
ptg3.setDateFin(new DateTime(2018, 07, 11, 05, 45, 0).toDate());
ptg3.setType(type);
ptg3.setRefPrime(prime);

Pointage ptg4 = new Pointage();
ptg4.setDateDebut(new DateTime(2018, 07, 11, 20, 45, 0).toDate());
ptg4.setDateFin(new DateTime(2018, 07, 12, 4, 15, 0).toDate());
ptg4.setType(type);
ptg4.setRefPrime(prime);

Pointage ptg5 = new Pointage();
ptg5.setDateDebut(new DateTime(2018, 07, 12, 20, 45, 0).toDate());
ptg5.setDateFin(new DateTime(2018, 07, 13, 5, 14, 0).toDate());
ptg5.setType(type);
ptg5.setRefPrime(prime);

List<Pointage> pointages = Lists.newArrayList();
pointages.add(ptg);
pointages.add(ptg2);
pointages.add(ptg3);
pointages.add(ptg4);
pointages.add(ptg5);

PointageDataConsistencyRules service = new PointageDataConsistencyRules();

// When
ReturnMessageDto result = service.checkPrime7657(new ReturnMessageDto(), pointages);

// Then
assertEquals(result.getErrors().size(), 3);
assertEquals(result.getErrors().get(0), "La prime 7657 du 06/07/2018 n'est pas valide. Elle ne peut être saisie qu'entre 20h et 06h.");
assertEquals(result.getErrors().get(1), "La prime 7657 du 09/07/2018 n'est pas valide. Elle ne peut être saisie qu'entre 20h et 06h.");
assertEquals(result.getErrors().get(2), "Pour le pointage du 10/07/2018, il faut 8h pleines comprises entre 20h et 6h.");
}

@Test
public void checkAgentINAAndHSup_INASupTo315_returnNothing_ForceRecup() {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,12 +82,12 @@ public void getQuantiteFromPointageTest() {

RefPrime refPrime2 = new RefPrime();
refPrime2.setIdRefPrime(8909);
refPrime2.setNoRubr(7757);
refPrime2.setNoRubr(7657);
refPrime2.setTypeSaisie(TypeSaisieEnum.PERIODE_HEURES);

RefPrime refPrime3 = new RefPrime();
refPrime3.setIdRefPrime(8909);
refPrime3.setNoRubr(7756);
refPrime3.setNoRubr(7656);
refPrime3.setTypeSaisie(TypeSaisieEnum.PERIODE_HEURES);

RefPrime refPrime4 = new RefPrime();
Expand Down

0 comments on commit ece6b45

Please sign in to comment.