/*
*
* Copyright (c) 2004 SourceTap - www.sourcetap.com
*
* The contents of this file are subject to the SourceTap Public License
* ("License"); You may not use this file except in compliance with the
* License. You may obtain a copy of the License at http://www.sourcetap.com/license.htm
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
* the specific language governing rights and limitations under the License.
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
*/
package com.sourcetap.sfa.activity;
import java.util.Calendar;
import java.util.Date;
import org.ofbiz.base.util.Debug;
import org.ofbiz.entity.GenericDelegator;
import com.sourcetap.sfa.util.Preference;
import com.sourcetap.sfa.util.UserInfo;
/**
* DOCUMENT ME!
*
*/
public class CalendarUtil {
public static final String module = CalendarUtil.class.getName();
public static final String[] monthLabel = {
"", "January", "February", "March", "April", "May", "June", "July",
"August", "September", "October", "November", "December"
};
public static final String[] dayLabel = {
"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday",
"Saturday"
};
public static final int[] months = {
Calendar.JANUARY, Calendar.FEBRUARY, Calendar.MARCH, Calendar.APRIL, Calendar.MAY, Calendar.JUNE,
Calendar.JULY, Calendar.AUGUST, Calendar.SEPTEMBER, Calendar.OCTOBER, Calendar.NOVEMBER, Calendar.DECEMBER
};
public static final int[] daysInMonth = {
0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};
/**
* DOCUMENT ME!
*
* @return
*/
public static String[] getMonthLabels() {
return monthLabel;
}
/**
* DOCUMENT ME!
*
* @return
*/
public static String[] getDayLabels() {
return dayLabel;
}
/**
* DOCUMENT ME!
*
* @return
*/
public static int[] getDaysInMonth() {
return daysInMonth;
}
/**
* DOCUMENT ME!
*
* @param year
* @param month
* @param day
*
* @return
*/
public static Calendar getCalendar(int year, int month, int day) {
Calendar calendar = Calendar.getInstance();
if (year <= 0) {
year = calendar.get(Calendar.YEAR);
}
if ((month <= 0) || (month > 12)) {
month = calendar.get(Calendar.MONTH) + 1;
}
if (day <= 0) {
day = calendar.get(Calendar.DAY_OF_MONTH);
}
calendar.clear();
calendar.set(Calendar.MONTH, months[month]);
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.DAY_OF_MONTH, day);
return calendar;
}
public static int convertCalendarMonthToFiscalMonth( int calMonth, int fiscalYearStartMonth )
{
int month = ( 12 + calMonth - fiscalYearStartMonth + 1) % 12;
if ( month == 0)
month = 12;
return month;
}
public static int getQuarter( int calMonth, int fiscalYearStartMonth)
{
int month = convertCalendarMonthToFiscalMonth( calMonth, fiscalYearStartMonth);
int quarter = ((month-1) / 3) + 1;
return quarter;
}
public static String getQuarterString(int month)
{
return getQuarterString(month, 1);
}
/**
* DOCUMENT ME!
*
* @param month
*
* @return
*/
public static String getQuarterString(int month, int fiscalYearStartMonth) {
if (month <= 0) {
month = (Calendar.getInstance().get(Calendar.MONTH) + 1);
}
String returnString = "";
// handle fyOffset
int quarter = getQuarter(month, fiscalYearStartMonth);
switch ( quarter )
{
case 1:
returnString = "Q1";
break;
case 2:
returnString = "Q2";
break;
case 3:
returnString = "Q3";
break;
case 4:
returnString = "Q4";
break;
default:
returnString = "Q?";
Debug.logError("invalid quarter:" + quarter + " for m,fyM = " + month + ", " + fiscalYearStartMonth, module);
break;
}
return returnString;
}
public static String[] getQuarterMonthNames(int month, int fiscalYearStartMonth)
{
return getQuarterMonthLabels(month, fiscalYearStartMonth);
}
/**
* DOCUMENT ME!
*
* @param month
*
* @return
*/
public static String[] getQuarterMonthLabels(int month, int fiscalYearStartMonth) {
if (month <= 0) {
month = (Calendar.getInstance().get(Calendar.MONTH) + 1);
}
int[] monthNumbers = getQuarterMonthNumbers(month, fiscalYearStartMonth);
String[] returnString = new String[3];
for ( int i = 0; i < 3; i++)
returnString[i] = monthLabel[ monthNumbers[i] ];
return returnString;
}
public static int[] getQuarterMonthNumbers(int month, int fiscalYearStartMonth)
{
return getQuarterNumbers(month, fiscalYearStartMonth);
}
/**
* DOCUMENT ME!
*
* @param month
*
* @return
*/
public static int[] getQuarterNumbers(int month, int fiscalYearStartMonth) {
if (month <= 0) {
month = (Calendar.getInstance().get(Calendar.MONTH) + 1);
}
int[] returnNumbers = new int[3];
// handle fyOffset
int quarter = getQuarter(month, fiscalYearStartMonth);
int firstMonth = (fiscalYearStartMonth + (quarter - 1)*3)%12 ;
for ( int i = 0; i < 3; i++)
{
returnNumbers[i] = ((firstMonth + i) % 12 );
if ( returnNumbers[i] == 0)
returnNumbers[i] = 12;
}
return returnNumbers;
}
/**
* DOCUMENT ME!
*
* @param month
*
* @return
*/
public static int[] getPreviousQuarterNumbers(int month, int fiscalYearStartMonth) {
int[] currentNumbers = getQuarterNumbers(month, fiscalYearStartMonth);
int[] returnNumbers = new int[3];
for ( int i=0; i < 3; i ++)
{
returnNumbers[i] = ( 12 + currentNumbers[i] - 3 ) % 12;
if ( returnNumbers[i] == 0 )
returnNumbers[i] = 12;
}
return returnNumbers;
}
/**
* DOCUMENT ME!
*
* @param month
*
* @return
*/
public static int[] getNextQuarterNumbers(int month, int fiscalYearStartMonth) {
int[] currentNumbers = getQuarterNumbers(month, fiscalYearStartMonth);
int[] returnNumbers = new int[3];
for ( int i=0; i < 3; i ++)
{
returnNumbers[i] = ( currentNumbers[i] + 3 ) % 12;
if ( returnNumbers[i] == 0 )
returnNumbers[i] = 12;
}
return returnNumbers;
}
/**
* DOCUMENT ME!
*
* @param month
* @param year
*
* @return
*/
public static Date getMinimumQuarterDate(int month, int year, int fiscalYearStartMonth) {
if (month <= 0) {
month = (Calendar.getInstance().get(Calendar.MONTH) + 1);
}
if (year <= 0) {
year = (Calendar.getInstance().get(Calendar.YEAR));
}
int monthNumbers[] = getQuarterMonthNumbers(month, fiscalYearStartMonth);
int firstMonth = monthNumbers[0];
Calendar calendar = Calendar.getInstance();
if ( firstMonth < fiscalYearStartMonth )
year++;
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, firstMonth - 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
return calendar.getTime();
}
/**
* DOCUMENT ME!
*
* @param month
* @param year
*
* @return
*/
public static Date getMaximumQuarterDate(int month, int year, int fiscalYearStartMonth) {
if (month <= 0) {
month = (Calendar.getInstance().get(Calendar.MONTH) + 1);
}
if (year <= 0) {
year = (Calendar.getInstance().get(Calendar.YEAR));
}
int monthNumbers[] = getQuarterMonthNumbers(month, fiscalYearStartMonth);
int lastMonth = monthNumbers[2] + 1;
if (lastMonth < 12 )
lastMonth = lastMonth % 12;
Calendar calendar = Calendar.getInstance();
if ( lastMonth <= fiscalYearStartMonth )
year++;
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, lastMonth - 1);
calendar.set(Calendar.DAY_OF_MONTH, 1);
calendar.add(Calendar.DATE, -1);
return calendar.getTime();
}
/**
* DOCUMENT ME!
*
* @param startDate
* @param endDate
* @param calendarReturnField
*
* @return
*/
public static int differenceBetweenDates(Calendar startDate,
Calendar endDate, int calendarReturnField) {
int returnInt = -1;
if (startDate.before(endDate)) {
switch (calendarReturnField) {
case Calendar.MONTH:
if (startDate.get(Calendar.YEAR) == endDate.get(Calendar.YEAR)) {
//same year
returnInt = (endDate.get(Calendar.MONTH -
startDate.get(Calendar.MONTH)));
} else {
//cross years
returnInt = endDate.get(Calendar.MONTH) + 1;
if ((endDate.get(Calendar.YEAR) -
startDate.get(Calendar.YEAR)) > 1) {
int numYrs = (endDate.get(Calendar.YEAR) -
startDate.get(Calendar.YEAR));
returnInt = returnInt + (12 * numYrs);
}
returnInt = returnInt +
(12 - (startDate.get(Calendar.MONTH) + 1));
}
break;
case Calendar.DAY_OF_MONTH:
if (startDate.get(Calendar.YEAR) == endDate.get(Calendar.YEAR)) {
if (startDate.get(Calendar.MONTH) == endDate.get(Calendar.MONTH)) {
//same year, same month
returnInt = (endDate.get(Calendar.DAY_OF_MONTH) - startDate.get(Calendar.DAY_OF_MONTH));
} else {
//same year, cross months
returnInt = (endDate.get(Calendar.DAY_OF_YEAR) - startDate.get(Calendar.DAY_OF_YEAR));
}
} else {
//cross years, cross months
//get number of days between years
//get number
//TODO: Finish this part of the method
}
break;
case Calendar.DAY_OF_YEAR:
if (startDate.get(Calendar.YEAR) == endDate.get(Calendar.YEAR)) {
returnInt = endDate.get(Calendar.DAY_OF_YEAR) - startDate.get(Calendar.DAY_OF_YEAR);
} else {
returnInt = endDate.get(Calendar.DAY_OF_YEAR);
if ((endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR)) > 1) {
int numYrs = (endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR));
returnInt = returnInt + (365 * numYrs);
}
returnInt = returnInt + (365 - (startDate.get(Calendar.DAY_OF_YEAR)));
}
break;
case Calendar.YEAR:
returnInt = (endDate.get(Calendar.YEAR) - startDate.get(Calendar.YEAR));
break;
default:
break;
}
}
return returnInt;
}
public static int getFiscalYearStartMonth( GenericDelegator delegator, UserInfo userInfo )
{
Preference pref = Preference.getInstance(delegator);
int FYStartMonth = pref.getPreference(userInfo.getPartyId(), userInfo.getAccountId(), "FISCAL_YEAR_START", 1);
return FYStartMonth;
}
}