涂煌豪
2022-03-18 6dc46704e1dc3ffe0ddebc855933c6a40dac8fa9
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
/**
 * 前提、Eventには、Event__cへの参照Idがあります。
 * ここはEvent__cを更新することを禁止
 * ①.Event__cを新規更新時、 ==> Eventに
 * ②.Event__cにはもしEventへの参照Idがある場合(日報一覧のinit時mappingしたしかない、init時Event__cデータをinsertする)
 */
trigger XinEventC2Event on Event__c (after delete, after insert, after update, before insert, before update) {
    if (Trigger.isBefore) {
        // isSchedule絡みの項目を設定
        for (Event__c ec : Trigger.new) {
            // isScheduleフラグ設定
            if (Trigger.isInsert) {
                Date compareDate = null;
                if (ec.SyncCreatedDate__c != null && ec.SyncCreatedDate__c < System.now()) {
                    compareDate = Date.valueOf(ec.SyncCreatedDate__c);
                } else {
                    compareDate = Date.valueOf(System.now());
                }
                if (ec.ActivityDate__c > compareDate) {
                    ec.IsScheduled__c = true;
                }
            }
            
            if (ec.IsScheduled__c) {
                if (Trigger.isInsert) {
                    ec.IsScheduled_StartDateTime__c = ec.StartDateTime__c;
                    ec.IsScheduled_EndDateTime__c = ec.EndDateTime__c;
                    ec.IsScheduled_Location__c = ec.Location__c;
                    ec.IsScheduled_Subject__c = ec.Subject__c;
                }
            } else {
                ec.IsScheduled_StartDateTime__c = null;
                ec.IsScheduled_EndDateTime__c = null;
                ec.IsScheduled_Location__c = null;
                ec.IsScheduled_Subject__c = null;
            }
            if(ec.Subject__c == null || ec.Subject__c == ''){
                ec.Subject__c = ec.Activity_Purpose__c;
            }
        }
    /*
    // Account_ID__cとCampaign_ID__cをセット
        List<String> accList = new List<String>();
        List<String> campList = new List<String>();
        for (Event__c ec : Trigger.new) {
            // 想定:whatidがあれば必ずLocationもある
            if (!String.isBlank(ec.whatid__c)) {
                if (ec.whatid__c.startsWith('001')) {
                    accList.add(ec.Location__c);
                }
                if (ec.whatid__c.startsWith('701')) {
                    campList.add(ec.Location__c);
                }
            }
        }
        // 逆引き
        Map<String, List<String>> accMap = new Map<String, List<String>>();
        Map<String, List<String>> campMap = new Map<String, List<String>>();
        if (accList.size() > 0) accMap = ControllerUtil.getAccsByName(accList);
        if (campList.size() > 0) campMap = ControllerUtil.getCampsByName(campList);
        
        for (Event__c ec : Trigger.new) {
            if (ec.Free_Input__c) {
                ec.whatid__c = null;
                ec.Account_ID__c = null;
                ec.Campaign_ID__c = null;
            } else {
                if (!String.isBlank(ec.whatid__c)) {
                    if (ec.whatid__c.startsWith('001')) {
                        // 逆引きの結果は一件のみ、且つその結果はwhatidと同じの場合、対応するIDをセット
                        if (accMap.get(ec.Location__c) != null && accMap.get(ec.Location__c).size() == 1 && accMap.get(ec.Location__c).get(0) == ec.whatid__c) {
                            ec.Account_ID__c = ec.whatid__c;
                            ec.Campaign_ID__c = null;
                        } else {
                            // add error
                        }
                    }
                    if (ec.whatid__c.startsWith('701')) {
                        // 逆引きの結果は一件のみ、且つその結果はwhatidと同じの場合、対応するIDをセット
                        if (campMap.get(ec.Location__c) != null && campMap.get(ec.Location__c).size() == 1 && campMap.get(ec.Location__c).get(0) == ec.whatid__c) {
                            ec.Account_ID__c = null;
                            ec.Campaign_ID__c = ec.whatid__c;
                        } else {
                            // add error
                        }
                    }
                } else {
                    ec.Account_ID__c = null;
                    ec.Campaign_ID__c = null;
                }
            }
        }
        
        // メアド設定
        List<String> accIds = new List<String>();
        for (Event__c ec : Trigger.new) {
            if (Trigger.isInsert
                    || Trigger.isUpdate && Trigger.oldMap.get(ec.Id).get('Account_ID__c') != ec.Account_ID__c) {
                if (!String.isBlank(ec.Account_ID__c)) accIds.add(ec.Account_ID__c);
            }
        }
        
        Map<String, Account> BMap = new Map<String, Account>();
        Map<String, Account> SBMap = new Map<String, Account>();
        if (accIds.size() > 0) {
            List<Account> accs = ControllerUtil.selectBossMailAddr(accIds);
            for (Account acc : accs) {
                BMap.put(acc.Id, acc);
                SBMap.put(acc.Id, acc);
            }
        }
        
        for (Event__c ec : Trigger.new) {
            if (String.isBlank(ec.Account_ID__c)) {
                ec.Boss_Mail__c = null;
                ec.Sub_Boss_Mail__c = null;
                ec.Boss_Name__c = null;
                ec.Sub_Boss_Name__c = null;
            } else {
                if (BMap.containsKey(ec.Account_ID__c)) {
                    Account a = BMap.get(ec.Account_ID__c);
                    ec.Boss_Mail__c = Parent.Boss__r.Email;
                    ec.Boss_Name__c = Parent.Boss__r.Name;
                }
                if (SBMap.containsKey(ec.Account_ID__c)) {
                    Account a = SBMap.get(ec.Account_ID__c);
                    ec.Sub_Boss_Mail__c = Parent.Sub_Boss__r.Email;
                    ec.Sub_Boss_Name__c = Parent.Sub_Boss__r.Name;
                }
            }
        }
        */
    // after
    } else {
        
        // ------------------------nextEvent処理------------------------
        
        if (!Trigger.isDelete) {
            List<String> nextIds = new List<String>();
            
            for (Event__c ec : Trigger.new) {
                // nextEvent ids 作成
                if (Trigger.isInsert && ec.nextPlanDate__c != null) {
                    nextIds.add(ec.Id);
                }
                if (Trigger.isUpdate) {
                    Event__c oldec = new Event__c();
                    oldec = Trigger.oldMap.get(ec.Id);
                    if (ec.nextPlanDate__c != null
                        && (ec.nextPlanTimePurpose__c != oldec.get('nextPlanTimePurpose__c')
                        || ec.nextPlanDate__c != oldec.get('nextPlanDate__c'))) {
                        nextIds.add(ec.Id);
                    }
                }
            }
            
            if (nextIds.size() > 0) {
                Map<ID, Event> nextEventUpsertMap = new Map<ID, Event>();
                for (Event ne : [select Id, NextEventC_ID__c, EventC_ID__c from Event where NextEventC_ID__c in :nextIds]){
                    nextEventUpsertMap.put(ne.NextEventC_ID__c, ne);
                }
                
                Map<String, String> checkEventCMap = new Map<String, String>();
                for (Event__c nec : [select Id from Event__c where Id in :nextIds and Daily_Report__r.Status__c != '承認' and Daily_Report__r.Status__c != '非承認']){
                    checkEventCMap.put(nec.Id, nec.Id);
                }
                
                List<Event> save_eventsPla = new List<Event>();
                
                for (Event__c ec : Trigger.new) {
                    // 承認、非承認の時、nextEvent処理なし
                    if (!checkEventCMap.containsKey(ec.Id)) continue;
                    
                    Event nextEvent = new Event();
                    if (nextEventUpsertMap.containskey(ec.id)) {
                        nextEvent = nextEventUpsertMap.get(ec.id);
                    }
                    
                    // EventC_ID__c がある場合、upsert対象外にする
                    if (!String.isBlank(nextEvent.EventC_ID__c)) continue;
                    
                    // nextPlanTimePurpose__cの分割
                    List<String> nextTimePurpose = ec.nextPlanTimePurpose__c.split(',');
                    String planStartHourText = '';
                    String planStartMinuteText = '';
                    String planEndHourText = '';
                    String planEndMinuteText = '';
                    String planPurposeText = '';
                    if(nextTimePurpose.size() >= 5){
                        planStartHourText = nextTimePurpose[0];
                        planStartMinuteText = zeroFill(nextTimePurpose[1]);
                        planEndHourText = nextTimePurpose[2];
                        planEndMinuteText = zeroFill(nextTimePurpose[3]);
                        planPurposeText = '';
                        for (Integer i = 4; i < nextTimePurpose.size() - 1; i++) {
                            planPurposeText += nextTimePurpose[i] + ',';
                        }
                        planPurposeText += nextTimePurpose[nextTimePurpose.size() - 1];
                    }
                    
                    nextEvent.Subject = planPurposeText;
                    nextEvent.StartDateTime = Datetime.newInstance(ec.nextPlanDate__c.year(), ec.nextPlanDate__c.month(), ec.nextPlanDate__c.day(), Integer.valueOf(planStartHourText), Integer.valueOf(planStartMinuteText), 0);
                    nextEvent.EndDateTime = Datetime.newInstance(ec.nextPlanDate__c.year(), ec.nextPlanDate__c.month(), ec.nextPlanDate__c.day(), Integer.valueOf(planEndHourText), Integer.valueOf(planEndMinuteText), 0);
                    nextEvent.ActivityDateTime = nextEvent.StartDateTime;
                    nextEvent.ActivityDate = ec.nextPlanDate__c;
                    nextEvent.BeforeActivityDate__c = ec.nextPlanDate__c;
                    nextEvent.Activity_Type2__c = ec.Activity_Type2__c;
                    nextEvent.Purpose_Type__c = ec.Purpose_Type__c;
                    nextEvent.Related_Opportunity1__c = ec.Related_Opportunity1__c;
                    nextEvent.Related_Opportunity1_ID__c = ec.Related_Opportunity1_ID__c;
                    nextEvent.Related_Service1__c = ec.Related_Service1__c;
                    nextEvent.Related_Service1_ID__c = ec.Related_Service1_ID__c;
                    nextEvent.Location = ec.Location__c;
                    nextEvent.Main_Visit_Location__c = ec.Main_Visit_Location__c;
                    nextEvent.NextEventC_ID__c = ec.Id;
                    nextEvent.whatid__c = ec.whatid__c;
                    
                    save_eventsPla.add(nextEvent);
                }
                // システム管理者権限で更新
                ControllerUtil.upsEvent(save_eventsPla);
            }
        }
        
        // ------------------------同期処理------------------------
        
        // 更新対象 Id をセット
        Map<Id, Event__c> eventCMap = new Map<Id, Event__c>();     // ①のデータ、同期対象
        Set<String> eventCIdSet = new Set<String>();               // ①のデータ、削除対象
        Map<Id, Event__c> eventC_eventMap = new Map<Id, Event__c>();          // ②のデータ
        String strAcache = '';
        if (Trigger.isDelete) {
            for (Event__c ec : Trigger.old) {
                eventCIdSet.add(ec.Id);
                if (ec.Event_ID__c != null && ec.Event_ID__c != '') eventC_eventMap.put(ec.Event_ID__c, ec);
            }
            // 削除対象のEvent
            ControllerUtil.delEvent(eventCIdSet, eventC_eventMap);
        } else {
            for (Event__c ec : Trigger.new) {
                Event__c oldec = new Event__c();
                if (Trigger.isUpdate) {
                    oldec = Trigger.oldMap.get(ec.Id);
                }
                
                if (Trigger.isInsert
                        || (Trigger.isUpdate
                            && (ec.DataLoader__c == null || ec.DataLoader__c == oldec.DataLoader__c)
                            && (ec.Subject__c != oldec.get('Subject__c')
                            || ec.StartDateTime__c != oldec.get('StartDateTime__c')
                            || ec.EndDateTime__c != oldec.get('EndDateTime__c')
                            || ec.Main_Visit_Location__c != oldec.get('Main_Visit_Location__c')
                            || ec.Activity_Type2__c != oldec.get('Activity_Type2__c')
                            || ec.Purpose_Type__c != oldec.get('Purpose_Type__c')
                            || ec.Location__c != oldec.get('Location__c')
                            || ec.Related_Opportunity1__c != oldec.get('Related_Opportunity1__c')
                            || ec.Related_Opportunity1_ID__c != oldec.get('Related_Opportunity1_ID__c')
                            || ec.Related_Service1__c != oldec.get('Related_Service1__c')
                            || ec.Related_Service1_ID__c != oldec.get('Related_Service1_ID__c')
                            || ec.whatid__c != oldec.get('whatid__c')
                            || ec.Purpose_TypeFSE__c != oldec.get('Purpose_TypeFSE__c')
                            || ec.Purpose_TypeEscFSE__c != oldec.get('Purpose_TypeEscFSE__c')
                            || ec.Activity_Purpose__c != oldec.get('Activity_Purpose__c')
                            || ec.Activity_PurposeFSE__c != oldec.get('Activity_PurposeFSE__c')
                            || ec.Activity_PurposeEscFSE__c != oldec.get('Activity_PurposeEscFSE__c')
                            || ec.AppCdId__c != oldec.get('AppCdId__c')))) {
                    eventCMap.put(ec.Id, ec);
                    if (ec.Event_ID__c != null && ec.Event_ID__c != ''){
                            eventC_eventMap.put(ec.Event_ID__c, ec);
                        } 
                }
            }
            // 同期対象のEvent
            ControllerUtil.upsEventC2Event(eventCMap, eventC_eventMap);
        }
    }
    
    /** 0埋め処理  */
    private String zeroFill(String str){
        if(str.length() == 2){
            return str;
        }
        else{
            return '0' + str;
        }    
    }
}