flexbiz-server 12.5.28 → 12.5.31
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.
- package/package.json +1 -1
- package/server/controllers/findHandler.js +2 -2
- package/server/controllers/viewHandler.js +252 -13
- package/server/libs/joinData.js +2 -2
- package/server/libs/post-sokho.js +23 -351
- package/server/models/csphucap.js +2 -0
- package/server/models/dmbp.js +2 -2
- package/server/models/pcl.js +1 -1
- package/server/models/ptl.js +1 -2
- package/server/modules/lists/ls-checkin.js +24 -336
- package/server/modules/lists/ls-csphucap.js +1 -0
- package/server/modules/reports/calc-tinhluong.js +25 -22
- package/server/modules/reports/rp-sctluong.js +5 -3
- package/server/modules/vouchers/vo-hd2.js +82 -81
- package/server/modules/vouchers/vo-pcl.js +3 -3
- package/server/modules/vouchers/vo-ptl.js +4 -4
- package/server/templates/product-verify-result.ejs +205 -11
|
@@ -1,336 +1,24 @@
|
|
|
1
|
-
const model
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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())
|
|
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 $
|
|
10
|
-
$nv$$.thu_viec_den_ngay)&&(new Date($
|
|
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$$)
|
|
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),$
|
|
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"
|
|
14
|
-
$
|
|
15
|
-
$
|
|
16
|
-
$nv$$.
|
|
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$$=>
|
|
18
|
-
await global.getModel("sokho").find($
|
|
19
|
-
"dmvt",{where:"ma_vt",fields:["ten_phu_cap_them",
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
$
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
$nv$$.
|
|
28
|
-
|
|
29
|
-
$nv$$.
|
|
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 $
|
|
3
|
-
{thang:$
|
|
4
|
-
[
|
|
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$$})})})};
|