flexbiz-server 12.5.28 → 12.5.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,336 +1,24 @@
1
- const model = global.getModel('checkin');
2
- const customer = global.getModel('customer');
3
- const moment = require("moment");
4
- const dmnv = global.getModel('dmnv');
5
- const chamcong = global.getModel('chamcong');
6
- const User = global.getModel('user');
7
- const controller = require('../../controllers/controller');
8
- const PostBook = require('../../libs/post-book');
9
-
10
- function deg2rad(deg) {
11
- return deg * (Math.PI / 180);
12
- }
13
-
14
- function getDistanceFromLatLonInM(lat1, lon1, lat2, lon2) {
15
- const R = 6371000; // Bán kính trái đất tính bằng mét
16
- const dLat = deg2rad(lat2 - lat1);
17
- const dLon = deg2rad(lon2 - lon1);
18
- const a =
19
- Math.sin(dLat / 2) * Math.sin(dLat / 2) +
20
- Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
21
- Math.sin(dLon / 2) * Math.sin(dLon / 2);
22
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
23
- const d = R * c; // Khoảng cách theo mét
24
- return d;
25
- }
26
- const postData = async (obj,callback)=>{
27
- if(obj.trang_thai!="1") return callback();
28
- if(global.configs?.required_device_id && !obj.device_id) return callback("Cần thông tin ID của thiết bị (device_id)");
29
- //Tìm nhân viên theo device_user_id
30
- const nv = await global.getModel("dmnv").findOne({
31
- id_app:obj.id_app,
32
- $or:[
33
- {device_user_id:obj.device_user_id},
34
- {user:obj.device_user_id}
35
- ]
36
- }).lean();
37
- if(!nv){
38
- //console.error("Nhân viên không tồn tại",{id_app:obj.id_app,device_user_id:obj.device_user_id})
39
- return callback(`Chưa khai báo thông tin nhân viên cho '${obj.device_user_id}'.`);
40
- }
41
- //Kiểm tra id thiết bị
42
- if(nv.trusted_device_id){
43
- if(nv.trusted_device_id!=obj.device_id){
44
- return callback(`Thiết bị chấm công không hợp lệ. Bạn cần dùng thiết bị đã chấm công lần trước hoặc liên hệ với admin để đăng ký thiết bị mới.`);
45
- }else{
46
- nv.trusted_device_id = obj.device_id;
47
- }
48
- }
49
- //Kiểm tra xem device_id này đã được sử dụng cho nhân viên nào khác không? nếu có thì không cho phép
50
- if(obj.device_id){
51
- const nv_device_id = await global.getModel("dmnv").findOne({id_app:obj.id_app,trusted_device_id:obj.device_id},{_id:1}).lean();
52
- if(nv_device_id && nv_device_id._id!==nv._id){
53
- return callback(`Thiết bị này đã được sử dụng để chấm cho nhân viên khác. Nếu bạn cần thay đổi hãy liên hệ với admin.`);
54
- }
55
- }
56
- // Kiểm tra xem dữ liệu gửi lên có toạ độ không
57
- if (obj.location && obj.location.latitude && obj.location.longitude) {
58
- //Lấy thông tin chi nhánh của nhân viên đó
59
- let chiNhanh = null;
60
- if (nv.ma_cn) {
61
- chiNhanh = await global.getModel("dmchinhanh").findOne({
62
- id_app: obj.id_app,
63
- ma_cn: nv.ma_cn,
64
- status: true
65
- }).lean();
66
- }
67
- if(!chiNhanh){
68
- return callback("Chưa khai báo chi nhánh làm việc cho nhân viên này");
69
- }
70
- if(!chiNhanh.location || !chiNhanh.location.latitude || !chiNhanh.location.longitude){
71
- return callback(`Chưa khai báo vị trí của chi nhánh ${chiNhanh.ten_cn}`);
72
- }
73
- //Tính khoảng cách
74
- const distance = getDistanceFromLatLonInM(
75
- obj.location.latitude,
76
- obj.location.longitude,
77
- chiNhanh.location.latitude,
78
- chiNhanh.location.longitude
79
- );
80
- const max_radius = chiNhanh.location.allowed_radius || 50;
81
- if (distance > max_radius) {
82
- // Kiểm tra nếu KHÔNG có mã khách hàng (tức là chấm công tại văn phòng nhưng bị xa)
83
- if (!obj.ma_kh) {
84
- console.warn(`[CheckIn Fail] Distance: ${distance}m. User: ${obj.device_user_id}`);
85
- return callback(`Vị trí chấm công không hợp lệ. Bạn đang cách công ty ${Math.round(distance)}m (Cho phép: ${max_radius}m).`);
86
- }
87
- // Nếu có obj.ma_kh -> Hợp lệ (đi công tác/gặp khách hàng), code chạy tiếp xuống dưới...
88
- }
89
- } else {
90
- if(global.configs?.required_device_id ) return callback("Không xác định được vị trí của bạn.");
91
- }
92
- //Xác định thời gian vào ra
93
- let cac_lan_cham_cong_trong_ngay = await model.find({
94
- id_app: obj.id_app,
95
- device_user_id: obj.device_user_id,
96
- record_time:{
97
- $gte:moment(obj.record_time).startOf("date").toDate(),
98
- $lte:moment(obj.record_time).endOf("date").toDate(),
99
- }
100
- }).inTxn().sort({record_time:1}).lean();
101
- //
102
- let gio_vao,gio_ra,tong_gio_lam,ma_loai_cong;
103
- if(cac_lan_cham_cong_trong_ngay.length>0){
104
- gio_vao = cac_lan_cham_cong_trong_ngay[0].record_time;
105
- }
106
- if(cac_lan_cham_cong_trong_ngay.length>1){
107
- gio_ra = cac_lan_cham_cong_trong_ngay[cac_lan_cham_cong_trong_ngay.length-1].record_time;
108
- }
109
- if(gio_vao && gio_ra){
110
- tong_gio_lam = moment(gio_ra).diff(moment(gio_vao),"hours");
111
- }else{
112
- tong_gio_lam =0;
113
- }
114
- //Xác định mã loại công dựa vào thời gian làm việc
115
- if (gio_vao) {
116
- let ngay_trong_tuan = moment(obj.record_time).day().toString();
117
- // 1. Query các điều kiện cứng (không dính đến so sánh giờ cụ thể)
118
- const query_loai_cong = {
119
- id_app: obj.id_app,
120
- status: true,
121
- $and: [
122
- // Kiểm tra ngày trong tuần
123
- {
124
- $or: [
125
- { nhung_ngay_trong_tuan: { $exists: false } },
126
- { nhung_ngay_trong_tuan: ngay_trong_tuan }
127
- ]
128
- },
129
- // Kiểm tra tổng giờ làm tối đa
130
- {
131
- $or: [
132
- { tong_gio_lam_den: { $gte: tong_gio_lam } },
133
- { tong_gio_lam_den: 0 }
134
- ],
135
- },
136
- // Kiểm tra tổng giờ làm tối thiểu
137
- {
138
- $or: [
139
- { tong_gio_lam_tu: { $lte: tong_gio_lam } },
140
- { tong_gio_lam_tu: 0 }
141
- ]
142
- }
143
- ]
144
- };
145
-
146
- // 2. Lấy danh sách các ứng viên (Candidates)
147
- let candidates = await global.getModel("dmloaicong")
148
- .find(query_loai_cong)
149
- .sort({ tong_gio_lam_tu: -1, ngay_cong: -1 })
150
- .lean();
151
-
152
- // 3. Hàm helper để lấy số phút từ đầu ngày (00:00 -> Time)
153
- const getMinutesFromMidnight = (dateStr) => {
154
- if (!dateStr) return null;
155
- const m = moment(dateStr);
156
- return m.hours() * 60 + m.minutes();
157
- };
158
-
159
- const input_vao_mins = getMinutesFromMidnight(gio_vao);
160
- const input_ra_mins = getMinutesFromMidnight(gio_ra || gio_vao);
161
-
162
- // 4. Lọc lại bằng JS để so sánh giờ vào/ra (bỏ qua ngày)
163
- let loaicong = candidates.find(lc => {
164
- // Check giờ vào tối thiểu (DB >= Input)
165
- // Nếu DB null thì pass, nếu có dữ liệu thì phải thỏa mãn
166
- if (lc.gio_vao_toi_thieu) {
167
- const db_vao_mins = getMinutesFromMidnight(lc.gio_vao_toi_thieu);
168
- if (db_vao_mins < input_vao_mins) return false; // Logic của bạn: DB >= Input
169
- }
170
-
171
- // Check giờ ra tối thiểu (DB <= Input)
172
- if (lc.gio_ra_toi_thieu) {
173
- const db_ra_mins = getMinutesFromMidnight(lc.gio_ra_toi_thieu);
174
- if (db_ra_mins > input_ra_mins) return false; // Logic của bạn: DB <= Input
175
- }
176
-
177
- return true;
178
- });
179
-
180
- // console.log("[checkin] tim loai cong", query_loai_cong, loaicong);
181
- if (loaicong) {
182
- ma_loai_cong = loaicong.ma_loai_cong;
183
- }
184
- }
185
- //Tìm bộ phận của nhân viên
186
- let ma_bp = nv.ma_bp;
187
- if(nv.bo_phan && nv.bo_phan.length>0){
188
- ma_bp = nv.bo_phan[0].ma_bp;
189
- }
190
- //Tạo công
191
- let data = obj.toObject?obj.toObject():{...obj};
192
- data.id_checkin = obj.device_user_id;
193
- data.ngay = obj.record_time;
194
- data.ma_loai_cong = ma_loai_cong||"UNKNOW";
195
- data.ma_nv =nv.ma_nv;
196
- data.ma_bp =ma_bp;
197
- delete data._id;
198
- delete data.trang_thai;
199
- data.gio_vao = gio_vao;
200
- data.gio_ra = gio_ra;
201
- data.tong_gio_lam = tong_gio_lam;
202
- //xoá post cũ
203
- await chamcong.deleteMany({
204
- id_app:obj.id_app,
205
- id_checkin:obj.device_user_id,
206
- ngay:{
207
- $gte:moment(obj.record_time).startOf("date").toDate(),
208
- $lte:moment(obj.record_time).endOf("date").toDate()}}
209
- )
210
- //tạo post mới
211
- const postbangchamcong = new PostBook(obj, [data], chamcong);
212
- postbangchamcong.run(async (e, rs)=>{
213
- if(!e){
214
- //lưu trusted_device_id
215
- await global.getModel("dmnv").updateOne({_id:nv._id},{trusted_device_id:obj.device_id})
216
- }
217
- callback(e, rs);
218
- });
219
-
220
-
221
- }
222
- module.exports = function(router) {
223
- const contr = new controller(router, model, 'checkin', {
224
- notNeedRight:true,
225
- sort: {
226
- record_time: -1
227
- },
228
- onView:async(user,items,next)=>{
229
- //Cham cong
230
- await items.filter(item=>item.trang_thai==="1").asyncJoinModel2(user.current_id_app,dmnv,{
231
- where: (item=>{
232
- return {$or: [
233
- {device_user_id:item.device_user_id},
234
- {user:item.device_user_id}
235
- ]}
236
- }),
237
- fields:["ma_nv","ten_nv","picture"]}
238
- );
239
- //Khach hang
240
- await items.filter(item=>item.trang_thai==="2" || item.trang_thai==="3").asyncJoinModel2(user.current_id_app,customer,{
241
- where: (item=>{
242
- return {$or: [
243
- {device_user_id:item.device_user_id},
244
- {of_user:item.device_user_id}
245
- ]}
246
- }),
247
- fields:["ma_kh","ten_kh","picture"]}
248
- );
249
- //Ca khach hang va nhan vien
250
- await items.filter(item=>item.trang_thai==="3" && item.device_user_id2).asyncJoinModel2(user.current_id_app,dmnv,{where:{device_user_id2:"device_user_id"},fields:["ma_nv","ten_nv",{picture_nv:"picture"}]});
251
- //Get picture
252
- await items.filter(item=>!item.picture).asyncJoinModel2(null,User,{where:{of_user:"email"},fields:["picture"]});
253
- await items.filter(item=>!item.picture).asyncJoinModel2(null,User,{where:{user:"email"},fields:["picture"]});
254
- await items.filter(item=>item.ma_kh).asyncJoinModel2(user.current_id_app,"customer",{where:"ma_kh",fields:["ten_kh"]});
255
- next(null,items);
256
- },
257
- onCreating: async (user,obj,next)=>{
258
- if(global.configs?.required_device_id && obj.location) obj.record_time = new Date();
259
- await chamcong.deleteMany({
260
- id_app:obj.id_app,
261
- id_checkin:obj.device_user_id||user.email,
262
- ngay:{
263
- $gte:moment(obj.record_time).startOf("date").toDate(),
264
- $lte:moment(obj.record_time).endOf("date").toDate()
265
- }})
266
- next(null,obj)
267
- },
268
- onUpdating:async (user,data,obj,next)=>{
269
- data.device_user_id = obj.device_user_id;
270
- delete data.record_time;
271
-
272
- await chamcong.deleteMany({
273
- id_app:obj.id_app,
274
- id_checkin:obj.device_user_id,
275
- ngay:{
276
- $gte:moment(obj.record_time).startOf("date").toDate(),
277
- $lte:moment(obj.record_time).endOf("date").toDate()
278
- }}
279
- )
280
- next(null,data,obj)
281
- },
282
- onDeleting: async (user,obj,next)=>{
283
- await chamcong.deleteMany({
284
- id_app:obj.id_app,
285
- id_checkin:obj.device_user_id,
286
- ngay:{
287
- $gte:moment(obj.record_time).startOf("date").toDate(),
288
- $lte:moment(obj.record_time).endOf("date").toDate()
289
- }})
290
- next(null,obj)
291
- },
292
- onUpdated:async (user,obj,next)=>{
293
- postData(obj,async (e)=>{
294
- if(e){
295
- console.log("lỗi lý checkin...");
296
- await model.deleteOne({_id:obj._id})
297
- return next(e);
298
- }
299
- next(null,obj);
300
- })
301
- },
302
- onDeleted:async (user,obj,next)=>{
303
- let query_checkin = {
304
- id_app:obj.id_app,
305
- device_user_id:obj.device_user_id,
306
- record_time:{
307
- $gte:moment(obj.record_time).startOf("date").toDate(),
308
- $lte:moment(obj.record_time).endOf("date").toDate()
309
- }
310
- }
311
-
312
- let obj_post = await model.findOne(query_checkin).lean();
313
- //console.log("[checkin] checkin đã bị xoá. Tìm checkin khác cùng ngày để tạo lại chấm công",query_checkin,obj_post);
314
- if(obj_post){
315
- //post lại sau khi xoá checkin
316
- //console.log("[checkin] tạo lại chấm công",obj_post)
317
- postData(obj_post,(e)=>{
318
- if(e) return next(e);
319
- next(null,obj);
320
- })
321
- }else{
322
- next(null,obj);
323
- }
324
- },
325
- onCreated:async (user,obj,next)=>{
326
- postData(obj,async (e)=>{
327
- if(e){
328
- await model.deleteOne({_id:obj._id});
329
- return next(e);
330
- }
331
- next(null,obj);
332
- })
333
- },
334
- });
335
- contr.route();
336
- };
1
+ const model=global.getModel("checkin"),customer=global.getModel("customer"),moment=require("moment"),dmnv=global.getModel("dmnv"),chamcong=global.getModel("chamcong"),User=global.getModel("user"),controller=require("../../controllers/controller"),PostBook=require("../../libs/post-book");function deg2rad($deg$$){return Math.PI/180*$deg$$}
2
+ function getDistanceFromLatLonInM($a$$,$dLon_lon1$$,$lat2$$,$lon2$$){const $dLat$$=deg2rad($lat2$$-$a$$);$dLon_lon1$$=deg2rad($lon2$$-$dLon_lon1$$);$a$$=Math.sin($dLat$$/2)*Math.sin($dLat$$/2)+Math.cos(deg2rad($a$$))*Math.cos(deg2rad($lat2$$))*Math.sin($dLon_lon1$$/2)*Math.sin($dLon_lon1$$/2);return 2*Math.atan2(Math.sqrt($a$$),Math.sqrt(1-$a$$))*6371E3}
3
+ const postData=async($obj$$,$callback$$)=>{if($obj$$.trang_thai!="1")return $callback$$();if(global.configs?.required_device_id&&!$obj$$.device_id)return $callback$$("C\u1ea7n th\u00f4ng tin ID c\u1ee7a thi\u1ebft b\u1ecb (device_id)");const $nv$$=await global.getModel("dmnv").findOne({id_app:$obj$$.id_app,$or:[{device_user_id:$obj$$.device_user_id},{user:$obj$$.device_user_id}]}).lean();if(!$nv$$)return $callback$$(`Ch\u01b0a khai b\u00e1o th\u00f4ng tin nh\u00e2n vi\u00ean cho '${$obj$$.device_user_id}'.`);
4
+ if($nv$$.trusted_device_id){if($nv$$.trusted_device_id!=$obj$$.device_id)return $callback$$("Thi\u1ebft b\u1ecb ch\u1ea5m c\u00f4ng kh\u00f4ng h\u1ee3p l\u1ec7. B\u1ea1n c\u1ea7n d\u00f9ng thi\u1ebft b\u1ecb \u0111\u00e3 ch\u1ea5m c\u00f4ng l\u1ea7n tr\u01b0\u1edbc ho\u1eb7c li\u00ean h\u1ec7 v\u1edbi admin \u0111\u1ec3 \u0111\u0103ng k\u00fd thi\u1ebft b\u1ecb m\u1edbi.");$nv$$.trusted_device_id=$obj$$.device_id}if($obj$$.device_id){var $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=
5
+ await global.getModel("dmnv").findOne({id_app:$obj$$.id_app,trusted_device_id:$obj$$.device_id},{_id:1}).lean();if($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$&&$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$._id!==$nv$$._id)return $callback$$("Thi\u1ebft b\u1ecb n\u00e0y \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 ch\u1ea5m cho nh\u00e2n vi\u00ean kh\u00e1c. N\u1ebfu b\u1ea1n c\u1ea7n thay \u0111\u1ed5i h\u00e3y li\u00ean h\u1ec7 v\u1edbi admin.")}if($obj$$.location&&
6
+ $obj$$.location.latitude&&$obj$$.location.longitude){var $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=null;$nv$$.ma_cn&&($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=await global.getModel("dmchinhanh").findOne({id_app:$obj$$.id_app,ma_cn:$nv$$.ma_cn,status:!0}).lean());if(!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$)return $callback$$("Ch\u01b0a khai b\u00e1o chi nh\u00e1nh l\u00e0m vi\u1ec7c cho nh\u00e2n vi\u00ean n\u00e0y");
7
+ if(!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location||!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.latitude||!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.longitude)return $callback$$(`Ch\u01b0a khai b\u00e1o v\u1ecb tr\u00ed c\u1ee7a chi nh\u00e1nh ${$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.ten_cn}`);$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=
8
+ getDistanceFromLatLonInM($obj$$.location.latitude,$obj$$.location.longitude,$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.latitude,$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.longitude);$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.allowed_radius||50;if($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$>
9
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$&&!$obj$$.ma_kh)return console.warn(`[CheckIn Fail] Distance: ${$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}m. User: ${$obj$$.device_user_id}`),$callback$$(`V\u1ecb tr\u00ed ch\u1ea5m c\u00f4ng kh\u00f4ng h\u1ee3p l\u1ec7. B\u1ea1n \u0111ang c\u00e1ch c\u00f4ng ty ${Math.round($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$)}m (Cho ph\u00e9p: ${$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$}m).`)}else if(global.configs?.required_device_id)return $callback$$("Kh\u00f4ng x\u00e1c \u0111\u1ecbnh \u0111\u01b0\u1ee3c v\u1ecb tr\u00ed c\u1ee7a b\u1ea1n.");
10
+ $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=await model.find({id_app:$obj$$.id_app,device_user_id:$obj$$.device_user_id,record_time:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}}).inTxn().sort({record_time:1}).lean();let $gio_vao$$,$gio_ra$$,$ma_loai_cong$$;$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length>0&&($gio_vao$$=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$[0].record_time);
11
+ $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length>1&&($gio_ra$$=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$[$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length-1].record_time);$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=$gio_vao$$&&$gio_ra$$?moment($gio_ra$$).diff(moment($gio_vao$$),"hours"):0;if($gio_vao$$){$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=moment($obj$$.record_time).day().toString();
12
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$={id_app:$obj$$.id_app,status:!0,$and:[{$or:[{nhung_ngay_trong_tuan:{$exists:!1}},{nhung_ngay_trong_tuan:$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$}]},{$or:[{tong_gio_lam_den:{$gte:$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}},{tong_gio_lam_den:0}]},{$or:[{tong_gio_lam_tu:{$lte:$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}},{tong_gio_lam_tu:0}]}]};
13
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=await global.getModel("dmloaicong").find($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$).sort({tong_gio_lam_tu:-1,ngay_cong:-1}).lean();const $getMinutesFromMidnight$$=$dateStr_m$$=>{if(!$dateStr_m$$)return null;$dateStr_m$$=moment($dateStr_m$$);return $dateStr_m$$.hours()*60+$dateStr_m$$.minutes()},$input_vao_mins$$=$getMinutesFromMidnight$$($gio_vao$$),$input_ra_mins$$=$getMinutesFromMidnight$$($gio_ra$$||
14
+ $gio_vao$$);if($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.find($lc$$=>$lc$$.gio_vao_toi_thieu&&$getMinutesFromMidnight$$($lc$$.gio_vao_toi_thieu)<$input_vao_mins$$||$lc$$.gio_ra_toi_thieu&&$getMinutesFromMidnight$$($lc$$.gio_ra_toi_thieu)>$input_ra_mins$$?!1:!0))$ma_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.ma_loai_cong}$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=
15
+ $nv$$.ma_bp;$nv$$.bo_phan&&$nv$$.bo_phan.length>0&&($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$nv$$.bo_phan[0].ma_bp);let $data$$=$obj$$.toObject?$obj$$.toObject():{...$obj$$};$data$$.id_checkin=$obj$$.device_user_id;$data$$.ngay=$obj$$.record_time;$data$$.ma_loai_cong=$ma_loai_cong$$||"UNKNOW";$data$$.ma_nv=$nv$$.ma_nv;$data$$.ma_bp=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$;delete $data$$._id;delete $data$$.trang_thai;
16
+ $data$$.gio_vao=$gio_vao$$;$data$$.gio_ra=$gio_ra$$;$data$$.tong_gio_lam=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$;await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});(new PostBook($obj$$,[$data$$],chamcong)).run(async($e$$,$rs$$)=>{$e$$||await global.getModel("dmnv").updateOne({_id:$nv$$._id},{trusted_device_id:$obj$$.device_id});
17
+ $callback$$($e$$,$rs$$)})};
18
+ module.exports=function($router$$){(new controller($router$$,model,"checkin",{notNeedRight:!0,sort:{record_time:-1},onView:async($user$$,$items$$,$next$$)=>{await $items$$.filter($item$$=>$item$$.trang_thai==="1").asyncJoinModel2($user$$.current_id_app,dmnv,{where:$item$$=>({$or:[{device_user_id:$item$$.device_user_id},{user:$item$$.device_user_id}]}),fields:["ma_nv","ten_nv","picture"]});await $items$$.filter($item$$=>$item$$.trang_thai==="2"||$item$$.trang_thai==="3").asyncJoinModel2($user$$.current_id_app,customer,
19
+ {where:$item$$=>({$or:[{device_user_id:$item$$.device_user_id},{of_user:$item$$.device_user_id}]}),fields:["ma_kh","ten_kh","picture"]});await $items$$.filter($item$$=>$item$$.trang_thai==="3"&&$item$$.device_user_id2).asyncJoinModel2($user$$.current_id_app,dmnv,{where:{device_user_id2:"device_user_id"},fields:["ma_nv","ten_nv",{picture_nv:"picture"}]});await $items$$.filter($item$$=>!$item$$.picture).asyncJoinModel2(null,User,{where:{of_user:"email"},fields:["picture"]});await $items$$.filter($item$$=>
20
+ !$item$$.picture).asyncJoinModel2(null,User,{where:{user:"email"},fields:["picture"]});await $items$$.filter($item$$=>$item$$.ma_kh).asyncJoinModel2($user$$.current_id_app,"customer",{where:"ma_kh",fields:["ten_kh"]});$next$$(null,$items$$)},onCreating:async($user$$,$obj$$,$next$$)=>{global.configs?.required_device_id&&$obj$$.location&&($obj$$.record_time=new Date);await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id||$user$$.email,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),
21
+ $lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$obj$$)},onUpdating:async($user$$,$data$$,$obj$$,$next$$)=>{$data$$.device_user_id=$obj$$.device_user_id;delete $data$$.record_time;await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$data$$,$obj$$)},onDeleting:async($user$$,$obj$$,$next$$)=>{await chamcong.deleteMany({id_app:$obj$$.id_app,
22
+ id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$obj$$)},onUpdated:async($user$$,$obj$$,$next$$)=>{postData($obj$$,async $e$$=>{if($e$$)return console.log("l\u1ed7i l\u00fd checkin..."),await model.deleteOne({_id:$obj$$._id}),$next$$($e$$);$next$$(null,$obj$$)})},onDeleted:async($obj_post_query_checkin_user$$,$obj$$,$next$$)=>{$obj_post_query_checkin_user$$={id_app:$obj$$.id_app,
23
+ device_user_id:$obj$$.device_user_id,record_time:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}};($obj_post_query_checkin_user$$=await model.findOne($obj_post_query_checkin_user$$).lean())?postData($obj_post_query_checkin_user$$,$e$$=>{if($e$$)return $next$$($e$$);$next$$(null,$obj$$)}):$next$$(null,$obj$$)},onCreated:async($user$$,$obj$$,$next$$)=>{postData($obj$$,async $e$$=>{if($e$$)return await model.deleteOne({_id:$obj$$._id}),
24
+ $next$$($e$$);$next$$(null,$obj$$)})}})).route()};
@@ -0,0 +1 @@
1
+ const model=global.getModel("csphucap"),controller=require("../../controllers/controller");module.exports=function($router$$){(new controller($router$$,model,"csphucap",{})).route()};
@@ -5,28 +5,31 @@ $tong_thu_nhap_chiu_thue$$-$thu_nha_da_chiu_thue$$;$i$$+=1}return $thue_tncn$$},
5
5
  null,""]};chamcong.find($query$$).lean().then(function($congs$$){$congs$$.joinModel2($id_app$$,dmloaicong,[{where:{ma_loai_cong:"ma_loai_cong"},fields:"ngay_cong ngay_phep ngay_khong_phep ngay_khong_luong la_cong_lam_them tinh_phu_cap".split(" ")}],async()=>{$congs$$.forEach($c$$=>{$c$$.la_cong_lam_them&&($c$$.ngay_tang_ca=$c$$.ngay_cong,$c$$.ngay_cong=0,$c$$.so_luong_ngay_tang_ca=1,$c$$.so_luong_ngay_tang_ca_mien_thue=Math.max($c$$.ngay_tang_ca-1,0));$c$$.tinh_phu_cap&&($c$$.so_ngay_tinh_phu_cap=
6
6
  1)});let $nvs$$=await $congs$$.asyncGroupBy(["ma_nv","ma_bp"],"ngay_cong ngay_phep ngay_khong_phep ngay_khong_luong ngay_tang_ca so_ngay_tinh_phu_cap so_luong_ngay_tang_ca so_luong_ngay_tang_ca_mien_thue".split(" "));await $nvs$$.asyncJoinModel2($id_app$$,dmnv,[{where:{ma_nv:"ma_nv"},fields:"ten_nv ma_kho luong_co_ban luong_thu_viec thu_viec_den_ngay ngay_bat_dau_lam ngay_nghi_viec luong_bhxh phu_cap cham_cong tinh_luong bhxh bhyt bhtn ttncn_so_nguoi_phu_thuoc ttncn_muc_gt_phu_thuoc ttncn_so_thang_gt_ban_than ttncn_muc_gt_ban_than".split(" ")}]);
7
7
  $nvs$$.forEach($nv$$=>{$nv$$.ngay_bat_dau_lam&&($nv$$.ngay_bat_dau_lam=moment($nv$$.ngay_bat_dau_lam).startOf("date").toDate());$nv$$.ngay_nghi_viec&&($nv$$.ngay_nghi_viec=moment($nv$$.ngay_nghi_viec).endOf("date").toDate())});$nvs$$=$nvs$$.filter($nv$$=>$nv$$.tinh_luong&&(!$nv$$.ngay_bat_dau_lam||$nv$$.ngay_bat_dau_lam.getTime()<=$den_ngay$$.getTime())&&(!$nv$$.ngay_nghi_viec||$nv$$.ngay_nghi_viec.getTime()>$tu_ngay$$.getTime()));await $nvs$$.asyncJoinModel2($id_app$$,dmbp,[{where:{ma_bp:"ma_bp"},
8
- fields:["ten_bp","tinh_luong_theo_ngay"]}]);let $cac_khoan_giam_tru$$=await ckgtluong.find({id_app:$id_app$$,status:!0}).lean();async.mapLimit($nvs$$,20,async $nv$$=>{$nv$$.tinh_luong_theo_ngay||($nv$$.tinh_luong_theo_ngay=moment($tu_ngay$$).startOf("month").toDate().getTime()<moment($tu_ngay$$).startOf("date").toDate().getTime()||$nv$$.ngay_bat_dau_lam&&$nv$$.ngay_bat_dau_lam.getTime()>$tu_ngay$$.getTime()||$nv$$.ngay_nghi_viec&&$nv$$.ngay_nghi_viec.getTime()<$den_ngay$$.getTime());$nv$$.so_ngay_lam_mot_thang=
9
- $so_ngay_lam_mot_thang$$;var $giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.luong_co_ban;let $luong_bhxh$$=$nv$$.luong_bhxh;var $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.luong_thu_viec;$loai_luong$$==1?($nv$$.thu_viec=!0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,$luong_bhxh$$=0):($nv$$.thu_viec=!1,($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
10
- $nv$$.thu_viec_den_ngay)&&(new Date($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$)).getTime()>=moment($den_ngay$$).startOf("month").toDate().getTime()&&($luong_bhxh$$=0));$nv$$.luong_co_ban=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.cham_cong?($nv$$.luong_binh_quan_ngay=Math.roundBy($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$/$so_ngay_lam_mot_thang$$),$nv$$.tong_ngay_cong_tinh_luong=$nv$$.ngay_cong+$nv$$.ngay_phep,$nv$$.tong_ngay_khong_luong=
11
- $nv$$.ngay_khong_phep+$nv$$.ngay_khong_luong,$nv$$.tinh_luong_theo_ngay?($nv$$.tru_luong=0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$),$nv$$.luong_thang=$nv$$.tong_ngay_cong_tinh_luong==$so_ngay_lam_mot_thang$$?$nv$$.luong_co_ban+$nv$$.luong_tang_ca:Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_cong_tinh_luong)+
12
- $nv$$.luong_tang_ca):(console.log("tinh luog theo thang",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.tru_luong=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_khong_luong),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$),
13
- $nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$+$nv$$.luong_tang_ca-$nv$$.tru_luong)):(console.log("Khong cham cong nhung van tinh luong",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$);$nv$$.gt_bhxh=0;$nv$$.cty_bhxh=0;$nv$$.gt_bhyt=0;$nv$$.cty_bhyt=0;$nv$$.gt_bhtn=0;$nv$$.cty_bhtn=0;$nv$$.gt_kpcd=0;$nv$$.cty_kpcd=0;$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[];if(!$nv$$.ngay_tinh_bhxh||moment($nv$$.ngay_tinh_bhxh).startOf("date").toDate().getTime()<=
14
- $tu_ngay$$.getTime())$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=_.cloneDeep($cac_khoan_giam_tru$$),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($gt$$=>{$gt$$.nv=0;$gt$$.cty=0;$gt$$.kieu_trich=="BHXH"?$nv$$.bhxh&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhxh+=$gt$$.nv,$nv$$.cty_bhxh+=$gt$$.cty):$gt$$.kieu_trich=="BHYT"?$nv$$.bhyt&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*
15
- $luong_bhxh$$/100),$nv$$.gt_bhyt+=$gt$$.nv,$nv$$.cty_bhyt+=$gt$$.cty):$gt$$.kieu_trich=="BHTN"?$nv$$.bhtn&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhtn+=$gt$$.nv,$nv$$.cty_bhtn+=$gt$$.cty):($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$gt$$.kieu_trich=="KPCD"&&($nv$$.gt_kpcd+=$gt$$.nv,$nv$$.cty_kpcd+=$gt$$.cty))});$nv$$.giam_tru=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;
16
- $nv$$.tong_bao_hiem_nv=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.nv).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_bao_hiem_cty=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.cty).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$condition$$.cac_khoan_phu_cap&&$condition$$.cac_khoan_phu_cap.length!=0?$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[]:($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=await phucap.find({id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:{$in:["",
17
- null,void 0,$nv$$.ma_nv]},ma_bp:{$in:["",null,void 0,$nv$$.ma_bp]}}).lean(),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($p$$=>{$p$$.dvt="month";$p$$.tien_pc=$p$$.tien||0}),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$={id_app:$id_app$$,ma_nv:$nv$$.ma_nv,nxt:2,ma_ct:{$in:["HD2","PBL","SO1"]},ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$}},$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
18
- await global.getModel("sokho").find($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$).lean(),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=await $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncGroupBy(["ma_vt"],["sl_xuat"]),await $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncJoinModel2($id_app$$,
19
- "dmvt",{where:"ma_vt",fields:["ten_phu_cap_them","ten_vt","luong_tho_theo_ds","ds_yeu_cau"]}),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.filter($d$$=>$d$$.luong_tho_theo_ds&&$d$$.ds_yeu_cau&&$d$$.sl_xuat>=$d$$.ds_yeu_cau),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
20
- $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($sl$$=>{let $pc$$={kieu:"2",id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:$nv$$.ma_nv,ten_phu_cap:$sl$$.ten_phu_cap_them||$sl$$.ten_vt,dvt:"month"};$pc$$.sl_xuat=$sl$$.sl_xuat;$pc$$.ds_yeu_cau=$sl$$.ds_yeu_cau;$pc$$.tien_pc=$pc$$.tien=Math.trunc($sl$$.sl_xuat/$sl$$.ds_yeu_cau)*$sl$$.luong_tho_theo_ds;return $pc$$}),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,
21
- ...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$]);$nv$$.cac_khoan_phat=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien<0);$nv$$.tien_phat=$nv$$.cac_khoan_phat.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||
22
- $p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_phu_cap>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_phu_cap-$da_phu_cap$$)}$r$$.tien_pc=
23
- $tien_pc$$;return $r$$});$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien>0)];$nv$$.cac_khoan_phu_cap=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tien_phu_cap=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>
24
- $r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_phu_cap=$nv$$.tien_phu_cap+$nv$$.tien_phat;$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).filter($p$$=>!$p$$.khong_mien_thue).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=
25
- Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_mien_thue>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap_mien_thue||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_mien_thue-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
26
- [...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$];$nv$$.cac_khoan_phu_cap_mien_thue=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tong_phu_cap_mien_thue=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);
27
- $nv$$.tong_thu_nhap=$nv$$.luong_thang+$nv$$.tong_phu_cap;$nv$$.luong_tang_ca_mien_thue=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.so_luong_ngay_tang_ca_mien_thue);$nv$$.ttncn_tong_thu_nhap_mien_thue=$nv$$.luong_tang_ca_mien_thue+$nv$$.tong_phu_cap_mien_thue;$nv$$.ttncn_gt_phu_thuoc=Math.roundBy(($nv$$.ttncn_so_nguoi_phu_thuoc||0)*($nv$$.ttncn_muc_gt_phu_thuoc||0));$nv$$.ttncn_gt_tu_thien=0;$nv$$.ttncn_gt_ban_than=Math.roundBy(($nv$$.ttncn_so_thang_gt_ban_than||0)*($nv$$.ttncn_muc_gt_ban_than||
28
- 0));$nv$$.ttncn_tong_giam_tru=$nv$$.ttncn_gt_phu_thuoc+$nv$$.ttncn_gt_tu_thien+$nv$$.tong_bao_hiem_nv+$nv$$.ttncn_gt_ban_than;$nv$$.ttncn_thu_nhap_chiu_thue=Math.max($nv$$.tong_thu_nhap-$nv$$.ttncn_tong_thu_nhap_mien_thue-$nv$$.ttncn_tong_giam_tru,0);$nv$$.ttncn_thue_theo_bac=$nv$$.ttncn_thu_nhap_chiu_thue<2E6?$nv$$.thu_viec?[{thue_suat:0,tien_thue:0}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue):$nv$$.thu_viec?[{thue_suat:10,tien_thue:Math.roundBy($nv$$.ttncn_thu_nhap_chiu_thue*10/100,0)}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue);
29
- $nv$$.ttncn_tong_thue=$nv$$.ttncn_thue_theo_bac.map($b$$=>$b$$.tien_thue||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_luong=$nv$$.tong_thu_nhap-$nv$$.tong_bao_hiem_nv-$nv$$.ttncn_tong_thue;$nv$$.id_app=$id_app$$;$nv$$.thang=$thang$$;$nv$$.nam=$nam$$;$nv$$.loai_luong=$loai_luong$$;return null},async $e$$=>{if($e$$)return $callback$$($e$$);try{await bangtinhluong.create($nvs$$),$callback$$(null,$nvs$$)}catch($e$$){$callback$$($e$$.message)}})})}).catch($e$$=>{$callback$$($e$$)})};
8
+ fields:["ten_bp","tinh_luong_theo_ngay",{phu_cap_theo_bp:"phu_cap"}]}]);let $cac_khoan_giam_tru$$=await ckgtluong.find({id_app:$id_app$$,status:!0}).lean();async.mapLimit($nvs$$,20,async $nv$$=>{$nv$$.tinh_luong_theo_ngay||($nv$$.tinh_luong_theo_ngay=moment($tu_ngay$$).startOf("month").toDate().getTime()<moment($tu_ngay$$).startOf("date").toDate().getTime()||$nv$$.ngay_bat_dau_lam&&$nv$$.ngay_bat_dau_lam.getTime()>$tu_ngay$$.getTime()||$nv$$.ngay_nghi_viec&&$nv$$.ngay_nghi_viec.getTime()<$den_ngay$$.getTime());
9
+ $nv$$.so_ngay_lam_mot_thang=$so_ngay_lam_mot_thang$$;var $giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.luong_co_ban;let $luong_bhxh$$=$nv$$.luong_bhxh;var $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.luong_thu_viec;$loai_luong$$==1?($nv$$.thu_viec=!0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,
10
+ $luong_bhxh$$=0):($nv$$.thu_viec=!1,($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.thu_viec_den_ngay)&&(new Date($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$)).getTime()>=moment($den_ngay$$).startOf("month").toDate().getTime()&&($luong_bhxh$$=0));$nv$$.luong_co_ban=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.cham_cong?
11
+ ($nv$$.luong_binh_quan_ngay=Math.roundBy($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$/$so_ngay_lam_mot_thang$$),$nv$$.tong_ngay_cong_tinh_luong=$nv$$.ngay_cong+$nv$$.ngay_phep,$nv$$.tong_ngay_khong_luong=$nv$$.ngay_khong_phep+$nv$$.ngay_khong_luong,$nv$$.tinh_luong_theo_ngay?($nv$$.tru_luong=0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$),
12
+ $nv$$.luong_thang=$nv$$.tong_ngay_cong_tinh_luong==$so_ngay_lam_mot_thang$$?$nv$$.luong_co_ban+$nv$$.luong_tang_ca:Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_cong_tinh_luong)+$nv$$.luong_tang_ca):(console.log("tinh luog theo thang",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.tru_luong=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_khong_luong),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.ngay_tang_ca,
13
+ $nv$$.tong_ngay_tang_ca=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$+$nv$$.luong_tang_ca-$nv$$.tru_luong)):(console.log("Khong cham cong nhung van tinh luong",
14
+ $nv$$.ma_nv,$nv$$.ten_nv),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$);$nv$$.gt_bhxh=0;$nv$$.cty_bhxh=0;$nv$$.gt_bhyt=0;$nv$$.cty_bhyt=0;$nv$$.gt_bhtn=0;$nv$$.cty_bhtn=0;$nv$$.gt_kpcd=0;$nv$$.cty_kpcd=0;$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[];if(!$nv$$.ngay_tinh_bhxh||moment($nv$$.ngay_tinh_bhxh).startOf("date").toDate().getTime()<=$tu_ngay$$.getTime())$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=_.cloneDeep($cac_khoan_giam_tru$$),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($gt$$=>
15
+ {$gt$$.nv=0;$gt$$.cty=0;$gt$$.kieu_trich=="BHXH"?$nv$$.bhxh&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhxh+=$gt$$.nv,$nv$$.cty_bhxh+=$gt$$.cty):$gt$$.kieu_trich=="BHYT"?$nv$$.bhyt&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhyt+=$gt$$.nv,$nv$$.cty_bhyt+=$gt$$.cty):$gt$$.kieu_trich=="BHTN"?$nv$$.bhtn&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*
16
+ $luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhtn+=$gt$$.nv,$nv$$.cty_bhtn+=$gt$$.cty):($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$gt$$.kieu_trich=="KPCD"&&($nv$$.gt_kpcd+=$gt$$.nv,$nv$$.cty_kpcd+=$gt$$.cty))});$nv$$.giam_tru=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.tong_bao_hiem_nv=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.nv).reduce(($a$$,$b$$)=>$a$$+
17
+ $b$$,0);$nv$$.tong_bao_hiem_cty=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.cty).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$condition$$.cac_khoan_phu_cap&&$condition$$.cac_khoan_phu_cap.length!=0?$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[]:($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=await phucap.find({id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:{$in:["",null,void 0,$nv$$.ma_nv]},ma_bp:{$in:["",null,void 0,$nv$$.ma_bp]}}).lean(),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($p$$=>
18
+ {$p$$.dvt="month";$p$$.tien_pc=$p$$.tien||0}),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$={id_app:$id_app$$,ma_nv:$nv$$.ma_nv,nxt:2,ma_ct:{$in:["HD2","PBL","SO1"]},ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$}},$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await global.getModel("sokho").find($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$).lean(),
19
+ $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncGroupBy(["ma_vt"],["sl_xuat"]),await $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncJoinModel2($id_app$$,"dmvt",{where:"ma_vt",fields:["ten_phu_cap_them",
20
+ "ten_vt","luong_tho_theo_ds","ds_yeu_cau"]}),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.filter($d$$=>$d$$.luong_tho_theo_ds&&$d$$.ds_yeu_cau&&$d$$.sl_xuat>=$d$$.ds_yeu_cau),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
21
+ $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($sl$$=>{let $pc$$={kieu:"2",id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:$nv$$.ma_nv,ten_phu_cap:$sl$$.ten_phu_cap_them||$sl$$.ten_vt,dvt:"month"};$pc$$.sl_xuat=$sl$$.sl_xuat;$pc$$.ds_yeu_cau=$sl$$.ds_yeu_cau;$pc$$.tien_pc=$pc$$.tien=Math.trunc($sl$$.sl_xuat/$sl$$.ds_yeu_cau)*$sl$$.luong_tho_theo_ds;return $pc$$}),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=
22
+ [...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$]);$nv$$.cac_khoan_phat=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien<0);$nv$$.tien_phat=$nv$$.cac_khoan_phat.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
23
+ {id_app:$id_app$$,status:!0,$or:[{ds_nv:$nv$$.ma_nv},{ds_bp:$nv$$.ma_bp}]};$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await global.getModel("csphucap").findOne($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$).lean();$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
24
+ [...($nv$$.phu_cap||[]),...($nv$$.phu_cap_theo_bp||[]),...($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$?.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;
25
+ case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_phu_cap>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_phu_cap-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,
26
+ ...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien>0)];$nv$$.cac_khoan_phu_cap=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tien_phu_cap=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_phu_cap=$nv$$.tien_phu_cap+$nv$$.tien_phat;$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
27
+ [...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).filter($p$$=>!$p$$.khong_mien_thue).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_mien_thue>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap_mien_thue||[]).filter($p$$=>
28
+ $p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_mien_thue-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$];
29
+ $nv$$.cac_khoan_phu_cap_mien_thue=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tong_phu_cap_mien_thue=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_thu_nhap=$nv$$.luong_thang+$nv$$.tong_phu_cap;$nv$$.luong_tang_ca_mien_thue=Math.roundBy($nv$$.luong_binh_quan_ngay*
30
+ $nv$$.so_luong_ngay_tang_ca_mien_thue);$nv$$.ttncn_tong_thu_nhap_mien_thue=$nv$$.luong_tang_ca_mien_thue+$nv$$.tong_phu_cap_mien_thue;$nv$$.ttncn_gt_phu_thuoc=Math.roundBy(($nv$$.ttncn_so_nguoi_phu_thuoc||0)*($nv$$.ttncn_muc_gt_phu_thuoc||0));$nv$$.ttncn_gt_tu_thien=0;$nv$$.ttncn_gt_ban_than=Math.roundBy(($nv$$.ttncn_so_thang_gt_ban_than||0)*($nv$$.ttncn_muc_gt_ban_than||0));$nv$$.ttncn_tong_giam_tru=$nv$$.ttncn_gt_phu_thuoc+$nv$$.ttncn_gt_tu_thien+$nv$$.tong_bao_hiem_nv+$nv$$.ttncn_gt_ban_than;$nv$$.ttncn_thu_nhap_chiu_thue=
31
+ Math.max($nv$$.tong_thu_nhap-$nv$$.ttncn_tong_thu_nhap_mien_thue-$nv$$.ttncn_tong_giam_tru,0);$nv$$.ttncn_thue_theo_bac=$nv$$.ttncn_thu_nhap_chiu_thue<2E6?$nv$$.thu_viec?[{thue_suat:0,tien_thue:0}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue):$nv$$.thu_viec?[{thue_suat:10,tien_thue:Math.roundBy($nv$$.ttncn_thu_nhap_chiu_thue*10/100,0)}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue);$nv$$.ttncn_tong_thue=$nv$$.ttncn_thue_theo_bac.map($b$$=>$b$$.tien_thue||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_luong=
32
+ $nv$$.tong_thu_nhap-$nv$$.tong_bao_hiem_nv-$nv$$.ttncn_tong_thue;$nv$$.id_app=$id_app$$;$nv$$.thang=$thang$$;$nv$$.nam=$nam$$;$nv$$.loai_luong=$loai_luong$$;return null},async $e$$=>{if($e$$)return $callback$$($e$$);try{await bangtinhluong.create($nvs$$),$callback$$(null,$nvs$$)}catch($e$$){$callback$$($e$$.message)}})})}).catch($e$$=>{$callback$$($e$$)})};
30
33
  module.exports=function($router$$){new controller($router$$,"tinhluong",async($nhanvien_req$$,$callback$$)=>{let $thang$$=Number($nhanvien_req$$.query.thang),$nam$$=Number($nhanvien_req$$.query.nam);var $id_app$jscomp$1_query$$=$nhanvien_req$$.query.id_app;if(!$thang$$||!$nam$$)return $callback$$("T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u hai tham s\u1ed1 thang v\u00e0 nam");if($thang$$<1||$thang$$>12||$nam$$<1E3||$nam$$>3E3)return $callback$$("Tham s\u1ed1 thang ho\u1eb7c nam kh\u00f4ng ph\u00f9 h\u1ee3p");
31
34
  const $tu_ngay$$=moment(new Date($nam$$,$thang$$-1,1)).startOf("month").toDate(),$den_ngay$$=moment($tu_ngay$$).endOf("month").toDate();var $appInfo_query_delete_old$$=await App.findOne({_id:$id_app$jscomp$1_query$$});if(!$appInfo_query_delete_old$$)return $callback$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");let $ngay_ks$$=await utils.isBookLocked({id_app:$id_app$jscomp$1_query$$,ngay_ct:$tu_ngay$$});if($ngay_ks$$)return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($ngay_ks$$).format("DD/MM/YYYY")}`);
32
35
  const $main_condition$$={tu_ngay:$tu_ngay$$,den_ngay:$den_ngay$$,id_app:$id_app$jscomp$1_query$$,thang:$thang$$,nam:$nam$$,so_ngay_lam_mot_thang:$nhanvien_req$$.query.so_ngay_lam_mot_thang||$appInfo_query_delete_old$$.so_ngay_lam_mot_thang||24,ma_nv:$nhanvien_req$$.query.ma_nv,ma_bp:$nhanvien_req$$.query.ma_bp};$appInfo_query_delete_old$$={};$appInfo_query_delete_old$$.id_app=$id_app$jscomp$1_query$$;$appInfo_query_delete_old$$.thang=$thang$$;$appInfo_query_delete_old$$.nam=$nam$$;$main_condition$$.ma_nv&&
@@ -1,4 +1,6 @@
1
1
  const bangtinhluong=global.getModel("bangtinhluong"),dmnv=global.getModel("dmnv"),dmbp=global.getModel("dmbp"),controller=require("../../controllers/controllerRPT"),async=require("async");
2
- module.exports=function($router$$){new controller($router$$,"sctluong",async($req$$,$callback$$)=>{var $query_thang$$=Number($req$$.query.thang);let $nam$$=Number($req$$.query.nam),$id_app$$=$req$$.user.current_id_app;if(!$query_thang$$||!$nam$$)return $callback$$("T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u hai tham s\u1ed1 thang v\u00e0 nam");if($query_thang$$<1||$query_thang$$>12||$nam$$<1E3||$nam$$>3E3)return $callback$$("Tham s\u1ed1 thang ho\u1eb7c nam kh\u00f4ng ph\u00f9 h\u1ee3p");$query_thang$$=
3
- {thang:$query_thang$$,nam:$nam$$,id_app:$id_app$$};$req$$.query.ma_nv&&($query_thang$$.ma_nv=$req$$.query.ma_nv);$req$$.query.ma_bp&&($query_thang$$.ma_bp=$req$$.query.ma_bp);let $items$$=await bangtinhluong.find($query_thang$$).sort({nam:1,thang:1,ma_nv:1}).lean();async.parallel({nv:async()=>{await $items$$.asyncJoinModel2($req$$.user.current_id_app,dmnv,[{where:{ma_nv:"ma_nv"},fields:["ten_nv","ttncn_mst"]}]);return null},bp:async()=>{await $items$$.asyncJoinModel2($req$$.user.current_id_app,dmbp,
4
- [{where:{ma_bp:"ma_bp"},fields:["ten_bp"]}]);return null}},()=>{$callback$$(null,$items$$.filter($item$$=>$item$$.ten_bp))})})};
2
+ module.exports=function($router$$){new controller($router$$,"sctluong",async($req$$,$callback$$)=>{var $chiTietCacDotDaChi_thang$$=Number($req$$.query.thang);let $nam$$=Number($req$$.query.nam),$id_app$$=$req$$.user.current_id_app;if(!$chiTietCacDotDaChi_thang$$||!$nam$$)return $callback$$("T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u hai tham s\u1ed1 thang v\u00e0 nam");if($chiTietCacDotDaChi_thang$$<1||$chiTietCacDotDaChi_thang$$>12||$nam$$<1E3||$nam$$>3E3)return $callback$$("Tham s\u1ed1 thang ho\u1eb7c nam kh\u00f4ng ph\u00f9 h\u1ee3p");
3
+ var $dsNhanVien_query$$={thang:$chiTietCacDotDaChi_thang$$,nam:$nam$$,id_app:$id_app$$};$req$$.query.ma_nv&&($dsNhanVien_query$$.ma_nv=$req$$.query.ma_nv);$req$$.query.ma_bp&&($dsNhanVien_query$$.ma_bp=$req$$.query.ma_bp);let $bangLuong$$=await bangtinhluong.find($dsNhanVien_query$$).sort({nam:1,thang:1,ma_nv:1}).lean();$dsNhanVien_query$$=$bangLuong$$.map($i$$=>$i$$.ma_nv);$chiTietCacDotDaChi_thang$$=await global.getModel("pcl").find({id_app:$id_app$$,ky:$chiTietCacDotDaChi_thang$$,nam:$nam$$,"details.ma_nv":{$in:$dsNhanVien_query$$}}).lean();
4
+ const $dsDotChi$$=[...(new Set($chiTietCacDotDaChi_thang$$.map($d$$=>$d$$.dot)))].sort(($a$$,$b$$)=>$a$$-$b$$);let $mapChiTiet$$={};$chiTietCacDotDaChi_thang$$.forEach($phieu$$=>{let $fieldName$$=`chi_dot_${$phieu$$.dot}`;$phieu$$.details&&Array.isArray($phieu$$.details)&&$phieu$$.details.forEach($d$$=>{let $amount$$=$d$$.tien_nt||0;$mapChiTiet$$[$d$$.ma_nv]||($mapChiTiet$$[$d$$.ma_nv]={total_da_chi:0});$mapChiTiet$$[$d$$.ma_nv][$fieldName$$]||($mapChiTiet$$[$d$$.ma_nv][$fieldName$$]=0);$mapChiTiet$$[$d$$.ma_nv][$fieldName$$]+=
5
+ $amount$$;$mapChiTiet$$[$d$$.ma_nv].total_da_chi+=$amount$$})});$bangLuong$$.forEach($row$$=>{$dsDotChi$$.forEach($dot$$=>{$row$$[`chi_dot_${$dot$$}`]=0});let $tongDaChi$$=0;$mapChiTiet$$[$row$$.ma_nv]&&(Object.assign($row$$,$mapChiTiet$$[$row$$.ma_nv]),$tongDaChi$$=$mapChiTiet$$[$row$$.ma_nv].total_da_chi||0);$row$$.luong_con_lai=($row$$.tong_luong||0)-$tongDaChi$$});async.parallel({nv:async()=>{await $bangLuong$$.asyncJoinModel2($req$$.user.current_id_app,dmnv,[{where:{ma_nv:"ma_nv"},fields:["ten_nv",
6
+ "ttncn_mst"]}]);return null},bp:async()=>{await $bangLuong$$.asyncJoinModel2($req$$.user.current_id_app,dmbp,[{where:{ma_bp:"ma_bp"},fields:["ten_bp"]}]);return null}},()=>{$callback$$(null,{data:$bangLuong$$,columns:$dsDotChi$$})})})};