diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java index 996682d40..0857b6bf5 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/calendars/entities/ResourceCalendar.java @@ -20,6 +20,7 @@ package org.navalplanner.business.calendars.entities; +import org.hibernate.validator.AssertTrue; import org.joda.time.LocalDate; import org.navalplanner.business.resources.entities.Resource; @@ -65,4 +66,9 @@ public class ResourceCalendar extends BaseCalendar { return super.getWorkableHours(date); } + @AssertTrue(message = "Capacity must be a positive integer number") + public boolean checkCapacityPositiveIntegerNumber() { + return (capacity >= 1); + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java index 2005ecb2a..90589a01b 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/common/Registry.java @@ -32,6 +32,7 @@ import org.navalplanner.business.orders.daos.IOrderElementDAO; import org.navalplanner.business.qualityforms.daos.IQualityFormDAO; import org.navalplanner.business.resources.daos.ICriterionTypeDAO; import org.navalplanner.business.resources.daos.IMachineDAO; +import org.navalplanner.business.resources.daos.IWorkerDAO; import org.navalplanner.business.users.daos.IProfileDAO; import org.navalplanner.business.users.daos.IUserDAO; import org.navalplanner.business.workreports.daos.IWorkReportTypeDAO; @@ -100,6 +101,9 @@ public class Registry { @Autowired private IOrderElementDAO orderElementDAO; + @Autowired + private IWorkerDAO workerDAO; + private Registry() { } @@ -167,4 +171,8 @@ public class Registry { return getInstance().orderElementDAO; } + public static IWorkerDAO getWorkerDAO() { + return getInstance().workerDAO; + } + } \ No newline at end of file diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java index 6f8abc1c9..5f7146466 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/IWorkerDAO.java @@ -46,7 +46,7 @@ public interface IWorkerDAO extends IGenericDAO { * search worker by name(firstname or surname)/NIF * */ - List findByNameOrNif(String name); + List findByNameSubpartOrNifCaseInsensitive(String name); /** * Finds a {@link Worker} with the NIF param that should be unique. @@ -74,4 +74,38 @@ public interface IWorkerDAO extends IGenericDAO { */ List getWorkingHoursPerWorker(List workers, Date startingDate, Date endingDate); + /** + * Return list of workers with a particular firstName + * @param name + * The string with the name searched + * @return The list of {@link Worker} entities found + */ + List findByFirstNameCaseInsensitive(String name); + + /** + * Return list of workers with a particular firstName when called from + * inside an external transaction + * @param name + * The string with the name searched + * @return The list of {@link Worker} entities found + */ + List findByFirstNameAnotherTransactionCaseInsensitive(String name); + + /** + * Return list of workers with a particular set of firstName, surname and + * nif values + * @param firstname + * String value for firstname + * @param surname + * String value for surname + * @param nif + * String value for nif + * @return The list of {@link Worker} entities found + */ + List findByFirstNameSecondNameAndNif(String firstname, + String surname, String nif); + + List findByFirstNameSecondNameAndNifAnotherTransaction( + String firstname, String surname, String nif); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java index fd383c79a..011137ad1 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/daos/WorkerDAO.java @@ -33,6 +33,7 @@ import org.navalplanner.business.resources.entities.Worker; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** @@ -69,15 +70,47 @@ public class WorkerDAO extends GenericDAOHibernate @SuppressWarnings("unchecked") @Override - public List findByNameOrNif(String name) { + public List findByNameSubpartOrNifCaseInsensitive(String name) { String containsName = "%" + name + "%"; - return getSession().createCriteria(Worker.class).add( + return getSession().createCriteria(Worker.class) + .add( Restrictions.or(Restrictions.or(Restrictions.ilike( "firstName", containsName), Restrictions.ilike( "surname", containsName)), Restrictions.like( "nif", containsName))).list(); } + @SuppressWarnings("unchecked") + @Override + public List findByFirstNameCaseInsensitive(String name) { + return getSession().createCriteria(Worker.class).add( + Restrictions.ilike("firstName", name)).list(); + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public List findByFirstNameAnotherTransactionCaseInsensitive(String name) { + return findByFirstNameCaseInsensitive(name); + } + + @SuppressWarnings("unchecked") + @Override + public List findByFirstNameSecondNameAndNif(String firstname, + String secondname, String nif) { + return getSession().createCriteria(Worker.class).add( + Restrictions.and(Restrictions.ilike("firstName", firstname), + Restrictions.and(Restrictions.ilike("surname", + secondname), Restrictions.like("nif", nif)))) + .list(); + } + + @Override + @Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW) + public List findByFirstNameSecondNameAndNifAnotherTransaction( + String firstname, String secondname, String nif) { + return findByFirstNameSecondNameAndNif(firstname, secondname, nif); + } + @Override @Transactional(readOnly = true) public List getWorkingHoursPerWorker(List workers, Date startingDate, Date endingDate) { diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java index c52981625..fe75fd8f7 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/VirtualWorker.java @@ -20,6 +20,11 @@ package org.navalplanner.business.resources.entities; +import java.util.List; + +import org.hibernate.validator.AssertTrue; +import org.navalplanner.business.common.Registry; + /** * This class models a VirtualWorker. @@ -67,4 +72,19 @@ public class VirtualWorker extends Worker { this.observations = observations; } + + @AssertTrue(message = "Virtual worker group name must be unique") + public boolean checkConstraintUniqueVirtualGroupName() { + + List list = Registry.getWorkerDAO() + .findByFirstNameAnotherTransactionCaseInsensitive( + this.getFirstName()); + + if ((isNewObject() && list.isEmpty()) || list.isEmpty()) { + return true; + } else { + return list.get(0).getId().equals(getId()); + } + } + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java index c6e8f98f4..71cc961dd 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/resources/entities/Worker.java @@ -21,8 +21,12 @@ package org.navalplanner.business.resources.entities; +import java.util.List; + +import org.hibernate.validator.AssertTrue; import org.hibernate.validator.NotEmpty; import org.hibernate.validator.NotNull; +import org.navalplanner.business.common.Registry; /** * This class models a worker. @@ -111,4 +115,23 @@ public class Worker extends Resource { return !isVirtual(); } + @AssertTrue(message = "Worker with the same firstname, surname and nif previously existed") + public boolean checkConstraintUniqueFirstName() { + + if (this instanceof VirtualWorker) { + return true; + } + + List list = Registry.getWorkerDAO() + .findByFirstNameSecondNameAndNifAnotherTransaction(firstName, + surname, nif); + + if ((isNewObject() && list.isEmpty()) || list.isEmpty()) { + return true; + } else { + return list.get(0).getId().equals(getId()); + } + + } + } diff --git a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml index daea70f70..0b11c901d 100644 --- a/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml +++ b/navalplanner-business/src/main/resources/org/navalplanner/business/calendars/entities/Calendars.hbm.xml @@ -33,7 +33,7 @@ - + diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java index fc86955f6..3bc8b6b3a 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/search/ResourceSearchModel.java @@ -107,7 +107,7 @@ public class ResourceSearchModel implements IResourceSearchModel { if (emptyName) { return new ArrayList(resourcesMatchingCriterions); } - Set result = intersect(workerDAO.findByNameOrNif(name), + Set result = intersect(workerDAO.findByNameSubpartOrNifCaseInsensitive(name), resourcesMatchingCriterions); result.addAll(intersect(machineDAO.findByNameOrCode(name), resourcesMatchingCriterions)); diff --git a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java index 261ba70d1..04032a8c1 100644 --- a/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java +++ b/navalplanner-webapp/src/main/java/org/navalplanner/web/resources/worker/WorkerModel.java @@ -523,7 +523,6 @@ public class WorkerModel implements IWorkerModel { public void setCapacity(Integer capacity) { if (getCalendar() != null) { getCalendar().setCapacity(capacity); - System.out.println("not null" + getCalendar().getCapacity()); } } diff --git a/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul index f38e5ed85..51aabeb7e 100644 --- a/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul +++ b/navalplanner-webapp/src/main/webapp/resources/worker/_edition.zul @@ -62,7 +62,7 @@