flexbiz-server
Version:
Flexible Server
31 lines (30 loc) • 14.9 kB
JavaScript
const ckvt=require("./ckvt"),sokho=global.getModel("sokho"),socai=global.getModel("socai"),dmvt=global.getModel("dmvt"),giatb=global.getModel("giatb"),dmqddvt=global.getModel("dmqddvt"),tinhgiatb1vt=require("./tinhgiatb1vt"),_=require("lodash"),Controller=require("../controllers/controller"),moment=require("moment"),{getCurrentSession}=require("./sessionContext"),getRawData=$doc$$=>typeof $doc$$.toObject==="function"?$doc$$.toObject():$doc$$,tinhGiaTbPromise=$query$$=>new Promise(($resolve$$,$reject$$)=>
{tinhgiatb1vt($query$$,($err$$,$data$$)=>{if($err$$)return $reject$$($err$$);$resolve$$($data$$)})}),postDataPromise=($data$$,$ctrl$$)=>new Promise(($resolve$$,$reject$$)=>{Controller.postData($data$$,$ctrl$$,($err$$,$rs$$)=>{if($err$$)return $reject$$($err$$);$resolve$$($rs$$)},{kiem_tra_han_muc_cong_no:!1})});
module.exports=async function($condition$$,$fn$$){try{if(!($condition$$&&$condition$$.tu_thang&&$condition$$.den_thang&&$condition$$.nam&&$condition$$.id_app))throw Error("L\u1ed7i: T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u c\u00e1c tham s\u1ed1: tu_thang, den_thang, nam, id_app");var $t_tu_thang$$=Number($condition$$.tu_thang),$d_voucher_den_thang$$=Number($condition$$.den_thang);const $ma_kho$$=$condition$$.ma_kho,$id_app$$=$condition$$.id_app,$tu_ngay$$=moment(new Date($condition$$.nam,$t_tu_thang$$-
1,15)).startOf("month").toDate(),$den_ngay$$=moment(new Date($condition$$.nam,$d_voucher_den_thang$$-1,15)).endOf("month").toDate();var $session_thangs$$=getCurrentSession(),$app_query_dmvt$$=await global.getModel("app").findOne({_id:$id_app$$},{options:1}).lean();if(!$app_query_dmvt$$)throw Error("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");const $f_tien$$=($app_query_dmvt$$.options||{}).f_tien||0;$app_query_dmvt$$={id_app:$id_app$$,gia_xuat:"1"};$condition$$.ma_nvt&&($app_query_dmvt$$.ma_nvt=
$condition$$.ma_nvt);$condition$$.ma_ncc&&($app_query_dmvt$$.ma_ncc=$condition$$.ma_ncc);$condition$$.ma_vt&&($app_query_dmvt$$.ma_vt=$condition$$.ma_vt);Logger.info(`\ud83d\udd25[tinhgiatb] Start | Kho: ${$ma_kho$$} | Session: ${$session_thangs$$?._debugId}`);const $dmqdList$$=await dmqddvt.find({id_app:$id_app$$}).lean(),$mapQuyDoi$$=new Map;$dmqdList$$.forEach($qd$$=>{$mapQuyDoi$$.set(`${$qd$$.ma_vt}-${$qd$$.ma_dvt}`,($qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd)||1)});const $listVt$$=await dmvt.find($app_query_dmvt$$).lean();
Logger.info(`\ud83d\ude80 [tinhgiatb] B\u1eaft \u0111\u1ea7u t\u00ednh gi\u00e1 cho ${$listVt$$.length} v\u1eadt t\u01b0 (Ch\u1ea1y song song)...`);const $bang_gia$$=await (async $ma_vt$jscomp$1_query$$=>{$ma_vt$jscomp$1_query$$={id_app:$id_app$$,tu_ngay:$tu_ngay$$,den_ngay:$den_ngay$$,ma_vt:$ma_vt$jscomp$1_query$$,ma_kho:$ma_kho$$};try{return(await tinhGiaTbPromise($ma_vt$jscomp$1_query$$)).map($giaData$$=>({...$giaData$$,id_app:$id_app$$,ma_kho:$ma_kho$$,status:!0}))}catch($err$$){throw Logger.error("[tinhgiatb] L\u1ed7i t\u00ednh gi\u00e1 VT:",
$ma_vt$jscomp$1_query$$.ma_vt,$err$$.message),$err$$;}})($listVt$$.map($d$$=>$d$$.ma_vt)),$mapGiaTB$$=new Map;$bang_gia$$.forEach($g$$=>$mapGiaTB$$.set($g$$.ma_vt,$g$$.gia));for($session_thangs$$=[];$t_tu_thang$$<=$d_voucher_den_thang$$;$t_tu_thang$$++)$session_thangs$$.push($t_tu_thang$$);const $ma_vts$$=$bang_gia$$.map($g$$=>$g$$.ma_vt);let $query_delete_gia$$={id_app:$id_app$$,ma_vt:{$in:$ma_vts$$},nam:$condition$$.nam,thang:{$in:$session_thangs$$}};$ma_kho$$&&($query_delete_gia$$.ma_kho=$ma_kho$$);
await giatb.deleteMany($query_delete_gia$$);let $newGiaEntries$$=[];for(const $t$$ of $session_thangs$$)$bang_gia$$.forEach($gia$$=>{$newGiaEntries$$.push({...$gia$$,thang:$t$$,nam:$condition$$.nam})});$newGiaEntries$$.length>0&&await giatb.insertMany($newGiaEntries$$);Logger.info("[tinhgiatb] \ud83d\ude80 \u0110ang l\u1ea5y danh s\u00e1ch ch\u1ee9ng t\u1eeb (Parallel Mode)...");let $vouchers_x$$=new Map,$vouchers_n$$=new Map;const $id_ct_need_delete$$=[],$fetchVouchersByMaCt$$=async $entries_groupedSks$$=>
{const $results$$=new Map,$deleteIds$$=[];$entries_groupedSks$$=Object.entries($entries_groupedSks$$);await Promise.all($entries_groupedSks$$.map(async([$ma_ct$$,$listSk$$])=>{try{const $ctrl$$=global.controllers[$ma_ct$$.toUpperCase()],$Model$$=$ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$ma_ct$$.toLowerCase()];if($Model$$){var $ids$$=[...(new Set($listSk$$.map($s$$=>$s$$.id_ct)))],$foundVouchers$$=await $Model$$.find({_id:{$in:$ids$$}}).lean(),$foundIds$$=new Set;for(const $v$$ of $foundVouchers$$)$results$$.set($v$$._id.toString(),
$v$$),$foundIds$$.add($v$$._id.toString());$ids$$.forEach($id$$=>{$foundIds$$.has($id$$.toString())||$deleteIds$$.push($id$$)})}else Logger.warn(`\u26a0\ufe0f [tinhgiatb] Kh\u00f4ng t\u00ecm th\u1ea5y model: ${$ma_ct$$}`)}catch($err$$){throw Logger.error(`\u274c[tinhgiatb] L\u1ed7i load ch\u1ee9ng t\u1eeb ${$ma_ct$$}:`,$err$$.message),$err$$;}}));return{vouchers:$results$$,deleteIds:$deleteIds$$}};await Promise.all([(async()=>{var $groupedSksX_query_sokho_x_res_sks_x$$={id_app:$id_app$$,ngay_ct:{$gte:$tu_ngay$$,
$lte:$den_ngay$$},nxt:2,ma_vt:{$in:$ma_vts$$},px_gia_dd:!1};$ma_kho$$&&($groupedSksX_query_sokho_x_res_sks_x$$.ma_kho=$ma_kho$$);$groupedSksX_query_sokho_x_res_sks_x$$=await sokho.find($groupedSksX_query_sokho_x_res_sks_x$$).lean();$groupedSksX_query_sokho_x_res_sks_x$$=_.groupBy($groupedSksX_query_sokho_x_res_sks_x$$,"ma_ct");$groupedSksX_query_sokho_x_res_sks_x$$=await $fetchVouchersByMaCt$$($groupedSksX_query_sokho_x_res_sks_x$$);$groupedSksX_query_sokho_x_res_sks_x$$.vouchers.forEach(($v$$,$k$$)=>
$vouchers_x$$.set($k$$,$v$$));$id_ct_need_delete$$.push(...$groupedSksX_query_sokho_x_res_sks_x$$.deleteIds)})(),(async()=>{var $groupedSksN_query_sokho_n_res$$={id_app:$id_app$$,ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$},nxt:1,ma_vt:{$in:$ma_vts$$},pn_gia_tb:!0,ma_ct:{$ne:"PXC"}};$ma_kho$$&&($groupedSksN_query_sokho_n_res$$.ma_kho=$ma_kho$$);$groupedSksN_query_sokho_n_res$$=await sokho.find($groupedSksN_query_sokho_n_res$$).lean();$groupedSksN_query_sokho_n_res$$=_.groupBy($groupedSksN_query_sokho_n_res$$,
"ma_ct");$groupedSksN_query_sokho_n_res$$=await $fetchVouchersByMaCt$$($groupedSksN_query_sokho_n_res$$);$groupedSksN_query_sokho_n_res$$.vouchers.forEach(($v$$,$k$$)=>$vouchers_n$$.set($k$$,$v$$));$id_ct_need_delete$$.push(...$groupedSksN_query_sokho_n_res$$.deleteIds)})(),(async()=>{if($ma_kho$$){let $query_sokho_pnc$$={id_app:$id_app$$,ma_ct:"PNC",ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$},$or:[{ma_kho_x:$ma_kho$$},{"details.ma_kho_x":$ma_kho$$}],"details.px_gia_dd":!1};(await global.getModel("pnc").find($query_sokho_pnc$$).lean()).forEach($p$$=>
$vouchers_n$$.set($p$$._id.toString(),$p$$))}})()]);$id_ct_need_delete$$.length>0&&(await sokho.deleteMany({id_app:$id_app$$,id_ct:{$in:$id_ct_need_delete$$}}),await socai.deleteMany({id_app:$id_app$$,id_ct:{$in:$id_ct_need_delete$$}}));const $updateDetailPrice$$=$d$$=>{const $gia_chuan$$=$mapGiaTB$$.get($d$$.ma_vt)||0;var $JSCompiler_inline_result$jscomp$0_ma_vt$$=$d$$.ma_vt;var $ma_dvt$$=$d$$.ma_dvt;$JSCompiler_inline_result$jscomp$0_ma_vt$$=$ma_dvt$$?$mapQuyDoi$$.get(`${$JSCompiler_inline_result$jscomp$0_ma_vt$$}-${$ma_dvt$$}`)||
1:1;$d$$.gia_von=$d$$.gia_von_nt=$gia_chuan$$*$JSCompiler_inline_result$jscomp$0_ma_vt$$;return{gia_chuan:$gia_chuan$$,he_so_qd:$JSCompiler_inline_result$jscomp$0_ma_vt$$}};Logger.info(`[tinhgiatb] C\u1eadp nh\u1eadt ${$vouchers_x$$.size} phi\u1ebfu xu\u1ea5t...`);const $sortedVouchersX$$=_.sortBy([...$vouchers_x$$.values()],$v$$=>(new Date($v$$.ngay_ct)).getTime());for(const $voucher$$ of $sortedVouchersX$$){let $isModified$$=!1;$voucher$$.details&&$voucher$$.details.forEach($d$$=>{$condition$$.ma_vt&&
$condition$$.ma_vt!==$d$$.ma_vt||$d$$.px_gia_dd||$ma_kho$$&&$ma_kho$$!==($d$$.ma_kho||$d$$.ma_kho_x||$voucher$$.ma_kho||$voucher$$.ma_kho_x)||($updateDetailPrice$$($d$$),$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$),$isModified$$=!0);if($d$$.combo&&$d$$.combo.length>0&&!$d$$.px_gia_dd){let $totalTienCombo$$=0;$d$$.combo.forEach($c$$=>{$condition$$.ma_vt&&$condition$$.ma_vt!==$c$$.ma_vt||$ma_kho$$&&$ma_kho$$!==($d$$.ma_kho||$d$$.ma_kho_x||$voucher$$.ma_kho||$voucher$$.ma_kho_x)||
($updateDetailPrice$$($c$$),$c$$.tien_xuat=$c$$.tien_xuat_nt=Math.roundBy(($c$$.sl_xuat||0)*$c$$.gia_von,$f_tien$$),$isModified$$=!0);$totalTienCombo$$+=$c$$.tien_xuat_nt||0});$d$$.tien_xuat=$d$$.tien_xuat_nt=$totalTienCombo$$;$d$$.gia_von=$d$$.gia_von_nt=Math.roundBy($d$$.sl_xuat?$d$$.tien_xuat_nt/$d$$.sl_xuat:0,$f_tien$$)}$d$$.promotion&&$d$$.promotion.details_km&&$d$$.promotion.details_km.forEach($km$$=>{$condition$$.ma_vt&&$condition$$.ma_vt!==$km$$.ma_vt||$km$$.px_gia_dd||$ma_kho$$&&$ma_kho$$!==
($km$$.ma_kho||$voucher$$.ma_kho||$voucher$$.ma_kho_x)||($updateDetailPrice$$($km$$),$km$$.tien_xuat=$km$$.tien_xuat_nt=Math.roundBy(($km$$.sl_xuat||$km$$.sl_km||0)*$km$$.gia_von,$f_tien$$),$isModified$$=!0)})});$voucher$$.details_doi&&$voucher$$.details_doi.forEach($d$$=>{$condition$$.ma_vt&&$condition$$.ma_vt!==$d$$.ma_vt||$d$$.px_gia_dd||$ma_kho$$&&$ma_kho$$!==($d$$.ma_kho||$voucher$$.ma_kho||$voucher$$.ma_kho_x)||($updateDetailPrice$$($d$$),$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*
$d$$.gia_von,$f_tien$$),$isModified$$=!0)});if($isModified$$){const $voucherData$$=getRawData($voucher$$),{_id:$_id$$,...$updatePayload$$}=$voucherData$$,$ctrl$$=global.controllers[$voucher$$.ma_ct.toUpperCase()];await ($ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$voucher$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher$$._id},$updatePayload$$);$ctrl$$&&$ctrl$$.post&&await postDataPromise($voucherData$$,$ctrl$$)}}Logger.info(`[tinhgiatb] C\u1eadp nh\u1eadt ${$vouchers_n$$.size} phi\u1ebfu nh\u1eadp...`);
const $sortedVouchersN$$=_.sortBy([...$vouchers_n$$.values()],$v$$=>(new Date($v$$.ngay_ct)).getTime());for(const $voucher$$ of $sortedVouchersN$$){let $isModified$$=!1;$voucher$$.details&&$voucher$$.details.forEach($d$$=>{$d$$.combo&&$d$$.combo.length!=0||$condition$$.ma_vt&&$condition$$.ma_vt!==$d$$.ma_vt||!($d$$.pn_gia_tb||$voucher$$.ma_ct==="PNC"&&!$d$$.px_gia_dd||$voucher$$.ma_ct==="PKK"&&!$d$$.px_gia_dd)||$ma_kho$$&&$ma_kho$$!==$d$$.ma_kho&&$ma_kho$$!==$d$$.ma_kho_x&&$ma_kho$$!==$voucher$$.ma_kho&&
$ma_kho$$!==$voucher$$.ma_kho_n||($updateDetailPrice$$($d$$),$voucher$$.ma_ct==="PNC"||$voucher$$.ma_ct==="PKK"?($d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$),$d$$.tien_xuat=$d$$.tien_xuat_nt):($d$$.tien_nhap_nt=Math.roundBy($d$$.sl_nhap*$d$$.gia_von,$f_tien$$),$d$$.tien_nhap=$d$$.tien_nhap_nt),$isModified$$=!0);if($d$$.combo&&$d$$.combo.length>0&&($d$$.pn_gia_tb||$voucher$$.ma_ct==="PNC"&&!$d$$.px_gia_dd||$voucher$$.ma_ct==="PKK"&&!$d$$.px_gia_dd)){let $totalTienCombo$$=0;$d$$.combo.forEach($c$$=>
{$condition$$.ma_vt&&$condition$$.ma_vt!==$c$$.ma_vt||$ma_kho$$&&$ma_kho$$!==($d$$.ma_kho||$voucher$$.ma_kho||$voucher$$.ma_kho_n)||($updateDetailPrice$$($c$$),$voucher$$.ma_ct==="PNC"||$voucher$$.ma_ct==="PKK"?($c$$.tien_xuat_nt=Math.roundBy($c$$.sl_xuat*$c$$.gia_von,$f_tien$$),$c$$.tien_xuat=$c$$.tien_xuat_nt):($c$$.tien_nhap_nt=Math.roundBy($c$$.sl_nhap*$c$$.gia_von,$f_tien$$),$c$$.tien_nhap=$c$$.tien_nhap_nt),$isModified$$=!0);$totalTienCombo$$+=$voucher$$.ma_ct==="PNC"||$voucher$$.ma_ct==="PKK"?
$c$$.tien_xuat_nt||0:$c$$.tien_nhap_nt||0});$voucher$$.ma_ct==="PNC"||$voucher$$.ma_ct==="PKK"?($d$$.tien_xuat=$d$$.tien_xuat_nt=$totalTienCombo$$,$d$$.gia_von=$d$$.gia_von_nt=Math.roundBy($d$$.sl_xuat?$d$$.tien_xuat_nt/$d$$.sl_xuat:0,$f_tien$$)):($d$$.tien_nhap=$d$$.tien_nhap_nt=$totalTienCombo$$,$d$$.gia_von=$d$$.gia_von_nt=Math.roundBy($d$$.sl_nhap?$d$$.tien_nhap_nt/$d$$.sl_nhap:0,$f_tien$$))}});$voucher$$.details_doi&&$voucher$$.details_doi.forEach($d$$=>{$condition$$.ma_vt&&$condition$$.ma_vt!==
$d$$.ma_vt||!$d$$.pn_gia_tb||$ma_kho$$&&$ma_kho$$!==$d$$.ma_kho||($updateDetailPrice$$($d$$),$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$),$d$$.tien_xuat=$d$$.tien_xuat_nt,$isModified$$=!0)});if($isModified$$){const $voucherData$$=getRawData($voucher$$),$ctrl$$=global.controllers[$voucher$$.ma_ct.toUpperCase()];await ($ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$voucher$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher$$._id},$voucherData$$);$ctrl$$&&$ctrl$$.post&&await postDataPromise($voucherData$$,
$ctrl$$)}}Logger.info("[tinhgiatb] Ki\u1ec3m tra ch\u00eanh l\u1ec7ch...");let $query_ckvt$$={id_app:$condition$$.id_app,ngay:$den_ngay$$,chenh_lech:1};$condition$$.ma_vt&&($query_ckvt$$.ma_vt=$condition$$.ma_vt);$condition$$.ma_kho&&($query_ckvt$$.ma_kho=$condition$$.ma_kho);const $du_cuoi_ky$$=await new Promise(($resolve$$,$reject$$)=>{ckvt($query_ckvt$$,($err$$,$data$$)=>$err$$?$reject$$($err$$):$resolve$$($data$$))}),$validDuCuoiKy$$=_.filter($du_cuoi_ky$$,$r$$=>$r$$.du00!==0&&($r$$.ton00==0||
Math.abs($r$$.ton00)<.001)),$descVouchersX$$=_.sortBy([...$vouchers_x$$.values()],$v$$=>-(new Date($v$$.ngay_ct)).getTime()),$descVouchersN$$=_.sortBy([...$vouchers_n$$.values()],$v$$=>-(new Date($v$$.ngay_ct)).getTime());let $chung_tu_cap_nhat_chenh_lech$$=new Map;for(const $vt$$ of $validDuCuoiKy$$)$d_voucher_den_thang$$=null,($d_voucher_den_thang$$=$descVouchersX$$.find($x$$=>{const $det$$=($x$$.details||[]).find($vc$$=>$vc$$.ma_vt==$vt$$.ma_vt&&!$vc$$.px_gia_dd&&(!$ma_kho$$||$ma_kho$$===$vc$$.ma_kho||
$ma_kho$$===$x$$.ma_kho));return $det$$?($det$$.tien_xuat_nt+=$vt$$.du00,$det$$.tien_xuat=Math.roundBy($det$$.tien_xuat_nt,$f_tien$$),$det$$.sl_xuat&&($det$$.gia_von=$det$$.gia_von_nt=Math.roundBy($det$$.tien_xuat_nt/$det$$.sl_xuat,0)),!0):!1}))||($d_voucher_den_thang$$=$descVouchersN$$.find($n$$=>{const $det$$=($n$$.details||[]).find($vc$$=>$vc$$.ma_vt==$vt$$.ma_vt&&!$vc$$.pn_gia_tb&&(!$ma_kho$$||$ma_kho$$===$vc$$.ma_kho||$ma_kho$$===$n$$.ma_kho));return $det$$?($det$$.tien_nhap_nt-=$vt$$.du00,$det$$.tien_nhap=
Math.roundBy($det$$.tien_nhap_nt,$f_tien$$),$det$$.sl_nhap&&($det$$.gia_von=$det$$.gia_von_nt=Math.roundBy($det$$.tien_nhap_nt/$det$$.sl_nhap,0)),!0):!1})),$d_voucher_den_thang$$&&$chung_tu_cap_nhat_chenh_lech$$.set($d_voucher_den_thang$$._id.toString(),$d_voucher_den_thang$$);if($chung_tu_cap_nhat_chenh_lech$$.size>0){Logger.info(`\u26a0\ufe0f [tinhgiatb] Updating ${$chung_tu_cap_nhat_chenh_lech$$.size} vouchers for discrepancy...`);for(const $voucher$$ of $chung_tu_cap_nhat_chenh_lech$$.values()){const $voucherData$$=
getRawData($voucher$$),$ctrl$$=global.controllers[$voucherData$$.ma_ct.toUpperCase()];await ($ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$voucherData$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher$$._id},$voucherData$$);$ctrl$$&&$ctrl$$.post&&await postDataPromise($voucherData$$,$ctrl$$)}}await new Promise($resolve$$=>{$bang_gia$$.joinModel2($id_app$$,dmvt,[{where:"ma_vt",fields:"ten_vt"}],$resolve$$)});$fn$$(null,$bang_gia$$)}catch($e$$){Logger.error("\u274c [tinhgiatb] Critical Error:",
$e$$),$fn$$($e$$)}};