/**
*
*/
package net.conselldemallorca.helium.core.model.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import net.conselldemallorca.helium.core.model.dao.AreaDao;
import net.conselldemallorca.helium.core.model.dao.AreaJbpmIdDao;
import net.conselldemallorca.helium.core.model.dao.AreaMembreDao;
import net.conselldemallorca.helium.core.model.dao.AreaTipusDao;
import net.conselldemallorca.helium.core.model.dao.CarrecDao;
import net.conselldemallorca.helium.core.model.dao.CarrecJbpmIdDao;
import net.conselldemallorca.helium.core.model.dao.PluginPersonaDao;
import net.conselldemallorca.helium.core.model.dto.PersonaDto;
import net.conselldemallorca.helium.core.model.dto.PersonaDto.Sexe;
import net.conselldemallorca.helium.core.model.exception.NotFoundException;
import net.conselldemallorca.helium.core.model.hibernate.Area;
import net.conselldemallorca.helium.core.model.hibernate.AreaJbpmId;
import net.conselldemallorca.helium.core.model.hibernate.AreaMembre;
import net.conselldemallorca.helium.core.model.hibernate.AreaTipus;
import net.conselldemallorca.helium.core.model.hibernate.Carrec;
import net.conselldemallorca.helium.core.model.hibernate.CarrecJbpmId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource;
import org.springframework.context.NoSuchMessageException;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
/**
* Servei per gestionar l'organització d'un entorn
*
* @author Limit Tecnologies <limit@limit.es>
*/
@Service
public class OrganitzacioService {
private AreaDao areaDao;
private AreaMembreDao areaMembreDao;
private AreaTipusDao areaTipusDao;
private PluginPersonaDao pluginPersonaDao;
private CarrecDao carrecDao;
private CarrecJbpmIdDao carrecJbpmIdDao;
private AreaJbpmIdDao areaJbpmIdDao;
private MessageSource messageSource;
public Area getAreaById(Long id) {
return areaDao.getById(id, false);
}
public Area createArea(Area entity) {
return areaDao.saveOrUpdate(entity);
}
public Area updateArea(Area entity) {
return areaDao.merge(entity);
}
public void deleteArea(Long id) {
areaDao.delete(id);
}
public List<Area> findAreaPagedAndOrderedAmbEntorn(
Long entornId,
String sort,
boolean asc,
int firstRow,
int maxResults) {
return areaDao.findPagedAndOrderedAmbEntorn(
entornId,
sort,
asc,
firstRow,
maxResults);
}
public int countAreaAmbEntorn(Long entornId) {
return areaDao.getCountAmbEntorn(entornId);
}
public List<Area> findAreaAmbEntorn(Long entornId) {
return areaDao.findAreaAmbEntorn(entornId);
}
public Area findAreaAmbEntornICodi(
Long entornId,
String codi) {
return areaDao.findAmbEntornICodi(entornId, codi);
}
public List<Area> findAreaLikeNom(Long entornId, String text) {
return areaDao.findLikeNom(entornId, text);
}
public List<Area> findAreaAmbTipus(Long tipusAreaId) {
return areaDao.findAmbTipus(tipusAreaId);
}
public List<Area> findAreaAmbPare(Long entornId, String pareCodi) {
return areaDao.findAmbPare(entornId, pareCodi);
}
public void afegirMembre(
Long areaId,
String personaCodi,
Long carrecId) {
Area area = areaDao.getById(areaId, false);
if (area == null)
throw new NotFoundException( getMessage("error.orgService.trobarArea", new Object[]{areaId}) );
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(personaCodi);
if (persona == null)
throw new NotFoundException( getMessage("error.orgService.trobarPersona", new Object[]{personaCodi}) );
if (carrecId != null) {
Carrec carrec = carrecDao.getById(carrecId, false);
if (carrec == null)
throw new NotFoundException( getMessage("error.orgService.trobarCarrec", new Object[]{carrecId}) );
/*if (carrec.getPersonaCodi() != null)
throw new NotFoundException("No està disponible el càrrec amb id:" + carrecId);*/
carrec.setPersonaCodi(persona.getCodi());
carrec.setPersonaSexe(
(persona.getSexe().equals(Sexe.SEXE_HOME)) ?
net.conselldemallorca.helium.core.model.hibernate.Persona.Sexe.SEXE_HOME :
net.conselldemallorca.helium.core.model.hibernate.Persona.Sexe.SEXE_DONA);
}
AreaMembre membre = new AreaMembre(area, persona.getCodi());
if (!area.getMembres().contains(membre))
area.addMembre(membre);
}
public void esborrarMembre(
Long areaId,
String personaCodi) {
Area area = areaDao.getById(areaId, false);
if (area == null)
throw new NotFoundException( getMessage("error.orgService.trobarArea", new Object[]{areaId}) );
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(personaCodi);
if (persona == null)
throw new NotFoundException( getMessage("error.orgService.trobarPersona", new Object[]{personaCodi}) );
List<Carrec> carrecs = carrecDao.findAmbArea(areaId);
for (Carrec carrec: carrecs) {
if (personaCodi.equals(carrec.getPersonaCodi())) {
carrec.setPersonaCodi(null);
carrec.setPersonaSexe(null);
}
}
Iterator<AreaMembre> it = area.getMembres().iterator();
while (it.hasNext()) {
AreaMembre membre = it.next();
if (membre.getCodi().equals(personaCodi)) {
it.remove();
areaMembreDao.delete(membre.getId());
break;
}
}
}
public List<PersonaDto> findMembresArea(Long areaId) {
Set<AreaMembre> membres = getAreaById(areaId).getMembres();
List<PersonaDto> resposta = new ArrayList<PersonaDto>();
for (AreaMembre membre: membres) {
PersonaDto persona = pluginPersonaDao.findAmbCodiPlugin(membre.getCodi());
if (persona != null)
resposta.add(persona);
}
return resposta;
}
public AreaTipus getAreaTipusById(Long id) {
return areaTipusDao.getById(id, false);
}
public AreaTipus createAreaTipus(AreaTipus entity) {
return areaTipusDao.saveOrUpdate(entity);
}
public AreaTipus updateAreaTipus(AreaTipus entity) {
return areaTipusDao.merge(entity);
}
public void deleteAreaTipus(Long id) {
areaTipusDao.delete(id);
}
public List<AreaTipus> findAreaTipusAmbEntorn(Long entornId) {
return areaTipusDao.findAmbEntorn(entornId);
}
public List<AreaTipus> findAreaTipusPagedAndOrderedAmbEntorn(
Long entornId,
String sort,
boolean asc,
int firstRow,
int maxResults) {
return areaTipusDao.findPagedAndOrderedAmbEntorn(
entornId,
sort,
asc,
firstRow,
maxResults);
}
public int countAreaTipusAmbEntorn(Long entornId) {
return areaTipusDao.getCountAmbEntorn(entornId);
}
public AreaTipus findAreaTipusAmbEntornICodi(
Long entornId,
String codi) {
return areaTipusDao.findAmbEntornICodi(entornId, codi);
}
public Carrec getCarrecById(Long id) {
return carrecDao.getById(id, false);
}
public Carrec createCarrec(Carrec entity) {
return carrecDao.saveOrUpdate(entity);
}
public Carrec updateCarrec(Carrec entity) {
return carrecDao.merge(entity);
}
public void deleteCarrec(Long id) {
carrecDao.delete(id);
}
public List<Carrec> findCarrecPagedAndOrderedAmbEntorn(
Long entornId,
String sort,
boolean asc,
int firstRow,
int maxResults) {
return carrecDao.findPagedAndOrderedAmbEntorn(
entornId,
sort,
asc,
firstRow,
maxResults);
}
public int countCarrecAmbEntorn(Long entornId) {
return carrecDao.getCountAmbEntorn(entornId);
}
public Carrec findCarrecAmbEntornICodi(
Long entornId,
String codi) {
return carrecDao.findAmbEntornICodi(entornId, codi);
}
public Carrec findCarrecAmbEntornAreaICodi(
Long entornId,
String areaCodi,
String carrecCodi) {
return carrecDao.findAmbEntornAreaICodi(entornId, areaCodi, carrecCodi);
}
public List<Carrec> findCarrecsAmbArea(
Long areaId) {
return carrecDao.findAmbArea(areaId);
}
public Map<String, List<Carrec>> findCarrecsMapAmbArea(
Long areaId) {
Map<String, List<Carrec>> resposta = new HashMap<String, List<Carrec>>();
List<Carrec> carrecs = carrecDao.findAmbArea(areaId);
for (Carrec carrec: carrecs) {
if (carrec.getPersonaCodi() != null) {
List<Carrec> carrecsPersona = resposta.get(carrec.getPersonaCodi());
if (carrecsPersona == null) {
carrecsPersona = new ArrayList<Carrec>();
resposta.put(carrec.getPersonaCodi(), carrecsPersona);
}
carrecsPersona.add(carrec);
}
}
return resposta;
}
@Secured({"ROLE_ADMIN"})
public CarrecJbpmId getCarrecJbpmIdById(Long id) {
return carrecJbpmIdDao.getById(id, false);
}
@Secured({"ROLE_ADMIN"})
public CarrecJbpmId createCarrecJbpmId(CarrecJbpmId entity) {
return carrecJbpmIdDao.saveOrUpdate(entity);
}
@Secured({"ROLE_ADMIN"})
public CarrecJbpmId updateCarrecJbpmId(CarrecJbpmId entity) {
return carrecJbpmIdDao.merge(entity);
}
@Secured({"ROLE_ADMIN"})
public void deleteCarrecJbpmId(Long id) {
CarrecJbpmId vell = getCarrecJbpmIdById(id);
if (vell != null)
carrecJbpmIdDao.delete(id);
}
@Secured({"ROLE_ADMIN"})
public List<CarrecJbpmId> findCarrecJbpmIdAll() {
return carrecJbpmIdDao.findAll();
}
@Secured({"ROLE_ADMIN"})
public List<CarrecJbpmId> findCarrecJbpmIdSenseAssignar() {
return carrecJbpmIdDao.findSenseAssignar();
}
public List<String> findCodisPersonaAmbJbpmIdGroup(String group) {
return carrecJbpmIdDao.findPersonesAmbGrup(group);
}
public List<String> findCodisPersonaAmbArea(Long areaId) {
Area area = getAreaById(areaId);
List<String> resposta = new ArrayList<String>();
for (AreaMembre membre: area.getMembres())
resposta.add(membre.getCodi());
return resposta;
}
public List<String> findCodisPersonaAmbJbpmIdGroupCarrec(
String groupCodi,
String carrecCodi) {
return carrecJbpmIdDao.findPersonesAmbGrupICarrec(groupCodi, carrecCodi);
}
/* Per suprimir */
public List<String> findCodisPersonaAmbJbpmIdCarrec(String carrecCodi) {
return carrecJbpmIdDao.findPersonesAmbCarrecCodi(carrecCodi);
}
@Secured({"ROLE_ADMIN"})
public AreaJbpmId getAreaJbpmIdById(Long id) {
return areaJbpmIdDao.getById(id, false);
}
@Secured({"ROLE_ADMIN"})
public AreaJbpmId createAreaJbpmId(AreaJbpmId entity) {
return areaJbpmIdDao.saveOrUpdate(entity);
}
@Secured({"ROLE_ADMIN"})
public AreaJbpmId updateAreaJbpmId(AreaJbpmId entity) {
return areaJbpmIdDao.merge(entity);
}
@Secured({"ROLE_ADMIN"})
public void deleteAreaJbpmId(Long id) {
AreaJbpmId vella = getAreaJbpmIdById(id);
if (vella != null)
areaJbpmIdDao.delete(id);
}
@Secured({"ROLE_ADMIN"})
public List<AreaJbpmId> findAreaJbpmIdAll() {
return areaJbpmIdDao.findAll();
}
@Secured({"ROLE_ADMIN"})
public List<AreaJbpmId> findAreaJbpmIdSenseAssignar() {
return areaJbpmIdDao.findSenseAssignar();
}
public List<AreaJbpmId> findDistinctJbpmGroups() {
return areaJbpmIdDao.findDistinctJbpmGrupAll();
}
public List<String> findAreesMembre(String usuariCodi) {
List<String> codisArea = new ArrayList<String>();
List<AreaMembre> membres = areaMembreDao.findAmbUsuariCodi(usuariCodi);
for (AreaMembre membre: membres) {
codisArea.add(membre.getArea().getCodi());
}
return codisArea;
}
public List<String> findRolsJbpmIdMembre(String usuariCodi) {
return areaJbpmIdDao.findRolesAmbUsuariCodi(usuariCodi);
}
public List<String> findAreesJbpmIdMembre(String usuariCodi) {
return areaJbpmIdDao.findAmbUsuariCodi(usuariCodi);
}
@Autowired
public void setAreaDao(AreaDao areaDao) {
this.areaDao = areaDao;
}
@Autowired
public void setAreaMembreDao(AreaMembreDao areaMembreDao) {
this.areaMembreDao = areaMembreDao;
}
@Autowired
public void setAreaTipusDao(AreaTipusDao areaTipusDao) {
this.areaTipusDao = areaTipusDao;
}
@Autowired
public void setPluginPersonaDao(PluginPersonaDao pluginPersonaDao) {
this.pluginPersonaDao = pluginPersonaDao;
}
@Autowired
public void setCarrecDao(CarrecDao carrecDao) {
this.carrecDao = carrecDao;
}
@Autowired
public void setCarrecJbpmIdDao(CarrecJbpmIdDao carrecJbpmIdDao) {
this.carrecJbpmIdDao = carrecJbpmIdDao;
}
@Autowired
public void setAreaJbpmIdDao(AreaJbpmIdDao areaJbpmIdDao) {
this.areaJbpmIdDao = areaJbpmIdDao;
}
@Autowired
public void setMessageSource(MessageSource messageSource) {
this.messageSource = messageSource;
}
/*private void createUserIfNotExists(Persona persona) {
User user = identityService.findUserById(persona.getCodi());
if (user != null)
identityService.deleteUser(persona.getCodi());
identityService.createUser(
persona.getCodi(),
persona.getNom(),
persona.getLlinatges(),
persona.getEmail());
}
private void createGroupIfNotExists(Area area) {
String groupId = getGroupIdForArea(area);
Group group = identityService.findGroupById(groupId);
if (group == null) {
String groupName = getGroupNameForArea(area);
if (area.getPare() != null) {
createGroupIfNotExists(area.getPare());
identityService.createGroup(
groupName,
area.getTipus().getCodi(),
getGroupIdForArea(area.getPare()));
} else {
identityService.createGroup(
groupName,
area.getTipus().getCodi());
}
}
}
private void deleteGroupIfExists(Area area) {
String groupId = getGroupIdForArea(area);
identityService.deleteGroup(groupId);
}
private void createMembershipIfNotExists(
Area area,
Persona persona,
Carrec carrec) {
String groupId = getGroupIdForArea(area);
if (carrec != null)
identityService.createMembership(
persona.getCodi(),
groupId,
carrec.getCodi());
else
identityService.createMembership(
persona.getCodi(),
groupId);
}
private void deleteMembershipIfExists(
Area area,
Persona persona,
Carrec carrec) {
String groupId = getGroupIdForArea(area);
try {
identityService.deleteMembership(
persona.getCodi(),
groupId,
null);
} catch (Exception ignored) {
ignored.printStackTrace();
}
}
private String getGroupNameForArea(Area area) {
String entornCodi = area.getEntorn().getCodi();
return entornCodi + "#" + area.getCodi();
}
private String getGroupIdForArea(Area area) {
String entornCodi = area.getEntorn().getCodi();
String tipusCodi = area.getTipus().getCodi();
return tipusCodi + "." + entornCodi + "#" + area.getCodi();
}*/
protected String getMessage(String key, Object[] vars) {
try {
return messageSource.getMessage(
key,
vars,
null);
} catch (NoSuchMessageException ex) {
return "???" + key + "???";
}
}
protected String getMessage(String key) {
return getMessage(key, null);
}
}