flexbiz-server 12.5.27 → 12.5.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "flexbiz-server",
3
3
  "main": "./server/app.js",
4
4
  "description": "Flexible Server",
5
- "version": "12.5.27",
5
+ "version": "12.5.30",
6
6
  "author": {
7
7
  "name": "Van Truong Pham",
8
8
  "email": "invncur@gmail.com"
@@ -21,8 +21,8 @@ $condition$$.$where?(console.log("phai loai bo $where trong condition"),$model$$
21
21
  $req$$.result={rows_number:$data$$,groups_number:$groups_number$$};$callback$$("0")})}else{let $field_not_right$$;try{$field_not_right$$=await permission.getFieldNotRight($req$$.user.current_id_app,$req$$.user.email,$ctrl$$.name)}catch($e$$){$field_not_right$$=[]}$data_log_fields_fields$$=$req$$.query.fields;let $gfields$$={};$data_log_fields_fields$$&&(_.isArray($data_log_fields_fields$$)?$data_log_fields_fields$$.forEach($f$$=>{$f$$!=="_id"&&($gfields$$[$f$$]=1)}):_.isObject($data_log_fields_fields$$)?
22
22
  $gfields$$={...$gfields$$,...$data_log_fields_fields$$}:$data_log_fields_fields$$.split(",").filter($f$$=>$f$$&&$field_not_right$$.indexOf($f$$)<0).forEach($f$$=>{$f$$!=="_id"&&($gfields$$[$f$$]=1)}));$field_not_right$$.forEach($f$$=>{Object.keys($gfields$$).find($k$$=>$gfields$$[$k$$]==1)?delete $gfields$$[$f$$]:$gfields$$[$f$$]=0});!$data_log_fields_fields$$&&(($data_log_fields_fields$$=$req$$.query.notfields)&&(_.isArray($data_log_fields_fields$$)?$data_log_fields_fields$$.forEach($f$$=>{$f$$&&
23
23
  $f$$!=="_id"&&(Object.keys($gfields$$).find($k$$=>$gfields$$[$k$$]==1)?delete $gfields$$[$f$$]:$gfields$$[$f$$]=0)}):_.isObject($data_log_fields_fields$$)?$gfields$$={...$gfields$$,...$data_log_fields_fields$$}:$data_log_fields_fields$$.split(",").forEach($f$$=>{$f$$&&$f$$!=="_id"&&(Object.keys($gfields$$).find($k$$=>$gfields$$[$k$$]==1)?delete $gfields$$[$f$$]:$gfields$$[$f$$]=0)})),$shareRoute$$||$req$$.user.email==="public")&&(Object.keys($gfields$$).find($k$$=>$gfields$$[$k$$]==1)?(delete $gfields$$.dataview_to,
24
- delete $gfields$$.dataview_to_users):($gfields$$.dataview_to=0,$gfields$$.dataview_to_users=0));$condition$$.$text&&($gfields$$||={},$gfields$$.textScore={$meta:"textScore"});delete $req$$.query_cache;$ctrl$$.cache&&($req$$.query_cache={..._.cloneDeep($req$$.query),..._.cloneDeep($condition$$)},delete $req$$.query_cache.q,delete $req$$.query_cache.refresh_required,$req$$.query_cache.gfields=_.cloneDeep($gfields$$));const $fetchData$$=($condition$$,$limit$$,$page$$,$callback$$)=>{$ctrl$$.name=="dmchietkhau"&&
25
- console.log("[findHandler] [fetchData]",$ctrl$$.name,$condition$$);setImmediate(async()=>{let $query$$;if($req$$.query.group||$req$$.query.project||$req$$.query.match||$req$$.query.aggregate||$req$$.query.$aggregate)try{if($req$$.query.aggregate){var $aggregate_piples_sort$$=JSONParser($req$$.query.$aggregate||$req$$.query.aggregate);if(!Array.isArray($aggregate_piples_sort$$))return $callback$$({error:"Aggregate ph\u1ea3i l\u00e0 m\u1ed9t m\u1ea3ng"});if($aggregate_piples_sort$$.find($f$$=>$f$$.$lookup))return $callback$$({error:"Kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p s\u1eed d\u1ee5ng $lookup trong aggregate"});
24
+ delete $gfields$$.dataview_to_users):($gfields$$.dataview_to=0,$gfields$$.dataview_to_users=0));$condition$$.$text&&($gfields$$||={},$gfields$$.textScore={$meta:"textScore"});delete $req$$.query_cache;$ctrl$$.cache&&($req$$.query_cache={..._.cloneDeep($req$$.query),..._.cloneDeep($condition$$)},delete $req$$.query_cache.q,delete $req$$.query_cache.refresh_required,$req$$.query_cache.gfields=_.cloneDeep($gfields$$));const $fetchData$$=($condition$$,$limit$$,$page$$,$callback$$)=>{setImmediate(async()=>
25
+ {let $query$$;if($req$$.query.group||$req$$.query.project||$req$$.query.match||$req$$.query.aggregate||$req$$.query.$aggregate)try{if($req$$.query.aggregate){var $aggregate_piples_sort$$=JSONParser($req$$.query.$aggregate||$req$$.query.aggregate);if(!Array.isArray($aggregate_piples_sort$$))return $callback$$({error:"Aggregate ph\u1ea3i l\u00e0 m\u1ed9t m\u1ea3ng"});if($aggregate_piples_sort$$.find($f$$=>$f$$.$lookup))return $callback$$({error:"Kh\u00f4ng \u0111\u01b0\u1ee3c ph\u00e9p s\u1eed d\u1ee5ng $lookup trong aggregate"});
26
26
  $aggregate_piples_sort$$=[{$match:$condition$$},...$aggregate_piples_sort$$];$query$$=$model$$.aggregate($aggregate_piples_sort$$)}else{$query$$=$model$$.aggregate([{$match:$condition$$}]);let $group$$;$req$$.query.group&&($group$$=JSONParser($req$$.query.group),$query$$.group($group$$));if($req$$.query.match){let $match$$=JSONParser($req$$.query.match);$query$$.match($match$$)}let $project$$;if($req$$.query.project)$project$$=JSONParser($req$$.query.project),$query$$.project($project$$);else if($gfields$$&&
27
27
  Object.keys($gfields$$).length>0)$project$$=$gfields$$;else if($project$$={_id:1},$group$$)for(let $key$$ in $group$$)$project$$[$key$$]=1;$query$$.project($project$$)}}catch($e$$){return console.error("[findHanlder]",$e$$,$req$$.query),$callback$$({error:$e$$.message||$e$$.error||$e$$})}else _.has($model$$.schema.paths,"id_app")&&Object.keys($gfields$$).length>0&&Object.keys($gfields$$).find($k$$=>$gfields$$[$k$$]==1)&&($gfields$$.id_app=1),$query$$=$model$$.find($condition$$,$gfields$$);$aggregate_piples_sort$$=
28
28
  $req$$.sort;if(!$aggregate_piples_sort$$)$gfields$$.textScore&&($aggregate_piples_sort$$={textScore:{$meta:"textScore"}});else for(var $key$$ in $aggregate_piples_sort$$)if($key$$!=="textScore"&&$aggregate_piples_sort$$[$key$$]!=1&&$aggregate_piples_sort$$[$key$$]!=-1)return console.error("sort is valid",$aggregate_piples_sort$$,$key$$,$aggregate_piples_sort$$[$key$$]),$callback$$({error:`Sort ${JSON.stringify($aggregate_piples_sort$$)} is not valid`});$aggregate_piples_sort$$&&Object.keys($aggregate_piples_sort$$).length>
@@ -1,7 +1,7 @@
1
1
  const lodash=require("lodash"),{runWithoutSession}=require("./sessionContext");let cachedKeys={};try{cachedKeys=require("./redis-cache").cachedKeys()}catch($e$$){console.warn("Redis cache config not found, caching disabled.")}
2
2
  const {generateRedisKey,sortObjectKeys}=require("./redis-cache"),redisGet=$key$$=>new Promise($resolve$$=>global.clientRedis.get($key$$,($err$$,$reply$$)=>$resolve$$($reply$$||null))),redisMGet=$keys$$=>new Promise($resolve$$=>global.clientRedis.mget($keys$$,($err$$,$reply$$)=>$resolve$$($reply$$||[])));function isValidObjectId($id$$){return $id$$?lodash.isObject($id$$)&&!$id$$._bsontype?!0:global.mongoose.Types.ObjectId.isValid($id$$.toString()):!1}
3
- function findDynamicFields($dataArray$$){if(!$dataArray$$||$dataArray$$.length<2)return[];const $baseline$$=$dataArray$$[0],$dynamicFields$$=new Set;for(let $i$$=1;$i$$<$dataArray$$.length;$i$$++){const $currentObject$$=$dataArray$$[$i$$];var $currentValue_keys$$=Object.keys($currentObject$$);for(const $key$$ of $currentValue_keys$$)$dynamicFields$$.has($key$$)||($currentValue_keys$$=$currentObject$$[$key$$],JSON.stringify($baseline$$[$key$$])!==JSON.stringify($currentValue_keys$$)&&$dynamicFields$$.add($key$$))}return Array.from($dynamicFields$$)}
4
- function getFields($fields$$){if($fields$$&&!lodash.isFunction($fields$$)){var $select$$={};(Array.isArray($fields$$)?$fields$$:[$fields$$]).forEach($map$$=>{lodash.isString($map$$)?$select$$[$map$$]=1:lodash.isObject($map$$)&&($map$$.value?$select$$[$map$$.value]=1:Object.keys($map$$).forEach($key$$=>$select$$[$map$$[$key$$]]=1))});return Object.keys($select$$).length>0?$select$$:void 0}}
3
+ function findDynamicFields($dataArray$$){if(!$dataArray$$||$dataArray$$.length<2)return[];const $baseline$$=$dataArray$$[0],$dynamicFields$$=new Set;for(let $i$$=1;$i$$<$dataArray$$.length;$i$$++){const $currentObject$$=$dataArray$$[$i$$];var $currentValue_keys$$=Object.keys($currentObject$$);for(const $key$$ of $currentValue_keys$$)$dynamicFields$$.has($key$$)||($currentValue_keys$$=$currentObject$$[$key$$],$currentValue_keys$$!==null&&typeof $currentValue_keys$$==="object"||$baseline$$[$key$$]===
4
+ $currentValue_keys$$||$dynamicFields$$.add($key$$))}return Array.from($dynamicFields$$)}function getFields($fields$$){if($fields$$&&!lodash.isFunction($fields$$)){var $select$$={};(Array.isArray($fields$$)?$fields$$:[$fields$$]).forEach($map$$=>{lodash.isString($map$$)?$select$$[$map$$]=1:lodash.isObject($map$$)&&($map$$.value?$select$$[$map$$.value]=1:Object.keys($map$$).forEach($key$$=>$select$$[$map$$[$key$$]]=1))});return Object.keys($select$$).length>0?$select$$:void 0}}
5
5
  function normalizeArgs($items$$,$id_app$$,$model$$,$joinFields$$,$_fn_fn$$,$options$$){let $_id_app$$=$id_app$$,$_model$$=$model$$,$_joinFields$$=$joinFields$$;Array.isArray($id_app$$)&&([$_id_app$$,$_model$$,$_joinFields$$,$_fn_fn$$]=[void 0,$id_app$$,$model$$,$joinFields$$]);$_joinFields$$=$_joinFields$$?Array.isArray($_joinFields$$)?$_joinFields$$:[$_joinFields$$]:[];$_joinFields$$.forEach($join$$=>{$join$$.fields_need_get_data||$join$$.setFields||$join$$.asyncSetFields||($join$$.fields_need_get_data=
6
6
  getFields($join$$.fields))});return{items:$items$$||[],id_app:$_id_app$$,modelOrigin:Array.isArray($_model$$)?null:$_model$$,joinFields:$_joinFields$$,fn:$_fn_fn$$||(()=>{}),options:$options$$||{cache:!0}}}function safeCallback($fn$$,$result$$){try{typeof $fn$$==="function"&&$fn$$($result$$)}catch($e$$){console.error("Callback Error:",$e$$)}}
7
7
  function analyzeJoinStrategy($dynamicKey$jscomp$1_finalIdApp_join$$,$item$$,$model$$,$globalIdApp$$){$dynamicKey$jscomp$1_finalIdApp_join$$.modelName=$model$$?.modelName;var $cacheKey_cacheKey$jscomp$1_finalIdApp$jscomp$1_resolveIdApp_sortedStatic$jscomp$1_value$$=$currentQueryIdApp$$=>{if($model$$.schema?.paths?.id_app)return $item$$.id_app||$globalIdApp$$||$currentQueryIdApp$$},$dynamicKey_queryForKey_v$$={},$finalIdAppForKey_queryForKey$$=$globalIdApp$$;if($dynamicKey$jscomp$1_finalIdApp_join$$.where&&
@@ -18,8 +18,6 @@ round))});let $nam$$=(new Date($master$$.ngay_ct)).getFullYear(),$thang$$=(new D
18
18
  $giatb_qd$$.mau:$giatb_qd$$.ty_le_qd);$giatb_qd$$={ma_vt:$p$$.ma_vt,nam:$nam$$,thang:$thang$$,ma_kho:{$in:[$p$$.ma_kho,"",null]}};if($giatb_qd$$=await global.getModel("giatb").findOne($giatb_qd$$).sort({ma_kho:-1}).lean())$p$$.gia_von_nt=$p$$.gia_von=($giatb_qd$$.gia||0)*$he_so_qd$$,$p$$.tien_xuat_nt=$p$$.tien_xuat=($p$$.sl_xuat||0)*$p$$.gia_von_nt,$p$$.tien_nhap_nt=$p$$.tien_nhap=($p$$.sl_nhap||0)*$p$$.gia_von_nt,$callback$$();else{let $condition$$={id_app:$master$$.id_app,ma_vt:$p$$.ma_vt,ma_kho:$p$$.ma_kho};
19
19
  $condition$$.tu_ngay=moment($master$$.ngay_ct).startOf("month").toDate();$condition$$.den_ngay=moment($master$$.ngay_ct).endOf("month").toDate();tinhgiatb($condition$$,($e$$,$giatb$$)=>{$e$$&&console.error("[postSokho] Kh\u00f4ng th\u1ec3 t\u00ednh gi\u00e1 trung b\u00ecnh",$e$$.message||$e$$.error||$e$$,$condition$$);$p$$.gia_von_nt=$rs$$?$p$$.gia_von=($giatb$$.gia||0)*$he_so_qd$$:$p$$.gia_von=0;$p$$.tien_xuat_nt=$p$$.tien_xuat=($p$$.sl_xuat||0)*$p$$.gia_von_nt;$p$$.tien_nhap_nt=$p$$.tien_nhap=($p$$.sl_nhap||
20
20
  0)*$p$$.gia_von_nt;$callback$$()})}})},()=>{$rs$$()})});$details$$=$details$$.map(($detail$$,$line$$)=>{$detail$$.id_ct=$master$$._id.toString();$detail$$.ma_ct=$master$$.ma_ct;$detail$$.so_ct=$master$$.so_ct;$detail$$.ngay_ct=$master$$.ngay_ct;for(let $attr$$ in global.getModel("sokho").schema.paths)if($attr$$!="id_ct"&&$attr$$!="_id"&&$attr$$!="__v"&&$attr$$!="date_updated"&&$attr$$!="date_created"){let $v$$=$detail$$[$attr$$];$v$$!==void 0&&$v$$!==null&&$v$$!==""||$v$$===0||$master$$[$attr$$]===
21
- void 0||($detail$$[$attr$$]=$master$$[$attr$$])}$detail$$.line=$line$$;delete $detail$$.toObject;delete $detail$$._id;delete $detail$$.__v;return $detail$$});await $details$$.asyncJoinModel2($master$$.id_app,"dmkho",{where:"ma_kho",fields:"la_kho_npp"});const $self$$=this;$self$$.remove(async $error$$=>{if($error$$)return console.error("[postSokho] error delete data post",$error$$.message||$error$$.error||$error$$,$master$$.so_ct,$master$$.ma_ct),$callback$$($error$$);if($details$$.length==0)return $callback$$(null,
22
- []);try{let $data_sokho$$=$details$$.filter($d$$=>$d$$.tg_tk&&!$d$$.la_kho_npp),$rs_sokho$$=await global.getModel("sokho").create($data_sokho$$),$data_sokhonpp$$=$details$$.filter($d$$=>$d$$.tg_tk&&$d$$.la_kho_npp),$rs_sokhnpp$$=await global.getModel("sokhonpp").create($data_sokhonpp$$),$data_sokhokhongton$$=$details$$.filter($d$$=>$d$$.tg_tk==0),$rs_sokhokhongton$$=await global.getModel("sokhokhongton").create($data_sokhokhongton$$);if($master$$.ma_ct){let $contr$$=global.controllers[$master$$.ma_ct.toUpperCase()];
23
- $contr$$?await $contr$$.model.findById($master$$._id)?$callback$$(null,{rs_sokho:$rs_sokho$$,rs_sokhnpp:$rs_sokhnpp$$,rs_sokhokhongton:$rs_sokhokhongton$$}):(console.error("[postSokho] Ch\u1ee9ng t\u1eeb kh\u00f4ng t\u1ed3n t\u1ea1i. X\u00f3a s\u1ed5 s\u00e1ch",$master$$._id,$master$$.so_ct,$master$$.ma_ct),$self$$.remove(()=>{$callback$$("Ch\u1ee9ng t\u1eeb kh\u00f4ng t\u1ed3n t\u1ea1i")})):(console.log("[postSokho] not found controller",$master$$.ma_ct.toUpperCase()),$callback$$(null,{rs_sokho:$rs_sokho$$,
24
- rs_sokhnpp:$rs_sokhnpp$$,rs_sokhokhongton:$rs_sokhokhongton$$}))}else $callback$$(null,{rs_sokho:$rs_sokho$$,rs_sokhnpp:$rs_sokhnpp$$,rs_sokhokhongton:$rs_sokhokhongton$$});$rs_sokho$$&&setImmediate(()=>{tontucthoi.tinhTonTucThoi($rs_sokho$$,$e$$=>{$e$$&&console.error("L\u1ed7i t\u00ednh t\u1ed3n t\u1ee9c th\u1eddi v\u1eadt t\u01b0",$rs_sokho$$,$e$$.message||$e$$.error||$e$$,$master$$.so_ct,$master$$.ma_ct)})})}catch($e$$){console.error("[postSokho] \u0110\u00e3 c\u00f3 l\u1ed7i khi post sokho",$e$$),
25
- $callback$$($e$$)}})};module.exports=post;
21
+ void 0||($detail$$[$attr$$]=$master$$[$attr$$])}$detail$$.line=$line$$;delete $detail$$.toObject;delete $detail$$._id;delete $detail$$.__v;return $detail$$});await $details$$.asyncJoinModel2($master$$.id_app,"dmkho",{where:"ma_kho",fields:"la_kho_npp"});this.remove(async $error$$=>{if($error$$)return console.error("[postSokho] error delete data post",$error$$.message||$error$$.error||$error$$,$master$$.so_ct,$master$$.ma_ct),$callback$$($error$$);if($details$$.length==0)return $callback$$(null,[]);
22
+ try{let $data_sokho$$=$details$$.filter($d$$=>$d$$.tg_tk&&!$d$$.la_kho_npp),$rs_sokho$$=await global.getModel("sokho").create($data_sokho$$),$data_sokhonpp$$=$details$$.filter($d$$=>$d$$.tg_tk&&$d$$.la_kho_npp),$rs_sokhnpp$$=await global.getModel("sokhonpp").create($data_sokhonpp$$),$data_sokhokhongton$$=$details$$.filter($d$$=>$d$$.tg_tk==0),$rs_sokhokhongton$$=await global.getModel("sokhokhongton").create($data_sokhokhongton$$);$callback$$(null,{rs_sokho:$rs_sokho$$,rs_sokhnpp:$rs_sokhnpp$$,rs_sokhokhongton:$rs_sokhokhongton$$});
23
+ $rs_sokho$$&&setImmediate(()=>{tontucthoi.tinhTonTucThoi($rs_sokho$$,$e$$=>{$e$$&&console.error("L\u1ed7i t\u00ednh t\u1ed3n t\u1ee9c th\u1eddi v\u1eadt t\u01b0",$rs_sokho$$,$e$$.message||$e$$.error||$e$$,$master$$.so_ct,$master$$.ma_ct)})})}catch($e$$){console.error("[postSokho] \u0110\u00e3 c\u00f3 l\u1ed7i khi post sokho",$e$$),$callback$$($e$$)}})};module.exports=post;
@@ -0,0 +1,2 @@
1
+ const csphucapSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},ds_nv:[String],ds_bp:[String],phu_cap:[],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:""}});
2
+ (global.configs||{}).createIndexes&&(csphucapSchema.index({id_app:1,ds_nv:1}),csphucapSchema.index({id_app:1,ds_bp:1}),csphucapSchema.index({id_app:1,status:1}),csphucapSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1}));module.exports=mongoose.models.csphucap||mongoose.model("csphucap",csphucapSchema);
@@ -1,6 +1,6 @@
1
1
  const dmbpSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},ma_bp:{type:String,required:!0,uppercase:!0,maxlength:32},ten_bp:{type:String,required:!0,maxlength:1024},phu_trach:{type:String,uppercase:!0,maxlength:1024},ten_phu_trach:String,phoi_hop:{type:String,uppercase:!0,maxlength:1024},ma_bp_me:{type:String,uppercase:!0,maxlength:32},ma_bp_tuong_tac:[String],nhiem_vu:{type:String},tk_cp_luong:String,tk_pt_nv:String,tk_thue_tncn:String,ma_phi:String,tinh_luong_theo_ngay:Boolean,
