/**
*
*/
package net.conselldemallorca.helium.v3.core.service;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.security.acls.model.Permission;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import net.conselldemallorca.helium.core.helper.ConversioTipusHelper;
import net.conselldemallorca.helium.core.helper.EntornHelper;
import net.conselldemallorca.helium.core.helper.ExpedientTipusHelper;
import net.conselldemallorca.helium.core.helper.PaginacioHelper;
import net.conselldemallorca.helium.core.helper.PermisosHelper;
import net.conselldemallorca.helium.core.model.hibernate.Entorn;
import net.conselldemallorca.helium.core.model.hibernate.ExpedientTipus;
import net.conselldemallorca.helium.core.model.hibernate.SequenciaAny;
import net.conselldemallorca.helium.core.security.ExtendedPermission;
import net.conselldemallorca.helium.v3.core.api.dto.ExpedientTipusDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginaDto;
import net.conselldemallorca.helium.v3.core.api.dto.PaginacioParamsDto;
import net.conselldemallorca.helium.v3.core.api.dto.PermisDto;
import net.conselldemallorca.helium.v3.core.api.exception.NoTrobatException;
import net.conselldemallorca.helium.v3.core.api.service.ExpedientTipusService;
import net.conselldemallorca.helium.v3.core.repository.ExpedientTipusRepository;
import net.conselldemallorca.helium.v3.core.repository.SequenciaAnyRepository;
/**
* Implementació del servei per a gestionar tipus d'expedients.
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service("expedientTipusServiceV3")
public class ExpedientTipusServiceImpl implements ExpedientTipusService {
@Resource
private EntornHelper entornHelper;
@Resource
private ExpedientTipusRepository expedientTipusRepository;
@Resource
private SequenciaAnyRepository sequenciaRepository;
@Resource
private ExpedientTipusHelper expedientTipusHelper;
@Resource
private ConversioTipusHelper conversioTipusHelper;
@Resource(name = "permisosHelperV3")
private PermisosHelper permisosHelper;
@Resource
private PaginacioHelper paginacioHelper;
@Override
@Transactional
public ExpedientTipusDto create(
Long entornId,
ExpedientTipusDto expedientTipus,
List<Integer> sequenciesAny,
List<Long> sequenciesValor) {
logger.debug(
"Creant nou tipus d'expedient (" +
"entornId=" + entornId + ", " +
"expedientTipus=" + expedientTipus + ", " +
"sequenciesAny=" + sequenciesAny + ", " +
"sequenciesValor=" + sequenciesValor + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true,
true);
ExpedientTipus entity = new ExpedientTipus();
entity.setEntorn(entorn);
entity.setCodi(expedientTipus.getCodi());
entity.setNom(expedientTipus.getNom());
entity.setTeTitol(expedientTipus.isTeTitol());
entity.setDemanaTitol(expedientTipus.isDemanaTitol());
entity.setTeNumero(expedientTipus.isTeNumero());
entity.setDemanaNumero(expedientTipus.isDemanaNumero());
entity.setExpressioNumero(expedientTipus.getExpressioNumero());
entity.setReiniciarCadaAny(expedientTipus.isReiniciarCadaAny());
entity.setSequencia(expedientTipus.getSequencia());
entity.setResponsableDefecteCodi(expedientTipus.getResponsableDefecteCodi());
entity.setRestringirPerGrup(expedientTipus.isRestringirPerGrup());
entity.setSeleccionarAny(expedientTipus.isSeleccionarAny());
entity.setAmbRetroaccio(expedientTipus.isAmbRetroaccio());
entity.setReindexacioAsincrona(expedientTipus.isReindexacioAsincrona());
if (expedientTipus.isReiniciarCadaAny()) {
for (int i = 0; i < sequenciesAny.size(); i++) {
SequenciaAny anyEntity = new SequenciaAny(
entity,
sequenciesAny.get(i),
sequenciesValor.get(i));
entity.getSequenciaAny().put(anyEntity.getAny(), anyEntity);
}
}
return conversioTipusHelper.convertir(
expedientTipusRepository.save(entity),
ExpedientTipusDto.class);
}
@Override
@Transactional
public ExpedientTipusDto update(
Long entornId,
ExpedientTipusDto expedientTipus,
List<Integer> sequenciesAny,
List<Long> sequenciesValor) {
logger.debug(
"Modificant tipus d'expedient existent (" +
"entornId=" + entornId + ", " +
"expedientTipus=" + expedientTipus + ", " +
"sequenciesAny=" + sequenciesAny + ", " +
"sequenciesValor=" + sequenciesValor + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true);
expedientTipusHelper.comprovarPermisDissenyEntornITipusExpedient(
entornId,
expedientTipus.getId());
ExpedientTipus entity = expedientTipusRepository.findByEntornAndId(
entorn,
expedientTipus.getId());
entity.setNom(expedientTipus.getNom());
entity.setTeTitol(expedientTipus.isTeTitol());
entity.setDemanaTitol(expedientTipus.isDemanaTitol());
entity.setTeNumero(expedientTipus.isTeNumero());
entity.setDemanaNumero(expedientTipus.isDemanaNumero());
entity.setExpressioNumero(expedientTipus.getExpressioNumero());
entity.setReiniciarCadaAny(expedientTipus.isReiniciarCadaAny());
entity.setSequencia(expedientTipus.getSequencia());
entity.setResponsableDefecteCodi(expedientTipus.getResponsableDefecteCodi());
entity.setRestringirPerGrup(expedientTipus.isRestringirPerGrup());
entity.setSeleccionarAny(expedientTipus.isSeleccionarAny());
while (entity.getSequenciaAny().size() > 0) {
SequenciaAny s = entity.getSequenciaAny().get(entity.getSequenciaAny().firstKey());
entity.getSequenciaAny().remove(s.getAny());
sequenciaRepository.delete(s);
}
if (expedientTipus.isReiniciarCadaAny()) {
for (int i = 0; i < sequenciesAny.size(); i++) {
SequenciaAny sequenciaEntity = new SequenciaAny(
entity,
sequenciesAny.get(i),
sequenciesValor.get(i));
entity.getSequenciaAny().put(sequenciaEntity.getAny(), sequenciaEntity);
sequenciaRepository.save(sequenciaEntity);
}
}
// Només poden configurar la retroacció els dissenyadors de l'entorn
if (entornHelper.potDissenyarEntorn(entornId)) {
entity.setAmbRetroaccio(expedientTipus.isAmbRetroaccio());
entity.setReindexacioAsincrona(expedientTipus.isReindexacioAsincrona());
}
return conversioTipusHelper.convertir(
expedientTipusRepository.save(entity),
ExpedientTipusDto.class);
}
@Override
@Transactional
public void delete(
Long entornId,
Long expedientTipusId) {
logger.debug(
"Esborrant el tipus d'expedient (" +
"entornId=" + entornId + ", " +
"expedientTipusId=" + expedientTipusId + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true,
true);
ExpedientTipus entity = expedientTipusRepository.findByEntornAndId(
entorn,
expedientTipusId);
expedientTipusRepository.delete(entity);
}
@Override
@Transactional(readOnly = true)
public ExpedientTipusDto findAmbIdPerDissenyar(
Long entornId,
Long expedientTipusId) {
logger.debug(
"Consultant tipus d'expedient amb id (" +
"entornId=" + entornId + ", " +
"expedientTipusId = " + expedientTipusId + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true);
ExpedientTipus tipus;
if (entornHelper.potDissenyarEntorn(entornId)) {
// Si te permisos de disseny a damunt l'entorn pot veure tots els tipus
tipus = expedientTipusRepository.findByEntornAndId(
entorn,
expedientTipusId);
} else {
// Si no te permisos de disseny a damunt l'entorn només es poden veure
// els tipus amb permisos de disseny
tipus = expedientTipusHelper.getExpedientTipusComprovantPermisos(
expedientTipusId,
false,
false,
false,
true);
}
return conversioTipusHelper.convertir(
tipus,
ExpedientTipusDto.class);
}
@Override
@Transactional(readOnly = true)
public ExpedientTipusDto findAmbCodiPerValidarRepeticio(
Long entornId,
String codi) {
logger.debug(
"Consultant tipus d'expedient amb codi (" +
"entornId=" + entornId + ", " +
"codi = " + codi + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true);
return conversioTipusHelper.convertir(
expedientTipusRepository.findByEntornAndCodi(entorn, codi),
ExpedientTipusDto.class);
}
@Override
@Transactional(readOnly = true)
public PaginaDto<ExpedientTipusDto> findPerDatatable(
Long entornId,
String filtre,
PaginacioParamsDto paginacioParams) {
logger.debug(
"Consultant tipus d'expedient per datatable (" +
"entornId=" + entornId + ", " +
"filtre=" + filtre + ")");
Entorn entorn = entornHelper.getEntornComprovantPermisos(
entornId,
true);
List<Long> tipusPermesosIds = expedientTipusHelper.findIdsAmbEntorn(entorn);
// Filtra els expedients deixant només els permesos
if (!entornHelper.potDissenyarEntorn(entornId)) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Iterator<Long> it = tipusPermesosIds.iterator();
while (it.hasNext()) {
Long id = it.next();
if (!permisosHelper.isGrantedAny(
id,
ExpedientTipus.class,
new Permission[] {
ExtendedPermission.DESIGN,
ExtendedPermission.MANAGE,
ExtendedPermission.ADMINISTRATION},
auth)) {
it.remove();
}
}
}
PaginaDto<ExpedientTipusDto> pagina = paginacioHelper.toPaginaDto(
expedientTipusRepository.findByFiltreGeneralPaginat(
entorn,
tipusPermesosIds,
filtre == null || "".equals(filtre),
filtre,
paginacioHelper.toSpringDataPageable(
paginacioParams)),
ExpedientTipusDto.class);
// Afegeix el contador de permisos
List<Long> ids = new ArrayList<Long>();
for (ExpedientTipusDto dto: pagina.getContingut()) {
ids.add(dto.getId());
}
Map<Long, List<PermisDto>> permisos = permisosHelper.findPermisos(
ids,
ExpedientTipus.class);
for (ExpedientTipusDto dto: pagina.getContingut()) {
if (permisos.get(dto.getId()) != null) {
dto.setPermisCount(permisos.get(dto.getId()).size());
}
}
return pagina;
}
@Override
@Transactional
public PermisDto permisUpdate(
Long entornId,
Long expedientTipusId,
PermisDto permis) {
logger.debug(
"Creant permis per al tipus d'expedient (" +
"entornId=" + entornId + ", " +
"expedientTipusId=" + expedientTipusId + ", " +
"permis=" + permis + ")");
entornHelper.getEntornComprovantPermisos(
entornId,
true);
expedientTipusHelper.comprovarPermisDissenyEntornITipusExpedient(
entornId,
expedientTipusId);
permisosHelper.updatePermis(
expedientTipusId,
ExpedientTipus.class,
permis);
return null;
}
@Override
@Transactional
public void permisDelete(
Long entornId,
Long expedientTipusId,
Long permisId) {
logger.debug(
"Esborrant permis per al tipus d'expedient (" +
"entornId=" + entornId + ", " +
"expedientTipusId=" + expedientTipusId + ", " +
"permisId=" + permisId + ")");
entornHelper.getEntornComprovantPermisos(
entornId,
true);
expedientTipusHelper.comprovarPermisDissenyEntornITipusExpedient(
entornId,
expedientTipusId);
permisosHelper.deletePermis(
expedientTipusId,
ExpedientTipus.class,
permisId);
}
@Override
@Transactional(readOnly = true)
public List<PermisDto> permisFindAll(
Long entornId,
Long expedientTipusId) {
logger.debug(
"Consultant permisos del tipus d'expedient (" +
"entornId=" + entornId + ", " +
"expedientTipusId=" + expedientTipusId + ")");
entornHelper.getEntornComprovantPermisos(
entornId,
true);
expedientTipusHelper.comprovarPermisDissenyEntornITipusExpedient(
entornId,
expedientTipusId);
return permisosHelper.findPermisos(
expedientTipusId,
ExpedientTipus.class);
}
@Override
@Transactional(readOnly = true)
public PermisDto permisFindById(
Long entornId,
Long expedientTipusId,
Long permisId) {
logger.debug(
"Consultant un permis donat el seu id (" +
"entornId=" + entornId + ", " +
"expedientTipusId=" + expedientTipusId + ", " +
"permisId=" + permisId + ")");
entornHelper.getEntornComprovantPermisos(
entornId,
true);
expedientTipusHelper.comprovarPermisDissenyEntornITipusExpedient(
entornId,
expedientTipusId);
List<PermisDto> permisos = permisosHelper.findPermisos(
expedientTipusId,
ExpedientTipus.class);
for (PermisDto permis: permisos) {
if (permis.getId().equals(permisId)) {
return permis;
}
}
throw new NoTrobatException(PermisDto.class, permisId);
}
private static final Logger logger = LoggerFactory.getLogger(ExpedientServiceImpl.class);
}