/* * 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.math.BigDecimal; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.jar.Attributes; 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.services.TurbineServices; import org.apache.turbine.util.RunData; import org.apache.velocity.context.Context; import com.aimluck.commons.field.ALDateTimeField; 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.ALAbstractSelectData; import com.aimluck.eip.common.ALBaseUser; import com.aimluck.eip.common.ALDBErrorException; import com.aimluck.eip.common.ALData; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALEipGroup; import com.aimluck.eip.common.ALEipManager; import com.aimluck.eip.common.ALEipPost; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.common.ALPageNotFoundException; import com.aimluck.eip.common.ALPermissionException; 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.ResultList; 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.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; /** * タイムカード集計の一覧を処理するクラスです。 <br /> * * */ public class ExtTimecardSummaryListSelectData extends ALAbstractSelectData<EipTExtTimecard, EipTExtTimecard> implements ALData { /** logger */ private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ExtTimecardSummaryListSelectData.class.getName()); /** <code>target_group_name</code> 表示対象の部署名 */ private String target_group_name; /** <code>target_user_id</code> 表示対象のユーザ ID */ private String target_user_id; /** <code>myGroupList</code> グループリスト(My グループと部署) */ private List<ALEipGroup> myGroupList = null; /** <code>userList</code> 表示切り替え用のユーザリスト */ private List<ALEipUser> userList = null; /** 一覧データ */ private List<Object> list; /** <code>userid</code> ユーザーID */ private String userid; /** <code>TARGET_GROUP_NAME</code> グループによる表示切り替え用変数の識別子 */ private final String TARGET_GROUP_NAME = "target_group_name"; /** <code>TARGET_USER_ID</code> ユーザによる表示切り替え用変数の識別子 */ private final String TARGET_USER_ID = "target_user_id"; private String nowtime; /** ユーザーマップ */ private Map<Integer, List<ExtTimecardResultData>> usermap; /** 日付マップ */ private Map<Integer, ExtTimecardSummaryResultData> datemap; /** アクセス権限の機能名 */ private String aclPortletFeature = null; /** 閲覧権限の有無 */ private boolean hasAclSummaryOther; /** 他のユーザーの更新権限 */ private boolean hasAclUpdate; /** 他のユーザーの追加権限 */ private boolean hasAclInsert; /** 他ユーザーのxlsエクスポート権限 */ private boolean hasAclXlsExport; /** <code>viewMonth</code> 現在の月 */ private ALDateTimeField viewMonth; /** <code>prevMonth</code> 前の月 */ private ALDateTimeField prevMonth; /** <code>nextMonth</code> 次の月 */ private ALDateTimeField nextMonth; /** <code>currentMonth</code> 今月 */ private ALDateTimeField currentMonth; /** <code>today</code> 今日 */ private ALDateTimeField today; /** <code>viewStart</code> 表示開始日時 */ private ALDateTimeField viewStart; /** <code>viewEnd</code> 表示終了日時 */ private ALDateTimeField viewEnd; /** <code>viewEndCrt</code> 表示終了日時 (Criteria) */ private ALDateTimeField viewEndCrt; private final String MODE = "summary"; /** <code>viewTodo</code> ToDo 表示設定 */ protected int viewTodo; /** 開始日 */ private int startDay; private boolean isNewRule; /** * */ @Override public void initField() { } /** * * @param action * @param rundata * @param context * @throws ALPageNotFoundException * @throws ALDBErrorException */ @Override public void init(ALAction action, RunData rundata, Context context) throws ALPageNotFoundException, ALDBErrorException { super.init(action, rundata, context); this.initField(); // POST/GET から yyyy-MM の形式で受け渡される。 // 現在の月 viewMonth = new ALDateTimeField("yyyy-MM"); viewMonth.setNotNull(true); // 前の月 prevMonth = new ALDateTimeField("yyyy-MM"); // 次の月 nextMonth = new ALDateTimeField("yyyy-MM"); // 今月 currentMonth = new ALDateTimeField("yyyy-MM"); // 表示開始日時 viewStart = new ALDateTimeField("yyyy-MM-dd"); // 表示終了日時 viewEnd = new ALDateTimeField("yyyy-MM-dd"); // 表示終了日時 (Criteria) viewEndCrt = new ALDateTimeField("yyyy-MM-dd"); startDay = 1; // 自ポートレットからのリクエストであれば、パラメータを展開しセッションに保存する。 if (ALEipUtils.isMatch(rundata, context)) { // スケジュールの表示開始日時 // e.g. 2004-3-14 if (rundata.getParameters().containsKey("view_month")) { ALEipUtils.setTemp(rundata, context, "view_month", rundata .getParameters() .getString("view_month")); } } // ログインユーザの ID を設定する. userid = Integer.toString(ALEipUtils.getUserId(rundata)); // My グループの一覧を取得する. List<ALEipGroup> myGroups = ALEipUtils.getMyGroups(rundata); myGroupList = new ArrayList<ALEipGroup>(); int length = myGroups.size(); for (int i = 0; i < length; i++) { myGroupList.add(myGroups.get(i)); } try { // スケジュールを表示するユーザ ID をセッションに設定する. String userFilter = ALEipUtils.getTemp(rundata, context, TARGET_USER_ID); if (userFilter != null && (!userFilter.equals(""))) { int paramId = -1; try { paramId = Integer.parseInt(userFilter); if (paramId > 3) { ALEipUser user = ALEipUtils.getALEipUser(paramId); if (user != null) { // 指定したユーザが存在する場合,セッションに保存する. ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, userFilter); } else { ALEipUtils.removeTemp(rundata, context, TARGET_USER_ID); } } } catch (NumberFormatException e) { } } else { ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, userid); } } catch (Exception ex) { logger.error("exttimecard", ex); } target_group_name = getTargetGroupName(rundata, context); if (target_group_name != null) { if ((!target_group_name.equals("")) && (!target_group_name.equals("all")) && (!target_group_name.equals("only"))) { userList = ALEipUtils.getUsers(target_group_name); } else if (target_group_name.equals("all") || target_group_name.equals("only")) { userList = getUserList(Integer.parseInt(userid)); } else { userList = ALEipUtils.getUsers("LoginUser"); } } else { userList = ALEipUtils.getUsers("LoginUser"); } // アクセス権 if (!(userList == null) && !(userList.size() == 0)) { for (ALEipUser group_target_user : userList) { String group_target_user_id = group_target_user.getUserId().getValueAsString(); if (userid.equals(group_target_user_id)) { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_SELF; break; } else { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER; } } } else { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER; } ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); hasAclSummaryOther = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER, ALAccessControlConstants.VALUE_ACL_LIST); // 他のユーザー更新権限 hasAclUpdate = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER, ALAccessControlConstants.VALUE_ACL_UPDATE); // 他のユーザーの追加権限 hasAclInsert = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_OTHER, ALAccessControlConstants.VALUE_ACL_INSERT); // 他のユーザーの編集権限 hasAclXlsExport = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), aclPortletFeature, ALAccessControlConstants.VALUE_ACL_EXPORT); if (!hasAclSummaryOther) { // 他ユーザーの閲覧権限がないときには、グループを未選択にする。 target_group_name = "only"; aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_SELF; hasAclXlsExport = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), ALAccessControlConstants.POERTLET_FEATURE_TIMECARD_TIMECARD_SELF, ALAccessControlConstants.VALUE_ACL_EXPORT); } datemap = new LinkedHashMap<Integer, ExtTimecardSummaryResultData>(); usermap = new LinkedHashMap<Integer, List<ExtTimecardResultData>>(); /** 現在のユーザを取得 */ if (target_user_id != null && !target_user_id.isEmpty()) { /** 勤務形態通常のstartDayを取得 */ SelectQuery<EipTExtTimecardSystemMap> default_query = Database.query(EipTExtTimecardSystemMap.class); Expression exp = ExpressionFactory.matchExp( EipTExtTimecardSystemMap.USER_ID_PROPERTY, target_user_id); default_query.setQualifier(exp); ResultList<EipTExtTimecardSystemMap> map_list = default_query.getResultList(); if (!map_list.isEmpty()) { startDay = map_list.get(0).getEipTExtTimecardSystem().getStartDay(); } else { EipTExtTimecardSystem system = Database.get(EipTExtTimecardSystem.class, 1); if (system != null) { try { Date now = new Date(); EipTExtTimecardSystemMap rd = new EipTExtTimecardSystemMap(); rd.setEipTExtTimecardSystem(system); int userid = Integer.parseInt(target_user_id); rd.setUserId(userid); rd.setCreateDate(now); rd.setUpdateDate(now); Database.commit(); startDay = system.getStartDay(); } catch (Exception ex) { Database.rollback(); logger.error("exttimecard", ex); } } } } else if (userid != null && !userid.isEmpty()) { /** 勤務形態通常のstartDayを取得 */ SelectQuery<EipTExtTimecardSystemMap> default_query = Database.query(EipTExtTimecardSystemMap.class); Expression exp = ExpressionFactory.matchExp( EipTExtTimecardSystemMap.USER_ID_PROPERTY, userid); default_query.setQualifier(exp); ResultList<EipTExtTimecardSystemMap> map_list = default_query.getResultList(); if (!map_list.isEmpty()) { startDay = map_list.get(0).getEipTExtTimecardSystem().getStartDay(); } else { EipTExtTimecardSystem system = Database.get(EipTExtTimecardSystem.class, 1); if (system != null) { try { Date now = new Date(); EipTExtTimecardSystemMap rd = new EipTExtTimecardSystemMap(); rd.setEipTExtTimecardSystem(system); int userid = Integer.parseInt(target_user_id); rd.setUserId(userid); rd.setCreateDate(now); rd.setUpdateDate(now); Database.commit(); startDay = system.getStartDay(); } catch (Exception ex) { Database.rollback(); logger.error("exttimecard", ex); } } } } // 今日の日付 today = new ALDateTimeField("yyyy-MM-dd"); Calendar to = Calendar.getInstance(); to.set(Calendar.HOUR_OF_DAY, 0); to.set(Calendar.MINUTE, 0); today.setValue(to.getTime()); boolean isBeforeThanStartDay = (Integer.parseInt(today.getDay().toString()) < startDay); // 現在の月 String tmpViewMonth = ALEipUtils.getTemp(rundata, context, "view_month"); if (tmpViewMonth == null || tmpViewMonth.equals("")) { Calendar cal = Calendar.getInstance(); cal.set(Calendar.DATE, 1); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); if (isBeforeThanStartDay) { cal.add(Calendar.MONTH, -1); } viewMonth.setValue(cal.getTime()); } else { viewMonth.setValue(tmpViewMonth); if (!viewMonth.validate(new ArrayList<String>())) { ALEipUtils.removeTemp(rundata, context, "view_month"); throw new ALPageNotFoundException(); } } if (!isBeforeThanStartDay && Integer.parseInt(today.getMonth()) == Integer.parseInt(viewMonth .getMonth() .toString())) { currentMonth.setValue(to.getTime()); } else { Calendar tmp_cal = Calendar.getInstance(); tmp_cal.set(Calendar.DATE, 1); tmp_cal.set(Calendar.HOUR_OF_DAY, 0); tmp_cal.set(Calendar.MINUTE, 0); if (isBeforeThanStartDay) { tmp_cal.add(Calendar.MONTH, -1); } currentMonth.setValue(tmp_cal.getTime()); } // 表示開始日時 Calendar cal = Calendar.getInstance(); cal.set(Calendar.MONTH, Integer.parseInt(viewMonth.getMonth()) - 1); cal.set(Calendar.DATE, startDay); Date startDate = cal.getTime(); viewStart.setValue(startDate); // 表示終了日時 cal.add(Calendar.MONTH, 1); cal.add(Calendar.DATE, -1); Date endDate = cal.getTime(); viewEnd.setValue(endDate); viewEndCrt.setValue(endDate); // 次の月、前の月 Calendar cal2 = Calendar.getInstance(); cal2.setTime(viewMonth.getValue()); cal2.add(Calendar.MONTH, 1); nextMonth.setValue(cal2.getTime()); cal2.add(Calendar.MONTH, -2); prevMonth.setValue(cal2.getTime()); ALEipUtils.setTemp(rundata, context, "tmpStart", viewStart.toString() + "-00-00"); ALEipUtils.setTemp(rundata, context, "tmpEnd", viewStart.toString() + "-00-00"); isNewRule = ExtTimecardUtils.isNewRule(); setupLists(rundata, context); } /** * 一覧表示します。 * * @param action * @param rundata * @param context * @return TRUE 成功 FASLE 失敗 */ @Override public boolean doViewList(ALAction action, RunData rundata, Context context) { try { init(action, rundata, context); doCheckAclPermission( rundata, context, ALAccessControlConstants.VALUE_ACL_LIST); action.setMode(ALEipConstants.MODE_LIST); for (int i = 0; i < userList.size(); i++) { ALEipUser eipUser = userList.get(i); List<EipTExtTimecard> aList = selectList(rundata, context, eipUser.getUserId().getValueAsString()); if (aList != null) { list = new ArrayList<Object>(); Object obj = null; int size = aList.size(); for (int j = 0; j < size; j++) { obj = getResultData(aList.get(j)); if (obj != null) { list.add(obj); } } } } action.setResultData(this); action.putData(rundata, context); ALEipUtils.removeTemp(rundata, context, ALEipConstants.ENTITY_ID); return (list != null); } catch (ALPermissionException e) { ALEipUtils.redirectPermissionError(rundata); return false; } catch (ALPageNotFoundException e) { ALEipUtils.redirectPageNotFound(rundata); return false; } catch (ALDBErrorException e) { ALEipUtils.redirectDBError(rundata); return false; } } /** * * @param rundata * @param context * @param target_user_id * @return * @throws ALPageNotFoundException * @throws ALDBErrorException */ protected List<EipTExtTimecard> selectList(RunData rundata, Context context, String target_user_id) throws ALPageNotFoundException, ALDBErrorException { try { // 指定グループや指定ユーザをセッションに設定する. setupLists(rundata, context); if (!"".equals(target_user_id)) { SelectQuery<EipTExtTimecard> query = getSelectQuery(rundata, context, target_user_id); buildSelectQueryForListView(query); query.orderAscending(EipTExtTimecard.PUNCH_DATE_PROPERTY); return query.getResultList(); } else { return null; } } catch (Exception ex) { logger.error("exttimecard", ex); return null; } } /** * * @param rundata * @param context * @return * @throws ALPageNotFoundException * @throws ALDBErrorException */ @Override protected ResultList<EipTExtTimecard> selectList(RunData rundata, Context context) throws ALPageNotFoundException, ALDBErrorException { try { // 指定グループや指定ユーザをセッションに設定する. setupLists(rundata, context); if (!"".equals(target_user_id)) { SelectQuery<EipTExtTimecard> query = getSelectQuery(rundata, context, target_user_id); buildSelectQueryForListView(query); query.orderAscending(EipTExtTimecard.PUNCH_DATE_PROPERTY); return query.getResultList(); } else { return null; } } catch (Exception ex) { logger.error("exttimecard", ex); return null; } } /** * * @param rundata * @param context * @return * @throws ALPageNotFoundException * @throws ALDBErrorException */ @Override protected EipTExtTimecard selectDetail(RunData rundata, Context context) throws ALPageNotFoundException, ALDBErrorException { return null; } /** * ResultData に値を格納して返します。(一覧データ) <BR> * * @param obj * @return */ @Override protected Object getResultData(EipTExtTimecard record) throws ALPageNotFoundException, ALDBErrorException { try { int user_id = record.getUserId(); ExtTimecardResultData rd = new ExtTimecardResultData(); rd.initField(); Calendar cal = Calendar.getInstance(); cal.setTime(record.getPunchDate()); boolean isCurrentMonth = Integer.parseInt(viewMonth.getMonth()) == cal.get(Calendar.MONTH) + 1; if ((startDay == 1 && !isCurrentMonth) || (startDay > 1 && cal.get(Calendar.DATE) < startDay && isCurrentMonth)) { rd.setCurrentMonth(false); } else { rd.setCurrentMonth(true); } rd.setPunchDate(record.getPunchDate()); rd.setRefixFlag(record.getCreateDate(), record.getUpdateDate()); rd.setClockInTime(record.getClockInTime()); rd.setClockOutTime(record.getClockOutTime()); for (int i = 1; i <= EipTExtTimecard.OUTGOING_COMEBACK_PER_DAY; i++) { rd.setOutgoingTime(record.getOutgoingTime(i), i); rd.setComebackTime(record.getComebackTime(i), i); } rd.setType(record.getType()); List<ExtTimecardResultData> list; if (usermap.containsKey(user_id)) { list = usermap.get(user_id); list.add(rd); usermap.put(user_id, list); } else { list = new ArrayList<ExtTimecardResultData>(); list.add(rd); usermap.put(user_id, list); } } catch (Exception ex) { logger.error("exttimecard", ex); return null; } return null; } /** * * @param obj * @return * @throws ALPageNotFoundException * @throws ALDBErrorException */ @Override protected Object getResultDataDetail(EipTExtTimecard obj) throws ALPageNotFoundException, ALDBErrorException { return null; } /* * (非 Javadoc) */ @Override protected Attributes getColumnMap() { return null; } /** * ログイン中のユーザー情報を取得 * */ private List<ALEipUser> getUserList(int userid) { List<ALEipUser> list = new ArrayList<ALEipUser>(); ALEipUser user = new ALEipUser(); try { user = ALEipUtils.getALEipUser(userid); } catch (NumberFormatException e1) { } catch (ALDBErrorException e1) { } list.add(user); return list; } /** * 指定グループや指定ユーザをセッションに設定する. * * @param rundata * @param context * @throws ALDBErrorException */ private void setupLists(RunData rundata, Context context) { target_group_name = getTargetGroupName(rundata, context); if (target_group_name != null) { if ((!target_group_name.equals("")) && (!target_group_name.equals("all")) && (!target_group_name.equals("only"))) { userList = ALEipUtils.getUsers(target_group_name); } else if (target_group_name.equals("all") || target_group_name.equals("only")) { userList = getUserList(Integer.parseInt(userid)); } else { userList = ALEipUtils.getUsers("LoginUser"); } } else { userList = ALEipUtils.getUsers("LoginUser"); } if (userList == null || userList.size() == 0) { target_user_id = ""; ALEipUtils.removeTemp(rundata, context, TARGET_USER_ID); return; } target_user_id = getTargetUserId(rundata, context); } /** * 表示切り替えで指定したグループ ID を取得する. * * @param rundata * @param context * @return */ private String getTargetGroupName(RunData rundata, Context context) { String target_group_name = null; String idParam = null; if (ALEipUtils.isMatch(rundata, context)) { // 自ポートレットへのリクエストの場合に,グループ名を取得する. idParam = rundata.getParameters().getString(TARGET_GROUP_NAME); } target_group_name = ALEipUtils.getTemp(rundata, context, TARGET_GROUP_NAME); if (idParam == null && target_group_name == null) { ALEipUtils.setTemp(rundata, context, TARGET_GROUP_NAME, "only"); target_group_name = "only"; } else if (idParam != null) { ALEipUtils.setTemp(rundata, context, TARGET_GROUP_NAME, idParam); target_group_name = idParam; } return target_group_name; } /** * 表示切り替えで指定したユーザ ID を取得する. * * @param rundata * @param context * @return */ private String getTargetUserId(RunData rundata, Context context) { String target_user_id = null; String idParam = null; if (ALEipUtils.isMatch(rundata, context)) { // 自ポートレットへのリクエストの場合に,ユーザ ID を取得する. idParam = rundata.getParameters().getString(TARGET_USER_ID); } target_user_id = ALEipUtils.getTemp(rundata, context, TARGET_USER_ID); if (idParam == null && (target_user_id == null)) { // ログインユーザのスケジュールを表示するため,ログイン ID を設定する. ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, userid); target_user_id = userid; } else if (idParam != null) { if (idParam.equals("none")) { // グループで表示を切り替えた場合, // ログインユーザもしくはユーザリストの一番初めのユーザを // 表示するため,ユーザ ID を設定する. ALEipUser eipUser = null; boolean found = false; int length = userList.size(); for (int i = 0; i < length; i++) { eipUser = userList.get(i); String eipUserId = eipUser.getUserId().getValueAsString(); if (userid.equals(eipUserId)) { ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, userid); target_user_id = userid; found = true; break; } } if (!found) { eipUser = userList.get(0); String userId = eipUser.getUserId().getValueAsString(); ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, userId); target_user_id = userId; } } else { // ユーザで表示を切り替えた場合,指定したユーザの ID を設定する. ALEipUtils.setTemp(rundata, context, TARGET_USER_ID, idParam); target_user_id = idParam; } } return target_user_id; } /** * 検索条件を設定した SelectQuery を返します。 <BR> * * @param rundata * @param context * @return */ private SelectQuery<EipTExtTimecard> getSelectQuery(RunData rundata, Context context, String target_user_id) { SelectQuery<EipTExtTimecard> query = Database.query(EipTExtTimecard.class); /** 勤務形態通常のstartDayを取得 */ startDay = 1; SelectQuery<EipTExtTimecardSystemMap> default_query = Database.query(EipTExtTimecardSystemMap.class); Expression exp = ExpressionFactory.matchExp( EipTExtTimecardSystemMap.USER_ID_PROPERTY, target_user_id); default_query.setQualifier(exp); ResultList<EipTExtTimecardSystemMap> map_list = default_query.getResultList(); if (!map_list.isEmpty()) { startDay = map_list.get(0).getEipTExtTimecardSystem().getStartDay(); } else { EipTExtTimecardSystem system = Database.get(EipTExtTimecardSystem.class, 1); if (system != null) { try { Date now = new Date(); EipTExtTimecardSystemMap rd = new EipTExtTimecardSystemMap(); rd.setEipTExtTimecardSystem(system); int userid = Integer.parseInt(target_user_id); rd.setUserId(userid); rd.setCreateDate(now); rd.setUpdateDate(now); Database.commit(); startDay = system.getStartDay(); } catch (Exception ex) { Database.rollback(); logger.error("exttiemcard", ex); } } } Expression exp1 = ExpressionFactory.matchExp(EipTExtTimecard.USER_ID_PROPERTY, Integer .valueOf(target_user_id)); query.setQualifier(exp1); Calendar cal = Calendar.getInstance(); cal.set(Calendar.YEAR, Integer.parseInt(viewMonth.getYear())); cal.set(Calendar.MONTH, Integer.parseInt(viewMonth.getMonth()) - 1); cal.set(Calendar.DAY_OF_MONTH, startDay); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); Calendar cal1 = Calendar.getInstance(); cal1.setTime(cal.getTime()); if (cal1.get(Calendar.DAY_OF_WEEK) > 1) { cal1.add(Calendar.DATE, -(cal1.get(Calendar.DAY_OF_WEEK) - 1)); } Expression exp11 = ExpressionFactory.greaterOrEqualExp( EipTExtTimecard.PUNCH_DATE_PROPERTY, cal1.getTime()); cal.add(Calendar.MONTH, +1); cal.add(Calendar.MILLISECOND, -1); cal.get(Calendar.DAY_OF_WEEK); Expression exp12 = ExpressionFactory.lessOrEqualExp(EipTExtTimecard.PUNCH_DATE_PROPERTY, cal .getTime()); query.andQualifier(exp11.andExp(exp12)); return buildSelectQueryForFilter(query, rundata, context); } /** * ユーザー毎のタイムカード一覧を取得する。 * * @return */ @Deprecated public List<ExtTimecardSummaryResultData> getUserExtTimecards() { List<ExtTimecardSummaryResultData> list = new ArrayList<ExtTimecardSummaryResultData>(); Set<Integer> userset = usermap.keySet(); /** 以下、ユーザーごとの処理 */ for (Integer user_id : userset) { List<ExtTimecardResultData> userlist = usermap.get(user_id); ExtTimecardSummaryResultData summary_rd = new ExtTimecardSummaryResultData(); int work_day = 0, overtime_day = 0, off_day = 0; /** 就業、残業、休出日数 */ float work_hour = 0, overtime_hour = 0, off_hour = 0; /** 就業、残業、休出時間 */ int late_coming_day = 0, early_leaving_day = 0, absent_day = 0; /** 遅刻、早退、欠勤 */ int paid_holiday = 0, compensatory_holiday = 0; /** 有休、代休 */ int other_day = 0, no_input = 0; /** その他、未入力 */ summary_rd.initField(); /** タイムカード設定を取得 */ EipTExtTimecardSystem timecard_system = ExtTimecardUtils.getEipTExtTimecardSystemByUserId(user_id); /** * userlistにはユーザー日ごとのタイムカードのResultDataがリストで入っているため、 * ListResultDataに代入して各日数・時間を計算させる。 */ for (Object obj : userlist) { ExtTimecardResultData rd = (ExtTimecardResultData) obj; if (rd.isCurrentMonth()) { ExtTimecardListResultData lrd = new ExtTimecardListResultData(); lrd.setRd(rd); lrd.setTimecardSystem(timecard_system); lrd.setNewRule(isNewRule); String type = rd.getType().getValue(); if (type.equals(EipTExtTimecard.TYPE_WORK)) { /** 出勤 */ if (lrd.getWorkHour() != ExtTimecardListResultData.NO_DATA) { work_day++; work_hour += lrd.getWorkHour(); } if (lrd.getOvertimeHour() != ExtTimecardListResultData.NO_DATA) { overtime_day++; overtime_hour += lrd.getOvertimeHourWithoutRestHour(); } if (lrd.getOffHour() != ExtTimecardListResultData.NO_DATA) { off_day++; off_hour += lrd.getOffHour(); } if (lrd.isLateComing()) { late_coming_day++; } if (lrd.isEarlyLeaving()) { early_leaving_day++; } } else if (type.equals(EipTExtTimecard.TYPE_ABSENT)) { /** 欠勤 */ absent_day++; } else if (type.equals(EipTExtTimecard.TYPE_HOLIDAY)) { /** 有休 */ paid_holiday++; } else if (type.equals(EipTExtTimecard.TYPE_COMPENSATORY)) { /** 代休 */ compensatory_holiday++; } else if (type.equals(EipTExtTimecard.TYPE_ETC)) { /** その他 */ other_day++; } } } /** ユーザーごとの合計をSummaryResultDataに代入する */ work_hour = ExtTimecardUtils.roundHour(work_hour); overtime_hour = ExtTimecardUtils.roundHour(overtime_hour); off_hour = ExtTimecardUtils.roundHour(off_hour); summary_rd.setWorkDayHour(work_day, work_hour); summary_rd.setOvertimeDayHour(overtime_day, overtime_hour); summary_rd.setOffDayHour(off_day, off_hour); summary_rd.setLateComingDay(late_coming_day); summary_rd.setEarlyLeavingDay(early_leaving_day); summary_rd.setAbsentDay(absent_day); summary_rd.setPaidHoliday(paid_holiday); summary_rd.setCompensatoryHoliday(compensatory_holiday); summary_rd.setOtherDay(other_day); summary_rd.setNoInput(no_input); list.add(summary_rd); } return list; } /** * グループ毎のタイムカード一覧を取得する。 * * @return */ public List<ExtTimecardSummaryResultData> getGroupExtTimecards() { List<ExtTimecardSummaryResultData> list = new ArrayList<ExtTimecardSummaryResultData>(); /** 以下、ユーザーごとの処理 */ for (int i = 0; i < userList.size(); i++) { ALEipUser eipUser = userList.get(i); int user_id = Integer.parseInt(eipUser.getUserId().getValueAsString()); ALBaseUser user = ALEipUtils.getBaseUser(user_id); List<ExtTimecardResultData> userlist = usermap.get(user_id); ExtTimecardSummaryResultData summary_rd = new ExtTimecardSummaryResultData(); int total_work_day = 0, work_day = 0, overtime_day = 0, off_day = 0, official_off_day = 0, statutory_off_day = 0; /** 就業、残業、休出日数 */ float total_work_hour = 0, work_hour = 0, overtime_hour = 0, off_hour = 0; /** 就業、残業、休出時間 */ int late_coming_day = 0, early_leaving_day = 0, absent_day = 0; /** 遅刻、早退、欠勤 */ int paid_holiday = 0, compensatory_holiday = 0; /** 有休、代休 */ int other_day = 0, no_input = 0; /** 遅刻、早退、休憩時間 */ float late_coming_hour = 0, early_leaving_hour = 0, rest_hour = 0; /** 法定内残業時間 */ float overtime_within_statutory_working_hour = 0; /** 所定内深夜業務時間、深夜残業時間 */ float midnight_work_hour = 0, midnight_overtime_hour = 0, total_midnight_work_hour = 0; /** 所定休日所定内出勤時間、所定休日所定内深夜出勤時間、所定休日法定内残業時間、所定休日残業時間、所定休日深夜残業時間 */ float off_day_regular_work_hour = 0f, off_day_regular_midnight_work_hour = 0f, off_day_within_statutory_overtime_hour = 0f, off_day_overtime_hour = 0f, off_day_midnight_work_hour = 0f, total_official_off_hour = 0f; /** 法定休日所定内出勤時間、法定休日所定内深夜出勤時間、法定休日法定内残業時間、法定休日残業時間、法定休日深夜残業時間 */ float statutory_off_day_regular_work_hour = 0f, statutory_off_day_regular_midnight_work_hour = 0f, statutory_off_day_within_statutory_overtime_hour = 0f, statutory_off_day_overtime_hour = 0f, statutory_off_day_midnight_work_hour = 0f, total_statutory_off_hour = 0f; /** その他、未入力 */ summary_rd.initField(); /** タイムカード設定を取得 */ EipTExtTimecardSystem timecard_system = ExtTimecardUtils.getEipTExtTimecardSystemByUserId(user_id); /** user毎のstartDayの更新 */ int startDay = timecard_system.getStartDay(); Calendar tmpCal = Calendar.getInstance(); tmpCal.set(Calendar.YEAR, Integer.parseInt(viewMonth.getYear())); tmpCal.set(Calendar.MONTH, Integer.parseInt(viewMonth.getMonth()) - 1); tmpCal.set(Calendar.DAY_OF_MONTH, startDay); tmpCal.set(Calendar.HOUR_OF_DAY, 0); tmpCal.set(Calendar.MINUTE, 0); tmpCal.set(Calendar.SECOND, 0); tmpCal.set(Calendar.MILLISECOND, 0); Calendar cal1 = Calendar.getInstance(); cal1.setTime(tmpCal.getTime()); if (cal1.get(Calendar.DAY_OF_WEEK) > 1) { cal1.add(Calendar.DATE, -(cal1.get(Calendar.DAY_OF_WEEK) - 1)); } Date queryStartDate = cal1.getTime(); /** * userlistにはユーザー日ごとのタイムカードのResultDataがリストで入っているため、 * ListResultDataに代入して各日数・時間を計算させる。 */ if (userlist != null) { ExtTimecardListResultDataContainer container = ExtTimecardUtils.groupByWeek( queryStartDate, userlist, timecard_system); container.calculateWeekOvertime(); for (ExtTimecardResultData rd : userlist) { if (rd.isCurrentMonth()) { ExtTimecardListResultData lrd = new ExtTimecardListResultData(); lrd.initField(); lrd.setDate(rd.getPunchDate().getValue()); lrd.setRd(rd); lrd.setTimecardSystem(timecard_system); lrd.setNewRule(isNewRule); lrd.setWeekOvertime(container.getWeekOvertime(lrd)); lrd.setStatutoryHoliday(container.isStatutoryOffDay(lrd)); lrd.calculateWeekOvertime(); String type = rd.getType().getValue(); if (type.equals(EipTExtTimecard.TYPE_WORK)) { if (lrd.getTotalWorkHour() != ExtTimecardListResultData.NO_DATA) { total_work_day++; total_work_hour += lrd.getTotalWorkHour(); } /** 出勤 */ if (lrd.getWorkHour() > 0) { work_day++; work_hour += lrd.getWorkHour(); } /** 残業(平日) */ if (lrd.getOvertimeHourWithoutRestHour() > 0) { overtime_day++; overtime_hour += lrd.getOvertimeHourWithoutRestHour(); } /** 法定内残業 */ if (lrd.getWithinStatutoryOvertimeWorkHourWithoutOffday() != ExtTimecardListResultData.NO_DATA) { overtime_within_statutory_working_hour += lrd.getWithinStatutoryOvertimeWorkHourWithoutOffday(); } /** 休出 */ if (lrd.getOffHour() != ExtTimecardListResultData.NO_DATA) { off_day++; off_hour += lrd.getOffHour(); // 所定内休日、法定内休日に振り分け if (container.isStatutoryOffDay(lrd)) { statutory_off_day++; total_statutory_off_hour += lrd.getTotalStatutoryOffHour(); statutory_off_day_regular_work_hour += lrd.getInworkHour(); statutory_off_day_overtime_hour += lrd.getOvertimeHour(); statutory_off_day_midnight_work_hour += lrd.getMidnightOvertimeWorkHour(); statutory_off_day_regular_midnight_work_hour += lrd.getMidnightRegularWorkHour(); if (lrd.getWithinStatutoryOvertimeWorkHour() != ExtTimecardListResultData.NO_DATA) { statutory_off_day_within_statutory_overtime_hour += lrd.getWithinStatutoryOvertimeWorkHour(); } } else { official_off_day++; total_official_off_hour += lrd.getTotalOfficialOffHour(); off_day_regular_work_hour += lrd.getInworkHour(); off_day_overtime_hour += lrd.getOvertimeHour(); off_day_midnight_work_hour += lrd.getMidnightOvertimeWorkHour(); off_day_regular_midnight_work_hour += lrd.getMidnightRegularWorkHour(); if (lrd.getWithinStatutoryOvertimeWorkHour() != ExtTimecardListResultData.NO_DATA) { off_day_within_statutory_overtime_hour += lrd.getWithinStatutoryOvertimeWorkHour(); } } } else { /** 深夜勤務(平日) */ if (lrd.getMidnightRegularWorkHour() != ExtTimecardListResultData.NO_DATA) { midnight_work_hour += lrd.getMidnightRegularWorkHour(); } if (lrd.getMidnightOvertimeWorkHour() != ExtTimecardListResultData.NO_DATA) { midnight_overtime_hour += lrd.getMidnightOvertimeWorkHour(); } } /** 深夜時間 */ if (lrd.getMidnightWorkHour() != ExtTimecardListResultData.NO_DATA) { total_midnight_work_hour += lrd.getMidnightWorkHour(); } /** 遅刻 */ if (lrd.isLateComing()) { late_coming_day++; late_coming_hour += lrd.getLateComingHour(); } /** 早退 */ if (lrd.isEarlyLeaving()) { early_leaving_day++; early_leaving_hour += lrd.getEarlyLeavingHour(); } /** 休憩時間 */ if (lrd.getRestHour() != ExtTimecardListResultData.NO_DATA) { rest_hour += lrd.getRestHour(); } } else if (type.equals(EipTExtTimecard.TYPE_ABSENT)) { /** 欠勤 */ absent_day++; } else if (type.equals(EipTExtTimecard.TYPE_HOLIDAY)) { /** 有休 */ paid_holiday++; } else if (type.equals(EipTExtTimecard.TYPE_COMPENSATORY)) { /** 代休 */ compensatory_holiday++; } else if (type.equals(EipTExtTimecard.TYPE_ETC)) { /** その他 */ other_day++; } } } } else { /** 未入力数の計算のため、長さ0のArrayListをつくる */ userlist = new ArrayList<ExtTimecardResultData>(); } /** 未入力数を月日数からデータ数を引いて計算する */ Calendar cal = Calendar.getInstance(); cal.setTime(getViewMonth().getValue()); no_input = cal.getActualMaximum(Calendar.DAY_OF_MONTH) - userlist.size(); /** ユーザーごとの合計をSummaryResultDataに代入する */ total_work_hour = ExtTimecardUtils.roundHour(total_work_hour); work_hour = ExtTimecardUtils.roundHour(work_hour); overtime_hour = ExtTimecardUtils.roundHour(overtime_hour); off_hour = ExtTimecardUtils.roundHour(off_hour); midnight_work_hour = ExtTimecardUtils.roundHour(midnight_work_hour); overtime_within_statutory_working_hour = ExtTimecardUtils.roundHour(overtime_within_statutory_working_hour); midnight_overtime_hour = ExtTimecardUtils.roundHour(midnight_overtime_hour); rest_hour = ExtTimecardUtils.roundHour(rest_hour); total_official_off_hour = ExtTimecardUtils.roundHour(total_official_off_hour); off_day_regular_work_hour = ExtTimecardUtils.roundHour(off_day_regular_work_hour); off_day_regular_midnight_work_hour = ExtTimecardUtils.roundHour(off_day_regular_midnight_work_hour); off_day_within_statutory_overtime_hour = ExtTimecardUtils.roundHour(off_day_within_statutory_overtime_hour); off_day_midnight_work_hour = ExtTimecardUtils.roundHour(off_day_midnight_work_hour); off_day_overtime_hour = ExtTimecardUtils.roundHour(off_day_overtime_hour); total_statutory_off_hour = ExtTimecardUtils.roundHour(total_statutory_off_hour); statutory_off_day_regular_work_hour = ExtTimecardUtils.roundHour(statutory_off_day_regular_work_hour); statutory_off_day_regular_midnight_work_hour = ExtTimecardUtils .roundHour(statutory_off_day_regular_midnight_work_hour); statutory_off_day_within_statutory_overtime_hour = ExtTimecardUtils .roundHour(statutory_off_day_within_statutory_overtime_hour); statutory_off_day_midnight_work_hour = ExtTimecardUtils.roundHour(statutory_off_day_midnight_work_hour); statutory_off_day_overtime_hour = ExtTimecardUtils.roundHour(statutory_off_day_overtime_hour); total_midnight_work_hour = ExtTimecardUtils.roundHour(total_midnight_work_hour); late_coming_hour = ExtTimecardUtils.roundHour(late_coming_hour); early_leaving_hour = ExtTimecardUtils.roundHour(early_leaving_hour); summary_rd.setUserName(eipUser.getAliasName().getValue()); summary_rd.setSystemName(timecard_system.getSystemName()); summary_rd.setTotalWorkDay(total_work_day); summary_rd.setTotalWorkHour(total_work_hour); summary_rd.setWorkDayHour(work_day, work_hour); summary_rd.setOvertimeDayHour(overtime_day, overtime_hour); summary_rd.setOffDayHour(off_day, off_hour); summary_rd.setOfficialOffDay(official_off_day); summary_rd.setStatutoryOffDay(statutory_off_day); summary_rd.setLateComingDay(late_coming_day); summary_rd.setEarlyLeavingDay(early_leaving_day); summary_rd.setAbsentDay(absent_day); summary_rd.setPaidHoliday(paid_holiday); summary_rd.setCompensatoryHoliday(compensatory_holiday); summary_rd.setOtherDay(other_day); summary_rd.setNoInput(no_input); summary_rd.setOwnerId(eipUser.getUserId().getValue()); summary_rd.setUser(user); summary_rd.setLateComingDay(late_coming_day, late_coming_hour); summary_rd.setEarlyLeavingDay(early_leaving_day, early_leaving_hour); summary_rd.setMidnightWorkHour(midnight_work_hour); summary_rd .setOvertimeWithinStatutoryWorkingHour(overtime_within_statutory_working_hour); summary_rd.setMidnightOvertimeHour(midnight_overtime_hour); summary_rd.setRestHour(rest_hour); summary_rd.setTotalOfficialOffHour(total_official_off_hour); summary_rd.setOffDayRegularWorkHour(off_day_regular_work_hour); summary_rd .setOffDayRegularMidnightWorkHour(off_day_regular_midnight_work_hour); summary_rd .setOffDayWithinStatutoryOvertimeWorkingHour(off_day_within_statutory_overtime_hour); summary_rd.setOffDayMidnightOvertimeWorkHour(off_day_midnight_work_hour); summary_rd.setOffDayOvertimeHour(off_day_overtime_hour); summary_rd.setTotalStatutoryOffHour(total_statutory_off_hour); summary_rd .setStatutoryOffDayRegularWorkHour(statutory_off_day_regular_work_hour); summary_rd .setStatutoryOffDayRegularMidnightWorkHour(statutory_off_day_regular_midnight_work_hour); summary_rd .setStatutoryOffDayWithinStatutoryOvertimeWorkingHour(statutory_off_day_within_statutory_overtime_hour); summary_rd .setStatutoryOffDayMidnightOvertimeWorkHour(statutory_off_day_midnight_work_hour); summary_rd .setStatutoryOffDayOvertimeHour(statutory_off_day_overtime_hour); summary_rd.setTotalMidnightWorkHour(total_midnight_work_hour); list.add(summary_rd); } return list; } /** * 指定した2つの日付を比較する. * * @param date1 * @param date2 * @param checkTime * 時間まで比較する場合,true. * @return 等しい場合,0. date1>date2の場合, 1. date1 <date2の場合, 2. */ private 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; } /** * userListを設定する. * */ public void setuserList(String target_group_name) { this.target_group_name = target_group_name; if (this.target_group_name != null) { if ((!this.target_group_name.equals("")) && (!this.target_group_name.equals("all")) && (!this.target_group_name.equals("only"))) { userList = ALEipUtils.getUsers(target_group_name); } else if (this.target_group_name.equals("all") || this.target_group_name.equals("only")) { userList = getUserList(Integer.parseInt(userid)); } else { userList = ALEipUtils.getUsers("LoginUser"); } } else { userList = ALEipUtils.getUsers("LoginUser"); } } /** * 表示切り替え時に指定するグループ名 * * @return */ public String getTargetGroupName() { return target_group_name; } /** * 表示切り替え時に指定するユーザ ID * * @return */ public String getTargetUserId() { return target_user_id; } /** * 指定グループに属するユーザの一覧を取得する. * * @param groupname * @return */ public List<ALEipUser> getUsers() { if (hasAclSummaryOther) { return userList; } else { try { List<ALEipUser> users = new ArrayList<ALEipUser>(); users.add(ALEipUtils.getALEipUser(Integer.parseInt(userid))); return users; } catch (Exception e) { return null; } } } /** * 部署の一覧を取得する. * * @return */ public Map<Integer, ALEipPost> getPostMap() { if (hasAclSummaryOther) { return ALEipManager.getInstance().getPostMap(); } else { return null; } } /** * My グループの一覧を取得する. * * @return */ public List<ALEipGroup> getMyGroupList() { if (hasAclSummaryOther) { return myGroupList; } else { return null; } } /** * ログインユーザの ID を取得する. * * @return */ public String getUserId() { return userid; } /** * * @param id * @return */ public boolean isMatch(int id1, long id2) { return id1 == (int) id2; } /** * @return */ public String getNowTime() { return nowtime; } /** * * @param minute * @return */ @SuppressWarnings("unused") private String minuteToHour(long minute) { BigDecimal decimal = new BigDecimal(minute / 60.0); DecimalFormat dformat = new DecimalFormat("##.#"); String str = dformat.format(decimal.setScale(1, BigDecimal.ROUND_FLOOR).doubleValue()); return str; } /** * アクセス権限チェック用メソッド。<br /> * アクセス権限の機能名を返します。 * * @return */ @Override public String getAclPortletFeature() { return aclPortletFeature; } /** * 表示開始日時を取得します。 * * @return */ public ALDateTimeField getViewStart() { return viewStart; } /** * 表示終了日時を取得します。 * * @return */ public ALDateTimeField getViewEnd() { return viewEnd; } /** * 表示終了日時 (Criteria) を取得します。 * * @return */ public ALDateTimeField getViewEndCrt() { return viewEndCrt; } /** * 前の月を取得します。 * * @return */ public ALDateTimeField getPrevMonth() { return prevMonth; } /** * 次の月を取得します。 * * @return */ public ALDateTimeField getNextMonth() { return nextMonth; } /** * 今月を取得します。 * * @return */ public ALDateTimeField getCurrentMonth() { return currentMonth; } /** * 現在の月を取得します。 * * @return */ public ALDateTimeField getViewMonth() { return viewMonth; } public String getViewMonthYearMonthText() { return ALLocalizationUtils.getl10nFormat( "EXTTIMECARD_YEAR_MONTH_FORMAT", viewMonth.getYear().toString(), viewMonth.getMonth().toString()); } /** * 今日を取得します。 * * @return */ public ALDateTimeField getToday() { return today; } public boolean hasAclUpdate() { return hasAclUpdate; } public boolean hasAclInsert() { return hasAclInsert; } public boolean hasAclXlsExport() { return hasAclXlsExport; } public String getMode() { return MODE; } public String getLoginUserName() { try { ALEipUser user = ALEipUtils.getALEipUser(Integer.valueOf(userid)); return user.getAliasName().toString(); } catch (Exception ignore) { return null; } } /** * スクリーンの名前を返します。 * * @return */ public String getScreenName() { return "ExtTimecardSummarySelectData"; } protected List<ALEipUser> getUserList() { return this.userList; } protected Map<Integer, List<ExtTimecardResultData>> getUserMap() { return this.usermap; } public boolean isNewRule() { return ExtTimecardUtils.isNewRule(); } }