2
- ma_loai_cong_mac_dinh:String,sysorder:String,bac:{type:Number},loai_nh:{type:Number,default:1},la_cong_doan_sx:{type:Boolean,default:!1},stt:Number,exfields:Schema.Types.Mixed,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],dataview_to:{type:Number,default:0},
3
- dataview_to_users:[String]},{toJSON:{virtuals:!0}});
2
+ ma_loai_cong_mac_dinh:String,sysorder:String,bac:{type:Number},loai_nh:{type:Number,default:1},phu_cap:[],la_cong_doan_sx:{type:Boolean,default:!1},stt:Number,exfields:Schema.Types.Mixed,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],dataview_to:{type:Number,
3
+ default:0},dataview_to_users:[String]},{toJSON:{virtuals:!0}});
4
4
  (global.configs||{}).createIndexes&&(dmbpSchema.index({id_app:1,ma_bp:1},{unique:!0}),dmbpSchema.index({id_app:1,ma_bp:1,ten_bp:1}),dmbpSchema.index({id_app:1,ma_bp:1,ten_bp:1,sysorder:1,bac:1,loai_nh:1}),dmbpSchema.index({id_app:1,phu_trach:1,ten_phu_trach:1}),dmbpSchema.index({id_app:1,status:1}),dmbpSchema.index({id_app:1,ma_bp_me:1}),dmbpSchema.index({id_app:1,ma_bp_tuong_tac:1}),dmbpSchema.index({id_app:1,nhiem_vu:1}),dmbpSchema.index({id_app:1,ma_loai_cong_mac_dinh:1}),dmbpSchema.index({id_app:1,
5
5
  user_created:1,visible_to:1,visible_to_users:1,status:1}),dmbpSchema.index({id_app:1,ma_bp:"text",ten_bp:"text",phu_trach:"text",ten_phu_trach:"text"},{name:"dmbp_index_text"}));const model=mongoose.models.dmbp||mongoose.model("dmbp",dmbpSchema);
