flexbiz-server 12.6.17 → 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 +32 -209
- package/package.json +1 -1
- package/server/auths/bearer.js +2 -2
- package/server/controllers/createHandler.js +4 -4
- package/server/controllers/deleteHandler.js +1 -1
- package/server/controllers/findHandler.js +28 -22
- package/server/controllers/rptExcelHandler.js +33 -26
- package/server/controllers/updateHandler.js +14 -14
- package/server/libs/docs.js +122 -63
- package/server/libs/permission.js +7 -6
- package/server/models/listinfo.js +12 -14
- package/server/models/log.js +1 -1
- package/server/models/user.js +3 -3
- package/server/modules/lists/ls-checkin.js +2 -1
- package/server/modules/reports/calc-tinhluong.js +12 -12
- package/server/route.js +7 -11
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
|
|
package/package.json
CHANGED
package/server/auths/bearer.js
CHANGED
|
@@ -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$$){
|
|
3
|
-
|
|
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?
|
|
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$$}`);
|
|
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
|
|
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
|
|
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
|
|
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$$)},
|
|
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())
|
|
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
|
|
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"&&
|
|
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$$;
|
|
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$$]=
|
|
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()==
|
|
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===
|
|
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$$?
|
|
18
|
-
|
|
19
|
-
{
|
|
20
|
-
|
|
21
|
-
$
|
|
22
|
-
|
|
23
|
-
$
|
|
24
|
-
$
|
|
25
|
-
|
|
26
|
-
$
|
|
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$
|
|
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$$=
|