flexbiz-server 12.5.35 → 12.5.36

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.
@@ -1,739 +1,38 @@
1
- const ckvt = require('./ckvt');
2
- const sokho = global.getModel('sokho');
3
- const socai = global.getModel('socai');
4
- const dmvt = global.getModel('dmvt');
5
- const giatb = global.getModel('giatb');
6
- const dmqddvt = global.getModel('dmqddvt');
7
- const tinhgiatb1vt = require('./tinhgiatb1vt');
8
- const async = require('async');
9
- const _ = require("lodash");
10
- const Controller = require('../controllers/controller');
11
- const moment = require('moment');
12
- const {getCurrentSession} = require("./sessionContext")
13
- module.exports = async function(condition, fn) {
14
- //kiem tra dieu kien
15
- if (!condition || !condition.tu_thang || !condition.den_thang || !condition.nam || !condition.id_app) {
16
- fn('Lỗi: Tính năng này yêu cầu các tham số: tu_thang,den_thang,nam,id_app');
17
- return;
18
- }
19
- condition.tu_thang = Number(condition.tu_thang);
20
- condition.den_thang = Number(condition.den_thang);
21
- //lay dieu kien
22
- let ma_kho = condition.ma_kho;
23
- //let tu_ngay = new Date(Date.UTC(condition.nam, condition.tu_thang-1, 1,0,0,0));
24
- //let den_ngay = new Date(Date.UTC(condition.nam, condition.den_thang,0,23,59, 0));
25
- let tu_ngay = moment(new Date(condition.nam, condition.tu_thang - 1, 15)).startOf("month").toDate();
26
- let den_ngay = moment(new Date(condition.nam, condition.den_thang-1, 15)).endOf("month").toDate();
27
-
28
- //console.log(tu_ngay,den_ngay)
29
- let id_app = condition.id_app;
30
- const app = await global.getModel("app").findOne({_id:id_app},{options:1}).lean();
31
- if(!app) return fn("Công ty này không tồn tại");
32
- const f_tien = (app.options||{}).f_tien || 0;
33
- let query_dmvt = {
34
- id_app: id_app,
35
- gia_xuat: '1'
36
- };
37
-
38
- if (condition.ma_nvt)
39
- query_dmvt.ma_nvt = condition.ma_nvt
40
- if (condition.ma_ncc)
41
- query_dmvt.ma_ncc = condition.ma_ncc
42
-
43
- if (condition.ma_vt) {
44
- query_dmvt.ma_vt = condition.ma_vt;
45
- }
46
- console.log(`🔥 [tinhgiatb] tính giá trung bình, kho:${condition.ma_kho}, sessionID=${getCurrentSession()?._debugId}`);
47
- dmvt.find(query_dmvt).lean().then(function(dmvts) {
48
- async.mapLimit(dmvts,100, function(vt, callback) {
49
- setImmediate(()=>{
50
- let query = {
51
- id_app: id_app,
52
- tu_ngay: tu_ngay,
53
- den_ngay: den_ngay,
54
- ma_vt: vt.ma_vt,
55
- ma_kho: ma_kho
56
- };
57
- tinhgiatb1vt(query, function(error, gia) {
58
- if (error){
59
- console.error("[tinhgiatb] Không thể tính giá trung bình cho vật tư",query.ma_vt,error);
60
- return callback(error);
61
- }
62
- //console.log("tinh gia trung binh",{tu_ngay,den_ngay,ma_kho,ma_vt:vt.ma_vt,gia:gia.gia});
63
- gia.id_app = id_app;
64
- gia.ma_kho = ma_kho;
65
- gia.status = true;
66
-
67
- callback(null, gia);
68
- });
69
- })
70
- }, function(error, bang_gia) {
71
- if (error){
72
- return fn(error);
73
- }
74
-
75
- //cap nhat gia vao so sach
76
- let thangs = [];
77
- for (let t = condition.tu_thang; t <= condition.den_thang; t++) {
78
- thangs.push(t);
79
- }
80
- async.map(thangs, async function(t) {
81
- //xoá giá cũ
82
- let query_delete = {
83
- id_app: id_app,
84
- ma_vt: {$in:bang_gia.map(g=>g.ma_vt)},
85
- nam:condition.nam,
86
- thang:t
87
- };
88
- if (ma_kho) {
89
- query_delete.ma_kho = ma_kho;
90
- }
91
- await giatb.deleteMany(query_delete);
92
- //Lưu giá mới
93
- let gias = bang_gia.map(gia=>{
94
- return {...gia,thang:t,nam:condition.nam}
95
- })
96
- let result = await giatb.create(gias);
97
- return result;
98
- }, function(error) {
99
- if(error) return fn(error);
100
- //Lấy các chứng từ cần cập nhật sổ sách
101
- console.log(`[tinhgiatb] Lấy các chứng từ cần cập nhật sổ sách ma_kho=${condition.ma_kho}`)
102
- let vouchers_x = {};
103
- let vouchers_n = {};
104
- let ma_vts = bang_gia.map(v=>v.ma_vt);
105
- async.parallel({
106
- xuat: function(callback) {
107
- setImmediate(async ()=>{
108
- //get phieu xuat
109
- let query_sokho_x = {
110
- id_app: id_app,
111
- ngay_ct: {
112
- $gte: tu_ngay,
113
- $lte: den_ngay
114
- },
115
- nxt: 2,
116
- ma_vt: {
117
- $in: ma_vts
118
- },
119
- px_gia_dd: false
120
- };
121
- if (ma_kho) {
122
- query_sokho_x.ma_kho = ma_kho;
123
- }
124
- const sks = await sokho.find(query_sokho_x).lean();
125
- //console.log("cap nhat gia cho phieu xuat kho",query_sokho_x,sks);
126
- if (sks.length === 0) {
127
- return callback(null, vouchers_x);
128
- }
129
- //Tìm chứng từ gốc
130
- const cac_ma_ct = [...new Set(sks.map(sk=>sk.ma_ct))];
131
- async.map(cac_ma_ct, async function(ma_ct) {
132
- const ctrl = global.controllers[ma_ct.toUpperCase()];
133
- let ct = ctrl?ctrl.getProperty("model"): mongoose.models[ma_ct.toLowerCase()];
134
- if (ct) {
135
- const ids = [...new Set(sks.filter(sk=>sk.ma_ct===ma_ct).map(sk=>sk.id_ct))];
136
- const vouchers = await ct.find({_id:{$in:ids}});
137
- for(let v of vouchers){
138
- vouchers_x[v._id.toString()] = v;
139
- }
140
- //xoá sổ sách nếu chứng từ không còn tồn tại
141
- for(let id_ct of ids.filter(id=>!vouchers_x[id])){
142
- console.log('⚠️ [tinhgiatb] Khong tim thay phieu xuat. chuong trinh da xoa phieu nay khoi sổ sách, id_ct=',id_ct,"ma_ct=",ma_ct);
143
- await sokho.deleteMany({id_ct});
144
- await socai.deleteMany({id_ct});
145
- }
146
- return null;
147
- } else {
148
- console.log(`⚠️ [tinhgiatb] Khong tim model cho ma_ct=`,ma_ct);
149
- return null
150
- }
151
- }, function(error) {
152
- if (error) {
153
- console.error('❌ [tinhgiatb] co loi lay phieu xuat',error);
154
- return callback(error);
155
- }
156
- callback(null, vouchers_x);
157
- });
158
-
159
-
160
- /*//groupby lại chỉ lấy mỗi chứng từ một dòng
161
- sks = await sks.asyncGroupBy(["id_ct","so_ct","ma_ct","ngay_ct"],[]);
162
- //Tìm chứng từ gốc
163
- async.mapLimit(sks,50, function(sk, callback) {
164
- let voucher = vouchers_x[sk.id_ct];
165
- const ctrl = global.controllers[sk.ma_ct.toUpperCase()];
166
- let ct = ctrl?ctrl.getProperty("model"): mongoose.models[sk.ma_ct.toLowerCase()];
167
- if (!voucher && ct) {
168
- ct.findById(sk.id_ct, function(error, v) {
169
- if (error) return callback(error);
170
- if (v) {
171
- voucher = v;
172
- vouchers_x[sk.id_ct] = voucher;
173
- } else {
174
- sokho.deleteMany({id_ct:sk.id_ct.toString()},()=>{
175
- console.log('[tinhgiatb] Khong tim thay phieu xuat. chuong trinh da xoa phieu nay khoi sokho',sk.id_ct,"ma_ct",sk.ma_ct,sk.so_ct,sk.ngay_ct);
176
- })
177
- socai.deleteMany({id_ct:sk.id_ct.toString()},()=>{
178
- console.log('[tinhgiatb] Khong tim thay phieu xuat. chuong trinh da xoa phieu nay khoi socai',sk.id_ct,"ma_ct",sk.ma_ct,sk.so_ct,sk.ngay_ct);
179
- })
180
- }
181
- callback();
182
- });
183
-
184
- } else {
185
- callback();
186
- }
187
- }, function(error) {
188
- if (error) {
189
- console.error('[tinhgiatb] co loi lay phieu xuat',error);
190
- return callback(error);
191
- }
192
- callback(null, vouchers_x);
193
- });*/
194
-
195
-
196
- })
197
- },
198
- nhap: function(callback) {
199
- setImmediate(async ()=>{
200
- //get phieu nhap gia tb
201
- let query_sokho_n = {
202
- id_app: id_app,
203
- ngay_ct: {
204
- $gte: tu_ngay,
205
- $lte: den_ngay
206
- },
207
- nxt: 1,
208
- ma_vt: {
209
- $in: ma_vts
210
- },
211
- pn_gia_tb: true,
212
- ma_ct: {
213
- $ne: 'PXC'
214
- }
215
- };
216
- if(ma_kho) query_sokho_n.ma_kho = ma_kho;
217
- const sks = await sokho.find(query_sokho_n).lean();
218
- //console.log("cap nhat gia cho phieu nhap kho",query_sokho_n,sks);
219
- if (sks.length === 0) {
220
- return callback(null, vouchers_n);
221
- }
222
- //Lấy các chứng từ gốc
223
- const ds_ma_ct = [...new Set(sks.map(sk=>sk.ma_ct))];
224
- async.map(ds_ma_ct, async function(ma_ct) {
225
- const ctrl = global.controllers[ma_ct.toUpperCase()];
226
- let ct = ctrl?ctrl.getProperty("model"): mongoose.models[ma_ct.toLowerCase()];
227
- if (ct) {
228
- const ids = [...new Set(sks.filter(sk=>sk.ma_ct===ma_ct).map(sk=>sk.id_ct))];
229
- const vouchers = await ct.find({_id:{$in:ids}});
230
- for(let v of vouchers){
231
- vouchers_n[v._id.toString()] = v;
232
- }
233
- //xoá sổ sách nếu chứng từ không còn tồn tại
234
- for(let id_ct of ids.filter(id=>!vouchers_n[id])){
235
- console.warn('⚠️ [tinhgiatb] Khong tim thay phieu nhập. chuong trinh da xoa phieu nay khoi sổ sách, id_ct=',id_ct,"ma_ct=",ma_ct);
236
- await sokho.deleteMany({id_ct});
237
- await socai.deleteMany({id_ct});
238
- }
239
- return null;
240
- } else {
241
- console.log(`⚠️ [tinhgiatb] Khong tim model cho ma_ct=`,ma_ct);
242
- return null;
243
- }
244
- },(error)=>{
245
- if (error) {
246
- console.error('❌ [tinhgiatb] co loi lay phieu nhap',error);
247
- return callback(error);
248
- }
249
- callback(null, vouchers_n);
250
- })
251
-
252
- /*//groupby lại chỉ lấy mỗi chứng từ một dòng
253
- sks = await sks.asyncGroupBy(["id_ct","so_ct","ma_ct","ngay_ct"],[]);
254
- //Tìm chứng từ gốc
255
- async.mapLimit(sks,50, function(sk, callback) {
256
- let voucher = vouchers_n[sk.id_ct];
257
- const ctrl = global.controllers[sk.ma_ct.toUpperCase()];
258
- let ct = ctrl?ctrl.getProperty("model"): mongoose.models[sk.ma_ct.toLowerCase()];
259
- if (!voucher && ct) {
260
- ct.findById(sk.id_ct, function(error, v) {
261
- if (error)
262
- return callback(error);
263
- if (v) {
264
- voucher = v;
265
- vouchers_n[sk.id_ct] = voucher;
266
- } else {
267
- sokho.deleteMany({id_ct:sk.id_ct.toString()},(e,rs)=>{
268
- console.log('[tinhgiatb] Khong tim thay phieu nhap. chuong trinh da xoa phieu nay khoi sokho',sk.id_ct,"ma_ct",sk.ma_ct,sk.so_ct,sk.ngay_ct,rs);
269
- })
270
- socai.deleteMany({id_ct:sk.id_ct.toString()},(e,rs)=>{
271
- console.log('[tinhgiatb] Khong tim thay phieu nhap. chuong trinh da xoa phieu nay khoi socai',sk.id_ct,"ma_ct",sk.ma_ct,sk.so_ct,sk.ngay_ct,rs);
272
- })
273
- }
274
- callback();
275
- });
276
- } else {
277
- callback();
278
- }
279
- }, function(error) {
280
- if (error) {
281
- console.error('[tinhgiatb] co loi lay phieu nhap',error);
282
- return callback(error);
283
- }
284
- callback(null, vouchers_n);
285
- });
286
- */
287
-
288
- })
289
- },
290
- nhap_dc:(callback)=>{
291
- if(ma_kho){
292
- let query_sokho_pnc = {
293
- id_app: id_app,
294
- ma_ct:"PNC",
295
- ngay_ct: {
296
- $gte: tu_ngay,
297
- $lte: den_ngay
298
- },
299
- $or:[
300
- {ma_kho_x:ma_kho},
301
- {"details.ma_kho_x":ma_kho}
302
- ],
303
- "details.px_gia_dd":false
304
- };
305
- //console.log("get pnc",query_sokho_pnc);
306
- global.getModel("pnc").find(query_sokho_pnc).then(pnc=>{
307
- //console.log("[tinhgiatb] Số phiếu nhập điều chuyển của kho",ma_kho,pnc.length);
308
- pnc.forEach(p=>{
309
- vouchers_n[p._id.toString()] = p;
310
- })
311
- callback();
312
- }).catch(e=>{
313
- console.error('[tinhgiatb] co loi lay phieu nhap dieu chuyen',e);
314
- return callback(e);
315
- })
316
- }else{
317
- callback();
318
- }
319
- }
320
- }, function(error) {
321
- if (error) return fn(error);
322
- async.waterfall([
323
- function(callback) {
324
- //update gia xuat cho cac phieu xuat
325
- console.log(`[tinhgiatb] Cập nhật giá xuất kho...`)
326
- async.mapLimit(_.values(vouchers_x),100, (voucher_x, callback) => {
327
- setImmediate(async ()=>{
328
- try{
329
- //thong thuong
330
- const details = voucher_x.details.filter(d=>(!condition.ma_vt || condition.ma_vt ===d.ma_vt) && (
331
- !d.px_gia_dd && (!ma_kho || ma_kho === (d.ma_kho || d.ma_kho_x || voucher_x.ma_kho || voucher_x.ma_kho_x))
332
- ));
333
- await Promise.all(details.map(d => {
334
- return (async ()=>{
335
- let gia = _.find(bang_gia, (vt) => {
336
- return d.ma_vt === vt.ma_vt;
337
- })
338
- //gia chuan
339
- let gia_chuan = gia? gia.gia: 0;
340
- //tinh he so quy doi
341
- let he_so_qd=1;
342
- let qd = await dmqddvt.findOne({id_app:voucher_x.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
343
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
344
- //cap nhat gia
345
- d.gia_von = d.gia_von_nt = gia_chuan * he_so_qd;
346
- d.tien_xuat = d.tien_xuat_nt = Math.roundBy(d.sl_xuat * d.gia_von, f_tien);
347
- //console.log("update gia trung binh xuat hang",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
348
- })();
349
- }))
350
- //doi doi hang
351
- if(voucher_x.details_doi){
352
- const details_doi = voucher_x.details_doi.filter(d=>(!condition.ma_vt || condition.ma_vt ===d.ma_vt) && (
353
- !d.px_gia_dd && (!ma_kho || ma_kho === (d.ma_kho || voucher_x.ma_kho || voucher_x.ma_kho_x))
354
- ));
355
- await Promise.all(details_doi.map(d => {
356
- return (async ()=>{
357
- let gia = _.find(bang_gia, (vt) => {
358
- return d.ma_vt === vt.ma_vt;
359
- })
360
- //gia chuan
361
- let gia_chuan = gia? gia.gia: 0;
362
- //tinh he so quy doi
363
- let he_so_qd=1;
364
- let qd = await dmqddvt.findOne({id_app:voucher_x.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
365
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
366
- //cap nhat gia
367
- d.gia_von = d.gia_von_nt = gia_chuan * he_so_qd;
368
- d.tien_xuat = d.tien_xuat_nt = Math.roundBy(d.sl_xuat * d.gia_von, f_tien);
369
-
370
- //console.log("update gia trung binh doi hang",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
371
- })();
372
- }))
373
- }
374
- //khuyen mai detail
375
- await Promise.all(voucher_x.details.filter(d=>d.promotion && d.promotion.details_km).map(d=> {
376
- return (async ()=>{
377
- const details_km = d.promotion.details_km.filter(d=>(!condition.ma_vt || condition.ma_vt ===d.ma_vt)
378
- && !d.px_gia_dd && (!ma_kho || ma_kho === (d.ma_kho || voucher_x.ma_kho|| voucher_x.ma_kho_x))
379
- );
380
- await Promise.all(details_km.map(d => {
381
- return (async ()=>{
382
- let gia = _.find(bang_gia, (vt) => {
383
- return d.ma_vt === vt.ma_vt;
384
- })
385
- //gia chuan
386
- let gia_chuan = gia? gia.gia: 0;
387
- //tinh he so quy doi
388
- let he_so_qd=1;
389
- let qd = await dmqddvt.findOne({id_app:voucher_x.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
390
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
391
- //update gia
392
- d.gia_von = d.gia_von_nt = gia_chuan * he_so_qd;
393
- d.tien_xuat = d.tien_xuat_nt = Math.roundBy((d.sl_xuat||d.sl_km||0) * d.gia_von, f_tien);
394
- //console.log("update gia trung binh khuyen mai",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
395
- })();
396
- }))
397
- })();
398
- }))
399
- //combo detail
400
- await Promise.all(voucher_x.details.filter(d=>d.combo && d.combo.length>0 && !d.px_gia_dd).map(detail=> {
401
- return (async ()=>{
402
- const combo = detail.combo.filter(c=>(!condition.ma_vt || condition.ma_vt ===c.ma_vt)
403
- && (!ma_kho || ma_kho === (detail.ma_kho || detail.ma_kho_x || voucher_x.ma_kho|| voucher_x.ma_kho_x))
404
- );
405
- await Promise.all(combo.map(d => {
406
- return (async ()=>{
407
- let gia = _.find(bang_gia, (vt) => {
408
- return d.ma_vt === vt.ma_vt;
409
- })
410
- //gia chuan
411
- let gia_chuan = gia? gia.gia: 0;
412
- //tinh he so quy doi
413
- let he_so_qd=1;
414
- let qd = await dmqddvt.findOne({id_app:voucher_x.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
415
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
416
- //update gia
417
- d.gia_von = d.gia_von_nt = gia_chuan * he_so_qd;
418
- d.tien_xuat = d.tien_xuat_nt = Math.roundBy((d.sl_xuat||0) * d.gia_von, f_tien);
419
-
420
- /*if(voucher_x.ma_ct==="PXC"){
421
- console.log(d);
422
- }*/
423
- //console.log("update gia trung binh khuyen mai",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
424
- })();
425
- }))
426
- //detail.gia_von = detail.gia_von_nt = detail.combo.map(c=>(c.gia_von_nt||0)).reduce((a,b)=>a+b,0);
427
- detail.tien_xuat = detail.tien_xuat_nt = detail.combo.map(c=>(c.tien_xuat_nt||0)).reduce((a,b)=>a+b,0);
428
- detail.gia_von = detail.gia_von_nt = Math.roundBy(detail.sl_xuat?detail.tien_xuat_nt/detail.sl_xuat:0,f_tien);
429
- })();
430
- }))
431
- //khuyen mai chung
432
- if (voucher_x.promotion) {
433
- const details_kmc = voucher_x.promotion.filter(d=>(!condition.ma_vt || condition.ma_vt ===d.ma_vt)
434
- && !d.px_gia_dd && (!ma_kho || ma_kho === (d.ma_kho || voucher_x.ma_kho|| voucher_x.ma_kho_x))
435
- );
436
- await Promise.all(details_kmc.map(d => {
437
- return (async ()=>{
438
- let gia = _.find(bang_gia, (vt) => {
439
- return d.ma_vt === vt.ma_vt;
440
- })
441
- //gia chuan
442
- let gia_chuan = gia? gia.gia: 0;
443
- //tinh he so quy doi
444
- let he_so_qd=1;
445
- let qd = await dmqddvt.findOne({id_app:voucher_x.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
446
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
447
- //update gia
448
- d.gia_von_nt = gia_chuan * he_so_qd;
449
- d.gia_von = d.gia_von_nt;
450
- d.tien_xuat_nt = Math.roundBy((d.sl_xuat||d.sl_km||0) * d.gia_von, f_tien);
451
- d.tien_xuat = d.tien_xuat_nt;
452
-
453
- //console.log("update gia trung binh khuyen mai chung",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
454
- })();
455
- }))
456
- }
457
- //save
458
- let voucher_x_data = voucher_x.toObject();
459
- //Lấy controller của chứng từ
460
- const ctrl = global.controllers[voucher_x.ma_ct.toUpperCase()];
461
- //Lấy model và update dữ liệu
462
- let _model = ctrl?ctrl.getProperty("model"): mongoose.models[voucher_x.ma_ct.toLowerCase()];
463
- await _model.updateOne({_id:voucher_x._id},voucher_x_data)
464
- //post lai so sach
465
- if (ctrl && ctrl.post) {
466
- await (new Promise((resolve,reject)=>{
467
- //console.log("posted book",{ma_ct:voucher_x.ma_ct,so_ct:voucher_x.so_ct,_id:voucher_x_data._id});
468
- Controller.postData(voucher_x_data,ctrl, (e, rs) => {
469
- if(e){
470
- console.error("❌ [tinhgiatb] [postData] Lỗi:",e.message,voucher_x_data.so_ct,voucher_x_data.ma_ct);
471
- return reject(e);
472
- }
473
- resolve(rs);
474
- },{kiem_tra_han_muc_cong_no:false});
475
- }));
476
- }
477
- callback(null,voucher_x);
478
- }catch(e){
479
- console.error("❌ [tinhgiatb] Lỗi cập nhật phiếu xuất:",voucher_x.ma_ct,voucher_x.so_ct,e.message||e.error||e);
480
- callback(e);
481
- }
482
- })
483
- }, (error) => {
484
- callback(error,vouchers_x);
485
- });
486
- },
487
- function(_vouchers_x,callback) {
488
- //update gia nhap cho cac phieu nhap gia trung binh
489
- console.log(`[tinhgiatb] Cập nhật giá nhập kho...`)
490
- async.mapLimit(_.values(vouchers_n),100, (voucher_n, callback)=>{
491
- setImmediate(async ()=>{
492
- try{
493
- const details_pnk = voucher_n.details.filter(d=>(!d.combo || d.combo.length==0) && (!condition.ma_vt || condition.ma_vt ===d.ma_vt)
494
- && (d.pn_gia_tb || (voucher_n.ma_ct ==="PNC" && !d.px_gia_dd) || (voucher_n.ma_ct ==="PKK" && !d.px_gia_dd))
495
- && (!ma_kho || ma_kho === d.ma_kho || ma_kho === d.ma_kho_x || ma_kho===voucher_n.ma_kho || ma_kho===voucher_n.ma_kho_n)
496
- );
497
- await Promise.all(details_pnk.map(d => {
498
- return (async ()=>{
499
- let gia = _.find(bang_gia, (vt) => {
500
- return d.ma_vt === vt.ma_vt;
501
- })
502
- //gia chuan
503
- let gia_chuan = gia? gia.gia: 0;
504
- //tinh he so quy doi
505
- let he_so_qd=1;
506
- let qd = await dmqddvt.findOne({id_app:vouchers_n.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
507
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
508
- //update gia
509
- d.gia_von_nt = gia_chuan * he_so_qd;
510
- d.gia_von = d.gia_von_nt;
511
- if(voucher_n.ma_ct ==="PNC" || voucher_n.ma_ct ==="PKK"){
512
- d.tien_xuat_nt = Math.roundBy(d.sl_xuat * d.gia_von, f_tien);
513
- d.tien_xuat = d.tien_xuat_nt;
514
- }else{
515
- d.tien_nhap_nt = Math.roundBy(d.sl_nhap * d.gia_von, f_tien);
516
- d.tien_nhap = d.tien_nhap_nt;
517
- }
518
- //console.log("update gia trung binh cho phieu nhap gia tb",{ma_ct:vouchers_n.ma_ct,so_ct:vouchers_n.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
519
- })();
520
- }))
521
-
522
- //combo detail
523
- await Promise.all(voucher_n.details.filter(d=>d.combo && d.combo.length>0 && (d.pn_gia_tb || (voucher_n.ma_ct ==="PNC" && !d.px_gia_dd) || (voucher_n.ma_ct ==="PKK" && !d.px_gia_dd) ) ).map(detail=> {
524
- return (async ()=>{
525
- const combo = detail.combo.filter(c=>(!condition.ma_vt || condition.ma_vt ===c.ma_vt) && (!ma_kho || ma_kho === (detail.ma_kho || voucher_n.ma_kho|| voucher_n.ma_kho_n)));
526
- await Promise.all(combo.map(d => {
527
- return (async ()=>{
528
- let gia = _.find(bang_gia, (vt) => {
529
- return d.ma_vt === vt.ma_vt;
530
- })
531
- //gia chuan
532
- let gia_chuan = gia? gia.gia: 0;
533
- //tinh he so quy doi
534
- let he_so_qd=1;
535
- let qd = await dmqddvt.findOne({id_app:voucher_n.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
536
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
537
- //update gia
538
- d.gia_von = d.gia_von_nt = gia_chuan * he_so_qd;
539
-
540
- if(voucher_n.ma_ct ==="PNC" || voucher_n.ma_ct ==="PKK"){
541
- d.tien_xuat_nt = Math.roundBy(d.sl_xuat * d.gia_von, f_tien);
542
- d.tien_xuat = d.tien_xuat_nt;
543
- }else{
544
- d.tien_nhap_nt = Math.roundBy(d.sl_nhap * d.gia_von, f_tien);
545
- d.tien_nhap = d.tien_nhap_nt;
546
- }
547
- //console.log("update gia trung binh cho san pham cua combo",{ma_ct:voucher_n.ma_ct,so_ct:voucher_n.so_ct,ma_vt:d.ma_vt,gia_von:d.gia_von,gia_tb:gia_chuan,he_so_qd});
548
- })();
549
- }))
550
- //detail.gia_von = detail.gia_von_nt = detail.combo.map(c=>(c.gia_von_nt||0)).reduce((a,b)=>a+b,0);
551
- if(voucher_n.ma_ct ==="PNC" || voucher_n.ma_ct ==="PKK"){
552
- detail.tien_xuat = detail.tien_xuat_nt = detail.combo.map(c=>(c.tien_xuat_nt||0)).reduce((a,b)=>a+b,0);
553
- detail.gia_von = detail.gia_von_nt = Math.roundBy(detail.sl_xuat?detail.tien_xuat_nt/detail.sl_xuat:0,f_tien);
554
- }else{
555
- detail.tien_nhap = detail.tien_nhap_nt = detail.combo.map(c=>(c.tien_nhap_nt||0)).reduce((a,b)=>a+b,0);
556
- detail.gia_von = detail.gia_von_nt = Math.roundBy(detail.sl_nhap?detail.tien_nhap_nt/detail.sl_nhap:0,f_tien);
557
- }
558
- })();
559
- }))
560
- //
561
- if (voucher_n.details_doi) { //xuat doi hang
562
- const details_doi =voucher_n.details_doi.filter(d=>(!condition.ma_vt || condition.ma_vt ===d.ma_vt)
563
- && (d.pn_gia_tb && (!ma_kho || ma_kho === d.ma_kho))
564
- );
565
- await Promise.all(details_doi.map(d => {
566
- return (async ()=>{
567
- let gia = _.find(bang_gia, (vt) => {
568
- return d.ma_vt === vt.ma_vt;
569
- })
570
- //gia chuan
571
- let gia_chuan = gia? gia.gia: 0;
572
- //tinh he so quy doi
573
- let he_so_qd=1;
574
- let qd = await dmqddvt.findOne({id_app:vouchers_n.id_app,ma_vt:d.ma_vt,ma_dvt:d.ma_dvt}).lean();
575
- if(qd) he_so_qd = (qd.mau?(qd.tu/qd.mau): qd.ty_le_qd);
576
- //update gia
577
- d.gia_von_nt = gia_chuan * he_so_qd;
578
- d.gia_von = d.gia_von_nt;
579
- d.tien_xuat_nt = Math.roundBy(d.sl_xuat * d.gia_von, f_tien);
580
- d.tien_xuat = d.tien_xuat_nt;
581
-
582
- })();
583
- }))
584
- }
585
- let voucher_n_data = voucher_n.toObject();
586
- //let _model = mongoose.models[voucher_n_data.ma_ct.toLowerCase()];
587
- const ctrl = global.controllers[voucher_n_data.ma_ct.toUpperCase()];
588
- let _model = ctrl?ctrl.getProperty("model"): mongoose.models[voucher_n_data.ma_ct.toLowerCase()];
589
- await _model.updateOne({_id:voucher_n_data._id},voucher_n_data);
590
- //post lai so sach
591
- if (ctrl && ctrl.post) {
592
- await (new Promise((resolve,reject)=>{
593
- //console.log("posted book",{ma_ct:vouchers_n.ma_ct,so_ct:vouchers_n.so_ct,_id:voucher_n_data._id});
594
- Controller.postData(voucher_n_data,ctrl, function(e, rs) {
595
- if(e){
596
- console.error("❌ [tinhgiatb][postData] lỗi:",e.message,voucher_n_data.so_ct,voucher_n_data.ma_ct);
597
- return reject(e);
598
- }
599
- resolve(rs);
600
- },{kiem_tra_han_muc_cong_no:false});
601
- }));
602
- }
603
- callback(null,voucher_n);
604
- }catch(e){
605
- console.error(`❌ [tinhgiatb] Lỗi cập nhất phiếu nhập`,voucher_n.ma_ct,voucher_n.so_ct,e.error||e.message||e);
606
- callback(e);
607
- }
608
-
609
- })
610
- }, function(error) {
611
- //console.log("Ket thuc cap nhat gia vao phieu nhap",new Date().getTime()/1000)
612
- callback(error);
613
- });
614
- }
615
- ], function(e) {
616
- if (e) return fn(e);
617
- //danh gia chenh lech
618
- //console.log("Danh gia chenh lech",new Date().getTime()/1000)
619
- console.log(`[tinhgiatb] Đánh giá chênh lệch...`)
620
- let query_ckvt = {
621
- id_app: condition.id_app,
622
- ngay: den_ngay,
623
- chenh_lech: 1
624
- };
625
- if (condition.ma_vt) {
626
- query_ckvt.ma_vt = condition.ma_vt;
627
- }
628
- if (condition.ma_kho) {
629
- query_ckvt.ma_kho = condition.ma_kho;
630
- }
631
- ckvt(query_ckvt, (e, du_cuoi_ky)=> {
632
- if (e) return fn(e);
633
- //console.log(rs)
634
- du_cuoi_ky = _.filter(du_cuoi_ky, (r)=> {
635
- return r.du00 !== 0 && (r.ton00 == 0 || Math.abs(r.ton00) < 0.001);
636
- });
637
- vouchers_x = _.sortBy(_.values(vouchers_x), (v) => {
638
- return -(new Date(v.ngay_ct)).getTime()
639
- })
640
- vouchers_n = _.sortBy(_.values(vouchers_n), (v) => {
641
- return -(new Date(v.ngay_ct).getTime())
642
- })
643
- //console.log("vat tu chenh lech",rs);
644
- let chung_tu_cap_nhat_chenh_lech ={};
645
- async.map(du_cuoi_ky, (vt, callback)=> {
646
- setImmediate(()=>{
647
- let d_voucher = null;
648
- //xuat
649
- d_voucher = _.find(vouchers_x, (x) => {
650
- return _.find(x.details, (vc) => {
651
- if (vc.ma_vt == vt.ma_vt && !vc.px_gia_dd && (!ma_kho || ma_kho === vc.ma_kho || ma_kho ===x.ma_kho)) {
652
- vc.tien_xuat_nt = vc.tien_xuat_nt + vt.du00;
653
- vc.tien_xuat = Math.roundBy(vc.tien_xuat_nt, f_tien);
654
-
655
- if(vc.sl_xuat) vc.gia_von_nt = vc.gia_von = Math.roundBy(vc.tien_xuat_nt/vc.sl_xuat,0);
656
-
657
- return true;
658
- } else {
659
- return false;
660
- }
661
-
662
- })
663
- })
664
- //nhap
665
- if (!d_voucher) {
666
- d_voucher = _.find(vouchers_n, (n) => {
667
- return _.find(n.details, (vc) => {
668
- if (vc.ma_vt == vt.ma_vt && !vc.pn_gia_tb && (!ma_kho || ma_kho === vc.ma_kho || ma_kho===n.ma_kho)) {
669
- vc.tien_nhap_nt = vc.tien_nhap_nt - vt.du00;
670
- vc.tien_nhap = Math.roundBy(vc.tien_nhap_nt, f_tien);
671
- if(vc.sl_nhap) vc.gia_von_nt = vc.gia_von = Math.roundBy(vc.tien_nhap_nt/vc.sl_nhap,0);
672
- return true;
673
- } else {
674
- return false;
675
- }
676
-
677
- })
678
- })
679
- }
680
- if(d_voucher){
681
- chung_tu_cap_nhat_chenh_lech[d_voucher._id.toString()] = d_voucher;
682
- }
683
- callback(null, d_voucher);
684
- })
685
-
686
- }, (e)=> {
687
- if (e){
688
- return fn(e);
689
- }
690
- //console.log("Cap nhat phieu chenh lech",new Date().getTime()/1000)
691
- let _vouchers_chenh_lech = _.values(chung_tu_cap_nhat_chenh_lech);
692
- //let _vouchers_chenh_lech = vouchers.filter(v=>v);
693
- console.log(`[tinhgiatb] Cập nhật phiếu chênh lệch...`)
694
- async.map(_vouchers_chenh_lech, (voucher, callback)=> {
695
- setImmediate(async ()=>{
696
- try{
697
- let voucher_data = voucher.toObject();
698
- //let _model = mongoose.models[voucher_data.ma_ct.toLowerCase()];
699
- const ctrl = global.controllers[voucher_data.ma_ct.toUpperCase()];
700
- let _model = ctrl?ctrl.getProperty("model"): mongoose.models[voucher_data.ma_ct.toLowerCase()];
701
- await _model.updateOne({_id:voucher_data._id},voucher_data);
702
- //post lai so sach
703
- if (ctrl && ctrl.post) {
704
- //console.log("repost voucher",voucher_data.ma_ct,voucher_data.so_ct,voucher_data._id,"...")
705
- Controller.postData(voucher_data,ctrl, (e, rs)=> {
706
- if(e) console.error("❌ [tinhgiatb] [postData] Lỗi:",e.message,voucher_data.so_ct,voucher_data.ma_ct);
707
- callback(e, rs);
708
- },{kiem_tra_han_muc_cong_no:false});
709
- } else {
710
- callback(null);
711
- }
712
- }catch(error){
713
- return callback(error);
714
- }
715
- })
716
- }, async (e)=> {
717
- if (e) return fn(e);
718
- bang_gia.joinModel2(id_app, dmvt, [
719
- {
720
- where:'ma_vt',
721
- fields: 'ten_vt'
722
- }
723
- ], ()=> {
724
- fn(null, bang_gia);
725
- });
726
- });
727
-
728
- });
729
- });
730
- });
731
-
732
- });
733
- });
734
- });
735
- }).catch(e=>{
736
- fn(e);
737
- })
738
-
739
- };
1
+ 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"),async=require("async"),_=require("lodash"),Controller=require("../controllers/controller"),moment=require("moment"),{getCurrentSession}=require("./sessionContext");
2
+ module.exports=async function($condition$$,$fn$$){if($condition$$&&$condition$$.tu_thang&&$condition$$.den_thang&&$condition$$.nam&&$condition$$.id_app){$condition$$.tu_thang=Number($condition$$.tu_thang);$condition$$.den_thang=Number($condition$$.den_thang);var $ma_kho$$=$condition$$.ma_kho,$tu_ngay$$=moment(new Date($condition$$.nam,$condition$$.tu_thang-1,15)).startOf("month").toDate(),$den_ngay$$=moment(new Date($condition$$.nam,$condition$$.den_thang-1,15)).endOf("month").toDate(),$id_app$$=
3
+ $condition$$.id_app,$app_query_dmvt$$=await global.getModel("app").findOne({_id:$id_app$$},{options:1}).lean();if(!$app_query_dmvt$$)return $fn$$("C\u00f4ng ty n\u00e0y kh\u00f4ng t\u1ed3n t\u1ea1i");var $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);
4
+ console.log(`\ud83d\udd25 [tinhgiatb] t\u00ednh gi\u00e1 trung b\u00ecnh, kho:${$condition$$.ma_kho}, sessionID=${getCurrentSession()?._debugId}`);dmvt.find($app_query_dmvt$$).lean().then(function($dmvts$$){async.mapLimit($dmvts$$,100,function($vt$$,$callback$$){setImmediate(()=>{let $query$$={id_app:$id_app$$,tu_ngay:$tu_ngay$$,den_ngay:$den_ngay$$,ma_vt:$vt$$.ma_vt,ma_kho:$ma_kho$$};tinhgiatb1vt($query$$,function($error$$,$gia$$){if($error$$)return console.error("[tinhgiatb] Kh\u00f4ng th\u1ec3 t\u00ednh gi\u00e1 trung b\u00ecnh cho v\u1eadt t\u01b0",
5
+ $query$$.ma_vt,$error$$),$callback$$($error$$);$gia$$.id_app=$id_app$$;$gia$$.ma_kho=$ma_kho$$;$gia$$.status=!0;$callback$$(null,$gia$$)})})},function($error$$,$bang_gia$$){if($error$$)return $fn$$($error$$);$error$$=[];for(let $t$$=$condition$$.tu_thang;$t$$<=$condition$$.den_thang;$t$$++)$error$$.push($t$$);async.map($error$$,async function($t$$){var $gias_query_delete$$={id_app:$id_app$$,ma_vt:{$in:$bang_gia$$.map($g$$=>$g$$.ma_vt)},nam:$condition$$.nam,thang:$t$$};$ma_kho$$&&($gias_query_delete$$.ma_kho=
6
+ $ma_kho$$);await giatb.deleteMany($gias_query_delete$$);$gias_query_delete$$=$bang_gia$$.map($gia$$=>({...$gia$$,thang:$t$$,nam:$condition$$.nam}));return await giatb.create($gias_query_delete$$)},function($error$$){if($error$$)return $fn$$($error$$);console.log(`[tinhgiatb] L\u1ea5y c\u00e1c ch\u1ee9ng t\u1eeb c\u1ea7n c\u1eadp nh\u1eadt s\u1ed5 s\u00e1ch ma_kho=${$condition$$.ma_kho}`);let $vouchers_x$$={},$vouchers_n$$={},$ma_vts$$=$bang_gia$$.map($v$$=>$v$$.ma_vt);async.parallel({xuat:function($callback$$){setImmediate(async()=>
7
+ {var $cac_ma_ct_query_sokho_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$$&&($cac_ma_ct_query_sokho_x$$.ma_kho=$ma_kho$$);const $sks$$=await sokho.find($cac_ma_ct_query_sokho_x$$).lean();if($sks$$.length===0)return $callback$$(null,$vouchers_x$$);$cac_ma_ct_query_sokho_x$$=[...(new Set($sks$$.map($sk$$=>$sk$$.ma_ct)))];async.map($cac_ma_ct_query_sokho_x$$,async function($ma_ct$$){var $ctrl_ids$$=global.controllers[$ma_ct$$.toUpperCase()],
8
+ $ct_vouchers$$=$ctrl_ids$$?$ctrl_ids$$.getProperty("model"):mongoose.models[$ma_ct$$.toLowerCase()];if($ct_vouchers$$){$ctrl_ids$$=[...(new Set($sks$$.filter($sk$$=>$sk$$.ma_ct===$ma_ct$$).map($sk$$=>$sk$$.id_ct)))];$ct_vouchers$$=await $ct_vouchers$$.find({_id:{$in:$ctrl_ids$$}});for(let $v$$ of $ct_vouchers$$)$vouchers_x$$[$v$$._id.toString()]=$v$$;for(let $id_ct$$ of $ctrl_ids$$.filter($id$$=>!$vouchers_x$$[$id$$]))console.log("\u26a0\ufe0f [tinhgiatb] Khong tim thay phieu xuat. chuong trinh da xoa phieu nay khoi s\u1ed5 s\u00e1ch, id_ct=",
9
+ $id_ct$$,"ma_ct=",$ma_ct$$),await sokho.deleteMany({id_ct:$id_ct$$}),await socai.deleteMany({id_ct:$id_ct$$})}else console.log("\u26a0\ufe0f [tinhgiatb] Khong tim model cho ma_ct=",$ma_ct$$);return null},function($error$$){if($error$$)return console.error("\u274c [tinhgiatb] co loi lay phieu xuat",$error$$),$callback$$($error$$);$callback$$(null,$vouchers_x$$)})})},nhap:function($callback$$){setImmediate(async()=>{var $ds_ma_ct_query_sokho_n$$={id_app:$id_app$$,ngay_ct:{$gte:$tu_ngay$$,$lte:$den_ngay$$},
10
+ nxt:1,ma_vt:{$in:$ma_vts$$},pn_gia_tb:!0,ma_ct:{$ne:"PXC"}};$ma_kho$$&&($ds_ma_ct_query_sokho_n$$.ma_kho=$ma_kho$$);const $sks$$=await sokho.find($ds_ma_ct_query_sokho_n$$).lean();if($sks$$.length===0)return $callback$$(null,$vouchers_n$$);$ds_ma_ct_query_sokho_n$$=[...(new Set($sks$$.map($sk$$=>$sk$$.ma_ct)))];async.map($ds_ma_ct_query_sokho_n$$,async function($ma_ct$$){var $ctrl$jscomp$1_ids$$=global.controllers[$ma_ct$$.toUpperCase()],$ct$jscomp$1_vouchers$$=$ctrl$jscomp$1_ids$$?$ctrl$jscomp$1_ids$$.getProperty("model"):
11
+ mongoose.models[$ma_ct$$.toLowerCase()];if($ct$jscomp$1_vouchers$$){$ctrl$jscomp$1_ids$$=[...(new Set($sks$$.filter($sk$$=>$sk$$.ma_ct===$ma_ct$$).map($sk$$=>$sk$$.id_ct)))];$ct$jscomp$1_vouchers$$=await $ct$jscomp$1_vouchers$$.find({_id:{$in:$ctrl$jscomp$1_ids$$}});for(let $v$$ of $ct$jscomp$1_vouchers$$)$vouchers_n$$[$v$$._id.toString()]=$v$$;for(let $id_ct$$ of $ctrl$jscomp$1_ids$$.filter($id$$=>!$vouchers_n$$[$id$$]))console.warn("\u26a0\ufe0f [tinhgiatb] Khong tim thay phieu nh\u1eadp. chuong trinh da xoa phieu nay khoi s\u1ed5 s\u00e1ch, id_ct=",
12
+ $id_ct$$,"ma_ct=",$ma_ct$$),await sokho.deleteMany({id_ct:$id_ct$$}),await socai.deleteMany({id_ct:$id_ct$$})}else console.log("\u26a0\ufe0f [tinhgiatb] Khong tim model cho ma_ct=",$ma_ct$$);return null},$error$$=>{if($error$$)return console.error("\u274c [tinhgiatb] co loi lay phieu nhap",$error$$),$callback$$($error$$);$callback$$(null,$vouchers_n$$)})})},nhap_dc:$callback$$=>{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$$},
13
+ {"details.ma_kho_x":$ma_kho$$}],"details.px_gia_dd":!1};global.getModel("pnc").find($query_sokho_pnc$$).then($pnc$$=>{$pnc$$.forEach($p$$=>{$vouchers_n$$[$p$$._id.toString()]=$p$$});$callback$$()}).catch($e$$=>{console.error("[tinhgiatb] co loi lay phieu nhap dieu chuyen",$e$$);return $callback$$($e$$)})}else $callback$$()}},function($error$$){if($error$$)return $fn$$($error$$);async.waterfall([function($callback$$){console.log("[tinhgiatb] C\u1eadp nh\u1eadt gi\u00e1 xu\u1ea5t kho...");async.mapLimit(_.values($vouchers_x$$),
14
+ 100,($voucher_x$$,$callback$$)=>{setImmediate(async()=>{try{const $details$$=$voucher_x$$.details.filter($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_x$$.ma_kho||$voucher_x$$.ma_kho_x)));await Promise.all($details$$.map($d$$=>(async()=>{var $gia$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$$=$gia$$?$gia$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$voucher_x$$.id_app,ma_vt:$d$$.ma_vt,
15
+ ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von=$d$$.gia_von_nt=$gia$$*$he_so_qd$$;$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$)})()));if($voucher_x$$.details_doi){const $details_doi$$=$voucher_x$$.details_doi.filter($d$$=>(!$condition$$.ma_vt||$condition$$.ma_vt===$d$$.ma_vt)&&!$d$$.px_gia_dd&&(!$ma_kho$$||$ma_kho$$===($d$$.ma_kho||$voucher_x$$.ma_kho||$voucher_x$$.ma_kho_x)));await Promise.all($details_doi$$.map($d$$=>
16
+ (async()=>{var $gia$jscomp$3_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$3_gia_chuan$$=$gia$jscomp$3_gia_chuan$$?$gia$jscomp$3_gia_chuan$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$voucher_x$$.id_app,ma_vt:$d$$.ma_vt,ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von=$d$$.gia_von_nt=$gia$jscomp$3_gia_chuan$$*$he_so_qd$$;$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$)})()))}await Promise.all($voucher_x$$.details.filter($d$$=>
17
+ $d$$.promotion&&$d$$.promotion.details_km).map($d$$=>(async()=>{const $details_km$$=$d$$.promotion.details_km.filter($d$$=>(!$condition$$.ma_vt||$condition$$.ma_vt===$d$$.ma_vt)&&!$d$$.px_gia_dd&&(!$ma_kho$$||$ma_kho$$===($d$$.ma_kho||$voucher_x$$.ma_kho||$voucher_x$$.ma_kho_x)));await Promise.all($details_km$$.map($d$$=>(async()=>{var $gia$jscomp$4_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$4_gia_chuan$$=$gia$jscomp$4_gia_chuan$$?$gia$jscomp$4_gia_chuan$$.gia:0;let $he_so_qd$$=
18
+ 1,$qd$$=await dmqddvt.findOne({id_app:$voucher_x$$.id_app,ma_vt:$d$$.ma_vt,ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von=$d$$.gia_von_nt=$gia$jscomp$4_gia_chuan$$*$he_so_qd$$;$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy(($d$$.sl_xuat||$d$$.sl_km||0)*$d$$.gia_von,$f_tien$$)})()))})()));await Promise.all($voucher_x$$.details.filter($d$$=>$d$$.combo&&$d$$.combo.length>0&&!$d$$.px_gia_dd).map($detail$$=>(async()=>{const $combo$$=$detail$$.combo.filter($c$$=>
19
+ (!$condition$$.ma_vt||$condition$$.ma_vt===$c$$.ma_vt)&&(!$ma_kho$$||$ma_kho$$===($detail$$.ma_kho||$detail$$.ma_kho_x||$voucher_x$$.ma_kho||$voucher_x$$.ma_kho_x)));await Promise.all($combo$$.map($d$$=>(async()=>{var $gia$jscomp$5_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$5_gia_chuan$$=$gia$jscomp$5_gia_chuan$$?$gia$jscomp$5_gia_chuan$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$voucher_x$$.id_app,ma_vt:$d$$.ma_vt,ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&
20
+ ($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von=$d$$.gia_von_nt=$gia$jscomp$5_gia_chuan$$*$he_so_qd$$;$d$$.tien_xuat=$d$$.tien_xuat_nt=Math.roundBy(($d$$.sl_xuat||0)*$d$$.gia_von,$f_tien$$)})()));$detail$$.tien_xuat=$detail$$.tien_xuat_nt=$detail$$.combo.map($c$$=>$c$$.tien_xuat_nt||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0);$detail$$.gia_von=$detail$$.gia_von_nt=Math.roundBy($detail$$.sl_xuat?$detail$$.tien_xuat_nt/$detail$$.sl_xuat:0,$f_tien$$)})()));if($voucher_x$$.promotion){const $details_kmc$$=
21
+ $voucher_x$$.promotion.filter($d$$=>(!$condition$$.ma_vt||$condition$$.ma_vt===$d$$.ma_vt)&&!$d$$.px_gia_dd&&(!$ma_kho$$||$ma_kho$$===($d$$.ma_kho||$voucher_x$$.ma_kho||$voucher_x$$.ma_kho_x)));await Promise.all($details_kmc$$.map($d$$=>(async()=>{var $gia$jscomp$6_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$6_gia_chuan$$=$gia$jscomp$6_gia_chuan$$?$gia$jscomp$6_gia_chuan$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$voucher_x$$.id_app,ma_vt:$d$$.ma_vt,
22
+ ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von_nt=$gia$jscomp$6_gia_chuan$$*$he_so_qd$$;$d$$.gia_von=$d$$.gia_von_nt;$d$$.tien_xuat_nt=Math.roundBy(($d$$.sl_xuat||$d$$.sl_km||0)*$d$$.gia_von,$f_tien$$);$d$$.tien_xuat=$d$$.tien_xuat_nt})()))}let $voucher_x_data$$=$voucher_x$$.toObject();const $ctrl$$=global.controllers[$voucher_x$$.ma_ct.toUpperCase()];await ($ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$voucher_x$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher_x$$._id},
23
+ $voucher_x_data$$);$ctrl$$&&$ctrl$$.post&&await new Promise(($resolve$$,$reject$$)=>{Controller.postData($voucher_x_data$$,$ctrl$$,($e$$,$rs$$)=>{if($e$$)return console.error("\u274c [tinhgiatb] [postData] L\u1ed7i:",$e$$.message,$voucher_x_data$$.so_ct,$voucher_x_data$$.ma_ct),$reject$$($e$$);$resolve$$($rs$$)},{kiem_tra_han_muc_cong_no:!1})});$callback$$(null,$voucher_x$$)}catch($e$$){console.error("\u274c [tinhgiatb] L\u1ed7i c\u1eadp nh\u1eadt phi\u1ebfu xu\u1ea5t:",$voucher_x$$.ma_ct,$voucher_x$$.so_ct,
24
+ $e$$.message||$e$$.error||$e$$),$callback$$($e$$)}})},$error$$=>{$callback$$($error$$,$vouchers_x$$)})},function($_vouchers_x$$,$callback$$){console.log("[tinhgiatb] C\u1eadp nh\u1eadt gi\u00e1 nh\u1eadp kho...");async.mapLimit(_.values($vouchers_n$$),100,($voucher_n$$,$callback$$)=>{setImmediate(async()=>{try{const $details_pnk$$=$voucher_n$$.details.filter($d$$=>(!$d$$.combo||$d$$.combo.length==0)&&(!$condition$$.ma_vt||$condition$$.ma_vt===$d$$.ma_vt)&&($d$$.pn_gia_tb||$voucher_n$$.ma_ct==="PNC"&&
25
+ !$d$$.px_gia_dd||$voucher_n$$.ma_ct==="PKK"&&!$d$$.px_gia_dd)&&(!$ma_kho$$||$ma_kho$$===$d$$.ma_kho||$ma_kho$$===$d$$.ma_kho_x||$ma_kho$$===$voucher_n$$.ma_kho||$ma_kho$$===$voucher_n$$.ma_kho_n));await Promise.all($details_pnk$$.map($d$$=>(async()=>{var $gia$jscomp$7_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$7_gia_chuan$$=$gia$jscomp$7_gia_chuan$$?$gia$jscomp$7_gia_chuan$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$vouchers_n$$.id_app,ma_vt:$d$$.ma_vt,
26
+ ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von_nt=$gia$jscomp$7_gia_chuan$$*$he_so_qd$$;$d$$.gia_von=$d$$.gia_von_nt;$voucher_n$$.ma_ct==="PNC"||$voucher_n$$.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)})()));await Promise.all($voucher_n$$.details.filter($d$$=>$d$$.combo&&
27
+ $d$$.combo.length>0&&($d$$.pn_gia_tb||$voucher_n$$.ma_ct==="PNC"&&!$d$$.px_gia_dd||$voucher_n$$.ma_ct==="PKK"&&!$d$$.px_gia_dd)).map($detail$$=>(async()=>{const $combo$$=$detail$$.combo.filter($c$$=>(!$condition$$.ma_vt||$condition$$.ma_vt===$c$$.ma_vt)&&(!$ma_kho$$||$ma_kho$$===($detail$$.ma_kho||$voucher_n$$.ma_kho||$voucher_n$$.ma_kho_n)));await Promise.all($combo$$.map($d$$=>(async()=>{var $gia$jscomp$8_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$8_gia_chuan$$=
28
+ $gia$jscomp$8_gia_chuan$$?$gia$jscomp$8_gia_chuan$$.gia:0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$voucher_n$$.id_app,ma_vt:$d$$.ma_vt,ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von=$d$$.gia_von_nt=$gia$jscomp$8_gia_chuan$$*$he_so_qd$$;$voucher_n$$.ma_ct==="PNC"||$voucher_n$$.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*
29
+ $d$$.gia_von,$f_tien$$),$d$$.tien_nhap=$d$$.tien_nhap_nt)})()));$voucher_n$$.ma_ct==="PNC"||$voucher_n$$.ma_ct==="PKK"?($detail$$.tien_xuat=$detail$$.tien_xuat_nt=$detail$$.combo.map($c$$=>$c$$.tien_xuat_nt||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0),$detail$$.gia_von=$detail$$.gia_von_nt=Math.roundBy($detail$$.sl_xuat?$detail$$.tien_xuat_nt/$detail$$.sl_xuat:0,$f_tien$$)):($detail$$.tien_nhap=$detail$$.tien_nhap_nt=$detail$$.combo.map($c$$=>$c$$.tien_nhap_nt||0).reduce(($a$$,$b$$)=>$a$$+$b$$,0),$detail$$.gia_von=
30
+ $detail$$.gia_von_nt=Math.roundBy($detail$$.sl_nhap?$detail$$.tien_nhap_nt/$detail$$.sl_nhap:0,$f_tien$$))})()));if($voucher_n$$.details_doi){const $details_doi$$=$voucher_n$$.details_doi.filter($d$$=>(!$condition$$.ma_vt||$condition$$.ma_vt===$d$$.ma_vt)&&$d$$.pn_gia_tb&&(!$ma_kho$$||$ma_kho$$===$d$$.ma_kho));await Promise.all($details_doi$$.map($d$$=>(async()=>{var $gia$jscomp$9_gia_chuan$$=_.find($bang_gia$$,$vt$$=>$d$$.ma_vt===$vt$$.ma_vt);$gia$jscomp$9_gia_chuan$$=$gia$jscomp$9_gia_chuan$$?$gia$jscomp$9_gia_chuan$$.gia:
31
+ 0;let $he_so_qd$$=1,$qd$$=await dmqddvt.findOne({id_app:$vouchers_n$$.id_app,ma_vt:$d$$.ma_vt,ma_dvt:$d$$.ma_dvt}).lean();$qd$$&&($he_so_qd$$=$qd$$.mau?$qd$$.tu/$qd$$.mau:$qd$$.ty_le_qd);$d$$.gia_von_nt=$gia$jscomp$9_gia_chuan$$*$he_so_qd$$;$d$$.gia_von=$d$$.gia_von_nt;$d$$.tien_xuat_nt=Math.roundBy($d$$.sl_xuat*$d$$.gia_von,$f_tien$$);$d$$.tien_xuat=$d$$.tien_xuat_nt})()))}let $voucher_n_data$$=$voucher_n$$.toObject();const $ctrl$$=global.controllers[$voucher_n_data$$.ma_ct.toUpperCase()];await ($ctrl$$?
32
+ $ctrl$$.getProperty("model"):mongoose.models[$voucher_n_data$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher_n_data$$._id},$voucher_n_data$$);$ctrl$$&&$ctrl$$.post&&await new Promise(($resolve$$,$reject$$)=>{Controller.postData($voucher_n_data$$,$ctrl$$,function($e$$,$rs$$){if($e$$)return console.error("\u274c [tinhgiatb][postData] l\u1ed7i:",$e$$.message,$voucher_n_data$$.so_ct,$voucher_n_data$$.ma_ct),$reject$$($e$$);$resolve$$($rs$$)},{kiem_tra_han_muc_cong_no:!1})});$callback$$(null,$voucher_n$$)}catch($e$$){console.error("\u274c [tinhgiatb] L\u1ed7i c\u1eadp nh\u1ea5t phi\u1ebfu nh\u1eadp",
33
+ $voucher_n$$.ma_ct,$voucher_n$$.so_ct,$e$$.error||$e$$.message||$e$$),$callback$$($e$$)}})},function($error$$){$callback$$($error$$)})}],function($e$$){if($e$$)return $fn$$($e$$);console.log("[tinhgiatb] \u0110\u00e1nh gi\u00e1 ch\u00eanh l\u1ec7ch...");$e$$={id_app:$condition$$.id_app,ngay:$den_ngay$$,chenh_lech:1};$condition$$.ma_vt&&($e$$.ma_vt=$condition$$.ma_vt);$condition$$.ma_kho&&($e$$.ma_kho=$condition$$.ma_kho);ckvt($e$$,($e$$,$du_cuoi_ky$$)=>{if($e$$)return $fn$$($e$$);$du_cuoi_ky$$=_.filter($du_cuoi_ky$$,
34
+ $r$$=>$r$$.du00!==0&&($r$$.ton00==0||Math.abs($r$$.ton00)<.001));$vouchers_x$$=_.sortBy(_.values($vouchers_x$$),$v$$=>-(new Date($v$$.ngay_ct)).getTime());$vouchers_n$$=_.sortBy(_.values($vouchers_n$$),$v$$=>-(new Date($v$$.ngay_ct)).getTime());let $chung_tu_cap_nhat_chenh_lech$$={};async.map($du_cuoi_ky$$,($vt$$,$callback$$)=>{setImmediate(()=>{let $d_voucher$$=null;($d_voucher$$=_.find($vouchers_x$$,$x$$=>_.find($x$$.details,$vc$$=>{if($vc$$.ma_vt!=$vt$$.ma_vt||$vc$$.px_gia_dd||$ma_kho$$&&$ma_kho$$!==
35
+ $vc$$.ma_kho&&$ma_kho$$!==$x$$.ma_kho)return!1;$vc$$.tien_xuat_nt+=$vt$$.du00;$vc$$.tien_xuat=Math.roundBy($vc$$.tien_xuat_nt,$f_tien$$);$vc$$.sl_xuat&&($vc$$.gia_von_nt=$vc$$.gia_von=Math.roundBy($vc$$.tien_xuat_nt/$vc$$.sl_xuat,0));return!0})))||($d_voucher$$=_.find($vouchers_n$$,$n$$=>_.find($n$$.details,$vc$$=>{if($vc$$.ma_vt!=$vt$$.ma_vt||$vc$$.pn_gia_tb||$ma_kho$$&&$ma_kho$$!==$vc$$.ma_kho&&$ma_kho$$!==$n$$.ma_kho)return!1;$vc$$.tien_nhap_nt-=$vt$$.du00;$vc$$.tien_nhap=Math.roundBy($vc$$.tien_nhap_nt,
36
+ $f_tien$$);$vc$$.sl_nhap&&($vc$$.gia_von_nt=$vc$$.gia_von=Math.roundBy($vc$$.tien_nhap_nt/$vc$$.sl_nhap,0));return!0})));$d_voucher$$&&($chung_tu_cap_nhat_chenh_lech$$[$d_voucher$$._id.toString()]=$d_voucher$$);$callback$$(null,$d_voucher$$)})},$_vouchers_chenh_lech_e$$=>{if($_vouchers_chenh_lech_e$$)return $fn$$($_vouchers_chenh_lech_e$$);$_vouchers_chenh_lech_e$$=_.values($chung_tu_cap_nhat_chenh_lech$$);console.log("\u26a0\ufe0f [tinhgiatb] C\u1eadp nh\u1eadt phi\u1ebfu ch\u00eanh l\u1ec7ch...",
37
+ $_vouchers_chenh_lech_e$$.length);async.map($_vouchers_chenh_lech_e$$,($voucher$$,$callback$$)=>{setImmediate(async()=>{try{let $voucher_data$$=$voucher$$.toObject();const $ctrl$$=global.controllers[$voucher_data$$.ma_ct.toUpperCase()];await ($ctrl$$?$ctrl$$.getProperty("model"):mongoose.models[$voucher_data$$.ma_ct.toLowerCase()]).updateOne({_id:$voucher_data$$._id},$voucher_data$$);$ctrl$$&&$ctrl$$.post?Controller.postData($voucher_data$$,$ctrl$$,($e$$,$rs$$)=>{$e$$&&console.error("\u274c [tinhgiatb] [postData] L\u1ed7i:",
38
+ $e$$.message,$voucher_data$$.so_ct,$voucher_data$$.ma_ct);$callback$$($e$$,$rs$$)},{kiem_tra_han_muc_cong_no:!1}):$callback$$(null)}catch($error$$){return $callback$$($error$$)}})},async $e$$=>{if($e$$)return $fn$$($e$$);$bang_gia$$.joinModel2($id_app$$,dmvt,[{where:"ma_vt",fields:"ten_vt"}],()=>{$fn$$(null,$bang_gia$$)})})})})})})})})}).catch($e$$=>{$fn$$($e$$)})}else $fn$$("L\u1ed7i: T\u00ednh n\u0103ng n\u00e0y y\u00eau c\u1ea7u c\u00e1c tham s\u1ed1: tu_thang,den_thang,nam,id_app")};