/* * HumanResource.java * * Created on 27.05.2003 */ package net.sourceforge.ganttproject.resource; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.swing.DefaultListModel; import biz.ganttproject.core.calendar.GanttDaysOff; import net.sourceforge.ganttproject.CustomProperty; import net.sourceforge.ganttproject.CustomPropertyDefinition; import net.sourceforge.ganttproject.CustomPropertyHolder; import net.sourceforge.ganttproject.CustomPropertyManager; import net.sourceforge.ganttproject.language.GanttLanguage; import net.sourceforge.ganttproject.roles.Role; import net.sourceforge.ganttproject.task.CustomColumnsException; import net.sourceforge.ganttproject.task.CustomColumnsValues; import net.sourceforge.ganttproject.task.ResourceAssignment; import net.sourceforge.ganttproject.task.Task; /** * @author barmeier */ public class HumanResource implements CustomPropertyHolder { /** * Can be turned (temporarily) off to prevent (a flood of) events */ private boolean areEventsEnabled = true; private int id = -1; private String name; private String phone = ""; private String email = ""; private Role myRole; private String description; private LoadDistribution myLoadDistribution; private BigDecimal myStandardPayRate; private final DefaultListModel myDaysOffList = new DefaultListModel(); private final List<ResourceAssignment> myAssignments = new ArrayList<ResourceAssignment>(); private final CustomColumnsValues myCustomProperties; private final HumanResourceManager myManager; HumanResource(HumanResourceManager manager) { this("", -1, manager); } /** Creates a new instance of HumanResource */ public HumanResource(String name, int id, HumanResourceManager manager) { this.id = id; this.name = name; myManager = manager; myCustomProperties = new CustomColumnsValues(myManager.getCustomPropertyManager()); } private HumanResource(HumanResource copy) { areEventsEnabled = false; setId(-1); String newName = GanttLanguage.getInstance().formatText("resource.copy.prefix", GanttLanguage.getInstance().getText("copy2"), copy.getName()); setName(newName); setDescription(copy.getDescription()); setMail(copy.getMail()); setPhone(copy.getPhone()); setRole(copy.getRole()); setStandardPayRate(copy.getStandardPayRate()); myManager = copy.myManager; DefaultListModel copyDaysOff = copy.getDaysOff(); for (int i = 0; i < copyDaysOff.getSize(); i++) { myDaysOffList.addElement(copyDaysOff.get(i)); } areEventsEnabled = true; myCustomProperties = (CustomColumnsValues) copy.myCustomProperties.clone(); } /** * Removes the assignment objects associated to this ProjectResource and those * associated to it's Tasks */ private void removeAllAssignments() { List<ResourceAssignment> copy = new ArrayList<ResourceAssignment>(myAssignments); for (int i = 0; i < copy.size(); i++) { ResourceAssignmentImpl next = (ResourceAssignmentImpl) copy.get(i); next.myAssignmentToTask.delete(); } resetLoads(); } public void delete() { removeAllAssignments(); myManager.remove(this); } public void setId(int id) { if (this.id == -1) { // setting the id is only allowed when id is not assigned this.id = id; } } public int getId() { return id; } public void setName(String name) { this.name = name; fireResourceChanged(); } public String getName() { return name; } public void setDescription(String description) { this.description = description; fireResourceChanged(); } public String getDescription() { return description; } public void setMail(String email) { if (email == null) { return; } this.email = email; fireResourceChanged(); } public String getMail() { return email; } public void setPhone(String phone) { if (phone == null) { return; } this.phone = phone; fireResourceChanged(); } public String getPhone() { return phone; } public void setRole(Role role) { myRole = role; fireResourceChanged(); } public Role getRole() { if (myRole == null) { System.err.println("[HumanResource] getRole(): I have no role :( name=" + getName()); } return myRole; } public void addDaysOff(GanttDaysOff gdo) { myDaysOffList.addElement(gdo); fireResourceChanged(); } public DefaultListModel getDaysOff() { return myDaysOffList; } public Object getCustomField(CustomPropertyDefinition def) { return myCustomProperties.getValue(def); } public void setCustomField(CustomPropertyDefinition def, Object value) { try { myCustomProperties.setValue(def, value); fireResourceChanged(); } catch (CustomColumnsException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public ResourceAssignment createAssignment(ResourceAssignment assignmentToTask) { ResourceAssignment result = new ResourceAssignmentImpl(assignmentToTask); myAssignments.add(result); resetLoads(); fireAssignmentsChanged(); return result; } public ResourceAssignment[] getAssignments() { return myAssignments.toArray(new ResourceAssignment[0]); } public HumanResource unpluggedClone() { return new HumanResource(this); } private void fireResourceChanged() { if (areEventsEnabled) { myManager.fireResourceChanged(this); } } protected void fireAssignmentsChanged() { if (areEventsEnabled) { myManager.fireAssignmentsChanged(this); } } @Override public List<CustomProperty> getCustomProperties() { return myCustomProperties.getCustomProperties(); } @Override public CustomProperty addCustomProperty(CustomPropertyDefinition definition, String valueAsString) { final CustomPropertyDefinition stubDefinition = CustomPropertyManager.PropertyTypeEncoder.decodeTypeAndDefaultValue( definition.getTypeAsString(), valueAsString); setCustomField(definition, stubDefinition.getDefaultValue()); return new CustomPropertyImpl(definition, stubDefinition.getDefaultValue()); } private static class CustomPropertyImpl implements CustomProperty { private CustomPropertyDefinition myDefinition; private Object myValue; public CustomPropertyImpl(CustomPropertyDefinition definition, Object value) { myDefinition = definition; myValue = value; } @Override public CustomPropertyDefinition getDefinition() { return myDefinition; } @Override public Object getValue() { return myValue; } @Override public String getValueAsString() { return HumanResourceManager.getValueAsString(myValue); } } public void resetLoads() { myLoadDistribution = null; } public LoadDistribution getLoadDistribution() { if (myLoadDistribution == null) { myLoadDistribution = new LoadDistribution(this); } return myLoadDistribution; } private void fireAssignmentChanged(ResourceAssignmentImpl resourceAssignmentImpl) { resetLoads(); fireAssignmentsChanged(); } public void swapAssignments(ResourceAssignment a1, ResourceAssignment a2) { Collections.swap(myAssignments, myAssignments.indexOf(a1), myAssignments.indexOf(a2)); resetLoads(); fireAssignmentsChanged(); } public void setStandardPayRate(BigDecimal rate) { myStandardPayRate = rate; } public BigDecimal getStandardPayRate() { return myStandardPayRate == null ? BigDecimal.ZERO : myStandardPayRate; } public BigDecimal getTotalCost() { BigDecimal cost = BigDecimal.ZERO; for (ResourceAssignment assignment : myAssignments) { int taskDuration = assignment.getTask().getDuration().getLength(); BigDecimal assignmentCost = new BigDecimal(taskDuration * assignment.getLoad() / 100).multiply(getStandardPayRate()); cost = cost.add(assignmentCost); } return cost; } @Override public boolean equals(Object obj) { boolean result = false; if (obj instanceof HumanResource) { HumanResource pr = (HumanResource) obj; result = pr.id == id; } return result; } @Override public String toString() { return name; } private class ResourceAssignmentImpl implements ResourceAssignment { private final ResourceAssignment myAssignmentToTask; private float myLoad; private boolean myCoordinator; private Role myRoleForAssignment; private ResourceAssignmentImpl(ResourceAssignment assignmentToTask) { myAssignmentToTask = assignmentToTask; } @Override public Task getTask() { return myAssignmentToTask.getTask(); } @Override public HumanResource getResource() { return HumanResource.this; } @Override public float getLoad() { return myLoad; } @Override public void setLoad(float load) { myLoad = load; HumanResource.this.fireAssignmentChanged(this); } /** Removes all related assignments */ @Override public void delete() { HumanResource.this.myAssignments.remove(this); HumanResource.this.fireAssignmentChanged(this); } @Override public void setCoordinator(boolean responsible) { myCoordinator = responsible; } @Override public boolean isCoordinator() { return myCoordinator; } @Override public Role getRoleForAssignment() { return myRoleForAssignment; } @Override public void setRoleForAssignment(Role role) { myRoleForAssignment = role; } @Override public String toString() { return this.getResource().getName() + " -> " + this.getTask().getName(); } } }