flexbiz-server 12.6.16 → 12.6.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -11,6 +11,7 @@ Flexbiz-server là thư viện lõi cung cấp toàn bộ hạ tầng và các m
11
11
  ## Mục lục
12
12
 
13
13
  - [Tổng quan](#tổng-quan)
14
+ - [Công nghệ sử dụng (Backend)](#công-nghệ-sử-dụng-backend)
14
15
  - [⚡ Workflow — Tự động hóa quy trình](#-workflow--tự-động-hóa-quy-trình)
15
16
  - [🤖 AI Agent — Trợ lý điều hành thông minh](#-ai-agent--trợ-lý-điều-hành-thông-minh)
16
17
  - [Các module chức năng](#các-module-chức-năng)
@@ -34,6 +35,27 @@ Flexbiz-server được xây dựng theo kiến trúc module hoá, cho phép tí
34
35
 
35
36
  ---
36
37
 
38
+ ## Công nghệ sử dụng (Backend)
39
+
40
+ Flexbiz-server được xây dựng trên nền tảng công nghệ hiện đại, tối ưu cho hệ thống ERP có khối lượng giao dịch lớn và yêu cầu xử lý thời gian thực.
41
+
42
+ | Công nghệ | Vai trò trong hệ thống |
43
+ |---|---|
44
+ | **Node.js** | Nền tảng runtime chính, xử lý toàn bộ logic nghiệp vụ, API, và engine chạy Workflow. Kiến trúc bất đồng bộ (asynchronous, non-blocking I/O) giúp hệ thống xử lý đồng thời số lượng lớn request mà không bị nghẽn, phù hợp với đặc thù ERP nhiều module hoạt động song song. |
45
+ | **MongoDB** (Replica Set) | Cơ sở dữ liệu chính (NoSQL, hướng tài liệu), được triển khai theo mô hình **Replica Set** (tập hợp nhiều node Primary - Secondary đồng bộ dữ liệu với nhau). Lưu trữ toàn bộ dữ liệu nghiệp vụ: chứng từ, danh mục, sổ cái kế toán, sổ kho... Mô hình schema linh hoạt cho phép mở rộng cấu trúc dữ liệu dễ dàng khi doanh nghiệp phát sinh nhu cầu tùy biến mà không cần thay đổi lớn ở tầng hạ tầng. |
46
+ | **Redis** | Bộ nhớ đệm (cache) và message broker tốc độ cao. Đảm nhận vai trò trung gian cho cơ chế Pub/Sub — lắng nghe và phát sự kiện thay đổi dữ liệu (tạo mới, cập nhật, xoá, duyệt) để kích hoạt các node Workflow theo thời gian thực, đồng thời hỗ trợ cơ chế khóa (lock) trong tính năng chống trùng lặp tác vụ (Idempotency). |
47
+ | **Socket.IO** | Giao tiếp hai chiều theo thời gian thực (real-time) giữa server và client. Đảm nhận việc đẩy thông báo (push notification), cập nhật trạng thái task, cảnh báo hệ thống và kết quả xử lý flow đến người dùng ngay lập tức mà không cần tải lại trang. |
48
+
49
+ ### Lợi ích của kiến trúc MongoDB Replica Set
50
+
51
+ Việc triển khai MongoDB theo mô hình Replica Set thay vì một node đơn lẻ mang lại nhiều lợi ích quan trọng cho một hệ thống ERP vận hành liên tục:
52
+
53
+ - **Cao khả dụng (High Availability):** Khi node Primary gặp sự cố, hệ thống tự động bầu chọn (election) một node Secondary lên thay thế trong vài giây, đảm bảo dịch vụ không bị gián đoạn kéo dài.
54
+ - **An toàn dữ liệu (Data Redundancy):** Dữ liệu được đồng bộ và lưu trữ trên nhiều node vật lý khác nhau, giảm thiểu rủi ro mất dữ liệu khi một máy chủ gặp sự cố phần cứng.
55
+ - **Phân tải đọc (Read Scaling):** Các truy vấn chỉ đọc (báo cáo, thống kê, tra cứu) có thể được định tuyến đến các node Secondary, giảm tải cho node Primary và tăng hiệu năng tổng thể của hệ thống khi số lượng người dùng truy cập đồng thời tăng cao.
56
+ - **Bảo trì không downtime:** Có thể nâng cấp, vá lỗi hoặc bảo trì từng node trong cụm theo cách xoay vòng (rolling maintenance) mà không cần dừng toàn bộ hệ thống.
57
+ - **Sao lưu an toàn:** Có thể thực hiện backup dữ liệu trực tiếp trên node Secondary mà không ảnh hưởng đến hiệu năng của node Primary đang phục vụ nghiệp vụ chính.
58
+
37
59
  ---
38
60
 
39
61
  ## ⚡ Workflow — Tự động hóa quy trình
@@ -151,251 +173,52 @@ Một trong những điểm mạnh nổi bật: **AI Agent và Workflow hoạt
151
173
  ## Các module chức năng
152
174
 
153
175
  ### 1. Bảng điều khiển
154
-
155
- Cung cấp giao diện tổng quan trực quan, hiển thị các chỉ số kinh doanh quan trọng theo thời gian thực. Người dùng có thể theo dõi hiệu suất hoạt động toàn doanh nghiệp ngay từ màn hình chính.
176
+ Giao diện tổng quan trực quan, hiển thị các chỉ số kinh doanh quan trọng theo thời gian thực.
156
177
 
157
178
  ---
158
179
 
159
180
  ### 2. Quản lý quan hệ khách hàng (CRM)
160
-
161
- Phân hệ CRM toàn diện, hỗ trợ doanh nghiệp xây dựng và duy trì mối quan hệ với khách hàng xuyên suốt vòng đời kinh doanh.
162
-
163
- #### Quản lý khách hàng
164
- - Quản lý toàn bộ thông tin khách hàng, phân loại theo nhóm và kiểu phân loại tùy chỉnh
165
- - Quản lý danh sách liên hệ, hợp đồng và vụ việc/dự án
166
- - Theo dõi các hoạt động tương tác với khách hàng
167
- - Tích hợp check-in định vị địa lý
168
- - Báo cáo khách hàng tiềm năng
169
-
170
- #### Tích hợp truyền thông
171
- - Kết nối và quản lý Facebook Pages
172
- - Quản lý tài khoản và gửi tin nhắn SMS Marketing
173
- - Lịch sử các cuộc gọi qua tổng đài
174
-
175
- #### Quản lý tài liệu
176
- - Hệ thống quản lý tài liệu dạng thư mục phân cấp
177
- - Phân quyền truy cập tài liệu theo người dùng
178
-
179
- #### Chương trình giới thiệu
180
- - Quản lý mã giới thiệu và danh sách người dùng được giới thiệu
181
- - Tính toán và báo cáo tiền thưởng giới thiệu
182
- - Báo cáo hoa hồng theo doanh số bán hàng
183
-
184
- #### Quản trị mục tiêu (OKR)
185
- - Thiết lập và theo dõi các mục tiêu (Objectives)
186
- - Quản lý kết quả cốt lõi (Key Results)
187
- - Ghi nhận checkin kết quả định kỳ
188
-
189
- #### Quản lý công việc
190
- - Bàn làm việc theo dạng Kanban/Board
191
- - Phân loại công việc theo loại, nhóm, nhãn và độ khó
192
- - Xem tiến độ theo Timeline và Gantt chart
193
- - Thống kê công việc theo vụ việc/dự án, nhân viên, bộ phận và khách hàng
194
-
195
- #### Nội dung web & ứng dụng
196
- - Quản lý tin tức, trang web và tin tuyển dụng
197
- - Xử lý liên hệ từ website
198
- - Gửi thông báo đến người dùng ứng dụng
199
-
200
- #### Các tính năng đặc biệt
201
- - Chương trình dán decal quảng cáo: đăng ký, checkin và đổi quà
202
- - Game trúng thưởng: quản lý game và lượt chơi
203
- - Phân hệ Bất động sản: quản lý dự án và sản phẩm nhà đất
181
+ Quản lý khách hàng, liên hệ, hợp đồng và vụ việc/dự án; theo dõi hoạt động tương tác và check-in định vị. Tích hợp Facebook Page, SMS Marketing và tổng đài. Quản lý tài liệu phân quyền theo thư mục. Chương trình giới thiệu người dùng và hoa hồng theo doanh số. Quản trị mục tiêu theo OKR. Quản lý công việc dạng Kanban, Timeline, Gantt. Quản lý nội dung web/app và thông báo. Ngoài ra hỗ trợ các nghiệp vụ đặc thù: dán decal quảng cáo, game trúng thưởng, bất động sản.
204
182
 
205
183
  ---
206
184
 
207
185
  ### 3. Bán hàng
208
-
209
- Phân hệ bán hàng đa kênh, hỗ trợ cả bán lẻ trực tiếp, bán sỉ và bán hàng online.
210
-
211
- #### Chứng từ bán hàng
212
- - Phiếu bán lẻ tại quầy (POS) cho cửa hàng, quán ăn, cafe...
213
- - Đơn hàng bán lẻ online
214
- - Đơn hàng bán sỉ
215
- - Hóa đơn bán hàng và hóa đơn bán dịch vụ
216
- - Phiếu xuất hàng
217
- - Xử lý hàng bán lẻ và bán sỉ bị trả lại
218
- - Chi phí bán hàng
219
- - Phiếu bán mã giảm giá
220
- - Quy trình đóng gói và giao hàng sỉ
221
-
222
- #### Chính sách bán hàng
223
- - Công thức tính giá bán theo giá mua
224
- - Bảng giá bán và chính sách giá
225
- - Quản lý chiết khấu theo sản phẩm và theo hóa đơn
226
- - Chính sách khuyến mãi theo sản phẩm và theo hóa đơn
227
- - Chính sách hoa hồng bán hàng
228
- - Mã giảm giá (E-voucher)
229
-
230
- #### Báo cáo bán hàng
231
- - Cân đối phát sinh công nợ phải thu
232
- - Sổ chi tiết công nợ khách hàng
233
- - Công nợ cuối kỳ
234
- - Chi tiết thu tiền theo hóa đơn
235
- - Hóa đơn bán hàng theo hạn thanh toán
236
- - Công nợ phải thu theo tuổi nợ
237
-
238
- #### Danh mục
239
- - Đơn vị vận chuyển và gói cước
240
- - Phương thức thanh toán
241
- - Danh mục khách hàng và hạn mức công nợ
242
- - Số dư đầu kỳ công nợ khách hàng
243
- - Quản lý Affiliate link
186
+ Bán hàng đa kênh: bán lẻ tại quầy (POS), bán sỉ và bán online, kèm xử lý trả hàng và chi phí bán hàng. Thiết lập chính sách giá, chiết khấu, khuyến mãi và hoa hồng. Báo cáo công nợ phải thu, tuổi nợ và tình hình thanh toán. Danh mục khách hàng, vận chuyển và affiliate.
244
187
 
245
188
  ---
246
189
 
247
190
  ### 4. Mua hàng
248
-
249
- Quản lý toàn bộ quy trình mua hàng từ đề nghị, đặt hàng đến nhập kho và thanh toán.
250
-
251
- #### Chứng từ mua hàng
252
- - Đề nghị mua hàng
253
- - Đơn đăng ký bán hàng từ nhà cung cấp
254
- - Báo giá của nhà cung cấp
255
- - Đơn hàng mua
256
- - Phiếu nhập hàng
257
- - Hóa đơn mua hàng trong nước và mua dịch vụ
258
- - Chi phí mua hàng
259
- - Xử lý hàng trả lại nhà cung cấp
260
-
261
- #### Báo cáo mua hàng
262
- - Cân đối phát sinh công nợ phải trả
263
- - Sổ chi tiết công nợ nhà cung cấp
264
- - Công nợ cuối kỳ
265
- - Chi tiết chi tiền theo hóa đơn
266
- - Hóa đơn mua hàng theo hạn thanh toán
267
- - Công nợ phải trả theo tuổi nợ
268
-
269
- #### Danh mục
270
- - Bảng giá mua và giá thị trường
271
- - Danh mục nhà cung cấp và hạn mức công nợ
272
- - Số dư đầu kỳ công nợ nhà cung cấp
191
+ Quản lý toàn bộ quy trình mua hàng từ đề nghị, báo giá, đặt hàng đến nhập kho, thanh toán và trả hàng nhà cung cấp. Báo cáo công nợ phải trả và tuổi nợ. Danh mục nhà cung cấp, bảng giá mua và giá thị trường.
273
192
 
274
193
  ---
275
194
 
276
195
  ### 5. Nhà phân phối
277
-
278
- Phân hệ chuyên dụng để quản lý mạng lưới nhà phân phối (NPP), theo dõi hoạt động nhập-bán hàng và tồn kho tại từng NPP.
279
-
280
- #### Chứng từ
281
- - Nhập hàng và hóa đơn nhập hàng từ công ty
282
- - Bán hàng và xử lý hàng bán bị trả lại
283
- - Nhập/xuất kho nội bộ NPP
284
-
285
- #### Báo cáo
286
- - Doanh thu bán hàng của nhà phân phối
287
- - Chi tiết bán hàng theo khách hàng và theo sản phẩm
288
- - Tổng hợp nhập-xuất-tồn kho NPP
289
- - Sổ chi tiết vật tư và bảng kê nhập-xuất kho NPP
290
-
291
- #### Danh mục
292
- - Chính sách hoa hồng NPP
293
- - Danh sách khách hàng của từng NPP
294
- - Số dư đầu kỳ vật tư NPP
196
+ Quản lý mạng lưới nhà phân phối (NPP): nhập hàng, bán hàng, luân chuyển kho nội bộ. Báo cáo doanh thu và tồn kho theo từng NPP. Chính sách hoa hồng và danh mục khách hàng riêng của NPP.
295
197
 
296
198
  ---
297
199
 
298
200
  ### 6. Quản lý kho
299
-
300
- Quản lý toàn diện hàng tồn kho thực tế và kế toán kho.
301
-
302
- #### Nghiệp vụ kho
303
- - Phiếu xuất/nhập kho nội bộ
304
- - Đề nghị điều chuyển và phiếu xuất/nhập điều chuyển giữa các kho
305
- - Phiếu kiểm kê kho
306
-
307
- #### Báo cáo kho
308
- - Tổng hợp nhập-xuất-tồn (kho thực tế và kế toán)
309
- - Sổ chi tiết vật tư (kho thực tế và kế toán)
310
- - Tồn cuối kỳ (kho thực tế và kế toán)
311
- - Thời gian tồn kho
312
- - Bảng kê nhập-xuất kho
313
- - Tính giá trung bình và bảng giá trung bình
314
-
315
- #### Danh mục kho
316
- - Danh mục kho, ngành hàng, thương hiệu, xuất xứ
317
- - Quản lý sản phẩm, vật tư đa thuộc tính
318
- - Nhóm vật tư, đơn vị tính và quy đổi đơn vị tính
319
- - Danh mục lô hàng
320
- - Hạn mức tồn kho
201
+ Nghiệp vụ nhập/xuất/điều chuyển/kiểm kê kho. Báo cáo tổng hợp nhập-xuất-tồn (kho thực tế và kế toán), sổ chi tiết vật tư, thời gian tồn kho. Tính giá xuất kho theo hai phương pháp: **Bình quân gia quyền** và **FIFO** (Nhập trước - Xuất trước). Danh mục kho, sản phẩm/vật tư đa thuộc tính, đơn vị tính, lô hàng và hạn mức tồn kho.
321
202
 
322
203
  ---
323
204
 
324
205
  ### 7. Sản xuất
325
-
326
- Quản lý quy trình sản xuất từ lập kế hoạch đến hoàn thành.
327
-
328
- - Lập lệnh sản xuất và theo dõi tiến độ
329
- - Quản lý định mức nguyên vật liệu (BOM)
330
- - Theo dõi chi phí sản xuất
331
- - Báo cáo năng suất và sản lượng
206
+ Lập lệnh sản xuất và theo dõi tiến độ, quản lý định mức nguyên vật liệu (BOM), chi phí và báo cáo năng suất sản lượng.
332
207
 
333
208
  ---
334
209
 
335
210
  ### 8. Kế toán tài chính
336
-
337
- Phân hệ kế toán đầy đủ theo chuẩn mực kế toán Việt Nam.
338
-
339
- #### Thu chi và tiền mặt
340
- - Phiếu thu, phiếu chi
341
- - Quản lý quỹ tiền mặt và tiền gửi ngân hàng
342
- - Đối chiếu sao kê ngân hàng
343
-
344
- #### Kế toán tổng hợp
345
- - Nhật ký chung và sổ cái
346
- - Bảng cân đối kế toán
347
- - Báo cáo kết quả kinh doanh
348
- - Báo cáo lưu chuyển tiền tệ
349
-
350
- #### Thuế
351
- - Quản lý hóa đơn VAT đầu vào và đầu ra
352
- - Bảng kê thuế GTGT
353
- - Báo cáo thuế định kỳ
354
-
355
- #### Tài sản cố định
356
- - Quản lý danh mục tài sản
357
- - Tính và theo dõi khấu hao
358
- - Báo cáo tài sản cố định
211
+ Phân hệ kế toán đầy đủ theo chuẩn mực Việt Nam: thu chi, quỹ tiền mặt, ngân hàng; sổ cái, bảng cân đối và báo cáo kết quả kinh doanh; hóa đơn và báo cáo thuế GTGT; quản lý và khấu hao tài sản cố định.
359
212
 
360
213
  ---
361
214
 
362
215
  ### 9. Quản lý nhân sự
363
-
364
- Quản lý toàn bộ vòng đời nhân viên và chính sách nhân sự.
365
-
366
- #### Hồ sơ nhân sự
367
- - Quản lý thông tin nhân viên và hợp đồng lao động
368
- - Quản lý cơ cấu tổ chức và bộ phận
369
- - Hồ sơ năng lực và đánh giá nhân viên
370
-
371
- #### Chấm công và lương
372
- - Thiết lập ca làm việc và lịch làm việc
373
- - Chấm công tự động (máy chấm công, app)
374
- - Tính lương, phụ cấp, thưởng và các khoản khấu trừ
375
- - Bảng lương chi tiết và tổng hợp
376
-
377
- #### Phúc lợi và bảo hiểm
378
- - Quản lý BHXH, BHYT, BHTN
379
- - Báo cáo đóng bảo hiểm
380
- - Quản lý nghỉ phép, nghỉ bệnh
381
-
382
- #### Tuyển dụng
383
- - Quản lý tin tuyển dụng
384
- - Theo dõi quy trình tuyển dụng
385
- - Quản lý hồ sơ ứng viên
216
+ Quản lý hồ sơ nhân viên, hợp đồng và cơ cấu tổ chức. Chấm công, tính lương, phụ cấp và bảo hiểm (BHXH, BHYT, BHTN). Quản lý nghỉ phép và quy trình tuyển dụng.
386
217
 
387
218
  ---
388
219
 
389
220
  ### 10. Quản trị hệ thống
390
-
391
- Công cụ cấu hình và vận hành hệ thống.
392
-
393
- - Quản lý người dùng và phân quyền theo vai trò
394
- - Cấu hình đơn vị, chi nhánh, năm tài chính
395
- - Quản lý danh mục dùng chung (tỉnh thành, ngân hàng, nghề nghiệp...)
396
- - Nhật ký hoạt động hệ thống
397
- - Sao lưu và phục hồi dữ liệu
398
- - Cấu hình in ấn và mẫu chứng từ
221
+ Quản lý người dùng và phân quyền, cấu hình đơn vị/chi nhánh/năm tài chính, danh mục dùng chung, nhật ký hoạt động, sao lưu dữ liệu và cấu hình mẫu in chứng từ.
399
222
 
400
223
  ---
401
224
 
@@ -437,4 +260,15 @@ Mọi vi phạm điều khoản sẽ bị xử lý theo quy định của pháp
437
260
 
438
261
  ---
439
262
 
263
+ ## Liên hệ & Hỗ trợ
264
+
265
+ Mọi thắc mắc về giấy phép, hỗ trợ kỹ thuật hoặc hợp tác xin liên hệ tác giả:
266
+
267
+ | | |
268
+ |---|---|
269
+ | 📧 Email | [invncur@gmail.com](mailto:invncur@gmail.com) |
270
+ | 📞 Phone | [0933 511 376](tel:+840933511376) |
271
+
272
+ ---
273
+
440
274
  © Flexbiz. All rights reserved.
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "flexbiz-server",
3
3
  "main": "./server/app.js",
4
4
  "description": "Flexible Server",
5
- "version": "12.6.16",
5
+ "version": "12.6.18",
6
6
  "author": {
7
7
  "name": "Van Truong Pham",
8
8
  "email": "invncur@gmail.com"
@@ -1,3 +1,3 @@
1
1
  const User=global.getModel("user"),BearerStrategy=require("passport-http-bearer").Strategy;
2
- module.exports=function($passport$$){$passport$$.use(new BearerStrategy({passReqToCallback:!0},function($req$$,$token$$,$done$$){let $ip$$=$req$$.ip||$req$$.headers["x-forwarded-for"]||$req$$.connection.remoteAddress,$session_created$$=($req$$.cookies||{}).uid;setImmediate(function(){User.findByToken($token$$,$ip$$,async function($err$$,$user$$,$tokenInfo$$){if($err$$)return $done$$(null,!1,{message:$err$$});if($tokenInfo$$&&$tokenInfo$$.once&&$tokenInfo$$.used)return $done$$(null,!1,{message:"Token n\u00e0y \u0111\u00e3 h\u1ebft hi\u1ec7u l\u1ef1c"});
3
- if(!$user$$)return $done$$(null,!1,{message:"Token kh\u00f4ng h\u1ee3p l\u1ec7"});if($user$$.status==0)return $done$$(null,!1,{message:"T\u00e0i kho\u1ea3n n\u00e0y kh\u00f4ng c\u00f2n hi\u1ec7u l\u1ef1c"});$user$$.toObject&&($user$$=$user$$.toObject());$user$$.token_id_app=$tokenInfo$$.only_id_app;$user$$.token_id_apps=$tokenInfo$$.id_apps;return $done$$(null,$user$$)},{session_created:$session_created$$})})}))};
2
+ module.exports=function($passport$$){$passport$$.use(new BearerStrategy({passReqToCallback:!0},function($req$$,$token$$,$done$$){User.findByToken($token$$,$req$$.ip||$req$$.headers["x-forwarded-for"]||$req$$.connection.remoteAddress,async function($err$$,$user$$,$tokenInfo$$){if($err$$)return $done$$(null,!1,{message:$err$$});if($tokenInfo$$&&$tokenInfo$$.once&&$tokenInfo$$.used)return $done$$(null,!1,{message:"Token n\u00e0y \u0111\u00e3 h\u1ebft hi\u1ec7u l\u1ef1c"});if(!$user$$)return $done$$(null,
3
+ !1,{message:"Token kh\u00f4ng h\u1ee3p l\u1ec7"});if($user$$.status==0)return $done$$(null,!1,{message:"T\u00e0i kho\u1ea3n n\u00e0y kh\u00f4ng c\u00f2n hi\u1ec7u l\u1ef1c"});$user$$.toObject&&($user$$=$user$$.toObject());$user$$.token_id_app=$tokenInfo$$.only_id_app;$user$$.token_id_apps=$tokenInfo$$.id_apps;return $done$$(null,$user$$)},{session_created:($req$$.cookies||{}).uid})}))};
@@ -11,10 +11,10 @@ await new Promise(($resolve$$,$reject$$)=>{try{$ctrl$$.dynamicCreating($user$$,$
11
11
  break;case "3":$tu_ngay$$=moment($obj$$.ngay_ct).startOf("quarter").toDate();$den_ngay$$=moment($obj$$.ngay_ct).endOf("quarter").toDate();$query_check$$.ngay_ct={$gte:$tu_ngay$$,$lte:$den_ngay$$};break;case "8":$tu_ngay$$=moment($obj$$.ngay_ct).startOf("year").toDate(),$den_ngay$$=moment($obj$$.ngay_ct).endOf("year").toDate(),$query_check$$.ngay_ct={$gte:$tu_ngay$$,$lte:$den_ngay$$}}$model$$.findOne($query_check$$,{so_ct:1}).lean().then($rs$$=>{if($rs$$){let $msgError$$="S\u1ed1 ch\u1ee9ng t\u1eeb "+
12
12
  $obj$$.so_ct+" \u0111\u00e3 t\u1ed3n t\u1ea1i. H\u00e3y ch\u1ecdn m\u1ed9t s\u1ed1 ch\u1ee9ng t\u1eeb kh\u00e1c";if($ctrl$$.options.onErrorCreating)$ctrl$$.options.onErrorCreating($user$$,$obj$$,$e$$=>{$e$$&&($msgError$$=$msgError$$+"\n"+$e$$);$callback$$($msgError$$)});else $callback$$($msgError$$)}else $callback$$()}).catch($e$$=>{Logger.error($e$$)})}else $callback$$();else $callback$$()},$File$$=global.getModel("file"),$Support$$=global.getModel("support");async.waterfall([function($callback$$){setImmediate(async function(){let $notNeedRight$$=
13
13
  await $ctrl$$.notNeedRight($user$$,{action:$action$$,obj:$obj$$});permission.hasRight($obj$$.id_app,$user$$.email,$ctrl$$.module,$action$$,function($error$$,$hr$$,$c_app$$){if($error$$||!$hr$$)return $error$$=$error$$||"",$callback$$({error:$error$$.error||$error$$||ERRORS.ERR_NOT_PERMIT,code:$error$$.code||ERRORS.ERR_NOT_PERMIT_CODE});$ctrl$$.checkData($c_app$$,$obj$$,$e$$=>{if($e$$)return $callback$$($e$$);$ctrl$$.creating?$ctrl$$.creating($user$$,$obj$$,function($error$$,$_obj$$){if($error$$)return $callback$$($error$$);
14
- for(let $f$$ of Object.keys($schema_paths$$))$error$$=$_obj$$.get?$_obj$$.get($f$$):$_obj$$[$f$$],$obj$$.set($f$$,$error$$);$callback$$(null,$obj$$)},{data:$data$$,action:$action$$}):$callback$$(null,$obj$$)})},{data:$obj$$,notNeedRight:$notNeedRight$$,listinfo_code:$listinfo_code$$})})},($obj$$,$callback$$)=>{let $ma_ct$$=$listinfo_code$$||$ctrl$$.name;const $condition_qct$$={status:!0,id_app:$obj$$.id_app,cac_ma_ct:$ma_ct$$.toLowerCase()};let $_options_qct$$;$_options_qct$$=$obj$$.toObject?convertObjectIdsToStrings($obj$$.toObject()):
15
- {...$obj$$};let $keys_options$$=Object.keys($_options_qct$$);global.getModel("dmqct").find($condition_qct$$).lean().then($qcts_rs$$=>{$qcts_rs$$=($qcts_rs$$||[]).filter($qct$$=>$qct$$.field!=="so_ct"&&!$obj$$[$qct$$.field]&&$model$$.schema.paths[$qct$$.field]);$qcts_rs$$=$qcts_rs$$.filter($qct$$=>{if($qct$$.dieu_kien&&$keys_options$$.length>0)try{let $str_func$$=$qct$$.dieu_kien;$str_func$$.indexOf("return ")!==0&&($str_func$$=`return ${$str_func$$}`);return $str_func$$.indexOf("async ")>0?!1:evalute($str_func$$,
16
- {...$_options_qct$$,master:{...$_options_qct$$},moment,numeral})}catch($e$$){return Logger.error("Error find quyen chung tu",$e$$.message,$qct$$.dieu_kien),!1}else return!0});async.mapSeries($qcts_rs$$,($qct$$,$cb$$)=>{let $field$$=$qct$$.field,$_options$$={...$_options_qct$$};$_options$$.id_qct=$qct$$._id.toString();let $count$$=0;async.whilst(function($cb$$){$cb$$(null,$count$$<10)},function($callback$$){getNextSequence($obj$$.id_app,$ma_ct$$,$field$$,function($e$$,$rs$$){setImmediate(async()=>
17
- {if($e$$)return $callback$$($e$$);$obj$$[$field$$]=$rs$$[$field$$];$qct$$.check_duplicate?await $model$$.findOne({id_app:$obj$$.id_app,[$field$$]:$obj$$[$field$$]},{[$field$$]:1}).lean()?$count$$>=9?$callback$$(`Kh\u00f4ng th\u1ec3 t\u1ef1 \u0111\u1ed9ng t\u1ea1o gi\u00e1 tr\u1ecb cho field ${$field$$}. Gi\u00e1 tr\u1ecb "${$obj$$[$field$$]}" \u0111\u00e3 t\u1ed3n t\u1ea1i. H\u00e3y ki\u1ec3m tra l\u1ea1i th\u00f4ng s\u1ed1 quy\u1ec3n ch\u1ee9ng t\u1eeb sao cho gi\u00e1 tr\u1ecb s\u1ebd t\u1ea1o ra kh\u00f4ng b\u1ecb tr\u00f9ng v\u1edbi gi\u00e1 tr\u1ecb \u0111\u00e3 c\u00f3`):
14
+ for(let $f$$ of Object.keys($schema_paths$$))$error$$=$_obj$$.get?$_obj$$.get($f$$):$_obj$$[$f$$],$obj$$.set($f$$,$error$$);$callback$$(null,$obj$$)},{data:$data$$,action:$action$$}):$callback$$(null,$obj$$)})},{data:$obj$$,notNeedRight:$notNeedRight$$,listinfo_code:$listinfo_code$$,user:$user$$})})},($obj$$,$callback$$)=>{let $ma_ct$$=$listinfo_code$$||$ctrl$$.name;const $condition_qct$$={status:!0,id_app:$obj$$.id_app,cac_ma_ct:$ma_ct$$.toLowerCase()};let $_options_qct$$;$_options_qct$$=$obj$$.toObject?
15
+ convertObjectIdsToStrings($obj$$.toObject()):{...$obj$$};let $keys_options$$=Object.keys($_options_qct$$);global.getModel("dmqct").find($condition_qct$$).lean().then($qcts_rs$$=>{$qcts_rs$$=($qcts_rs$$||[]).filter($qct$$=>$qct$$.field!=="so_ct"&&!$obj$$[$qct$$.field]&&$model$$.schema.paths[$qct$$.field]);$qcts_rs$$=$qcts_rs$$.filter($qct$$=>{if($qct$$.dieu_kien&&$keys_options$$.length>0)try{let $str_func$$=$qct$$.dieu_kien;$str_func$$.indexOf("return ")!==0&&($str_func$$=`return ${$str_func$$}`);
16
+ return $str_func$$.indexOf("async ")>0?!1:evalute($str_func$$,{...$_options_qct$$,master:{...$_options_qct$$},moment,numeral})}catch($e$$){return Logger.error("Error find quyen chung tu",$e$$.message,$qct$$.dieu_kien),!1}else return!0});async.mapSeries($qcts_rs$$,($qct$$,$cb$$)=>{let $field$$=$qct$$.field,$_options$$={...$_options_qct$$};$_options$$.id_qct=$qct$$._id.toString();let $count$$=0;async.whilst(function($cb$$){$cb$$(null,$count$$<10)},function($callback$$){getNextSequence($obj$$.id_app,
17
+ $ma_ct$$,$field$$,function($e$$,$rs$$){setImmediate(async()=>{if($e$$)return $callback$$($e$$);$obj$$[$field$$]=$rs$$[$field$$];$qct$$.check_duplicate?await $model$$.findOne({id_app:$obj$$.id_app,[$field$$]:$obj$$[$field$$]},{[$field$$]:1}).lean()?$count$$>=9?$callback$$(`Kh\u00f4ng th\u1ec3 t\u1ef1 \u0111\u1ed9ng t\u1ea1o gi\u00e1 tr\u1ecb cho field ${$field$$}. Gi\u00e1 tr\u1ecb "${$obj$$[$field$$]}" \u0111\u00e3 t\u1ed3n t\u1ea1i. H\u00e3y ki\u1ec3m tra l\u1ea1i th\u00f4ng s\u1ed1 quy\u1ec3n ch\u1ee9ng t\u1eeb sao cho gi\u00e1 tr\u1ecb s\u1ebd t\u1ea1o ra kh\u00f4ng b\u1ecb tr\u00f9ng v\u1edbi gi\u00e1 tr\u1ecb \u0111\u00e3 c\u00f3`):
18
18
  ($count$$++,$callback$$()):($count$$=99999,$callback$$()):($count$$=99999,$callback$$())})},$_options$$)},function($err$$){$cb$$($err$$)})},$e$$=>{$callback$$($e$$)})}).catch($e$$=>{Logger.error($e$$)})},$callback$$=>{if((!$voucher_options$$?.trang_thai_create_voucher_numbers||$voucher_options$$?.trang_thai_create_voucher_numbers.length==0||$voucher_options$$?.trang_thai_create_voucher_numbers?.indexOf($obj$$.trang_thai)>=0)&&$model$$.schema.paths.so_ct)if($obj$$.so_ct&&$obj$$.so_ct.toUpperCase()!==
19
19
  ($listinfo_code$$||$ctrl$$.name).toUpperCase()&&$obj$$.so_ct.toUpperCase()!==$ctrl$$.name.toUpperCase())$checkVoucherNumber$$($error$$=>{$callback$$($error$$)});else{let $count$$=0;async.whilst(function($cb$$){$cb$$(null,$count$$<100)},function($callback$$){getNextSequence($obj$$.id_app,$listinfo_code$$||$ctrl$$.name,"so_ct",function($e$$,$rs$$){if($e$$)return $callback$$($e$$);$obj$$.so_ct=$rs$$.so_ct;$checkVoucherNumber$$($error$$=>{$error$$?$count$$>=99?$callback$$($error$$):($count$$++,$callback$$()):
20
20
  ($count$$=99999,$callback$$())})},$obj$$)},function($err$$){$callback$$($err$$)})}else $callback$$()},function($callback$$){setImmediate(async()=>{if($model$$.schema.paths.ma_dvcs&&$ctrl$$.name!=="dvcs")try{if($obj$$.ma_dvcs)if(global.mongoose.Types.ObjectId.isValid($obj$$.ma_dvcs)){let $_id_dvcs$$=global.mongoose.Types.ObjectId($obj$$.ma_dvcs);await global.getModel("dvcs").findOne({_id:$_id_dvcs$$}).lean()?$callback$$():global.getModel("dvcs").create({_id:$_id_dvcs$$,id_app:$obj$$.id_app,ma_dvcs:"IMPORTED",
@@ -4,7 +4,7 @@ $listinfo$$.code)!=$ctrl$$.name&&($listinfo_code$$=$ctrl$$.name):$listinfo_code$
4
4
  (await global.getModel("options").findOne({id_app:$user$$.current_id_app,id_func:$ctrl$$.name}).lean()||{}).option;if($obj$$.ngay_ct&&$obj$$.id_app&&$obj$$.schema&&$obj$$.schema.validate&&$obj$$.schema.validate.ngay_ct)try{await new Promise(($rs$$,$rj$$)=>{validator.unlockBook[0]($obj$$.id_app,$obj$$.ngay_ct,$unlock$$=>{if(!$unlock$$)return $rj$$(validator.unlockBook[1]);$rs$$($unlock$$)},$voucher_options$$)})}catch($e$$){return $callback$$({error:$e$$.message||$e$$.error||$e$$,code:ERRORS.BOOK_LOCK})}$obj$$=
5
5
  convertObjectIdsToStrings($obj$$.toObject());($q_approve_requireOtp$$=$ctrl$$.options.requireOtp)&&_.isFunction($q_approve_requireOtp$$)&&($q_approve_requireOtp$$=$q_approve_requireOtp$$($obj$$,{action:"delete",_id:$_id$$,user:$user$$}));if($q_approve_requireOtp$$)try{await permission.verifyOTP($user$$.email,$req$$.query["otp-id"],$req$$.query["otp-code"])}catch($e$$){return $callback$$({error:$e$$.message||$e$$.error||$e$$,code:ERRORS.ERR_VERIFY_OTP})}setImmediate(async()=>{let $notNeedRight$$=await $ctrl$$.notNeedRight($req$$.user,
6
6
  {action:"delete",obj:$obj$$});permission.hasRight($ctrl$$.require_id_app?$obj$$.id_app:void 0,$req$$.user.email,$module$$,"delete",function($error$$,$hr$$){if($hr$$)checkReference($model$$,$obj$$,function($error$$){if($error$$)return $callback$$({error:ERRORS.ERR_ARISE+($error$$.error||$error$$.message||$error$$),code:ERRORS.ERR_ARISE_CODE});$req$$.obj=$obj$$;$callback$$()});else return $callback$$({error:$error$$.error||$error$$||ERRORS.ERR_NOT_PERMIT,code:$error$$.code||ERRORS.ERR_NOT_PERMIT_CODE})},
7
- {obj:$obj$$,notNeedRight:$notNeedRight$$,listinfo_code:$listinfo_code$$})})})},function($callback$$){let $obj$$=$req$$.obj;$ctrl$$.deleting?$ctrl$$.deleting($req$$.user,$obj$$,function($e$$,$obj$$){if($e$$)return Logger.error("deleting",$e$$),$e$$.error?$callback$$($e$$):$callback$$({error:$e$$.message||$e$$});$ctrl$$.dynamicDeleting?$ctrl$$.dynamicDeleting($req$$.user,$obj$$,function($error$$,$obj$$){if($error$$)return $callback$$($error$$);$req$$.obj=$obj$$;$callback$$()},{listinfo_code:$listinfo_code$$,
7
+ {obj:$obj$$,notNeedRight:$notNeedRight$$,listinfo_code:$listinfo_code$$,user:$user$$})})})},function($callback$$){let $obj$$=$req$$.obj;$ctrl$$.deleting?$ctrl$$.deleting($req$$.user,$obj$$,function($e$$,$obj$$){if($e$$)return Logger.error("deleting",$e$$),$e$$.error?$callback$$($e$$):$callback$$({error:$e$$.message||$e$$});$ctrl$$.dynamicDeleting?$ctrl$$.dynamicDeleting($req$$.user,$obj$$,function($error$$,$obj$$){if($error$$)return $callback$$($error$$);$req$$.obj=$obj$$;$callback$$()},{listinfo_code:$listinfo_code$$,
8
8
  req:$req$$}):($req$$.obj=$obj$$,$callback$$())},{req:$req$$}):$ctrl$$.dynamicDeleting?$ctrl$$.dynamicDeleting($req$$.user,$obj$$,function($error$$,$obj$$){if($error$$)return $callback$$($error$$);$req$$.obj=$obj$$;$callback$$()},{listinfo_code:$listinfo_code$$,req:$req$$}):($req$$.obj=$obj$$,$callback$$())},function($callback$$){let $obj$$=$req$$.obj;$ctrl$$.emit("deleting",{...$obj$$});deletePost($req$$.user,$obj$$,async $e$$=>{if($e$$)return Logger.error("delete post",$e$$),$e$$.error?$callback$$($e$$):
9
9
  $callback$$({error:$e$$.message||$e$$});if($ctrl$$.dynamicDeletePost)try{await $ctrl$$.dynamicDeletePost($obj$$)}catch($e$$){return $callback$$({error:$e$$.message||$e$$.error||$e$$})}$model$$.deleteOne({_id:$obj$$._id},function($e$$){if($e$$)return Logger.error("delete object",$e$$),$e$$.error?$callback$$($e$$):$callback$$({error:$e$$.message||$e$$});onAfterCommit(async()=>{$ctrl$$.emit("deleted",$obj$$);$ctrl$$.deleteData({...$obj$$});global.getModel("log").create({id_app:$req$$.user.current_id_app,
10
10
  id_func:$ctrl$$.name,action:"DELETE",data:{id:$obj$$._id,data:$obj$$}},$req$$.user.email,$req$$.user_agent,$req$$);global.getModel("link").deleteMany({$or:[{id_a:$obj$$._id},{id_b:$obj$$._id}]},function($e$$){$e$$&&Logger.error("Can't delete links\n"+$e$$)});global.getModel("customer").updateActives&&global.getModel("customer").updateActives($obj$$);runWebhooks($ctrl$$,$obj$$,"DELETE");pushNotification($ctrl$$,$obj$$,"delete",null,null,{exclude_token:$req$$.query.access_token})});$ctrl$$.deleted?
@@ -1,29 +1,35 @@
1
1
  const fs=require("fs"),path=require("path"),async=require("async"),_=require("lodash"),Moment=require("moment-timezone"),moment=$time$$=>Moment.tz($time$$,configs.timezone||"Asia/Ho_Chi_Minh"),numeral=require("numeral"),excelReport=require("excel-report"),{evalute,JSONParser,getDateRangeByType}=require("../libs/utils"),permission=require("../libs/permission"),htmlReport=require("../libs/htmlReport"),utils=require("../libs/utils"),queryBuilding=require("../libs/queryBuilding"),{createTmpFile,generateDefaultExcel}=
2
- require("../libs/excelHelper"),{ERRORS}=require("./controllerUtils"),FIELDS_NEED_CONVERT_CODE={ten_kh:{code:"ma_kh",model:"customer"},ten_vt:{code:"ma_vt",model:"dmvt"},ten_kho:{code:"ma_kho",model:"dmkho"},ten_phi:{code:"ma_phi",model:"dmphi"},ten_dt:{code:"ma_dt",model:"dmdt"},ten_bp:{code:"ma_bp",model:"dmbp"},ten_nv:{code:"ma_nv",model:"dmnv"}};
2
+ require("../libs/excelHelper"),{ERRORS}=require("./controllerUtils"),{isValidObjectId}=require("mongoose"),FIELDS_NEED_CONVERT_CODE={ten_kh:{code:"ma_kh",model:"customer"},ten_vt:{code:"ma_vt",model:"dmvt"},ten_kho:{code:"ma_kho",model:"dmkho"},ten_phi:{code:"ma_phi",model:"dmphi"},ten_dt:{code:"ma_dt",model:"dmdt"},ten_bp:{code:"ma_bp",model:"dmbp"},ten_nv:{code:"ma_nv",model:"dmnv"}};
3
3
  async function convertNamesToCodes($id_app$$,$condition$$,$FIELDS_NEED_CONVERT_CODE$$,$model$$){if(!$condition$$||typeof $condition$$!=="object")return $condition$$;if(Array.isArray($condition$$)){for(var $i_key_q$$=0;$i_key_q$$<$condition$$.length;$i_key_q$$++)$condition$$[$i_key_q$$]=await convertNamesToCodes($id_app$$,$condition$$[$i_key_q$$],$FIELDS_NEED_CONVERT_CODE$$,$model$$);return $condition$$}for($i_key_q$$ in $condition$$)if($i_key_q$$==="$or"||$i_key_q$$==="$and")$condition$$[$i_key_q$$]=
4
4
  await convertNamesToCodes($id_app$$,$condition$$[$i_key_q$$],$FIELDS_NEED_CONVERT_CODE$$,$model$$);else{var $ds_fieldMapping$$=$FIELDS_NEED_CONVERT_CODE$$[$i_key_q$$];if($ds_fieldMapping$$){const $targetCodeField$$=$ds_fieldMapping$$.code;$id_app$$&&_.has($model$$.schema.paths,$targetCodeField$$)&&$model$$.modelName!==$ds_fieldMapping$$.model&&($condition$$[$targetCodeField$$]?_.has($model$$.schema.paths,$i_key_q$$)&&delete $condition$$[$i_key_q$$]:($ds_fieldMapping$$=await global.getModel($ds_fieldMapping$$.model).find({id_app:$id_app$$,
5
5
  [$i_key_q$$]:$condition$$[$i_key_q$$]},{[$targetCodeField$$]:1}),$condition$$[$targetCodeField$$]={$in:$ds_fieldMapping$$.map($d$$=>$d$$[$targetCodeField$$])},delete $condition$$[$i_key_q$$]))}}return $condition$$}
6
+ const NEED_GET_CHILDREN={ma_bp:{model:"dmbp",code:"ma_bp",code_mother:"ma_bp_me"},ma_kho:{model:"dmkho",code:"ma_kho",code_mother:"ma_kho_me"},nh_kh:{model:"group",code:"_id",code_mother:"group_mother"},nh_kh2:{model:"group",code:"_id",code_mother:"group_mother"},nh_kh3:{model:"group",code:"_id",code_mother:"group_mother"},nh_kh4:{model:"group",code:"_id",code_mother:"group_mother"},nh_kh5:{model:"group",code:"_id",code_mother:"group_mother"},ma_nvt:{model:"dmnvt",code:"_id",code_mother:"nh_me"},
7
+ ma_nvt2:{model:"dmnvt",code:"_id",code_mother:"nh_me"},ma_nvt3:{model:"dmnvt",code:"_id",code_mother:"nh_me"}};
8
+ async function getChildren($id_app$$,$condition$$,$NEED_GET_CHILDREN$$){if(!$condition$$||typeof $condition$$!=="object")return $condition$$;if(Array.isArray($condition$$))return await Promise.all($condition$$.map(async($item$$,$index$$)=>{$condition$$[$index$$]=await getChildren($id_app$$,$item$$,$NEED_GET_CHILDREN$$)})),$condition$$;const $tasks$$=[];for(let $key_q$$ in $condition$$){if($key_q$$==="$or"||$key_q$$==="$and"){$tasks$$.push((async()=>{$condition$$[$key_q$$]=await getChildren($id_app$$,
9
+ $condition$$[$key_q$$],$NEED_GET_CHILDREN$$)})());continue}const $fieldMapping$$=$NEED_GET_CHILDREN$$[$key_q$$];if($fieldMapping$$){const $value$$=$condition$$[$key_q$$];if($value$$&&(typeof $value$$==="string"||Array.isArray($value$$))){const $model$$=global.getModel($fieldMapping$$.model);$model$$&&$tasks$$.push((async()=>{const $childCodes$$=await utils.getCodeChildren($model$$,$id_app$$,$value$$,$fieldMapping$$.code,$fieldMapping$$.code_mother);$condition$$[$key_q$$]={$in:$childCodes$$}})())}}}$tasks$$.length>
10
+ 0&&await Promise.all($tasks$$);return $condition$$}
6
11
  const hasRight=async($ctrl$$,$req$$,$listinfo_code$$,$id_app$$,$shareRoute$$)=>{if(!$shareRoute$$)return new Promise(($resolve$$,$reject$$)=>{setImmediate(async()=>{let $notNeedRight$$=await $ctrl$$.notNeedRight($req$$.user,{action:"view"});permission.hasRight($id_app$$,$req$$.user.email,$ctrl$$.module,"view",function($e$$,$permission$$){$e$$&&Logger.error("[findHandler] [hasRight] L\u1ed7i Kh\u00f4ng c\u00f3 quy\u1ec1n truy c\u1eadp:",$req$$.user.email,$e$$);if($ctrl$$.options.onQuery)$ctrl$$.options.onQuery($req$$,
7
- $e$$=>{if($e$$)return $reject$$({error:$e$$.error||$e$$.message||$e$$});if(!$permission$$)return $resolve$$("0");$resolve$$($permission$$)});else{if(!$permission$$)return $resolve$$("0");$resolve$$($permission$$)}},{notNeedRight:$notNeedRight$$,right_code:$listinfo_code$$})})})},handleDynamicCondition=async($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$)=>{let {condition:$condition$$,id_app:$id_app$$}=$appCondition$$,$userInfo$$={...$req$$.user,current_id_app:$id_app$$};!$id_app$$||$userInfo$$.current_app_info&&
8
- $userInfo$$.current_app_info?._id?.toString()==$id_app$$||($userInfo$$.current_app_info=await global.getModel("app").findOne({_id:$id_app$$}).lean());$appCondition$$.userInfo=$userInfo$$;let $new_condition$$=await new Promise(($resolve$$,$reject$$)=>{$ctrl$$.finding?$ctrl$$.finding($userInfo$$,$condition$$,function($error$$,$condition$$){if($error$$)return $reject$$({error:$error$$.message||$error$$.error||$error$$});$ctrl$$.dynamicFinding?$ctrl$$.dynamicFinding($userInfo$$,$condition$$,function($e$$,
9
- $condition$$){if($e$$)return Logger.error("dynamicFinding",$e$$),$e$$.error?$reject$$($e$$):$reject$$({error:$e$$.message||$e$$});$resolve$$($condition$$)},{listinfo_code:$listinfo_code$$,req:$req$$}):$resolve$$($condition$$)},{req:$req$$}):$ctrl$$.dynamicFinding?$ctrl$$.dynamicFinding($userInfo$$,$condition$$,function($e$$,$condition$$){if($e$$)return Logger.error("dynamicFinding",$e$$),$e$$.error?$reject$$($e$$):$reject$$({error:$e$$.message||$e$$});$resolve$$($condition$$)},{listinfo_code:$listinfo_code$$,
10
- req:$req$$}):$resolve$$($condition$$)});$appCondition$$.condition=$new_condition$$;return $appCondition$$},buildCondition=async($ctrl$$,$req$$,$listinfo_code$$,$appConditions_shareRoute$$)=>{var $body_ds_id_app$$={};_.isObject($req$$.body)&&($body_ds_id_app$$=$req$$.body);let $query$$={...$req$$.query,...$body_ds_id_app$$};$query$$.tu_ngay&&($query$$.tu_ngay=moment($query$$.tu_ngay).startOf("date").toDate());$query$$.den_ngay&&($query$$.den_ngay=moment($query$$.den_ngay).endOf("date").toDate());($body_ds_id_app$$=
11
- $query$$.id_apps)&&typeof $body_ds_id_app$$=="string"&&($body_ds_id_app$$=[$body_ds_id_app$$]);let $all_app$$=$query$$.all_app;$req$$.query=$query$$;if($query$$.sort)if(typeof $query$$.sort=="object")var $or_sort$$=$query$$.sort;else try{$or_sort$$=JSONParser($query$$.sort)}catch($e$$){throw Logger.error("error parse json",$e$$,$query$$.sort),`Sort ${$query$$.sort} is not valid`;}!$or_sort$$&&$ctrl$$.sort&&($or_sort$$=Object.assign({},$ctrl$$.sort));$req$$.sort=$or_sort$$;$req$$.fetch_by_groups=$query$$.fetch_by_groups;
12
- delete $query$$.fetch_by_groups;let $condition$$={};$or_sort$$=[];const $hasCodeByName$$=$k$$=>FIELDS_NEED_CONVERT_CODE[$k$$]&&_.has($ctrl$$.model.schema.paths,FIELDS_NEED_CONVERT_CODE[$k$$].code)&&$ctrl$$.model.modelName!==FIELDS_NEED_CONVERT_CODE[$k$$].model?!0:!1;for(var $key$$ in $query$$)if($key$$!=="id_app"&&$key$$!=="access_token"&&$key$$!=="limit")if($key$$==="_id"&&global.mongoose.Types.ObjectId.isValid($query$$._id))try{let $id$$=global.mongoose.Types.ObjectId($query$$._id);$or_sort$$.push({_id:$id$$})}catch($error$$){Logger.error("find condition",
13
- $error$$)}else{if($key$$==="q"&&$query$$[$key$$])try{let $q$$=_.isObject($query$$[$key$$])?$query$$[$key$$]:JSONParser($query$$[$key$$]);$req$$.fetch_by_groups=$req$$.fetch_by_groups||$q$$.fetch_by_groups;delete $q$$.fetch_by_groups;$body_ds_id_app$$=$q$$.id_apps||$body_ds_id_app$$;$all_app$$=$q$$.all_app||$all_app$$;delete $q$$.all_app;delete $q$$.id_apps;if(Object.keys($q$$).includes("_id"))if(!$q$$._id)delete $q$$._id;else if(typeof $q$$._id!=="object"&&!global.mongoose.Types.ObjectId.isValid($q$$._id))throw Logger.error("Condition is not valid",
14
- $q$$),"Condition is not valid";for(let $k_q$$ in $q$$)if(typeof $q$$[$k_q$$]=="string"&&$ctrl$$.model.schema.paths[$k_q$$]?.instance?.toLowerCase()=="date"){let {fromDate:$fromDate$$,toDate:$toDate$$}=getDateRangeByType($q$$[$k_q$$]);$fromDate$$&&$toDate$$&&($q$$[$k_q$$]={$gte:$fromDate$$,$lte:$toDate$$})}($condition$$=$q$$)||($condition$$={});continue}catch($e$$){throw Logger.error("find condition",$e$$,$query$$[$key$$]),"Condition is not valid";}if($key$$!=="fields"&&(_.has($ctrl$$.model.schema.paths,
15
- $key$$)||$hasCodeByName$$($key$$)))if($ctrl$$.options.findExact[$key$$])$condition$$[$key$$]=$query$$[$key$$];else{let $item$$={};if($ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()=="number")$item$$[$key$$]=Number($query$$[$key$$]);else if($ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()=="date"){let {fromDate:$fromDate$$,toDate:$toDate$$}=getDateRangeByType($query$$[$key$$]);$item$$[$key$$]=$fromDate$$&&$toDate$$?{$gte:$fromDate$$,$lte:$toDate$$}:new Date($query$$[$key$$])}else $ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()==
16
- "string"?$item$$[$key$$]={$regex:($query$$[$key$$]||"").trim(),$options:"i"}:$item$$[$key$$]=$query$$[$key$$];$or_sort$$.push($item$$)}else $key$$==="$text"&&$or_sort$$.push({$text:{$search:$query$$[$key$$]}})}$or_sort$$.length!==0&&($query$$.cType==="$and"?$condition$$.$and=$or_sort$$:$condition$$.$or=$or_sort$$);$key$$=queryBuilding.convertLegacyQuery(_.cloneDeep($condition$$));$condition$$=queryBuilding.buildSearchQuery($key$$);$appConditions_shareRoute$$||$ctrl$$.require_id_app==0?$appConditions_shareRoute$$=
17
- [{id_app:$req$$.user.current_id_app,condition:{id_app:$req$$.user.current_id_app,...$condition$$}}]:($body_ds_id_app$$=($body_ds_id_app$$||[]).filter($id$$=>global.mongoose.Types.ObjectId.isValid($id$$)),$body_ds_id_app$$.length==0&&($all_app$$?(Logger.warn("[findHanlder] t\u00ecm t\u1ea5t c\u1ea3 c\u00e1c c\u00f4ng ty c\u00f3 quy\u1ec1n..."),$body_ds_id_app$$=(await global.getModel("participant").find({email:$req$$.user.email},{id_app:1}).lean()).map($a$$=>$a$$.id_app)):$body_ds_id_app$$=[$req$$.user.current_id_app]),
18
- $appConditions_shareRoute$$=$body_ds_id_app$$.map($id_app$$=>({id_app:$id_app$$,condition:{...$condition$$,id_app:$id_app$$}})));return Promise.all($appConditions_shareRoute$$.map($appCondition$$=>handleDynamicCondition($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$)))},getRightByItem=async($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$,$shareRoute$$)=>$shareRoute$$?$appCondition$$:new Promise(($resolve$$,$reject$$)=>{setImmediate(async()=>{let $notNeedRight$$=await $ctrl$$.notNeedRight($req$$.user,
19
- {action:"view"});permission.getRightByItem($appCondition$$.id_app,$ctrl$$.model,$req$$.user.email,function($e$$,$_condition$$,$admin$$){if($e$$)return Logger.error("[findHandler] [getRightByItem] L\u1ed7i Kh\u00f4ng c\u00f3 quy\u1ec1n:",$e$$),$reject$$({error:$e$$.error||$e$$.message||$e$$,code:$e$$.code||ERRORS.ERR_NOT_PERMIT_CODE});if($appCondition$$.addmin=$admin$$)return $resolve$$($appCondition$$);$appCondition$$.condition||($appCondition$$.condition={});$appCondition$$.condition.$and||($appCondition$$.condition.$and=
20
- []);if($ctrl$$.options.onRightByItem)$ctrl$$.options.onRightByItem($req$$.user,$_condition$$,($e$$,$_condition$$)=>{if($e$$)return $reject$$({error:$e$$.error||$e$$.message||$e$$});_.isObject($_condition$$)&&Object.keys($_condition$$).length>0&&$appCondition$$.condition.$and.push($_condition$$);$appCondition$$.condition_assign=$_condition$$;$resolve$$($appCondition$$)});else _.isObject($_condition$$)&&Object.keys($_condition$$).length>0&&$appCondition$$.condition.$and.push($_condition$$),$resolve$$($appCondition$$)},
21
- $ctrl$$.name,{notNeedRight:$notNeedRight$$,right_code:$listinfo_code$$})})}),getRightByCollectionRef=async($ctrl$$,$req$$,$appCondition$$,$shareRoute$$)=>$shareRoute$$||$appCondition$$.admin||!$appCondition$$.condition_assign||Object.keys($appCondition$$.condition_assign).length===0?$appCondition$$:new Promise(($resolve$$,$reject$$)=>{setImmediate(async()=>{if($ctrl$$.options.assignWiths){let $condition_assignwiths$$={};async.map($ctrl$$.options.assignWiths,($col$$,$callback$$)=>{let $m$$=global.getModel($col$$.ref_collection);
22
- permission.getRightByItem($appCondition$$.id_app,$m$$,$req$$.user.email,function($e$$,$_condition$$,$admin$$){if($e$$)return $callback$$({e:$e$$.error||$e$$.message||$e$$,code:$e$$.code||ERRORS.ERR_NOT_PERMIT_CODE});if($admin$$)return $callback$$(null);$_condition$$.id_app=$appCondition$$.id_app;$appCondition$$.condition[$col$$.ref_field]&&($_condition$$[$col$$.ref_field]=$appCondition$$.condition[$col$$.ref_field]);$m$$.find($_condition$$,{[$col$$.ref_field]:1}).lean().then($dsdt_rs$$=>{$dsdt_rs$$=
23
- $dsdt_rs$$.map($r$$=>$r$$[$col$$.ref_field]);$dsdt_rs$$.push("");$dsdt_rs$$.push(null);$condition_assignwiths$$[$col$$.field]={$in:$dsdt_rs$$};$callback$$()}).catch($e$$=>{$callback$$($e$$)})},$col$$.ref_module)},$condition$jscomp$6_e$$=>{if($condition$jscomp$6_e$$)return $reject$$({error:$condition$jscomp$6_e$$.error||$condition$jscomp$6_e$$.message||$condition$jscomp$6_e$$});Object.keys($condition_assignwiths$$).length>0&&($condition$jscomp$6_e$$=$appCondition$$.condition_assign||$appCondition$$.condition,
24
- $condition$jscomp$6_e$$.$and||($condition$jscomp$6_e$$.$and=[]),$condition$jscomp$6_e$$.$and.push($condition_assignwiths$$),$appCondition$$.condition=$condition$jscomp$6_e$$);$resolve$$($appCondition$$)})}else $resolve$$($appCondition$$)})}),findHanlder=async($ctrl$$,$req$$,$callback$$)=>{let $model$$=$ctrl$$.model,$shareRoute$$=$req$$.shareRoute,$listinfo_code$$=$req$$?.body?.["listinfo-code"]||$req$$?.query["listinfo-code"]||$req$$?.headers?.["listinfo-code"]||$req$$?.headers?.["Listinfo-Code"];
25
- if(($listinfo_code$$=$listinfo_code$$||$ctrl$$.name)&&$listinfo_code$$!=$ctrl$$.name){var $condition$$=await global.getModel("listinfo").findOne({code:$listinfo_code$$},{api_code:1,code:1}).lean();$condition$$?($condition$$.api_code||$condition$$.code)!=$ctrl$$.name&&($listinfo_code$$=$ctrl$$.name):$listinfo_code$$=$ctrl$$.name}let $appConditions$$;try{$appConditions$$=await buildCondition($ctrl$$,$req$$,$listinfo_code$$,$shareRoute$$);for(let $appCondition$$ of $appConditions$$){await hasRight($ctrl$$,
26
- $req$$,$listinfo_code$$,$appCondition$$.id_app,$shareRoute$$)=="0"&&($appCondition$$.condition._id={$in:[]});await getRightByItem($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$,$shareRoute$$);await getRightByCollectionRef($ctrl$$,$req$$,$appCondition$$,$shareRoute$$);({condition:$condition$$}=$appCondition$$);for(let $key_q$$ in $condition$$)if($key_q$$==="_id"||$key_q$$.startsWith("$")||$key_q$$.includes(".")||_.has($model$$.schema.paths,$key_q$$)||delete $condition$$[$key_q$$],$key_q$$=="$and"){for(let $dk$$ of $condition$$.$and)for(let $key_q$$ in $dk$$)$key_q$$===
12
+ $e$$=>{if($e$$)return $reject$$({error:$e$$.error||$e$$.message||$e$$});if(!$permission$$)return $resolve$$("0");$resolve$$($permission$$)});else{if(!$permission$$)return $resolve$$("0");$resolve$$($permission$$)}},{notNeedRight:$notNeedRight$$,right_code:$listinfo_code$$,user:$req$$.user})})})},handleDynamicCondition=async($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$)=>{let {condition:$condition$$,id_app:$id_app$$}=$appCondition$$,$userInfo$$={...$req$$.user,current_id_app:$id_app$$};!$id_app$$||
13
+ $userInfo$$.current_app_info&&$userInfo$$.current_app_info?._id?.toString()==$id_app$$||($userInfo$$.current_app_info=await global.getModel("app").findOne({_id:$id_app$$}).lean());$appCondition$$.userInfo=$userInfo$$;let $new_condition$$=await new Promise(($resolve$$,$reject$$)=>{$ctrl$$.finding?$ctrl$$.finding($userInfo$$,$condition$$,function($error$$,$condition$$){if($error$$)return $reject$$({error:$error$$.message||$error$$.error||$error$$});$ctrl$$.dynamicFinding?$ctrl$$.dynamicFinding($userInfo$$,
14
+ $condition$$,function($e$$,$condition$$){if($e$$)return Logger.error("dynamicFinding",$e$$),$e$$.error?$reject$$($e$$):$reject$$({error:$e$$.message||$e$$});$resolve$$($condition$$)},{listinfo_code:$listinfo_code$$,req:$req$$}):$resolve$$($condition$$)},{req:$req$$}):$ctrl$$.dynamicFinding?$ctrl$$.dynamicFinding($userInfo$$,$condition$$,function($e$$,$condition$$){if($e$$)return Logger.error("dynamicFinding",$e$$),$e$$.error?$reject$$($e$$):$reject$$({error:$e$$.message||$e$$});$resolve$$($condition$$)},
15
+ {listinfo_code:$listinfo_code$$,req:$req$$}):$resolve$$($condition$$)});$new_condition$$=await getChildren($appCondition$$.id_app,$new_condition$$,NEED_GET_CHILDREN);$appCondition$$.condition=$new_condition$$;return $appCondition$$},buildCondition=async($ctrl$$,$req$$,$listinfo_code$$,$appConditions_shareRoute$$)=>{var $body_ds_id_app$$={};_.isObject($req$$.body)&&($body_ds_id_app$$=$req$$.body);let $query$$={...$req$$.query,...$body_ds_id_app$$};$query$$.tu_ngay&&($query$$.tu_ngay=moment($query$$.tu_ngay).startOf("date").toDate());
16
+ $query$$.den_ngay&&($query$$.den_ngay=moment($query$$.den_ngay).endOf("date").toDate());($body_ds_id_app$$=$query$$.id_apps)&&typeof $body_ds_id_app$$=="string"&&($body_ds_id_app$$=[$body_ds_id_app$$]);let $all_app$$=$query$$.all_app;$req$$.query=$query$$;if($query$$.sort)if(typeof $query$$.sort=="object")var $or_sort$$=$query$$.sort;else try{$or_sort$$=JSONParser($query$$.sort)}catch($e$$){throw Logger.error("error parse json",$e$$,$query$$.sort),`Sort ${$query$$.sort} is not valid`;}!$or_sort$$&&
17
+ $ctrl$$.sort&&($or_sort$$=Object.assign({},$ctrl$$.sort));$req$$.sort=$or_sort$$;$req$$.fetch_by_groups=$query$$.fetch_by_groups;delete $query$$.fetch_by_groups;let $condition$$={};$or_sort$$=[];const $hasCodeByName$$=$k$$=>FIELDS_NEED_CONVERT_CODE[$k$$]&&_.has($ctrl$$.model.schema.paths,FIELDS_NEED_CONVERT_CODE[$k$$].code)&&$ctrl$$.model.modelName!==FIELDS_NEED_CONVERT_CODE[$k$$].model?!0:!1;for(var $key$$ in $query$$)if($key$$!=="id_app"&&$key$$!=="access_token"&&$key$$!=="limit")if($key$$==="_id"&&
18
+ global.mongoose.Types.ObjectId.isValid($query$$._id))try{let $id$$=global.mongoose.Types.ObjectId($query$$._id);$or_sort$$.push({_id:$id$$})}catch($error$$){Logger.error("find condition",$error$$)}else{if($key$$==="q"&&$query$$[$key$$])try{let $q$$=_.isObject($query$$[$key$$])?$query$$[$key$$]:JSONParser($query$$[$key$$]);$req$$.fetch_by_groups=$req$$.fetch_by_groups||$q$$.fetch_by_groups;delete $q$$.fetch_by_groups;$body_ds_id_app$$=$q$$.id_apps||$body_ds_id_app$$;$all_app$$=$q$$.all_app||$all_app$$;
19
+ delete $q$$.all_app;delete $q$$.id_apps;if(Object.keys($q$$).includes("_id"))if(!$q$$._id)delete $q$$._id;else if(typeof $q$$._id!=="object"&&!global.mongoose.Types.ObjectId.isValid($q$$._id))throw Logger.error("Condition is not valid",$q$$),"Condition is not valid";for(let $k_q$$ in $q$$)if(typeof $q$$[$k_q$$]=="string"&&$ctrl$$.model.schema.paths[$k_q$$]?.instance?.toLowerCase()=="date"){let {fromDate:$fromDate$$,toDate:$toDate$$}=getDateRangeByType($q$$[$k_q$$]);$fromDate$$&&$toDate$$&&($q$$[$k_q$$]=
20
+ {$gte:$fromDate$$,$lte:$toDate$$})}($condition$$=$q$$)||($condition$$={});continue}catch($e$$){throw Logger.error("find condition",$e$$,$query$$[$key$$]),"Condition is not valid";}if($key$$!=="fields"&&(_.has($ctrl$$.model.schema.paths,$key$$)||$hasCodeByName$$($key$$)))if($ctrl$$.options.findExact[$key$$])$condition$$[$key$$]=$query$$[$key$$];else{let $item$$={};if($ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()=="number")$item$$[$key$$]=Number($query$$[$key$$]);else if($ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()==
21
+ "date"){let {fromDate:$fromDate$$,toDate:$toDate$$}=getDateRangeByType($query$$[$key$$]);$item$$[$key$$]=$fromDate$$&&$toDate$$?{$gte:$fromDate$$,$lte:$toDate$$}:new Date($query$$[$key$$])}else $ctrl$$.model.schema.paths[$key$$]?.instance?.toLowerCase()=="string"?$item$$[$key$$]={$regex:($query$$[$key$$]||"").trim(),$options:"i"}:$item$$[$key$$]=$query$$[$key$$];$or_sort$$.push($item$$)}else $key$$==="$text"&&$or_sort$$.push({$text:{$search:$query$$[$key$$]}})}$or_sort$$.length!==0&&($query$$.cType===
22
+ "$and"?$condition$$.$and=$or_sort$$:$condition$$.$or=$or_sort$$);$key$$=queryBuilding.convertLegacyQuery(_.cloneDeep($condition$$));$condition$$=queryBuilding.buildSearchQuery($key$$);$appConditions_shareRoute$$||$ctrl$$.require_id_app==0?$appConditions_shareRoute$$=[{id_app:$req$$.user.current_id_app,condition:{id_app:$req$$.user.current_id_app,...$condition$$}}]:($body_ds_id_app$$=($body_ds_id_app$$||[]).filter($id$$=>global.mongoose.Types.ObjectId.isValid($id$$)),$body_ds_id_app$$.length==0&&($all_app$$?
23
+ (Logger.warn("[findHanlder] t\u00ecm t\u1ea5t c\u1ea3 c\u00e1c c\u00f4ng ty c\u00f3 quy\u1ec1n..."),$body_ds_id_app$$=(await global.getModel("participant").find({email:$req$$.user.email},{id_app:1}).lean()).map($a$$=>$a$$.id_app).filter($id_app$$=>isValidObjectId($id_app$$)),$body_ds_id_app$$=(await global.getModel("app").find({_id:{$in:$body_ds_id_app$$}},{_id:1}).lean()).map($a$$=>$a$$._id.toString())):$body_ds_id_app$$=[$req$$.user.current_id_app]),$appConditions_shareRoute$$=$body_ds_id_app$$.map($id_app$$=>
24
+ ({id_app:$id_app$$,condition:{...$condition$$,id_app:$id_app$$}})));return Promise.all($appConditions_shareRoute$$.map($appCondition$$=>handleDynamicCondition($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$)))},getRightByItem=async($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$,$shareRoute$$)=>$shareRoute$$?$appCondition$$:new Promise(($resolve$$,$reject$$)=>{setImmediate(async()=>{let $notNeedRight$$=await $ctrl$$.notNeedRight($req$$.user,{action:"view"});permission.getRightByItem($appCondition$$.id_app,
25
+ $ctrl$$.model,$req$$.user.email,function($e$$,$_condition$$,$admin$$){if($e$$)return Logger.error("[findHandler] [getRightByItem] L\u1ed7i Kh\u00f4ng c\u00f3 quy\u1ec1n:",$e$$),$reject$$({error:$e$$.error||$e$$.message||$e$$,code:$e$$.code||ERRORS.ERR_NOT_PERMIT_CODE});if($appCondition$$.addmin=$admin$$)return $resolve$$($appCondition$$);$appCondition$$.condition||($appCondition$$.condition={});$appCondition$$.condition.$and||($appCondition$$.condition.$and=[]);if($ctrl$$.options.onRightByItem)$ctrl$$.options.onRightByItem($req$$.user,
26
+ $_condition$$,($e$$,$_condition$$)=>{if($e$$)return $reject$$({error:$e$$.error||$e$$.message||$e$$});_.isObject($_condition$$)&&Object.keys($_condition$$).length>0&&$appCondition$$.condition.$and.push($_condition$$);$appCondition$$.condition_assign=$_condition$$;$resolve$$($appCondition$$)});else _.isObject($_condition$$)&&Object.keys($_condition$$).length>0&&$appCondition$$.condition.$and.push($_condition$$),$resolve$$($appCondition$$)},$ctrl$$.name,{notNeedRight:$notNeedRight$$,right_code:$listinfo_code$$})})}),
27
+ getRightByCollectionRef=async($ctrl$$,$req$$,$appCondition$$,$shareRoute$$)=>$shareRoute$$||$appCondition$$.admin||!$appCondition$$.condition_assign||Object.keys($appCondition$$.condition_assign).length===0?$appCondition$$:new Promise(($resolve$$,$reject$$)=>{setImmediate(async()=>{if($ctrl$$.options.assignWiths){let $condition_assignwiths$$={};async.map($ctrl$$.options.assignWiths,($col$$,$callback$$)=>{let $m$$=global.getModel($col$$.ref_collection);permission.getRightByItem($appCondition$$.id_app,
28
+ $m$$,$req$$.user.email,function($e$$,$_condition$$,$admin$$){if($e$$)return $callback$$({e:$e$$.error||$e$$.message||$e$$,code:$e$$.code||ERRORS.ERR_NOT_PERMIT_CODE});if($admin$$)return $callback$$(null);$_condition$$.id_app=$appCondition$$.id_app;$appCondition$$.condition[$col$$.ref_field]&&($_condition$$[$col$$.ref_field]=$appCondition$$.condition[$col$$.ref_field]);$m$$.find($_condition$$,{[$col$$.ref_field]:1}).lean().then($dsdt_rs$$=>{$dsdt_rs$$=$dsdt_rs$$.map($r$$=>$r$$[$col$$.ref_field]);$dsdt_rs$$.push("");
29
+ $dsdt_rs$$.push(null);$condition_assignwiths$$[$col$$.field]={$in:$dsdt_rs$$};$callback$$()}).catch($e$$=>{$callback$$($e$$)})},$col$$.ref_module)},$condition$jscomp$7_e$$=>{if($condition$jscomp$7_e$$)return $reject$$({error:$condition$jscomp$7_e$$.error||$condition$jscomp$7_e$$.message||$condition$jscomp$7_e$$});Object.keys($condition_assignwiths$$).length>0&&($condition$jscomp$7_e$$=$appCondition$$.condition_assign||$appCondition$$.condition,$condition$jscomp$7_e$$.$and||($condition$jscomp$7_e$$.$and=
30
+ []),$condition$jscomp$7_e$$.$and.push($condition_assignwiths$$),$appCondition$$.condition=$condition$jscomp$7_e$$);$resolve$$($appCondition$$)})}else $resolve$$($appCondition$$)})}),findHanlder=async($ctrl$$,$req$$,$callback$$)=>{let $model$$=$ctrl$$.model,$shareRoute$$=$req$$.shareRoute,$listinfo_code$$=$req$$?.body?.["listinfo-code"]||$req$$?.query["listinfo-code"]||$req$$?.headers?.["listinfo-code"]||$req$$?.headers?.["Listinfo-Code"];if(($listinfo_code$$=$listinfo_code$$||$ctrl$$.name)&&$listinfo_code$$!=
31
+ $ctrl$$.name){var $condition$$=await global.getModel("listinfo").findOne({code:$listinfo_code$$},{api_code:1,code:1}).lean();$condition$$?($condition$$.api_code||$condition$$.code)!=$ctrl$$.name&&($listinfo_code$$=$ctrl$$.name):$listinfo_code$$=$ctrl$$.name}let $appConditions$$;try{$appConditions$$=await buildCondition($ctrl$$,$req$$,$listinfo_code$$,$shareRoute$$);for(let $appCondition$$ of $appConditions$$){await hasRight($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$.id_app,$shareRoute$$)=="0"&&
32
+ ($appCondition$$.condition._id={$in:[]});await getRightByItem($ctrl$$,$req$$,$listinfo_code$$,$appCondition$$,$shareRoute$$);await getRightByCollectionRef($ctrl$$,$req$$,$appCondition$$,$shareRoute$$);({condition:$condition$$}=$appCondition$$);for(let $key_q$$ in $condition$$)if($key_q$$==="_id"||$key_q$$.startsWith("$")||$key_q$$.includes(".")||_.has($model$$.schema.paths,$key_q$$)||delete $condition$$[$key_q$$],$key_q$$=="$and"){for(let $dk$$ of $condition$$.$and)for(let $key_q$$ in $dk$$)$key_q$$===
27
33
  "_id"||$key_q$$.startsWith("$")||$key_q$$.includes(".")||_.has($model$$.schema.paths,$key_q$$)||delete $dk$$[$key_q$$];$condition$$.$and=$condition$$.$and.filter($a$$=>Object.keys($a$$).length>0)}$appCondition$$.id_app&&($condition$$=await convertNamesToCodes($appCondition$$.id_app,$condition$$,FIELDS_NEED_CONVERT_CODE,$model$$),$appCondition$$.condition=$condition$$);if($shareRoute$$){$condition$$.shared=!0;let $id_sellers$$=(await global.getModel("app").find({sale_online:!0},{_id:1}).lean()).map($a$$=>
28
34
  $a$$._id);$condition$$.$and||($condition$$.$and=[]);$condition$$.$and.push({id_app:{$in:$id_sellers$$}});$condition$$.id_app&&$condition$$.$and.push({id_app:$condition$$.id_app})}else _.has($model$$.schema.paths,"id_app")&&$ctrl$$.require_id_app!==!1&&($condition$$.id_app=$appCondition$$.id_app);$req$$.user.email==="public"&&_.has($model$$.schema.paths,"session_created")&&($condition$$.session_created=($req$$.cookies||{}).uid);_.extend($condition$$,$ctrl$$.keyValues);utils.deleteEmptyObject($condition$$);
29
35
  delete $condition$$.$where;_.has($model$$.schema.paths,"ma_ct")&&$ctrl$$.options.isVoucher&&($condition$$.ma_ct=$ctrl$$.name.toUpperCase());let $condition_group$$;$req$$.fetch_by_groups&&$req$$.fetch_by_groups.model_group&&$req$$.fetch_by_groups.field&&($condition_group$$=$req$$.fetch_by_groups.condition||{},$condition_group$$.status=!0,$condition_group$$.id_app=$appCondition$$.id_app,$condition$$[$req$$.fetch_by_groups.field]&&($condition_group$$[$req$$.fetch_by_groups.ref_field||$req$$.fetch_by_groups.field]=
@@ -42,7 +48,7 @@ $e$$,$req$$.query),$callback$$({error:$e$$.message||$e$$.error||$e$$})}else _.ha
42
48
  $limit$$?($key$$=(Number($page$$)-1)*$limit$$,$key$$<0&&($key$$=0),$query$$.skip($key$$).limit($limit$$)):$query$$.limit($limit$$);$ctrl$$.populate&&($query$$=$ctrl$$.populate($query$$));$query$$.lean&&($query$$=$query$$.lean());if($req$$.query.explainQuery){$req$$.query.explainQuery!="explainQuery"&&$req$$.query.explainQuery!="executionStats"&&($req$$.query.explainQuery="queryPlanner");try{const $filter$$=$query$$.getFilter(),$projection$$=$query$$.getOptions().projection||{},$skip$$=$query$$.getOptions().skip||
43
49
  0,$limit$$=$query$$.getOptions().limit||0,$sort$$=$query$$.getOptions().sort||{},$explainResult$$=await $query$$.mongooseCollection.find($filter$$,{projection:$projection$$}).skip($skip$$).limit($limit$$).sort($sort$$).explain($req$$.query.explainQuery),{parsedQuery:$parsedQuery$$,winningPlan:$winningPlan$$}=$explainResult$$.queryPlanner||{},{executionSuccess:$executionSuccess$$,nReturned:$nReturned$$,executionTimeMillis:$executionTimeMillis$$,totalKeysExamined:$totalKeysExamined$$,totalDocsExamined:$totalDocsExamined$$}=
44
50
  $explainResult$$.executionStats||{};$callback$$(null,[{queryPlanner:{parsedQuery:$parsedQuery$$,winningPlan:$winningPlan$$},executionStats:{executionSuccess:$executionSuccess$$,nReturned:$nReturned$$,executionTimeMillis:$executionTimeMillis$$,totalKeysExamined:$totalKeysExamined$$,totalDocsExamined:$totalDocsExamined$$},_id:""}])}catch($e$$){$callback$$($e$$)}}else $query$$.lean().then($rs$$=>{$callback$$(null,$rs$$)}).catch($e$$=>{$callback$$($e$$)})})};let $data_log$$=$req$$.query;delete $data_log$$.access_token;
45
- $appConditions$$.forEach($a$jscomp$11_id_app$$=>{({id_app:$a$jscomp$11_id_app$$}=$a$jscomp$11_id_app$$);$req$$.user&&!$data_log$$.count&&$ctrl$$.name!=="log"&&$ctrl$$.name!=="labelinfo"&&$ctrl$$.name!=="listinfo"&&$ctrl$$.name!=="reportinfo"&&$ctrl$$.name!=="moduleinfo"&&$ctrl$$.name!=="options"&&global.getModel("log").create({id_app:$a$jscomp$11_id_app$$,id_func:$ctrl$$.name,action:"QUERY",data:{condition:JSON.stringify($data_log$$)}},$req$$.user.email,$req$$.user_agent,$req$$)});let $page_fetch$$=
51
+ $appConditions$$.forEach($a$jscomp$12_id_app$$=>{({id_app:$a$jscomp$12_id_app$$}=$a$jscomp$12_id_app$$);$req$$.user&&!$data_log$$.count&&$ctrl$$.name!=="log"&&$ctrl$$.name!=="labelinfo"&&$ctrl$$.name!=="listinfo"&&$ctrl$$.name!=="reportinfo"&&$ctrl$$.name!=="moduleinfo"&&$ctrl$$.name!=="options"&&global.getModel("log").create({id_app:$a$jscomp$12_id_app$$,id_func:$ctrl$$.name,action:"QUERY",data:{condition:JSON.stringify($data_log$$)}},$req$$.user.email,$req$$.user_agent,$req$$)});let $page_fetch$$=
46
52
  Number($req$$.query.page||0);isNaN($page_fetch$$)&&($page_fetch$$=0);let $limit$$=$req$$.query.limit;$limit$$&&=Number($limit$$);isNaN($limit$$)&&($limit$$=0);$req$$.query.type_data!=="xlsx"&&$req$$.query.type_data!=="json_file"&&$req$$.query.type_data!=="json_export"&&$req$$.query.rpt!="1"&&($limit$$||=$ctrl$$.require_id_app!==!1&&$ctrl$$.name!=="right"&&$ctrl$$.name!=="labelinfo"?20:500,$limit$$&&$limit$$>500&&!$req$$.query.print&&$ctrl$$.require_id_app!==!1&&$ctrl$$.name!=="right"&&$ctrl$$.name!==
47
53
  "labelinfo"&&($limit$$=500));$req$$.pagination&&($limit$$||=20,$req$$.pagination.page=$page_fetch$$?$page_fetch$$:1,$req$$.pagination.limit=$limit$$,$req$$.pagination.totalPages=Math.ceil($req$$.pagination.total/$req$$.pagination.limit));let $condition_groups$$=[];if($condition_group$$.length>0){let $field_ref$$=$req$$.fetch_by_groups.ref_field||$req$$.fetch_by_groups.field;$fields_fields$jscomp$1_groups_number_notfields_rows_number$$={[$req$$.fetch_by_groups.ref_field||$req$$.fetch_by_groups.field]:1};
48
54
  let $limit_group$$=$req$$.fetch_by_groups.limit_group||10,$page$$=Number($req$$.query.page||0);isNaN($page$$)&&($page$$=0);let $skip$$=0;$page$$>1&&($skip$$=($page$$-1)*$limit_group$$);$skip$$<0&&($skip$$=0);(await global.getModel($req$$.fetch_by_groups.model_group).find($condition_group$$,$fields_fields$jscomp$1_groups_number_notfields_rows_number$$).sort({stt:1,[$req$$.fetch_by_groups.ref_field||$req$$.fetch_by_groups.field]:1}).skip($skip$$).limit($limit_group$$).lean()).forEach($g$$=>{let $c$$=