flexbiz-server
Version:
Flexible Server
33 lines (32 loc) • 14.4 kB
JavaScript
const validator=require("validator"),redisCache=require("../libs/redis-cache"),customerSchema=new Schema({id_app:{type:String,required:!0,maxlength:1024},ma_kh:{type:String,uppercase:!0,required:!0,default:"",trim:!0,maxlength:32},ten_kh:{type:String,required:"Y\u00eau c\u1ea7u nh\u1eadp t\u00ean kh\u00e1ch h\u00e0ng",trim:!0,maxlength:1024},device_user_id:String,gioi_tinh:{type:String,maxlength:1024},ngay_sinh:Date,dia_chi:{type:String,maxlength:1024},xa_phuong:{type:String,maxlength:1024},quan_huyen:{type:String,
maxlength:1024},tinh_thanh:{type:String,maxlength:1024},location:Schema.Types.Mixed,dien_thoai:{type:String,maxlength:1024,trim:!0},dia_chi2:{type:String,maxlength:1024},xa_phuong2:{type:String,maxlength:1024},quan_huyen2:{type:String,maxlength:1024},tinh_thanh2:{type:String,maxlength:1024},location2:Schema.Types.Mixed,dien_thoai2:{type:String,maxlength:1024,trim:!0},fax:{type:String,maxlength:1024},email:{type:String,maxlength:1024},fb_id:String,page_id:String,website:{type:String,maxlength:1024},
ma_so_thue:{type:String,maxlength:1024},phu_trach:{type:String,maxlength:1024},ten_phu_trach:String,loai_kh:{type:String,default:"",trim:!0,maxlength:1024},nh_kh:{type:String,default:"",trim:!0,maxlength:1024},ten_nh_kh:String,nh_kh2:[String],nh_kh3:[String],nh_kh4:[String],nh_kh5:[String],nh_kh6:[String],ma_nganh_hang:[String],khu_vuc_phu_trach:[],ma_kho_npp:String,ghi_chu:{type:String,default:"",trim:!0,maxlength:1024},isdistributor:{type:Boolean},ncc_yn:{type:Boolean,default:!0},kh_yn:{type:Boolean,
default:!0},isbuyer:{type:Boolean,default:!0},isseller:Boolean,iscarrier:Boolean,from_updated:{type:String,default:"M",maxlength:1024},of_user:{type:String,lowercase:!0,maxlength:1024,set:function($of_user$$){this._previous_of_user=this.of_user;return $of_user$$}},group_user:String,default_password:{type:String},exfields:Schema.Types.Mixed,trang_thai:{type:String,default:"1"},activities:{},status:{type:Boolean,default:!0},ngay_mua_dau_tien:Date,ngay_mua_gan_nhat:Date,ngay_tuong_tac_gan_nhat:{type:Date,
default:Date.now},latest_note:Schema.Types.Mixed,labels:[String],hinh_anh:String,ho_so_dinh_kem:[String],tk_ngan_hang:String,ten_ngan_hang:String,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],visible_to_usergroups:[String],update_right:[String],delete_right:[String],dataview_to:{type:Number,default:0},dataview_to_users:[String]},
{toJSON:{virtuals:!0}});
customerSchema.pre("save",function($next$$){if(!this.of_user)return $next$$();const $self$$=this;if(this.isNew||this.of_user!=this._previous_of_user){let $condition$$={id_app:this.id_app,of_user:this.of_user,ma_kh:{$ne:this.ma_kh}};Logger.info("Check of_user, previous of_user:",this._previous_of_user,"new of_user:",this.of_user,"ma_kh:",this.ma_kh);mongoose.models.customer.find($condition$$,{ten_kh:1,ma_kh:1},($e$$,$khs$$)=>{$khs$$.length>0?$next$$(Error(`Ng\u01b0\u1eddi s\u1eed d\u1ee5ng '${$self$$.of_user}' \u0111\u00e3 \u0111\u01b0\u1ee3c g\u1eafn cho kh\u00e1ch h\u00e0ng '${$khs$$.map($kh$$=>$kh$$.ma_kh+
" - "+$kh$$.ten_kh).join(",")}'`)):$next$$()})}else $next$$()});
(global.configs||{}).createIndexes&&(Logger.info("[customer] t\u1ea1o indexes...."),customerSchema.index({id_app:1,ma_kh:1},{unique:!0}),customerSchema.index({id_app:1,ma_kh:1,ten_kh:1,status:1}),customerSchema.index({id_app:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,isbuyer:1,is_staff:1}),customerSchema.index({id_app:1,nh_kh:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,nh_kh2:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,nh_kh3:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,
nh_kh4:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,nh_kh5:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,nh_kh:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,nh_kh2:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,nh_kh3:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,nh_kh4:1,isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,trang_thai:1,nh_kh5:1,
isbuyer:1,ten_kh:1}),customerSchema.index({id_app:1,isseller:1,ten_kh:1}),customerSchema.index({id_app:1,loai_kh:1,status:1}),customerSchema.index({id_app:1,iscarrier:1,ten_kh:1}),customerSchema.index({id_app:1,fb_id:1}),customerSchema.index({id_app:1,page_id:1}),customerSchema.index({id_app:1,page_id:1,fb_id:1}),customerSchema.index({id_app:1,phu_trach:1,of_user:1}),customerSchema.index({id_app:1,isdistributor:1,status:1}),customerSchema.index({id_app:1,khu_vuc_phu_trach:1,status:1}),customerSchema.index({id_app:1,
activities:1,status:1}),customerSchema.index({id_app:1,ma_nganh_hang:1,status:1}),customerSchema.index({id_app:1,ngay_mua_gan_nhat:1,status:1}),customerSchema.index({id_app:1,ngay_mua_dau_tien:1,status:1}),customerSchema.index({id_app:1,ngay_tuong_tac_gan_nhat:1,status:1}),customerSchema.index({id_app:1,dien_thoai:1,status:1}),customerSchema.index({id_app:1,email:1,status:1}),customerSchema.index({id_app:1,tinh_thanh:1,status:1}),customerSchema.index({id_app:1,tinh_thanh:1,quan_huyen:1,status:1}),
customerSchema.index({id_app:1,tinh_thanh:1,quan_huyen:1,xa_phuong:1,status:1}),customerSchema.index({id_app:1,tinh_thanh:1,quan_huyen:1,xa_phuong:1,dia_chi:1,status:1}),customerSchema.index({id_app:1,status:1,ma_kh:1,ten_kh:1,dia_chi:1,xa_phuong:1,quan_huyen:1,tinh_thanh:1,dien_thoai:1,email:1,ma_so_thue:1,phu_trach:1,of_user:1}),customerSchema.index({id_app:1,trang_thai:1,status:1}),customerSchema.index({id_app:1,date_created:-1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,
user_created:1,visible_to:1,visible_to_users:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,visible_to_users:1,iscarrier:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,visible_to_users:1,isbuyer:1,is_staff:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,visible_to_users:1,nh_kh:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,
user_created:1,visible_to:1,visible_to_users:1,ma_kh:1,ten_kh:1,dien_thoai:1,email:1,ma_so_thue:1,dia_chi:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,visible_to_users:1,ma_kh:1,ten_kh:1,tinh_thanh:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,visible_to_users:1,ma_kh:1,ten_kh:1,tinh_thanh:1,quan_huyen:1}),customerSchema.index({id_app:1,trang_thai:1,of_user:1,phu_trach:1,user_created:1,visible_to:1,
visible_to_users:1,ma_kh:1,ten_kh:1,tinh_thanh:1,quan_huyen:1,xa_phuong:1,dia_chi:1,dien_thoai:1,email:1,ma_so_thue:1,nh_kh:1}),customerSchema.index({id_app:1,ma_kh:"text",ten_kh:"text",dia_chi:"text",xa_phuong:"text",quan_huyen:"text",tinh_thanh:"text",dien_thoai:"text",email:"text",ma_so_thue:"text",phu_trach:"text"},{name:"customer_index",default_language:"none"}));const model=mongoose.models.customer||mongoose.model("customer",customerSchema);
if((global.configs||{}).createIndexes)model.on("index",async function($err$$){$err$$?(Logger.error("Customer index error",$err$$),(await model.aggregate([{$group:{_id:{id_app:"$id_app",ma_kh:"$ma_kh"},count:{$sum:1},ids:{$push:"$_id"}}},{$match:{count:{$gt:1}}}])).forEach($d$$=>{console.info("customer duplication",$d$$._id,$d$$.ids);$d$$.ids.forEach(($id$$,$index$$)=>{$index$$>0&&console.info("you should delete customer",$id$$)})})):console.info("Customer indexing complete")});
model.referenceKeys={ma_kh:[{model:"cdkh",key:"ma_kh",error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong b\u1ea3ng c\u00e2n \u0111\u1ed1i kh\u00e1ch h\u00e0ng"},{model:"socai",key:"ma_kh_no",error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u trong s\u1ed5 c\u00e1i"},{model:"socai",key:"ma_kh_co",error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u s\u1ed5 c\u00e1i"},{model:"sokho",key:"ma_kh",
error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u s\u1ed5 kho"},{model:"so1",key:"ma_kh",error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u \u1edf \u0111\u01a1n \u0111\u1eb7t h\u00e0ng \u0111\u01a1n \u0111\u1eb7t h\u00e0ng"},{model:"pbl",key:"ma_kh",error:"Kh\u00e1ch h\u00e0ng ${obj.ten_kh} \u0111\u00e3 ph\u00e1t sinh d\u1eef li\u1ec7u \u1edf phi\u1ebfu b\u00e1n l\u1ebb"}]};
model.createCustomerCode=function($id_app$$,$ma_kh$$,$lanthu$$,$callback$$){$ma_kh$$=$ma_kh$$.replace(/[^\w\s]/gi,"").split(" ").join("").toUpperCase();model.findOne({ma_kh:$ma_kh$$,id_app:$id_app$$},function($e$$,$rs$$){if($e$$)return $callback$$($e$$);if($rs$$)$lanthu$$+=1,$ma_kh$$=$ma_kh$$.substring(0,$ma_kh$$.length-$lanthu$$.toString().length)+$lanthu$$.toString(),model.createCustomerCode($id_app$$,$ma_kh$$,$lanthu$$,$callback$$);else return $callback$$(null,$ma_kh$$)})};
model.asyncCreateCustomerCode=async($id_app$$,$ma_kh$$,$lanthu$$)=>{$lanthu$$||=0;$ma_kh$$.length>32&&($ma_kh$$=$ma_kh$$.substring(0,32));return new Promise($resolve$$=>{model.createCustomerCode($id_app$$,$ma_kh$$,$lanthu$$,($e$$,$rs$$)=>{$resolve$$($rs$$||"")})})};
model.getInfo=async($id_app$$,$condition$$,$fields$$)=>{$condition$$.id_app=$id_app$$;return new Promise(($resolve$$,$reject$$)=>{model.findOne($condition$$).lean().then($rs$$=>{if(!$rs$$)return $reject$$("Can't find customer information");$resolve$$($fields$$?$rs$$[$fields$$]:$rs$$)}).catch($e$$=>{$reject$$($e$$.message)})})};
model.getList=async($id_app$$,$condition$$,$field$$)=>{$condition$$.id_app=$id_app$$;return new Promise(($resolve$$,$reject$$)=>{model.find($condition$$).lean().then($rs$$=>{$resolve$$($field$$?$rs$$.map($r$$=>$r$$[$field$$]):$rs$$)}).catch($e$$=>{$reject$$(Error($e$$.message))})})};
model.asyncCreateCustomer=async $data$$=>{if($data$$.of_user){var $_cust__cust$$=await model.findOne({id_app:$data$$.id_app,of_user:$data$$.of_user});if($_cust__cust$$)return $_cust__cust$$}$data$$.ma_kh||($data$$.ma_kh=await model.asyncCreateCustomerCode($data$$.id_app,$data$$.ten_kh));return($_cust__cust$$=await model.findOne({id_app:$data$$.id_app,ma_kh:$data$$.ma_kh}))?$_cust__cust$$:new Promise(($resolve$$,$reject$$)=>{$data$$.email&&!validator.isEmail($data$$.email)&&($data$$.email="");model.create($data$$,
($e$$,$rs$$)=>$e$$?$reject$$(Error($e$$.message)):$resolve$$($rs$$))})};model.buyVouchers=["SO1","SO9","HD2","HD1","PBL"];
model.updateActives=async $cust_o_kh$$=>{let $has_changed$$=!1,$_id$$,$kh$$;if($cust_o_kh$$.ma_kh&&$cust_o_kh$$.id_app)($kh$$=await model.findOne({id_app:$cust_o_kh$$.id_app,ma_kh:$cust_o_kh$$.ma_kh},{_id:1,ngay_tuong_tac_gan_nhat:1,ngay_mua_gan_nhat:1,trang_thai:1}))&&($_id$$=$kh$$._id.toString());else{var $link_ngay_tuong_tac_gan_nhat$$=$cust_o_kh$$.id_kh||$cust_o_kh$$.id_link;$link_ngay_tuong_tac_gan_nhat$$&&global.mongoose.Types.ObjectId.isValid($link_ngay_tuong_tac_gan_nhat$$)&&($kh$$=await model.findOne({_id:$link_ngay_tuong_tac_gan_nhat$$},
{_id:1,ngay_tuong_tac_gan_nhat:1,ngay_mua_gan_nhat:1,trang_thai:1}))&&($_id$$=$kh$$._id.toString())}if(!$kh$$)return{};let $ngay_mua_gan_nhat$$,$ngay_mua_dau_tien$$,$trang_thai$$=$kh$$.trang_thai;$link_ngay_tuong_tac_gan_nhat$$=$kh$$.ngay_tuong_tac_gan_nhat;$cust_o_kh$$.date_created&&(!$kh$$.ngay_tuong_tac_gan_nhat||(new Date($kh$$.ngay_tuong_tac_gan_nhat)).getTime()<(new Date($cust_o_kh$$.date_created)).getTime())&&$_id$$!=($cust_o_kh$$._id||"").toString()&&($link_ngay_tuong_tac_gan_nhat$$=$cust_o_kh$$.date_created,
$has_changed$$=!0,$kh$$.trang_thai=="3"&&($trang_thai$$="5"));var $dhdt_dhgn$$=await global.getModel("sokho").findOne({ma_kh:$cust_o_kh$$.ma_kh,id_app:$cust_o_kh$$.id_app,gia_ban_nt:{$gt:0},ma_ct:{$in:model.buyVouchers}},{ngay_ct:1,so_ct:1,ma_ct:1,ma_vt:1,gia_ban_nt:1}).sort({ngay_ct:1}).lean();$dhdt_dhgn$$||=await global.getModel("sokhonpp").findOne({ma_kh:$cust_o_kh$$.ma_kh,id_app:$cust_o_kh$$.id_app,gia_ban_nt:{$gt:0},ma_ct:{$in:model.buyVouchers}},{ngay_ct:1,so_ct:1,ma_ct:1,ma_vt:1,gia_ban_nt:1}).sort({ngay_ct:1}).lean();
if($dhdt_dhgn$$)$kh$$.ngay_mua_dau_tien&&(new Date($dhdt_dhgn$$.ngay_ct)).getTime()==(new Date($kh$$.ngay_mua_dau_tien)).getTime()||($has_changed$$=!0,$ngay_mua_dau_tien$$=$dhdt_dhgn$$.ngay_ct),$kh$$.trang_thai==="9"||$kh$$.trang_thai=="1"&&!$kh$$.ngay_mua_gan_nhat||($has_changed$$=!0,$trang_thai$$="1");else if($kh$$.ngay_mua_gan_nhat||$kh$$.ngay_mua_dau_tien)$has_changed$$=!0,$kh$$.ngay_mua_gan_nhat=null,$ngay_mua_dau_tien$$=$ngay_mua_gan_nhat$$=$kh$$.ngay_mua_dau_tien=null,$kh$$.trang_thai=="1"&&
($trang_thai$$="5");$dhdt_dhgn$$&&(($dhdt_dhgn$$=await global.getModel("sokho").findOne({ma_kh:$cust_o_kh$$.ma_kh,id_app:$cust_o_kh$$.id_app,gia_ban_nt:{$gt:0},ma_ct:{$in:model.buyVouchers}},{ngay_ct:1}).sort({ngay_ct:-1}).lean())||await global.getModel("sokhonpp").findOne({ma_kh:$cust_o_kh$$.ma_kh,id_app:$cust_o_kh$$.id_app,gia_ban_nt:{$gt:0},ma_ct:{$in:model.buyVouchers}},{ngay_ct:1}).sort({ngay_ct:-1}).lean(),!$dhdt_dhgn$$||$kh$$.ngay_mua_gan_nhat&&(new Date($dhdt_dhgn$$.ngay_ct)).getTime()==(new Date($kh$$.ngay_mua_gan_nhat)).getTime()||
($has_changed$$=!0,$ngay_mua_gan_nhat$$=$dhdt_dhgn$$.ngay_ct));$has_changed$$&&($ngay_mua_gan_nhat$$=$ngay_mua_gan_nhat$$||$kh$$.ngay_mua_gan_nhat,$ngay_mua_dau_tien$$=$ngay_mua_dau_tien$$||$kh$$.ngay_mua_dau_tien,$link_ngay_tuong_tac_gan_nhat$$=$link_ngay_tuong_tac_gan_nhat$$||$kh$$.ngay_tuong_tac_gan_nhat,Logger.warn("[customer][updateActives]",JSON.stringify({ngay_mua_gan_nhat:$ngay_mua_gan_nhat$$,ngay_mua_dau_tien:$ngay_mua_dau_tien$$,ngay_tuong_tac_gan_nhat:$link_ngay_tuong_tac_gan_nhat$$,trang_thai:$trang_thai$$},
null,2)),await model.updateOne({_id:$_id$$},{ngay_mua_gan_nhat:$ngay_mua_gan_nhat$$,ngay_mua_dau_tien:$ngay_mua_dau_tien$$,ngay_tuong_tac_gan_nhat:$link_ngay_tuong_tac_gan_nhat$$,trang_thai:$trang_thai$$}),$cust_o_kh$$=await model.findById($kh$$._id).lean(),redisCache.set("customer",$cust_o_kh$$));return{ngay_mua_gan_nhat:$ngay_mua_gan_nhat$$,ngay_mua_dau_tien:$ngay_mua_dau_tien$$,ngay_tuong_tac_gan_nhat:$link_ngay_tuong_tac_gan_nhat$$}};module.exports=model;