6
6
  model.referenceKeys={ma_bp:[{model:"socai",key:"ma_bp",error:"B\u1ed9 ph\u1eadn {{VALUE}} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong s\u1ed5 c\u00e1i"},{model:"chamcong",key:"ma_bp",error:"B\u1ed9 ph\u1eadn {{VALUE}} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong b\u1ea3ng ch\u1ea5m c\u00f4ng"},{model:"bangtinhluong",key:"ma_bp",error:"B\u1ed9 ph\u1eadn {{VALUE}} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong b\u1ea3ng t\u00ednh l\u01b0\u01a1ng"},{model:"qts",key:"ma_bp",error:"B\u1ed9 ph\u1eadn {{VALUE}} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong qu\u1ea3n l\u00fd t\u00e0i s\u1ea3n"},
@@ -3,4 +3,4 @@ maxlength:32},ma_nv:{type:String,uppercase:!0,default:"",maxlength:32},ma_kho:{t
3
3
  const pclSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},ma_dvcs:{type:String,required:!0,maxlength:1024},ma_ct:{type:String,default:"PCL",required:!0,uppercase:!0,maxlength:32},ma_gd:{type:String,default:"0",maxlength:32},so_ct:{type:String,required:!0,uppercase:!0,trim:!0,maxlength:32},ngay_ct:{type:Date,default:Date.now,required:!0},ky:{type:Number,required:!0},nam:{type:Number,required:!0},dot:{type:Number,required:!0},ty_le:{type:Number,required:!0},tk_co:{type:String,required:!0,
4
4
  uppercase:!0,maxlength:32},ma_nt:{type:String,required:"ma_nt is required",default:"VND",trim:!0,uppercase:!0,maxlength:32},ty_gia:{type:Number,required:!0,min:0,default:1},dien_giai:{type:String,default:"",maxlength:1024},exfields:Schema.Types.Mixed,trang_thai:{type:String,maxlength:32},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,
5
5
  default:0},visible_to_users:[String],update_right:[String],delete_right:[String],details:{type:[detailSchema]},ma_kho:String,ten_kho:String});pclSchema.validate={ma_dvcs:validator.existsDvcs,ma_nt:validator.existsNt,ngay_ct:validator.unlockBook};
6
- (global.configs||{}).createIndexes&&(pclSchema.index({id_app:1,ma_dvcs:1,so_ct:-1,ngay_ct:-1}),pclSchema.index({dien_giai:"text",so_ct:"text"}),pclSchema.index({ma_ct:1}),pclSchema.index({user_created:1,date_created:-1}),pclSchema.index({date_updated:-1}),pclSchema.index({status:1}),pclSchema.index({user_created:1,visible_to:1,visible_to_users:1}),pclSchema.index({trang_thai:1}));module.exports=mongoose.models.pcl||mongoose.model("pcl",pclSchema);
6
+ (global.configs||{}).createIndexes&&(pclSchema.index({id_app:1,ma_ct:1,so_ct:-1,ngay_ct:-1}),pclSchema.index({id_app:1,dien_giai:"text",so_ct:"text"}),pclSchema.index({id_app:1,nam:-1,ky:-1}),pclSchema.index({id_app:1,nam:-1,ky:-1,"details.ma_nv":1}),pclSchema.index({id_app:1,status:1}),pclSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1,trang_thai:1}),pclSchema.index({id_app:1,trang_thai:1}));module.exports=mongoose.models.pcl||mongoose.model("pcl",pclSchema);
@@ -2,5 +2,4 @@ const validAccount=require("../libs/validator-account"),validator=require("../li
2
2
  maxlength:32},ma_dt:{type:String,uppercase:!0,default:"",maxlength:32},ma_nv:{type:String,uppercase:!0,default:"",maxlength:32},ma_kho:{type:String,uppercase:!0,default:"",maxlength:32},exfields_detail:Schema.Types.Mixed,line:{type:Number,default:0}});detailSchema.validate={tk_no:validAccount.existsTk,tk_co:validAccount.existsTk};
3
3
  const ptlSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},ma_dvcs:{type:String,required:!0,maxlength:1024},ma_ct:{type:String,default:"PTL",required:!0,uppercase:!0,maxlength:32},ma_gd:{type:String,default:"0",maxlength:32},so_ct:{type:String,required:!0,uppercase:!0,trim:!0,maxlength:32},ngay_ct:{type:Date,default:Date.now,required:!0},ma_nt:{type:String,required:"ma_nt is required",default:"VND",trim:!0,uppercase:!0,maxlength:32},ty_gia:{type:Number,required:!0,min:0,default:1},
4
4
  dien_giai:{type:String,default:"",maxlength:1024},exfields:Schema.Types.Mixed,trang_thai:{type:String,maxlength:32},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],details:{type:[detailSchema]},ma_kho:String,ten_kho:String});
