2 * This program is free software. It comes without any warranty, to
3 * the extent permitted by applicable law. You can redistribute it
4 * and/or modify it under the terms of the Do What The Fuck You Want
5 * To Public License, Version 2, as published by Sam Hocevar. See
6 * http://www.wtfpl.net/ for more details.
8 package com
.github
.sebhoss
.time
;
10 import org
.joda
.time
.Days
;
11 import org
.joda
.time
.LocalDate
;
12 import org
.joda
.time
.Weeks
;
14 abstract class AbstractFiscalDateCalculator
implements FiscalDateCalculator
{
16 protected final int fiscalYearStartMonth
;
18 AbstractFiscalDateCalculator(final int fiscalStartMonth
) {
19 fiscalYearStartMonth
= fiscalStartMonth
;
23 public final int calculateFiscalMonth(final LocalDate calendarDate
) {
24 final int calendarMonth
= calendarDate
.getMonthOfYear();
25 final int maximumNumberOfMonths
= calendarDate
.monthOfYear().getMaximumValue();
27 if (fiscalYearStartMonth
<= calendarMonth
) {
28 return calendarMonth
- fiscalYearStartMonth
+ 1;
31 return calendarMonth
+ maximumNumberOfMonths
- fiscalYearStartMonth
+ 1;
35 public final int calculateFiscalWeekOfYear(final LocalDate calendarDate
) {
36 final LocalDate fiscalYearStartDate
= createMatchingFiscalYearStartDate(calendarDate
);
38 return Weeks
.weeksBetween(fiscalYearStartDate
, calendarDate
).getWeeks() + 1;
42 public final int calculateFiscalDayOfYear(final LocalDate calendarDate
) {
43 final LocalDate fiscalYearStartDate
= createMatchingFiscalYearStartDate(calendarDate
);
45 return Days
.daysBetween(fiscalYearStartDate
, calendarDate
).getDays() + 1;
48 private LocalDate
createMatchingFiscalYearStartDate(final LocalDate calendarDate
) {
49 if (fiscalYearStartMonth
<= calendarDate
.getMonthOfYear()) {
50 return new LocalDate(calendarDate
.getYear(), fiscalYearStartMonth
, 1);
53 return new LocalDate(calendarDate
.getYear() - 1, fiscalYearStartMonth
, 1);
57 public LocalDate
calculateCalendarDate(final int fiscalYear
, final int fiscalMonth
, final int fiscalDay
) {
58 final int calendarYear
= calculateCalendarYear(fiscalYear
, fiscalMonth
);
59 final int calendarMonth
= calculateCalendarMonth(fiscalMonth
);
61 return new LocalDate(calendarYear
, calendarMonth
, fiscalDay
);
64 private final int calculateCalendarMonth(final int fiscalMonth
) {
65 return (fiscalMonth
+ fiscalYearStartMonth
- 1) % 12;
68 protected abstract int calculateCalendarYear(int fiscalYear
, int fiscalMonth
);