trigger CheckEventTimeChange on Event (before insert, after insert, after update) { 
 | 
    // Before Insertの時、ActivityDateModifiedDate__cをTodayに設定 
 | 
    if (Trigger.isBefore && Trigger.isInsert) { 
 | 
        for (Event e : Trigger.new) { 
 | 
            if (e.WS_flg__c) continue; 
 | 
            e.ActivityDateModifiedDate__c = Date.today(); 
 | 
            if (e.Activity_Type2__c == 'Holiday') { 
 | 
                e.ShowAs = 'OutOfOffice'; 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
    // -------------------ここからはAfter------------------- 
 | 
    else { 
 | 
        // after insert, after update 
 | 
        List<String> eIdsForSchl = new List<String>(); 
 | 
        List<Event__c> ecList = new List<Event__c>(); 
 | 
  
 | 
        Map<String, Boolean> eScheduleMap = new Map<String, Boolean>(); 
 | 
        Map<String, Date> eActivityDateMap = new Map<String, Date>(); 
 | 
         
 | 
        if (Trigger.isInsert) { 
 | 
            for (Event e : Trigger.new) { 
 | 
                if (e.WS_flg__c) continue; 
 | 
                 
 | 
System.debug('e.ActivityDate:::::'+e.ActivityDate); 
 | 
System.debug('e.SyncCreatedDate__c:::::'+e.SyncCreatedDate__c); 
 | 
System.debug('e.CreatedDate:::::'+e.CreatedDate); 
 | 
                 
 | 
                // ActivityDateの比較対象を設定 
 | 
                Date compareDate = null; 
 | 
                // 外部APIからの作成日とEventの作成日を比較 
 | 
                // 12.1夜で12.2の「計画」を立ち、12.2に同期されても、12.1の日付を見て「計画」と見做しため 
 | 
                if (e.SyncCreatedDate__c != null && e.SyncCreatedDate__c < e.CreatedDate) { 
 | 
                    compareDate = Date.valueOf(e.SyncCreatedDate__c); 
 | 
                } else { 
 | 
                    compareDate = Date.valueOf(e.CreatedDate); 
 | 
                } 
 | 
                 
 | 
                // 移行データもあるので、e.IsScheduled__cを見る 
 | 
                Boolean scheduled = true; 
 | 
                if (e.ActivityDate <= compareDate && !e.IsScheduled__c) { 
 | 
                    scheduled = false; 
 | 
                } 
 | 
                eScheduleMap.put(e.Id, scheduled); 
 | 
                eActivityDateMap.put(e.Id, e.ActivityDateModifiedDate__c); 
 | 
                eIdsForSchl.add(e.Id); 
 | 
            } 
 | 
        } else { 
 | 
            // SPEC ホームにて活動のDragタイミングはなぜかAfterです 
 | 
            for (Event e : Trigger.new) { 
 | 
                if (e.WS_flg__c) continue; 
 | 
                 
 | 
                System.debug('e.StartDateTime:::::'+e.StartDateTime); 
 | 
                System.debug('e.OldStartDateTime:::::'+Trigger.oldMap.get(e.Id).get('StartDateTime')); 
 | 
                System.debug('e.EndDateTime:::::'+e.EndDateTime); 
 | 
                System.debug('e.OldEndDateTime:::::'+Trigger.oldMap.get(e.Id).get('EndDateTime')); 
 | 
                // EventCより修正が入る時、下記のロジックを無視 
 | 
                if (!StaticParameter.NotUpdEventCFlg 
 | 
                        && (e.StartDateTime != Trigger.oldMap.get(e.Id).get('StartDateTime') 
 | 
                            || e.EndDateTime != Trigger.oldMap.get(e.Id).get('EndDateTime'))) { 
 | 
                    Date activityDateModifiedDate = e.ActivityDateModifiedDate__c;   // 基本更新しないです 
 | 
                    Boolean scheduled = e.IsScheduled__c;   // 基本更新しないです 
 | 
                    Boolean resetSchedule = false; 
 | 
                     
 | 
                    // ActivityDate変動の場合、項目値再設定 
 | 
                    if (Date.valueOf(Trigger.oldMap.get(e.Id).get('ActivityDate')) != e.ActivityDate) { 
 | 
                        // 違う日に移動した場合、scheduled を再セット 
 | 
                        resetSchedule = true; 
 | 
                         
 | 
                        // 外部API同期の場合、SyncCreatedDate__cが必ず変わる 
 | 
                        if (Trigger.oldMap.get(e.Id).get('SyncCreatedDate__c') != e.SyncCreatedDate__c) { 
 | 
                            activityDateModifiedDate = Date.valueOf(e.SyncCreatedDate__c); 
 | 
                        } 
 | 
                        // SF側更新の場合、操作日TODAYに設定 
 | 
                        else { 
 | 
                            activityDateModifiedDate = Date.today(); 
 | 
                        } 
 | 
                        if (e.ActivityDate <= activityDateModifiedDate) { 
 | 
                            scheduled = false; 
 | 
                        } else { 
 | 
                            scheduled = true; 
 | 
                        } 
 | 
                    } 
 | 
                     
 | 
                    List<Daily_Report__c> prevReport = ControllerUtil.reportSelectByDate(Date.valueOf(Trigger.oldMap.get(e.Id).get('ActivityDate')), e.OwnerId); 
 | 
                    List<Daily_Report__c> nowReport = ControllerUtil.reportSelectByDate(e.ActivityDate, e.OwnerId); 
 | 
                     
 | 
                    eScheduleMap.put(e.Id, scheduled); 
 | 
                    eActivityDateMap.put(e.Id, activityDateModifiedDate); 
 | 
                    eIdsForSchl.add(e.Id); 
 | 
                     
 | 
                    // ①日報がない(Eventと日報の関連なし)、どこへも移動できます 
 | 
                    if (String.isBlank(e.WhatId)) { 
 | 
                         
 | 
                    // ②日報あり 
 | 
                    } else { 
 | 
                        // 移動元、移動先日報共に作成中、移動可能 
 | 
                        if (prevReport.size() > 0 && prevReport[0].Status_With_Check__c == '草案中' 
 | 
                                && nowReport.size() > 0 && nowReport[0].Status_With_Check__c == '草案中') { 
 | 
                            // EventC更新 
 | 
                            List<Event__c> ecs = [select Subject__c, Location__c from Event__c where Id = :e.EventC_ID__c]; 
 | 
                            if (ecs.size() > 0) { 
 | 
                                ecs[0].StartDateTime__c = e.StartDateTime; 
 | 
                                ecs[0].DurationInMinutes__c = e.DurationInMinutes; 
 | 
                                ecs[0].EndDateTime__c = e.StartDateTime.addMinutes(e.DurationInMinutes); 
 | 
                                ecs[0].ActivityDate__c = e.ActivityDate; 
 | 
                                ecs[0].ActivityDateTime__c = e.StartDateTime; 
 | 
                                ecs[0].Daily_Report__c = nowReport[0].Id; 
 | 
                                ecs[0].IsScheduled__c = scheduled; 
 | 
                                // 日が変わらない場合、時間がどう変更しても、計画4つ項目を更新しない 
 | 
                                if (resetSchedule) { 
 | 
                                    if (ecs[0].IsScheduled__c) { 
 | 
                                        ecs[0].IsScheduled_StartDateTime__c = e.StartDateTime; 
 | 
                                        ecs[0].IsScheduled_EndDateTime__c = e.StartDateTime.addMinutes(e.DurationInMinutes); 
 | 
                                        ecs[0].IsScheduled_Location__c = ecs[0].Location__c; 
 | 
                                        ecs[0].IsScheduled_Subject__c = ecs[0].Subject__c; 
 | 
                                    } else { 
 | 
                                        ecs[0].IsScheduled_StartDateTime__c = null; 
 | 
                                        ecs[0].IsScheduled_EndDateTime__c = null; 
 | 
                                        ecs[0].IsScheduled_Location__c = null; 
 | 
                                        ecs[0].IsScheduled_Subject__c = null; 
 | 
                                    } 
 | 
                                } 
 | 
                                ecList.add(ecs[0]); 
 | 
                            } 
 | 
                        } else { 
 | 
                            e.addError('不能更改活动的时间'); 
 | 
                        } 
 | 
                    } 
 | 
                } 
 | 
            } 
 | 
        } 
 | 
        StaticParameter.EventOpportunityPileUpExeFlg = true; 
 | 
        if (eIdsForSchl.size() > 0) { 
 | 
            List<Event> eSchlChange = new List<Event>(); 
 | 
            for (String id : eIdsForSchl) { 
 | 
                eSchlChange.add(new Event( 
 | 
                    Id = id, 
 | 
                    IsScheduled__c = eScheduleMap.get(id), 
 | 
                    ActivityDateModifiedDate__c = eActivityDateMap.get(id) 
 | 
                )); 
 | 
            } 
 | 
            ControllerUtil.upsEvent(eSchlChange); 
 | 
        } 
 | 
         
 | 
        if (!StaticParameter.NotUpdEventCFlg) { 
 | 
            ControllerUtil.upsEventC(ecList); 
 | 
        } 
 | 
        StaticParameter.NotUpdEventCFlg = false; 
 | 
    } 
 | 
} 
 |