/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.exttimecard.util;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.resources.JetspeedResources;
import org.apache.turbine.services.TurbineServices;
import org.apache.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecard;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecardSystem;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecardSystemMap;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALEipHolidaysManager;
import com.aimluck.eip.exttimecard.ExtTimecardListResultData;
import com.aimluck.eip.exttimecard.ExtTimecardListResultDataContainer;
import com.aimluck.eip.exttimecard.ExtTimecardResultData;
import com.aimluck.eip.http.HttpServletRequestLocator;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.services.accessctl.ALAccessControlFactoryService;
import com.aimluck.eip.services.accessctl.ALAccessControlHandler;
import com.aimluck.eip.services.config.ALConfigHandler;
import com.aimluck.eip.services.config.ALConfigService;
import com.aimluck.eip.util.ALEipUtils;
/**
* タイムカードのユーティリティクラスです。 <BR>
*
*/
public class ExtTimecardUtils {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ExtTimecardUtils.class.getName());
/** <code>TARGET_GROUP_NAME</code> グループによる表示切り替え用変数の識別子 */
public static final String TARGET_GROUP_NAME = "target_group_name";
/** <code>TARGET_USER_ID</code> ユーザによる表示切り替え用変数の識別子 */
public static final String TARGET_USER_ID = "target_user_id";
/** 出退勤フラグ(出勤) */
public static final String WORK_FLG_ON = "1";
/** 出退勤フラグ(退勤) */
public static final String WORK_FLG_OFF = "0";
/** 出退勤フラグ(ダミー) */
public static final String WORK_FLG_DUMMY = "-1";
/** 日分を超える労働を残業とする */
public static final Integer OVERTIME_TYPE_DEFAULT_MINUTE = 480;
/** 週時間を超える労働を残業とする */
public static final Integer OVERTIME_TYPE_DEFAULT_HOUR_BY_WEEK = 40;
/** 勤務時間外の労働を残業とする */
public static final String OVERTIME_TYPE_O = "O";
/** タイムカードファイルを一時保管するディレクトリの指定 */
public static final String FOLDER_TMP_FOR_TIMECARD_FILES = JetspeedResources
.getString("aipo.tmp.timecard.directory", "");
public static final String EXTTIMECARD_PORTLET_NAME = "ExtTimecard";
public static final String EXTTIMECARD_SYSTEM_PORTLET_NAME =
"ExtTimecardSystem";
/**
* ExtTimecard オブジェクトモデルを取得します。 <BR>
*
* @param rundata
* @param context
* @param isJoin
* カテゴリテーブルをJOINするかどうか
* @return
*/
public static EipTExtTimecard getEipTExtTimecard(RunData rundata,
Context context) {
String timecardid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
ALAccessControlFactoryService aclservice =
(ALAccessControlFactoryService) ((TurbineServices) TurbineServices
.getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME);
ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler();
try {
if (timecardid == null || Integer.valueOf(timecardid) == null) {
logger.debug("[ExtTimecardUtils.getEipTExtTimecard] Empty ID...");
return null;
}
SelectQuery<EipTExtTimecard> query =
Database.query(EipTExtTimecard.class);
Expression exp11 =
ExpressionFactory.matchDbExp(
EipTExtTimecard.TIMECARD_ID_PK_COLUMN,
timecardid);
query.setQualifier(exp11);
// have "others timecard acl", then not check user_id
if (!(aclhandler.hasAuthority(
ALEipUtils.getUserId(rundata),
ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER,
ALAccessControlConstants.VALUE_ACL_UPDATE))) {
Expression exp21 =
ExpressionFactory.matchExp(EipTExtTimecard.USER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
query.andQualifier(exp21);
}
List<EipTExtTimecard> timecards = query.fetchList();
if (timecards == null || timecards.size() == 0) {
// 指定したTimecard IDのレコードが見つからない場合
logger.debug("[Timecard] Not found ID...");
return null;
}
return timecards.get(0);
} catch (Exception ex) {
logger.error("exttimecard", ex);
return null;
}
}
/**
* 現在ログイン中のユーザーのEipTExtTimecardSystemを取得します。
*
* @param rundata
* @param context
* @return
*/
public static EipTExtTimecardSystem getEipTExtTimecardSystemCurrentUserId(
RunData rundata, Context context) {
int user_id = Integer.valueOf(ALEipUtils.getUserId(rundata));
return getEipTExtTimecardSystemByUserId(user_id);
}
/**
* 特定ユーザーのEipTExtTimecardSystemを取得します。
*
* @param rundata
* @param context
* @return
*/
public static EipTExtTimecardSystem getEipTExtTimecardSystemByUserId(
int user_id) {
try {
SelectQuery<EipTExtTimecardSystemMap> query =
Database.query(EipTExtTimecardSystemMap.class);
Expression exp1 =
ExpressionFactory.matchExp(
EipTExtTimecardSystemMap.USER_ID_PROPERTY,
Integer.valueOf(user_id));
query.setQualifier(exp1);
List<EipTExtTimecardSystemMap> slist = query.fetchList();
if (slist == null || slist.size() == 0) {
return getEipTExtTimecardSystemById(1);
}
return slist.get(0).getEipTExtTimecardSystem();
} catch (Exception ex) {
logger.error("exttimecard", ex);
return null;
}
}
public static EipTExtTimecardSystem getEipTExtTimecardSystemById(int system_id) {
try {
SelectQuery<EipTExtTimecardSystem> query =
Database.query(EipTExtTimecardSystem.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTExtTimecardSystem.SYSTEM_ID_PK_COLUMN,
system_id);
query.setQualifier(exp1);
List<EipTExtTimecardSystem> slist = query.fetchList();
if (slist == null || slist.size() == 0) {
return null;
}
return slist.get(0);
} catch (Exception ex) {
logger.error("exttimecard", ex);
return null;
}
}
/**
*
* @return
*/
public static List<EipTExtTimecardSystem> getAllEipTExtTimecardSystem() {
try {
SelectQuery<EipTExtTimecardSystem> query =
Database.query(EipTExtTimecardSystem.class);
List<EipTExtTimecardSystem> slist = query.fetchList();
if (slist == null || slist.size() == 0) {
// 指定したSetting IDのレコードが見つからない場合
logger.debug("[ExtTimecardUtils] Not found ID...");
return null;
}
return slist;
} catch (Exception ex) {
logger.error("exttimecard", ex);
return null;
}
}
/**
*
* @return
*/
public static EipTExtTimecardSystem getEipTExtTimecardSystem(RunData rundata,
Context context) {
String systemid =
ALEipUtils.getTemp(rundata, context, ALEipConstants.ENTITY_ID);
try {
if (systemid == null || Integer.valueOf(systemid) == null) {
// Setting IDが空の場合
logger.debug("[ExtTimecardUtils] Empty ID...");
return null;
}
SelectQuery<EipTExtTimecardSystem> query =
Database.query(EipTExtTimecardSystem.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTExtTimecardSystem.SYSTEM_ID_PK_COLUMN,
systemid);
query.setQualifier(exp1);
List<EipTExtTimecardSystem> slist = query.fetchList();
if (slist == null || slist.size() == 0) {
// 指定したSetting IDのレコードが見つからない場合
logger.debug("[ExtTimecardUtils] Not found ID...");
return null;
}
return slist.get(0);
} catch (Exception ex) {
logger.error("exttimecard", ex);
return null;
}
}
/**
* 指定した2つの日付を比較する.
*
* @param date1
* @param date2
* @param checkTime
* 時間まで比較する場合,true.
* @return 等しい場合,0. date1>date2の場合, 1. date1 <date2の場合, 2.
*/
public static boolean sameDay(Date date1, Date date2) {
Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
int date1Year = cal1.get(Calendar.YEAR);
int date1Month = cal1.get(Calendar.MONTH) + 1;
int date1Day = cal1.get(Calendar.DATE);
int date2Year = cal2.get(Calendar.YEAR);
int date2Month = cal2.get(Calendar.MONTH) + 1;
int date2Day = cal2.get(Calendar.DATE);
if (date1Year == date2Year
&& date1Month == date2Month
&& date1Day == date2Day) {
return true;
}
return false;
}
/**
* 現在時刻とEipTTimecardSettingsの情報から update文を発行すべきかどうかを判断します。
*
* @param org_id
* @param userId
* @return
*/
public static EipTExtTimecard getUpdateEipTExtTimecard(RunData rundata,
Context context) {
EipTExtTimecardSystem system =
ExtTimecardUtils.getEipTExtTimecardSystemCurrentUserId(rundata, context);
Calendar calendar_now = Calendar.getInstance();
Calendar from_calendar = Calendar.getInstance();
int hour = system.getChangeHour().intValue();
from_calendar.set(Calendar.HOUR_OF_DAY, hour);
from_calendar.set(Calendar.MINUTE, 0);
from_calendar.set(Calendar.SECOND, 0);
if (calendar_now.before(from_calendar)) {
from_calendar.add(Calendar.DAY_OF_MONTH, -1);
}
from_calendar.set(Calendar.HOUR_OF_DAY, 0);
SelectQuery<EipTExtTimecard> query = Database.query(EipTExtTimecard.class);
Expression exp1 =
ExpressionFactory.matchExp(EipTExtTimecard.USER_ID_PROPERTY, Integer
.valueOf(ALEipUtils.getUserId(rundata)));
Expression exp2 =
ExpressionFactory.matchExp(
EipTExtTimecard.PUNCH_DATE_PROPERTY,
from_calendar.getTime());
query.setQualifier(exp1.andExp(exp2));
List<EipTExtTimecard> slist = query.fetchList();
// データが無かった
if (slist == null || slist.size() == 0) {
return null;
}
return slist.get(0);
}
/**
* 集計した時間を丸めます。
*
* @return
*/
public static float roundHour(float time) {
if (isNewRule()) {
time *= 100;
time = Math.round(time);
time /= 100;
} else {
time *= 10;
time = Math.round(time);
time /= 10;
}
return time;
}
public static JetspeedLogger getLogger() {
return logger;
}
/**
* 休日(所定休日、法定休日)の曜日一覧
*
* @return
*/
public static List<Integer> getOffdayDayOfWeek() {
List<Integer> list = new ArrayList<Integer>();
String week = getHolidayOfWeek();
// 標準は日・土
if (week.charAt(0) != '0') {
list.add(Calendar.SUNDAY);
}
if (week.charAt(1) != '0') {
list.add(Calendar.MONDAY);
}
if (week.charAt(2) != '0') {
list.add(Calendar.TUESDAY);
}
if (week.charAt(3) != '0') {
list.add(Calendar.WEDNESDAY);
}
if (week.charAt(4) != '0') {
list.add(Calendar.THURSDAY);
}
if (week.charAt(5) != '0') {
list.add(Calendar.FRIDAY);
}
if (week.charAt(6) != '0') {
list.add(Calendar.SATURDAY);
}
return list;
}
/**
* 法定休日
*
* @return
*/
public static int getStatutoryHoliday() {
String week = getHolidayOfWeek();
try {
return Character.getNumericValue(week.charAt(7));
} catch (Throwable ignore) {
}
return 0;
}
public static ExtTimecardListResultDataContainer groupByWeek(
Date queryStartDate, List<ExtTimecardResultData> flat,
EipTExtTimecardSystem timecard_system) {
boolean isNewRule = ExtTimecardUtils.isNewRule();
EipTExtTimecardSystem tmpTimecardSyste = timecard_system;
if (tmpTimecardSyste == null) {
for (ExtTimecardResultData rd : flat) {
tmpTimecardSyste = rd.getTimecardSystem();
break;
}
}
ExtTimecardListResultDataContainer result =
new ExtTimecardListResultDataContainer(queryStartDate, tmpTimecardSyste);
for (ExtTimecardResultData rd : flat) {
ExtTimecardListResultData lrd = new ExtTimecardListResultData();
lrd.initField();
lrd.setDate(rd.getPunchDate().getValue());
lrd.setRd(rd);
lrd.setTimecardSystem(tmpTimecardSyste);
lrd.setNewRule(isNewRule);
result.add(lrd);
}
return result;
}
/**
* 新しい集計ルールかどうか
*
* @return
*/
public static boolean isNewRule() {
HttpServletRequest request = HttpServletRequestLocator.get();
String cacheVersion = null;
if (request != null) {
try {
cacheVersion =
(String) request
.getAttribute(ALConfigHandler.Property.EXTTIMECARD_VERTION
.toString());
} catch (Throwable ignore) {
}
}
if (cacheVersion == null) {
cacheVersion =
ALConfigService.get(ALConfigHandler.Property.EXTTIMECARD_VERTION);
if (request != null) {
request.setAttribute(ALConfigHandler.Property.EXTTIMECARD_VERTION
.toString(), cacheVersion);
}
}
return "2".equals(cacheVersion);
}
public static int getOvertimeMinuteByDay(EipTExtTimecardSystem model) {
String type = model.getOvertimeType();
return getOvertimeMinuteByDay(type);
}
public static int getOvertimeMinuteByDay(String type) {
int value = OVERTIME_TYPE_DEFAULT_MINUTE;
if (type != null) {
String[] split = type.split("-");
if (split.length == 2) {
try {
return Integer.valueOf(split[0]);
} catch (Throwable ignore) {
}
}
}
return value;
}
public static int getOvertimeHourByWeek(EipTExtTimecardSystem model) {
String type = model.getOvertimeType();
return getOvertimeHourByWeek(type);
}
public static int getOvertimeHourByWeek(String type) {
int value = OVERTIME_TYPE_DEFAULT_HOUR_BY_WEEK;
if (type != null) {
String[] split = type.split("-");
if (split.length == 2) {
try {
String substring = split[1].substring(1);
return Integer.valueOf(substring);
} catch (Throwable ignore) {
}
}
}
return value;
}
public static boolean isOvertimeHourByWeek(String type) {
if (type != null) {
String[] split = type.split("-");
if (split.length == 2) {
try {
String substring = split[1].substring(0, 1);
return "T".equals(substring);
} catch (Throwable ignore) {
}
}
}
return false;
}
public static String getHolidayOfWeek() {
HttpServletRequest request = HttpServletRequestLocator.get();
String cacheHoliday = null;
if (request != null) {
try {
cacheHoliday =
(String) request
.getAttribute(ALConfigHandler.Property.HOLIDAY_OF_WEEK.toString());
} catch (Throwable ignore) {
}
}
if (cacheHoliday == null) {
cacheHoliday =
ALConfigService.get(ALConfigHandler.Property.HOLIDAY_OF_WEEK);
if (request != null) {
request.setAttribute(ALConfigHandler.Property.HOLIDAY_OF_WEEK
.toString(), cacheHoliday);
}
}
return cacheHoliday;
}
public static boolean isHoliday(Date date) {
String cacheHoliday = getHolidayOfWeek();
boolean holiday = cacheHoliday.charAt(8) != '0';
if (holiday) {
ALEipHolidaysManager holidaysManager = ALEipHolidaysManager.getInstance();
if (holidaysManager.isHoliday(date) != null) {
return true;
}
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
return cacheHoliday.charAt(cal.get(Calendar.DAY_OF_WEEK) - 1) != '0';
}
}