diff --git a/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java b/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java index 9f5ea2286..96d140149 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java +++ b/libreplan-business/src/main/java/org/libreplan/business/resources/entities/Worker.java @@ -30,6 +30,7 @@ import org.libreplan.business.common.Registry; import org.libreplan.business.common.exceptions.InstanceNotFoundException; import org.libreplan.business.users.daos.IUserDAO; import org.libreplan.business.users.entities.User; +import org.libreplan.business.users.entities.UserRole; /** * This class models a worker. @@ -215,10 +216,13 @@ public class Worker extends Resource { public void setUser(User user) { this.user = user; + if (user != null) { + user.addRole(UserRole.ROLE_BOUND_USER); + } } @AssertTrue(message = "User already bound to other worker") - public boolean checkUserNotBoundToOtherWorker() { + public boolean checkConstraintUserNotBoundToOtherWorker() { if (user == null || user.isNewObject()) { return true; } @@ -242,7 +246,7 @@ public class Worker extends Resource { } @AssertTrue(message = "Limiting resources cannot be bound to any user") - public boolean checkLimitingResourceNotBoundToUser() { + public boolean checkConstraintLimitingResourceNotBoundToUser() { if (isLimitingResource()) { return user == null; } @@ -250,7 +254,7 @@ public class Worker extends Resource { } @AssertTrue(message = "Virtual resources cannot be bound to any user") - public boolean checkVirtualResourceNotBoundToUser() { + public boolean checkConstraintVirtualResourceNotBoundToUser() { if (isVirtual()) { return user == null; } @@ -264,4 +268,12 @@ public class Worker extends Resource { } } + @AssertTrue(message = "Bound user has proper role") + public boolean checkConstraintBoundUserHaveProperRole() { + if (user == null) { + return true; + } + return user.getRoles().contains(UserRole.ROLE_BOUND_USER); + } + } diff --git a/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java b/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java index 71d002c0c..36a5efde7 100644 --- a/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java +++ b/libreplan-business/src/main/java/org/libreplan/business/users/entities/User.java @@ -305,6 +305,11 @@ public class User extends BaseEntity implements IHumanIdentifiable{ public void setWorker(Worker worker) { this.worker = worker; + if (worker == null) { + roles.remove(UserRole.ROLE_BOUND_USER); + } else { + roles.add(UserRole.ROLE_BOUND_USER); + } } public String getFullName() { diff --git a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java index 002766479..9227e8722 100644 --- a/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java +++ b/libreplan-webapp/src/main/java/org/libreplan/web/resources/worker/WorkerModel.java @@ -61,6 +61,7 @@ import org.libreplan.business.resources.entities.Worker; import org.libreplan.business.scenarios.IScenarioManager; import org.libreplan.business.users.daos.IUserDAO; import org.libreplan.business.users.entities.User; +import org.libreplan.business.users.entities.UserRole; import org.libreplan.business.workreports.daos.IWorkReportLineDAO; import org.libreplan.web.calendars.IBaseCalendarModel; import org.libreplan.web.common.IntegrationEntityModel; @@ -101,6 +102,8 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel private Worker worker; + private User boundUser; + private ResourceCalendar calendarToRemove = null; private final ICriterionDAO criterionDAO; @@ -146,6 +149,7 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel @Transactional public void save() throws ValidationException { removeCalendarIfNeeded(); + resetRoleInOriginalBoundUser(); resourceDAO.save(worker); if (worker.getCalendar() != null) { baseCalendarModel.checkInvalidValuesCalendar(worker.getCalendar()); @@ -157,6 +161,17 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel localizationsAssigner = null; } + private void resetRoleInOriginalBoundUser() { + if (boundUser != null) { + User user = worker.getUser(); + if (user == null || user.getId() == null + || !user.getId().equals(boundUser.getId())) { + boundUser.removeRole(UserRole.ROLE_BOUND_USER); + userDAO.save(boundUser); + } + } + } + private void removeCalendarIfNeeded() { if (calendarToRemove != null) { try { @@ -221,6 +236,7 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel } localizationsAssigner = new MultipleCriterionActiveAssigner( criterionDAO, worker, PredefinedCriterionTypes.LOCATION); + boundUser = null; } @Override @@ -232,6 +248,7 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel forceLoadSatisfactions(this.worker); forceLoadCalendar(this.worker); forceLoadUser(this.worker); + this.boundUser = this.worker.getUser(); localizationsAssigner = new MultipleCriterionActiveAssigner( criterionDAO, this.worker, PredefinedCriterionTypes.LOCATION); @@ -609,8 +626,15 @@ public class WorkerModel extends IntegrationEntityModel implements IWorkerModel public void confirmRemove(Worker worker, boolean removeBoundUser) throws InstanceNotFoundException { resourceDAO.remove(worker.getId()); + + User user = getBoundUserFromDB(worker); if (removeBoundUser) { - userDAO.remove(worker.getUser()); + userDAO.remove(user); + } else { + if (user != null) { + user.removeRole(UserRole.ROLE_BOUND_USER); + userDAO.save(user); + } } }