/*
* 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;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.aimluck.commons.field.ALDateTimeField;
import com.aimluck.commons.field.ALNumberField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.commons.utils.ALDateUtil;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecard;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecardSystem;
import com.aimluck.eip.common.ALData;
import com.aimluck.eip.exttimecard.util.ExtTimecardUtils;
/**
* タイムカードのResultDataです。 <BR>
*
*/
public class ExtTimecardResultData implements ALData {
/** 現在時刻 */
private ALStringField now_time;
/** タイムカードの設定 */
private EipTExtTimecardSystem timecard_system;
/** 出勤フラグ */
private ALStringField work_flag;
/** 勤務時刻 */
private ALDateTimeField work_date;
/** 修正フラグ */
private ALStringField refix_flag;
/** 一覧の日付 */
private ALStringField list_date;
/** 理由 */
private ALStringField reason;
public boolean reason_flg;
/** 備考 */
private ALStringField remarks;
public boolean remarks_flg;
/** タイムカードのID */
private ALStringField timecard_id;
/** ある一日の合計勤務時間 */
private ALNumberField sum_work_date;
/** */
private ALDateTimeField punch_date;
/** 出勤時間 */
private ALDateTimeField clock_in_time;
/** 退勤時間 */
private ALDateTimeField clock_out_time;
/** 外出時間 */
private List<ALDateTimeField> outgoing_time;
/** 復帰時間 */
private List<ALDateTimeField> comeback_time;
/** 種類 */
private ALStringField type;
private boolean isTypeP;
private boolean isTypeA;
private boolean isTypeH;
private boolean isTypeC;
private boolean isTypeE;
private boolean isCurrentMonth;
/**
*
*
*/
@Override
public void initField() {
work_flag = new ALStringField();
now_time = new ALStringField();
work_date = new ALDateTimeField();
refix_flag = new ALStringField();
list_date = new ALStringField();
timecard_id = new ALStringField();
reason = new ALStringField();
sum_work_date = new ALNumberField();
remarks = new ALStringField();
punch_date = new ALDateTimeField();
clock_in_time = new ALDateTimeField();
clock_out_time = new ALDateTimeField();
reason_flg = false;
remarks_flg = false;
isTypeP = false;
isTypeA = false;
isTypeH = false;
isTypeC = false;
isTypeE = false;
outgoing_time = new ArrayList<ALDateTimeField>();
comeback_time = new ArrayList<ALDateTimeField>();
type = new ALStringField();
/*
* outgoing_time = new
* ALDateTimeField[EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY]; comeback_time
* = new ALDateTimeField[EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY]; for
* (int i = 0 ; i < EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY ; i++) {
* outgoing_time[i] = new ALDateTimeField(); comeback_time[i] = new
* ALDateTimeField(); }
*/
}
/**
* 出勤時間がNULLかどうか調べます。
*
* @return boolean
*/
public boolean getIsNullClockInTime() {
if (clock_in_time.isNullHour()) {
return true;
}
return false;
}
/**
* 退勤時間がNULLかどうか調べます。
*
* @return boolean
*/
public boolean getIsNullClockOutTime() {
if (clock_out_time.isNullHour()) {
return true;
}
return false;
}
/**
* 現在外出中かどうか調べます。
*
* @return boolean
*/
public boolean getIsOutgoing() {
int length = outgoing_time.size();
for (int i = 0; i < length; i++) {
if (!outgoing_time.get(i).isNullHour()
&& comeback_time.get(i).isNullHour()) {
return true;
}
}
return false;
}
/**
* 現在残業中かどうか調べます。
*
* @return boolean
*/
public boolean getIsOverTime() {
if (!getIsNullClockInTime()) {
if (!ExtTimecardUtils.isNewRule()) {
int end_hour = timecard_system.getEndHour(), end_minute =
timecard_system.getEndMinute();
Calendar cal = Calendar.getInstance();
int now_hour = cal.get(Calendar.HOUR_OF_DAY);
int now_minute = cal.get(Calendar.MINUTE);
if (now_hour < end_hour) {
return false;
} else if (now_hour == end_hour) {
if (now_minute < end_minute) {
return false;
} else {
return true;
}
} else {
return true;
}
} else {
// 法定外残業
Calendar cal = Calendar.getInstance();
float time = 0f;
time +=
(cal.getTime().getTime() - clock_in_time.getValue().getTime())
/ (1000.0 * 60.0 * 60.0);
/** 外出時間を就業時間に含めない場合 */
if ("F".equals(timecard_system.getOutgoingAddFlag())) {
int length = outgoing_time.size();
for (int i = 0; i < length; i++) {
if (!outgoing_time.get(i).isNullHour()
&& !comeback_time.get(i).isNullHour()) {
time -=
(comeback_time.get(i).getValue().getTime() - outgoing_time.get(
i).getValue().getTime())
/ (1000.0 * 60.0 * 60.0);
}
}
}
/** 就業時間の中で決まった時間の休憩を取らせます。 */
/** 決まった時間ごとの休憩時間を取らせます。 */
float worktimein = (timecard_system.getWorktimeIn() / 60f);
float resttimein = (timecard_system.getResttimeIn() / 60f);
if (worktimein != 0F) {
int resttimes = (int) (time / worktimein);
time -= resttimes * resttimein;
}
float overTime =
ExtTimecardUtils.getOvertimeMinuteByDay(timecard_system
.getOvertimeType()) / 60f;
if (time >= overTime) {
return true;
} else {
return false;
}
}
}
return false;
}
public void setClockInTime(Date date) {
clock_in_time.setValue(date);
}
public void setClockOutTime(Date date) {
clock_out_time.setValue(date);
}
public void setOutgoingTime(Date date, int n) {
ALDateTimeField datetime = new ALDateTimeField();
datetime.setValue(date);
outgoing_time.add(datetime);
// outgoing_time.get(n-1).setValue(date);
}
public void setComebackTime(Date date, int n) {
ALDateTimeField datetime = new ALDateTimeField();
datetime.setValue(date);
comeback_time.add(datetime);
// comeback_time.get(n-1).setValue(date);
}
public void setPunchDate(Date date) {
punch_date.setValue(date);
}
/**
* @param i
*/
public void setNowTime(String time) {
now_time.setValue(time);
}
public void setType(String str) {
type.setValue(str);
}
/**
* @param i
*/
public void setRefixFlag(Date create_date, Date update_date) {
if (equalsToDate(create_date, update_date, true)) {
refix_flag.setValue("0");
} else {
refix_flag.setValue("1");
}
}
/**
* @return
*/
public void setTimecardId(long i) {
timecard_id.setValue(Long.valueOf(i).toString());
}
/**
* @param i
*/
public void setReason(String str_reason) {
reason.setValue(str_reason);
}
/**
* @param i
*/
public void setRemarks(String str_remarks) {
remarks.setValue(str_remarks);
}
/**
*
* @return
*/
public void addSumWorkDate() {
long count = sum_work_date.getValue();
sum_work_date.setValue(count + 1);
}
/**
* @return
*/
public ALNumberField getSumWorkDate() {
return sum_work_date;
}
public ALDateTimeField getClockInTime() {
return clock_in_time;
}
public String getClockInTime(String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(clock_in_time.getValue());
} catch (Exception e) {
return "";
}
}
public String getClockInTimeHourMinuteText() {
return clock_in_time.getTime().toString();
}
public ALDateTimeField getPunchDate() {
return punch_date;
}
public ALDateTimeField getClockOutTime() {
return clock_out_time;
}
public String getClockOutTime(String format) {
try {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(clock_out_time.getValue());
} catch (Exception e) {
return "";
}
}
public String getClockOutTimeHourMinuteText() {
return clock_out_time.getTime().toString();
}
public ALStringField getType() {
return type;
}
/**
* 当日中最新の外出時間を得ます。
*
* @return
*/
public ALDateTimeField getOutgoingTime() {
for (int i = 0; i < EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY; i++) {
if (outgoing_time.get(i).isNullHour()) {
if (i == 0) {
return null;
}
return outgoing_time.get(i - 1);
}
}
return outgoing_time.get(EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY - 1);
}
/**
* 当日中最近の復帰時間を得ます。
*
* @return
*/
public ALDateTimeField getComebackTime() {
for (int i = 0; i < EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY; i++) {
if (!comeback_time.get(i).isNullHour()) {
if (i == 0) {
return null;
}
return comeback_time.get(i - 1);
}
}
return comeback_time.get(EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY - 1);
}
/**
* 当日全ての外出時間を得ます。
*
* @return
*/
public List<ALDateTimeField> getAllOutgoingTime() {
return outgoing_time;
}
/**
* 当日全ての復帰時間を得ます。
*
* @return
*/
public List<ALDateTimeField> getAllComebackTime() {
return comeback_time;
}
/**
*
*/
public ALStringField getNowTime() {
return now_time;
}
/**
*
*/
public ALStringField getRefixFlag() {
return refix_flag;
}
/**
*
*/
public ALStringField getListDate() {
return list_date;
}
/**
*
*/
public ALStringField getTimecardId() {
return timecard_id;
}
/**
*
*/
public ALStringField getReason() {
return reason;
}
/**
*
*/
public ALStringField getRemarks() {
return remarks;
}
/**
* 指定した2つの日付を比較する.
*
* @param date1
* @param date2
* @param checkTime
* 時間まで比較する場合,true.
* @return 等しい場合,true.
*/
private boolean equalsToDate(Date date1, Date date2, boolean checkTime) {
Calendar cal = Calendar.getInstance();
cal.setTime(date1);
int date1Year = cal.get(Calendar.YEAR);
int date1Month = cal.get(Calendar.MONTH) + 1;
int date1Day = cal.get(Calendar.DATE);
int date1Hour = cal.get(Calendar.HOUR);
int date1Minute = cal.get(Calendar.MINUTE);
int date1Second = cal.get(Calendar.SECOND);
cal.setTime(date2);
int date2Year = cal.get(Calendar.YEAR);
int date2Month = cal.get(Calendar.MONTH) + 1;
int date2Day = cal.get(Calendar.DATE);
int date2Hour = cal.get(Calendar.HOUR);
int date2Minute = cal.get(Calendar.MINUTE);
int date2Second = cal.get(Calendar.SECOND);
if (checkTime) {
if (date1Year == date2Year
&& date1Month == date2Month
&& date1Day == date2Day
&& date1Hour == date2Hour
&& date1Minute == date2Minute
&& date1Second == date2Second) {
return true;
}
} else {
if (date1Year == date2Year
&& date1Month == date2Month
&& date1Day == date2Day) {
return true;
}
}
return false;
}
/**
*
*/
public ALDateTimeField getWorkDate() {
return work_date;
}
public String getWorkDateStr() {
SimpleDateFormat sdf = new SimpleDateFormat("HH時mm分");
return sdf.format(work_date.getValue());
}
/**
* @return
*/
public ALStringField getWorkFlag() {
return work_flag;
}
/**
* @return
*/
public void setWorkFlag(String flag) {
work_flag.setValue(flag);
}
/**
* @param i
*/
public void setWorkDate(Date date) {
work_date.setValue(date);
list_date.setValue(ALDateUtil.format(date, "MM月dd日"));
}
public boolean getRemarksFlg() {
return remarks_flg;
}
public boolean getReasonFlg() {
return reason_flg;
}
public boolean getIsTypeP() {
return isTypeP;
}
public boolean getIsTypeA() {
return isTypeA;
}
public boolean getIsTypeH() {
return isTypeH;
}
public boolean getIsTypeC() {
return isTypeC;
}
public boolean getIsTypeE() {
return isTypeE;
}
public void setRemarksFlg(boolean b) {
remarks_flg = b;
}
public void setReasonFlg(boolean b) {
reason_flg = b;
}
public void setIsTypeP(boolean b) {
isTypeP = b;
}
public void setIsTypeA(boolean b) {
isTypeA = b;
}
public void setIsTypeH(boolean b) {
isTypeH = b;
}
public void setIsTypeC(boolean b) {
isTypeC = b;
}
public void setIsTypeE(boolean b) {
isTypeE = b;
}
/**
* タイムカードの設定を取得します。
*
* @return
*/
public EipTExtTimecardSystem getTimecardSystem() {
return timecard_system;
}
/**
* タイムカードの設定を読み込みます。
*
* @return
*/
public void setTimecardSystem(EipTExtTimecardSystem system) {
timecard_system = system;
}
/**
* @return isCurrentMonth
*/
public boolean isCurrentMonth() {
return isCurrentMonth;
}
/**
* @param isCurrentMonth
* セットする isCurrentMonth
*/
public void setCurrentMonth(boolean isCurrentMonth) {
this.isCurrentMonth = isCurrentMonth;
}
}