flexbiz-server 12.6.13 → 12.6.16
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/README.md +439 -4
- package/package.json +4 -3
- package/server/agents/agents.js +1 -0
- package/server/agents/ai_memory_manager.js +6 -0
- package/server/agents/ceoAgent.js +43 -0
- package/server/agents/chatController.js +6 -0
- package/server/agents/cskhAgent.js +43 -0
- package/server/agents/flowAgent.js +43 -0
- package/server/agents/prompts/ceo.js +2 -0
- package/server/agents/prompts/flow.js +2 -0
- package/server/agents/staffAgent.js +44 -0
- package/server/agents/tools/financeTools.js +57 -0
- package/server/agents/tools/flowTools.js +36 -0
- package/server/agents/tools/kpiTools.js +104 -0
- package/server/agents/tools/masterDataTools.js +74 -0
- package/server/agents/tools/okrTools.js +21 -0
- package/server/agents/tools/ragTools.js +21 -0
- package/server/agents/tools/reportTools.js +43 -0
- package/server/agents/tools/staffTools.js +13 -0
- package/server/agents/tools/stockTools.js +41 -0
- package/server/agents/tools/systemTools.js +52 -0
- package/server/agents/tools/taskTools.js +23 -0
- package/server/agents/tools/utils.js +57 -0
- package/server/app.js +7 -7
- package/server/controllers/controller.js +31 -29
- package/server/controllers/controllerRPT.js +31 -29
- package/server/controllers/findHandler.js +22 -21
- package/server/controllers/importFromExcelHandler.js +17 -14
- package/server/controllers/importHandler.js +26 -41
- package/server/controllers/importHandler_old.js +41 -0
- package/server/controllers/rptHandler.js +14 -11
- package/server/controllers/viewHandler.js +7 -7
- package/server/flow/FlowEngine.js +49 -45
- package/server/flow/WebhookManager.js +1 -1
- package/server/flow/handlers.js +2 -2
- package/server/flow/nodes/userform.js +28 -0
- package/server/flow/utils.js +12 -4
- package/server/global.js +4 -3
- package/server/libs/cdpstk.js +1 -1
- package/server/libs/ckvt.js +12 -11
- package/server/libs/ckvtcapphat.js +5 -5
- package/server/libs/ckvtnpp.js +8 -8
- package/server/libs/ckvttt.js +6 -5
- package/server/libs/ctvt.js +7 -6
- package/server/libs/ctvtnpp.js +7 -6
- package/server/libs/ctvttt.js +6 -6
- package/server/libs/databanle.js +17 -18
- package/server/libs/databanle_old.js +18 -0
- package/server/libs/databanletheongay.js +25 -29
- package/server/libs/dktk.js +3 -3
- package/server/libs/dkvt.js +11 -11
- package/server/libs/dkvtnpp.js +7 -6
- package/server/libs/dkvttt.js +7 -6
- package/server/libs/docs.js +72 -36
- package/server/libs/dtbanletheosp.js +16 -19
- package/server/libs/fifo_dk.js +8 -0
- package/server/libs/fifo_group.js +4 -0
- package/server/libs/fifo_trace_query.js +12 -0
- package/server/libs/getGiaban.js +59 -70
- package/server/libs/getGiaban_old.js +70 -0
- package/server/libs/joinData.js +3 -3
- package/server/libs/joinData_bk.js +44 -0
- package/server/libs/kpistatus.js +24 -17
- package/server/libs/permission.js +54 -56
- package/server/libs/permission_old.js +58 -0
- package/server/libs/post-book.js +1 -1
- package/server/libs/post-socai.js +2 -1
- package/server/libs/post-sokho.js +11 -11
- package/server/libs/prototypes.js +13 -12
- package/server/libs/queryBuilding.js +11 -10
- package/server/libs/redis-cache.js +22 -10
- package/server/libs/sctcnkh.js +19 -17
- package/server/libs/socaitk.js +1 -1
- package/server/libs/thnxt.js +17 -14
- package/server/libs/thnxtnpp.js +8 -8
- package/server/libs/thnxttt.js +8 -7
- package/server/libs/tinhgia1vt_fifo.js +22 -0
- package/server/libs/tinhgiafifo.js +28 -0
- package/server/libs/utils.js +37 -19
- package/server/models/app.js +1 -1
- package/server/models/approve.js +8 -8
- package/server/models/cacheDataReport.js +2 -2
- package/server/models/cacheSessionReport.js +5 -1
- package/server/models/cdvt.js +2 -2
- package/server/models/checkin.js +2 -2
- package/server/models/chitietluongds.js +1 -1
- package/server/models/contract.js +1 -1
- package/server/models/csluongtheods.js +2 -2
- package/server/models/ctds2.js +7 -6
- package/server/models/custom_report.js +1 -0
- package/server/models/dmdt.js +2 -2
- package/server/models/dmkho.js +5 -4
- package/server/models/dmnvt.js +5 -4
- package/server/models/fifo_dk.js +2 -0
- package/server/models/fifo_lot.js +3 -0
- package/server/models/fifo_trace.js +4 -0
- package/server/models/flowpending.js +2 -0
- package/server/models/group.js +3 -5
- package/server/models/listinfo.js +61 -33
- package/server/models/schedule.js +4 -3
- package/server/models/task.js +1 -1
- package/server/models/trangthai.js +2 -2
- package/server/modules/lists/bg-fifo_dk.js +8 -0
- package/server/modules/lists/ls-checkin.js +1 -1
- package/server/modules/lists/ls-customer.js +23 -26
- package/server/modules/lists/ls-dmbp.js +5 -5
- package/server/modules/lists/ls-dmkho.js +7 -1
- package/server/modules/lists/ls-dmnhtask.js +1 -1
- package/server/modules/lists/ls-dmvt.js +52 -70
- package/server/modules/lists/ls-flowpending.js +3 -0
- package/server/modules/lists/ls-participant.js +6 -4
- package/server/modules/lists/ls-task.js +6 -6
- package/server/modules/reports/calc-tinhgiafifo.js +8 -0
- package/server/modules/reports/calc-tinhluong.js +17 -16
- package/server/modules/reports/rp-baoCaoFifoKy.js +1 -0
- package/server/modules/reports/rp-congviectheobp.js +4 -4
- package/server/modules/reports/rp-congviectheodt.js +1 -1
- package/server/modules/reports/rp-congviectheokh.js +1 -1
- package/server/modules/reports/rp-congviectheonv.js +1 -1
- package/server/modules/reports/rp-dtbanletheoct.js +22 -23
- package/server/modules/reports/rp-dtbanletheokh.js +17 -20
- package/server/modules/reports/rp-dtbanletheokho.js +15 -18
- package/server/modules/reports/rp-hoahong.js +1 -1
- package/server/modules/reports/rp-sctvt.js +1 -1
- package/server/modules/reports/rp-sosanhkhvatt2.js +1 -1
- package/server/modules/reports/rp-thnxt.js +8 -8
- package/server/modules/reports/rp-tongquannvbh.js +1 -1
- package/server/modules/systems/sys-app.js +5 -5
- package/server/modules/vouchers/vo-so1.js +14 -14
|
@@ -381,7 +381,7 @@ model.updateSchema = async (schema,listinfo_code)=>{
|
|
|
381
381
|
}else{
|
|
382
382
|
delete _field.maxlength
|
|
383
383
|
}
|
|
384
|
-
//Logger.
|
|
384
|
+
//Logger.warn(`[listinfo] [updateSchema] [${listinfo_code}] add field:`,field.name);
|
|
385
385
|
schema.add({[field.name]:_field});
|
|
386
386
|
}
|
|
387
387
|
}
|
|
@@ -396,7 +396,7 @@ model.updateModel = async (info,_newModel)=>{
|
|
|
396
396
|
return;
|
|
397
397
|
}
|
|
398
398
|
//
|
|
399
|
-
//Logger.
|
|
399
|
+
//Logger.warn("[listinfo][updateModel] update model...",model_code);
|
|
400
400
|
const api_code = info.api_code || info.code;
|
|
401
401
|
const _newList = global.controllers[api_code.toUpperCase()];
|
|
402
402
|
let require_paths = Object.keys(requireFields);
|
|
@@ -411,7 +411,7 @@ model.updateModel = async (info,_newModel)=>{
|
|
|
411
411
|
type:"String"
|
|
412
412
|
}
|
|
413
413
|
})
|
|
414
|
-
//Logger.
|
|
414
|
+
//Logger.warn("ref fields",fields_have_ref);
|
|
415
415
|
fields = fields.concat(fields_have_ref);
|
|
416
416
|
const fields_can_xu_ly = fields.filter(f=>f.type!=="Link" && f.type!=="Files" && f.type!=="Action" && f.type!=="Group" && require_paths.indexOf(f.name)<0);
|
|
417
417
|
//
|
|
@@ -545,19 +545,19 @@ model.updateModel = async (info,_newModel)=>{
|
|
|
545
545
|
let field = fields.find(f=>f.name===u);
|
|
546
546
|
old_index_unique[u]= (field||{}).sort || 1;
|
|
547
547
|
});
|
|
548
|
-
//Logger.
|
|
548
|
+
//Logger.warn("drop current index unique...",old_index_unique);
|
|
549
549
|
_newModel.collection.dropIndex(old_index_unique,()=>{
|
|
550
550
|
//if(e) return Logger.error("Can't drop index unique",old_index_unique,model_code,e);
|
|
551
551
|
//create new unique
|
|
552
552
|
if(indUq){
|
|
553
|
-
//Logger.
|
|
553
|
+
//Logger.warn("create new index unique...",indUq);
|
|
554
554
|
_newModel.schema.index(indUq,{unique: true });
|
|
555
555
|
}
|
|
556
556
|
})
|
|
557
557
|
}else{
|
|
558
558
|
//create new unique
|
|
559
559
|
if(indUq){
|
|
560
|
-
//Logger.
|
|
560
|
+
//Logger.warn("create new index unique...",indUq)
|
|
561
561
|
_newModel.schema.index(indUq,{unique: true });
|
|
562
562
|
}
|
|
563
563
|
}
|
|
@@ -569,7 +569,9 @@ model.createModel = (info)=>{
|
|
|
569
569
|
if(!info.create_model) return null;
|
|
570
570
|
let model_code = info.api_code || info.model_code || info.code;
|
|
571
571
|
//models are not allowed to create new APIs
|
|
572
|
-
if(global.secu_models.indexOf(model_code)>=0)
|
|
572
|
+
if(global.secu_models.indexOf(model_code)>=0){
|
|
573
|
+
return null;
|
|
574
|
+
}
|
|
573
575
|
//
|
|
574
576
|
let exModel = global.mongoose.models[model_code]
|
|
575
577
|
if(!exModel){
|
|
@@ -616,6 +618,7 @@ const deletePost = (_listInfo,obj)=>{
|
|
|
616
618
|
}
|
|
617
619
|
const post = (_listInfo,obj)=>{
|
|
618
620
|
if(obj.toObject) obj = obj.toObject();
|
|
621
|
+
//console.log("[post dynamic]",_listInfo.postinfos);
|
|
619
622
|
return Promise.all((_listInfo.postinfos||[]).filter(info=>info.model && info.script && info.condition).map(postInfo=>{
|
|
620
623
|
return (async ()=>{
|
|
621
624
|
let script = `return (async ()=>{
|
|
@@ -630,7 +633,7 @@ const post = (_listInfo,obj)=>{
|
|
|
630
633
|
if(data && data.error){
|
|
631
634
|
throw data.error
|
|
632
635
|
}
|
|
633
|
-
//Logger.
|
|
636
|
+
//Logger.warn("post dynamic",postInfo.model,data);
|
|
634
637
|
return new Promise((resolve,reject)=>{
|
|
635
638
|
if(postInfo.model==="socai"){
|
|
636
639
|
const postsocai = new PostSocai(obj, data,null,null,{deleteQuery:{id_ct:"#"}});//không xoá sổ sách vì trước đó đã xoá
|
|
@@ -645,7 +648,7 @@ const post = (_listInfo,obj)=>{
|
|
|
645
648
|
},{deleteQuery:{id_ct:"#"}});//không xoá sổ sách vì trước đó đã xoá
|
|
646
649
|
|
|
647
650
|
posttdttno.run(function(e, rs) {
|
|
648
|
-
//Logger.
|
|
651
|
+
//Logger.warn("posted dynamic",rs,e)
|
|
649
652
|
if(e) return reject(e);
|
|
650
653
|
resolve(rs);
|
|
651
654
|
})
|
|
@@ -691,7 +694,7 @@ const dynamicCreating = async (listInfo,user,obj,next,options={})=>{
|
|
|
691
694
|
const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
|
|
692
695
|
const supportUsers = configs.supportUsers || []
|
|
693
696
|
if (!require_id_app && (_listInfo.input_users||"").toLowerCase().indexOf(user.email.toLowerCase())<0 && !supportUsers.includes(user.email.toLowerCase()) && !isSupperAdmin(user.email.toLowerCase())) {
|
|
694
|
-
//Logger.
|
|
697
|
+
//Logger.warn("support users",supportUsers,user.email.toLowerCase())
|
|
695
698
|
return next('Bạn không có quyền thực hiện thao tác này');
|
|
696
699
|
}
|
|
697
700
|
if(_listInfo.handle_oncreating_server && _listInfo.handle_oncreating_server.trim()!==""){
|
|
@@ -784,11 +787,11 @@ const dynamicUpdating = async (listInfo,user,data,obj,next,options={})=>{
|
|
|
784
787
|
const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
|
|
785
788
|
const supportUsers = configs.supportUsers || [];
|
|
786
789
|
if (!require_id_app && (_listInfo.input_users||"").toLowerCase().indexOf(user.email.toLowerCase())<0 && !supportUsers.includes(user.email.toLowerCase()) && !isSupperAdmin(user.email.toLowerCase())) {
|
|
787
|
-
//Logger.
|
|
790
|
+
//Logger.warn("support users",supportUsers,user.email.toLowerCase())
|
|
788
791
|
return next('Bạn không có quyền thực hiện thao tác này');
|
|
789
792
|
}
|
|
790
793
|
if(_listInfo.handle_onupdating_server && _listInfo.handle_onupdating_server.trim()!==""){
|
|
791
|
-
//Logger.
|
|
794
|
+
//Logger.warn("[listinof] [dynamicUpdating]",_listInfo.code,_listInfo.handle_onupdating_server);
|
|
792
795
|
if(_listInfo.handle_onupdating_server.indexOf("next")<0) return next("Script xử lý dữ liệu trước khi update yêu cầu gọi function next");
|
|
793
796
|
try{
|
|
794
797
|
await new Promise((resolve,reject)=>{
|
|
@@ -825,7 +828,7 @@ const dynamicUpdating = async (listInfo,user,data,obj,next,options={})=>{
|
|
|
825
828
|
}
|
|
826
829
|
|
|
827
830
|
}else{
|
|
828
|
-
//Logger.
|
|
831
|
+
//Logger.warn("[listinof] [dynamicUpdating]",_listInfo.code,"không xử lý updating");
|
|
829
832
|
}
|
|
830
833
|
next(null,data,obj);
|
|
831
834
|
}
|
|
@@ -950,7 +953,7 @@ const onView = async (control,obj,user,items,next,options={})=>{
|
|
|
950
953
|
|
|
951
954
|
})();`
|
|
952
955
|
try{
|
|
953
|
-
Logger.
|
|
956
|
+
//Logger.warn("[listinfo][dynamicView] [handle view]",obj.code);
|
|
954
957
|
await evalute(func_body,{items,user,getLib:global.getLib,utils,query:utils.query,next,async,joinModel2,moment,numeral,request:options.req})
|
|
955
958
|
}catch(e){
|
|
956
959
|
Logger.error("[listinfo][dynamicView] [handle view] error dynamic view",obj.handle_view_serve,e);
|
|
@@ -1045,7 +1048,7 @@ const onView = async (control,obj,user,items,next,options={})=>{
|
|
|
1045
1048
|
if(!_.isArray(ref_model)){
|
|
1046
1049
|
if(Object.keys(fields).length>0){
|
|
1047
1050
|
//create where
|
|
1048
|
-
//Logger.
|
|
1051
|
+
//Logger.warn("[listinfo][dynamicView] handle joinview",obj.code,{field_name,ref_name_model,ref_field,ref_label,rows:items_will_join.length});
|
|
1049
1052
|
where = (item)=>{
|
|
1050
1053
|
let w = {
|
|
1051
1054
|
[ref_field]:item[field_name]
|
|
@@ -1091,7 +1094,7 @@ const onView = async (control,obj,user,items,next,options={})=>{
|
|
|
1091
1094
|
if(underscore.has(ref_model.schema.paths,"id_app")){
|
|
1092
1095
|
id_app = user.current_id_app;
|
|
1093
1096
|
}
|
|
1094
|
-
//Logger.
|
|
1097
|
+
//Logger.warn("[listinfo][dynamicView] [handle join]",obj.code,f.name,ref_name_model,fields);
|
|
1095
1098
|
await items_will_join.asyncJoinModel2(id_app,ref_model,{where,fields});
|
|
1096
1099
|
}
|
|
1097
1100
|
}else{
|
|
@@ -1115,7 +1118,11 @@ const onView = async (control,obj,user,items,next,options={})=>{
|
|
|
1115
1118
|
}
|
|
1116
1119
|
model.createController = (router,_listInfo)=>{
|
|
1117
1120
|
let api_code = _listInfo.api_code || _listInfo.code;
|
|
1118
|
-
|
|
1121
|
+
//Logger.warn("[listinfo] [createController] create_model",_listInfo.api_code || _listInfo.code,_listInfo.create_model)
|
|
1122
|
+
if(!_listInfo.create_model){
|
|
1123
|
+
return null;
|
|
1124
|
+
}
|
|
1125
|
+
|
|
1119
1126
|
|
|
1120
1127
|
let sort={},unique=[],_newModel,_newList;
|
|
1121
1128
|
_listInfo.fields.filter(f=>f.sort).forEach(f=>{
|
|
@@ -1142,13 +1149,16 @@ model.createController = (router,_listInfo)=>{
|
|
|
1142
1149
|
})
|
|
1143
1150
|
_newList = global.controllers[api_code.toUpperCase()];
|
|
1144
1151
|
if(!_newList){
|
|
1145
|
-
if(api_code=="moduleinfo") Logger.
|
|
1152
|
+
//if(api_code=="moduleinfo") Logger.warn("[listinfo] create new API",api_code);
|
|
1146
1153
|
if(Object.keys(sort).length===0) sort.date_created = -1;
|
|
1147
1154
|
//create new model
|
|
1148
1155
|
const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
|
|
1149
|
-
|
|
1156
|
+
|
|
1150
1157
|
_newModel = model.createModel(_listInfo);
|
|
1151
|
-
if(!_newModel)
|
|
1158
|
+
if(!_newModel){
|
|
1159
|
+
//Logger.warn("[listinfo] không thể tạo model",api_code);
|
|
1160
|
+
return;
|
|
1161
|
+
}
|
|
1152
1162
|
_newList = new controller(router,_newModel,api_code.toLowerCase(),{
|
|
1153
1163
|
sort: sort,
|
|
1154
1164
|
unique:unique,
|
|
@@ -1169,12 +1179,18 @@ model.createController = (router,_listInfo)=>{
|
|
|
1169
1179
|
}
|
|
1170
1180
|
})
|
|
1171
1181
|
_newList.is_dynamic_list = true;
|
|
1182
|
+
_newList.dynamicDeletePosts ={};
|
|
1183
|
+
_newList.dynamicPosts ={};
|
|
1172
1184
|
if(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0){
|
|
1173
|
-
//
|
|
1185
|
+
//xoá post
|
|
1186
|
+
_newList.dynamicDeletePosts[_listInfo.code] = function(_listInfo,obj){
|
|
1187
|
+
return deletePost(_listInfo,obj);
|
|
1188
|
+
}
|
|
1174
1189
|
_newList.dynamicDeletePost = async (obj)=>{
|
|
1175
|
-
return
|
|
1190
|
+
return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
|
|
1176
1191
|
}
|
|
1177
|
-
|
|
1192
|
+
//tạo post
|
|
1193
|
+
_newList.dynamicPosts[_listInfo.code] = async function(obj, fn,options){
|
|
1178
1194
|
if(_newList.post){
|
|
1179
1195
|
_newList.post(obj, async function(e){
|
|
1180
1196
|
if(e) return fn(e);
|
|
@@ -1193,14 +1209,15 @@ model.createController = (router,_listInfo)=>{
|
|
|
1193
1209
|
fn(e.message || e.error || e)
|
|
1194
1210
|
}
|
|
1195
1211
|
}
|
|
1196
|
-
|
|
1212
|
+
}
|
|
1213
|
+
_newList.dynamicPost = async (obj, fn,options)=>{
|
|
1214
|
+
_newList.dynamicPosts[_listInfo.code](obj, fn,options)
|
|
1197
1215
|
}
|
|
1198
1216
|
}
|
|
1199
|
-
|
|
1200
1217
|
_newList.route();
|
|
1201
1218
|
}else{
|
|
1202
|
-
if(api_code=="moduleinfo") Logger.
|
|
1203
|
-
//Logger.
|
|
1219
|
+
//if(api_code=="moduleinfo") Logger.warn("[listinfo] update API",api_code);
|
|
1220
|
+
//Logger.warn("update API",api_code);
|
|
1204
1221
|
//update options
|
|
1205
1222
|
if(Object.keys(sort).length>0) _newList.sort = _newList.options.sort = sort;
|
|
1206
1223
|
//update model
|
|
@@ -1210,12 +1227,20 @@ model.createController = (router,_listInfo)=>{
|
|
|
1210
1227
|
if(_newList.is_dynamic_list || !_newList.unique || _newList.unique.length===0 ){
|
|
1211
1228
|
_newList.unique = _newList.options.unique=unique;
|
|
1212
1229
|
}
|
|
1230
|
+
_newList.dynamicDeletePosts =_newList.dynamicDeletePosts || {};
|
|
1231
|
+
_newList.dynamicPosts =_newList.dynamicPosts || {};
|
|
1232
|
+
//Logger.warn("[listinfo] update api",_listInfo.code,api_code,(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0));
|
|
1213
1233
|
if(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0){
|
|
1214
|
-
//
|
|
1234
|
+
//xoá post
|
|
1235
|
+
_newList.dynamicDeletePosts[_listInfo.code] = function(_listInfo,obj){
|
|
1236
|
+
return deletePost(_listInfo,obj);
|
|
1237
|
+
}
|
|
1215
1238
|
if(!_newList.dynamicDeletePost) _newList.dynamicDeletePost = async (obj)=>{
|
|
1216
|
-
return
|
|
1239
|
+
return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
|
|
1217
1240
|
}
|
|
1218
|
-
|
|
1241
|
+
//tạo post
|
|
1242
|
+
_newList.dynamicPosts[_listInfo.code] = async function(obj, fn,options){
|
|
1243
|
+
//Logger.warn("[listinfo] dynamicPost",_listInfo.code);
|
|
1219
1244
|
if(_newList.post){
|
|
1220
1245
|
_newList.post(obj, async function(e){
|
|
1221
1246
|
if(e) return fn(e);
|
|
@@ -1234,10 +1259,13 @@ model.createController = (router,_listInfo)=>{
|
|
|
1234
1259
|
fn(e.message || e.error || e)
|
|
1235
1260
|
}
|
|
1236
1261
|
}
|
|
1262
|
+
}
|
|
1263
|
+
if(!_newList.dynamicPost) _newList.dynamicPost = async (obj, fn,options)=>{
|
|
1264
|
+
_newList.dynamicPosts[_listInfo.code](obj, fn,options)
|
|
1237
1265
|
}
|
|
1238
1266
|
}else{
|
|
1239
|
-
_newList.
|
|
1240
|
-
_newList.
|
|
1267
|
+
_newList.dynamicPosts[_listInfo.code] = undefined
|
|
1268
|
+
_newList.dynamicDeletePosts[_listInfo.code] = undefined
|
|
1241
1269
|
}
|
|
1242
1270
|
|
|
1243
1271
|
}
|
|
@@ -1301,7 +1329,7 @@ model.createController = (router,_listInfo)=>{
|
|
|
1301
1329
|
}
|
|
1302
1330
|
_newList.dynamicUpdating = (user,data,obj,next,options={})=>{
|
|
1303
1331
|
let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
|
|
1304
|
-
//Logger.
|
|
1332
|
+
//Logger.warn("[listinfo] [dynamicUpdating] chọn hàm xử lý updating...",listinfo_code);
|
|
1305
1333
|
if(_newList.dynamicUpdatings[listinfo_code]){
|
|
1306
1334
|
_newList.dynamicUpdatings[listinfo_code](user,data,obj,next,JSON.parse(JSON.stringify(options)));
|
|
1307
1335
|
}else{
|
|
@@ -7,10 +7,11 @@ _id:$data$$._id},$data$$);let $obj$$=await $_model$$.findOne({_id:$data$$._id});
|
|
|
7
7
|
Promise.reject("runScript process is not exist");if(!global.runScriptPool){const $StaticPool$$=require("../libs/WorkerStaticPool");global.runScriptPool=new $StaticPool$$($processPath_schedule$$,0,1)}return new Promise(($resolve$$,$reject$$)=>{global.runScriptPool.exec({script:$script$$,configs:JSON.parse(JSON.stringify(global.configs))},$response$$=>{$response$$&&$response$$.error?(Logger.error($response$$.error),$reject$$($response$$.error)):(Logger.info("run script result:",$response$$),$resolve$$($response$$))})})}}},
|
|
8
8
|
mongoose=global.mongoose||require("mongoose"),Schema=mongoose.Schema,scheduleSchema=new Schema({id_link:{type:String},title:{type:String,required:!0},action:{type:String,required:!0},data:{type:Schema.Types.Mixed},script:String,time_run:{type:Date,required:!0},repeat:{type:Number,default:0},next_run:Date,finish_run:Date,trang_thai:{type:String,default:"0"},cron_expression:{type:String},exfields:Schema.Types.Mixed,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,
|
|
9
9
|
default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}});(global.configs||{}).createIndexes&&(scheduleSchema.index({trang_thai:1,next_run:1,time_run:1}),scheduleSchema.index({action:1}),scheduleSchema.index({id_link:1}));
|
|
10
|
-
const model=mongoose.models.schedule||mongoose.model("schedule",scheduleSchema),acquireLock=($key$$,$ttlInMs$$)=>new Promise($resolve$$=>{if(!global.clientRedis)return $resolve$$(!0);global.clientRedis.set($key$$,"LOCKED","NX","PX",$ttlInMs$$,($err$$,$res$$)=>{$resolve$$($res$$==="OK")})}),calculateNextRun=$schedule$$=>{if($schedule$$.cron_expression)try{return require("cron-parser").
|
|
10
|
+
const model=mongoose.models.schedule||mongoose.model("schedule",scheduleSchema),acquireLock=($key$$,$ttlInMs$$)=>new Promise($resolve$$=>{if(!global.clientRedis)return $resolve$$(!0);global.clientRedis.set($key$$,"LOCKED","NX","PX",$ttlInMs$$,($err$$,$res$$)=>{$resolve$$($res$$==="OK")})}),calculateNextRun=$schedule$$=>{if($schedule$$.cron_expression)try{return require("cron-parser").CronExpressionParser.parse($schedule$$.cron_expression).next().toDate()}catch($err$$){return Logger.error("Error parsing cron expression",
|
|
11
11
|
$err$$),Moment().add(1,"hours").toDate()}let $next_run$$=Moment();switch($schedule$$.repeat){case 1:$next_run$$=$next_run$$.add(1,"days");break;case 2:$next_run$$=$next_run$$.add(1,"weeks");break;case 3:$next_run$$=$next_run$$.add(1,"months");break;case 4:$next_run$$=$next_run$$.add(1,"quarters");break;case 7:$next_run$$=$next_run$$.add(1,"hours");break;default:$next_run$$=$next_run$$.add(1,"years")}return $next_run$$.toDate()};
|
|
12
|
-
model.every=async($cron_expression$$,$action$$,$data$$,$options$$={})=>{
|
|
13
|
-
action
|
|
12
|
+
model.every=async($cron_expression$$,$action$$,$data$$,$options$$={})=>{var $cronParser$$=require("cron-parser");try{var $generatedIdLink_hashString_id_link_interval$$=$cronParser$$.CronExpressionParser.parse($cron_expression$$,{currentDate:new Date})}catch($e$$){throw Error(`[Schedule] Cron kh\u00f4ng h\u1ee3p l\u1ec7: ${$cron_expression$$}. Chi ti\u1ebft: ${$e$$.message}`);}$cronParser$$=$generatedIdLink_hashString_id_link_interval$$.next().toDate();$generatedIdLink_hashString_id_link_interval$$=
|
|
13
|
+
$cron_expression$$+$action$$+JSON.stringify($data$$||{});$generatedIdLink_hashString_id_link_interval$$=`cron_${crypto.createHash("md5").update($generatedIdLink_hashString_id_link_interval$$).digest("hex")}`;$generatedIdLink_hashString_id_link_interval$$=$options$$.id_link||$generatedIdLink_hashString_id_link_interval$$;await model.findOneAndUpdate({id_link:$generatedIdLink_hashString_id_link_interval$$},{$set:{id_link:$generatedIdLink_hashString_id_link_interval$$,title:$options$$.title||`Auto Cron Job: ${$action$$}`,
|
|
14
|
+
action:$action$$,data:$data$$,time_run:$cronParser$$,cron_expression:$cron_expression$$,repeat:-1,trang_thai:"0"}},{upsert:!0,new:!0});Logger.info(`[Schedule] \u0110\u00e3 thi\u1ebft l\u1eadp job '${$action$$}' ch\u1ea1y theo cron [${$cron_expression$$}]. L\u1ea7n ch\u1ea1y ti\u1ebfp theo: ${$cronParser$$}`)};
|
|
14
15
|
model.addSchedule=async $schedule$$=>{try{await model.create($schedule$$),Logger.info("added a schedule, time state at",$schedule$$.time_run)}catch($e$$){Logger.error("error add schedule to db",$e$$)}};model.removeSchedule=async $id$$=>{try{await model.deleteOne({_id:$id$$})}catch($e$$){Logger.error("error remove schedule",$e$$)}};model.removeScheduleLink=async $id_link$$=>{try{await model.deleteOne({id_link:$id_link$$})}catch($e$$){Logger.error("error remove schedule",$e$$)}};
|
|
15
16
|
model.check=async()=>{try{var $next_run$$=Moment().toDate(),$final_state_pendingSchedules$$=await model.find({trang_thai:"0",$or:[{next_run:{$lte:$next_run$$}},{time_run:{$lte:$next_run$$},next_run:null}]}).lean();for(const $schedule$$ of $final_state_pendingSchedules$$){if(!await acquireLock(`schedule:lock:${$schedule$$._id.toString()}`,5E4))continue;if(!await model.findOneAndUpdate({_id:$schedule$$._id,trang_thai:"0"},{$set:{trang_thai:"5"}}))continue;$next_run$$=null;$final_state_pendingSchedules$$=
|
|
16
17
|
"9";if($schedule$$.repeat){$next_run$$=calculateNextRun($schedule$$);let $finish_run$$=$schedule$$.finish_run?Moment($schedule$$.finish_run).startOf("date"):null;if(!$finish_run$$||$finish_run$$.toDate()>=$next_run$$.toDate())$final_state_pendingSchedules$$="0"}let $action$$=$schedule$$.action;if(actions[$action$$])try{await actions[$action$$]($schedule$$),await schedule_log.create({id_schedule:$schedule$$._id,message:"ok"})}catch($e$$){await schedule_log.create({id_schedule:$schedule$$._id,message:"Error: "+
|
package/server/models/task.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const taskSchema=new Schema({id_app:{type:String,required:!0},ten_cv:{type:String,required:!0},id_link:{type:String},id_job:{type:String},id_ct:{type:String},id_kh:{type:String,default:""},id_dt:{type:String,default:""},ten_kh:String,id_bp:{type:String,default:""},ten_bp:String,id_lh:{type:String,default:""},id_dokho:{type:String},diem_toi_thieu:Number,diem_toi_da:Number,diem_du_tinh:Number,chia_diem:Boolean,he_so_chia_diem:Schema.Types.Mixed,mieu_ta:{type:String},ghi_chu:{type:String},nh_cv:{type:String},
|
|
2
|
-
ten_nh_cv:String,ma_loai_cv:String,phu_trach:{type:String,lowercase:!0},ten_phu_trach:String,location:{type:String},attends:[String],attend_groups:[String],nguoi_kiem_tra:String,nguoi_thuc_hien:String,start_date:{type:Date},due_date:{type:Date},finished_date:{type:Date},estimate_complete_hour:Number,complete_hour:Number,nhac_nho_truoc:{type:Number,default:60},reminder:{type:Date},repeat:{type:Number,default:0},priority:{type:Number,default:1},progress:{type:
|
|
2
|
+
ten_nh_cv:String,ma_loai_cv:String,phu_trach:{type:String,lowercase:!0},ten_phu_trach:String,location:{type:String},attends:[String],attend_groups:[String],nguoi_kiem_tra:String,nguoi_thuc_hien:String,start_date:{type:Date},due_date:{type:Date},finished_date:{type:Date},estimate_complete_hour:Number,complete_hour:Number,nhac_nho_truoc:{type:Number,default:60},reminder:{type:Date},repeat:{type:Number,default:0},priority:{type:Number,default:1},progress:{type:String,default:"0"},percent:{type:Number,
|
|
3
3
|
default:0,max:100},exfields:Schema.Types.Mixed,labels:[String],todos:Schema.Types.Mixed,stt:{type:Number,default:0},saved:Boolean,ma_ct:{type:String,uppercase:!0},so_ct:{type:String,uppercase:!0},ngay_ct:Date,ma_nt:{type:String,uppercase:!0},ty_gia:Number,thu_phi:Number,da_thu:Number,tk_no:{type:String,uppercase:!0},tk_co:{type:String,uppercase:!0},phi_dich_vu_1_lan:Number,ty_le_hoa_hong:Number,tien_hoa_hong:Number,tk_no_hh:{type:String,uppercase:!0},tk_co_hh:{type:String,uppercase:!0},ma_dvcs:String,
|
|
4
4
|
group_id_link:String,group_name_link:String,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""},visible_to:{type:Number,default:0},visible_to_users:[String],update_right:[String],delete_right:[String]});
|
|
5
5
|
(global.configs||{}).createIndexes&&(taskSchema.index({id_app:1,start_date:-1}),taskSchema.index({id_app:1,start_date:-1,due_date:-1}),taskSchema.index({id_app:1,start_date:-1,ten_cv:1}),taskSchema.index({id_app:1,start_date:-1,nh_cv:1}),taskSchema.index({id_app:1,start_date:-1,phu_trach:1,ten_phu_trach:1}),taskSchema.index({id_app:1,start_date:-1,user_created:1}),taskSchema.index({id_app:1,start_date:-1,date_created:-1}),taskSchema.index({id_app:1,start_date:-1,labels:1}),taskSchema.index({id_app:1,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const trangthaiSchema=new Schema({ma_ct:{type:String,uppercase:!0,required:!0,maxlength:32,trim:!0},ma_trang_thai:{type:String,uppercase:!0,required:!0,maxlength:32,trim:!0},ten_trang_thai:{type:String,required:!0,maxlength:1024},ten_trang_thai_en:{type:String,maxlength:1024},ma_trang_thai2:{type:String,uppercase:!0,maxlength:32,trim:!0},ten_trang_thai2:{type:String,maxlength:1024},ten_trang_thai_en2:{type:String,maxlength:1024},post:{type:Boolean,default:!1},post_books:{type:String,trim:!0},
|
|
2
|
-
default:!1},allow_update:{type:Boolean,default:!1},lock_data:{type:Boolean,default:!1},check_data:{type:Boolean,default:!0},not_need_right:{type:Boolean,default:!1},description:String,stt:{type:Number,default:0},color:String,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}});
|
|
1
|
+
const trangthaiSchema=new Schema({ma_ct:{type:String,uppercase:!0,required:!0,maxlength:32,trim:!0},ma_trang_thai:{type:String,uppercase:!0,required:!0,maxlength:32,trim:!0},ten_trang_thai:{type:String,required:!0,maxlength:1024},ten_trang_thai_en:{type:String,maxlength:1024},ma_trang_thai2:{type:String,uppercase:!0,maxlength:32,trim:!0},ten_trang_thai2:{type:String,maxlength:1024},ten_trang_thai_en2:{type:String,maxlength:1024},post:{type:Boolean,default:!1},post_books:{type:String,trim:!0},not_post_books:{type:String,
|
|
2
|
+
trim:!0},allow_delete:{type:Boolean,default:!1},allow_update:{type:Boolean,default:!1},lock_data:{type:Boolean,default:!1},check_data:{type:Boolean,default:!0},not_need_right:{type:Boolean,default:!1},description:String,stt:{type:Number,default:0},color:String,status:{type:Boolean,default:!0},date_created:{type:Date,default:Date.now},date_updated:{type:Date,default:Date.now},user_created:{type:String,default:""},user_updated:{type:String,default:""}});
|
|
3
3
|
(global.configs||{}).createIndexes&&(trangthaiSchema.index({ma_ct:1}),trangthaiSchema.index({ma_ct:1,ma_trang_thai2:1}),trangthaiSchema.index({ma_ct:1,ma_trang_thai:1,ten_trang_thai:1,ten_trang_thai2:1}),trangthaiSchema.index({ma_ct:1,ma_trang_thai:1},{unique:!0}),trangthaiSchema.index({ma_trang_thai:"text",ten_trang_thai:"text",ma_ct:"text"},{name:"trangthai_index_text"}),trangthaiSchema.index({ma_ct:1,status:1}),trangthaiSchema.index({ma_ct:1,user_created:1,visible_to:1,visible_to_users:1}));
|
|
4
4
|
const model=mongoose.models.trangthai||mongoose.model("trangthai",trangthaiSchema);module.exports=model;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const model=global.getModel("fifo_dk"),controller=require("../../controllers/controller"),dmvt=global.getModel("dmvt"),dmkho=global.getModel("dmkho"),tontucthoi=global.getModel("tontucthoi"),async=require("async"),moment=require("moment"),utils=require("../../libs/utils"),fifo_dk=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"fifo_dk",{sort:{nam:-1}});$contr_router$$.route();$contr_router$$.view=function($user$$,$result$$,$fn$$){const $id_app$$=$user$$.current_id_app;
|
|
2
|
+
async.parallel({vt:function($callback$$){$result$$.joinModel2($id_app$$,dmvt,[{where:"ma_vt",fields:"ten_vt ma_dvt ma_tt1_yn ma_tt2_yn ma_tt3_yn ma_lo_yn".split(" ")}],function($kq$$){$callback$$(null,$kq$$)})},kho:function($callback$$){$result$$.joinModel2($id_app$$,dmkho,[{where:"ma_kho",fields:[{name:"ten_kho",value:"ten_kho"}]}],function($kq$$){$callback$$(null,$kq$$)})}},function($error$$){if($error$$)return $fn$$($error$$);$fn$$(null,$result$$)})};$contr_router$$.creating=async function($ngay_ks_user$$,
|
|
3
|
+
$obj$$,$callback$$){let $_app$$=await global.getModel("app").findOne({_id:$ngay_ks_user$$.current_id_app});if(!$_app$$)return $callback$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");$obj$$.nam||($obj$$.nam=$_app$$.nam_bd);$obj$$.thang_bat_dau||($obj$$.thang_bat_dau=$_app$$.ngay_ky1);$obj$$.ngay_nhap||($obj$$.thang_bat_dau=moment($obj$$.thang_bat_dau).startOf("month").toDate());let $den_ngay$$=moment([$obj$$.nam,0,1]).startOf("date").toDate();if($ngay_ks_user$$=await utils.isBookLocked({id_app:$ngay_ks_user$$.current_id_app,
|
|
4
|
+
ngay_ct:$den_ngay$$,ngay_ks:$_app$$.ngay_ks}))return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($ngay_ks_user$$).format("DD/MM/YYYY")}`);$callback$$(null,$obj$$)};$contr_router$$.created=function($user$$,$obj$$,$callback$$){tontucthoi.tinhTonTucThoi($obj$$,$e$$=>{$e$$&&Logger.error("[fifo_dk] t\u00ednh t\u1ed3n t\u1ee9c th\u1eddi",$e$$)});$callback$$(null,$obj$$)};$contr_router$$.updated=function($user$$,$obj$$,$callback$$){tontucthoi.tinhTonTucThoi($obj$$,$e$$=>
|
|
5
|
+
{$e$$&&Logger.error("[fifo_dk] t\u00ednh t\u1ed3n t\u1ee9c th\u1eddi",$e$$)});$callback$$(null,$obj$$)};$contr_router$$.updating=async function($ngay_ks$jscomp$2_user$$,$data$$,$obj$$,$callback$$){let $_app$$=await global.getModel("app").findOne({_id:$ngay_ks$jscomp$2_user$$.current_id_app});if(!$_app$$)return $callback$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");var $den_ngay$jscomp$1_ngay_ks$$=moment([$obj$$.nam,0,1]).startOf("date").toDate();if($den_ngay$jscomp$1_ngay_ks$$=await utils.isBookLocked({id_app:$ngay_ks$jscomp$2_user$$.current_id_app,
|
|
6
|
+
ngay_ct:$den_ngay$jscomp$1_ngay_ks$$,ngay_ks:$_app$$.ngay_ks}))return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($den_ngay$jscomp$1_ngay_ks$$).format("DD/MM/YYYY")}`);$data$$.nam=$data$$.nam||$obj$$.nam;if($data$$.nam&&($den_ngay$jscomp$1_ngay_ks$$=moment([$data$$.nam,0,1]).startOf("date").toDate(),$ngay_ks$jscomp$2_user$$=await utils.isBookLocked({id_app:$ngay_ks$jscomp$2_user$$.current_id_app,ngay_ct:$den_ngay$jscomp$1_ngay_ks$$,ngay_ks:$_app$$.ngay_ks})))return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($ngay_ks$jscomp$2_user$$).format("DD/MM/YYYY")}`);
|
|
7
|
+
$callback$$(null,$data$$,$obj$$)};$contr_router$$.deleting=async($ngay_ks$jscomp$3_user$$,$obj$$,$callback$$)=>{let $_app$$=await global.getModel("app").findOne({_id:$ngay_ks$jscomp$3_user$$.current_id_app});if(!$_app$$)return $callback$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");let $den_ngay$$=moment([$obj$$.nam,0,1]).startOf("date").toDate();if($ngay_ks$jscomp$3_user$$=await utils.isBookLocked({id_app:$ngay_ks$jscomp$3_user$$.current_id_app,ngay_ct:$den_ngay$$,ngay_ks:$_app$$.ngay_ks}))return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($ngay_ks$jscomp$3_user$$).format("DD/MM/YYYY")}`);
|
|
8
|
+
$callback$$(null,$obj$$)};$contr_router$$.deleted=function($user$$,$obj$$,$callback$$){tontucthoi.tinhTonTucThoi($obj$$,$e$$=>{$e$$&&Logger.error("[fifo_dk] t\u00ednh t\u1ed3n t\u1ee9c th\u1eddi",$e$$)});$callback$$(null,$obj$$)}};module.exports=fifo_dk;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
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"),{isSupperAdmin}=require("../../libs/utils");function deg2rad($deg$$){return Math.PI/180*$deg$$}
|
|
2
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
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(!isSupperAdmin($obj$$.device_user_id)){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$$=
|
|
4
|
+
if(!isSupperAdmin($obj$$.device_user_id)&&global.configs?.check_device_id){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
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
6
|
$obj$$.location.latitude&&$obj$$.location.longitude){if($nv$$.ma_cn){var $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$$("Chi nh\u00e1nh l\u00e0m vi\u1ec7c kh\u00f4ng t\u1ed3n t\u1ea1i");if(!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location||
|
|
7
7
|
!$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$$=getDistanceFromLatLonInM($obj$$.location.latitude,$obj$$.location.longitude,
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
const model=global.getModel("customer"),
|
|
2
|
-
|
|
3
|
-
$
|
|
4
|
-
|
|
5
|
-
{$condition$$.user_group
|
|
6
|
-
$
|
|
7
|
-
|
|
8
|
-
{$
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
{$
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
$
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
$
|
|
22
|
-
$
|
|
23
|
-
|
|
24
|
-
if(!$body$$.content)return $next$$("Thi\u1ebfu n\u1ed9i dung tin nh\u1eafn");let $account_sms$$=await global.getModel("smsaccount").findOne({_id:$body$$.id_account,id_app:$req$$.user.current_id_app}).lean();if(!$account_sms$$)return $next$$("T\u00e0i kho\u1ea3n sms kh\u00f4ng t\u1ed3n t\u1ea1i");permission.hasRight($req$$.user.current_id_app,$req$$.user.email,"smssend","add",async function($error$$,$permission$$){if(!$permission$$)return $next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n g\u1eedi tin nh\u1eafn qu\u1ea3ng c\u00e1o");
|
|
25
|
-
$error$$=($req$$.body||{}).q||{};$error$$.dien_thoai||($error$$.dien_thoai={$exists:!0});$error$$.id_app=$req$$.user.current_id_app;let $custs$$=[...(new Set((await model.find($error$$,{dien_thoai:1}).lean()).map($c$$=>$c$$.dien_thoai)))];if($custs$$.length<30)return $next$$("C\u1ea7n g\u1eedi cho t\u1ed1i thi\u1ec3u 30 kh\u00e1ch h\u00e0ng");$custs$$=$custs$$.join(",");setImmediate(async()=>{let $result$$;try{await global.getModel("smsaccount").send($account_sms$$,$custs$$,$body$$.content),$result$$=
|
|
26
|
-
{msg:"\u0110\u00e3 g\u1eedi y\u00eau c\u1ea7u th\u00e0nh c\u00f4ng",code:0}}catch($e$$){$result$$={msg:"Kh\u00f4ng th\u1ec3 g\u1eedi",error:$e$$.message||$e$$.error||$e$$,code:-1}}await global.getModel("smssend").create({id_app:$req$$.user.current_id_app,phone:$custs$$,content:$body$$.content,user_created:$req$$.user.email,result:$result$$});$next$$()})})},{method:"POST"})};module.exports=customer;
|
|
1
|
+
const model=global.getModel("customer"),dmnhkh=global.getModel("group"),User=global.getModel("user"),Trangthai=global.getModel("trangthai"),Participant=global.getModel("participant"),Usergroup=global.getModel("usergroup"),validator=require("validator"),group=global.getModel("group"),controller=require("../../controllers/controller"),redisCache=require("../../libs/redis-cache"),permission=require("../../libs/permission"),{isMobilePhone}=require("../../libs/utils"),{isValidObjectId}=require("mongoose"),
|
|
2
|
+
MAX_DEPTH=20,getAllChildrenUserGroup=async($id_app$$,$depth$$)=>{const $visited$$=new Set([$depth$$?.toString()].filter(Boolean));var $frontier_next$$=[$depth$$];for($depth$$=0;$frontier_next$$.length>0&&$depth$$<MAX_DEPTH;){$depth$$++;var $children_idStr$$=await Usergroup.find({id_app:$id_app$$,group_mother:{$in:$frontier_next$$},status:!0},{_id:1,group_mother:1}).lean();$frontier_next$$=[];for(const $c$$ of $children_idStr$$)$children_idStr$$=$c$$._id.toString(),$children_idStr$$===$c$$.group_mother?.toString()||
|
|
3
|
+
$visited$$.has($children_idStr$$)||($visited$$.add($children_idStr$$),$frontier_next$$.push($c$$._id));$depth$$===MAX_DEPTH&&$frontier_next$$.length>0&&Logger.warn(`[getAllChildrenUserGroup] \u0111\u1ea1t \u0111\u1ed9 s\u00e2u t\u1ed1i \u0111a ${MAX_DEPTH}, d\u1eebng.`)}return[...$visited$$]},customer=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"customer",{sort:{ten_kh:-1},unique:["ma_kh"],cache:!0,onFinding:async($user$$,$condition$$,$next$$)=>{if($condition$$.sinh_nhat_ngay||
|
|
4
|
+
$condition$$.is_birthday){const $today$$=new Date($condition$$.sinh_nhat_ngay),$tz$$=Intl.DateTimeFormat().resolvedOptions().timeZone;$condition$$.$expr=$condition$$.$expr||{};$condition$$.$expr.$and=$condition$$.$expr.$and||[];$condition$$.$expr.$and.push({$eq:[{$month:{date:"$ngay_sinh",timezone:$tz$$}},$today$$.getMonth()+1]});$condition$$.$expr.$and.push({$eq:[{$dayOfMonth:{date:"$ngay_sinh",timezone:$tz$$}},$today$$.getDate()]});delete $condition$$.sinh_nhat_ngay;delete $condition$$.is_birthday}try{await Promise.all([(async()=>
|
|
5
|
+
{if($condition$$.user_group){var $groups_ps$$=await getAllChildrenUserGroup($condition$$.id_app,$condition$$.user_group);$groups_ps$$=await global.getModel("participant").find({id_app:$user$$.current_id_app,group_id:{$in:$groups_ps$$}},{email:1}).lean();$condition$$.phu_trach={$in:$groups_ps$$.map($p$$=>$p$$.email)};delete $condition$$.user_group}})(),(async()=>{if($condition$$.ma_bp){var $users$$=await global.getModel("dmbp").getUsersByMaBP($user$$.current_id_app,$condition$$.ma_bp);Logger.info("users of department",
|
|
6
|
+
$users$$);$condition$$.phu_trach={$in:$users$$};delete $condition$$.ma_bp}})(),...["nh_kh","nh_kh2","nh_kh3","nh_kh4","nh_kh5"].map(($field$$,$idx$$)=>(async()=>{if($condition$$[$field$$]&&typeof $condition$$[$field$$]==="string"){var $result$$=await dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$[$field$$],{status:!0,group_kind:$idx$$+1});$condition$$[$field$$]={$in:[...(new Set($result$$))]}}})())]),$next$$(null,$condition$$)}catch($e$$){$next$$($e$$)}},onFound:($user$$,$condition$$,
|
|
7
|
+
$items$$,$next$$)=>$next$$(null,$items$$),onCreating:($user$$,$obj$$,$next$$)=>{if($obj$$.dien_thoai&&!isMobilePhone($obj$$.dien_thoai,"vi-VN"))return $next$$(`S\u1ed1 \u0111i\u1ec7n tho\u1ea1i ${$obj$$.dien_thoai} l\u00e0 kh\u00f4ng h\u1ee3p l\u1ec7`);if($obj$$.dien_thoai2&&!isMobilePhone($obj$$.dien_thoai2,"vi-VN"))return $next$$(`S\u1ed1 \u0111i\u1ec7n tho\u1ea1i ${$obj$$.dien_thoai2} l\u00e0 kh\u00f4ng h\u1ee3p l\u1ec7`);$next$$(null,$obj$$)},onUpdating:($user$$,$data$$,$obj$$,$next$$)=>{if($data$$.dien_thoai&&
|
|
8
|
+
!isMobilePhone($data$$.dien_thoai,"vi-VN"))return $next$$(`S\u1ed1 \u0111i\u1ec7n tho\u1ea1i ${$data$$.dien_thoai} l\u00e0 kh\u00f4ng h\u1ee3p l\u1ec7`);if($data$$.dien_thoai2&&!isMobilePhone($data$$.dien_thoai2,"vi-VN"))return $next$$(`S\u1ed1 \u0111i\u1ec7n tho\u1ea1i ${$data$$.dien_thoai2} l\u00e0 kh\u00f4ng h\u1ee3p l\u1ec7`);$next$$(null,$data$$,$obj$$)},onView:async($user$$,$items$$,$next$$,$options$$)=>{for(const $item$$ of $items$$)$item$$.email&&!validator.isEmail($item$$.email)&&($item$$.email=
|
|
9
|
+
""),delete $item$$.default_password;const $q$$=$options$$?.req?.query||{},$id_app$$=$user$$.current_id_app;try{await Promise.all([$items$$.filter($i$$=>$i$$.of_user&&!$i$$.group_user).asyncJoinModel2($id_app$$,"usergroup",[{where:{of_user:"email"},fields:[{name:"group_user",value:"_id"}]}]),$items$$.filter($i$$=>$i$$.phu_trach).asyncJoinModel2(null,User,[{where:{phu_trach:"email"},fields:[{ten_phu_trach:"name"}]}]),$items$$.filter($i$$=>$i$$.phu_trach).asyncJoinModel2($id_app$$,"dmnv",[{where:{phu_trach:"user"},
|
|
10
|
+
fields:[{ma_nv_phu_trach:"ma_nv"},{ten_nv_phu_trach:"ten_nv"},{ma_bp_nv:"ma_bp"}]}]),$items$$.filter($i$$=>$i$$.nh_kh).asyncJoinModel2($id_app$$,group,[{where:{nh_kh:"_id"},fields:[{ten_nh_kh:"group_name"}]}]),(async()=>{var $all_docs_uniq$$=[...$items$$.flatMap($i$$=>$i$$.nh_kh2||[]),...$items$$.flatMap($i$$=>$i$$.nh_kh3||[]),...$items$$.flatMap($i$$=>$i$$.nh_kh4||[])];if($all_docs_uniq$$.length){$all_docs_uniq$$=[...(new Set($all_docs_uniq$$))];$all_docs_uniq$$=await group.find({id_app:$id_app$$,
|
|
11
|
+
_id:{$in:$all_docs_uniq$$}},{group_name:1}).lean();var $setMap$$=Object.fromEntries($all_docs_uniq$$.map($n$$=>[$n$$._id.toString(),$n$$.group_name]));for(const $item$$ of $items$$)$item$$.nh_kh2&&($item$$.ten_nh_kh2=$item$$.nh_kh2.map($k$$=>$setMap$$[$k$$])),$item$$.nh_kh3&&($item$$.ten_nh_kh3=$item$$.nh_kh3.map($k$$=>$setMap$$[$k$$])),$item$$.nh_kh4&&($item$$.ten_nh_kh4=$item$$.nh_kh4.map($k$$=>$setMap$$[$k$$]))}})(),$items$$.filter($i$$=>$i$$.ma_kho_npp).asyncJoinModel2($id_app$$,"dmkho",[{where:{ma_kho_npp:"ma_kho"},
|
|
12
|
+
fields:[{ten_kho_npp:"ten_kho"}]}]),$items$$.filter($i$$=>$i$$.of_user).asyncJoinModel2(null,User,[{where:{of_user:"email"},fields:[{user_name:"name"}]}]),$items$$.filter($i$$=>$i$$.trang_thai).asyncJoinModel2(null,Trangthai,[{where:$item$$=>({ma_trang_thai:$item$$.trang_thai,ma_ct:"CUSTOMER"}),fields:["ten_trang_thai","color"]}]),(async()=>{if((!$q$$.fields||$q$$.fields.includes("ngay_mua_gan_nhat")||!$q$$.fields||$q$$.fields.includes("ngay_mua_dau_tien"))&&model.updateActives){var $needUpdate$$=
|
|
13
|
+
$items$$.filter($i$$=>$i$$.ngay_mua_gan_nhat===void 0||!$i$$.ngay_mua_dau_tien||$i$$.ngay_tuong_tac_gan_nhat===void 0);await Promise.all($needUpdate$$.map(async $item$$=>{try{const $rs$$=await model.updateActives($item$$);$item$$.ngay_mua_gan_nhat=$rs$$.ngay_mua_gan_nhat;$item$$.ngay_mua_dau_tien=$rs$$.ngay_mua_dau_tien;$item$$.so_ngay_da_mua=$rs$$.so_ngay_da_mua}catch($e$$){Logger.error($e$$)}}))}})(),(async()=>{$q$$.fields?.includes("so_don_hang_bds")&&await Promise.all($items$$.map(async $item$$=>
|
|
14
|
+
{$item$$.so_don_hang_bds=await global.getModel("bds_nhadat_moigioi_ban").countDocuments({id_app:$item$$.id_app,ma_kh:$item$$.ma_kh,user_created:$user$$.email})}))})(),(async()=>{if($q$$.fields?.includes("latest_note")){var $needNote$$=$items$$.filter($i$$=>!$i$$.latest_note);await Promise.all($needNote$$.map(async $item$$=>{try{const $latest_note$$=await global.getModel("note").findOne({id_app:$item$$.id_app,id_link:$item$$._id.toString()},{content:1,date_created:1,user_created:1}).sort({date_created:-1}).lean();
|
|
15
|
+
$latest_note$$&&($item$$.latest_note=$latest_note$$,Promise.all([model.updateOne({_id:$item$$._id},{latest_note:$latest_note$$}),new Promise($resolve$$=>{model.findById($item$$._id).then($c$$=>{redisCache.set("customer",$c$$.toObject(),$e$$=>{Logger.info("cache customer data",$e$$);$resolve$$()})}).catch($resolve$$)})]).catch($e$$=>Logger.error("latest_note update error",$e$$)))}catch($e$$){Logger.error($e$$)}}))}})()]),$next$$(null,$items$$)}catch($e$$){$next$$($e$$)}}});$contr_router$$.validating=
|
|
16
|
+
async($user$$,$obj$$,$next$$,$options$$={})=>{if($options$$.action==="add"&&!$obj$$.ma_kh&&$obj$$.ten_kh)try{const $ma_kh$$=await model.asyncCreateCustomerCode($user$$.current_id_app,$obj$$.dien_thoai||$obj$$.ten_kh);if(!$ma_kh$$)return $next$$("Kh\u00f4ng th\u1ec3 t\u1ea1o m\u00e3 kh\u00e1ch h\u00e0ng");$obj$$.ma_kh=$ma_kh$$;$next$$(null,$obj$$)}catch($e$$){Logger.error("Kh\u00f4ng th\u1ec3 t\u1ea1o m\u00e3 kh\u00e1ch h\u00e0ng",$obj$$.ten_kh,$e$$),$next$$(`Kh\u00f4ng th\u1ec3 t\u1ea1o m\u00e3 kh\u00e1ch h\u00e0ng, L\u1ed7i: ${$e$$.message||
|
|
17
|
+
$e$$.error||$e$$}`)}else $next$$(null,$obj$$)};$contr_router$$.route();$contr_router$$.on("saved",async $data$$=>{if($data$$.of_user)try{const $query_ug$$=$data$$.group_user&&isValidObjectId($data$$.group_user)?{_id:$data$$.group_user}:{is_customer_group:!0},$_usergroup$$=await Usergroup.getInfo($data$$.id_app,$query_ug$$);if($_usergroup$$)if(await User.findOne({email:$data$$.of_user}).lean())Participant.createParticipant({id_app:$data$$.id_app,email:$data$$.of_user,group_id:$_usergroup$$._id,active:!0},
|
|
18
|
+
$e$$=>{$e$$&&Logger.info("can't add user",$data$$.of_user,"to company")});else{var $newUser$$=new User;$newUser$$.email=$data$$.of_user;$newUser$$.name=$data$$.ten_kh;$newUser$$.email2=$data$$.email;$newUser$$.local={email:$data$$.of_user,name:$data$$.ten_kh,picture:"/images/avatar.jpg"};$newUser$$.local.password=$newUser$$.generateHash($newUser$$.email+($data$$.default_password||`${$newUser$$.email}@123456`));await $newUser$$.save();Participant.createParticipant({id_app:$data$$.id_app,email:$newUser$$.email,
|
|
19
|
+
group_id:$_usergroup$$._id,active:!0},$e$$=>{$e$$&&Logger.info("can't add user",$newUser$$.email,"to company")})}}catch($e$$){Logger.error("[customer saved] error",$e$$)}});$contr_router$$.createRoute("qc/sms",async($req$$,$next$$)=>{const $body$$=$req$$.body||{};if(!$body$$.id_account)return $next$$("Thi\u1ebfu t\u00e0i kho\u1ea3n sms");if(!$body$$.content)return $next$$("Thi\u1ebfu n\u1ed9i dung tin nh\u1eafn");const $account_sms$$=await global.getModel("smsaccount").findOne({_id:$body$$.id_account,
|
|
20
|
+
id_app:$req$$.user.current_id_app}).lean();if(!$account_sms$$)return $next$$("T\u00e0i kho\u1ea3n sms kh\u00f4ng t\u1ed3n t\u1ea1i");permission.hasRight($req$$.user.current_id_app,$req$$.user.email,"smssend","add",async($custs_custs_raw_error$jscomp$2_q$$,$hasPerm$$)=>{if(!$hasPerm$$)return $next$$("B\u1ea1n kh\u00f4ng c\u00f3 quy\u1ec1n g\u1eedi tin nh\u1eafn qu\u1ea3ng c\u00e1o");$custs_custs_raw_error$jscomp$2_q$$=$body$$.q||{};$custs_custs_raw_error$jscomp$2_q$$.dien_thoai||($custs_custs_raw_error$jscomp$2_q$$.dien_thoai=
|
|
21
|
+
{$exists:!0});$custs_custs_raw_error$jscomp$2_q$$.id_app=$req$$.user.current_id_app;$custs_custs_raw_error$jscomp$2_q$$=await model.find($custs_custs_raw_error$jscomp$2_q$$,{dien_thoai:1}).lean();$custs_custs_raw_error$jscomp$2_q$$=[...(new Set($custs_custs_raw_error$jscomp$2_q$$.map($c$$=>$c$$.dien_thoai)))];if($custs_custs_raw_error$jscomp$2_q$$.length<30)return $next$$("C\u1ea7n g\u1eedi cho t\u1ed1i thi\u1ec3u 30 kh\u00e1ch h\u00e0ng");const $custsStr$$=$custs_custs_raw_error$jscomp$2_q$$.join(",");
|
|
22
|
+
setImmediate(async()=>{let $result$$;try{await global.getModel("smsaccount").send($account_sms$$,$custsStr$$,$body$$.content),$result$$={msg:"\u0110\u00e3 g\u1eedi y\u00eau c\u1ea7u th\u00e0nh c\u00f4ng",code:0}}catch($e$$){$result$$={msg:"Kh\u00f4ng th\u1ec3 g\u1eedi",error:$e$$.message||$e$$.error||$e$$,code:-1}}await global.getModel("smssend").create({id_app:$req$$.user.current_id_app,phone:$custsStr$$,content:$body$$.content,user_created:$req$$.user.email,result:$result$$})});$next$$()})},{method:"POST"})};
|
|
23
|
+
module.exports=customer;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const model=global.getModel("dmbp"),Participant=global.getModel("participant"),controller=require("../../controllers/controller"),async=require("async"),getSysorder=function($item$$,$callback$$){let $sysorder$$=($item$$.stt||"0")+"-"+$item$$.ma_bp;$item$$.ma_bp_me&&$item$$.ma_bp_me!=$item$$.ma_bp.toString()?model.findOne({ma_bp:$item$$.ma_bp_me,id_app:$item$$.id_app}).lean().then(function($item_me$$){$item_me$$?getSysorder($item_me$$,function($rs$$){$sysorder$$=$rs$$+"---"+$sysorder$$;$callback$$($sysorder$$)}):
|
|
2
2
|
$callback$$($sysorder$$)}).catch($e$$=>{$callback$$($e$$)}):$callback$$($sysorder$$)};
|
|
3
|
-
module.exports=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"dmbp",{sort:{sysorder:1},unique:["ma_bp"],onView:function($user$$,$items$$,$next$$){async.
|
|
4
|
-
Participant,[{where:{phoi_hop:"email"},fields:[{ten_phoi_hop:"name"}]}],function(){$callback$$(null,$items$$)})}},()=>{$next$$(null,$items$$)})}
|
|
5
|
-
|
|
6
|
-
{$
|
|
7
|
-
ma_bp:$obj$$.ma_bp_me},{$set:{loai_nh:1}}).catch(console.error))})};
|
|
3
|
+
module.exports=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"dmbp",{sort:{sysorder:1},unique:["ma_bp"],onView:function($user$$,$items$$,$next$$){async.parallel({pt:function($callback$$){$items$$.filter($item$$=>$item$$.phu_trach).joinModel2($user$$.current_id_app,Participant,[{where:{phu_trach:"email"},fields:[{ten_phu_trach:"name"}]}],function(){$callback$$(null,$items$$)})},ph:function($callback$$){$items$$.filter($item$$=>$item$$.phoi_hop).joinModel2($user$$.current_id_app,
|
|
4
|
+
Participant,[{where:{phoi_hop:"email"},fields:[{ten_phoi_hop:"name"}]}],function(){$callback$$(null,$items$$)})}},()=>{$next$$(null,$items$$)})},onUpdating:async($user$$,$data$$,$obj$$,$next$$)=>{if($data$$.ma_bp_me&&(await model.getAllChildrenGroup($obj$$.id_app,$obj$$.ma_bp.toString())).indexOf($data$$.ma_bp_me)>=0)return $next$$("Kh\u00f4ng th\u1ec3 ch\u1ecdn nh\u00f3m n\u00e0y l\u00e0m nh\u00f3m m\u1eb9");$next$$(null,$data$$,$obj$$)}});$contr_router$$.route();$contr_router$$.deleting=function($user$$,
|
|
5
|
+
$obj$$,$next$$){if($obj$$.loai_nh===0)return $next$$(Error("Kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p x\u00f3a nh\u00f3m m\u1eb9"));$next$$(null,$obj$$)};$contr_router$$.created=function($user$$,$obj$$,$next$$){getSysorder($obj$$,async function($rs$$){$obj$$.sysorder=$rs$$;$obj$$.bac=$rs$$.split("---").length;await model.updateOne({_id:$obj$$._id},{$set:{bac:$obj$$.bac,sysorder:$obj$$.sysorder,loai_nh:1}}).catch(console.error);$next$$(null,$obj$$)})};$contr_router$$.updated=function($user$$,$obj$$,
|
|
6
|
+
$next$$){getSysorder($obj$$,async function($loai_nh_rs$$){$obj$$.sysorder=$loai_nh_rs$$;$obj$$.bac=$loai_nh_rs$$.split("---").length;$loai_nh_rs$$=1;await model.findOne({ma_bp_me:$obj$$.ma_bp.toString(),id_app:$obj$$.id_app}).catch(console.error)&&($loai_nh_rs$$=0);$obj$$.loai_nh=$loai_nh_rs$$;await model.updateOne({_id:$obj$$._id},{$set:{bac:$obj$$.bac,sysorder:$obj$$.sysorder,loai_nh:$loai_nh_rs$$}}).catch(console.error);$next$$(null,$obj$$)})};$contr_router$$.on("saved",async function($obj$$){const $ma_bp_me$$=
|
|
7
|
+
$obj$$.ma_bp_me;$ma_bp_me$$&&await model.updateOne({id_app:$obj$$.id_app,ma_bp:$ma_bp_me$$},{$set:{loai_nh:0}}).catch(console.error)});$contr_router$$.on("deleted",async function($obj$$){$obj$$.ma_bp_me&&(await model.findOne({ma_bp_me:$obj$$.ma_bp_me,id_app:$obj$$.id_app}).select("_id").catch(console.error)||await model.updateOne({id_app:$obj$$.id_app,ma_bp:$obj$$.ma_bp_me},{$set:{loai_nh:1}}).catch(console.error))})};
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
const model=global.getModel("dmkho"),customer=global.getModel("customer"),controller=require("../../controllers/controller"),
|
|
1
|
+
const model=global.getModel("dmkho"),customer=global.getModel("customer"),controller=require("../../controllers/controller"),getSysorder=function($item$$,$callback$$){let $sysorder$$=$item$$.ma_kho.toString();$item$$.ma_kho_me&&$item$$.ma_kho_me!=$item$$.ma_kho.toString()?model.findOne({ma_kho:$item$$.ma_kho_me}).lean().then(function($item_me$$){$item_me$$?getSysorder($item_me$$,function($rs$$){$sysorder$$=$rs$$+"---"+$sysorder$$;$callback$$($sysorder$$)}):$callback$$($sysorder$$)}).catch($e$$=>{Logger.error($e$$);
|
|
2
|
+
$callback$$($sysorder$$)}):$callback$$($sysorder$$)};
|
|
3
|
+
module.exports=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"dmkho",{sort:{ma_kho:1},unique:["ma_kho"],onView:async($user$$,$items$$,$next$$)=>{await $items$$.asyncJoinModel2($user$$.current_id_app,customer,{where:{ma_kh:"ma_kh"},fields:{ten_kh:"ten_kh"}});$next$$(null,$items$$)},onUpdating:async($user$$,$data$$,$obj$$,$next$$)=>{if($data$$.ma_kho_me&&(await model.getAllChildrenGroup($obj$$.id_app,$obj$$.ma_kho.toString())).indexOf($data$$.ma_kho_me)>=0)return $next$$("Kh\u00f4ng th\u1ec3 ch\u1ecdn nh\u00f3m n\u00e0y l\u00e0m nh\u00f3m m\u1eb9");
|
|
4
|
+
$next$$(null,$data$$,$obj$$)}});$contr_router$$.deleting=function($user$$,$obj$$,$next$$){if($obj$$.loai_nh===0)return $next$$(Error("Kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p x\u00f3a nh\u00f3m m\u1eb9"));$next$$(null,$obj$$)};$contr_router$$.created=function($user$$,$obj$$,$next$$){getSysorder($obj$$,async function($rs$$){$obj$$.sysorder=$rs$$;$obj$$.bac=$rs$$.split("---").length;await model.updateOne({_id:$obj$$._id},{$set:{bac:$obj$$.bac,sysorder:$obj$$.sysorder,loai_nh:1}}).catch(console.error);
|
|
5
|
+
$next$$(null,$obj$$)})};$contr_router$$.updated=function($user$$,$obj$$,$next$$){getSysorder($obj$$,async function($loai_nh_rs$$){$obj$$.sysorder=$loai_nh_rs$$;$obj$$.bac=$loai_nh_rs$$.split("---").length;$loai_nh_rs$$=1;await model.findOne({ma_kho_me:$obj$$.ma_kho.toString(),id_app:$obj$$.id_app}).catch(console.error)&&($loai_nh_rs$$=0);$obj$$.loai_nh=$loai_nh_rs$$;await model.updateOne({_id:$obj$$._id},{$set:{bac:$obj$$.bac,sysorder:$obj$$.sysorder,loai_nh:$loai_nh_rs$$}}).catch(console.error);
|
|
6
|
+
$next$$(null,$obj$$)})};$contr_router$$.on("saved",async function($obj$$){const $ma_kho_me$$=$obj$$.ma_kho_me;$ma_kho_me$$&&await model.updateOne({id_app:$obj$$.id_app,ma_kho:$ma_kho_me$$},{$set:{loai_nh:0}}).catch(console.error)});$contr_router$$.on("deleted",async function($obj$$){$obj$$.ma_kho_me&&(await model.findOne({ma_kho_me:$obj$$.ma_kho_me,id_app:$obj$$.id_app}).select("_id").catch(console.error)||await model.updateOne({id_app:$obj$$.id_app,ma_kho:$obj$$.ma_kho_me},{$set:{loai_nh:1}}).catch(console.error))});
|
|
7
|
+
$contr_router$$.route()};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const model=global.getModel("group"),dmdt=global.getModel("dmdt"),dmbp=global.getModel("dmbp"),task=global.getModel("task"),User=global.getModel("user"),UserGroup=global.getModel("usergroup"),Participant=global.getModel("participant"),controller=require("../../controllers/controller"),async=require("async"),dmnhtask=function($router$$){(new controller($router$$,model,"dmnhtask",{sort:{group_name:1},findExact:{group_type:1},notNeedRight:($user$$,$options$$={})=>($options$$.action||"").toLowerCase()==
|
|
2
2
|
"view"?!0:!1,onView:($user$$,$items$$,$next$$)=>{async.series({dt:$cb$$=>{$items$$.filter($r$$=>$r$$.ma_dt).joinModel2($user$$.current_id_app,dmdt,{where:"ma_dt",fields:[{ten_dt:"ten_dt"},{id_dt:"_id"}]},()=>{$cb$$(null)})},bp:$cb$$=>{$items$$.filter($r$$=>$r$$.ma_bp).joinModel2($user$$.current_id_app,dmbp,{where:"ma_bp",fields:"ten_bp"},()=>{$cb$$(null)})},pt:async()=>{await $items$$.asyncJoinModel2($user$$.current_id_app,Participant,{where:{phu_trach:"email"},fields:{nhom_phu_trach:"group_id"}});
|
|
3
3
|
await $items$$.asyncJoinModel2($user$$.current_id_app,UserGroup,{where:{nhom_phu_trach:"_id"},fields:{ten_nhom_phu_trach:"group_name"}});await $items$$.asyncJoinModel2(null,User,{where:{phu_trach:"email"},fields:{ten_phu_trach:"name"}});return null},tasks:async()=>{await Promise.all($items$$.map($item$$=>(async()=>{$item$$.total_tasks=await task.countDocuments({id_app:$user$$.current_id_app,nh_cv:$item$$._id.toString(),saved:{$ne:!0}});$item$$.total_tasks_done=await task.countDocuments({id_app:$user$$.current_id_app,
|
|
4
|
-
nh_cv:$item$$._id.toString(),progress:
|
|
4
|
+
nh_cv:$item$$._id.toString(),progress:"3",saved:{$ne:!0}});return $item$$})()));return null}},()=>{$next$$(null,$items$$)})},onFinding:($user$$,$condition$$,$cb$$)=>{$condition$$.group_type="TASK";$cb$$(null,$condition$$)},onCreating:($user$$,$data$$,$cb$$)=>{$data$$.group_type="TASK";$data$$.attends&&($data$$.attends=[...(new Set($data$$.attends))]);$cb$$(null,$data$$)},onUpdating:($user$$,$data$$,$obj$$,$cb$$)=>{$data$$.group_type="TASK";$data$$.attends=$data$$.attends||$obj$$.attends;$data$$.attends&&
|
|
5
5
|
($data$$.attends=[...(new Set($data$$.attends))]);$cb$$(null,$data$$,$obj$$)}})).route()};module.exports=dmnhtask;
|