/* * 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.schedule; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import net.sf.json.JSONObject; 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.EipTSchedule; import com.aimluck.eip.cayenne.om.portlet.EipTScheduleMap; import com.aimluck.eip.common.ALDBErrorException; import com.aimluck.eip.common.ALEipConstants; import com.aimluck.eip.common.ALEipUser; import com.aimluck.eip.common.ALPageNotFoundException; import com.aimluck.eip.common.ALPermissionException; import com.aimluck.eip.mail.ALAdminMailContext; import com.aimluck.eip.mail.ALAdminMailMessage; import com.aimluck.eip.mail.ALMailService; import com.aimluck.eip.mail.util.ALEipUserAddr; import com.aimluck.eip.mail.util.ALMailUtils; import com.aimluck.eip.modules.actions.common.ALAction; import com.aimluck.eip.orm.Database; import com.aimluck.eip.schedule.beans.ScheduleBean; import com.aimluck.eip.schedule.util.ScheduleUtils; 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.eventlog.ALEventlogConstants; import com.aimluck.eip.services.eventlog.ALEventlogFactoryService; import com.aimluck.eip.services.orgutils.ALOrgUtilsService; import com.aimluck.eip.services.quota.ALQuotaService; import com.aimluck.eip.services.reminder.ALReminderHandler.ReminderCategory; import com.aimluck.eip.services.reminder.ALReminderService; import com.aimluck.eip.services.reminder.model.ALReminderItem; import com.aimluck.eip.util.ALEipUtils; import com.aimluck.eip.util.ALLocalizationUtils; public class ScheduleWeeklyJSONFormData { private static final JetspeedLogger logger = JetspeedLogFactoryService .getLogger(ScheduleWeeklyJSONFormData.class.getName()); // update private ALDateTimeField startDate; private ALDateTimeField endDate; private ALDateTimeField viewDate; private String start_date; private String end_date; private String view_date; private int entityId; private String aclPortletFeature; private int userId; private EipTSchedule schedule; private boolean isEdit; private String orgId; // private boolean is_span; // 期間スケジュールかどうか // // private boolean isMember; // 自分はメンバーに含まれるかどうか private int edit_repeat_flag; private List<ALEipUser> memberList; private List<EipTScheduleMap> scheduleMaps; private int ownerId; private ArrayList<String> msgList; private boolean isViewList; private boolean ignore_duplicate_facility; public void initField() { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_SELF; } public void init(ALAction action, RunData rundata, Context context) throws ALPageNotFoundException, ALDBErrorException { start_date = null; end_date = null; view_date = null; entityId = 0; userId = 0; // is_span = false; // isMember = false; isEdit = false; memberList = new ArrayList<ALEipUser>(); scheduleMaps = null; ownerId = 0; edit_repeat_flag = 0; startDate = new ALDateTimeField("yyyy-MM-dd-HH-mm"); endDate = new ALDateTimeField("yyyy-MM-dd-HH-mm"); viewDate = new ALDateTimeField("yyyy-MM-dd"); msgList = new ArrayList<String>(); isViewList = false; orgId = Database.getDomainName(); aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_SELF; ignore_duplicate_facility = false; } public String doViewList(ALAction action, RunData rundata, Context context, List<String> msgList) { try { doCheckAclPermission( rundata, context, ALAccessControlConstants.VALUE_ACL_LIST); AjaxScheduleResultData rd; ScheduleBean bean; List<List<ScheduleBean>> termScheduleList = new ArrayList<List<ScheduleBean>>(); List<AjaxScheduleResultData> _scheduleList = new ArrayList<AjaxScheduleResultData>(); List<ScheduleBean> scheduleList = new ArrayList<ScheduleBean>(); List<String> holidayList = new ArrayList<String>(); List<String> dateList = new ArrayList<String>(); List<String> dayOfWeekList = new ArrayList<String>(); AjaxScheduleWeeklyGroupSelectData listData = new AjaxScheduleWeeklyGroupSelectData(); // ScheduleWeeklySelectData listData = new // ScheduleWeeklySelectData(); listData.initField(); listData.doSelectList(null, rundata, context); JSONObject json = new JSONObject(); json.put("hasAcl", hasAcl(rundata)); json.put("today", listData.getToday().toString()); json.put("prevDate", listData.getPrevDate().toString()); json.put("nextDate", listData.getNextDate().toString()); json.put("prevWeek", listData.getPrevWeek().toString()); json.put("nextWeek", listData.getNextWeek().toString()); json.put("prevMonth", listData.getPrevMonth().toString()); json.put("nextMonth", listData.getNextMonth().toString()); List<AjaxScheduleDayContainer> dayList = listData.getContainer().getDayList(); List<AjaxTermScheduleWeekContainer> termList = listData.getWeekTermContainerList(); List<AjaxTermScheduleDayContainer> termDayList; int dayListSize = dayList.size(); Date containerDate = null; for (AjaxTermScheduleWeekContainer termContainer : termList) { if (!termContainer.hasVisibleTerm()) { continue; } termDayList = termContainer.getDayList(); List<ScheduleBean> _termScheduleList = new ArrayList<ScheduleBean>(); // termSchedule int termDayListSize = termDayList.size(); for (int k = 0; k < termDayListSize; k++) { AjaxTermScheduleDayContainer termDayContainer = termDayList.get(k); if (k == 0) { containerDate = termDayContainer.getDate().getValue(); } rd = termDayContainer.getTermResultData(); if (rd != null && containerDate != null) { int stime = (int) (rd.getStartDate().getValue().getTime() / 86400000); int etime = (int) (rd.getEndDate().getValue().getTime() / 86400000); int ctime = (int) (containerDate.getTime() / 86400000); int col = etime - stime + 1; int rindex = stime - ctime; bean = new ScheduleBean(); bean.initField(); bean.setResultData(rd); if (!rd.isPublic() && !rd.isMember()) { bean.setName(ALLocalizationUtils .getl10n("SCHEDULE_CLOSE_PUBLIC_WORD")); } bean.setColspanReal(col); bean.setIndex(k); bean.setIndexReal(rindex); if (!rd.isHidden() || rd.isMember()) { _termScheduleList.add(bean); } } } if (!(rundata.getParameters().getString("m_empty").equals("empty"))) { termScheduleList.add(_termScheduleList); } } for (int i = 0; i < dayListSize; i++) { AjaxScheduleDayContainer container = dayList.get(i); if (i == 0) { containerDate = container.getDate().getValue(); } dateList.add(container.getDate().toString()); dayOfWeekList.add(container.getDate().getDayOfWeek()); _scheduleList = container.getScheduleList(); if (container.isHoliday()) { holidayList.add(container.getHoliday().getName().getValue()); } else { holidayList.add(""); } if (i == 0) { json.put("startDate", container.getDate().toString()); } else if (i == dayListSize - 1) { json.put("endDate", container.getDate().toString()); } int scheSize = _scheduleList.size(); for (int j = 0; j < scheSize; j++) { rd = _scheduleList.get(j); if (rd.isDummy()) { continue; } bean = new ScheduleBean(); bean.initField(); bean.setResultData(rd); if (!rd.isPublic() && !rd.isMember()) { bean.setName(ALLocalizationUtils .getl10n("SCHEDULE_CLOSE_PUBLIC_WORD")); } bean.setIndex(i); if (rundata.getParameters().getString("m_empty") != null) { if (!(rundata.getParameters().getString("m_empty").equals("empty")) && (!rd.isHidden() || rd.isMember())) { scheduleList.add(bean); } } } } json.put("termSchedule", termScheduleList); json.put("schedule", scheduleList); json.put("holiday", holidayList); json.put("date", dateList); json.put("dayOfWeek", dayOfWeekList); if ((msgList != null) && (msgList.size() > 0)) { json.put("errList", msgList); } return json.toString(); } catch (ALPermissionException e) { ALEipUtils.redirectPermissionError(rundata); return null; } catch (Exception e) { logger.error("[ScheduleWeeklyJSONFormData]", e); return null; } } protected boolean isOverQuota() { return ALQuotaService.isOverQuota(Database.getDomainName()); } public boolean doUpdate(ALAction action, RunData rundata, Context context) { if (!ScheduleUtils.hasRelation(rundata)) { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_OTHER; } try { if (!doCheckSecurity(rundata, context)) { return false; } doCheckAclPermission( rundata, context, ALAccessControlConstants.VALUE_ACL_UPDATE); boolean res = false; if (isOverQuota()) { msgList.add(ALLocalizationUtils .getl10n("COMMON_FULL_DISK_DELETE_DETA_OR_CHANGE_PLAN")); } else { res = (setFormData(rundata, context, msgList) && validate(msgList) && updateFormData( rundata, context, msgList)); } return res; } catch (ALPermissionException e) { msgList.add("PermissionError"); msgList.add(ALAccessControlConstants.DEF_PERMISSION_ERROR_STR); return false; } catch (Exception e) { Database.rollback(); logger.error("schedule", e); return false; } } public boolean doInsert(ALAction action, RunData rundata, Context context) { if (!ScheduleUtils.hasRelation(rundata)) { aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_OTHER; } try { if (!doCheckSecurity(rundata, context)) { return false; } doCheckAclPermission( rundata, context, ALAccessControlConstants.VALUE_ACL_INSERT); boolean res = false; if (isOverQuota()) { msgList.add(ALLocalizationUtils .getl10n("COMMON_FULL_DISK_DELETE_DETA_OR_CHANGE_PLAN")); } else { res = (setFormData(rundata, context, msgList) && validate(msgList) && insertFormData( rundata, context, msgList)); } return res; } catch (ALPermissionException e) { msgList.add("PermissionError"); msgList.add(ALAccessControlConstants.DEF_PERMISSION_ERROR_STR); return false; } catch (Exception e) { Database.rollback(); logger.error("schedule", e); return false; } } public void loadParameters(RunData rundata, Context context, List<String> msgList) { ALDateTimeField dummy = new ALDateTimeField("yyyy-MM-dd-HH-mm"); dummy.setNotNull(true); if (ALEipUtils.isMatch(rundata, context)) { if (rundata.getParameters().containsKey("start_date") && rundata.getParameters().containsKey("end_date")) { start_date = rundata.getParameters().getString("start_date"); dummy.setValue(start_date); if (!dummy.validate(new ArrayList<String>())) { ALEipUtils.removeTemp(rundata, context, "start_date"); ALEipUtils.removeTemp(rundata, context, "end_date"); msgList.add("starDate_irregular"); return; } end_date = rundata.getParameters().getString("end_date"); dummy.setValue(end_date); if (!dummy.validate(new ArrayList<String>())) { ALEipUtils.removeTemp(rundata, context, "end_date"); ALEipUtils.removeTemp(rundata, context, "end_date"); msgList.add("endDate_irregular"); return; } if (rundata.getParameters().containsKey("view_date")) { view_date = rundata.getParameters().getString("view_date"); dummy.setValue(view_date); if (!dummy.validate(new ArrayList<String>())) { ALEipUtils.removeTemp(rundata, context, "view_date"); ALEipUtils.removeTemp(rundata, context, "view_date"); msgList.add("viewDate_irregular"); return; } } if (rundata.getParameters().containsKey(ALEipConstants.ENTITY_ID)) { entityId = rundata.getParameters().getInt(ALEipConstants.ENTITY_ID); } else { msgList.add("entityId_missing"); return; } if (rundata.getParameters().containsKey("ign_dup_f")) { ignore_duplicate_facility = rundata.getParameters().getBoolean("ign_dup_f", false); } } else { // null isViewList = true; } } else { msgList.add("not own portlet"); return; } } public boolean setFormData(RunData rundata, Context context, List<String> msgList) throws ALPageNotFoundException, ALDBErrorException { try { userId = ALEipUtils.getUserId(rundata); schedule = ScheduleUtils.getEipTSchedule(rundata, entityId, false, userId); isEdit = "T".equals(schedule.getEditFlag()); // if (rundata.getParameters().containsKey("is_span")) { // is_span = rundata.getParameters().getBoolean("is_span"); // } if (rundata.getParameters().containsKey("edit_repeat_flag")) { edit_repeat_flag = rundata.getParameters().getInt("edit_repeat_flag"); } else { // msgList.add("edit_repeat_flag none"); } scheduleMaps = ScheduleUtils.getEipTScheduleMaps(schedule); int listSize = scheduleMaps.size(); for (int i = 0; i < listSize; i++) { EipTScheduleMap map = scheduleMaps.get(i); if (ScheduleUtils.SCHEDULEMAP_TYPE_USER.equals(map.getType())) { int targetUserId = map.getUserId().intValue(); // if (userId == targetUserId) { // isMember = true; // } memberList.add(ALEipUtils.getALEipUser(targetUserId)); } // else // if(ScheduleUtils.SCHEDULEMAP_TYPE_FACILITY.equals(map.getType())){ // } } ownerId = schedule.getOwnerId().intValue(); startDate.setValue(start_date); endDate.setValue(end_date); viewDate.setValue(view_date); } catch (Exception e) { logger.error("schedule", e); return false; } return true; } public boolean validate(List<String> msgList) throws ALDBErrorException, ALPageNotFoundException { return !(msgList.size() > 0); } public boolean updateFormData(RunData rundata, Context context, List<String> msgList) throws ALPageNotFoundException, ALDBErrorException { boolean res; boolean authorityForOtherSchedule = ScheduleUtils.hasAuthorityForOtherSchedule( rundata, ALAccessControlConstants.VALUE_ACL_UPDATE); if (isEdit || userId == ownerId || aclPortletFeature == ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_OTHER || authorityForOtherSchedule) { if (edit_repeat_flag == 0) { /** 繰り返しでないスケジュールをコピーしようとした場合 */ /** スケジュールに変更が加わっていない場合は、更新処理をスキップする */ if (schedule.getStartDate().equals(startDate.getValue()) && schedule.getEndDate().equals(endDate.getValue())) { return true; } schedule.setStartDate(startDate.getValue()); schedule.setEndDate(endDate.getValue()); Date now = new Date(); schedule.setUpdateDate(now); schedule.setUpdateUserId(userId); /* 設備重複判定 */ { int listSize = scheduleMaps.size(); List<Integer> facilityIdList = new ArrayList<Integer>(); for (int i = 0; i < listSize; i++) { EipTScheduleMap map = scheduleMaps.get(i); if (ScheduleUtils.SCHEDULEMAP_TYPE_FACILITY.equals(map.getType())) { facilityIdList.add(map.getUserId()); } } if (!ignore_duplicate_facility) { if (facilityIdList.size() > 0) { if (ScheduleUtils.isDuplicateFacilitySchedule( schedule, facilityIdList, null, null)) { msgList.add("duplicate_facility"); Database.rollback(); return false; } } } } Database.commit(); res = true; // アラーム updateReminder(schedule, schedule.getScheduleId().intValue()); // イベントログに保存 sendEventLog(rundata, context); /* メンバー全員に新着ポートレット登録 */ sendWhatsNew(schedule, false); if (ScheduleUtils.MAIL_FOR_ALL.equals(schedule.getMailFlag()) || ScheduleUtils.MAIL_FOR_UPDATE.equals(schedule.getMailFlag())) { try { // メール送信 int msgType = ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE); if (msgType > 0) { // パソコンへメールを送信 List<ALEipUserAddr> destMemberList = ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils .getUserId(rundata), false); String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール"; List<ALAdminMailMessage> messageList = new ArrayList<ALAdminMailMessage>(); for (ALEipUserAddr destMember : destMemberList) { ALAdminMailMessage message = new ALAdminMailMessage(destMember); message.setPcSubject(subject); message.setCellularSubject(subject); message.setPcBody(ScheduleUtils.createMsgForPc( rundata, schedule, memberList, "edit")); message.setCellularBody(ScheduleUtils.createMsgForCellPhone( rundata, schedule, memberList, destMember.getUserId(), "edit")); messageList.add(message); } ALMailService.sendAdminMailAsync(new ALAdminMailContext( orgId, ALEipUtils.getUserId(rundata), messageList, ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE))); } } catch (Exception ex) { msgList .add(ALLocalizationUtils.getl10n("SCHEDULE_DONOT_SEND_MAIL")); logger.error("schedule", ex); return false; } } } else { /** 繰り返しスケジュールを変更しようとした場合 */ /** * 以下の場合は変更が加わっていないとみなし、更新をスキップする。 * 保存されている開始時刻と終了時刻がendDateとstartDateと一致。 viewDateの日付がstartDateの物と一致。 */ Calendar saved_startdate = Calendar.getInstance(); saved_startdate.setTime(schedule.getStartDate()); Calendar saved_enddate = Calendar.getInstance(); saved_enddate.setTime(schedule.getEndDate()); if (Integer.valueOf(startDate.getHour()) == saved_startdate .get(Calendar.HOUR_OF_DAY) && Integer.valueOf(startDate.getMinute()) == saved_startdate .get(Calendar.MINUTE) && Integer.valueOf(endDate.getHour()) == saved_enddate .get(Calendar.HOUR_OF_DAY) && Integer.valueOf(endDate.getMinute()) == saved_enddate .get(Calendar.MINUTE) && viewDate.getMonth().equals(startDate.getMonth()) && viewDate.getDay().equals(startDate.getDay()) && viewDate.getYear().equals(startDate.getYear())) { return true; } // if(schedule.getStartDate()) EipTSchedule newSchedule = Database.create(EipTSchedule.class); // 繰り返しの親スケジュール ID newSchedule.setParentId(schedule.getScheduleId()); // タイトル newSchedule.setName(schedule.getName()); // 場所 newSchedule.setPlace(schedule.getPlace()); // 内容 newSchedule.setNote(schedule.getNote()); // 公開フラグ newSchedule.setPublicFlag(schedule.getPublicFlag()); // 共有メンバーによる編集/削除フラグ newSchedule.setEditFlag(schedule.getEditFlag()); // newSchedule.setEditFlag("F"); // オーナーID // newSchedule.setOwnerId(Integer.valueOf(userId)); newSchedule.setOwnerId(Integer.valueOf(ownerId)); // 作成日 Date now = new Date(); newSchedule.setCreateDate(now); // newSchedule.setCreateUserId(Integer.valueOf(userId)); newSchedule.setCreateUserId(Integer.valueOf(ownerId)); // 更新日 newSchedule.setUpdateDate(now); newSchedule.setUpdateUserId(Integer.valueOf(userId)); // 終了日時 newSchedule.setEndDate(endDate.getValue()); newSchedule.setRepeatPattern("N"); newSchedule.setStartDate(startDate.getValue()); // 2007.3.28 ToDo連携 int listSize = scheduleMaps.size(); List<Integer> memberIdList = new ArrayList<Integer>(); List<Integer> facilityIdList = new ArrayList<Integer>(); // List newMaps = new ArrayList(); for (int i = 0; i < listSize; i++) { EipTScheduleMap newMap = Database.create(EipTScheduleMap.class); EipTScheduleMap map = scheduleMaps.get(i); newMap.setEipTSchedule(newSchedule); newMap.setUserId(map.getUserId()); if (map.getUserId() == ownerId) { // if (map.getUserId() == userId) { newMap.setStatus("O"); } else { EipTScheduleMap tmpMap = getScheduleMap( scheduleMaps, map.getUserId().intValue(), ScheduleUtils.SCHEDULEMAP_TYPE_USER); if (tmpMap != null) { newMap.setStatus(tmpMap.getStatus()); } else { newMap.setStatus("T"); } } newMap.setType(map.getType()); newMap.setCommonCategoryId(map.getCommonCategoryId()); newMap.setEipTCommonCategory(map.getEipTCommonCategory()); if (ScheduleUtils.SCHEDULEMAP_TYPE_USER.equals(map.getType())) { memberIdList.add(map.getUserId().intValue()); } else { facilityIdList.add(map.getUserId().intValue()); } } /* 設備重複判定 */ if (!ignore_duplicate_facility) { if (facilityIdList.size() > 0) { if (ScheduleUtils.isDuplicateFacilitySchedule( newSchedule, facilityIdList, schedule.getScheduleId(), viewDate.getValue())) { msgList.add("duplicate_facility"); Database.rollback(); return false; } } } if (viewDate != null) { ScheduleUtils.insertDummySchedule(schedule, userId, viewDate .getValue(), viewDate.getValue(), memberIdList, facilityIdList); } Database.commit(); res = true; // アラーム updateReminder(newSchedule, schedule.getScheduleId().intValue()); // イベントログに保存 sendEventLog(rundata, context); /* メンバー全員に新着ポートレット登録 */ sendWhatsNew(newSchedule, false); if (ScheduleUtils.MAIL_FOR_ALL.equals(schedule.getMailFlag()) || ScheduleUtils.MAIL_FOR_UPDATE.equals(schedule.getMailFlag())) { try { // メール送信 int msgType = ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE); if (msgType > 0) { // パソコンへメールを送信 List<ALEipUserAddr> destMemberList = ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils .getUserId(rundata), false); String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール"; List<ALAdminMailMessage> messageList = new ArrayList<ALAdminMailMessage>(); for (ALEipUserAddr destMember : destMemberList) { ALAdminMailMessage message = new ALAdminMailMessage(destMember); message.setPcSubject(subject); message.setCellularSubject(subject); message.setPcBody(ScheduleUtils.createMsgForPc( rundata, newSchedule, memberList, "edit")); message.setCellularBody(ScheduleUtils.createMsgForCellPhone( rundata, newSchedule, memberList, destMember.getUserId(), "edit")); messageList.add(message); } ALMailService.sendAdminMailAsync(new ALAdminMailContext( orgId, ALEipUtils.getUserId(rundata), messageList, ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE))); } } catch (Exception ex) { msgList .add(ALLocalizationUtils.getl10n("SCHEDULE_DONOT_SEND_MAIL")); logger.error("schedule", ex); return false; } } } } else { msgList.add("そのスケジュールは編集することができません"); res = false; } return res; } /** * * @param schedule2 * @param oldItemId */ private void updateReminder(EipTSchedule schedule2, int oldItemId) { if (ALReminderService.isEnabled() || ALReminderService.isPastEnabled()) { String ptn = schedule2.getRepeatPattern(); int count = 0; boolean isRepeat = false; boolean isSpan = false; boolean isLimit = false; if (ptn.charAt(0) == 'D') { count = 1; isRepeat = true; isSpan = false; } else if (ptn.charAt(0) == 'W') { if (ptn.length() == 9) { count = 8; } else { count = 9; } isRepeat = true; isSpan = false; } else if (ptn.charAt(0) == 'M') { count = 3; isRepeat = true; isSpan = false; } else if (ptn.charAt(0) == 'Y') { count = 5; isRepeat = true; isSpan = false; } else if (ptn.charAt(0) == 'S') { isRepeat = false; isSpan = true; } else { isRepeat = false; isSpan = false; } if (isRepeat) { if (ptn.charAt(count) == 'N') { isLimit = false; } else { isLimit = true; } } for (ALEipUser user : memberList) { ALReminderItem item = ALReminderService.getJob( orgId, user.getUserId().getValueAsString(), ReminderCategory.SCHEDULE, oldItemId); if (item != null) { ScheduleUtils.setupReminderJob( Database.getDomainName(), user.getUserId().toString(), schedule2, item.getNotifyTiming(), item.hasNotifyTypeMail(), item.hasNotifyTypeMessage(), isRepeat, isLimit, isSpan); } } } } /** * * @param rundata * @param context * @param msgList * @return * @throws ALDBErrorException */ protected boolean insertFormData(RunData rundata, Context context, List<String> msgList) throws ALDBErrorException { boolean res; boolean authorityForOtherSchedule = ScheduleUtils.hasAuthorityForOtherSchedule( rundata, ALAccessControlConstants.VALUE_ACL_INSERT); if (isEdit || userId == ownerId || aclPortletFeature == ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_OTHER || authorityForOtherSchedule) { // 繰り返しでないスケジュールを変更しようとした場合 if (edit_repeat_flag == 0) { // スケジュールをコピーする EipTSchedule newSchedule = Database.create(EipTSchedule.class); newSchedule.setStartDate(startDate.getValue()); newSchedule.setEndDate(endDate.getValue()); Date now = new Date(); newSchedule.setCreateDate(now); newSchedule.setUpdateDate(now); newSchedule.setUpdateUserId(userId); newSchedule.setName(schedule.getName()); newSchedule.setNote(schedule.getNote()); newSchedule.setPlace(schedule.getPlace()); newSchedule.setEditFlag(schedule.getEditFlag()); newSchedule.setPublicFlag(schedule.getPublicFlag()); newSchedule.setRepeatPattern(schedule.getRepeatPattern()); newSchedule.setCreateUserId(schedule.getCreateUserId()); newSchedule.setOwnerId(schedule.getOwnerId()); newSchedule.setParentId(schedule.getParentId()); List<EipTScheduleMap> newScheduleMaps = new ArrayList<EipTScheduleMap>(); for (EipTScheduleMap scheduleMap : scheduleMaps) { EipTScheduleMap newScheduleMap = Database.create(EipTScheduleMap.class); newScheduleMap.setEipTSchedule(newSchedule); newScheduleMap.setEipTCommonCategory(scheduleMap .getEipTCommonCategory()); newScheduleMap.setStatus(scheduleMap.getStatus()); newScheduleMap.setType(scheduleMap.getType()); newScheduleMap.setUserId(scheduleMap.getUserId()); newScheduleMaps.add(newScheduleMap); } /* 設備重複判定 */ List<Integer> facilityIdList = new ArrayList<Integer>(); for (EipTScheduleMap newScheduleMap : newScheduleMaps) { if (ScheduleUtils.SCHEDULEMAP_TYPE_FACILITY.equals(newScheduleMap .getType())) { facilityIdList.add(newScheduleMap.getUserId()); } } if (!ignore_duplicate_facility) { if (facilityIdList.size() > 0) { if (ScheduleUtils.isDuplicateFacilitySchedule( newSchedule, facilityIdList, null, null)) { msgList.add("duplicate_facility"); Database.rollback(); return false; } } } Database.commit(); res = true; updateReminder(newSchedule, schedule.getScheduleId().intValue()); // イベントログに保存 sendEventLog(rundata, context); /* メンバー全員に新着ポートレット登録 */ sendWhatsNew(newSchedule, true); try { // メール送信 int msgType = ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE); if (msgType > 0) { // パソコンへメールを送信 List<ALEipUserAddr> destMemberList = ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils .getUserId(rundata), false); String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール"; List<ALAdminMailMessage> messageList = new ArrayList<ALAdminMailMessage>(); for (ALEipUserAddr destMember : destMemberList) { ALAdminMailMessage message = new ALAdminMailMessage(destMember); message.setPcSubject(subject); message.setCellularSubject(subject); message.setPcBody(ScheduleUtils.createMsgForPc( rundata, schedule, memberList, "new")); message.setCellularBody(ScheduleUtils.createMsgForCellPhone( rundata, schedule, memberList, destMember.getUserId(), "new")); messageList.add(message); } ALMailService.sendAdminMailAsync(new ALAdminMailContext( orgId, ALEipUtils.getUserId(rundata), messageList, ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE))); } } catch (Exception ex) { msgList.add(ALLocalizationUtils.getl10n("SCHEDULE_DONOT_SEND_MAIL")); logger.error("schedule", ex); return false; } } else { /** 繰り返しスケジュールを変更しようとした場合 */ /** * 以下の場合は変更が加わっていないとみなし、更新をスキップする。 * 保存されている開始時刻と終了時刻がendDateとstartDateと一致。 viewDateの日付がstartDateの物と一致。 */ Calendar saved_startdate = Calendar.getInstance(); saved_startdate.setTime(schedule.getStartDate()); Calendar saved_enddate = Calendar.getInstance(); saved_enddate.setTime(schedule.getEndDate()); if (Integer.valueOf(startDate.getHour()) == saved_startdate .get(Calendar.HOUR_OF_DAY) && Integer.valueOf(startDate.getMinute()) == saved_startdate .get(Calendar.MINUTE) && Integer.valueOf(endDate.getHour()) == saved_enddate .get(Calendar.HOUR_OF_DAY) && Integer.valueOf(endDate.getMinute()) == saved_enddate .get(Calendar.MINUTE) && viewDate.getMonth().equals(startDate.getMonth()) && viewDate.getDay().equals(startDate.getDay()) && viewDate.getYear().equals(startDate.getYear())) { return true; } // if(schedule.getStartDate()) // スケジュールをコピーする EipTSchedule newSchedule = Database.create(EipTSchedule.class); newSchedule.setStartDate(startDate.getValue()); newSchedule.setEndDate(endDate.getValue()); Date now = new Date(); newSchedule.setCreateDate(now); newSchedule.setUpdateDate(now); newSchedule.setUpdateUserId(userId); newSchedule.setParentId(schedule.getScheduleId()); newSchedule.setName(schedule.getName()); newSchedule.setNote(schedule.getNote()); newSchedule.setPlace(schedule.getPlace()); newSchedule.setEditFlag(schedule.getEditFlag()); newSchedule.setPublicFlag(schedule.getPublicFlag()); newSchedule.setRepeatPattern(schedule.getRepeatPattern()); newSchedule.setCreateUserId(schedule.getCreateUserId()); newSchedule.setOwnerId(schedule.getOwnerId()); newSchedule.setParentId(schedule.getParentId()); // 2007.3.28 ToDo連携 List<Integer> memberIdList = new ArrayList<Integer>(); List<Integer> facilityIdList = new ArrayList<Integer>(); for (EipTScheduleMap map : scheduleMaps) { EipTScheduleMap newMap = Database.create(EipTScheduleMap.class); newMap.setEipTSchedule(newSchedule); newMap.setUserId(map.getUserId()); if (map.getUserId() == ownerId) { // if (map.getUserId() == userId) { newMap.setStatus("O"); } else { EipTScheduleMap tmpMap = getScheduleMap( scheduleMaps, map.getUserId().intValue(), ScheduleUtils.SCHEDULEMAP_TYPE_USER); if (tmpMap != null) { newMap.setStatus(tmpMap.getStatus()); } else { newMap.setStatus("T"); } } newMap.setType(map.getType()); newMap.setCommonCategoryId(map.getCommonCategoryId()); newMap.setEipTCommonCategory(map.getEipTCommonCategory()); if (ScheduleUtils.SCHEDULEMAP_TYPE_USER.equals(map.getType())) { memberIdList.add(map.getUserId().intValue()); } else { facilityIdList.add(map.getUserId().intValue()); } } // 設備重複判定 if (!ignore_duplicate_facility) { if (facilityIdList.size() > 0) { if (ScheduleUtils.isDuplicateFacilitySchedule( newSchedule, facilityIdList, schedule.getScheduleId(), viewDate.getValue())) { msgList.add("duplicate_facility"); Database.rollback(); return false; } } } Database.commit(); res = true; updateReminder(newSchedule, schedule.getScheduleId().intValue()); // イベントログに保存 sendEventLog(rundata, context); // メンバー全員に新着ポートレット登録 sendWhatsNew(newSchedule, true); try { // メール送信 int msgType = ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE); if (msgType > 0) { // パソコンへメールを送信 List<ALEipUserAddr> destMemberList = ALMailUtils.getALEipUserAddrs(memberList, ALEipUtils .getUserId(rundata), false); String subject = "[" + ALOrgUtilsService.getAlias() + "]スケジュール"; List<ALAdminMailMessage> messageList = new ArrayList<ALAdminMailMessage>(); for (ALEipUserAddr destMember : destMemberList) { ALAdminMailMessage message = new ALAdminMailMessage(destMember); message.setPcSubject(subject); message.setCellularSubject(subject); message.setPcBody(ScheduleUtils.createMsgForPc( rundata, newSchedule, memberList, "new")); message.setCellularBody(ScheduleUtils.createMsgForCellPhone( rundata, newSchedule, memberList, destMember.getUserId(), "new")); messageList.add(message); } for (ALEipUserAddr destMember : destMemberList) { List<ALEipUserAddr> destMembers = new ArrayList<ALEipUserAddr>(); destMembers.add(destMember); ALMailService.sendAdminMailAsync(new ALAdminMailContext( orgId, ALEipUtils.getUserId(rundata), messageList, ALMailUtils.getSendDestType(ALMailUtils.KEY_MSGTYPE_SCHEDULE))); } } } catch (Exception ex) { msgList.add(ALLocalizationUtils.getl10n("SCHEDULE_DONOT_SEND_MAIL")); logger.error("schedule", ex); return false; } } } else { msgList.add(ALLocalizationUtils .getl10n("SCHEDULE_YOU_DONOT_EDIT_THE_SCHEDULE")); res = false; } return res; } private boolean doCheckAclPermission(RunData rundata, Context context, int defineAclType) throws ALPermissionException { if (defineAclType == 0) { return true; } String pfeature = getAclPortletFeature(); if (pfeature == null || "".equals(pfeature)) { return true; } ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); boolean hasAuthority = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), pfeature, defineAclType); if (!hasAuthority) { throw new ALPermissionException(); } return true; } private void sendEventLog(RunData rundata, Context context) { ALEipUtils.setTemp( rundata, context, ALEipConstants.MODE, ALEipConstants.MODE_UPDATE); ALEventlogFactoryService.getInstance().getEventlogHandler().log( schedule.getScheduleId(), ALEventlogConstants.PORTLET_TYPE_SCHEDULE, schedule.getName()); } private void sendWhatsNew(EipTSchedule newSchedule, boolean isNew) { // アクティビティ ALEipUser loginUser = null; try { loginUser = ALEipUtils.getALEipUser(userId); } catch (ALDBErrorException e) { // } if (loginUser != null) { String loginName = loginUser.getName().getValue(); List<String> recipients = new ArrayList<String>(); for (ALEipUser user : memberList) { if (loginUser.getUserId().getValue() != user.getUserId().getValue()) { recipients.add(user.getName().getValue()); } } ScheduleUtils.createShareScheduleActivity( schedule, loginName, recipients, "edit", userId); // アクティビティが公開スケジュールである場合、「更新情報」に表示させる。 if ("O".equals(newSchedule.getPublicFlag())) { ScheduleUtils.createNewScheduleActivity( schedule, loginName, "edit", userId); } } } private boolean hasAcl(RunData rundata) { ALAccessControlFactoryService aclservice = (ALAccessControlFactoryService) ((TurbineServices) TurbineServices .getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME); ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler(); boolean hasAuthority = aclhandler.hasAuthority( ALEipUtils.getUserId(rundata), aclPortletFeature = ALAccessControlConstants.POERTLET_FEATURE_SCHEDULE_OTHER, ALAccessControlConstants.VALUE_ACL_INSERT); if (!hasAuthority) { return false; } return true; } private String getAclPortletFeature() { return aclPortletFeature; } public List<String> getMsgList() { return msgList; } public boolean getIsViewList() { return isViewList; } private EipTScheduleMap getScheduleMap(List<EipTScheduleMap> scheduleMaps, int userid, String type) { EipTScheduleMap map = null; int size = scheduleMaps.size(); for (int i = 0; i < size; i++) { map = scheduleMaps.get(i); if (map.getUserId().intValue() == userid && type.equals(map.getType())) { return map; } } return null; } /** * セキュリティをチェックします。 * * @return */ private boolean doCheckSecurity(RunData rundata, Context context) { String reqSecid = rundata.getParameters().getString(ALEipConstants.SECURE_ID); String sessionSecid = (String) rundata.getUser().getTemp(ALEipConstants.SECURE_ID); if (reqSecid == null || !reqSecid.equals(sessionSecid)) { return false; } return true; } }