buli
2023-07-14 36d15f189de2e83ce2576715dac30c3c260388dd
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
trigger OpportunityHpDeptUpd on Opportunity (before insert, before update) {
    // SWAG-CE55BX 预测优化 start
    if (StaticParameter.EscapeOppandStaTrigger) {
        return;
    }
    // SWAG-CE55BX 预测优化 end
    /*
    if (StaticParameter.EscapeOpportunityHpDeptUpdTrigger) {
System.debug('Escape、EscapeOpportunityHpDeptUpdTrigger:::::' + StaticParameter.EscapeOpportunityHpDeptUpdTrigger);
        return;
    }
    */
    List<String> accIds = new List<String>();
    Map<Integer, Opportunity> oppForLookUpMap = new Map<Integer, Opportunity>();
    Integer idx = 0;
    for(Opportunity opp : Trigger.new) {
         
        // 古いデータの更新を禁止
        //20221229 lt DB202211430986 询价历史不使用字段
        // if (Trigger.isUpdate) {
        //     Boolean noChange = false;
        //     for (String colApiName : ControllerUtil.oppColumnList) {
        //         colApiName = colApiName.trim();
        //         if (opp.oldData_flg__c && 
        //                 Trigger.oldMap.get(opp.Id).get(colApiName) != Trigger.newMap.get(opp.Id).get(colApiName)) {
        //             noChange = true;
        //             break;
        //         }
        //     }
        //     if (noChange) {
        //         opp.addError('不能修改旧数据');
        //         continue;
        //     }
        // }
        //20221229 lt DB202211430986 询价历史不使用字段
        
        if ((Trigger.isUpdate
                && (Trigger.oldMap.get(opp.Id).get('AccountId') != opp.AccountId
                    || opp.AccountParentId__c != opp.Department_Class__c
                    || opp.AccountParentParentId__c != opp.Hospital__c))
                || Trigger.isInsert) {
            if (!String.isBlank(opp.AccountId)) {
                accIds.add(opp.AccountId);
            }
        }
        if ((Trigger.isUpdate
                && (Trigger.oldMap.get(opp.Id).get('Opportunity_Category__c') != opp.Opportunity_Category__c
                    || Trigger.oldMap.get(opp.Id).get('CloseDate') != opp.CloseDate
                    || Trigger.oldMap.get(opp.Id).get('Close_Forecasted_Date__c') != opp.Close_Forecasted_Date__c
                    || Trigger.oldMap.get(opp.Id).get('Bid_Planned_Date__c') != opp.Bid_Planned_Date__c))
                || Trigger.isInsert) {
            oppForLookUpMap.put(idx, opp);
        }
        idx++;
    }
 
    if (accIds.size() > 0) {
        // 診療科レコードタイプ
        String[] deptTypes = new String[] {'診療科 その他', '診療科 呼吸科', '診療科 婦人科', '診療科 普外科', '診療科 泌尿科', '診療科 消化科', '診療科 耳鼻喉科'};
        List<RecordType> deptRects = [select Id, Name from RecordType where IsActive = true and SobjectType = 'Account' and Name IN :deptTypes];
        Map<String, String> deptRectMap = new Map<String, String>();
        for (RecordType rect : deptRects) {
            deptRectMap.put(rect.Id, rect.Name);
        }
        // TODO 販売店のレコードタイプのMapを生成
 
        Map<Id, Account> accMap = new Map<Id, Account>();
        List<Account> accs = ControllerUtil.selectAccountForTrigger(accIds);
        for(Account acc : accs) {
            accMap.put(acc.Id, acc);
        }
        
        for(Opportunity opp : Trigger.new) {
            // 「診療科」に診療科を選択する場合
            Account acc = accMap.get(opp.AccountId);
            if (acc != null
                    && deptRectMap.get(acc.RecordTypeId) != null) {
                opp.Department_Class__c = acc.ParentId;
                opp.Hospital__c = acc.Parent.ParentId;
            }
        }
    }
 
    // oppForLookUpMap の処理
    if (oppForLookUpMap.size() > 0) {
        List<String> opportunityCategoryList = new List<String>();
        List<Date> dateList = new List<Date>();
        Date dateToday = Date.today();
        dateList.add(dateToday);         // 新規はこれをつかうため
        Map<Date, Id> date2IdMap = new Map<Date, Id>();
        for (Integer jdx : oppForLookUpMap.keyset()) {
            Opportunity opp = oppForLookUpMap.get(jdx);
            if (String.isBlank(opp.Opportunity_Category__c) == false) {
                opportunityCategoryList.add(opp.Opportunity_Category__c);
            }
            if (opp.CloseDate != null) {
                dateList.add(opp.CloseDate);
            }
            if (opp.Close_Forecasted_Date__c != null) {
                dateList.add(opp.Close_Forecasted_Date__c);
            }
            if (opp.Bid_Planned_Date__c != null) {
                dateList.add(opp.Bid_Planned_Date__c);
            }
        }
 
        for (OlympusCalendar__c cal :[
                Select Id, Date__c
                  from OlympusCalendar__c
                 Where Date__c IN :dateList]
        ) {
            date2IdMap.put(cal.Date__c, cal.Id);
        }
        for (Integer jdx : oppForLookUpMap.keyset()) {
            Opportunity opp = oppForLookUpMap.get(jdx);
            if (String.isBlank(opp.Id)) {
                opp.Calendar_Created_Date_ID__c = date2IdMap.get(dateToday);
            }
            if (opp.CloseDate != null) {
                opp.Calendar_Forecast_Shipping_Date_ID__c = date2IdMap.get(opp.CloseDate);
            }
            if (opp.Close_Forecasted_Date__c != null) {
                opp.Calendar_Forecast_Date_ID__c = date2IdMap.get(opp.Close_Forecasted_Date__c);
            }
            if (opp.Bid_Planned_Date__c != null) {
                opp.Calendar_Forecast_Tender_Date_ID__c = date2IdMap.get(opp.Bid_Planned_Date__c);
            }
        }
    }
}