李彤
2023-03-16 cb4bae31a02af72fea30e1a57c1d498eabef5d01
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
/**
 * 前提:朝で実行するので、Date__c <= :toDate、期首日も 4/1 その日から 4/1 になる
 */
global class UpdateUserTextColBatch implements Database.Batchable<sObject> {
    global final String testUserId;
 
    Boolean IsNeedExecute = false; // 2021-03-08  mzy  WLIG-BYHD79  SFDC环境batch合并调查  是否符合执行条件
 
    /**
     * コンスタント、パラメータを受け取る
     */
    global UpdateUserTextColBatch(String testUserId) {
        this.testUserId = testUserId;
    }
 
    global UpdateUserTextColBatch() {
        this.testUserId = null;
    }
 
    // 2021-03-08  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
    global UpdateUserTextColBatch(Boolean NeedExecute) {
        this.IsNeedExecute = NeedExecute;
    }
    global UpdateUserTextColBatch(String testUserId,Boolean NeedExecute) {
        this.testUserId = testUserId;
        this.IsNeedExecute = NeedExecute;
    }
    // 2021-03-08  mzy  WLIG-BYHD79  SFDC环境batch合并调查  end
 
 
    /**
     * startには、queryを実行、ユーザーを検索
     */
    global Database.QueryLocator start(Database.BatchableContext BC) {
        String query = 'Select Id, Fiscal_Start_Date__c, Fiscal_Start_Date_from_May__c, Use_Start_Date__c, Maternity_leave_StartDate__c, Maternity_leave_EndDate__c from User';  //20230303 lt DB202302421915 add  , Maternity_leave_StartDate__c, Maternity_leave_EndDate__c
        if (String.isBlank(testUserId) == false) {
            query += ' where Id =\'' + testUserId + '\'';
        }
        return Database.getQueryLocator(query);
    }
 
    global void execute(Database.BatchableContext BC, List<SObject> uList) {
        for (SObject u : uList) {
            User usr = (User) u;
            Date toDate = Date.today();
            Date fromDate4 = usr.Fiscal_Start_Date__c;
            if (usr.Use_Start_Date__c != null && usr.Use_Start_Date__c > usr.Fiscal_Start_Date__c) {
                fromDate4 = usr.Use_Start_Date__c;
            }
 
            //20230303 lt DB202302421915 start
            // usr.Fiscal_Workdays__c = decimal.valueOf(getOlympusWorkDayCount(fromDate4, toDate));
 
            Date mlStartDate = usr.Maternity_leave_StartDate__c;
            Date mlEndDate = usr.Maternity_leave_EndDate__c;
 
            if(mlStartDate == null && mlEndDate == null){
                usr.Fiscal_Workdays__c = decimal.valueOf(getOlympusWorkDayCount(fromDate4, toDate));
            }
            else if(mlStartDate != null && mlEndDate == null && mlStartDate > fromDate4){
                usr.Fiscal_Workdays__c = decimal.valueOf(getOlympusWorkDayCount(fromDate4, mlStartDate));
            }
            else if(mlStartDate != null && mlEndDate == null && mlStartDate <= fromDate4){
                usr.Fiscal_Workdays__c = 0;
            }
            else if(mlStartDate != null && mlEndDate != null && mlStartDate > fromDate4){
                usr.Fiscal_Workdays__c = decimal.valueOf(getOlympusWorkDayCount(fromDate4, mlStartDate)) + decimal.valueOf(getOlympusWorkDayCount(mlEndDate, toDate));
            }
            else if(mlStartDate != null && mlEndDate != null && mlStartDate <= fromDate4){
                usr.Fiscal_Workdays__c = 0 + decimal.valueOf(getOlympusWorkDayCount(mlEndDate, toDate));
            }
            //20230303 lt DB202302421915 end
 
            /***** CHAN-AZABMC ****** 2018/06/01 ********
             **** 到本月的工作日(今年度)
             **** 到本周的工作日(今年度)
            *********************************************/
            Date thisMonthToDate = Date.newInstance(toDate.year(), toDate.month(), 1);
            Date thisWeekToDate = toDate.toStartofWeek().addDays(1);
            if (usr.Use_Start_Date__c == null || (usr.Use_Start_Date__c != null && usr.Use_Start_Date__c < thisMonthToDate)) {
                usr.Fiscal_Workdays_thisMonth__c = decimal.valueOf(getOlympusWorkDayCount(thisMonthToDate, toDate));
            } else {
                usr.Fiscal_Workdays_thisMonth__c = decimal.valueOf(getOlympusWorkDayCount(usr.Use_Start_Date__c, toDate));
            }
            if (usr.Use_Start_Date__c == null || (usr.Use_Start_Date__c != null && usr.Use_Start_Date__c < thisWeekToDate)) {
                usr.Fiscal_Workdays_thisWeek__c = decimal.valueOf(getOlympusWorkDayCount(thisWeekToDate, toDate));
            } else {
                usr.Fiscal_Workdays_thisWeek__c = decimal.valueOf(getOlympusWorkDayCount(usr.Use_Start_Date__c, toDate));
            }
 
            usr.This_Month_SS_day__c = getThisMonthSSday(toDate);
            Integer jintian = getOlympusWorkDayCount(toDate, toDate);
            Integer zuotian = getOlympusWorkDayCount(toDate.addDays(-1), toDate.addDays(-1));
            usr.Jintian_WorkingDay__c = (jintian > 0);
            usr.Zuotian_WorkingDay__c = (zuotian > 0);
 
            if (toDate >= Date.newInstance(2014, 4, 1)) {
                // 来年度はいらない
            } else {
                Date fromDate5 = usr.Fiscal_Start_Date_from_May__c;
                if (usr.Use_Start_Date__c != null && usr.Use_Start_Date__c > usr.Fiscal_Start_Date_from_May__c) {
                    fromDate5 = usr.Use_Start_Date__c;
                }
                AggregateResult[] cal5 = [Select Count(Id) cnt From OlympusCalendar__c Where Date__c >= :fromDate5 And Date__c <= :toDate And IsWorkDay__c = 1];
                usr.Fiscal_Workdays_From_May__c = decimal.valueOf((Integer) cal5[0].get('cnt'));
            }
 
            //いらないはず、UpdateRentalApplyEquipmentSetBatch で計算しています
            //bp2            AggregateResult[] points = [select SUM(Foul_Points__c) fp
            //                        from Rental_Apply_Equipment_Set__c
            //                        where Rental_Apply__r.OwnerId = :usr.Id and Foul_Points__c > 0
            //                          and AND Cancel_Select__c = False];
            //bp2            usr.Foul_Points__c = points[0].get('fp') == null ? 0 : decimal.valueOf(String.valueOf(points[0].get('fp')));
        }
 
        /* 2018-12-10 CHAN-B6W86D 根据权限集进行权限设置  start*/
 
        Map <Id, User> uMap = new Map <Id, User>();
        for (SObject u : uList) {
            User newUser = (User) u;
            newUser.Download_right__c          = false;
            newUser.ProductCostReferable__c    = false;
            newUser.ENDOPARTNERReferable__c    = false;
            newUser.P002_OCM_Act__c            = false;
            newUser.P002_Agent_Act__c          = false;
            newUser.SI_ProfessionalAuth__c     = false;
            newUser.Plan_report_permission__c  = false;
            newUser.Group_purchse_dept__c      = false;
            newUser.Create_dashboard__c        = false;
            newUser.EditCompetitorAsset__c     = false;
            uMap.put(newUser.Id, newUser);
        }
        list<PermissionSetAssignment> PermissionSetAssignmentList =
            [SELECT Id, AssigneeId, PermissionSetId FROM PermissionSetAssignment
             where AssigneeId in : uList
             and (PermissionSetId = : system.Label.PermissionSet_Createdashboard_ID
                                    or PermissionSetId = : system.Label.PermissionSet_ENDOPARTNER_ID
                                            or PermissionSetId = : system.Label.PermissionSet_Group_purchse_dept_ID
                                                    or PermissionSetId = : system.Label.PermissionSet_P002_Agent_ID
                                                            or PermissionSetId = : system.Label.PermissionSet_P002_OCM_ID
                                                                    or PermissionSetId = : system.Label.PermissionSet_Plan_report_permission_ID
                                                                            or PermissionSetId = : system.Label.PermissionSet_ProductCost_ID
                                                                                    or PermissionSetId = : system.Label.PermissionSet_Report_ID
                                                                                            or PermissionSetId = : system.Label.PermissionSet_SI_ID
                                                                                                    or PermissionSetId = : system.Label.PermissionSet_EditCompetitorAsset_ID  // CHAN-B7K8K8 2018/12/18 
                                                                                                    )];
 
        for (PermissionSetAssignment temPSA : PermissionSetAssignmentList) {
            User currentUser = uMap.get(temPSA.AssigneeId);
            if (currentUser == null) {
                continue;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_Createdashboard_ID)) {
                currentUser.Create_dashboard__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_ENDOPARTNER_ID)) {
                currentUser.ENDOPARTNERReferable__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_Group_purchse_dept_ID)) {
                currentUser.Group_purchse_dept__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_P002_Agent_ID)) {
                currentUser.P002_Agent_Act__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_P002_OCM_ID)) {
                currentUser.P002_OCM_Act__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_Plan_report_permission_ID)) {
                currentUser.Plan_report_permission__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_ProductCost_ID)) {
                currentUser.ProductCostReferable__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_Report_ID)) {
                currentUser.Download_right__c = true;
            }
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_SI_ID)) {
                currentUser.SI_ProfessionalAuth__c = true;
            }
            // CHAN-B7K8K8 2018/12/18 start
            if (temPSA.PermissionSetId.equals(system.Label.PermissionSet_EditCompetitorAsset_ID)) {
                currentUser.EditCompetitorAsset__c = true;
            }
            // CHAN-B7K8K8 2018/12/18 end
        }
        /* 2018-12-10 CHAN-B6W86D 根据权限集进行权限设置  end*/
        update uList;
    }
 
    global void finish(Database.BatchableContext BC) {
        // 今回はやることないです
 
        //2021-03-08  mzy  WLIG-BYHD79  SFDC环境batch合并调查  start
        if(!Test.isRunningTest() &&IsNeedExecute==true){
            //batch里调用下一个batch时,希望跟原有的Schedule里面传的条数保持一致
            Id execBTId = Database.executebatch(new TaskStatusUpdateBatch(true));
        }
        //2021-03-08  mzy  WLIG-BYHD79  SFDC环境batch合并调查 end
 
    }
 
    public static Integer getOlympusWorkDayCount(Date fromDate, Date toDate) {
        AggregateResult[] calAggResult = [Select Count(Id) cnt From OlympusCalendar__c Where Date__c >= :fromDate And Date__c <= :toDate And IsWorkDay__c = 1];
        Integer workDayCount = (Integer) calAggResult[0].get('cnt');
        return workDayCount;
    }
    public static Date getThisMonthSSday(Date thisMonth) {
        Date mon1stDate = Date.newInstance(thisMonth.year(), thisMonth.month(), 1);
        Integer SSBacth_Execute_Day = Integer.valueOf(System.Label.SSBacth_Execute_Day);
        List<OlympusCalendar__c> ssDay = [Select Date__c From OlympusCalendar__c Where Date__c >= :mon1stDate And IsWorkDay__c = 1 order by Date__c asc limit :SSBacth_Execute_Day];
        // TODO xudan ssDay.size() >= SSBacth_Execute_Day の判断は必要?
        // Limit3なのに、実際データは2件しかないなど⇒データ不備、わざとExceptionを出したほうがいい?
        return ssDay[SSBacth_Execute_Day - 1].Date__c;
    }
}