kpiplus
Version:
KPI+
1 lines • 44.1 kB
JavaScript
;var EventEmitter=require("events").EventEmitter,underscore=require("underscore"),excelReport=require("excel-report"),validate=require("../libs/validate"),vsocai=require("../models/vsocai"),Socai=require("../models/socai"),OptionsModel=require("../models/options"),Approve=require("../models/approve"),rpt=require("../models/rpt"),log=require("../models/log"),trangthai=require("../models/trangthai"),app=require("../models/app"),dmqct=require("../models/dmqct"),counter=require("../models/counter"),async=require("async"),excel=require("../libs/excel");let arrayfuncs=require("../libs/array-funcs");var permission=require("../libs/permission"),fs=require("fs"),follow=require("../models/follow"),link=require("../models/link"),stp=require("stp-utils"),userAdmins=require("../configs").admins,moment=require("moment"),Parameter=require("../models/parameter"),dvcs=require("../models/dvcs"),tontucthoi=require("../models/tontucthoi"),numberToWord=require("../libs/utils").numberToWord,redisCache=require("../libs/redis-cache"),syncSQL=require("../libs/syncSQL"),path=require("path"),request=require("request"),bodyToJson=function(e){return e.json&&(e=stp.parse(e.json)),e},isExists=function(e,t,n,i,r){if(!t||0===t.length)return r(null,!1);let o;o=n.id_app?{id_app:n.id_app}:{};for(let e=0;e<t.length;e++){let i=t[e],r=n[i];r&&(o[i]=r)}i?e.remove(o,function(e,t){if(e)return r(e);r(null,!1)}):e.findOne(o,{_id:1},function(e,t){return e?r(e):t?void r(null,!0):r(null,!1)})};class controller{constructor(e,t,n,i={}){this.name=n,this.model=t,this.router=e,this.module=this.name,controllers[n.toUpperCase()]=this,i.findExact||(i.findExact={}),void 0===i.require_id_app||!0===i.require_id_app?(this.require_id_app=!0,this.route_name=`/:id_app/${this.module}`):(this.require_id_app=!1,this.route_name=`/${this.module}`),i.collection_name?this.collection_name=i.collection_name:this.collection_name=n,this.sort=i.sort,this.unique=i.unique,this.getting=i.onGetting,this.finding=i.onFinding,this.found=i.onFound,this.view=i.onView,this.creating=i.onCreating,this.created=i.onCreated,this.updating=i.onUpdating,this.updated=i.onUpdated,this.deleting=i.onDeleting,this.deleted=i.onDeleted,this.approveData=i.approveData,this.mapSql=i.mapSql,this.mapSql||(this.mapSql=function(e,t){t()}),this.mapWeb=i.mapWeb,this.excelParse=i.onExcelParse,this.options=i,this.replaceIfExists=i.replaceIfExists,this.codeSync=i.codeSync,this.keySync=i.keySync,this.notNeedRight=i.notNeedRight}getNextId(){let e=this.name;this.router.route(`${this.route_name}/next/:field`).get(function(t,n,i){let r=t.user.current_id_app,o=t.params.field;getNextSequence(r,e,o,function(e,t){if(e)return n.status(400).send(e);n.send(t)})})}checkData(e,t,n){async.parallel({checkTOnKHo:n=>{t.details&&e.options&&e.options.khong_xuat_kho_am?async.map(t.details,(e,n)=>{if(e.ma_vt&&e.sl_xuat&&"PNC"!==t.ma_ct){let i=e.ma_kho||t.ma_kho||t.ma_kho_x,r={ma_vt:e.ma_vt,ma_kho:i};e.ma_lo&&(r.ma_lo=e.ma_lo),e.han_sd&&(r.han_sd=e.han_sd),e.ma_tt1&&(r.ma_tt1=e.ma_tt1),e.ma_tt2&&(r.ma_tt2=e.ma_tt2),e.ma_tt3&&(r.ma_tt3=e.ma_tt3),tontucthoi.find(r).lean().exec((t,i)=>{if(t)return n(t);let r=i.csum("ton00");e.sl_xuat>r?n("Sản phẩm '"+(e.ten_vt||e.ma_vt)+"' có số lượng xuất lớn hơn số lượng tồn trong kho"):n()})}else n()},(e,t)=>{n(e)}):n()}},(e,t)=>{n(e)})}cacheData(e,t){e&&e.toObject&&(e=e.toObject()),redisCache.set(this.model.collection.name.substring(0,this.model.collection.name.length-1),e,t)}deleteData(e,t){e&&e.toObject&&(e=e.toObject()),redisCache.remove(this.model.collection.name.substring(0,this.model.collection.name.length-1),e,t)}createRoute(e,t,n={method:"GET"}){let i=this;n.method?n.method=n.method.toUpperCase():n.method="GET";let r=function(e,r,o){if(!1===i.require_id_app)t(e,function(e,t){if(e)return r.status(400).send(e);r.send(t)});else{let o=e.params.id_app;permission.hasRight(o,e.user.email,this.module,"view",function(n,i,o){if(i){if(!permission.checkUseTime(o))return r.status(403).send(`OFD - Chương trình cho ${o.name} đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng.`);t(e,function(e,t){if(e)return r.status(400).send(e);r.send(t)})}else r.status(403).send("Bạn không có quyền chức năng này")},{notNeedRight:i.notNeedRight||n.notNeedRight})}},o=`${this.route_name}/${e}`,s=this.router;"DELETE"==n.method?s.route(o).delete(r):"POST"==n.method?s.route(o).post(r):"PUT"==n.method?s.route(o).put(r):s.route(o).get(r)}requestApprove(e,t,n,i){let r=this;if(!(e&&e.options&&r.approveData&&r.approveData.trang_thai&&r.approveData.approve_users_field))return i(null,n);let o=r.approveData.title||"Yêu cầu duyệt",s=e.options[r.approveData.approve_users_field],a=r.approveData.update_after_approve;if(!s)return console.log("Khong co nugoi duyet",JSON.stringify(r.approveData.approve_users_field),s),i(null,n);if(n.trang_thai==r.approveData.trang_thai&&s){let e=s.map(e=>({email:e,name:e}));Approve.request(t,e,o,n,(e,t)=>{e&&console.log("error create request approve",e.message)},a)}i(null,n)}syncEnterprise(e,t){let n=this,i=this.codeSync,r=this.keySync;if(!i||!r)return t(null,e);app.findOne({_id:e.id_app}).lean().exec(function(o,s){if(o||!s||!s.stp_api_address||!s.stp_api_token)return t(null,e);let a={};underscore.extend(a,e);for(let e in a)underscore.isObject(a[e])&&(a[e]=JSON.stringify(a[e])),"stt_rec"!=r&&(a.trang_thai=a.status),a.ngay_tao=a.date_created,a.ngay_sua=a.date_updated,a.user_created&&(a.nguoi_tao=a.user_created.substring(0,16)),a.user_updated&&(a.nguoi_sua=a.user_updated.substring(0,16));n.mapSql(a,function(o){if(o)return t(null,e);let u,c;if("stt_rec"!=r||e.stt_rec){let n=e[r];if(!n)return t(null,e);u="put",c=s.stp_api_address+"/"+i+"/"+r+"/"+n+"?token="+s.stp_api_token}else u="post",c=s.stp_api_address+"/"+i+"?token="+s.stp_api_token;request({method:u,body:[a],json:!0,url:c},function(o,a,u){return o?t(null,e):!u||u.indexOf("ERROR:")>=0||u.indexOf("<HTML>")>=0?(console.log("error",c,u),t(null,e)):void("stt_rec"===r?(e.stt_rec=u,c=s.stp_api_address+"/"+i+"/latest?stt_rec="+u+"&token="+s.stp_api_token,request.get(c,function(i,r,o){if(o&&o.indexOf("ERROR:")<0&&o.indexOf("<HTML>")<0){let i=JSON.parse(o);if(underscore.isString(i)&&(i=JSON.parse(i)),underscore.isString(i))return t(null,e);i&&1==i.length&&i[0].stt_rec?(underscore.extend(e,i[0]),n.model.findOneAndUpdate({_id:e._id},{$set:e},function(n,i){t(null,e)})):n.model.findOneAndUpdate({_id:e._id},{$set:{stt_rec:u}},function(n,i){t(null,e)})}else n.model.findOneAndUpdate({_id:e._id},{$set:{stt_rec:u}},function(n,i){t(null,e)})})):t(null,e))})})})}}controller.prototype.__proto__=EventEmitter.prototype;var getNextSequence=function(e,t,n,i){counter.getNextSequence(e,t,n,function(e,r){e?i(e):dmqct.findOne({ma_ct:t.toUpperCase(),status:!0,field:n},function(e,t){let o=r.toString();if(t){t.tien_to||(t.tien_do=""),t.hau_to||(t.hau_to="");let e="0000000000000000000000",n=t.den_so;n||(n=999999);let i=n.toString().length-o.length;i>0&&(o=t.tien_to+e.substring(0,i)+o+t.hau_to),t.so_ht=r,t.save(function(e,t){e&&console.log("Can't update so_ht",e)})}let s={};s[n]=o,i(null,s)})})};controller.prototype.getSocai=function(){this.sort,this.model;this.router.route(`${this.route_name}/socai/:id_ct`).get(function(e,t,n){let i={id_ct:e.params.id_ct};Socai.find(i).lean().exec((e,n)=>{if(e)return t.status(400).send(e);t.send(n)})})},controller.prototype.find=function(){let e=this.sort,t=this.model,n=this;this.router.route(this.route_name).get(function(e,i,r){let o={},s=[];for(let i in e.query)if("id_app"!=i&&"access_token"!=i)if("_id"!=i)if("q"==i&&e.query[i]){if((o=stp.parse(e.query[i]))||(o={}),o.sync_from_date){let e=moment(new Date(o.sync_from_date)).startOf("date").toDate();o.date_updated={$gte:e},delete o.sync_from_date}}else if("fields"!==i&&!0===underscore.has(t.schema.paths,i))if(n.options.findExact[i])o[i]=e.query[i];else{let t={};t[i]={$regex:e.query[i],$options:"i"},s.push(t)}else"$text"==i&&s.push({$text:{$search:e.query[i]}});else try{let t=mongoose.Types.ObjectId(e.query._id);s.push({_id:t})}catch(e){}0!==s.length&&(o.$or=s),n.finding?n.finding(e.user,o,function(t,n){if(t)return i.status(400).send(t);e.condition=n,r()},{req:e}):(e.condition=o,r())},function(e,i,r){n.codeSync&&n.keySync&&("stt_rec"!=n.keySync||n.mapWeb)?syncSQL.baseSync(e.user.current_id_app,t,n.codeSync,n.keySync,function(e){e&&console.log("error when sync STP Enterprise",e),r()},{mapWeb:n.mapWeb}):r()},function(e,i,r){if(e.query.fields&&e.query.fields.split(",").length<=10&&e.query.fields.indexOf("details")<0&&e.query.fields.indexOf("vatvaos")<0&&e.query.fields.indexOf("vatras")<0)return r();permission.getRightByItem(e.user.current_id_app,t,e.user.email,function(t,i,o){if(t)return r(t);if(o)return r();e.admin=o;let s=e.condition;s||(s={}),s.$and||(s.$and=[]),n.options.onRightByItem?n.options.onRightByItem(e.user,i,(t,n)=>{if(t)return r(t);s.$and.push(n),e.condition=s,r()}):(s.$and.push(i),e.condition=s,r())})},function(e,t,i){n.options.assignWiths?async.map(n.options.assignWiths,(t,n)=>{let i=require("../models/"+t.ref_collection);permission.getRightByItem(e.user.current_id_app,i,e.user.email,function(r,o,s){return r?n(r):s?n():(o.id_app=e.user.current_id_app,void i.find(o).lean().exec((i,r)=>{if(i)return n(i);let o=underscore.pluck(r,t.ref_field);o.push(""),o.push(null),e.condition[t.ref_field]={$in:o},n()}))})},(e,t)=>{if(e)return i(e);i()}):i()},function(e,i,r){if(e.admin||"dmdt"===n.name)return r();if(e.query.fields&&e.query.fields.split(",").length<=10&&e.query.fields.indexOf("details")<0&&e.query.fields.indexOf("vatvaos")<0&&e.query.fields.indexOf("vatras")<0)return r();if(underscore.has(t.schema.paths,"ma_dt")||underscore.has(t.schema.paths,"id_dt")){let n=require("../models/dmdt");permission.getRightDataView(e.user.current_id_app,n,e.user.email,function(i,o,s){return i?r(i):s?r():(o.id_app=e.user.current_id_app,void n.find(o,{ma_dt:1,_id:1}).lean().exec((n,i)=>{if(n)return r(n);if(underscore.has(t.schema.paths,"ma_dt")){let t=underscore.pluck(i,"ma_dt");t.push(""),t.push(null),e.condition.ma_dt={$in:t}}else{let t=underscore.pluck(i,"_id");t.push(""),t.push(null),e.condition.id_dt={$in:t}}r()}))})}else r()},function(e,i,r){if(e.admin||"dmkho"===n.name)return r();if(e.query.fields&&e.query.fields.split(",").length<=10&&e.query.fields.indexOf("details")<0&&e.query.fields.indexOf("vatvaos")<0&&e.query.fields.indexOf("vatras")<0)return r();if(underscore.has(t.schema.paths,"ma_kho")||underscore.has(t.schema.paths,"ma_kho_x")||underscore.has(t.schema.paths,"ma_kho_n")){let n=require("../models/dmkho");permission.getRightDataView(e.user.current_id_app,n,e.user.email,function(i,o,s){return i?r(i):s?r():(o.id_app=e.user.current_id_app,void n.find(o,{ma_kho:1}).lean().exec((n,i)=>{if(n)return r(n);let o=underscore.pluck(i,"ma_kho");o.push(""),o.push(null),underscore.has(t.schema.paths,"ma_kho")&&(e.condition.ma_kho={$in:o}),underscore.has(t.schema.paths,"ma_kho_x")&&underscore.has(t.schema.paths,"ma_kho_n")&&(e.condition.ma_kho_n={$in:o}),r()}))})}else r()},function(e,i,r){if(e.admin||"customer"===n.name)return r();if(e.query.fields&&e.query.fields.split(",").length<=10&&e.query.fields.indexOf("details")<0&&e.query.fields.indexOf("vatvaos")<0&&e.query.fields.indexOf("vatras")<0)return r();if(underscore.has(t.schema.paths,"ma_kh")){let t=require("../models/customer");permission.getRightDataView(e.user.current_id_app,t,e.user.email,function(n,i,o){return n?r(n):o?r():(i.id_app=e.user.current_id_app,void t.find(i,{ma_kh:1}).lean().exec((t,n)=>{if(t)return r(t);let i=underscore.pluck(n,"ma_kh");i.push(""),i.push(null),e.condition.ma_kh={$in:i},r()}))})}else r()},function(e,t,i){let r=e.condition;if(1==r.follow){delete r.follow;let t={user_created:e.user.email},o=n.name;"customer"==o&&(o="dmkh"),"account"==o&&(o="dmtk"),"currency"==o&&(o="dmnt"),t.collection_name=o,follow.find(t,{id_object:1}).lean().exec(function(e,t){e?console.error(e):r._id={$in:underscore.pluck(t,"id_object")},i()})}else i()},function(e,t,i){if(e.query.fields&&e.query.fields.split(",").length<=10&&e.query.fields.indexOf("details")<0&&e.query.fields.indexOf("vatvaos")<0&&e.query.fields.indexOf("vatras")<0)return i();permission.hasRight(e.user.current_id_app,e.user.email,n.module,"view",function(r,o){if(n.options.onQuery)e.permission=o,n.options.onQuery(e,n=>n?i(n):e.permission?void i():t.send([]));else{if(!o)return t.send([]);i()}},{notNeedRight:n.options.notNeedRight})},function(i,r,o){let s=i.condition;s||(s={}),!0===underscore.has(t.schema.paths,"id_app")&&(s.id_app=i.user.current_id_app);let a=null;if(1!=i.query.count){let u=i.query.fields,c={};u&&u.split(",").forEach(e=>{"_id"!=e&&(c[e]=1)}),a=t.find(s,c);let d=i.query.page,l=i.query.limit;if(l&&(l=Number(l)),d){l||(l=20);let e=(Number(d)-1)*l;a.skip(e).limit(l)}else l&&a.limit(l);e&&a.sort(e),a.lean().exec(function(e,t){return e?r.status(400).send(e):t?void async.parallel({found:function(e){n.found?n.found(i.user,s,t,function(t,n){e(t,n)}):e(null,t)},set_collection_name:function(e){t.forEach(e=>{e.collection_name||(e.collection_name=n.collection_name)}),e(null)}},function(e,s){if(e)return o(e);t=s.found,async.parallel({e_view:function(e){if(n.view){var r=t;n.view(i.user,r,(t,n)=>{if(t)return e(t);e(null,n)},{req:i})}else e(null,t)}},function(t,s){if(e)return o(e);if(i.query.type_data&&"xlsx"==i.query.type_data){let e=`${path.dirname(__dirname)}/templates/excels/lists/${n.name}.xlsx`,t={};t.detail=s.e_view,excelReport(e,t,function(e,t){if(e)return r.status(400).send(e);r.setHeader("Content-Type","application/vnd.openxmlformats"),r.setHeader("Content-Disposition","attachment; filename="+n.name+".xlsx"),r.end(t,"binary")})}else r.send(s.e_view)})}):r.send([])})}else a=t.count(s,function(e,t){if(e)return r.status(400).send(e);r.send({rows_number:t})})})},controller.prototype.get=function(){this.sort;let e=this.model,t=this;this.router.route(`${this.route_name}/:id`).get(function(n,i,r){if(!n.params.id)return i.status(404).send("Lỗi: Đối tượng này không tồn tại");let o=n.params.id;async.parallel({c:t=>{clientRedis.get("stp:"+o,(n,i)=>{!n&&i&&i._id===o?t(null,JSON.parse(i)):e.findById(o,function(e,n){t(e,n)})})}},(s,a)=>{if(s)return i.status(400).send(s);let u=a.c;return u?!0===underscore.has(e.schema.paths,"id_app")&&n.user.current_id_app!=u.id_app?i.status(403).send("Lỗi: Không có quyền truy cập đối tượng này"):void(t.getting?t.getting(n.user,o,function(e){if(e)return i.status(400).send(e);n.obj=u,r()},u):(n.obj=u,r())):i.status(404).send("Lỗi: Không thể tìm thấy đối tượng này\nid:"+o)})},function(e,n,i){let r=e.obj;if(!r||!r.toObject)return i();r=r.toObject(),permission.hasRight(r.id_app,e.user.email,t.module,"view",function(r,o){if(t.options.onQuery)e.permission=o,t.options.onQuery(e,t=>t?i(t):e.permission?void i():n.status(403).send(r));else{if(!o)return n.status(403).send(r);i()}},{data:r,obj:r,notNeedRight:t.options.notNeedRight})},function(e,n,i){let r=e.obj;if(r&&r.toObject&&(r=r.toObject()),r.collection_name=t.collection_name,t.view&&r){let i=r;t.view(e.user,[i],function(e,t){if(e)return n.status(400).send(e);n.send(t[0])},{req:e})}else n.send(r)})},controller.prototype.postAgain=function(){this.sort;let e=this.model,t=this;this.router.route(`${this.route_name}/action/postagain`).get(function(n,i,r){if(!t.post)return r();let o={};for(let t in n.query)if("id_app"!=t&&"access_token"!=t)if("_id"!=t)if("q"==t&&n.query[t]){o=stp.parse(n.query[t])}else if("tu_ngay"!=t||!0!==underscore.has(e.schema.paths,"ngay_ct"))if("den_ngay"!=t||!0!==underscore.has(e.schema.paths,"ngay_ct"))!0===underscore.has(e.schema.paths,t)&&(o[t]=n.query[t]);else{let e=moment(n.query.den_ngay).endOf("date").toDate();o.ngay_ct?o.ngay_ct.$lte=e:o.ngay_ct={$lte:e}}else{let e=moment(n.query.tu_ngay).startOf("date").toDate();o.ngay_ct?o.ngay_ct.$gte=e:o.ngay_ct={$gte:e}}else try{let e=mongoose.Types.ObjectId(n.query._id);o._id=e}catch(e){}!0===underscore.has(e.schema.paths,"id_app")&&(o.id_app=n.user.current_id_app),t.finding?t.finding(n.user,o,function(e,t){if(e)return i.status(400).send(e);n.condition=t,r()},{req:n}):(n.condition=o,r())},function(e,t,n){permission.isAdmin(e.user.current_id_app,e.user.email,function(e,i,r){return e?n(e):i?permission.checkUseTime(r)?void n():t.status(403).send(`OFD - Chương trình cho ${r.name} đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng.`):t.status(403).send("Bạn phải có quyền admin để thực hiện tính năng này")})},function(n,i,r){let o=n.condition,s=null;s=e.find(o,function(e,n){if(e)return i.status(400).send(e);async.map(n,function(e,n){postData(e,t,function(e,t){n(e,t)})},function(e,t){if(e)return i.status(400).send(e);i.send("ok")})})})},controller.prototype.updateField=function(){this.sort;let e,t=this.model,n=this;this.router.route(`${this.route_name}/update/:field`).get(function(i,r,o){if(e=i.params.field,!underscore.has(t.schema.paths,e))return r.status(400).send("Field "+e+" không tồn tại");let s=t.collection.name;i.user.current_id_app&&(s+=i.user.current_id_app),delete cacheDatas[s];let a={};for(let e in i.query)if("id_app"!=e&&"access_token"!=e)if("_id"!=e)if("q"==e&&i.query[e]){a=stp.parse(i.query[e])}else if("tu_ngay"!=e||!0!==underscore.has(t.schema.paths,"ngay_ct"))if("den_ngay"!=e||!0!==underscore.has(t.schema.paths,"ngay_ct"))!0===underscore.has(t.schema.paths,e)&&(a[e]=i.query[e]);else{let e=moment(i.query.den_ngay).endOf("date").toDate();a.ngay_ct?a.ngay_ct.$lte=e:a.ngay_ct={$lte:e}}else{let e=moment(i.query.tu_ngay).startOf("date").toDate();a.ngay_ct?a.ngay_ct.$gte=e:a.ngay_ct={$gte:e}}else try{let e=mongoose.Types.ObjectId(i.query._id);a._id=e}catch(e){}!0===underscore.has(t.schema.paths,"id_app")&&(a.id_app=i.user.current_id_app),n.finding?n.finding(i.user,a,function(e,t){if(e)return r.status(400).send(e);i.condition=t,o()},{req:i}):(i.condition=a,o())},function(e,t,n){permission.isAdmin(e.user.current_id_app,e.user.email,function(e,i,r){return e?n(e):i?permission.checkUseTime(r)?void n():t.status(403).send("OFD - Chương trình cho "+r.name+" đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng."):t.status(403).send("Bạn phải có quyền admin để thực hiện tính năng này")})},function(i,r,o){let s=i.condition,a=null,u={_id:1};u[e]=1,a=t.find(s,u),!0===underscore.has(t.schema.paths,"ngay_ct")&&a.sort({ngay_ct:1}),a.lean().exec(function(o,a){if(o)return r.status(400).send(o);log.create({id_app:i.user.current_id_app,id_func:n.name,action:"UPDATE FIELD:"+e,data:{condition:JSON.stringify(s)}},i.user.email,i.header("user-agent"),i);let u=Number(i.query.tu_so);u||(u=1);let c,d=i.query.den_so,l=i.query.tien_to,p=i.query.hau_to;for(let t=0;t<a.length;t++)c=u+t+"",d&&(c="0000000000000000000".substring(0,d.length-c.length)+c),l&&(c=l+c),p&&(c+=p),a[t][e]=c;async.map(a,function(e,i){t.findOneAndUpdate({_id:e._id},e,function(e,r){if(e||!r)return i(e);n.cacheData(r),n.emit("saved",r),n.emit("updated",r),n.post?t.findOne({_id:r._id},function(e,t){if(e||!t)return i(e);t&&postData(t,n,function(e,t){i(e,t)})}):i(null,r)})},function(e,t){r.send(a)})})})},controller.prototype.exportToExcel=function(){this.sort;let e=this.model,t=this;this.router.route(`${this.route_name}/excel/:rpt_id`).get(function(n,i,r){let o=n.query._id;n.query.id_app;if(!o)return i.status(400).send("Hàm này yêu cầu tham số _id");let s=o.split(",");e.find({_id:{$in:s}}).lean().exec(function(e,s){return e?i.status(400).send(e):(log.create({id_app:n.user.current_id_app,id_func:t.name,action:"ExportTOExcel",data:{id:o}},n.user.email,n.header("user-agent"),n),0==s.length?i.status(404).send("Lỗi: Không có dữ liệu"):void(t.getting?async.map(s,function(e,i){t.getting(n.user,e._id,function(e){if(e)return i(e);i(null)},e)},function(e,t){if(e)return i.status(400).send(e);n.obj=s,r()}):(n.obj=s,r())))})},function(e,n,i){let r=e.obj;async.map(r,function(n,i){permission.hasRight(n.id_app,e.user.email,t.module,"view",function(e,t){t?i():i(e)},{data:n,notNeedRight:t.options.notNeedRight})},function(e,t){if(e)return n.status(403).send(e);i()})},function(e,n,i){let r=e.obj;t.view&&r?t.view(e.user,r,function(t,r){if(t)return n.status(400).send(t);e.obj=r,i()},{req:e}):i()},function(e,n,i){let r=e.obj;t.options.onExport&&r?async.map(r,function(n,i){t.options.onExport(e.user,n,function(e){if(e)return i(e);i()})},function(e,t){if(e)return n.status(400).send(e);i()}):i()},function(e,n,i){let r=e.params.rpt_id,o=e.query.id_app,s={ma_cn:t.module.toUpperCase(),id_app:o};rpt.find(s).lean().exec(function(i,s){if(i)return n.status(400).send(i);let a=e.obj,u=require("path"),c=underscore.find(s,function(e){return e._id.toString()===r});if(!c)return n.status(400).send("Không tìm thấy file mẫu");let d=u.dirname(__dirname)+"/"+c.file_mau_in;if(!fs.existsSync(d))return n.status(400).send("File mẫu không tồn tại");app.findOne({_id:o}).lean().exec(function(i,r){if(i)return n.status(400).send("Không tồn tại công ty này");delete r.participants,delete r.create_db_sql,delete r.expire_date,delete r.sale_online,underscore.extend(r,e.query),delete r.access_token;let u=[];a.forEach(function(e){for(let t in e)if(underscore.isObject(e[t]))for(let n in e[t])if(n.indexOf("ngay")>=0||n.indexOf("date")>=0)try{e[t+"_"+n]=new Date(e[t][n])}catch(i){e[t+"_"+n]=e[t][n]}else e[t+"_"+n]=e[t][n];let t={obj:e};underscore.extend(t,r),u.push(t)});let c=underscore.pluck(s,"_id");Parameter.find({id_app:o,id_rpt:{$in:c}}).lean().exec(function(i,r){if(i)return n.status(400).send(i);async.map(u,function(e,n){!function(e,n,i,r){e.find(e=>"doc_tien"===e.name||"doc_so"===e.name)||(i.t_tt_nt?e.push({name:"doc_tien",value:"t_tt_nt",type:"W"}):i.t_tien_nt&&e.push({name:"doc_tien",value:"t_tien_nt",type:"W"})),async.map(e,function(e,t){if("W"==e.type||"EN"==e.type)"EN"==e.type?n[e.name]=numberToWord(i[e.value],{lang:"en"}):n[e.name]=numberToWord(i[e.value]),t();else if("Q"==e.type)try{let r=stp.parse("{"+e.value+"}");if(!r.collection||!r.field)return t();"dmkh"==r.collection&&(r.collection="customer"),"dmtk"==r.collection&&(r.collection="account");let s=r.condition;if(s){s=JSON.stringify(s);for(let e in i)s=s.replace(new RegExp("m."+e,"g"),i[e]);s=stp.parse(s)}else s={};let a=require("../models/"+r.collection);s.id_app=o,a.findOne(s).lean().exec(function(i,o){n[e.name]=o?o[r.field]:i,t()})}catch(i){n[e.name]=i,t()}else n[e.name]=e.value,t()},function(e,o){if(e)return r(e);if(underscore.extend(n,i),t.getData4Export)t.getData4Export(n,function(e){if(e)return r(e);for(let e in n){let t=n[e];underscore.isDate(t)&&(n[e+"_string"]=moment(t).format("DD/MM/YYYY"))}r()});else{for(let e in n){let t=n[e];underscore.isDate(t)&&(n[e+"_string"]=moment(t).format("DD/MM/YYYY"))}r()}})}(r,e,e.obj,function(t,i){if(t)return n(t);delete e.obj,n(null,i)})},function(i,r){if(i)return n.status(400).send(i);e.query.json?n.json(u):excelReport(d,u,function(e,i){if(e)return n.status(400).send(e);n.setHeader("Content-Type","application/vnd.openxmlformats"),n.setHeader("Content-Disposition","attachment; filename="+t.name+".xlsx"),n.end(i,"binary")})})})})})})},controller.prototype.importFromExcel=function(){this.module;let e=this.name,t=this;this.router.route(`${this.route_name}/import/excel`).post(function(n,i,r){let o=n.session;if(!0===o["import_"+e])return i.status(400).send("Đang xử lý dữ liệu");if(o["import_"+e]=!0,!n.files.xlsx)return o["import_"+e]=!1,i.status(400).send("Không tìm thấy file xlsx");let s={},a=path.dirname(__dirname)+"/maps/"+e+".js";fs.existsSync(a)&&(s=require(a)),t.options.onPreExcelParse&&t.options.onPreExcelParse(s);let u=path.dirname(__dirname)+"/"+n.files.xlsx.path;console.log("read file excel..."),excel.parse(u,function(s,a,c){if(fs.unlink(u,function(e){e&&console.log("Can't delete file tmp:"+u)}),s)return o["import_"+e]=!1,i.status(400).send(s);if(a.length>5e3)return o["import_"+e]=!1,i.status(400).send("Số dòng import quá lớn. Mỗi lần import chỉ được phép tối đa 5000 dòng");t.excelParse&&t.excelParse(a,c);let d=path.dirname(__dirname)+"/workers/"+e.toLowerCase()+"OnImport.js";if(fs.existsSync(d)){console.log("run process onImport",e);let t=(0,require("child_process").fork)(d);t.on("message",function(t){if(console.log("finish process data"),t.error)return o["import_"+e]=!1,i.status(400).send(t.error);n.data=t.data,n.columns=t.columns,r()}),t.send({user:n.user,data:a,columns:c})}else t.options.onImport?t.options.onImport(n.user,a,c,function(t){if(t)return o["import_"+e]=!1,i.status(400).send(t);n.data=a,n.columns=c,r()}):(n.data=a,n.columns=c,r())},s)},function(e,t,n){console.log("prepare data...");let i=e.data,r=e.columns;r._error||(r._error="Error");let o,s,a=[],u={},c=!1;for(let e in r)e.indexOf("$")>0?(c=!0,o=e.split("$")[0],s=e.split("$")[1],u[o]||(u[o]={},u[o].columns=[]),u[o].columns.push(s)):a.push(e);if(!c)return n();let d,l,p=[];i.forEach(function(e){d={},l=null,a.forEach(function(t){d[t]=e[t]});for(let e=0;e<p.length;e++){let t=p[e],n=!0;a.forEach(function(e){underscore.isEqual(t[e],d[e])||(n=!1)}),n&&(l=t)}var t;l?d=l:p.push(d);for(let n in u)t={},u[n].columns.forEach(function(i){e[n+"$"+i]&&(t[i]=e[n+"$"+i])}),d[n]||(d[n]=[]),underscore.keys(t).length>0&&d[n].push(t)}),e.data=p,n()},function(n,i,r){let o=n.data,s=n.columns;for(let e of o){let t=e._first;t&&t.length>0&&underscore.extend(e,t[0])}log.create({id_app:n.user.current_id_app,id_func:t.name,action:"IMPORTEXCEL",data:{data:o,columns:s}},n.user.email,n.header("user-agent"),n);let a=n.query.values;a&&(a=stp.parse(a));let u=[];console.log("begin import..."),async.map(o,function(e,i){if(e._error)return u.push({row:e,error:[e._error]}),i();if(a)for(let t in a)e[t]=a[t];if(!0===n.query.update||"true"==n.query.update?n.query.update=!0:n.query.update=!1,n.query.update&&t.unique&&t.unique.length>0){let r={id_app:n.params.id_app};t.options.unique_imp&&e[t.options.unique_imp]?r[t.options.unique_imp]=e[t.options.unique_imp]:t.unique.forEach(function(t){r[t]=e[t]}),t.model.findOne(r).lean().exec(function(r,o){if(r)return i(r);o?(e.id_app=o.id_app,e._id=o._id.toString(),t.unique.forEach(function(t){e[t]=o[t]}),update(n,t,o._id,e,function(t,n){if(t){let n=t;underscore.isArray(n)||(n=[t]),u.push({row:e,error:n})}i()},"import")):create(n,t,e,function(t,n){if(t){let n=t;underscore.isArray(n)||(n=[t]),u.push({row:e,error:n})}i()})})}else create(n,t,e,function(t,n){if(t){let n=t;underscore.isArray(n)||(n=[t]),u.push({row:e,error:n})}i()})},function(t,r){if(console.log("finish import..."),n.session["import_"+e]=!1,t)return i.status(400).send(t);0===u.length?i.send({rows_imported:o.length,rows_error:[]}):i.status(400).send({rows_imported:o.length-u.length,rows_error:u,columns:s,columns_name:underscore.keys(s)})})})};let PostBook=require("../libs/post-book"),PostSocai=require("../libs/post-socai"),Sokho=require("../models/sokho"),Tdttno=require("../models/tdttno"),Tdttno_tt=require("../models/tdttno_tt"),Tdttco_tt=require("../models/tdttco_tt"),Tdttco=require("../models/tdttco"),Vatra=require("../models/vatra"),Vatvao=require("../models/vatvao"),deletePost=function(e,t,n,i,r){async.parallel({sk:e=>{new PostBook(t,t.details,Sokho,function(e,t){t(e)}).remove(function(t){e(t)})},vsc:e=>{vsocai.remove({id_ct:t._id},function(t){t&&console.error(t),e(t)})},sc:e=>{Socai.remove({id_ct:t._id},function(t){t&&console.error(t),e(t)})},vatra:e=>{Vatra.remove({id_ct:t._id},function(t){t&&console.error(t),e(t)})},vatvao:e=>{Vatvao.remove({id_ct:t._id},function(t){t&&console.error(t),e()})},tdttno:e=>{Tdttno.remove({id_ct:t._id},function(t){t&&console.error(t),e(t)})},tdttco:e=>{Tdttco.remove({id_ct:t._id},function(t){t&&console.error(t),e(t)})},tdttno_tt:e=>{Tdttno_tt.remove({id_ct:t._id},function(n){if(n)return e(n);t.tdttnos?async.map(t.tdttnos,function(e,t){Tdttno.findOneAndUpdate({_id:e.id_hd,so_hd:e.so_hd},{$set:{tat_toan:!1}},function(e,n){if(e)return t(e);t()})},function(t,n){e()}):e()})},tdttco_tt:e=>{Tdttco_tt.remove({id_ct:t._id},function(n){if(n)return e(n);t.tdttcos?async.map(t.tdttcos,function(e,t){Tdttco.findOneAndUpdate({_id:e.id_hd,so_hd:e.so_hd},{$set:{tat_toan:!1}},function(e,n){if(e)return t(e);t()})},function(t,n){e()}):e()})},deleteSync:e=>{let n=r?t[r]:"";i&&r&&n?app.findOne({_id:t.id_app}).lean().exec(function(t,o){if(t||!o||!o.stp_api_address||!o.stp_api_token)return e();let s={method:"delete",url:o.stp_api_address+"/"+i+"/"+r+"/"+n+"?token="+o.stp_api_token};request(s,function(t,n,i){(i.indexOf("ERROR")>=0||i.indexOf("<HTML>")>=0)&&(console.log(s),console.log(i)),e()})}):e()}},function(e,i){n(e,t)})};var postData=function(e,t,n){if(!t.post)return n();t.beforePost||(t.beforePost=function(e,t){t(null,null)}),t.beforePost(e,function(i){if(i)return n(i);deletePost(e.user_updated,e,function(i,r){if(i)return n(i);(e.trang_thai||0==e.trang_thai)&&(e.trang_thai=e.trang_thai.toString()),trangthai.findOne({ma_ct:e.ma_ct.toUpperCase(),ma_trang_thai:e.trang_thai},function(i,r){if(i)return n(i);if(r&&!r.post)return n();global.postingVouchers||(global.postingVouchers={});let o="posting"+e._id.toString();global.postingVouchers[o]?(e=e.toObject(),console.log("this voucher is posting by other process",JSON.stringify(e)),n()):(global.postingVouchers[o]=!0,t.post(e,function(e,t){delete global.postingVouchers[o],n(e,t)}))})})})},create=function(e,t,n,i){let r=t.model,o=e.user,s=(t.name,bodyToJson(n)),a=new r(s),u=r.schema.paths;if(underscore.has(u,"exfields")){a.exfields||(a.exfields={});for(let e in s)underscore.has(u,e)||(a.exfields[e]=s[e])}!0===underscore.has(u,"id_app")&&(a.id_app=o.current_id_app);async.waterfall([function(e){process.nextTick(function(){permission.hasRight(a.id_app,o.email,t.module,"add",function(i,r,s){return r?permission.checkUseTime(s)?void t.checkData(s,a,i=>{if(i)return e(i);t.creating?t.creating(o,a,function(t,n){if(t)return e(t);e()},{data:n}):e()}):e("OFD - Chương trình cho "+s.name+" đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng."):e(i)},{data:a,notNeedRight:t.options.notNeedRight})})},function(e){process.nextTick(function(){!0===underscore.has(r.schema.paths,"so_ct")?a.so_ct?underscore.has(r.schema.paths,"ngay_ct")&&a.ngay_ct?OptionsModel.findOne({id_app:a.id_app,id_func:t.name},{option:1}).lean().exec((t,n)=>{if(n&&n.option&&n.option.check_so_ct&&"0"!==n.option.check_so_ct){let t,i,o={id_app:a.id_app,so_ct:a.so_ct};switch(n.option.check_so_ct){case"1":t=moment(a.ngay_ct).startOf("day").toDate(),i=moment(a.ngay_ct).endOf("day").toDate(),o.ngay_ct={$gte:t,$lte:i};break;case"2":t=moment(a.ngay_ct).startOf("month").toDate(),i=moment(a.ngay_ct).endOf("month").toDate(),o.ngay_ct={$gte:t,$lte:i};break;case"3":t=moment(a.ngay_ct).startOf("quarter").toDate(),i=moment(a.ngay_ct).endOf("quarter").toDate(),o.ngay_ct={$gte:t,$lte:i};break;case"8":t=moment(a.ngay_ct).startOf("year").toDate(),i=moment(a.ngay_ct).endOf("year").toDate(),o.ngay_ct={$gte:t,$lte:i}}r.findOne(o,{so_ct:1}).lean().exec((t,n)=>{if(n)return e("Số chứng từ "+a.so_ct+" đã tồn tại. Hãy chọn một số chứng từ khác");e()})}else e()}):e():getNextSequence(a.id_app,t.name,"so_ct",function(t,n){if(t)return console.log("can't get next voucher no.",t),e();a.so_ct=n.so_ct,e()}):e()})},function(e){process.nextTick(function(){!0!==underscore.has(r.schema.paths,"ma_dvcs")||a.ma_dvcs?e():dvcs.findOne({id_app:a.id_app,status:!0}).lean().exec(function(t,n){n&&(a.ma_dvcs=n._id.toString()),e()})})},function(e){process.nextTick(function(){a.user_created=o.email,a.user_updated=o.email,validate(a,function(t){if(t)return e(t);e()})})},function(n){process.nextTick(function(){isExists(r,t.unique,a,t.replaceIfExists,function(i,s){return i?n(i):!0===s?n("Lỗi: Đã tồn tại đối tượng này"):(t.emit("saving",a),void a.save(function(i,s){if(i){let e=[];for(let t in i.errors)e.push(i.errors[t].message);return 0==e.length&&(e=i.message),e||(e=JSON.stringify(i)),n(e)}log.create({id_app:o.current_id_app,id_func:t.name,action:"ADD",data:{id:a._id.toString(),data:a}},o.email,e.header("user-agent"),e),t.emit("saved",s),t.emit("created",s),postData(s,t,function(i,a){if(i)return r.remove({_id:s._id}),n(i);s=s.toObject(),t.view?t.view(o,[s],function(e,t){if(e)return n(e);n(null,s)},{req:e}):n(null,s)})}))})})},function(e,n){t.syncEnterprise(e,function(e,t){n(e,t)})},function(e,n){t.requestApprove(o.current_app_info,o,e,n)},function(n,i){process.nextTick(function(){if(n.collection_name=t.collection_name,t.created)t.created(o,n,function(r,o){if(r)return i(r);if(t.cacheData(n),e.uploadFile){let e="<html><title>OK</title><body>"+JSON.stringify(o)+"</body></html>";i(null,e)}else i(null,o)});else if(t.cacheData(n),e.uploadFile){let e="<html><title>OK</title><body>"+JSON.stringify(n)+"</body></html>";i(null,e)}else i(null,n)})}],(t,n)=>{if(!t){let t=r.collection.name;e.user.current_id_app&&(t+=e.user.current_id_app),delete cacheDatas[t]}i(t,n)})};controller.prototype.create=function(){this.model;let e=this.name,t=(this.unique,this);this.module;this.router.route(this.route_name).post(function(n,i,r){let o=n.session;if(!0===o["creating_"+e])return i.status(400).send("Đang xử lý dữ liệu");o["creating_"+e]=!0;let s=n.body;if(!s)return i.status(411).send("Không có nội dung cần lưu");n.files&&underscore.keys(n.files).length>0&&("JSON"!=s.return&&(n.uploadFile=!0),underscore.extend(s,n.files)),create(n,t,s,(t,n)=>{if(o["creating_"+e]=!1,t)return i.status(400).send(t);i.send(n)})})};var update=function(e,t,n,i,r,o){let s=t.model,a=(t.name,t.unique),u=t.module,c=e.user,d=s.schema.paths;async.waterfall([function(e){process.nextTick(function(){s.findOne({_id:n},function(t,n){return t?e(t):n?void e(null,n):e("Không thể tìm thấy đối tượng này")})})},function(e,n){process.nextTick(function(){permission.hasRight(c.current_id_app,c.email,u,"update",function(t,i,r){if(!i){let e=t;return e||(e="Bạn không có quyền cập nhật đối tượng này"),n(e)}if("app"!==u&&!permission.checkUseTime(r))return n("OFD - Chương trình cho "+r.name+" đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng.");n(null,e)},{data:i,obj:e,notNeedRight:t.options.notNeedRight})})},function(e,n){underscore.has(s.schema.paths,"ngay_ct")&&underscore.has(s.schema.paths,"so_ct")&&e.ngay_ct&&i.so_ct&&e.so_ct!==i.so_ct?OptionsModel.findOne({id_app:e.id_app,id_func:t.name},{option:1}).lean().exec((t,r)=>{if(r&&r.option&&r.option.check_so_ct&&"0"!==r.option.check_so_ct){let t,o,a={id_app:e.id_app,so_ct:i.so_ct,_id:{$ne:e._id.toString()}},u=i.ngay_ct||e.ngay_ct;switch(r.option.check_so_ct){case"1":t=moment(u).startOf("date").toDate(),o=moment(u).endOf("date").toDate(),a.ngay_ct={$gte:t,$lte:o};break;case"2":t=moment(u).startOf("month").toDate(),o=moment(u).endOf("month").toDate(),a.ngay_ct={$gte:t,$lte:o};break;case"3":t=moment(u).startOf("quarter").toDate(),o=moment(u).endOf("quarter").toDate(),a.ngay_ct={$gte:t,$lte:o};break;case"8":t=moment(u).startOf("year").toDate(),o=moment(u).startOf("year").toDate(),a.ngay_ct={$gte:t,$lte:o}}s.findOne(a,{so_ct:1}).lean().exec((t,r)=>{if(r)return n("Số chứng từ "+i.so_ct+" đã tồn tại. Hãy chọn một số chứng từ khác");n(null,e)})}else n(null,e)}):n(null,e)},function(e,n){process.nextTick(function(){t.updating?t.updating(c,i,e,function(e,t,i){if(e)return n(e);n(null,i)}):n(null,e)})},function(e,n){process.nextTick(function(){if(!a||0===a.length)return n(null,e);let r={},o={};e.id_app&&(r.id_app=e.id_app,o.id_app||(o.id_app=e.id_app)),a.forEach(function(n){r[n]=e[n],"number"==t.model.schema.paths[n].instance.toLowerCase()?o[n]=Number(i[n]):"date"==t.model.schema.paths[n].instance.toLowerCase()?o[n]=new Date(i[n]):o[n]=i[n],o[n]||(o[n]=r[n])}),!0!==underscore.isEqual(r,o)?isExists(s,a,o,t.replaceIfExists,function(t,i){return t?n(t):!0===i?n("Lỗi: Không thể cập nhật do đã có một đối tượng khác tương tự"):void checkReference(s,e,function(t){if(t)return n("Lỗi: "+t);n(null,e)},a)}):n(null,e)})},function(e,t){let n=underscore.keys(s.referenceKeys);a&&(n=n.filter(e=>!underscore.contains(a,e))),checkReference(s,e,function(n){if(n)return t(n="Lỗi: "+n);t(null,e)},n)},function(n,r){process.nextTick(function(){i.date_updated=new Date,i.user_updated=c.email,log.create({id_app:c.current_id_app,id_func:t.name,action:"UPDATE",data:{oldData:n,newData:i,id:n._id.toString()}},c.email,e.header("user-agent"),e),delete i.__v,t.options.onExtending||(t.options.onUpdateExtending=function(e,t,n,i){i()}),t.options.onUpdateExtending(n,i,o,function(){if(underscore.extend(n,i),underscore.has(d,"exfields")){n.exfields||(n.exfields={});for(let e in i)underscore.has(d,e)||(n.exfields[e]=i[e])}validate(n,function(e){if(e)return r(e);r(null,n)})})})},function(n,i){process.nextTick(function(){n.ngay_ct&&(n.ngay_ct=moment(n.ngay_ct).toDate()),t.emit("saving",n),n.save(function(n,r){if(n){let e=[];for(let t in n.errors)e.push(n.errors[t].message);return 0==e.length&&(e=n.message),e||(e=JSON.stringify(n)),i(e)}t.emit("saved",r),t.emit("updated",r),postData(r,t,function(n,o){if(n)return i(n);r=r.toObject(),t.view?t.view(c,[r],function(e,t){if(e)return res.status(400).send(e);i(null,t[0])},{req:e}):i(null,r)})})})},function(e,n){t.syncEnterprise(e,n)},function(e,n){t.requestApprove(c.current_app_info,c,e,n)},function(e,n){process.nextTick(function(){e.collection_name=t.collection_name,t.updated?t.updated(c,e,function(e,i){if(e)return console.log("error when saved",e),n(e);t.cacheData(i),n(null,i)}):(t.cacheData(e),n(null,e))})}],(t,n)=>{if(!t){let t=s.collection.name;e.user.current_id_app&&(t+=e.user.current_id_app),delete cacheDatas[t]}r(t,n)})};function checkReference(e,t,n,i){e.referenceKeys?(i||(i=underscore.keys(e.referenceKeys)),async.map(i,function(n,i){let r=e.referenceKeys[n];if(!r)return i();let o=t[n];"_id"===n&&(o=o.toString()),async.map(r,function(e,n){let i=require("../models/"+e.model),r=e.key,s={id_app:t.id_app};s[r]=o,e.where&&underscore.extend(s,e.where),i.find(s).limit(1).exec(function(i,r){if(i)return n(i);if(r&&r.length>0){let i;return i=e.error?new Function("obj","return `"+e.error.replace("{{VALUE}}",o)+"`")(t):`${o} đã phát sinh dữ liệu`,n(i)}n()})},function(e,t){if(e)return i(e);i()})},(e,t)=>{n(e)})):n()}controller.prototype.update=function(){let e=this,t=this.name;this.router.route(this.route_name+"/:id").put(function(n,i,r){let o=n.session;if(!0===o["updating_"+t])return i.status(400).send("Đang xử lý dữ liệu");o["updating_"+t]=!0;let s=n.body;n.files&&underscore.extend(s,n.files);let a=bodyToJson(s);update(n,e,n.params.id,a,(e,n)=>{if(o["updating_"+t]=!1,e)return i.status(400).send(e);i.send(n)})})},controller.prototype.getdelete=function(){let e=this.model,t=this,n=(this.name,this.module),i=this.codeSync,r=this.keySync;this.router.route(this.route_name+"/delete/:id").get(function(i,r,o){e.findOne({_id:i.params.id},function(s,a){return s?r.status(400).send(s):a?void permission.hasRight(a.id_app,i.user.email,n,"delete",function(t,n,s){return n?permission.checkUseTime(s)?void checkReference(e,a,function(e){if(e)return e="Lỗi: Không thể xóa do:\n"+e,r.status(400).send(e);i.obj=a,o()}):r.status(400).send("OFD - Chương trình cho "+s.name+" đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng."):r.status(403).send("Bạn không có quyền xóa đối tượng này")},{obj:a,notNeedRight:t.options.notNeedRight}):r.status(404).send("Lỗi: Không thể tìm thấy đối tượng này")})},function(e,n,i){var r=e.obj;t.deleting?t.deleting(e.user,r,function(t,r){if(t)return n.status(400).send(t);e.obj=r,i()}):(e.obj=r,i())},function(n,o,s){var a=n.obj;t.emit("deleting",a),e.findByIdAndRemove(a._id,function(e,s){if(e)return o.status(400).send(e);t.deleteData(s),log.create({id_app:n.user.current_id_app,id_func:t.name,action:"DELETE",data:{id:s._id,data:s}},n.user.email,n.header("user-agent"),n),link.remove({$or:[{id_a:s._id},{id_b:s._id}]},function(e){e&&console.log("Can't delete links\n"+e)}),t.emit("deleted",s),deletePost(n.user,s,(e,i)=>{if(e)return o.status(400).send(e);t.deleted?t.deleted(n.user,s,function(e,t){if(e)return o.status(400).send(e);o.send(t)}):o.send(s)},i,r)})})},controller.prototype.delete=function(){let e=this.model,t=this,n=(this.name,this.module),i=this.codeSync,r=this.keySync;this.router.route(this.route_name+"/:id").delete(function(i,r,o){e.findOne({_id:i.params.id},function(s,a){return s?r.status(400).send(s):a?void permission.hasRight(a.id_app,i.user.email,n,"delete",function(t,n,s){return n?permission.checkUseTime(s)?void checkReference(e,a,function(e){if(e)return e="Lỗi: Không thể xóa do:\n"+e,r.status(400).send(e);i.obj=a,o()}):r.status(400).send("OFD - Chương trình cho "+s.name+" đã hết thời gian sử dụng. Để tiếp tục sử dụng, bạn hãy mua thêm thời gian sử dụng."):r.status(403).send("Bạn không có quyền xóa đối tượng này")},{obj:a,notNeedRight:t.options.notNeedRight}):r.status(404).send("Lỗi: Không thể tìm thấy đối tượng này")})},function(e,n,i){let r=e.obj;t.deleting?t.deleting(e.user,r,function(t,r){if(t)return n.status(400).send(t);e.obj=r,i()}):(e.obj=r,i())},function(n,o,s){let a=n.obj;t.emit("deleting",a),e.findByIdAndRemove(a._id,function(e,s){if(e)return o.status(400).send(e);t.deleteData(s),log.create({id_app:n.user.current_id_app,id_func:t.name,action:"DELETE",data:{id:s._id,data:s}},n.user.email,n.header("user-agent"),n),link.remove({$or:[{id_a:s._id},{id_b:s._id}]},function(e){e&&console.log("Can't delete links\n"+e)}),t.emit("deleted",s),deletePost(n.user,s,(e,i)=>{if(e)return o.status(400).send(e);t.deleted?t.deleted(n.user,s,function(e,t){if(e)return o.status(400).send(e);o.send(t)}):o.send(s)},i,r)})})},controller.prototype.deleteAll=function(){let e=this.model;this.name,this.module;this.router.route(this.route_name+"/a/delete/all").delete(function(e,t,n){let i=e.user.current_id_app;permission.isAdmin(i,e.user.email,function(e,i,r){if(!i)return t.status(403).send("Chỉ có người quản trị mới có quyền thực hiện thao tác này");n()})},function(t,n,i){let r=t.user.current_id_app;e.remove({id_app:r},function(i,r){if(i)return n.status(400).send(i);if(cacheDatas){let n=e.collection.name;t.user.current_id_app&&(n+=t.user.current_id_app),delete cacheDatas[n]}n.send("Ok")})})},controller.prototype.history=function(){this.model;let e=this.name;this.module;this.router.route(this.route_name+"/g/history/:id").get(function(t,n,i){let r=t.params.id,o={id_func:e,id_app:t.user.current_id_app,"data.id":r},s=t.query.actions;s?(s=s.split(","),o.action={$in:s,$ne:"GET"}):o.action={$ne:"GET"},log.find(o).lean().exec(function(e,t){return e?n.status(400).send(e):n.send(t)})})},controller.prototype.logs=function(){this.model;let e=this,t=this.name;this.router.route(this.route_name+"/g/log/:action").get(function(n,i,r){let o,s,a,u=n.params.action.toUpperCase(),c={id_func:t,id_app:n.user.current_id_app};"ALL"!==u&&(c.action=u),n.query.tu_ngay&&(a={$gte:o=moment(new Date(n.query.tu_ngay)).startOf("date").toDate()}),n.query.den_ngay&&(s=moment(new Date(n.query.den_ngay)).endOf("date").toDate(),a?a.$lte=s:a={$lte:s}),a&&(c.date_created=a),n.query.user&&(c.user_created=n.query.user),log.find(c).lean().exec(function(t,r){if(t)return i.status(400).send(t);if(!e.view)return i.send(r);var o=[];r.forEach(e=>{o.push(e.data.data)}),e.view(n.user,o,(e,t)=>e?i.status(400).send(e):i.send(r),{req:n})})})},controller.prototype.route=function(e){this.history(),this.logs(),this.find(),this.get(),this.getSocai(),this.create(),this.update(),this.delete(),this.deleteAll(),this.getdelete(),this.getNextId(),this.exportToExcel(),this.importFromExcel(),this.updateField(),this.postAgain(),e&&e(this.router)},module.exports=controller;