use of org.hisp.dhis.period.BiWeeklyPeriodType in project dhis2-core by dhis2.
the class DataApprovalWorkflowTest method testGetWorkflowSqlCoEnddateExtension.
/**
* Note that as part of the following test, we are checking to be sure that
* the longest extension to the category option end date is returned from
* data sets that are successively added to the workflow. The total
* extension length (period length times number of periods) is always
* increasing as we add data sets to the workflow. The most recently-added
* data set always has the longest total extension so far.
*/
@Test
void testGetWorkflowSqlCoEnddateExtension() {
DataSet noPeriodsAfterCoEndDate = createDataSet("noPeriodsAfterCoEndDate", new MonthlyPeriodType(), 0);
DataSet dailyDs = createDataSet("dailyDs", new DailyPeriodType(), 3);
DataSet weeklyDs = createDataSet("weeklyDs", new WeeklyPeriodType(), 3);
DataSet weeklyWedDs = createDataSet("weeklyWedDs", new WeeklyWednesdayPeriodType(), 4);
DataSet weeklyThuDs = createDataSet("weeklyThuDs", new WeeklyThursdayPeriodType(), 5);
DataSet weeklySatDs = createDataSet("weeklySatDs", new WeeklySaturdayPeriodType(), 6);
DataSet weeklySunDs = createDataSet("weeklySunDs", new WeeklySundayPeriodType(), 7);
DataSet biWeeklyDs = createDataSet("biWeeklyDs", new BiWeeklyPeriodType(), 4);
DataSet monthlyDs = createDataSet("monthlyDs", new MonthlyPeriodType(), 3);
DataSet biMonthlyDs = createDataSet("biMonthlyDs", new BiMonthlyPeriodType(), 3);
DataSet querterlyDs = createDataSet("querterlyDs", new QuarterlyPeriodType(), 3);
DataSet sixMonthlyDs = createDataSet("sixMonthlyDs", new SixMonthlyPeriodType(), 3);
DataSet sixMonthlyAprDs = createDataSet("sixMonthlyAprDs", new SixMonthlyAprilPeriodType(), 4);
DataSet sixMonthlyNovDs = createDataSet("sixMonthlyNovDs", new SixMonthlyNovemberPeriodType(), 5);
DataSet yearlyDs = createDataSet("yearlyDs", new YearlyPeriodType(), 3);
DataSet financialAprDs = createDataSet("financialAprDs", new FinancialAprilPeriodType(), 4);
DataSet financialJulDs = createDataSet("financialJulDs", new FinancialJulyPeriodType(), 5);
DataSet financialOctDs = createDataSet("financialOctDs", new FinancialOctoberPeriodType(), 6);
DataSet financialNovDs = createDataSet("financialNovDs", new FinancialNovemberPeriodType(), 7);
DataSet twoYearlyDs = createDataSet("twoYearlyDs", new TwoYearlyPeriodType(), 4);
DataApprovalWorkflow workflow = new DataApprovalWorkflow("test workflow", new DailyPeriodType(), newHashSet());
assertEquals("", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(noPeriodsAfterCoEndDate);
assertEquals("", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(dailyDs);
assertEquals(" + 3 * INTERVAL '+ 1 day'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(weeklyDs);
assertEquals(" + 3 * INTERVAL '+ 1 week'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(weeklyWedDs);
assertEquals(" + 4 * INTERVAL '+ 1 week'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(weeklyThuDs);
assertEquals(" + 5 * INTERVAL '+ 1 week'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(weeklySatDs);
assertEquals(" + 6 * INTERVAL '+ 1 week'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(weeklySunDs);
assertEquals(" + 7 * INTERVAL '+ 1 week'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(biWeeklyDs);
assertEquals(" + 4 * INTERVAL '+ 2 weeks'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(monthlyDs);
assertEquals(" + 3 * INTERVAL '+ 1 month'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(biMonthlyDs);
assertEquals(" + 3 * INTERVAL '+ 2 months'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(querterlyDs);
assertEquals(" + 3 * INTERVAL '+ 3 months'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(sixMonthlyDs);
assertEquals(" + 3 * INTERVAL '+ 6 months'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(sixMonthlyAprDs);
assertEquals(" + 4 * INTERVAL '+ 6 months'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(sixMonthlyNovDs);
assertEquals(" + 5 * INTERVAL '+ 6 months'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(yearlyDs);
assertEquals(" + 3 * INTERVAL '+ 1 year'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(financialAprDs);
assertEquals(" + 4 * INTERVAL '+ 1 year'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(financialJulDs);
assertEquals(" + 5 * INTERVAL '+ 1 year'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(financialOctDs);
assertEquals(" + 6 * INTERVAL '+ 1 year'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(financialNovDs);
assertEquals(" + 7 * INTERVAL '+ 1 year'", workflow.getSqlCoEndDateExtension());
workflow.getDataSets().add(twoYearlyDs);
assertEquals(" + 4 * INTERVAL '+ 2 years'", workflow.getSqlCoEndDateExtension());
}
use of org.hisp.dhis.period.BiWeeklyPeriodType in project dhis2-core by dhis2.
the class AdxPeriod method parse.
public static Period parse(String periodString) throws AdxException {
String[] tokens = periodString.split("/");
if (tokens.length != 2) {
throw new AdxException(periodString + " not in valid <date>/<duration> format");
}
try {
Period period;
PeriodType periodType = null;
Date startDate = DateUtils.getMediumDate(tokens[0]);
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
Duration duration = Duration.valueOf(tokens[1]);
switch(duration) {
case P1D:
periodType = new DailyPeriodType();
break;
case P7D:
switch(cal.get(Calendar.DAY_OF_WEEK)) {
case MONDAY:
periodType = new WeeklyPeriodType();
break;
case WEDNESDAY:
periodType = new WeeklyWednesdayPeriodType();
break;
case THURSDAY:
periodType = new WeeklyThursdayPeriodType();
break;
case SATURDAY:
periodType = new WeeklySaturdayPeriodType();
break;
case SUNDAY:
periodType = new WeeklySundayPeriodType();
break;
default:
throw new AdxException(periodString + " is invalid weekly type");
}
break;
case P14D:
periodType = new BiWeeklyPeriodType();
break;
case P1M:
periodType = new MonthlyPeriodType();
break;
case P2M:
periodType = new BiMonthlyPeriodType();
break;
case P3M:
periodType = new QuarterlyPeriodType();
break;
case P6M:
switch(cal.get(Calendar.MONTH)) {
case JANUARY:
case JULY:
periodType = new SixMonthlyPeriodType();
break;
case APRIL:
case OCTOBER:
periodType = new SixMonthlyAprilPeriodType();
break;
case NOVEMBER:
case MAY:
periodType = new SixMonthlyNovemberPeriodType();
break;
default:
throw new AdxException(periodString + " is invalid sixmonthly type");
}
break;
case P1Y:
switch(cal.get(Calendar.MONTH)) {
case JANUARY:
periodType = new YearlyPeriodType();
break;
case APRIL:
periodType = new FinancialAprilPeriodType();
break;
case JULY:
periodType = new FinancialJulyPeriodType();
break;
case OCTOBER:
periodType = new FinancialOctoberPeriodType();
break;
case NOVEMBER:
periodType = new FinancialNovemberPeriodType();
break;
default:
throw new AdxException(periodString + " is invalid yearly type");
}
break;
}
if (periodType != null) {
period = periodType.createPeriod(startDate);
} else {
throw new AdxException("Failed to create period type from " + duration);
}
return period;
} catch (IllegalArgumentException ex) {
throw new AdxException(tokens[1] + " is not a supported duration type");
}
}
use of org.hisp.dhis.period.BiWeeklyPeriodType in project dhis2-core by dhis2.
the class DateUnitPeriodTypeParser method parseInternal.
private DateInterval parseInternal(Calendar calendar, String period, DateUnitType.DateUnitTypeWithPattern dateUnitTypeWithPattern) {
Pattern pattern = dateUnitTypeWithPattern.getPattern();
DateUnitType dateUnitType = dateUnitTypeWithPattern.getDateUnitType();
Matcher matcher = pattern.matcher(period);
boolean match = matcher.find();
if (!match) {
return null;
}
if (DateUnitType.DAILY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int month = Integer.parseInt(matcher.group(2));
int day = Integer.parseInt(matcher.group(3));
DateTimeUnit dateTimeUnit = new DateTimeUnit(year, month, day, calendar.isIso8601());
dateTimeUnit.setDayOfWeek(calendar.weekday(dateTimeUnit));
return new DateInterval(dateTimeUnit, dateTimeUnit);
} else if (DateUnitType.WEEKLY == dateUnitType || DateUnitType.WEEKLY_WEDNESDAY == dateUnitType || DateUnitType.WEEKLY_THURSDAY == dateUnitType || DateUnitType.WEEKLY_SATURDAY == dateUnitType || DateUnitType.WEEKLY_SUNDAY == dateUnitType) {
DateTimeUnit start;
DateTimeUnit end;
int year = Integer.parseInt(matcher.group(1));
int week = Integer.parseInt(matcher.group(2));
WeeklyAbstractPeriodType periodType = (WeeklyAbstractPeriodType) PeriodType.getByNameIgnoreCase(dateUnitType.getName());
if (periodType == null || week < 1 || week > calendar.weeksInYear(year)) {
return null;
}
start = getDateTimeFromWeek(year, week, calendar, PeriodType.MAP_WEEK_TYPE.get(periodType.getName()), new DateTimeUnit(year, 1, 1));
end = calendar.plusWeeks(start, 1);
end = calendar.minusDays(end, 1);
return new DateInterval(start, end);
} else if (DateUnitType.BI_WEEKLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int week = Integer.parseInt(matcher.group(2)) * 2 - 1;
BiWeeklyPeriodType periodType = (BiWeeklyPeriodType) PeriodType.getByNameIgnoreCase(dateUnitType.getName());
if (periodType == null || week < 1 || week > calendar.weeksInYear(year)) {
return null;
}
DateTimeUnit start = getDateTimeFromWeek(year, week, calendar, DayOfWeek.MONDAY, new DateTimeUnit(year, 1, 1));
DateTimeUnit end = calendar.plusWeeks(start, 2);
end = calendar.minusDays(end, 1);
return new DateInterval(start, end);
} else if (DateUnitType.MONTHLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int month = Integer.parseInt(matcher.group(2));
DateTimeUnit start = new DateTimeUnit(year, month, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(year, month, calendar.daysInMonth(start.getYear(), start.getMonth()), calendar.isIso8601());
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.BI_MONTHLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int month = Integer.parseInt(matcher.group(2));
if (month < 1 || month > 6) {
return null;
}
DateTimeUnit start = new DateTimeUnit(year, (month * 2) - 1, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusMonths(end, 2);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.QUARTERLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int quarter = Integer.parseInt(matcher.group(2));
// valid quarters are from 1 - 4
if (quarter < 1 || quarter > 4) {
return null;
}
DateTimeUnit start = new DateTimeUnit(year, ((quarter - 1) * 3) + 1, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusMonths(end, 3);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.SIX_MONTHLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int semester = Integer.parseInt(matcher.group(2));
// valid six-monthly are from 1 - 2
if (semester < 1 || semester > 2) {
return null;
}
DateTimeUnit start = new DateTimeUnit(year, semester == 1 ? 1 : 7, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusMonths(end, 6);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.SIX_MONTHLY_APRIL == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int semester = Integer.parseInt(matcher.group(2));
// valid six-monthly are from 1 - 2
if (semester < 1 || semester > 2) {
return null;
}
DateTimeUnit start = new DateTimeUnit(year, semester == 1 ? 4 : 10, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusMonths(end, 6);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.SIX_MONTHLY_NOVEMBER == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
int semester = Integer.parseInt(matcher.group(2));
// valid six-monthly are from 1 - 2
if (semester < 1 || semester > 2) {
return null;
}
DateTimeUnit start = new DateTimeUnit(semester == 1 ? year - 1 : year, semester == 1 ? 11 : 5, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusMonths(end, 6);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.YEARLY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
DateTimeUnit start = new DateTimeUnit(year, 1, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(year, calendar.monthsInYear(), calendar.daysInMonth(start.getYear(), calendar.monthsInYear()), calendar.isIso8601());
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.FINANCIAL_APRIL == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
DateTimeUnit start = new DateTimeUnit(year, 4, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusYears(end, 1);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.FINANCIAL_JULY == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
DateTimeUnit start = new DateTimeUnit(year, 7, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusYears(end, 1);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.FINANCIAL_OCTOBER == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
DateTimeUnit start = new DateTimeUnit(year, 10, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusYears(end, 1);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
} else if (DateUnitType.FINANCIAL_NOVEMBER == dateUnitType) {
int year = Integer.parseInt(matcher.group(1));
DateTimeUnit start = new DateTimeUnit(year - 1, 11, 1, calendar.isIso8601());
DateTimeUnit end = new DateTimeUnit(start);
end = calendar.plusYears(end, 1);
end = calendar.minusDays(end, 1);
start.setDayOfWeek(calendar.weekday(start));
end.setDayOfWeek(calendar.weekday(end));
return new DateInterval(start, end);
}
return null;
}
Aggregations