package com.metservice.kanban.charts.cycletime;
import java.util.ArrayList;
import java.util.List;
import org.joda.time.LocalDate;
import com.metservice.kanban.model.WorkItem;
import com.metservice.kanban.utils.WorkingDayUtils;
public class CycleTimeColumn {
private String name;
private List<CycleTimeFragment> fragments;
public CycleTimeColumn(String name) {
this.name = name;
fragments = new ArrayList<CycleTimeFragment>();
}
public void addFragment(String fragmentName, Integer weight) {
fragments.add(new CycleTimeFragment(fragmentName, weight));
}
public int numberOfFragments() {
return fragments.size();
}
public String getFragmentName(int index) {
return fragments.get(index).getName();
}
public Integer getFragmentWeight(int index) {
return fragments.get(index).getWeight();
}
public String getName() {
return name;
}
public static CycleTimeColumn buildCycleTimeColumnFromWorkItem(WorkItem workItem) {
List<String> phases = workItem.getType().getPhases();
List<String> phasesAfterInitialPhase = phases.subList(1, phases.size());
CycleTimeColumn column = new CycleTimeColumn(Integer.toString(workItem.getId()));
LocalDate previousDate = null;
String previousPhase = null;
for (String phase : phasesAfterInitialPhase) {
LocalDate date = dateWhenPhaseWasCompleted(workItem, phase);
if (date != null && previousDate != null && previousPhase != null) {
int diffInDays = WorkingDayUtils.getWorkingDaysBetween(previousDate, date);
column.addFragment(previousPhase, diffInDays);
}
if (date != null) {
previousDate = date;
previousPhase = phase;
}
}
return column;
}
static LocalDate dateWhenPhaseWasCompleted(WorkItem workItem, String phase) {
LocalDate date = workItem.getDate(phase);
if (date == null) {
return null;
// String message = String.format("Phase %s was not completed for item %d-%s ",
// phase, workItem.getId(), workItem.getName());
// throw new InconsistentWorkItemException(message);
}
return date;
}
}