/** * */ 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); }