package scrum.server.project; import ilarkesto.core.base.Str; import java.util.Set; import scrum.client.common.LabelSupport; import scrum.client.common.ReferenceSupport; import scrum.server.admin.User; import scrum.server.common.Numbered; import scrum.server.estimation.RequirementEstimationVote; import scrum.server.estimation.RequirementEstimationVoteDao; import scrum.server.sprint.Task; import scrum.server.sprint.TaskDao; public class Requirement extends GRequirement implements Numbered, ReferenceSupport, LabelSupport { // --- dependencies --- private static TaskDao taskDao; private static RequirementEstimationVoteDao requirementEstimationVoteDao; public static void setRequirementEstimationVoteDao(RequirementEstimationVoteDao requirementEstimationVoteDao) { Requirement.requirementEstimationVoteDao = requirementEstimationVoteDao; } public static void setTaskDao(TaskDao taskDao) { Requirement.taskDao = taskDao; } // --- --- public String getEstimatedWorkAsString() { Float work = getEstimatedWork(); if (work == null) return null; if (work <= 0.5f) return work.toString(); return String.valueOf(work.intValue()); } public void setEstimatedWorkAsString(String value) { if (Str.isBlank(value)) { setEstimatedWork(null); return; } setEstimatedWork(Float.parseFloat(value)); } public boolean isInCurrentSprint() { if (!isSprintSet()) return false; return isSprint(getProject().getCurrentSprint()); } public void initializeEstimationVotes() { for (User user : getProject().getTeamMembers()) { RequirementEstimationVote vote = getEstimationVote(user); if (vote == null) vote = requirementEstimationVoteDao.postVote(this, user); vote.setEstimatedWork(null); } } private RequirementEstimationVote getEstimationVote(User user) { return requirementEstimationVoteDao.getRequirementEstimationVoteByUser(this, user); } public Set<RequirementEstimationVote> getEstimationVotes() { return requirementEstimationVoteDao.getRequirementEstimationVotesByRequirement(this); } public void clearEstimationVotes() { for (RequirementEstimationVote vote : getEstimationVotes()) { requirementEstimationVoteDao.deleteEntity(vote); } } public boolean isTasksClosed() { for (Task task : getTasks()) { if (!task.isClosed()) return false; } return true; } public String getReferenceAndLabel() { return getReference() + " " + getLabel(); } @Override public String getReference() { return scrum.client.project.Requirement.REFERENCE_PREFIX + getNumber(); } @Override public void updateNumber() { if (getNumber() == 0) setNumber(getProject().generateRequirementNumber()); } @Override public void ensureIntegrity() { super.ensureIntegrity(); updateNumber(); // delete estimation votes when closed or in sprint if (isClosed() || isSprintSet()) clearEstimationVotes(); // delete when closed and older than 4 weeks if (isClosed() && getLastModified().getPeriodToNow().toWeeks() > 4) getDao().deleteEntity(this); } public Set<Task> getTasks() { return taskDao.getTasksByRequirement(this); } @Override public boolean isVisibleFor(User user) { return getProject().isVisibleFor(user); } @Override public String toString() { return getReferenceAndLabel(); } }