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.
Files changed (129) hide show
  1. package/README.md +439 -4
  2. package/package.json +4 -3
  3. package/server/agents/agents.js +1 -0
  4. package/server/agents/ai_memory_manager.js +6 -0
  5. package/server/agents/ceoAgent.js +43 -0
  6. package/server/agents/chatController.js +6 -0
  7. package/server/agents/cskhAgent.js +43 -0
  8. package/server/agents/flowAgent.js +43 -0
  9. package/server/agents/prompts/ceo.js +2 -0
  10. package/server/agents/prompts/flow.js +2 -0
  11. package/server/agents/staffAgent.js +44 -0
  12. package/server/agents/tools/financeTools.js +57 -0
  13. package/server/agents/tools/flowTools.js +36 -0
  14. package/server/agents/tools/kpiTools.js +104 -0
  15. package/server/agents/tools/masterDataTools.js +74 -0
  16. package/server/agents/tools/okrTools.js +21 -0
  17. package/server/agents/tools/ragTools.js +21 -0
  18. package/server/agents/tools/reportTools.js +43 -0
  19. package/server/agents/tools/staffTools.js +13 -0
  20. package/server/agents/tools/stockTools.js +41 -0
  21. package/server/agents/tools/systemTools.js +52 -0
  22. package/server/agents/tools/taskTools.js +23 -0
  23. package/server/agents/tools/utils.js +57 -0
  24. package/server/app.js +7 -7
  25. package/server/controllers/controller.js +31 -29
  26. package/server/controllers/controllerRPT.js +31 -29
  27. package/server/controllers/findHandler.js +22 -21
  28. package/server/controllers/importFromExcelHandler.js +17 -14
  29. package/server/controllers/importHandler.js +26 -41
  30. package/server/controllers/importHandler_old.js +41 -0
  31. package/server/controllers/rptHandler.js +14 -11
  32. package/server/controllers/viewHandler.js +7 -7
  33. package/server/flow/FlowEngine.js +49 -45
  34. package/server/flow/WebhookManager.js +1 -1
  35. package/server/flow/handlers.js +2 -2
  36. package/server/flow/nodes/userform.js +28 -0
  37. package/server/flow/utils.js +12 -4
  38. package/server/global.js +4 -3
  39. package/server/libs/cdpstk.js +1 -1
  40. package/server/libs/ckvt.js +12 -11
  41. package/server/libs/ckvtcapphat.js +5 -5
  42. package/server/libs/ckvtnpp.js +8 -8
  43. package/server/libs/ckvttt.js +6 -5
  44. package/server/libs/ctvt.js +7 -6
  45. package/server/libs/ctvtnpp.js +7 -6
  46. package/server/libs/ctvttt.js +6 -6
  47. package/server/libs/databanle.js +17 -18
  48. package/server/libs/databanle_old.js +18 -0
  49. package/server/libs/databanletheongay.js +25 -29
  50. package/server/libs/dktk.js +3 -3
  51. package/server/libs/dkvt.js +11 -11
  52. package/server/libs/dkvtnpp.js +7 -6
  53. package/server/libs/dkvttt.js +7 -6
  54. package/server/libs/docs.js +72 -36
  55. package/server/libs/dtbanletheosp.js +16 -19
  56. package/server/libs/fifo_dk.js +8 -0
  57. package/server/libs/fifo_group.js +4 -0
  58. package/server/libs/fifo_trace_query.js +12 -0
  59. package/server/libs/getGiaban.js +59 -70
  60. package/server/libs/getGiaban_old.js +70 -0
  61. package/server/libs/joinData.js +3 -3
  62. package/server/libs/joinData_bk.js +44 -0
  63. package/server/libs/kpistatus.js +24 -17
  64. package/server/libs/permission.js +54 -56
  65. package/server/libs/permission_old.js +58 -0
  66. package/server/libs/post-book.js +1 -1
  67. package/server/libs/post-socai.js +2 -1
  68. package/server/libs/post-sokho.js +11 -11
  69. package/server/libs/prototypes.js +13 -12
  70. package/server/libs/queryBuilding.js +11 -10
  71. package/server/libs/redis-cache.js +22 -10
  72. package/server/libs/sctcnkh.js +19 -17
  73. package/server/libs/socaitk.js +1 -1
  74. package/server/libs/thnxt.js +17 -14
  75. package/server/libs/thnxtnpp.js +8 -8
  76. package/server/libs/thnxttt.js +8 -7
  77. package/server/libs/tinhgia1vt_fifo.js +22 -0
  78. package/server/libs/tinhgiafifo.js +28 -0
  79. package/server/libs/utils.js +37 -19
  80. package/server/models/app.js +1 -1
  81. package/server/models/approve.js +8 -8
  82. package/server/models/cacheDataReport.js +2 -2
  83. package/server/models/cacheSessionReport.js +5 -1
  84. package/server/models/cdvt.js +2 -2
  85. package/server/models/checkin.js +2 -2
  86. package/server/models/chitietluongds.js +1 -1
  87. package/server/models/contract.js +1 -1
  88. package/server/models/csluongtheods.js +2 -2
  89. package/server/models/ctds2.js +7 -6
  90. package/server/models/custom_report.js +1 -0
  91. package/server/models/dmdt.js +2 -2
  92. package/server/models/dmkho.js +5 -4
  93. package/server/models/dmnvt.js +5 -4
  94. package/server/models/fifo_dk.js +2 -0
  95. package/server/models/fifo_lot.js +3 -0
  96. package/server/models/fifo_trace.js +4 -0
  97. package/server/models/flowpending.js +2 -0
  98. package/server/models/group.js +3 -5
  99. package/server/models/listinfo.js +61 -33
  100. package/server/models/schedule.js +4 -3
  101. package/server/models/task.js +1 -1
  102. package/server/models/trangthai.js +2 -2
  103. package/server/modules/lists/bg-fifo_dk.js +8 -0
  104. package/server/modules/lists/ls-checkin.js +1 -1
  105. package/server/modules/lists/ls-customer.js +23 -26
  106. package/server/modules/lists/ls-dmbp.js +5 -5
  107. package/server/modules/lists/ls-dmkho.js +7 -1
  108. package/server/modules/lists/ls-dmnhtask.js +1 -1
  109. package/server/modules/lists/ls-dmvt.js +52 -70
  110. package/server/modules/lists/ls-flowpending.js +3 -0
  111. package/server/modules/lists/ls-participant.js +6 -4
  112. package/server/modules/lists/ls-task.js +6 -6
  113. package/server/modules/reports/calc-tinhgiafifo.js +8 -0
  114. package/server/modules/reports/calc-tinhluong.js +17 -16
  115. package/server/modules/reports/rp-baoCaoFifoKy.js +1 -0
  116. package/server/modules/reports/rp-congviectheobp.js +4 -4
  117. package/server/modules/reports/rp-congviectheodt.js +1 -1
  118. package/server/modules/reports/rp-congviectheokh.js +1 -1
  119. package/server/modules/reports/rp-congviectheonv.js +1 -1
  120. package/server/modules/reports/rp-dtbanletheoct.js +22 -23
  121. package/server/modules/reports/rp-dtbanletheokh.js +17 -20
  122. package/server/modules/reports/rp-dtbanletheokho.js +15 -18
  123. package/server/modules/reports/rp-hoahong.js +1 -1
  124. package/server/modules/reports/rp-sctvt.js +1 -1
  125. package/server/modules/reports/rp-sosanhkhvatt2.js +1 -1
  126. package/server/modules/reports/rp-thnxt.js +8 -8
  127. package/server/modules/reports/rp-tongquannvbh.js +1 -1
  128. package/server/modules/systems/sys-app.js +5 -5
  129. 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.info(`[listinfo] [updateSchema] [${listinfo_code}] add field:`,field.name);
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.info("[listinfo][updateModel] update model...",model_code);
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.info("ref fields",fields_have_ref);
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.info("drop current index unique...",old_index_unique);
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.info("create new index unique...",indUq);
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.info("create new index unique...",indUq)
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) return null;
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.info("post dynamic",postInfo.model,data);
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.info("posted dynamic",rs,e)
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.info("support users",supportUsers,user.email.toLowerCase())
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.info("support users",supportUsers,user.email.toLowerCase())
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.info("[listinof] [dynamicUpdating]",_listInfo.code,_listInfo.handle_onupdating_server);
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.info("[listinof] [dynamicUpdating]",_listInfo.code,"không xử lý updating");
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.info("[listinfo][dynamicView] [handle view]",obj.code);
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.info("[listinfo][dynamicView] handle joinview",obj.code,{field_name,ref_name_model,ref_field,ref_label,rows:items_will_join.length});
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.info("[listinfo][dynamicView] [handle join]",obj.code,f.name,ref_name_model,fields);
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
- if(!_listInfo.create_model) return null;
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.info("[listinfo] create new API",api_code);
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
- //Logger.info("create new api",api_code);
1156
+
1150
1157
  _newModel = model.createModel(_listInfo);
