张宇恒
2022-12-23 ec47f5ab5923a315bf22e0df5af7371e9668589e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
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;
    }
}