package net.conselldemallorca.helium.webapp.v3.validator;
import java.util.HashSet;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import org.springframework.beans.factory.annotation.Autowired;
import net.conselldemallorca.helium.v3.core.api.dto.EntornDto;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTipusDto;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientTipusService;
import net.conselldemallorca.helium.webapp.v3.command.ExpedientTipusCommand;
import net.conselldemallorca.helium.webapp.v3.helper.MessageHelper;
import net.conselldemallorca.helium.webapp.v3.helper.SessionHelper;
/**
* Validador per al manteniment de tipus d'expedients:
* - Comprova que el codi no estigui duplicat
* - Si la opció de seqüència manual d'anys està activada:
* - Comprova que no hi hagi valors nuls.
* - Comprova que no hi hagi anys repetits.
*/
public class ExpedientTipusValidator implements ConstraintValidator<ExpedientTipus, ExpedientTipusCommand>{
private String codiMissatge;
@Autowired
private ExpedientTipusService expedientTipusService;
@Autowired
private HttpServletRequest request;
@Override
public void initialize(ExpedientTipus anotacio) {
codiMissatge = anotacio.message();
}
@Override
public boolean isValid(ExpedientTipusCommand command, ConstraintValidatorContext context) {
boolean valid = true;
// Comprova si ja hi ha un tipus d'expedient amb el mateix codi
if (command.getCodi() != null) {
EntornDto entornActual = SessionHelper.getSessionManager(request).getEntornActual();
ExpedientTipusDto repetit = expedientTipusService.findAmbCodiPerValidarRepeticio(
entornActual.getId(),
command.getCodi());
if(repetit != null && (command.getId() == null || !command.getId().equals(repetit.getId()))) {
context.buildConstraintViolationWithTemplate(
MessageHelper.getInstance().getMessage(this.codiMissatge + ".codi.repetit", null))
.addNode("codi")
.addConstraintViolation();
valid = false;
}
}
// Si la opció de seqüència manual d'anys està activada:
if (command.isReiniciarCadaAny()) {
Set<Integer> anys = new HashSet<Integer>();
// Comprova que no hi hagi anys nuls o mal formatats
for (String anyStr : command.getSequenciesAny()) {
try {
Integer any = Integer.parseInt(anyStr);
// Comprova que no hi hagi anys repetits.
if (anys.contains(any)) {
context.buildConstraintViolationWithTemplate(
MessageHelper.getInstance().getMessage(this.codiMissatge + ".seq.any.repetit", null))
.addNode("reiniciarCadaAny")
.addConstraintViolation();
valid = false;
} else {
anys.add(any);
}
} catch (NumberFormatException ex) {
context.buildConstraintViolationWithTemplate(
MessageHelper.getInstance().getMessage(this.codiMissatge + ".seq.any", null))
.addNode("reiniciarCadaAny")
.addConstraintViolation();
valid = false;
}
}
// Comprova que no hi hagi valors nuls o mal formatats
for (String valorStr : command.getSequenciesValor()) {
try {
Long.parseLong(valorStr);
} catch (NumberFormatException ex) {
context.buildConstraintViolationWithTemplate(
MessageHelper.getInstance().getMessage(this.codiMissatge + ".seq.valor", null))
.addNode("reiniciarCadaAny")
.addConstraintViolation();
valid = false;
}
}
}
return valid;
}
}