package org.transgalactica.batch.salaire.rule.impl;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.Period;
import org.springframework.util.Assert;
import org.transgalactica.batch.salaire.rule.FicheSalaireRule;
import org.transgalactica.fwk.domain.stereotype.Rule;
import org.transgalactica.management.data.people.bo.EmployeEntity;
import org.transgalactica.management.data.people.bo.MecanicienEntity;
import org.transgalactica.management.data.people.bo.PiloteEntity;
import org.transgalactica.management.data.referentiel.bo.EmployeType;
@Rule
public class BasicFicheSalaireRule implements FicheSalaireRule {
private static final BigDecimal PILOTE_BASE_SALAIRE = new BigDecimal(8000);
private static final BigDecimal MECANICIEN_BASE_SALAIRE = new BigDecimal(10000);
private static final BigDecimal FACTEUR_ANCIENNETE = new BigDecimal(100);
private static final BigDecimal FACTEUR_HEURE_VOL = BigDecimal.ONE;
private static final BigDecimal FACTEUR_SPECIALITE = new BigDecimal(1000);
protected BasicFicheSalaireRule() {
}
@Override
public BigDecimal calculerSalaireBase(EmployeEntity employe) {
if (employe.getType().equals(EmployeType.PILOTE)) {
return PILOTE_BASE_SALAIRE;
}
if (employe.getType().equals(EmployeType.MECANICIEN)) {
return MECANICIEN_BASE_SALAIRE;
}
throw new IllegalStateException("Unmanaged employe type;");
}
@Override
public BigDecimal calculerPrimeAnciennete(EmployeEntity employe, LocalDate dateCalcul) {
LocalDate dateEmbauche = employe.getDateEmbauche();
Assert.isTrue(dateCalcul.isAfter(dateEmbauche), "'dateCalcul' should be after 'dateEmbauche'.");
Period interval = Period.between(dateEmbauche, dateCalcul);
BigDecimal nbAnneesAnciennete = new BigDecimal(interval.getYears());
return nbAnneesAnciennete.multiply(FACTEUR_ANCIENNETE);
}
@Override
public BigDecimal calculerPrimeExperience(EmployeEntity employe) {
if (employe.getType().equals(EmployeType.PILOTE)) {
BigDecimal nbHeureDeVol = new BigDecimal(((PiloteEntity) employe).getNombreHeuresVol());
return nbHeureDeVol.multiply(FACTEUR_HEURE_VOL);
}
if (employe.getType().equals(EmployeType.MECANICIEN)) {
BigDecimal nbSpecialite = new BigDecimal(((MecanicienEntity) employe).getSpecialites().size());
return nbSpecialite.multiply(FACTEUR_SPECIALITE);
}
throw new IllegalStateException("Unmanaged employe type;");
}
}