5
- ptlSchema.validate={ma_dvcs:validator.existsDvcs,ma_nt:validator.existsNt,ngay_ct:validator.unlockBook};(global.configs||{}).createIndexes&&(ptlSchema.index({id_app:1,ma_dvcs:1,so_ct:-1,ngay_ct:-1}),ptlSchema.index({dien_giai:"text",so_ct:"text"}),ptlSchema.index({ma_ct:1}),ptlSchema.index({user_created:1,date_created:-1}),ptlSchema.index({date_updated:-1}),ptlSchema.index({status:1}),ptlSchema.index({user_created:1,visible_to:1,visible_to_users:1}),ptlSchema.index({trang_thai:1}));
6
- module.exports=mongoose.models.ptl||mongoose.model("ptl",ptlSchema);
5
+ ptlSchema.validate={ma_dvcs:validator.existsDvcs,ma_nt:validator.existsNt,ngay_ct:validator.unlockBook};(global.configs||{}).createIndexes&&(ptlSchema.index({id_app:1,ma_ct:1,so_ct:-1,ngay_ct:-1}),ptlSchema.index({id_app:1,dien_giai:"text",so_ct:"text"}),ptlSchema.index({id_app:1,ma_ct:1}),ptlSchema.index({id_app:1,user_created:1,visible_to:1,visible_to_users:1,trang_thai:1}),ptlSchema.index({id_app:1,trang_thai:1}));module.exports=mongoose.models.ptl||mongoose.model("ptl",ptlSchema);
@@ -1,336 +1,24 @@
1
- const model = global.getModel('checkin');
2
- const customer = global.getModel('customer');
3
- const moment = require("moment");
4
- const dmnv = global.getModel('dmnv');
5
- const chamcong = global.getModel('chamcong');
6
- const User = global.getModel('user');
7
- const controller = require('../../controllers/controller');
8
- const PostBook = require('../../libs/post-book');
9
-
10
- function deg2rad(deg) {
11
- return deg * (Math.PI / 180);
12
- }
13
-
14
- function getDistanceFromLatLonInM(lat1, lon1, lat2, lon2) {
15
- const R = 6371000; // Bán kính trái đất tính bằng mét
16
- const dLat = deg2rad(lat2 - lat1);
17
- const dLon = deg2rad(lon2 - lon1);
18
- const a =
19
- Math.sin(dLat / 2) * Math.sin(dLat / 2) +
20
- Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
21
- Math.sin(dLon / 2) * Math.sin(dLon / 2);
22
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
23
- const d = R * c; // Khoảng cách theo mét
24
- return d;
25
- }
26
- const postData = async (obj,callback)=>{
27
- if(obj.trang_thai!="1") return callback();
28
- if(global.configs?.required_device_id && !obj.device_id) return callback("Cần thông tin ID của thiết bị (device_id)");
29
- //Tìm nhân viên theo device_user_id
30
- const nv = await global.getModel("dmnv").findOne({
31
- id_app:obj.id_app,
32
- $or:[
33
- {device_user_id:obj.device_user_id},
34
- {user:obj.device_user_id}
35
- ]
36
- }).lean();
37
- if(!nv){
38
- //console.error("Nhân viên không tồn tại",{id_app:obj.id_app,device_user_id:obj.device_user_id})
39
- return callback(`Chưa khai báo thông tin nhân viên cho '${obj.device_user_id}'.`);
40
- }
41
- //Kiểm tra id thiết bị
42
- if(nv.trusted_device_id){
43
- if(nv.trusted_device_id!=obj.device_id){
44
- return callback(`Thiết bị chấm công không hợp lệ. Bạn cần dùng thiết bị đã chấm công lần trước hoặc liên hệ với admin để đăng ký thiết bị mới.`);
45
- }else{
46
- nv.trusted_device_id = obj.device_id;
47
- }
48
- }
49
- //Kiểm tra xem device_id này đã được sử dụng cho nhân viên nào khác không? nếu có thì không cho phép
50
- if(obj.device_id){
51
- const nv_device_id = await global.getModel("dmnv").findOne({id_app:obj.id_app,trusted_device_id:obj.device_id},{_id:1}).lean();
52
- if(nv_device_id && nv_device_id._id!==nv._id){
53
- return callback(`Thiết bị này đã được sử dụng để chấm cho nhân viên khác. Nếu bạn cần thay đổi hãy liên hệ với admin.`);
54
- }
55
- }
56
- // Kiểm tra xem dữ liệu gửi lên có toạ độ không
57
- if (obj.location && obj.location.latitude && obj.location.longitude) {
58
- //Lấy thông tin chi nhánh của nhân viên đó
59
- let chiNhanh = null;
60
- if (nv.ma_cn) {
61
- chiNhanh = await global.getModel("dmchinhanh").findOne({
62
- id_app: obj.id_app,
63
- ma_cn: nv.ma_cn,
64
- status: true
65
- }).lean();
66
- }
67
- if(!chiNhanh){
68
- return callback("Chưa khai báo chi nhánh làm việc cho nhân viên này");
69
- }
70
- if(!chiNhanh.location || !chiNhanh.location.latitude || !chiNhanh.location.longitude){
71
- return callback(`Chưa khai báo vị trí của chi nhánh ${chiNhanh.ten_cn}`);
72
- }
73
- //Tính khoảng cách
74
- const distance = getDistanceFromLatLonInM(
75
- obj.location.latitude,
76
- obj.location.longitude,
77
- chiNhanh.location.latitude,
78
- chiNhanh.location.longitude
79
- );
80
- const max_radius = chiNhanh.location.allowed_radius || 50;
81
- if (distance > max_radius) {
82
- // Kiểm tra nếu KHÔNG có mã khách hàng (tức là chấm công tại văn phòng nhưng bị xa)
83
- if (!obj.ma_kh) {
84
- console.warn(`[CheckIn Fail] Distance: ${distance}m. User: ${obj.device_user_id}`);
85
- return callback(`Vị trí chấm công không hợp lệ. Bạn đang cách công ty ${Math.round(distance)}m (Cho phép: ${max_radius}m).`);
86
- }
87
- // Nếu có obj.ma_kh -> Hợp lệ (đi công tác/gặp khách hàng), code chạy tiếp xuống dưới...
88
- }
89
- } else {
90
- if(global.configs?.required_device_id ) return callback("Không xác định được vị trí của bạn.");
91
- }
92
- //Xác định thời gian vào ra
93
- let cac_lan_cham_cong_trong_ngay = await model.find({
94
- id_app: obj.id_app,
95
- device_user_id: obj.device_user_id,
96
- record_time:{
97
- $gte:moment(obj.record_time).startOf("date").toDate(),
98
- $lte:moment(obj.record_time).endOf("date").toDate(),
99
- }
100
- }).inTxn().sort({record_time:1}).lean();
101
- //
102
- let gio_vao,gio_ra,tong_gio_lam,ma_loai_cong;
103
- if(cac_lan_cham_cong_trong_ngay.length>0){
104
- gio_vao = cac_lan_cham_cong_trong_ngay[0].record_time;
105
- }
106
- if(cac_lan_cham_cong_trong_ngay.length>1){
107
- gio_ra = cac_lan_cham_cong_trong_ngay[cac_lan_cham_cong_trong_ngay.length-1].record_time;
108
- }
109
- if(gio_vao && gio_ra){
110
- tong_gio_lam = moment(gio_ra).diff(moment(gio_vao),"hours");
111
- }else{
112
- tong_gio_lam =0;
113
- }
114
- //Xác định mã loại công dựa vào thời gian làm việc
115
- if (gio_vao) {
116
- let ngay_trong_tuan = moment(obj.record_time).day().toString();
117
- // 1. Query các điều kiện cứng (không dính đến so sánh giờ cụ thể)
118
- const query_loai_cong = {
119
- id_app: obj.id_app,
120
- status: true,
121
- $and: [
122
- // Kiểm tra ngày trong tuần
123
- {
124
- $or: [
125
- { nhung_ngay_trong_tuan: { $exists: false } },
126
- { nhung_ngay_trong_tuan: ngay_trong_tuan }
127
- ]
128
- },
129
- // Kiểm tra tổng giờ làm tối đa
130
- {
131
- $or: [
132
- { tong_gio_lam_den: { $gte: tong_gio_lam } },
133
- { tong_gio_lam_den: 0 }
134
- ],
135
- },
136
- // Kiểm tra tổng giờ làm tối thiểu
137
- {
138
- $or: [
139
- { tong_gio_lam_tu: { $lte: tong_gio_lam } },
140
- { tong_gio_lam_tu: 0 }
141
- ]
142
- }
143
- ]
144
- };
145
-
146
- // 2. Lấy danh sách các ứng viên (Candidates)
147
- let candidates = await global.getModel("dmloaicong")
148
- .find(query_loai_cong)
149
- .sort({ tong_gio_lam_tu: -1, ngay_cong: -1 })
150
- .lean();
151
-
152
- // 3. Hàm helper để lấy số phút từ đầu ngày (00:00 -> Time)
153
- const getMinutesFromMidnight = (dateStr) => {
154
- if (!dateStr) return null;
155
- const m = moment(dateStr);
156
- return m.hours() * 60 + m.minutes();
157
- };
158
-
159
- const input_vao_mins = getMinutesFromMidnight(gio_vao);
160
- const input_ra_mins = getMinutesFromMidnight(gio_ra || gio_vao);
161
-
162
- // 4. Lọc lại bằng JS để so sánh giờ vào/ra (bỏ qua ngày)
163
- let loaicong = candidates.find(lc => {
164
- // Check giờ vào tối thiểu (DB >= Input)
165
- // Nếu DB null thì pass, nếu có dữ liệu thì phải thỏa mãn
166
- if (lc.gio_vao_toi_thieu) {
167
- const db_vao_mins = getMinutesFromMidnight(lc.gio_vao_toi_thieu);
168
- if (db_vao_mins < input_vao_mins) return false; // Logic của bạn: DB >= Input
169
- }
170
-
171
- // Check giờ ra tối thiểu (DB <= Input)
172
- if (lc.gio_ra_toi_thieu) {
173
- const db_ra_mins = getMinutesFromMidnight(lc.gio_ra_toi_thieu);
174
- if (db_ra_mins > input_ra_mins) return false; // Logic của bạn: DB <= Input
175
- }
176
-
177
- return true;
178
- });
179
-
180
- // console.log("[checkin] tim loai cong", query_loai_cong, loaicong);
181
- if (loaicong) {
182
- ma_loai_cong = loaicong.ma_loai_cong;
183
- }
184
- }
185
- //Tìm bộ phận của nhân viên
186
- let ma_bp = nv.ma_bp;
187
- if(nv.bo_phan && nv.bo_phan.length>0){
188
- ma_bp = nv.bo_phan[0].ma_bp;
189
- }
190
- //Tạo công
191
- let data = obj.toObject?obj.toObject():{...obj};
192
- data.id_checkin = obj.device_user_id;
193
- data.ngay = obj.record_time;
194
- data.ma_loai_cong = ma_loai_cong||"UNKNOW";
195
- data.ma_nv =nv.ma_nv;
196
- data.ma_bp =ma_bp;
197
- delete data._id;
198
- delete data.trang_thai;
199
- data.gio_vao = gio_vao;
200
- data.gio_ra = gio_ra;
201
- data.tong_gio_lam = tong_gio_lam;
202
- //xoá post cũ
203
- await chamcong.deleteMany({
204
- id_app:obj.id_app,
205
- id_checkin:obj.device_user_id,
206
- ngay:{
207
- $gte:moment(obj.record_time).startOf("date").toDate(),
208
- $lte:moment(obj.record_time).endOf("date").toDate()}}
209
- )
210
- //tạo post mới
211
- const postbangchamcong = new PostBook(obj, [data], chamcong);
212
- postbangchamcong.run(async (e, rs)=>{
213
- if(!e){
214
- //lưu trusted_device_id
215
- await global.getModel("dmnv").updateOne({_id:nv._id},{trusted_device_id:obj.device_id})
216
- }
217
- callback(e, rs);
218
- });
219
-
220
-
221
- }
222
- module.exports = function(router) {
223
- const contr = new controller(router, model, 'checkin', {
224
- notNeedRight:true,
225
- sort: {
226
- record_time: -1
227
- },
228
- onView:async(user,items,next)=>{
229
- //Cham cong
230
- await items.filter(item=>item.trang_thai==="1").asyncJoinModel2(user.current_id_app,dmnv,{
231
- where: (item=>{
232
- return {$or: [
233
- {device_user_id:item.device_user_id},
234
- {user:item.device_user_id}
235
- ]}
236
- }),
237
- fields:["ma_nv","ten_nv","picture"]}
238
- );
239
- //Khach hang
240
- await items.filter(item=>item.trang_thai==="2" || item.trang_thai==="3").asyncJoinModel2(user.current_id_app,customer,{
241
- where: (item=>{
242
- return {$or: [
243
- {device_user_id:item.device_user_id},
244
- {of_user:item.device_user_id}
245
- ]}
246
- }),
247
- fields:["ma_kh","ten_kh","picture"]}
248
- );
249
- //Ca khach hang va nhan vien
250
- await items.filter(item=>item.trang_thai==="3" && item.device_user_id2).asyncJoinModel2(user.current_id_app,dmnv,{where:{device_user_id2:"device_user_id"},fields:["ma_nv","ten_nv",{picture_nv:"picture"}]});
251
- //Get picture
252
- await items.filter(item=>!item.picture).asyncJoinModel2(null,User,{where:{of_user:"email"},fields:["picture"]});
253
- await items.filter(item=>!item.picture).asyncJoinModel2(null,User,{where:{user:"email"},fields:["picture"]});
254
- await items.filter(item=>item.ma_kh).asyncJoinModel2(user.current_id_app,"customer",{where:"ma_kh",fields:["ten_kh"]});
255
- next(null,items);
256
- },
257
- onCreating: async (user,obj,next)=>{
258
- if(global.configs?.required_device_id && obj.location) obj.record_time = new Date();
259
- await chamcong.deleteMany({
260
- id_app:obj.id_app,
261
- id_checkin:obj.device_user_id||user.email,
262
- ngay:{
263
- $gte:moment(obj.record_time).startOf("date").toDate(),
264
- $lte:moment(obj.record_time).endOf("date").toDate()
265
- }})
266
- next(null,obj)
267
- },
268
- onUpdating:async (user,data,obj,next)=>{
269
- data.device_user_id = obj.device_user_id;
270
- delete data.record_time;
271
-
272
- await chamcong.deleteMany({
273
- id_app:obj.id_app,
274
- id_checkin:obj.device_user_id,
275
- ngay:{
276
- $gte:moment(obj.record_time).startOf("date").toDate(),
277
- $lte:moment(obj.record_time).endOf("date").toDate()
278
- }}
279
- )
280
- next(null,data,obj)
281
- },
282
- onDeleting: async (user,obj,next)=>{
283
- await chamcong.deleteMany({
284
- id_app:obj.id_app,
285
- id_checkin:obj.device_user_id,
286
- ngay:{
287
- $gte:moment(obj.record_time).startOf("date").toDate(),
288
- $lte:moment(obj.record_time).endOf("date").toDate()
289
- }})
290
- next(null,obj)
291
- },
292
- onUpdated:async (user,obj,next)=>{
293
- postData(obj,async (e)=>{
294
- if(e){
295
- console.log("lỗi lý checkin...");
296
- await model.deleteOne({_id:obj._id})
297
- return next(e);
298
- }
299
- next(null,obj);
300
- })
301
- },
302
- onDeleted:async (user,obj,next)=>{
303
- let query_checkin = {
304
- id_app:obj.id_app,
305
- device_user_id:obj.device_user_id,
306
- record_time:{
307
- $gte:moment(obj.record_time).startOf("date").toDate(),
308
- $lte:moment(obj.record_time).endOf("date").toDate()
309
- }
310
- }
311
-
312
- let obj_post = await model.findOne(query_checkin).lean();
313
- //console.log("[checkin] checkin đã bị xoá. Tìm checkin khác cùng ngày để tạo lại chấm công",query_checkin,obj_post);
314
- if(obj_post){
315
- //post lại sau khi xoá checkin
316
- //console.log("[checkin] tạo lại chấm công",obj_post)
317
- postData(obj_post,(e)=>{
318
- if(e) return next(e);
319
- next(null,obj);
320
- })
321
- }else{
322
- next(null,obj);
323
- }
324
- },
325
- onCreated:async (user,obj,next)=>{
326
- postData(obj,async (e)=>{
327
- if(e){
328
- await model.deleteOne({_id:obj._id});
329
- return next(e);
330
- }
331
- next(null,obj);
332
- })
333
- },
334
- });
335
- contr.route();
336
- };
1
+ const model=global.getModel("checkin"),customer=global.getModel("customer"),moment=require("moment"),dmnv=global.getModel("dmnv"),chamcong=global.getModel("chamcong"),User=global.getModel("user"),controller=require("../../controllers/controller"),PostBook=require("../../libs/post-book");function deg2rad($deg$$){return Math.PI/180*$deg$$}
2
+ function getDistanceFromLatLonInM($a$$,$dLon_lon1$$,$lat2$$,$lon2$$){const $dLat$$=deg2rad($lat2$$-$a$$);$dLon_lon1$$=deg2rad($lon2$$-$dLon_lon1$$);$a$$=Math.sin($dLat$$/2)*Math.sin($dLat$$/2)+Math.cos(deg2rad($a$$))*Math.cos(deg2rad($lat2$$))*Math.sin($dLon_lon1$$/2)*Math.sin($dLon_lon1$$/2);return 2*Math.atan2(Math.sqrt($a$$),Math.sqrt(1-$a$$))*6371E3}
3
+ const postData=async($obj$$,$callback$$)=>{if($obj$$.trang_thai!="1")return $callback$$();if(global.configs?.required_device_id&&!$obj$$.device_id)return $callback$$("C\u1ea7n th\u00f4ng tin ID c\u1ee7a thi\u1ebft b\u1ecb (device_id)");const $nv$$=await global.getModel("dmnv").findOne({id_app:$obj$$.id_app,$or:[{device_user_id:$obj$$.device_user_id},{user:$obj$$.device_user_id}]}).lean();if(!$nv$$)return $callback$$(`Ch\u01b0a khai b\u00e1o th\u00f4ng tin nh\u00e2n vi\u00ean cho '${$obj$$.device_user_id}'.`);
4
+ if($nv$$.trusted_device_id){if($nv$$.trusted_device_id!=$obj$$.device_id)return $callback$$("Thi\u1ebft b\u1ecb ch\u1ea5m c\u00f4ng kh\u00f4ng h\u1ee3p l\u1ec7. B\u1ea1n c\u1ea7n d\u00f9ng thi\u1ebft b\u1ecb \u0111\u00e3 ch\u1ea5m c\u00f4ng l\u1ea7n tr\u01b0\u1edbc ho\u1eb7c li\u00ean h\u1ec7 v\u1edbi admin \u0111\u1ec3 \u0111\u0103ng k\u00fd thi\u1ebft b\u1ecb m\u1edbi.");$nv$$.trusted_device_id=$obj$$.device_id}if($obj$$.device_id){var $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=
5
+ await global.getModel("dmnv").findOne({id_app:$obj$$.id_app,trusted_device_id:$obj$$.device_id},{_id:1}).lean();if($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$&&$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$._id!==$nv$$._id)return $callback$$("Thi\u1ebft b\u1ecb n\u00e0y \u0111\u00e3 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng \u0111\u1ec3 ch\u1ea5m cho nh\u00e2n vi\u00ean kh\u00e1c. N\u1ebfu b\u1ea1n c\u1ea7n thay \u0111\u1ed5i h\u00e3y li\u00ean h\u1ec7 v\u1edbi admin.")}if($obj$$.location&&
6
+ $obj$$.location.latitude&&$obj$$.location.longitude){var $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=null;$nv$$.ma_cn&&($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=await global.getModel("dmchinhanh").findOne({id_app:$obj$$.id_app,ma_cn:$nv$$.ma_cn,status:!0}).lean());if(!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$)return $callback$$("Ch\u01b0a khai b\u00e1o chi nh\u00e1nh l\u00e0m vi\u1ec7c cho nh\u00e2n vi\u00ean n\u00e0y");
7
+ if(!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location||!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.latitude||!$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.longitude)return $callback$$(`Ch\u01b0a khai b\u00e1o v\u1ecb tr\u00ed c\u1ee7a chi nh\u00e1nh ${$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.ten_cn}`);$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=
8
+ getDistanceFromLatLonInM($obj$$.location.latitude,$obj$$.location.longitude,$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.latitude,$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.longitude);$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.location.allowed_radius||50;if($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$>
9
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$&&!$obj$$.ma_kh)return console.warn(`[CheckIn Fail] Distance: ${$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}m. User: ${$obj$$.device_user_id}`),$callback$$(`V\u1ecb tr\u00ed ch\u1ea5m c\u00f4ng kh\u00f4ng h\u1ee3p l\u1ec7. B\u1ea1n \u0111ang c\u00e1ch c\u00f4ng ty ${Math.round($cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$)}m (Cho ph\u00e9p: ${$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$}m).`)}else if(global.configs?.required_device_id)return $callback$$("Kh\u00f4ng x\u00e1c \u0111\u1ecbnh \u0111\u01b0\u1ee3c v\u1ecb tr\u00ed c\u1ee7a b\u1ea1n.");
10
+ $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=await model.find({id_app:$obj$$.id_app,device_user_id:$obj$$.device_user_id,record_time:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}}).inTxn().sort({record_time:1}).lean();let $gio_vao$$,$gio_ra$$,$ma_loai_cong$$;$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length>0&&($gio_vao$$=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$[0].record_time);
11
+ $cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length>1&&($gio_ra$$=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$[$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$.length-1].record_time);$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$=$gio_vao$$&&$gio_ra$$?moment($gio_ra$$).diff(moment($gio_vao$$),"hours"):0;if($gio_vao$$){$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=moment($obj$$.record_time).day().toString();
12
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$={id_app:$obj$$.id_app,status:!0,$and:[{$or:[{nhung_ngay_trong_tuan:{$exists:!1}},{nhung_ngay_trong_tuan:$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$}]},{$or:[{tong_gio_lam_den:{$gte:$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}},{tong_gio_lam_den:0}]},{$or:[{tong_gio_lam_tu:{$lte:$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$}},{tong_gio_lam_tu:0}]}]};
13
+ $candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=await global.getModel("dmloaicong").find($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$).sort({tong_gio_lam_tu:-1,ngay_cong:-1}).lean();const $getMinutesFromMidnight$$=$dateStr_m$$=>{if(!$dateStr_m$$)return null;$dateStr_m$$=moment($dateStr_m$$);return $dateStr_m$$.hours()*60+$dateStr_m$$.minutes()},$input_vao_mins$$=$getMinutesFromMidnight$$($gio_vao$$),$input_ra_mins$$=$getMinutesFromMidnight$$($gio_ra$$||
14
+ $gio_vao$$);if($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.find($lc$$=>$lc$$.gio_vao_toi_thieu&&$getMinutesFromMidnight$$($lc$$.gio_vao_toi_thieu)<$input_vao_mins$$||$lc$$.gio_ra_toi_thieu&&$getMinutesFromMidnight$$($lc$$.gio_ra_toi_thieu)>$input_ra_mins$$?!1:!0))$ma_loai_cong$$=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$.ma_loai_cong}$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=
15
+ $nv$$.ma_bp;$nv$$.bo_phan&&$nv$$.bo_phan.length>0&&($candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$=$nv$$.bo_phan[0].ma_bp);let $data$$=$obj$$.toObject?$obj$$.toObject():{...$obj$$};$data$$.id_checkin=$obj$$.device_user_id;$data$$.ngay=$obj$$.record_time;$data$$.ma_loai_cong=$ma_loai_cong$$||"UNKNOW";$data$$.ma_nv=$nv$$.ma_nv;$data$$.ma_bp=$candidates_chiNhanh_loaicong_ma_bp_max_radius_ngay_trong_tuan_query_loai_cong$$;delete $data$$._id;delete $data$$.trang_thai;
16
+ $data$$.gio_vao=$gio_vao$$;$data$$.gio_ra=$gio_ra$$;$data$$.tong_gio_lam=$cac_lan_cham_cong_trong_ngay_distance_nv_device_id_tong_gio_lam$$;await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});(new PostBook($obj$$,[$data$$],chamcong)).run(async($e$$,$rs$$)=>{$e$$||await global.getModel("dmnv").updateOne({_id:$nv$$._id},{trusted_device_id:$obj$$.device_id});
17
+ $callback$$($e$$,$rs$$)})};
18
+ module.exports=function($router$$){(new controller($router$$,model,"checkin",{notNeedRight:!0,sort:{record_time:-1},onView:async($user$$,$items$$,$next$$)=>{await $items$$.filter($item$$=>$item$$.trang_thai==="1").asyncJoinModel2($user$$.current_id_app,dmnv,{where:$item$$=>({$or:[{device_user_id:$item$$.device_user_id},{user:$item$$.device_user_id}]}),fields:["ma_nv","ten_nv","picture"]});await $items$$.filter($item$$=>$item$$.trang_thai==="2"||$item$$.trang_thai==="3").asyncJoinModel2($user$$.current_id_app,customer,
19
+ {where:$item$$=>({$or:[{device_user_id:$item$$.device_user_id},{of_user:$item$$.device_user_id}]}),fields:["ma_kh","ten_kh","picture"]});await $items$$.filter($item$$=>$item$$.trang_thai==="3"&&$item$$.device_user_id2).asyncJoinModel2($user$$.current_id_app,dmnv,{where:{device_user_id2:"device_user_id"},fields:["ma_nv","ten_nv",{picture_nv:"picture"}]});await $items$$.filter($item$$=>!$item$$.picture).asyncJoinModel2(null,User,{where:{of_user:"email"},fields:["picture"]});await $items$$.filter($item$$=>
20
+ !$item$$.picture).asyncJoinModel2(null,User,{where:{user:"email"},fields:["picture"]});await $items$$.filter($item$$=>$item$$.ma_kh).asyncJoinModel2($user$$.current_id_app,"customer",{where:"ma_kh",fields:["ten_kh"]});$next$$(null,$items$$)},onCreating:async($user$$,$obj$$,$next$$)=>{global.configs?.required_device_id&&$obj$$.location&&($obj$$.record_time=new Date);await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id||$user$$.email,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),
21
+ $lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$obj$$)},onUpdating:async($user$$,$data$$,$obj$$,$next$$)=>{$data$$.device_user_id=$obj$$.device_user_id;delete $data$$.record_time;await chamcong.deleteMany({id_app:$obj$$.id_app,id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$data$$,$obj$$)},onDeleting:async($user$$,$obj$$,$next$$)=>{await chamcong.deleteMany({id_app:$obj$$.id_app,
22
+ id_checkin:$obj$$.device_user_id,ngay:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}});$next$$(null,$obj$$)},onUpdated:async($user$$,$obj$$,$next$$)=>{postData($obj$$,async $e$$=>{if($e$$)return console.log("l\u1ed7i l\u00fd checkin..."),await model.deleteOne({_id:$obj$$._id}),$next$$($e$$);$next$$(null,$obj$$)})},onDeleted:async($obj_post_query_checkin_user$$,$obj$$,$next$$)=>{$obj_post_query_checkin_user$$={id_app:$obj$$.id_app,
23
+ device_user_id:$obj$$.device_user_id,record_time:{$gte:moment($obj$$.record_time).startOf("date").toDate(),$lte:moment($obj$$.record_time).endOf("date").toDate()}};($obj_post_query_checkin_user$$=await model.findOne($obj_post_query_checkin_user$$).lean())?postData($obj_post_query_checkin_user$$,$e$$=>{if($e$$)return $next$$($e$$);$next$$(null,$obj$$)}):$next$$(null,$obj$$)},onCreated:async($user$$,$obj$$,$next$$)=>{postData($obj$$,async $e$$=>{if($e$$)return await model.deleteOne({_id:$obj$$._id}),
24
+ $next$$($e$$);$next$$(null,$obj$$)})}})).route()};
@@ -0,0 +1 @@
1
+ const model=global.getModel("csphucap"),controller=require("../../controllers/controller");module.exports=function($router$$){(new controller($router$$,model,"csphucap",{})).route()};
@@ -5,28 +5,31 @@ $tong_thu_nhap_chiu_thue$$-$thu_nha_da_chiu_thue$$;$i$$+=1}return $thue_tncn$$},
5
5
  null,""]};chamcong.find($query$$).lean().then(function($congs$$){$congs$$.joinModel2($id_app$$,dmloaicong,[{where:{ma_loai_cong:"ma_loai_cong"},fields:"ngay_cong ngay_phep ngay_khong_phep ngay_khong_luong la_cong_lam_them tinh_phu_cap".split(" ")}],async()=>{$congs$$.forEach($c$$=>{$c$$.la_cong_lam_them&&($c$$.ngay_tang_ca=$c$$.ngay_cong,$c$$.ngay_cong=0,$c$$.so_luong_ngay_tang_ca=1,$c$$.so_luong_ngay_tang_ca_mien_thue=Math.max($c$$.ngay_tang_ca-1,0));$c$$.tinh_phu_cap&&($c$$.so_ngay_tinh_phu_cap=
6
6
  1)});let $nvs$$=await $congs$$.asyncGroupBy(["ma_nv","ma_bp"],"ngay_cong ngay_phep ngay_khong_phep ngay_khong_luong ngay_tang_ca so_ngay_tinh_phu_cap so_luong_ngay_tang_ca so_luong_ngay_tang_ca_mien_thue".split(" "));await $nvs$$.asyncJoinModel2($id_app$$,dmnv,[{where:{ma_nv:"ma_nv"},fields:"ten_nv ma_kho luong_co_ban luong_thu_viec thu_viec_den_ngay ngay_bat_dau_lam ngay_nghi_viec luong_bhxh phu_cap cham_cong tinh_luong bhxh bhyt bhtn ttncn_so_nguoi_phu_thuoc ttncn_muc_gt_phu_thuoc ttncn_so_thang_gt_ban_than ttncn_muc_gt_ban_than".split(" ")}]);
7
7
  $nvs$$.forEach($nv$$=>{$nv$$.ngay_bat_dau_lam&&($nv$$.ngay_bat_dau_lam=moment($nv$$.ngay_bat_dau_lam).startOf("date").toDate());$nv$$.ngay_nghi_viec&&($nv$$.ngay_nghi_viec=moment($nv$$.ngay_nghi_viec).endOf("date").toDate())});$nvs$$=$nvs$$.filter($nv$$=>$nv$$.tinh_luong&&(!$nv$$.ngay_bat_dau_lam||$nv$$.ngay_bat_dau_lam.getTime()<=$den_ngay$$.getTime())&&(!$nv$$.ngay_nghi_viec||$nv$$.ngay_nghi_viec.getTime()>$tu_ngay$$.getTime()));await $nvs$$.asyncJoinModel2($id_app$$,dmbp,[{where:{ma_bp:"ma_bp"},
8
- fields:["ten_bp","tinh_luong_theo_ngay"]}]);let $cac_khoan_giam_tru$$=await ckgtluong.find({id_app:$id_app$$,status:!0}).lean();async.mapLimit($nvs$$,20,async $nv$$=>{$nv$$.tinh_luong_theo_ngay||($nv$$.tinh_luong_theo_ngay=moment($tu_ngay$$).startOf("month").toDate().getTime()<moment($tu_ngay$$).startOf("date").toDate().getTime()||$nv$$.ngay_bat_dau_lam&&$nv$$.ngay_bat_dau_lam.getTime()>$tu_ngay$$.getTime()||$nv$$.ngay_nghi_viec&&$nv$$.ngay_nghi_viec.getTime()<$den_ngay$$.getTime());$nv$$.so_ngay_lam_mot_thang=
9
- $so_ngay_lam_mot_thang$$;var $giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.luong_co_ban;let $luong_bhxh$$=$nv$$.luong_bhxh;var $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.luong_thu_viec;$loai_luong$$==1?($nv$$.thu_viec=!0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,$luong_bhxh$$=0):($nv$$.thu_viec=!1,($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
10
- $nv$$.thu_viec_den_ngay)&&(new Date($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$)).getTime()>=moment($den_ngay$$).startOf("month").toDate().getTime()&&($luong_bhxh$$=0));$nv$$.luong_co_ban=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.cham_cong?($nv$$.luong_binh_quan_ngay=Math.roundBy($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$/$so_ngay_lam_mot_thang$$),$nv$$.tong_ngay_cong_tinh_luong=$nv$$.ngay_cong+$nv$$.ngay_phep,$nv$$.tong_ngay_khong_luong=
11
- $nv$$.ngay_khong_phep+$nv$$.ngay_khong_luong,$nv$$.tinh_luong_theo_ngay?($nv$$.tru_luong=0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$),$nv$$.luong_thang=$nv$$.tong_ngay_cong_tinh_luong==$so_ngay_lam_mot_thang$$?$nv$$.luong_co_ban+$nv$$.luong_tang_ca:Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_cong_tinh_luong)+
12
- $nv$$.luong_tang_ca):(console.log("tinh luog theo thang",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.tru_luong=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_khong_luong),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$),
13
- $nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$+$nv$$.luong_tang_ca-$nv$$.tru_luong)):(console.log("Khong cham cong nhung van tinh luong",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$);$nv$$.gt_bhxh=0;$nv$$.cty_bhxh=0;$nv$$.gt_bhyt=0;$nv$$.cty_bhyt=0;$nv$$.gt_bhtn=0;$nv$$.cty_bhtn=0;$nv$$.gt_kpcd=0;$nv$$.cty_kpcd=0;$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[];if(!$nv$$.ngay_tinh_bhxh||moment($nv$$.ngay_tinh_bhxh).startOf("date").toDate().getTime()<=
14
- $tu_ngay$$.getTime())$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=_.cloneDeep($cac_khoan_giam_tru$$),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($gt$$=>{$gt$$.nv=0;$gt$$.cty=0;$gt$$.kieu_trich=="BHXH"?$nv$$.bhxh&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhxh+=$gt$$.nv,$nv$$.cty_bhxh+=$gt$$.cty):$gt$$.kieu_trich=="BHYT"?$nv$$.bhyt&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*
15
- $luong_bhxh$$/100),$nv$$.gt_bhyt+=$gt$$.nv,$nv$$.cty_bhyt+=$gt$$.cty):$gt$$.kieu_trich=="BHTN"?$nv$$.bhtn&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhtn+=$gt$$.nv,$nv$$.cty_bhtn+=$gt$$.cty):($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$gt$$.kieu_trich=="KPCD"&&($nv$$.gt_kpcd+=$gt$$.nv,$nv$$.cty_kpcd+=$gt$$.cty))});$nv$$.giam_tru=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;
16
- $nv$$.tong_bao_hiem_nv=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.nv).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_bao_hiem_cty=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.cty).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$condition$$.cac_khoan_phu_cap&&$condition$$.cac_khoan_phu_cap.length!=0?$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[]:($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=await phucap.find({id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:{$in:["",
17
- null,void 0,$nv$$.ma_nv]},ma_bp:{$in:["",null,void 0,$nv$$.ma_bp]}}).lean(),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($p$$=>{$p$$.dvt="month";$p$$.tien_pc=$p$$.tien||0}),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$={id_app:$id_app$$,ma_nv:$nv$$.ma_nv,nxt:2,ma_ct:{$in:["HD2","PBL","SO1"]},ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$}},$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
18
- await global.getModel("sokho").find($luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$).lean(),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=await $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncGroupBy(["ma_vt"],["sl_xuat"]),await $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncJoinModel2($id_app$$,
19
- "dmvt",{where:"ma_vt",fields:["ten_phu_cap_them","ten_vt","luong_tho_theo_ds","ds_yeu_cau"]}),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.filter($d$$=>$d$$.luong_tho_theo_ds&&$d$$.ds_yeu_cau&&$d$$.sl_xuat>=$d$$.ds_yeu_cau),$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
20
- $luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($sl$$=>{let $pc$$={kieu:"2",id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:$nv$$.ma_nv,ten_phu_cap:$sl$$.ten_phu_cap_them||$sl$$.ten_vt,dvt:"month"};$pc$$.sl_xuat=$sl$$.sl_xuat;$pc$$.ds_yeu_cau=$sl$$.ds_yeu_cau;$pc$$.tien_pc=$pc$$.tien=Math.trunc($sl$$.sl_xuat/$sl$$.ds_yeu_cau)*$sl$$.luong_tho_theo_ds;return $pc$$}),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,
21
- ...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$]);$nv$$.cac_khoan_phat=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien<0);$nv$$.tien_phat=$nv$$.cac_khoan_phat.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||
22
- $p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_phu_cap>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_phu_cap-$da_phu_cap$$)}$r$$.tien_pc=
23
- $tien_pc$$;return $r$$});$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien>0)];$nv$$.cac_khoan_phu_cap=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tien_phu_cap=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>
24
- $r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_phu_cap=$nv$$.tien_phu_cap+$nv$$.tien_phat;$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=[...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).filter($p$$=>!$p$$.khong_mien_thue).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=
25
- Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_mien_thue>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap_mien_thue||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_mien_thue-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$=
26
- [...$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$];$nv$$.cac_khoan_phu_cap_mien_thue=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tong_phu_cap_mien_thue=$luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);
27
- $nv$$.tong_thu_nhap=$nv$$.luong_thang+$nv$$.tong_phu_cap;$nv$$.luong_tang_ca_mien_thue=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.so_luong_ngay_tang_ca_mien_thue);$nv$$.ttncn_tong_thu_nhap_mien_thue=$nv$$.luong_tang_ca_mien_thue+$nv$$.tong_phu_cap_mien_thue;$nv$$.ttncn_gt_phu_thuoc=Math.roundBy(($nv$$.ttncn_so_nguoi_phu_thuoc||0)*($nv$$.ttncn_muc_gt_phu_thuoc||0));$nv$$.ttncn_gt_tu_thien=0;$nv$$.ttncn_gt_ban_than=Math.roundBy(($nv$$.ttncn_so_thang_gt_ban_than||0)*($nv$$.ttncn_muc_gt_ban_than||
28
- 0));$nv$$.ttncn_tong_giam_tru=$nv$$.ttncn_gt_phu_thuoc+$nv$$.ttncn_gt_tu_thien+$nv$$.tong_bao_hiem_nv+$nv$$.ttncn_gt_ban_than;$nv$$.ttncn_thu_nhap_chiu_thue=Math.max($nv$$.tong_thu_nhap-$nv$$.ttncn_tong_thu_nhap_mien_thue-$nv$$.ttncn_tong_giam_tru,0);$nv$$.ttncn_thue_theo_bac=$nv$$.ttncn_thu_nhap_chiu_thue<2E6?$nv$$.thu_viec?[{thue_suat:0,tien_thue:0}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue):$nv$$.thu_viec?[{thue_suat:10,tien_thue:Math.roundBy($nv$$.ttncn_thu_nhap_chiu_thue*10/100,0)}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue);
29
- $nv$$.ttncn_tong_thue=$nv$$.ttncn_thue_theo_bac.map($b$$=>$b$$.tien_thue||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_luong=$nv$$.tong_thu_nhap-$nv$$.tong_bao_hiem_nv-$nv$$.ttncn_tong_thue;$nv$$.id_app=$id_app$$;$nv$$.thang=$thang$$;$nv$$.nam=$nam$$;$nv$$.loai_luong=$loai_luong$$;return null},async $e$$=>{if($e$$)return $callback$$($e$$);try{await bangtinhluong.create($nvs$$),$callback$$(null,$nvs$$)}catch($e$$){$callback$$($e$$.message)}})})}).catch($e$$=>{$callback$$($e$$)})};
8
+ fields:["ten_bp","tinh_luong_theo_ngay",{phu_cap_theo_bp:"phu_cap"}]}]);let $cac_khoan_giam_tru$$=await ckgtluong.find({id_app:$id_app$$,status:!0}).lean();async.mapLimit($nvs$$,20,async $nv$$=>{$nv$$.tinh_luong_theo_ngay||($nv$$.tinh_luong_theo_ngay=moment($tu_ngay$$).startOf("month").toDate().getTime()<moment($tu_ngay$$).startOf("date").toDate().getTime()||$nv$$.ngay_bat_dau_lam&&$nv$$.ngay_bat_dau_lam.getTime()>$tu_ngay$$.getTime()||$nv$$.ngay_nghi_viec&&$nv$$.ngay_nghi_viec.getTime()<$den_ngay$$.getTime());
9
+ $nv$$.so_ngay_lam_mot_thang=$so_ngay_lam_mot_thang$$;var $giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.luong_co_ban;let $luong_bhxh$$=$nv$$.luong_bhxh;var $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.luong_thu_viec;$loai_luong$$==1?($nv$$.thu_viec=!0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,
10
+ $luong_bhxh$$=0):($nv$$.thu_viec=!1,($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.thu_viec_den_ngay)&&(new Date($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$)).getTime()>=moment($den_ngay$$).startOf("month").toDate().getTime()&&($luong_bhxh$$=0));$nv$$.luong_co_ban=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.cham_cong?
11
+ ($nv$$.luong_binh_quan_ngay=Math.roundBy($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$/$so_ngay_lam_mot_thang$$),$nv$$.tong_ngay_cong_tinh_luong=$nv$$.ngay_cong+$nv$$.ngay_phep,$nv$$.tong_ngay_khong_luong=$nv$$.ngay_khong_phep+$nv$$.ngay_khong_luong,$nv$$.tinh_luong_theo_ngay?($nv$$.tru_luong=0,$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=$nv$$.ngay_tang_ca,$nv$$.tong_ngay_tang_ca=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$),
12
+ $nv$$.luong_thang=$nv$$.tong_ngay_cong_tinh_luong==$so_ngay_lam_mot_thang$$?$nv$$.luong_co_ban+$nv$$.luong_tang_ca:Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_cong_tinh_luong)+$nv$$.luong_tang_ca):(console.log("tinh luog theo thang",$nv$$.ma_nv,$nv$$.ten_nv),$nv$$.tru_luong=Math.roundBy($nv$$.luong_binh_quan_ngay*$nv$$.tong_ngay_khong_luong),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$nv$$.ngay_tang_ca,
13
+ $nv$$.tong_ngay_tang_ca=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,$nv$$.luong_tang_ca=Math.roundBy($nv$$.luong_binh_quan_ngay*$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$+$nv$$.luong_tang_ca-$nv$$.tru_luong)):(console.log("Khong cham cong nhung van tinh luong",
14
+ $nv$$.ma_nv,$nv$$.ten_nv),$nv$$.luong_thang=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$);$nv$$.gt_bhxh=0;$nv$$.cty_bhxh=0;$nv$$.gt_bhyt=0;$nv$$.cty_bhyt=0;$nv$$.gt_bhtn=0;$nv$$.cty_bhtn=0;$nv$$.gt_kpcd=0;$nv$$.cty_kpcd=0;$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[];if(!$nv$$.ngay_tinh_bhxh||moment($nv$$.ngay_tinh_bhxh).startOf("date").toDate().getTime()<=$tu_ngay$$.getTime())$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=_.cloneDeep($cac_khoan_giam_tru$$),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($gt$$=>
15
+ {$gt$$.nv=0;$gt$$.cty=0;$gt$$.kieu_trich=="BHXH"?$nv$$.bhxh&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhxh+=$gt$$.nv,$nv$$.cty_bhxh+=$gt$$.cty):$gt$$.kieu_trich=="BHYT"?$nv$$.bhyt&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhyt+=$gt$$.nv,$nv$$.cty_bhyt+=$gt$$.cty):$gt$$.kieu_trich=="BHTN"?$nv$$.bhtn&&($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*
16
+ $luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$nv$$.gt_bhtn+=$gt$$.nv,$nv$$.cty_bhtn+=$gt$$.cty):($gt$$.nv=Math.roundBy($gt$$.ty_le_nv*$luong_bhxh$$/100),$gt$$.cty=Math.roundBy($gt$$.ty_le_cty*$luong_bhxh$$/100),$gt$$.kieu_trich=="KPCD"&&($nv$$.gt_kpcd+=$gt$$.nv,$nv$$.cty_kpcd+=$gt$$.cty))});$nv$$.giam_tru=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$;$nv$$.tong_bao_hiem_nv=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.nv).reduce(($a$$,$b$$)=>$a$$+
17
+ $b$$,0);$nv$$.tong_bao_hiem_cty=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.map($g$$=>$g$$.cty).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$condition$$.cac_khoan_phu_cap&&$condition$$.cac_khoan_phu_cap.length!=0?$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=[]:($giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=await phucap.find({id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:{$in:["",null,void 0,$nv$$.ma_nv]},ma_bp:{$in:["",null,void 0,$nv$$.ma_bp]}}).lean(),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.forEach($p$$=>
18
+ {$p$$.dvt="month";$p$$.tien_pc=$p$$.tien||0}),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$={id_app:$id_app$$,ma_nv:$nv$$.ma_nv,nxt:2,ma_ct:{$in:["HD2","PBL","SO1"]},ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$}},$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await global.getModel("sokho").find($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$).lean(),
19
+ $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncGroupBy(["ma_vt"],["sl_xuat"]),await $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.asyncJoinModel2($id_app$$,"dmvt",{where:"ma_vt",fields:["ten_phu_cap_them",
20
+ "ten_vt","luong_tho_theo_ds","ds_yeu_cau"]}),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.filter($d$$=>$d$$.luong_tho_theo_ds&&$d$$.ds_yeu_cau&&$d$$.sl_xuat>=$d$$.ds_yeu_cau),$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
21
+ $csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($sl$$=>{let $pc$$={kieu:"2",id_app:$id_app$$,thang:$thang$$,nam:$nam$$,ma_nv:$nv$$.ma_nv,ten_phu_cap:$sl$$.ten_phu_cap_them||$sl$$.ten_vt,dvt:"month"};$pc$$.sl_xuat=$sl$$.sl_xuat;$pc$$.ds_yeu_cau=$sl$$.ds_yeu_cau;$pc$$.tien_pc=$pc$$.tien=Math.trunc($sl$$.sl_xuat/$sl$$.ds_yeu_cau)*$sl$$.luong_tho_theo_ds;return $pc$$}),$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$=
22
+ [...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$,...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$]);$nv$$.cac_khoan_phat=$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien<0);$nv$$.tien_phat=$nv$$.cac_khoan_phat.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
23
+ {id_app:$id_app$$,status:!0,$or:[{ds_nv:$nv$$.ma_nv},{ds_bp:$nv$$.ma_bp}]};$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=await global.getModel("csphucap").findOne($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$).lean();$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
24
+ [...($nv$$.phu_cap||[]),...($nv$$.phu_cap_theo_bp||[]),...($csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$?.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;
25
+ case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_phu_cap>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap||[]).filter($p$$=>$p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_phu_cap-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,
26
+ ...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$.filter($r$$=>$r$$.tien>0)];$nv$$.cac_khoan_phu_cap=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tien_phu_cap=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_phu_cap=$nv$$.tien_phu_cap+$nv$$.tien_phat;$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=
27
+ [...($nv$$.phu_cap||[])].filter($p$$=>$p$$.tu_ngay&&(new Date($p$$.tu_ngay)).getTime()>$den_ngay$$.getTime()||$p$$.den_ngay&&(new Date($p$$.den_ngay)).getTime()<$tu_ngay$$.getTime()?!1:!0).filter($p$$=>!$p$$.khong_mien_thue).map($r$$=>{let $tien_pc$$=$r$$.tien||0;switch($r$$.dvt){case "date":$tien_pc$$=Math.roundBy($tien_pc$$*$nv$$.so_ngay_tinh_phu_cap);break;case "year":$tien_pc$$=Math.roundBy($tien_pc$$/12)}if($r$$.max_mien_thue>0){let $da_phu_cap$$=($condition$$.cac_khoan_phu_cap_mien_thue||[]).filter($p$$=>
28
+ $p$$.line==$r$$.line).map($r$$=>$r$$.tien_pc||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$tien_pc$$=Math.min($tien_pc$$,$r$$.max_mien_thue-$da_phu_cap$$)}$r$$.tien_pc=$tien_pc$$;return $r$$});$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$=[...$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$,...$giam_tru_luong_co_ban_phu_cap_mot_lan_tang_ca$$];
29
+ $nv$$.cac_khoan_phu_cap_mien_thue=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$;$nv$$.tong_phu_cap_mien_thue=$csphucap_luong_thu_viec_phu_cap_phu_cap_mien_thue_phu_cap_mot_lan_them_query_phu_cap_query_san_luong_san_luong_ban_hang_tang_ca$$.map($r$$=>$r$$.tien_pc).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_thu_nhap=$nv$$.luong_thang+$nv$$.tong_phu_cap;$nv$$.luong_tang_ca_mien_thue=Math.roundBy($nv$$.luong_binh_quan_ngay*
30
+ $nv$$.so_luong_ngay_tang_ca_mien_thue);$nv$$.ttncn_tong_thu_nhap_mien_thue=$nv$$.luong_tang_ca_mien_thue+$nv$$.tong_phu_cap_mien_thue;$nv$$.ttncn_gt_phu_thuoc=Math.roundBy(($nv$$.ttncn_so_nguoi_phu_thuoc||0)*($nv$$.ttncn_muc_gt_phu_thuoc||0));$nv$$.ttncn_gt_tu_thien=0;$nv$$.ttncn_gt_ban_than=Math.roundBy(($nv$$.ttncn_so_thang_gt_ban_than||0)*($nv$$.ttncn_muc_gt_ban_than||0));$nv$$.ttncn_tong_giam_tru=$nv$$.ttncn_gt_phu_thuoc+$nv$$.ttncn_gt_tu_thien+$nv$$.tong_bao_hiem_nv+$nv$$.ttncn_gt_ban_than;$nv$$.ttncn_thu_nhap_chiu_thue=
31
+ Math.max($nv$$.tong_thu_nhap-$nv$$.ttncn_tong_thu_nhap_mien_thue-$nv$$.ttncn_tong_giam_tru,0);$nv$$.ttncn_thue_theo_bac=$nv$$.ttncn_thu_nhap_chiu_thue<2E6?$nv$$.thu_viec?[{thue_suat:0,tien_thue:0}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue):$nv$$.thu_viec?[{thue_suat:10,tien_thue:Math.roundBy($nv$$.ttncn_thu_nhap_chiu_thue*10/100,0)}]:tinhThueTNCV($nv$$.ttncn_thu_nhap_chiu_thue);$nv$$.ttncn_tong_thue=$nv$$.ttncn_thue_theo_bac.map($b$$=>$b$$.tien_thue||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$nv$$.tong_luong=
32
+ $nv$$.tong_thu_nhap-$nv$$.tong_bao_hiem_nv-$nv$$.ttncn_tong_thue;$nv$$.id_app=$id_app$$;$nv$$.thang=$thang$$;$nv$$.nam=$nam$$;$nv$$.loai_luong=$loai_luong$$;return null},async $e$$=>{if($e$$)return $callback$$($e$$);try{await bangtinhluong.create($nvs$$),$callback$$(null,$nvs$$)}catch($e$$){$callback$$($e$$.message)}})})}).catch($e$$=>{$callback$$($e$$)})};
30
33
  module.exports=function($router$$){new controller($router$$,"tinhluong",async($nhanvien_req$$,$callback$$)=>{let $thang$$=Number($nhanvien_req$$.query.thang),$nam$$=Number($nhanvien_req$$.query.nam);var $id_app$jscomp$1_query$$=$nhanvien_req$$.query.id_app;if(!$thang$$||!$nam$$)return $callback$$("T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u hai tham s\u1ed1 thang v\u00e0 nam");if($thang$$<1||$thang$$>12||$nam$$<1E3||$nam$$>3E3)return $callback$$("Tham s\u1ed1 thang ho\u1eb7c nam kh\u00f4ng ph\u00f9 h\u1ee3p");
31
34
  const $tu_ngay$$=moment(new Date($nam$$,$thang$$-1,1)).startOf("month").toDate(),$den_ngay$$=moment($tu_ngay$$).endOf("month").toDate();var $appInfo_query_delete_old$$=await App.findOne({_id:$id_app$jscomp$1_query$$});if(!$appInfo_query_delete_old$$)return $callback$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");let $ngay_ks$$=await utils.isBookLocked({id_app:$id_app$jscomp$1_query$$,ngay_ct:$tu_ngay$$});if($ngay_ks$$)return $callback$$(`\u0110\u00e3 kh\u00f3a s\u1ed5 \u0111\u1ebfn ng\u00e0y ${moment($ngay_ks$$).format("DD/MM/YYYY")}`);
32
35
  const $main_condition$$={tu_ngay:$tu_ngay$$,den_ngay:$den_ngay$$,id_app:$id_app$jscomp$1_query$$,thang:$thang$$,nam:$nam$$,so_ngay_lam_mot_thang:$nhanvien_req$$.query.so_ngay_lam_mot_thang||$appInfo_query_delete_old$$.so_ngay_lam_mot_thang||24,ma_nv:$nhanvien_req$$.query.ma_nv,ma_bp:$nhanvien_req$$.query.ma_bp};$appInfo_query_delete_old$$={};$appInfo_query_delete_old$$.id_app=$id_app$jscomp$1_query$$;$appInfo_query_delete_old$$.thang=$thang$$;$appInfo_query_delete_old$$.nam=$nam$$;$main_condition$$.ma_nv&&