Updates to date processing on xls generation

modified procedures and medications to have effective, start, and end for IVL_TS
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SheetHeaderUtil.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SheetHeaderUtil.java
index 5092037..6332b57 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SheetHeaderUtil.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SheetHeaderUtil.java
@@ -186,7 +186,11 @@
 	 */
 	static int createProcedureHeader(Row row1, Row row2, int offset) {
 		row2.createCell(offset++).setCellValue(replaceSpace("ID"));
-		row2.createCell(offset++).setCellValue(replaceSpace("Date"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Effective Date"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Start Date"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
+		row2.createCell(offset++).setCellValue(replaceSpace("End Date"));
 		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
 		row2.getSheet().setColumnHidden(offset - 1, hideColumns);
 		offset = addCodeHeader(row2, offset, "Procedure");
@@ -264,7 +268,10 @@
 		row2.getSheet().setColumnHidden(offset - 1, hideColumns);
 		row2.createCell(offset++).setCellValue(replaceSpace("Administration Date"));
 		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
-		row2.getSheet().setColumnHidden(offset - 1, hideColumns);
+		row2.createCell(offset++).setCellValue(replaceSpace("Administration Start Date"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Administration End Date"));
+		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
 		row2.createCell(offset++).setCellValue(replaceSpace("Lot Number"));
 		row2.createCell(offset++).setCellValue(replaceSpace("Location"));
 		row2.getSheet().setColumnHidden(offset - 1, hideColumns);
diff --git a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
index 7ed8d35..08ad94d 100644
--- a/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
+++ b/cda/plugins/org.eclipse.mdht.cda.xml.ui/src/org/eclipse/mdht/cda/xml/ui/handlers/SpreadsheetSerializer.java
@@ -1701,6 +1701,57 @@
 		return offset;
 	}
 
+	static int serializeCompleteDate(Row row, int offset, IVL_TS effectiveTime) {
+
+		if (effectiveTime.getValue() != null) {
+
+			Date effectiveDate = CDAValueUtil.getDate(effectiveTime.getValue());
+			if (effectiveDate != null) {
+				row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(effectiveDate));
+			} else {
+				row.createCell(offset++).setCellValue("");
+			}
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime));
+		} else {
+			row.createCell(offset++).setCellValue("");
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime));
+		}
+
+		if (effectiveTime.getLow() != null) {
+
+			Date effectiveDateLow = CDAValueUtil.getDate(effectiveTime.getLow().getValue());
+			if (effectiveDateLow != null) {
+				row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(effectiveDateLow));
+			} else {
+				row.createCell(offset++).setCellValue("");
+			}
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime.getLow()));
+
+		} else {
+			row.createCell(offset++).setCellValue("");
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime));
+
+		}
+
+		if (effectiveTime.getLow() != null) {
+
+			Date effectiveDateHigh = CDAValueUtil.getDate(effectiveTime.getHigh().getValue());
+			if (effectiveDateHigh != null) {
+				row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(effectiveDateHigh));
+			} else {
+				row.createCell(offset++).setCellValue("");
+			}
+
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime.getHigh()));
+		} else {
+			row.createCell(offset++).setCellValue("");
+			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(effectiveTime));
+
+		}
+
+		return offset;
+	}
+
 	/**
 	 * @param row
 	 * @param offset
@@ -1718,14 +1769,7 @@
 
 		sb = new StringBuffer();
 
-		Date d = CDAValueUtil.getDate(CDAValueUtil.getValueAsString(procedureActivityAct.getEffectiveTime()));
-		if (d != null) {
-			row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
-		} else {
-			row.createCell(offset++).setCellValue("");
-		}
-
-		row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(procedureActivityAct.getEffectiveTime()));
+		offset = serializeCompleteDate(row, offset, procedureActivityAct.getEffectiveTime());
 
 		offset = SpreadsheetSerializer.appendCodeShowNullFlavor(
 			row, offset, procedureActivityAct.getSection(), procedureActivityAct.getCode(),
@@ -1787,14 +1831,16 @@
 
 		sb = new StringBuffer();
 
-		Date d = CDAValueUtil.getDate(CDAValueUtil.getValueAsString(procedureActivityObservation.getEffectiveTime()));
-		if (d != null) {
-			row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
-		} else {
-			row.createCell(offset++).setCellValue("");
-		}
+		// Date d = CDAValueUtil.getDate(CDAValueUtil.getValueAsString(procedureActivityObservation.getEffectiveTime()));
+		// if (d != null) {
+		// row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
+		// } else {
+		// row.createCell(offset++).setCellValue("");
+		// }
+		//
+		// row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(procedureActivityObservation.getEffectiveTime()));
 
-		row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(procedureActivityObservation.getEffectiveTime()));
+		offset = serializeCompleteDate(row, offset, procedureActivityObservation.getEffectiveTime());
 
 		offset = SpreadsheetSerializer.appendCodeShowNullFlavor(
 			row, offset, procedureActivityObservation.getSection(), procedureActivityObservation.getCode(),
@@ -1821,14 +1867,16 @@
 
 		sb = new StringBuffer();
 
-		Date d = CDAValueUtil.getDate(CDAValueUtil.getValueAsString(procedureActivityProcedure.getEffectiveTime()));
-		if (d != null) {
-			row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
-		} else {
-			row.createCell(offset++).setCellValue("");
-		}
+		// Date d = CDAValueUtil.getDate(CDAValueUtil.getValueAsString(procedureActivityProcedure.getEffectiveTime()));
+		// if (d != null) {
+		// row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
+		// } else {
+		// row.createCell(offset++).setCellValue("");
+		// }
+		//
+		// row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(procedureActivityProcedure.getEffectiveTime()));
 
-		row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(procedureActivityProcedure.getEffectiveTime()));
+		offset = serializeCompleteDate(row, offset, procedureActivityProcedure.getEffectiveTime());
 
 		offset = SpreadsheetSerializer.appendCodeShowNullFlavor(
 			row, offset, procedureActivityProcedure.getSection(), procedureActivityProcedure.getCode(),
@@ -2022,7 +2070,6 @@
 		row.createCell(offset++).setCellValue(sb.toString());
 
 		sb = new StringBuffer();
-		substanceAdministration.getEffectiveTimes();
 
 		ST lotNumberText = null;
 		boolean hasCode = false;
@@ -2066,32 +2113,13 @@
 		row.createCell(offset++).setCellValue(CDAValueUtil.getValue(substanceAdministration.getDoseQuantity()));
 		row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(substanceAdministration.getDoseQuantity()));
 
-		String time = "";
-		EObject source = null;
 		for (SXCM_TS t : substanceAdministration.getEffectiveTimes()) {
-			source = t;
-			if (!StringUtils.isEmpty(t.getValue())) {
-				time = t.getValue();
-			}
-
 			if (t instanceof IVL_TS) {
-
-				time = CDAValueUtil.getValueAsString((IVL_TS) t);
-
+				offset = serializeCompleteDate(row, offset, (IVL_TS) t);
 			}
-
+			break;
 		}
 
-		Date d = CDAValueUtil.getDate(time);
-
-		if (d != null) {
-			row.createCell(offset++).setCellValue(CDAValueUtil.DATE_PRETTY.format(d));
-		} else {
-			row.createCell(offset++).setCellValue(time);
-		}
-
-		row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(source));
-
 		if (lotNumberText != null) {
 			row.createCell(offset++).setCellValue(lotNumberText.getText());
 			row.createCell(offset++).setCellValue(CDAUtil.getDomainPath(lotNumberText));