/*
* 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.util.Calendar;
import java.util.List;
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.turbine.util.RunData;
import org.apache.velocity.context.Context;
import com.aimluck.commons.field.ALNumberField;
import com.aimluck.commons.field.ALStringField;
import com.aimluck.eip.cayenne.om.portlet.EipTExtTimecardSystem;
import com.aimluck.eip.common.ALAbstractFormData;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipConstants;
import com.aimluck.eip.common.ALPageNotFoundException;
import com.aimluck.eip.exttimecard.util.ExtTimecardUtils;
import com.aimluck.eip.modules.actions.common.ALAction;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.eventlog.ALEventlogConstants;
import com.aimluck.eip.services.eventlog.ALEventlogFactoryService;
import com.aimluck.eip.util.ALEipUtils;
import com.aimluck.eip.util.ALLocalizationUtils;
/**
* タイムカード集計のフォームデータを管理するためのクラスです。 <br />
*
*/
public class ExtTimecardSystemFormData extends ALAbstractFormData {
/** logger */
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ExtTimecardSystemFormData.class.getName());
private ALNumberField system_id;
private ALNumberField user_id;
private ALStringField system_name;
/** 開始時刻 */
private ALNumberField start_hour;
private ALNumberField start_minute;
private ALNumberField start_day;
/** 終了時刻 */
private ALNumberField end_hour;
private ALNumberField end_minute;
private ALNumberField worktime_in;
private ALNumberField resttime_in;
private ALNumberField worktime_out;
private ALNumberField resttime_out;
private ALNumberField change_hour;
private ALStringField outgoing_add_flag;
private ALNumberField overtime_type_minute;
private ALNumberField overtime_type_week_hour;
private ALStringField overtime_type_week;
private int entity_id;
private boolean isNewRule = false;
@Override
public void init(ALAction action, RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
super.init(action, rundata, context);
}
/**
*
*/
@Override
public void initField() {
system_id = new ALNumberField();
system_id.setNotNull(true);
user_id = new ALNumberField();
user_id.setNotNull(true);
system_name = new ALStringField();
system_name.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_WORKING_ARRANGEMENTS"));
system_name.setNotNull(true);
start_hour = new ALNumberField();
start_minute = new ALNumberField();
end_hour = new ALNumberField();
end_minute = new ALNumberField();
start_day = new ALNumberField();
start_day.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_START_DAY"));
worktime_in = new ALNumberField();
worktime_in.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_WORKTIME_IN_WORKTIME"));
worktime_in.setNotNull(true);
worktime_in.limitMinValue(0);
resttime_in = new ALNumberField();
resttime_in.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_WORKTIME_IN_RESTTIME"));
resttime_in.setNotNull(true);
resttime_in.limitValue(0, 360);
worktime_out = new ALNumberField();
worktime_out.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_WORKTIME_OUT_WORKTIME"));
worktime_out.setNotNull(true);
worktime_out.limitMinValue(0);
resttime_out = new ALNumberField();
resttime_out.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_WORKTIME_OUT_RESTTIME"));
resttime_out.setNotNull(true);
resttime_out.limitValue(0, 360);
change_hour = new ALNumberField();
change_hour.setNotNull(true);
outgoing_add_flag = new ALStringField();
overtime_type_minute = new ALNumberField();
overtime_type_minute.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_OVERTIME_TYPE"));
overtime_type_minute.limitMinValue(0);
overtime_type_week_hour = new ALNumberField();
overtime_type_week_hour.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_OVERTIME_TYPE"));
overtime_type_week_hour.limitMinValue(0);
overtime_type_week = new ALStringField();
overtime_type_week.setFieldName(ALLocalizationUtils
.getl10n("EXTTIMECARD_SETFIELDNAME_OVERTIME_TYPE"));
isNewRule = isNewRule();
}
@Override
protected boolean loadFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
try {
EipTExtTimecardSystem record =
ExtTimecardUtils.getEipTExtTimecardSystem(rundata, context);
if (record == null) {
return false;
}
system_id.setValue(String.valueOf(record.getSystemId()));
user_id.setValue(String.valueOf(record.getUserId()));
system_name.setValue(record.getSystemName());
start_hour.setValue(String.valueOf(record.getStartHour()));
start_minute.setValue(String.valueOf(record.getStartMinute()));
end_hour.setValue(String.valueOf(record.getEndHour()));
end_minute.setValue(String.valueOf(record.getEndMinute()));
start_day.setValue(String.valueOf(record.getStartDay()));
worktime_in.setValue(record.getWorktimeIn());
resttime_in.setValue(record.getResttimeIn());
worktime_out.setValue(record.getWorktimeOut());
resttime_out.setValue(record.getResttimeOut());
change_hour.setValue(String.valueOf(record.getChangeHour()));
outgoing_add_flag.setValue(record.getOutgoingAddFlag());
if (isNewRule) {
overtime_type_minute.setValue(ExtTimecardUtils
.getOvertimeMinuteByDay(record.getOvertimeType()));
overtime_type_week_hour.setValue(ExtTimecardUtils
.getOvertimeHourByWeek(record.getOvertimeType()));
overtime_type_week.setValue(ExtTimecardUtils
.isOvertimeHourByWeek(record.getOvertimeType()) ? "T" : "F");
}
} catch (Exception ex) {
logger.error("exttimecard", ex);
return false;
}
return true;
}
@Override
protected boolean updateFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
try {
EipTExtTimecardSystem record =
ExtTimecardUtils.getEipTExtTimecardSystem(rundata, context);
if (record == null) {
return false;
}
record.setSystemName(system_name.getValue());
record.setUserId((int) user_id.getValue());
record.setStartHour((int) start_hour.getValue());
record.setStartMinute((int) start_minute.getValue());
record.setEndHour((int) end_hour.getValue());
record.setEndMinute((int) end_minute.getValue());
record.setStartDay((int) start_day.getValue());
record.setWorktimeIn((int) worktime_in.getValue());
record.setResttimeIn((int) resttime_in.getValue());
record.setWorktimeOut((int) worktime_out.getValue());
record.setResttimeOut((int) resttime_out.getValue());
record.setChangeHour((int) change_hour.getValue());
String tmp;
if ("T".equals(outgoing_add_flag.getValue())) {
tmp = "T";
} else {
tmp = "F";
}
record.setOutgoingAddFlag(tmp);
// 更新日
record.setUpdateDate(Calendar.getInstance().getTime());
if (isNewRule) {
String overType =
+overtime_type_minute.getValue()
+ "-"
+ ("T".equals(overtime_type_week.getValue()) ? "T" : "F")
+ overtime_type_week_hour.getValue();
record.setOvertimeType(overType);
}
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
record.getSystemId(),
ALEventlogConstants.PORTLET_TYPE_EXTTIMECARD_SYSTEM,
record.getSystemName());
Database.commit();
} catch (Exception ex) {
Database.rollback();
logger.error("exttimecard", ex);
return false;
}
return true;
}
@Override
protected boolean deleteFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
try {
// オブジェクトモデルを取得
EipTExtTimecardSystem record =
ExtTimecardUtils.getEipTExtTimecardSystem(rundata, context);
if (record == null) {
return false;
}
if (record.getSystemId().intValue() == 1) {
// 勤務形態「通常」は削除不可
msgList.add(ALLocalizationUtils
.getl10n("EXTTIMECARD_ALERT_DELETE_WORKING_ARRANGEMENTS"));
return false;
}
Database.delete(record);
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
record.getSystemId(),
ALEventlogConstants.PORTLET_TYPE_EXTTIMECARD_SYSTEM,
record.getSystemName());
Database.commit();
} catch (Exception ex) {
Database.rollback();
logger.error("exttimecard", ex);
return false;
}
return true;
}
@Override
protected boolean insertFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
try {
EipTExtTimecardSystem record =
Database.create(EipTExtTimecardSystem.class);
record.setSystemName(system_name.getValue());
record.setUserId((int) user_id.getValue());
record.setStartHour((int) start_hour.getValue());
record.setStartMinute((int) start_minute.getValue());
record.setEndHour((int) end_hour.getValue());
record.setEndMinute((int) end_minute.getValue());
record.setStartDay((int) start_day.getValue());
record.setWorktimeIn((int) worktime_in.getValue());
record.setResttimeIn((int) resttime_in.getValue());
record.setWorktimeOut((int) worktime_out.getValue());
record.setResttimeOut((int) resttime_out.getValue());
record.setChangeHour((int) change_hour.getValue());
String tmp;
if ("T".equals(outgoing_add_flag.getValue())) {
tmp = "T";
} else {
tmp = "F";
}
record.setOutgoingAddFlag(tmp);
String overType;
if (isNewRule) {
overType =
+overtime_type_minute.getValue()
+ "-"
+ ("T".equals(overtime_type_week.getValue()) ? "T" : "F")
+ overtime_type_week_hour.getValue();
} else {
overType = ExtTimecardUtils.OVERTIME_TYPE_O;
}
record.setOvertimeType(overType);
record.setCreateDate(Calendar.getInstance().getTime());
record.setUpdateDate(Calendar.getInstance().getTime());
Database.commit();
// イベントログに保存
ALEventlogFactoryService.getInstance().getEventlogHandler().log(
record.getSystemId(),
ALEventlogConstants.PORTLET_TYPE_EXTTIMECARD_SYSTEM,
record.getSystemName());
} catch (Exception ex) {
Database.rollback();
logger.error("exttimecard", ex);
return false;
}
return true;
}
@Override
protected boolean setFormData(RunData rundata, Context context,
List<String> msgList) throws ALPageNotFoundException, ALDBErrorException {
boolean res = super.setFormData(rundata, context, msgList);
if (res) {
if (ALEipConstants.MODE_NEW_FORM.equals(this.getMode())) {
try {
SelectQuery<EipTExtTimecardSystem> query =
Database.query(EipTExtTimecardSystem.class);
Expression exp1 =
ExpressionFactory.matchDbExp(
EipTExtTimecardSystem.SYSTEM_ID_PK_COLUMN,
1);
query.setQualifier(exp1);
List<EipTExtTimecardSystem> list = query.fetchList();
EipTExtTimecardSystem record = list.get(0);
user_id.setValue(String.valueOf(record.getUserId()));
system_name.setValue("");
start_hour.setValue(String.valueOf(record.getStartHour()));
start_minute.setValue(String.valueOf(record.getStartMinute()));
end_hour.setValue(String.valueOf(record.getEndHour()));
end_minute.setValue(String.valueOf(record.getEndMinute()));
start_day.setValue(String.valueOf(record.getStartDay()));
worktime_in.setValue(record.getWorktimeIn());
resttime_in.setValue(record.getResttimeIn());
worktime_out.setValue(record.getWorktimeOut());
resttime_out.setValue(record.getResttimeOut());
change_hour.setValue(String.valueOf(record.getChangeHour()));
outgoing_add_flag.setValue(record.getOutgoingAddFlag());
overtime_type_minute
.setValue(ExtTimecardUtils.OVERTIME_TYPE_DEFAULT_MINUTE);
overtime_type_week_hour
.setValue(ExtTimecardUtils.OVERTIME_TYPE_DEFAULT_HOUR_BY_WEEK);
overtime_type_week.setValue("F");
} catch (Exception ex) {
logger.error("[ExtTimecardSystemFormData]", ex);
}
}
if (ALEipConstants.MODE_UPDATE.equals(this.getMode())) {
if (!(this.entity_id > 0)) {
entity_id =
Integer.parseInt(ALEipUtils.getTemp(
rundata,
context,
ALEipConstants.ENTITY_ID));
system_id.setValue(entity_id);
}
}
}
return res;
}
@Override
protected void setValidator() throws ALPageNotFoundException,
ALDBErrorException {
start_hour.limitValue(0, 23);
start_minute.limitValue(0, 59);
end_hour.limitValue(0, 23);
end_minute.limitValue(0, 59);
start_day.limitValue(0, 28);
worktime_in.limitValue(0, 480);
worktime_out.limitValue(0, 480);
resttime_in.limitValue(0, 480);
resttime_out.limitValue(0, 480);
overtime_type_minute.limitValue(0, 1440);
overtime_type_week_hour.limitValue(0, 168);
}
@Override
protected boolean validate(List<String> msgList)
throws ALPageNotFoundException, ALDBErrorException {
try {
SelectQuery<EipTExtTimecardSystem> query =
Database.query(EipTExtTimecardSystem.class);
Expression exp1 =
ExpressionFactory.matchExp(
EipTExtTimecardSystem.SYSTEM_NAME_PROPERTY,
system_name.getValue());
query.setQualifier(exp1);
if (ALEipConstants.MODE_UPDATE.equals(getMode())) {
Expression exp2 =
ExpressionFactory.noMatchDbExp(
EipTExtTimecardSystem.SYSTEM_ID_PK_COLUMN,
system_id.getValue());
query.andQualifier(exp2);
}
if (query.fetchList().size() != 0) {
msgList.add(ALLocalizationUtils.getl10nFormat(
"EXTTIMECARD_ALERT_ALREADY_ADDED_WORKING_ARRANGEMENTS",
system_name.toString()));
}
long start_time = start_hour.getValue() * 60 + start_minute.getValue();
long end_time = end_hour.getValue() * 60 + end_minute.getValue();
long change_time = change_hour.getValue() * 60;
if (!isValidChangeTime(start_time, end_time, change_time)) {
msgList.add(ALLocalizationUtils
.getl10n("EXTTIMECARD_ALERT_SELECT_CHANGE_HOUR"));
}
if (isNewRule) {
overtime_type_minute.validate(msgList);
overtime_type_week_hour.validate(msgList);
}
} catch (Exception ex) {
logger.error("exttimecard", ex);
return false;
}
system_name.validate(msgList);
worktime_in.validate(msgList);
resttime_in.validate(msgList);
worktime_out.validate(msgList);
resttime_out.validate(msgList);
return (msgList.size() == 0);
}
/**
* 勤務時間と日付切替時刻の関係の妥当性を検証します。
*
* @param start_time
* @param end_time
* @param change_time
* @return
*/
private boolean isValidChangeTime(long start_time, long end_time,
long change_time) {
if (end_time <= start_time) {
end_time += 24 * 60;
}
if (start_time <= change_time && change_time <= end_time) {
return false;
} else {
change_time += 24 * 60;
if (end_time >= change_time) {
return false;
}
}
return true;
}
/**
* 詳細データを取得する抽象メソッドです。
*
* @param rundata
* @param context
* @return
*/
protected Object selectDetail(RunData rundata, Context context)
throws ALPageNotFoundException, ALDBErrorException {
return null;
}
/**
*
* @return
*/
public ALNumberField getStartTimeHour() {
return this.start_hour;
}
/**
*
* @return
*/
public ALNumberField getStartTimeMinute() {
return this.start_minute;
}
/**
*
* @return
*/
public ALNumberField getEndTimeHour() {
return this.end_hour;
}
/**
*
* @return
*/
public ALNumberField getEndTimeMinute() {
return this.end_minute;
}
/**
*
* @return
*/
public ALNumberField getWorktimeIn() {
return this.worktime_in;
}
/**
*
* @return
*/
public ALNumberField getWorktimeOut() {
return this.worktime_out;
}
/**
*
* @return
*/
public ALNumberField getResttimeIn() {
return this.resttime_in;
}
/**
*
* @return
*/
public ALNumberField getResttimeOut() {
return this.resttime_out;
}
public String getWorkTimeInRestTimeInText() {
return ALLocalizationUtils.getl10nFormat(
"EXTTIMECARD_INPUT_RESTTIME_FOR_WORKTIMEIN",
worktime_in.toString(),
resttime_in.toString());
}
public String getWorkTimeOutRestTimeOutText() {
return ALLocalizationUtils.getl10nFormat(
"EXTTIMECARD_INPUT_RESTTIME_FOR_WORKTIMEOUT",
worktime_out.toString(),
resttime_out.toString());
}
/**
*
* @return
*/
public ALNumberField getChangeHour() {
return this.change_hour;
}
/**
*
* @return
*/
public ALStringField getSystemName() {
return this.system_name;
}
/**
*
* @return
*/
public ALStringField getOutgoingAddFlag() {
return this.outgoing_add_flag;
}
/**
* @return
*/
public ALNumberField getStartDay() {
return start_day;
}
public ALNumberField getSystemId() {
return this.system_id;
}
public ALNumberField getOvertimeTypeMinute() {
return overtime_type_minute;
}
public ALNumberField getOvertimeTypeWeekHour() {
return overtime_type_week_hour;
}
public ALStringField getOvertimeTypeWeek() {
return overtime_type_week;
}
public boolean isNewRule() {
return ExtTimecardUtils.isNewRule();
}
}