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