1151
- if(!_newModel) return;
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
- //Logger.info("dynamic list",_listInfo.code,"has post")
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 deletePost(_listInfo,obj)
1190
+ return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
1176
1191
  }
1177
- _newList.dynamicPost = async (obj, fn,options)=>{
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.info("[listinfo] update API",api_code);
1203
- //Logger.info("update API",api_code);
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
- //chi xu lydynamic post mot lan de tranh trung du lieu
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 deletePost(_listInfo,obj)
1239
+ return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
1217
1240
  }
1218
- if(!_newList.dynamicPost) _newList.dynamicPost = async (obj, fn,options)=>{
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.dynamicPost = undefined
1240
- _newList.dynamicDeletePost = undefined
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.info("[listinfo] [dynamicUpdating] chọn hàm xử lý updating...",listinfo_code);
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").parseExpression($schedule$$.cron_expression).next().toDate()}catch($err$$){return Logger.error("Error parsing cron expression",
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$$={})=>{try{const $time_run$$=require("cron-parser").parseExpression($cron_expression$$).next().toDate(),$hashString$$=$cron_expression$$+$action$$+JSON.stringify($data$$||{}),$generatedIdLink$$=`cron_${crypto.createHash("md5").update($hashString$$).digest("hex")}`,$id_link$$=$options$$.id_link||$generatedIdLink$$;await model.findOneAndUpdate({id_link:$id_link$$},{$set:{id_link:$id_link$$,title:$options$$.title||`Auto Cron Job: ${$action$$}`,
13
- action:$action$$,data:$data$$,time_run:$time_run$$,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: ${$time_run$$}`)}catch($err$$){Logger.error(`[Schedule] L\u1ed7i khi t\u1ea1o schedule job (Ki\u1ec3m tra l\u1ea1i c\u00fa ph\u00e1p): ${$cron_expression$$}`,$err$$)}};
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: "+
@@ -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:Number,default:0},percent:{type:Number,
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},allow_delete:{type:Boolean,
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"),async=require("async"),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}=
2
- require("mongoose"),getAllChildrenUserGroup=async($id_app$$,$chil_nh_kh_nh_vt_cons$$)=>{let $rs$$=[$chil_nh_kh_nh_vt_cons$$];$chil_nh_kh_nh_vt_cons$$=(await Usergroup.find({id_app:$id_app$$,group_mother:$chil_nh_kh_nh_vt_cons$$,status:!0},{_id:1,group_mother:1}).lean()).filter($n$$=>$n$$._id.toString()!=$n$$.group_mother).map($d$$=>$d$$._id);$chil_nh_kh_nh_vt_cons$$.length>0&&($chil_nh_kh_nh_vt_cons$$=await Promise.all($chil_nh_kh_nh_vt_cons$$.map($nh$$=>getAllChildrenUserGroup($id_app$$,$nh$$))),
3
- $chil_nh_kh_nh_vt_cons$$=$chil_nh_kh_nh_vt_cons$$.reduce(($a$$,$b$$)=>$a$$.concat($b$$),[]),$rs$$=[...$chil_nh_kh_nh_vt_cons$$,...$rs$$]);return $rs$$},customer=function($contr_router$$){$contr_router$$=new controller($contr_router$$,model,"customer",{sort:{ten_kh:-1},unique:["ma_kh"],cache:!0,onFinding:function($user$$,$condition$$,$next$$){if($condition$$.sinh_nhat_ngay||$condition$$.is_birthday){var $currentDay_today$$=new Date($condition$$.sinh_nhat_ngay);const $currentMonth$$=$currentDay_today$$.getMonth()+
4
- 1;$currentDay_today$$=$currentDay_today$$.getDate();const $serverTimezone$$=Intl.DateTimeFormat().resolvedOptions().timeZone;$condition$$.$expr=$condition$$.$expr||{};$condition$$.$expr.$and=$condition$$.$expr.$and||[];$condition$$.$expr.$and.push({$eq:[{$month:{date:"$ngay_sinh",timezone:$serverTimezone$$}},$currentMonth$$]});$condition$$.$expr.$and.push({$eq:[{$dayOfMonth:{date:"$ngay_sinh",timezone:$serverTimezone$$}},$currentDay_today$$]});delete $condition$$.sinh_nhat_ngay;delete $condition$$.is_birthday}async.parallel({user_group:$callback$$=>
5
- {$condition$$.user_group?getAllChildrenUserGroup($condition$$.id_app,$condition$$.user_group).then($groups$$=>{global.getModel("participant").find({id_app:$user$$.current_id_app,group_id:{$in:$groups$$}},{email:1}).then($ps$$=>{$condition$$.phu_trach={$in:$ps$$.map($p$$=>$p$$.email)};delete $condition$$.user_group;$callback$$()}).catch($e$$=>{$callback$$($e$$)})}).catch($e$$=>{$callback$$($e$$)}):$callback$$()},user_of_bp:$callback$$=>{$condition$$.ma_bp?global.getModel("dmbp").getUsersByMaBP($user$$.current_id_app,
6
- $condition$$.ma_bp).then($users$$=>{Logger.info("users of department",$users$$);$condition$$.phu_trach={$in:$users$$};delete $condition$$.ma_bp;$callback$$()}).catch($e$$=>{$callback$$($e$$)}):$callback$$()},nh_kh:$callback$$=>{$condition$$.nh_kh&&typeof $condition$$.nh_kh=="string"?dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$.nh_kh,{status:!0,group_kind:1}).then($nh_kh$$=>{$condition$$.nh_kh={$in:[...(new Set($nh_kh$$))]};$callback$$()}):$callback$$()},nh_kh2:$callback$$=>{$condition$$.nh_kh2&&
7
- typeof $condition$$.nh_kh2=="string"?dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$.nh_kh2,{status:!0,group_kind:2}).then($nh_kh$$=>{$condition$$.nh_kh2={$in:[...(new Set($nh_kh$$))]};$callback$$()}):$callback$$()},nh_kh3:$callback$$=>{$condition$$.nh_kh3&&typeof $condition$$.nh_kh3=="string"?dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$.nh_kh3,{status:!0,group_kind:3}).then($nh_kh$$=>{$condition$$.nh_kh3={$in:[...(new Set($nh_kh$$))]};$callback$$()}):$callback$$()},nh_kh4:$callback$$=>
8
- {$condition$$.nh_kh4&&typeof $condition$$.nh_kh4=="string"?dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$.nh_kh4,{status:!0,group_kind:4}).then($nh_kh$$=>{$condition$$.nh_kh4={$in:[...(new Set($nh_kh$$))]};$callback$$()}):$callback$$()},nh_kh5:$callback$$=>{$condition$$.nh_kh5&&typeof $condition$$.nh_kh5=="string"?dmnhkh.getAllChildrenGroup($condition$$.id_app,$condition$$.nh_kh5,{status:!0,group_kind:5}).then($nh_kh$$=>{$condition$$.nh_kh5={$in:[...(new Set($nh_kh$$))]};$callback$$()}):
9
- $callback$$()}},()=>{$next$$(null,$condition$$)})},onFound:($user$$,$condition$$,$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`);
10
- $next$$(null,$obj$$)},onUpdating:($user$$,$data$$,$obj$$,$next$$)=>{if($data$$.dien_thoai&&!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:function($user$$,$items$$,$next$$,$options$$){$items$$.forEach($item$$=>
11
- {$item$$.email&&!validator.isEmail($item$$.email)&&($item$$.email="");delete $item$$.default_password});async.parallel({user_group:$callback$$=>{$items$$.filter($item$$=>$item$$.of_user&&!$item$$.group_user).joinModel2($user$$.current_id_app,"usergroup",[{where:{of_user:"email"},fields:[{name:"group_user",value:"_id"}]}],function(){$callback$$(null,$items$$)})},pt:$callback$$=>{$items$$.filter($item$$=>$item$$.phu_trach).joinModel2(null,User,[{where:{phu_trach:"email"},fields:[{ten_phu_trach:"name"}]}],
12
- function(){$callback$$()})},nhan_vien_phu_trach:$callback$$=>{$items$$.filter($item$$=>$item$$.phu_trach).joinModel2($user$$.current_id_app,"dmnv",[{where:{phu_trach:"user"},fields:[{ma_nv_phu_trach:"ma_nv"},{ten_nv_phu_trach:"ten_nv"},{ma_bp_nv:"ma_bp"}]}],function(){$callback$$()})},group:$callback$$=>{$items$$.filter($item$$=>$item$$.nh_kh).joinModel2($user$$.current_id_app,group,[{where:{nh_kh:"_id"},fields:[{ten_nh_kh:"group_name"}]}],function(){$callback$$()})},nh_kh2_3_4_5:$callback$$=>{setImmediate(async()=>
13
- {var $ma_nh_kh2_ma_nh_khs_obj_nh_kh$$=$items$$.map($item$$=>$item$$.nh_kh2||[]).reduce(($a$$,$b$$)=>$a$$.concat($b$$),[]);let $ma_nh_kh3$$=$items$$.map($item$$=>$item$$.nh_kh3||[]).reduce(($a$$,$b$$)=>$a$$.concat($b$$),[]),$ma_nh_kh4$$=$items$$.map($item$$=>$item$$.nh_kh4||[]).reduce(($a$$,$b$$)=>$a$$.concat($b$$),[]);$ma_nh_kh2_ma_nh_khs_obj_nh_kh$$=[...$ma_nh_kh2_ma_nh_khs_obj_nh_kh$$,...$ma_nh_kh3$$,...$ma_nh_kh4$$];if($ma_nh_kh2_ma_nh_khs_obj_nh_kh$$.length===0)return $callback$$();$ma_nh_kh2_ma_nh_khs_obj_nh_kh$$=
14
- [...(new Set($ma_nh_kh2_ma_nh_khs_obj_nh_kh$$))];$ma_nh_kh2_ma_nh_khs_obj_nh_kh$$=await group.find({id_app:$user$$.current_id_app,_id:{$in:$ma_nh_kh2_ma_nh_khs_obj_nh_kh$$}},{group_name:1}).lean();let $set_nh_kh$$={};for(let $nh_kh$$ of $ma_nh_kh2_ma_nh_khs_obj_nh_kh$$)$set_nh_kh$$[$nh_kh$$._id.toString()]=$nh_kh$$.group_name;for(let $item$$ of $items$$)$item$$.nh_kh2&&($item$$.ten_nh_kh2=$item$$.nh_kh2.map($kh$$=>$set_nh_kh$$[$kh$$])),$item$$.nh_kh3&&($item$$.ten_nh_kh3=($item$$.nh_kh3||[]).map($kh$$=>
15
- $set_nh_kh$$[$kh$$])),$item$$.nh_kh4&&($item$$.ten_nh_kh4=($item$$.nh_kh4||[]).map($kh$$=>$set_nh_kh$$[$kh$$]));$callback$$()})},npp:$callback$$=>{$items$$.filter($item$$=>$item$$.ma_kho_npp).joinModel2($user$$.current_id_app,"dmkho",[{where:{ma_kho_npp:"ma_kho"},fields:[{ten_kho_npp:"ten_kho"}]}],function(){$callback$$()})},u:$callback$$=>{$items$$.filter($item$$=>$item$$.of_user).joinModel2(null,User,[{where:{of_user:"email"},fields:[{user_name:"name"}]}],function(){$callback$$()})},tt:$callback$$=>
16
- {$items$$.filter($item$$=>$item$$.trang_thai).joinModel2(null,Trangthai,[{where:$item$$=>({ma_trang_thai:$item$$.trang_thai,ma_ct:"CUSTOMER"}),fields:["ten_trang_thai","color"]}],function(){$callback$$()})},ngay_mua:$callback$$=>{$options$$&&$options$$.req&&$options$$.req.query&&(!$options$$.req.query.fields||$options$$.req.query.fields.indexOf("ngay_mua_gan_nhat")>=0||$options$$.req.query.fields.indexOf("ngay_mua_dau_tien")>=0)&&model.updateActives?async.map($items$$.filter($item$$=>$item$$.ngay_mua_gan_nhat===
17
- void 0||!$item$$.ngay_mua_dau_tien||$item$$.ngay_tuong_tac_gan_nhat===void 0),($item$$,$callback$$)=>{model.updateActives($item$$).then($rs$$=>{$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;$callback$$()}).catch($e$$=>{Logger.error($e$$);$callback$$()})},()=>{$callback$$()}):$callback$$()},so_don_hang_bds:$callback$$=>{$options$$&&$options$$.req&&$options$$.req.query&&$options$$.req.query.fields&&$options$$.req.query.fields.indexOf("so_don_hang_bds")>=
18
- 0?async.map($items$$,($item$$,$callback$$)=>{setImmediate(async()=>{$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});$callback$$()})},()=>{$callback$$()}):$callback$$()},note:$callback$$=>{$options$$&&$options$$.req&&$options$$.req.query&&$options$$.req.query.fields&&$options$$.req.query.fields.indexOf("latest_note")>=0?async.map($items$$.filter($i$$=>!$i$$.latest_note),async $c_item$$=>{let $latest_note$$=
19
- await global.getModel("note").findOne({id_app:$c_item$$.id_app,id_link:$c_item$$._id.toString()},{content:1,date_created:1,user_created:1}).sort({date_created:-1}).lean();$latest_note$$&&($c_item$$.latest_note=$latest_note$$,await model.updateOne({_id:$c_item$$._id},{latest_note:$latest_note$$}),$c_item$$=await model.findById($c_item$$._id),redisCache.set("customer",$c_item$$.toObject(),function($e$$){Logger.info("cache customer data",$e$$)}))},()=>{$callback$$()}):$callback$$()}},()=>{$next$$(null,
20
- $items$$)})}});$contr_router$$.validating=async($id_app$jscomp$1_user$$,$obj$$,$next$$,$options$$={})=>{if($options$$.action=="add"&&!$obj$$.ma_kh&&$obj$$.ten_kh){$id_app$jscomp$1_user$$=$id_app$jscomp$1_user$$.current_id_app;try{let $ma_kh$$=await model.asyncCreateCustomerCode($id_app$jscomp$1_user$$,$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",
21
- $obj$$.ten_kh,$e$$),$next$$(`Kh\u00f4ng th\u1ec3 t\u1ea1o m\u00e3 kh\u00e1ch h\u00e0ng, L\u1ed7i: ${$e$$.message||$e$$.error||$e$$}`)}}else $next$$(null,$obj$$)};$contr_router$$.route();$contr_router$$.on("saved",async $data$$=>{let $_usergroup$$;try{let $query_user_group$$={};$data$$.group_user&&isValidObjectId($data$$.group_user)?$query_user_group$$._id=$data$$.group_user:$query_user_group$$.is_customer_group=!0;$_usergroup$$=await Usergroup.getInfo($data$$.id_app,$query_user_group$$)}catch($e$$){return}$data$$.of_user&&
22
- $_usergroup$$&&User.findOne({email:$data$$.of_user},($e$$,$rs$$)=>{if($rs$$)Participant.createParticipant({id_app:$data$$.id_app,email:$data$$.of_user,group_id:$_usergroup$$._id,active:!0},$e$$=>{if($e$$)return Logger.info("can't add user",$data$$.of_user,"to company")});else{var $result$$=new User;$result$$.email=$data$$.of_user;$result$$.name=$data$$.ten_kh;$result$$.email2=$data$$.email;$result$$.local={};$result$$.local.email=$result$$.email;$result$$.local.name=$result$$.name;$result$$.local.picture=
23
- "/images/avatar.jpg";$result$$.local.password=$result$$.generateHash($result$$.email+($data$$.default_password||$result$$.email+"@123456"));$result$$.save($e$$=>{if($e$$)return Logger.info($e$$.message);Participant.createParticipant({id_app:$data$$.id_app,email:$result$$.email,group_id:$_usergroup$$._id,active:!0},$e$$=>{if($e$$)return Logger.info("can't add user",$result$$.email,"to company")})})}})});$contr_router$$.createRoute("qc/sms",async($req$$,$next$$)=>{let $body$$=$req$$.body||{};if(!$body$$.id_account)return $next$$("Thi\u1ebfu t\u00e0i kho\u1ea3n sms");
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.series({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$$)})}});$contr_router$$.route();$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;
5
- 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$$,$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},
6
- {$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$$=$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,
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"),async=require("async");module.exports=function($router$$){(new controller($router$$,model,"dmkho",{sort:{ma_kho:1},unique:["ma_kho"],onView:($user$$,$items$$,$next$$)=>{async.series({kh:$callback$$=>{$items$$.joinModel($user$$.current_id_app,customer,{where:{ma_kh:"ma_kh"},fields:{ten_kh:"ten_kh"}},function(){$callback$$()})}},$e$$=>{$next$$($e$$,$items$$)})}})).route()};
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:2,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&&
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;