flexbiz-server 12.7.1 → 12.7.2

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.
Files changed (884) hide show
  1. package/package.json +5 -5
  2. package/server/app.js +23 -348
  3. package/server/cluster.js +1 -5
  4. package/server/models/account.js +7 -0
  5. package/server/models/actionLog.js +2 -0
  6. package/server/models/afflink.js +2 -0
  7. package/server/models/aimemory.js +1 -0
  8. package/server/models/app.js +16 -0
  9. package/server/models/approve.js +95 -0
  10. package/server/models/assabcihandler.js +35 -0
  11. package/server/models/assbank.js +19 -0
  12. package/server/models/assbooking.js +4 -0
  13. package/server/models/assbuy.js +3 -0
  14. package/server/models/asscashwithdraw.js +4 -0
  15. package/server/models/assfindhash.js +2 -0
  16. package/server/models/assinvestment.js +13 -0
  17. package/server/models/assissue.js +2 -0
  18. package/server/models/asskey.js +15 -0
  19. package/server/models/assneedtobuy.js +6 -0
  20. package/server/models/assperiod.js +7 -0
  21. package/server/models/assproduct.js +13 -0
  22. package/server/models/assprofitsharing.js +4 -0
  23. package/server/models/assreceiver.js +2 -0
  24. package/server/models/assrequest.js +10 -0
  25. package/server/models/asssell.js +7 -0
  26. package/server/models/asstransaction.js +3 -0
  27. package/server/models/asstransfer.js +4 -0
  28. package/server/models/assuser_identity.js +4 -0
  29. package/server/models/asswithdraw.js +4 -0
  30. package/server/models/attend.js +2 -0
  31. package/server/models/banggiaban.js +8 -0
  32. package/server/models/bangtinhluong.js +6 -0
  33. package/server/models/base.js +1 -0
  34. package/server/models/bg1.js +9 -0
  35. package/server/models/bg2.js +10 -0
  36. package/server/models/cache.js +3 -0
  37. package/server/models/cacheDataReport.js +2 -0
  38. package/server/models/cacheSessionReport.js +5 -0
  39. package/server/models/calllog.js +4 -0
  40. package/server/models/cart.js +5 -0
  41. package/server/models/cddiem.js +2 -0
  42. package/server/models/cddt.js +3 -0
  43. package/server/models/cdkh.js +5 -0
  44. package/server/models/cdkhtheongay.js +5 -0
  45. package/server/models/cdnphep.js +2 -0
  46. package/server/models/cdtk.js +3 -0
  47. package/server/models/cdtktheongay.js +3 -0
  48. package/server/models/cdvt.js +5 -0
  49. package/server/models/cdvtnpp.js +6 -0
  50. package/server/models/cdvttheongay.js +5 -0
  51. package/server/models/chamcong.js +7 -0
  52. package/server/models/chat_message.js +2 -0
  53. package/server/models/chat_session.js +2 -0
  54. package/server/models/checkin.js +4 -0
  55. package/server/models/checkinactivity.js +3 -0
  56. package/server/models/checkinkpi.js +4 -0
  57. package/server/models/checkinlocation.js +2 -0
  58. package/server/models/chitietluongds.js +12 -0
  59. package/server/models/chitieukpi.js +3 -0
  60. package/server/models/chudethaoluan.js +3 -0
  61. package/server/models/ckgtluong.js +2 -0
  62. package/server/models/colleague.js +2 -0
  63. package/server/models/comment.js +4 -0
  64. package/server/models/congdoansx.js +4 -0
  65. package/server/models/congtacvien.js +4 -0
  66. package/server/models/congthuctinhgiaban.js +8 -0
  67. package/server/models/consultant.js +4 -0
  68. package/server/models/contract.js +6 -0
  69. package/server/models/counter.js +2 -0
  70. package/server/models/csluongtheods.js +3 -0
  71. package/server/models/csphucap.js +2 -0
  72. package/server/models/ctds.js +5 -0
  73. package/server/models/ctds2.js +7 -0
  74. package/server/models/currency.js +3 -0
  75. package/server/models/custom_report.js +1 -0
  76. package/server/models/customer.js +31 -0
  77. package/server/models/customer_care.js +2 -0
  78. package/server/models/data_list_config.js +7 -0
  79. package/server/models/databanle.js +8 -0
  80. package/server/models/datlich.js +4 -0
  81. package/server/models/deal.js +2 -0
  82. package/server/models/dh2.js +20 -0
  83. package/server/models/diagram.js +2 -0
  84. package/server/models/dinhmucsx.js +8 -0
  85. package/server/models/dkhoc.js +6 -0
  86. package/server/models/dknphep.js +2 -0
  87. package/server/models/dmban.js +4 -0
  88. package/server/models/dmbp.js +12 -0
  89. package/server/models/dmca.js +2 -0
  90. package/server/models/dmchietkhau.js +8 -0
  91. package/server/models/dmchietkhauhd.js +19 -0
  92. package/server/models/dmchinhanh.js +2 -0
  93. package/server/models/dmcpmh.js +2 -0
  94. package/server/models/dmdiemthuong.js +3 -0
  95. package/server/models/dmdoi.js +4 -0
  96. package/server/models/dmdoituongdanhgia.js +2 -0
  97. package/server/models/dmdt.js +8 -0
  98. package/server/models/dmdvt.js +3 -0
  99. package/server/models/dmgiaban.js +9 -0
  100. package/server/models/dmgiamua.js +5 -0
  101. package/server/models/dmgiathitruong.js +5 -0
  102. package/server/models/dmgiathitruong_ngay.js +2 -0
  103. package/server/models/dmgiathitruong_theodoi.js +2 -0
  104. package/server/models/dmhoahonghd.js +8 -0
  105. package/server/models/dmhoahongnpp.js +8 -0
  106. package/server/models/dmkc.js +3 -0
  107. package/server/models/dmkho.js +7 -0
  108. package/server/models/dmkhuyenmai.js +9 -0
  109. package/server/models/dmkhuyenmaihd.js +11 -0
  110. package/server/models/dmletet.js +2 -0
  111. package/server/models/dmlo.js +4 -0
  112. package/server/models/dmloaicong.js +4 -0
  113. package/server/models/dmloaitask.js +2 -0
  114. package/server/models/dmloaits.js +2 -0
  115. package/server/models/dmnckkm.js +4 -0
  116. package/server/models/dmnghiepvu.js +4 -0
  117. package/server/models/dmnguonvon.js +2 -0
  118. package/server/models/dmnhnv.js +4 -0
  119. package/server/models/dmnv.js +17 -0
  120. package/server/models/dmnvt.js +10 -0
  121. package/server/models/dmphi.js +3 -0
  122. package/server/models/dmqct.js +3 -0
  123. package/server/models/dmqddvt.js +3 -0
  124. package/server/models/dmtanggiamts.js +3 -0
  125. package/server/models/dmto.js +4 -0
  126. package/server/models/dmtt.js +6 -0
  127. package/server/models/dmvt.js +17 -0
  128. package/server/models/dmyt.js +4 -0
  129. package/server/models/dn0.js +13 -0
  130. package/server/models/dnm.js +11 -0
  131. package/server/models/dokho.js +2 -0
  132. package/server/models/domain.js +2 -0
  133. package/server/models/dvcs.js +3 -0
  134. package/server/models/ecomcategories.js +3 -0
  135. package/server/models/ecomcategories_cty.js +3 -0
  136. package/server/models/ecomproductlines.js +2 -0
  137. package/server/models/ecompromotion_flashsales.js +2 -0
  138. package/server/models/ecompromotion_freeships.js +2 -0
  139. package/server/models/email.js +2 -0
  140. package/server/models/endpoint.js +1 -0
  141. package/server/models/events.js +3 -0
  142. package/server/models/evoucher.js +5 -0
  143. package/server/models/experiencejourney.js +2 -0
  144. package/server/models/experiencejourneydata.js +4 -0
  145. package/server/models/experiencejourneypersona.js +3 -0
  146. package/server/models/experiencejourneystage.js +2 -0
  147. package/server/models/exportexceltemplate.js +2 -0
  148. package/server/models/fbconversation.js +15 -0
  149. package/server/models/fbmessage.js +2 -0
  150. package/server/models/fbpage.js +2 -0
  151. package/server/models/fbpost.js +2 -0
  152. package/server/models/fieldright.js +2 -0
  153. package/server/models/fifo_dk.js +2 -0
  154. package/server/models/fifo_lot.js +3 -0
  155. package/server/models/fifo_trace.js +4 -0
  156. package/server/models/file.js +4 -0
  157. package/server/models/filechunk.js +2 -0
  158. package/server/models/financialroadmap.js +3 -0
  159. package/server/models/flow.js +2 -0
  160. package/server/models/flowdata.js +3 -0
  161. package/server/models/flowpending.js +2 -0
  162. package/server/models/folder.js +4 -0
  163. package/server/models/follow.js +2 -0
  164. package/server/models/forminfo.js +5 -0
  165. package/server/models/giaoca.js +4 -0
  166. package/server/models/giatb.js +3 -0
  167. package/server/models/group.js +9 -0
  168. package/server/models/gt_ctgt.js +4 -0
  169. package/server/models/gt_hspb.js +3 -0
  170. package/server/models/gt_sltk.js +3 -0
  171. package/server/models/gt_thcppstk.js +3 -0
  172. package/server/models/hanmucton.js +4 -0
  173. package/server/models/hd1.js +11 -0
  174. package/server/models/hd2.js +26 -0
  175. package/server/models/hd3.js +17 -0
  176. package/server/models/hd4.js +13 -0
  177. package/server/models/hd7.js +17 -0
  178. package/server/models/hd8.js +12 -0
  179. package/server/models/hde.js +11 -0
  180. package/server/models/hmcn.js +3 -0
  181. package/server/models/hmcnct.js +2 -0
  182. package/server/models/hspbts.js +4 -0
  183. package/server/models/htl.js +13 -0
  184. package/server/models/importexceltemplate.js +2 -0
  185. package/server/models/introducebonus.js +4 -0
  186. package/server/models/introducecode.js +3 -0
  187. package/server/models/introducer.js +4 -0
  188. package/server/models/kbbtpb.js +7 -0
  189. package/server/models/kbmPttct.js +4 -0
  190. package/server/models/kbmTkgtgt.js +5 -0
  191. package/server/models/kbm_bcdkt_old.js +4 -0
  192. package/server/models/kbm_kqhdkd_old.js +3 -0
  193. package/server/models/kbm_lcttgt_old.js +5 -0
  194. package/server/models/kbm_lctttt_old.js +4 -0
  195. package/server/models/kbm_pttct_old.js +4 -0
  196. package/server/models/kbm_tkgtgt_old.js +5 -0
  197. package/server/models/kbmbcdkt.js +4 -0
  198. package/server/models/kbmbcqt.js +4 -0
  199. package/server/models/kbmkqhdkd.js +3 -0
  200. package/server/models/kbmlcttgt.js +6 -0
  201. package/server/models/kbmlctttt.js +4 -0
  202. package/server/models/kbmtmbctc.js +4 -0
  203. package/server/models/kehoachdtcp.js +3 -0
  204. package/server/models/kehoachmh.js +8 -0
  205. package/server/models/keyresult.js +7 -0
  206. package/server/models/khunghangthanhvien.js +3 -0
  207. package/server/models/label.js +2 -0
  208. package/server/models/labelinfo.js +2 -0
  209. package/server/models/lenhcapphat.js +8 -0
  210. package/server/models/lenhsx.js +8 -0
  211. package/server/models/lienhe.js +4 -0
  212. package/server/models/like_module.js +2 -0
  213. package/server/models/link.js +2 -0
  214. package/server/models/listinfo.js +1365 -0
  215. package/server/models/loaidiem.js +2 -0
  216. package/server/models/lock.js +2 -0
  217. package/server/models/log.js +8 -0
  218. package/server/models/mailaccount.js +3 -0
  219. package/server/models/mailgroup.js +3 -0
  220. package/server/models/mailreceived.js +2 -0
  221. package/server/models/mailsent.js +2 -0
  222. package/server/models/mailtemplate.js +2 -0
  223. package/server/models/maudanhgia.js +2 -0
  224. package/server/models/menuinfo.js +2 -0
  225. package/server/models/message.js +8 -0
  226. package/server/models/message2.js +4 -0
  227. package/server/models/message2setting.js +3 -0
  228. package/server/models/moduleinfo.js +4 -0
  229. package/server/models/momo.js +18 -0
  230. package/server/models/news.js +3 -0
  231. package/server/models/newsfeed.js +4 -0
  232. package/server/models/note.js +2 -0
  233. package/server/models/notification.js +8 -0
  234. package/server/models/okr.js +4 -0
  235. package/server/models/okrdiagram.js +3 -0
  236. package/server/models/onepay.js +24 -0
  237. package/server/models/opportunity.js +4 -0
  238. package/server/models/options.js +2 -0
  239. package/server/models/originimportid.js +1 -0
  240. package/server/models/otp.js +1 -0
  241. package/server/models/parameter.js +2 -0
  242. package/server/models/participant.js +21 -0
  243. package/server/models/partner.js +1 -0
  244. package/server/models/payload.js +1 -0
  245. package/server/models/pbl.js +16 -0
  246. package/server/models/pc0.js +13 -0
  247. package/server/models/pc1.js +14 -0
  248. package/server/models/pc2.js +13 -0
  249. package/server/models/pc3.js +13 -0
  250. package/server/models/pc5.js +8 -0
  251. package/server/models/pc6.js +14 -0
  252. package/server/models/pcl.js +6 -0
  253. package/server/models/pdn.js +9 -0
  254. package/server/models/pdx.js +9 -0
  255. package/server/models/pgh.js +5 -0
  256. package/server/models/phieudanhgia.js +3 -0
  257. package/server/models/pht.js +8 -0
  258. package/server/models/phucap.js +4 -0
  259. package/server/models/pkc.js +6 -0
  260. package/server/models/pkh.js +6 -0
  261. package/server/models/pkk.js +10 -0
  262. package/server/models/pkt.js +12 -0
  263. package/server/models/pn1.js +18 -0
  264. package/server/models/pn2.js +12 -0
  265. package/server/models/pn3.js +13 -0
  266. package/server/models/pn5.js +14 -0
  267. package/server/models/pn6.js +14 -0
  268. package/server/models/pn9.js +17 -0
  269. package/server/models/pnc.js +9 -0
  270. package/server/models/pnh.js +11 -0
  271. package/server/models/pnk.js +10 -0
  272. package/server/models/po1.js +19 -0
  273. package/server/models/ppb.js +6 -0
  274. package/server/models/productcode.js +2 -0
  275. package/server/models/profile.js +4 -0
  276. package/server/models/pt1.js +12 -0
  277. package/server/models/pt5.js +8 -0
  278. package/server/models/ptl.js +5 -0
  279. package/server/models/ptthanhtoan.js +6 -0
  280. package/server/models/purchase_contract.js +17 -0
  281. package/server/models/pxc.js +9 -0
  282. package/server/models/pxh.js +11 -0
  283. package/server/models/pxk.js +9 -0
  284. package/server/models/qts.js +14 -0
  285. package/server/models/qts_dieuchinh.js +3 -0
  286. package/server/models/qts_dieuchuyen.js +4 -0
  287. package/server/models/quanhuyen.js +2 -0
  288. package/server/models/reason.js +2 -0
  289. package/server/models/receivedinvoice.js +2 -0
  290. package/server/models/reportinfo.js +5 -0
  291. package/server/models/right.js +4 -0
  292. package/server/models/rpt.js +2 -0
  293. package/server/models/rptform.js +3 -0
  294. package/server/models/rptobject.js +2 -0
  295. package/server/models/sale_contract.js +9 -0
  296. package/server/models/schedule.js +18 -0
  297. package/server/models/schedule_log.js +2 -0
  298. package/server/models/shipbook.js +12 -0
  299. package/server/models/shortcut.js +2 -0
  300. package/server/models/smsaccount.js +10 -0
  301. package/server/models/smssend.js +2 -0
  302. package/server/models/so1.js +22 -0
  303. package/server/models/so5.js +15 -0
  304. package/server/models/so9.js +19 -0
  305. package/server/models/socai.js +28 -0
  306. package/server/models/socainpp.js +18 -0
  307. package/server/models/socaitc.js +6 -0
  308. package/server/models/socaitmp.js +16 -0
  309. package/server/models/socaitt.js +4 -0
  310. package/server/models/sodiemthuong.js +4 -0
  311. package/server/models/sokho.js +27 -0
  312. package/server/models/sokhocapphat.js +18 -0
  313. package/server/models/sokhokhongton.js +19 -0
  314. package/server/models/sokhonpp.js +19 -0
  315. package/server/models/sokhotc.js +8 -0
  316. package/server/models/sokhott.js +18 -0
  317. package/server/models/sophanbokh.js +3 -0
  318. package/server/models/sosanxuat.js +5 -0
  319. package/server/models/sotinhkh.js +2 -0
  320. package/server/models/spdd_ck.js +3 -0
  321. package/server/models/spdd_dk.js +3 -0
  322. package/server/models/step.js +2 -0
  323. package/server/models/strategicdiagram.js +3 -0
  324. package/server/models/strategicgoal.js +4 -0
  325. package/server/models/strategickpi.js +6 -0
  326. package/server/models/strategicobjective.js +5 -0
  327. package/server/models/strategicplan.js +5 -0
  328. package/server/models/subscribe.js +2 -0
  329. package/server/models/support.js +2 -0
  330. package/server/models/synctime.js +2 -0
  331. package/server/models/sys_job_queue_book_keeping.js +2 -0
  332. package/server/models/sysconfig.js +2 -0
  333. package/server/models/sysgroup.js +2 -0
  334. package/server/models/tableinfo.js +3 -0
  335. package/server/models/task.js +9 -0
  336. package/server/models/tc.js +2 -0
  337. package/server/models/tdttco.js +9 -0
  338. package/server/models/tdttco_tt.js +5 -0
  339. package/server/models/tdttno.js +9 -0
  340. package/server/models/tdttno_tt.js +5 -0
  341. package/server/models/templaterpt.js +2 -0
  342. package/server/models/templatestore.js +3 -0
  343. package/server/models/templatevoucher.js +3 -0
  344. package/server/models/tinhthanh.js +2 -0
  345. package/server/models/tokens.js +3 -0
  346. package/server/models/tontucthoi.js +9 -0
  347. package/server/models/trangthai.js +4 -0
  348. package/server/models/trangthaiapp.js +4 -0
  349. package/server/models/transaction.js +16 -0
  350. package/server/models/trialinfo.js +2 -0
  351. package/server/models/user.js +40 -0
  352. package/server/models/usergroup.js +7 -0
  353. package/server/models/vanchuyen.js +12 -0
  354. package/server/models/vat.js +3 -0
  355. package/server/models/vatra.js +6 -0
  356. package/server/models/vatvao.js +6 -0
  357. package/server/models/versioninfo.js +2 -0
  358. package/server/models/vietqrbanks.js +2 -0
  359. package/server/models/vsocai.js +6 -0
  360. package/server/models/wallet.js +8 -0
  361. package/server/models/warranty.js +3 -0
  362. package/server/models/warrantyclaim.js +2 -0
  363. package/server/models/warrantypolicy.js +1 -0
  364. package/server/models/workflow.js +4 -0
  365. package/server/models/xaphuong.js +2 -0
  366. package/server/models/xhd.js +10 -0
  367. package/server/models/ytdd_ck.js +4 -0
  368. package/server/models/ytdd_dk.js +4 -0
  369. package/server/models/zalo.js +17 -0
  370. package/server/modules/lists/bg-cddiem.js +6 -0
  371. package/server/modules/lists/bg-cddt.js +7 -0
  372. package/server/modules/lists/bg-cdkh.js +11 -0
  373. package/server/modules/lists/bg-cdnphep.js +6 -0
  374. package/server/modules/lists/bg-cdtk.js +9 -0
  375. package/server/modules/lists/bg-cdvt.js +8 -0
  376. package/server/modules/lists/bg-cdvtnpp.js +8 -0
  377. package/server/modules/lists/bg-fifo_dk.js +8 -0
  378. package/server/modules/lists/ls-account.js +4 -0
  379. package/server/modules/lists/ls-afflink.js +3 -0
  380. package/server/modules/lists/ls-approve.js +5 -0
  381. package/server/modules/lists/ls-assabcihandler.js +3 -0
  382. package/server/modules/lists/ls-assbank.js +3 -0
  383. package/server/modules/lists/ls-assbooking.js +20 -0
  384. package/server/modules/lists/ls-assbuy.js +8 -0
  385. package/server/modules/lists/ls-asscashwithdraw.js +8 -0
  386. package/server/modules/lists/ls-assinvestment.js +31 -0
  387. package/server/modules/lists/ls-assissue.js +3 -0
  388. package/server/modules/lists/ls-asskey.js +41 -0
  389. package/server/modules/lists/ls-assneedtobuy.js +10 -0
  390. package/server/modules/lists/ls-assperiod.js +19 -0
  391. package/server/modules/lists/ls-assproduct.js +9 -0
  392. package/server/modules/lists/ls-assprofitsharing.js +8 -0
  393. package/server/modules/lists/ls-assreceiver.js +3 -0
  394. package/server/modules/lists/ls-assrequest.js +4 -0
  395. package/server/modules/lists/ls-asssell.js +13 -0
  396. package/server/modules/lists/ls-asstransaction.js +3 -0
  397. package/server/modules/lists/ls-asstransfer.js +3 -0
  398. package/server/modules/lists/ls-assuser_identity.js +1 -0
  399. package/server/modules/lists/ls-asswithdraw.js +12 -0
  400. package/server/modules/lists/ls-bangtinhluong.js +2 -0
  401. package/server/modules/lists/ls-calllog.js +4 -0
  402. package/server/modules/lists/ls-cart.js +14 -0
  403. package/server/modules/lists/ls-chamcong.js +3 -0
  404. package/server/modules/lists/ls-chat_session.js +5 -0
  405. package/server/modules/lists/ls-checkin.js +24 -0
  406. package/server/modules/lists/ls-checkinactivity.js +8 -0
  407. package/server/modules/lists/ls-checkinkpi.js +3 -0
  408. package/server/modules/lists/ls-checkinlocation.js +1 -0
  409. package/server/modules/lists/ls-chitietluongds.js +4 -0
  410. package/server/modules/lists/ls-chitieukpi.js +1 -0
  411. package/server/modules/lists/ls-chudethaoluan.js +1 -0
  412. package/server/modules/lists/ls-ckgtluong.js +1 -0
  413. package/server/modules/lists/ls-comment.js +9 -0
  414. package/server/modules/lists/ls-congdoansx.js +3 -0
  415. package/server/modules/lists/ls-congtacvien.js +5 -0
  416. package/server/modules/lists/ls-consultant.js +2 -0
  417. package/server/modules/lists/ls-contract.js +7 -0
  418. package/server/modules/lists/ls-csluongtheods.js +1 -0
  419. package/server/modules/lists/ls-csphucap.js +1 -0
  420. package/server/modules/lists/ls-ctds.js +4 -0
  421. package/server/modules/lists/ls-ctds2.js +4 -0
  422. package/server/modules/lists/ls-currency.js +1 -0
  423. package/server/modules/lists/ls-customer.js +22 -0
  424. package/server/modules/lists/ls-customer_care.js +1 -0
  425. package/server/modules/lists/ls-datlich.js +9 -0
  426. package/server/modules/lists/ls-dckhauhaots.js +3 -0
  427. package/server/modules/lists/ls-deal.js +3 -0
  428. package/server/modules/lists/ls-diagram.js +1 -0
  429. package/server/modules/lists/ls-dkhoc.js +6 -0
  430. package/server/modules/lists/ls-dknphep.js +1 -0
  431. package/server/modules/lists/ls-dmban.js +4 -0
  432. package/server/modules/lists/ls-dmbp.js +7 -0
  433. package/server/modules/lists/ls-dmca.js +1 -0
  434. package/server/modules/lists/ls-dmchietkhau.js +19 -0
  435. package/server/modules/lists/ls-dmchietkhauhd.js +4 -0
  436. package/server/modules/lists/ls-dmchinhanh.js +1 -0
  437. package/server/modules/lists/ls-dmchucvu.js +2 -0
  438. package/server/modules/lists/ls-dmcpmh.js +1 -0
  439. package/server/modules/lists/ls-dmdiemthuong.js +4 -0
  440. package/server/modules/lists/ls-dmdoi.js +4 -0
  441. package/server/modules/lists/ls-dmdoituongdanhgia.js +1 -0
  442. package/server/modules/lists/ls-dmdt.js +11 -0
  443. package/server/modules/lists/ls-dmdvt.js +2 -0
  444. package/server/modules/lists/ls-dmgiaban.js +4 -0
  445. package/server/modules/lists/ls-dmgiamua.js +4 -0
  446. package/server/modules/lists/ls-dmgiathitruong.js +15 -0
  447. package/server/modules/lists/ls-dmgiathitruong_ngay.js +2 -0
  448. package/server/modules/lists/ls-dmgiathitruong_theodoi.js +1 -0
  449. package/server/modules/lists/ls-dmhoahonghd.js +1 -0
  450. package/server/modules/lists/ls-dmhoahongnpp.js +1 -0
  451. package/server/modules/lists/ls-dmkc.js +3 -0
  452. package/server/modules/lists/ls-dmkho.js +7 -0
  453. package/server/modules/lists/ls-dmkhuyenmai.js +5 -0
  454. package/server/modules/lists/ls-dmkhuyenmaihd.js +3 -0
  455. package/server/modules/lists/ls-dmletet.js +1 -0
  456. package/server/modules/lists/ls-dmlo.js +1 -0
  457. package/server/modules/lists/ls-dmloaicong.js +1 -0
  458. package/server/modules/lists/ls-dmloaits.js +1 -0
  459. package/server/modules/lists/ls-dmnckkm.js +7 -0
  460. package/server/modules/lists/ls-dmnghiepvu.js +1 -0
  461. package/server/modules/lists/ls-dmnguonvon.js +1 -0
  462. package/server/modules/lists/ls-dmnhnv.js +6 -0
  463. package/server/modules/lists/ls-dmnhtask.js +5 -0
  464. package/server/modules/lists/ls-dmnkh.js +6 -0
  465. package/server/modules/lists/ls-dmntt.js +6 -0
  466. package/server/modules/lists/ls-dmnv.js +14 -0
  467. package/server/modules/lists/ls-dmnvt.js +7 -0
  468. package/server/modules/lists/ls-dmphi.js +6 -0
  469. package/server/modules/lists/ls-dmqct.js +2 -0
  470. package/server/modules/lists/ls-dmqddvt.js +3 -0
  471. package/server/modules/lists/ls-dmtanggiamts.js +1 -0
  472. package/server/modules/lists/ls-dmto.js +5 -0
  473. package/server/modules/lists/ls-dmtt.js +7 -0
  474. package/server/modules/lists/ls-dmvt.js +52 -0
  475. package/server/modules/lists/ls-dmyt.js +1 -0
  476. package/server/modules/lists/ls-dokho.js +1 -0
  477. package/server/modules/lists/ls-dvcs.js +1 -0
  478. package/server/modules/lists/ls-ecomcategories.js +5 -0
  479. package/server/modules/lists/ls-ecomcategories_cty.js +5 -0
  480. package/server/modules/lists/ls-email.js +4 -0
  481. package/server/modules/lists/ls-events.js +3 -0
  482. package/server/modules/lists/ls-evoucher.js +3 -0
  483. package/server/modules/lists/ls-experiencejourney.js +1 -0
  484. package/server/modules/lists/ls-experiencejourneydata.js +3 -0
  485. package/server/modules/lists/ls-experiencejourneypersona.js +4 -0
  486. package/server/modules/lists/ls-experiencejourneystage.js +1 -0
  487. package/server/modules/lists/ls-fbconversation.js +2 -0
  488. package/server/modules/lists/ls-fbmessage.js +2 -0
  489. package/server/modules/lists/ls-fbpage.js +11 -0
  490. package/server/modules/lists/ls-fbpost.js +2 -0
  491. package/server/modules/lists/ls-file.js +38 -0
  492. package/server/modules/lists/ls-financialroadmap.js +3 -0
  493. package/server/modules/lists/ls-flow.js +6 -0
  494. package/server/modules/lists/ls-flowdata.js +1 -0
  495. package/server/modules/lists/ls-flowpending.js +3 -0
  496. package/server/modules/lists/ls-folder.js +1 -0
  497. package/server/modules/lists/ls-forminfo.js +1 -0
  498. package/server/modules/lists/ls-giaoca.js +5 -0
  499. package/server/modules/lists/ls-group.js +5 -0
  500. package/server/modules/lists/ls-hmcn.js +2 -0
  501. package/server/modules/lists/ls-hspbts.js +3 -0
  502. package/server/modules/lists/ls-introducebonus.js +4 -0
  503. package/server/modules/lists/ls-introducecode.js +10 -0
  504. package/server/modules/lists/ls-introducer.js +21 -0
  505. package/server/modules/lists/ls-kbm-bcdkt.js +1 -0
  506. package/server/modules/lists/ls-kbm-bcqt.js +5 -0
  507. package/server/modules/lists/ls-kbm-kqhdkd.js +1 -0
  508. package/server/modules/lists/ls-kbm-lcttgt.js +1 -0
  509. package/server/modules/lists/ls-kbm-lctttt.js +1 -0
  510. package/server/modules/lists/ls-kbm-pttct.js +3 -0
  511. package/server/modules/lists/ls-kbm-tkgtgt.js +3 -0
  512. package/server/modules/lists/ls-kbm-tmbctc.js +3 -0
  513. package/server/modules/lists/ls-kehoachdtcp.js +4 -0
  514. package/server/modules/lists/ls-keyresult.js +7 -0
  515. package/server/modules/lists/ls-khunghangthanhvien.js +1 -0
  516. package/server/modules/lists/ls-label.js +1 -0
  517. package/server/modules/lists/ls-lienhe.js +4 -0
  518. package/server/modules/lists/ls-like-module.js +1 -0
  519. package/server/modules/lists/ls-link.js +1 -0
  520. package/server/modules/lists/ls-loaidiem.js +1 -0
  521. package/server/modules/lists/ls-lock.js +1 -0
  522. package/server/modules/lists/ls-log.js +3 -0
  523. package/server/modules/lists/ls-mailaccount.js +5 -0
  524. package/server/modules/lists/ls-mailreceived.js +5 -0
  525. package/server/modules/lists/ls-mailsent.js +4 -0
  526. package/server/modules/lists/ls-mailtemplate.js +4 -0
  527. package/server/modules/lists/ls-maudanhgia.js +3 -0
  528. package/server/modules/lists/ls-message2.js +8 -0
  529. package/server/modules/lists/ls-message2setting.js +5 -0
  530. package/server/modules/lists/ls-news.js +7 -0
  531. package/server/modules/lists/ls-newsfeed.js +4 -0
  532. package/server/modules/lists/ls-note.js +6 -0
  533. package/server/modules/lists/ls-okr.js +5 -0
  534. package/server/modules/lists/ls-okrdiagram.js +1 -0
  535. package/server/modules/lists/ls-opportunity.js +5 -0
  536. package/server/modules/lists/ls-options.js +4 -0
  537. package/server/modules/lists/ls-parameter.js +3 -0
  538. package/server/modules/lists/ls-participant.js +12 -0
  539. package/server/modules/lists/ls-phieudanhgia.js +7 -0
  540. package/server/modules/lists/ls-phucap.js +2 -0
  541. package/server/modules/lists/ls-productcode.js +9 -0
  542. package/server/modules/lists/ls-profile.js +1 -0
  543. package/server/modules/lists/ls-ptthanhtoan.js +3 -0
  544. package/server/modules/lists/ls-qts-dieuchinh.js +2 -0
  545. package/server/modules/lists/ls-qts-dieuchuyen.js +8 -0
  546. package/server/modules/lists/ls-reason.js +1 -0
  547. package/server/modules/lists/ls-rpt.js +5 -0
  548. package/server/modules/lists/ls-rptform.js +3 -0
  549. package/server/modules/lists/ls-shortcut.js +1 -0
  550. package/server/modules/lists/ls-smsaccount.js +1 -0
  551. package/server/modules/lists/ls-smssend.js +3 -0
  552. package/server/modules/lists/ls-sosanxuat.js +4 -0
  553. package/server/modules/lists/ls-step.js +1 -0
  554. package/server/modules/lists/ls-strategicdiagram.js +1 -0
  555. package/server/modules/lists/ls-strategicgoal.js +3 -0
  556. package/server/modules/lists/ls-strategickpi.js +7 -0
  557. package/server/modules/lists/ls-strategicobjective.js +3 -0
  558. package/server/modules/lists/ls-strategicplan.js +6 -0
  559. package/server/modules/lists/ls-support.js +3 -0
  560. package/server/modules/lists/ls-task.js +28 -0
  561. package/server/modules/lists/ls-tc.js +1 -0
  562. package/server/modules/lists/ls-templaterpt.js +5 -0
  563. package/server/modules/lists/ls-templatevoucher.js +1 -0
  564. package/server/modules/lists/ls-tontucthoi.js +3 -0
  565. package/server/modules/lists/ls-trangthaiapp.js +3 -0
  566. package/server/modules/lists/ls-transaction.js +4 -0
  567. package/server/modules/lists/ls-usergroup.js +7 -0
  568. package/server/modules/lists/ls-vat.js +1 -0
  569. package/server/modules/lists/ls-vatra.js +5 -0
  570. package/server/modules/lists/ls-vatvao.js +6 -0
  571. package/server/modules/lists/ls-warranty.js +3 -0
  572. package/server/modules/lists/ls-workflow.js +1 -0
  573. package/server/modules/lists/ls_hanmucton.js +3 -0
  574. package/server/modules/lists/ls_hspb.js +4 -0
  575. package/server/modules/lists/ls_spdd_ck.js +3 -0
  576. package/server/modules/lists/ls_spdd_dk.js +3 -0
  577. package/server/modules/lists/ls_ytdd_ck.js +4 -0
  578. package/server/modules/lists/ls_ytdd_dk.js +4 -0
  579. package/server/modules/lists/sys-attend.js +4 -0
  580. package/server/modules/lists/sys-follow.js +4 -0
  581. package/server/modules/lists/sys-right.js +2 -0
  582. package/server/modules/public/app.js +4 -0
  583. package/server/modules/public/approve.js +37 -0
  584. package/server/modules/public/callin.js +7 -0
  585. package/server/modules/public/comment.js +5 -0
  586. package/server/modules/public/dmnvt.js +4 -0
  587. package/server/modules/public/dmvt.js +9 -0
  588. package/server/modules/public/file.js +11 -0
  589. package/server/modules/public/forminfo.js +1 -0
  590. package/server/modules/public/group.js +4 -0
  591. package/server/modules/public/introducecode.js +1 -0
  592. package/server/modules/public/listinfo.js +1 -0
  593. package/server/modules/public/media-webhook.js +1 -0
  594. package/server/modules/public/partner.js +1 -0
  595. package/server/modules/public/paymentCallback.js +32 -0
  596. package/server/modules/public/province.js +1 -0
  597. package/server/modules/public/ptthanhtoan.js +4 -0
  598. package/server/modules/public/subscribe.js +30 -0
  599. package/server/modules/public/support.js +3 -0
  600. package/server/modules/public/tableinfo.js +1 -0
  601. package/server/modules/public/trialinfo.js +4 -0
  602. package/server/modules/public/versioninfo.js +1 -0
  603. package/server/modules/reports/calc-tinhgiafifo.js +8 -0
  604. package/server/modules/reports/calc-tinhgiatb.js +7 -0
  605. package/server/modules/reports/calc-tinhgiathanh.js +7 -0
  606. package/server/modules/reports/calc-tinhkhauhaots.js +3 -0
  607. package/server/modules/reports/calc-tinhluong.js +68 -0
  608. package/server/modules/reports/rp-analyzedata.js +6 -0
  609. package/server/modules/reports/rp-assbonus.js +4 -0
  610. package/server/modules/reports/rp-assinterest.js +8 -0
  611. package/server/modules/reports/rp-assproductowners.js +3 -0
  612. package/server/modules/reports/rp-asssupply.js +1 -0
  613. package/server/modules/reports/rp-asstransferlog.js +10 -0
  614. package/server/modules/reports/rp-backup.js +4 -0
  615. package/server/modules/reports/rp-banggiatb.js +3 -0
  616. package/server/modules/reports/rp-bangtinhkhauhao.js +6 -0
  617. package/server/modules/reports/rp-baoCaoFifoKy.js +1 -0
  618. package/server/modules/reports/rp-baocaokhachhang.js +6 -0
  619. package/server/modules/reports/rp-bcdkt.js +11 -0
  620. package/server/modules/reports/rp-bcintroducebonus.js +4 -0
  621. package/server/modules/reports/rp-bckhtiemnang.js +3 -0
  622. package/server/modules/reports/rp-bcqt.js +85 -0
  623. package/server/modules/reports/rp-bkchamcong.js +5 -0
  624. package/server/modules/reports/rp-bkct.js +13 -0
  625. package/server/modules/reports/rp-bkshipbook.js +8 -0
  626. package/server/modules/reports/rp-bkvanchuyen.js +8 -0
  627. package/server/modules/reports/rp-bkvatra.js +7 -0
  628. package/server/modules/reports/rp-bkvatvao.js +7 -0
  629. package/server/modules/reports/rp-capnhatsocaitc.js +4 -0
  630. package/server/modules/reports/rp-cdpsdiem.js +4 -0
  631. package/server/modules/reports/rp-cdpsdt.js +5 -0
  632. package/server/modules/reports/rp-cdpskh.js +8 -0
  633. package/server/modules/reports/rp-cdpsnphep.js +3 -0
  634. package/server/modules/reports/rp-cdpstk.js +4 -0
  635. package/server/modules/reports/rp-chitietchitientheohoadon.js +12 -0
  636. package/server/modules/reports/rp-chitiettaisan.js +13 -0
  637. package/server/modules/reports/rp-chitietthutientheohoadon.js +13 -0
  638. package/server/modules/reports/rp-ckcn.js +3 -0
  639. package/server/modules/reports/rp-ckdiem.js +2 -0
  640. package/server/modules/reports/rp-cktk.js +3 -0
  641. package/server/modules/reports/rp-ckvt.js +10 -0
  642. package/server/modules/reports/rp-ckvttheokho.js +4 -0
  643. package/server/modules/reports/rp-ckvttheotg.js +4 -0
  644. package/server/modules/reports/rp-ckvttt.js +3 -0
  645. package/server/modules/reports/rp-congnophaithutheotuoino.js +3 -0
  646. package/server/modules/reports/rp-congnophaitratheotuoino.js +3 -0
  647. package/server/modules/reports/rp-congnosapthu.js +4 -0
  648. package/server/modules/reports/rp-congnosaptra.js +4 -0
  649. package/server/modules/reports/rp-congviectheobp.js +9 -0
  650. package/server/modules/reports/rp-congviectheodt.js +8 -0
  651. package/server/modules/reports/rp-congviectheokh.js +8 -0
  652. package/server/modules/reports/rp-congviectheonv.js +9 -0
  653. package/server/modules/reports/rp-congviectheotimeline.js +6 -0
  654. package/server/modules/reports/rp-ctbanle.js +15 -0
  655. package/server/modules/reports/rp-ctbanle2.js +20 -0
  656. package/server/modules/reports/rp-ctbanlectv.js +20 -0
  657. package/server/modules/reports/rp-ctbanlenpp.js +24 -0
  658. package/server/modules/reports/rp-ctdanhgianhanvien.js +8 -0
  659. package/server/modules/reports/rp-cthangbanbitralai.js +4 -0
  660. package/server/modules/reports/rp-ctmuahang.js +7 -0
  661. package/server/modules/reports/rp-cttralaihang.js +4 -0
  662. package/server/modules/reports/rp-databanle.js +10 -0
  663. package/server/modules/reports/rp-diemthuong.js +2 -0
  664. package/server/modules/reports/rp-dkcn.js +3 -0
  665. package/server/modules/reports/rp-dktk.js +2 -0
  666. package/server/modules/reports/rp-dsnhanviencm.js +9 -0
  667. package/server/modules/reports/rp-dsnhanvientb.js +9 -0
  668. package/server/modules/reports/rp-dtbanlekempk.js +12 -0
  669. package/server/modules/reports/rp-dtbanletheoct.js +22 -0
  670. package/server/modules/reports/rp-dtbanletheoctkempk.js +25 -0
  671. package/server/modules/reports/rp-dtbanletheokh.js +17 -0
  672. package/server/modules/reports/rp-dtbanletheokhnpp.js +19 -0
  673. package/server/modules/reports/rp-dtbanletheokho.js +15 -0
  674. package/server/modules/reports/rp-dtbanletheonam.js +3 -0
  675. package/server/modules/reports/rp-dtbanletheongay.js +1 -0
  676. package/server/modules/reports/rp-dtbanletheonpp.js +23 -0
  677. package/server/modules/reports/rp-dtbanletheonv.js +19 -0
  678. package/server/modules/reports/rp-dtbanletheoquy.js +3 -0
  679. package/server/modules/reports/rp-dtbanletheosp.js +9 -0
  680. package/server/modules/reports/rp-dtbanletheospnpp.js +6 -0
  681. package/server/modules/reports/rp-dtbanletheothang.js +3 -0
  682. package/server/modules/reports/rp-dtbanletheothungan.js +12 -0
  683. package/server/modules/reports/rp-dtbanletheovt.js +2 -0
  684. package/server/modules/reports/rp-dtbanletheovtnpp.js +2 -0
  685. package/server/modules/reports/rp-dutoanthuchitheodt.js +4 -0
  686. package/server/modules/reports/rp-getPXC2PNC.js +8 -0
  687. package/server/modules/reports/rp-getariseofaccountsbymonth.js +4 -0
  688. package/server/modules/reports/rp-getbtpb.js +6 -0
  689. package/server/modules/reports/rp-getcashbycashier.js +7 -0
  690. package/server/modules/reports/rp-getcschietkhau.js +5 -0
  691. package/server/modules/reports/rp-getdinhmuc4lenhcp.js +7 -0
  692. package/server/modules/reports/rp-getdinhmuc4pxk.js +9 -0
  693. package/server/modules/reports/rp-getdk4pht.js +8 -0
  694. package/server/modules/reports/rp-getdk4pkc.js +10 -0
  695. package/server/modules/reports/rp-getdttheoca.js +5 -0
  696. package/server/modules/reports/rp-getinvoice2pay.js +4 -0
  697. package/server/modules/reports/rp-getinvoice2receive.js +4 -0
  698. package/server/modules/reports/rp-getinvoice2return.js +5 -0
  699. package/server/modules/reports/rp-getinvoice2return_bl.js +6 -0
  700. package/server/modules/reports/rp-getkehoachmh4lenhcp.js +4 -0
  701. package/server/modules/reports/rp-getkhauhao.js +7 -0
  702. package/server/modules/reports/rp-getluong.js +8 -0
  703. package/server/modules/reports/rp-getluongchuyen.js +5 -0
  704. package/server/modules/reports/rp-getpn2fee.js +5 -0
  705. package/server/modules/reports/rp-getpn2return.js +5 -0
  706. package/server/modules/reports/rp-getthanhpham4pnk.js +7 -0
  707. package/server/modules/reports/rp-getvc2xhd.js +11 -0
  708. package/server/modules/reports/rp-gt_cpnvltt.js +6 -0
  709. package/server/modules/reports/rp-hangbanbitralai.js +5 -0
  710. package/server/modules/reports/rp-hangthanhvien.js +3 -0
  711. package/server/modules/reports/rp-hoadonbanhangtheohantt.js +5 -0
  712. package/server/modules/reports/rp-hoadonmuahangtheohantt.js +5 -0
  713. package/server/modules/reports/rp-hoahong.js +15 -0
  714. package/server/modules/reports/rp-kcsns.js +19 -0
  715. package/server/modules/reports/rp-kgchamcong.js +1 -0
  716. package/server/modules/reports/rp-khoaso.js +11 -0
  717. package/server/modules/reports/rp-kiemtrasocaitcvssocai.js +6 -0
  718. package/server/modules/reports/rp-kqdanhgianhanvien.js +5 -0
  719. package/server/modules/reports/rp-kqhdkd.js +1 -0
  720. package/server/modules/reports/rp-lcttgt.js +16 -0
  721. package/server/modules/reports/rp-lctttt.js +11 -0
  722. package/server/modules/reports/rp-linkslist.js +4 -0
  723. package/server/modules/reports/rp-phanbochitienchohoadon.js +11 -0
  724. package/server/modules/reports/rp-phanbothutienchohoadon.js +11 -0
  725. package/server/modules/reports/rp-ptbitralai.js +7 -0
  726. package/server/modules/reports/rp-ptcttct.js +24 -0
  727. package/server/modules/reports/rp-ptdonhang.js +8 -0
  728. package/server/modules/reports/rp-pttct.js +52 -0
  729. package/server/modules/reports/rp-pttctkho.js +32 -0
  730. package/server/modules/reports/rp-pttctkho2.js +29 -0
  731. package/server/modules/reports/rp-referredusers.js +5 -0
  732. package/server/modules/reports/rp-sctbhxh.js +4 -0
  733. package/server/modules/reports/rp-sctcnkh.js +11 -0
  734. package/server/modules/reports/rp-sctdiem.js +3 -0
  735. package/server/modules/reports/rp-sctdt.js +7 -0
  736. package/server/modules/reports/rp-sctdtcp.js +11 -0
  737. package/server/modules/reports/rp-sctluong.js +6 -0
  738. package/server/modules/reports/rp-sctthuetncn.js +4 -0
  739. package/server/modules/reports/rp-scttk.js +9 -0
  740. package/server/modules/reports/rp-sctvt.js +5 -0
  741. package/server/modules/reports/rp-sctvt_sl.js +5 -0
  742. package/server/modules/reports/rp-sctvtnpp.js +6 -0
  743. package/server/modules/reports/rp-sctvttt.js +5 -0
  744. package/server/modules/reports/rp-search.js +4 -0
  745. package/server/modules/reports/rp-socai.js +6 -0
  746. package/server/modules/reports/rp-socaitk.js +1 -0
  747. package/server/modules/reports/rp-sochut.js +7 -0
  748. package/server/modules/reports/rp-sokho.js +7 -0
  749. package/server/modules/reports/rp-sokhott.js +5 -0
  750. package/server/modules/reports/rp-sonkbh.js +5 -0
  751. package/server/modules/reports/rp-sonkc.js +6 -0
  752. package/server/modules/reports/rp-sonkct.js +5 -0
  753. package/server/modules/reports/rp-sonkmh.js +5 -0
  754. package/server/modules/reports/rp-sonktt.js +5 -0
  755. package/server/modules/reports/rp-soquy.js +11 -0
  756. package/server/modules/reports/rp-sosanhkhvatt.js +13 -0
  757. package/server/modules/reports/rp-sosanhkhvatt2.js +5 -0
  758. package/server/modules/reports/rp-sotaisan.js +13 -0
  759. package/server/modules/reports/rp-sotiengui.js +7 -0
  760. package/server/modules/reports/rp-taodinhmuctudkhoc.js +5 -0
  761. package/server/modules/reports/rp-thbanhangkempk.js +28 -0
  762. package/server/modules/reports/rp-thdanhgianhanvien.js +9 -0
  763. package/server/modules/reports/rp-thgt.js +6 -0
  764. package/server/modules/reports/rp-thnxt.js +11 -0
  765. package/server/modules/reports/rp-thnxt_sl.js +9 -0
  766. package/server/modules/reports/rp-thnxtnpp.js +10 -0
  767. package/server/modules/reports/rp-thnxttt.js +9 -0
  768. package/server/modules/reports/rp-tkbanhangtheogioithieu.js +9 -0
  769. package/server/modules/reports/rp-tkgioithieukh.js +4 -0
  770. package/server/modules/reports/rp-tkgtgt.js +76 -0
  771. package/server/modules/reports/rp-tkgtgt_old.js +7 -0
  772. package/server/modules/reports/rp-tmbctc.js +20 -0
  773. package/server/modules/reports/rp-tonghopbanhang.js +6 -0
  774. package/server/modules/reports/rp-tonghopmuahang.js +5 -0
  775. package/server/modules/reports/rp-tonghoptralaihang.js +5 -0
  776. package/server/modules/reports/rp-tongquanbanle.js +20 -0
  777. package/server/modules/reports/rp-tongquanbds.js +3 -0
  778. package/server/modules/reports/rp-tongquancongty.js +6 -0
  779. package/server/modules/reports/rp-tongquanctvnpp.js +12 -0
  780. package/server/modules/reports/rp-tongquannvbh.js +14 -0
  781. package/server/modules/reports/rp-tongquannvnpp.js +5 -0
  782. package/server/modules/reports/rp-uoctinhnvl.js +11 -0
  783. package/server/modules/reports/rp-wallet.js +3 -0
  784. package/server/modules/reports/rpt-tkdiemtichluy.js +9 -0
  785. package/server/modules/systems/sys-app.js +34 -0
  786. package/server/modules/systems/sys-colleague.js +11 -0
  787. package/server/modules/systems/sys-data_list_config.js +1 -0
  788. package/server/modules/systems/sys-domain.js +1 -0
  789. package/server/modules/systems/sys-ecomproductlines.js +1 -0
  790. package/server/modules/systems/sys-exportexceltemplate.js +1 -0
  791. package/server/modules/systems/sys-fieldright.js +1 -0
  792. package/server/modules/systems/sys-importexceltemplate.js +1 -0
  793. package/server/modules/systems/sys-labelinfo.js +4 -0
  794. package/server/modules/systems/sys-listinfo.js +10 -0
  795. package/server/modules/systems/sys-menuinfo.js +4 -0
  796. package/server/modules/systems/sys-message.js +14 -0
  797. package/server/modules/systems/sys-moduleinfo.js +4 -0
  798. package/server/modules/systems/sys-notification.js +8 -0
  799. package/server/modules/systems/sys-quanhuyen.js +1 -0
  800. package/server/modules/systems/sys-reportinfo.js +5 -0
  801. package/server/modules/systems/sys-rptobject.js +1 -0
  802. package/server/modules/systems/sys-schedule.js +10 -0
  803. package/server/modules/systems/sys-sysconfig.js +1 -0
  804. package/server/modules/systems/sys-sysgroup.js +1 -0
  805. package/server/modules/systems/sys-tableinfo.js +1 -0
  806. package/server/modules/systems/sys-templatestore.js +5 -0
  807. package/server/modules/systems/sys-tinhthanh.js +1 -0
  808. package/server/modules/systems/sys-token.js +3 -0
  809. package/server/modules/systems/sys-trangthai.js +3 -0
  810. package/server/modules/systems/sys-trialinfo.js +1 -0
  811. package/server/modules/systems/sys-user.js +45 -0
  812. package/server/modules/systems/sys-users.js +10 -0
  813. package/server/modules/systems/sys-versioninfo.js +1 -0
  814. package/server/modules/systems/sys-vietqrbanks.js +1 -0
  815. package/server/modules/systems/sys-xaphuong.js +1 -0
  816. package/server/modules/vouchers/vo-banggiaban.js +8 -0
  817. package/server/modules/vouchers/vo-bc1.js +34 -0
  818. package/server/modules/vouchers/vo-bc5.js +15 -0
  819. package/server/modules/vouchers/vo-bg1.js +10 -0
  820. package/server/modules/vouchers/vo-bg2.js +12 -0
  821. package/server/modules/vouchers/vo-bn1.js +36 -0
  822. package/server/modules/vouchers/vo-bn5.js +15 -0
  823. package/server/modules/vouchers/vo-dh2.js +35 -0
  824. package/server/modules/vouchers/vo-dinhmucsx.js +6 -0
  825. package/server/modules/vouchers/vo-dkb.js +21 -0
  826. package/server/modules/vouchers/vo-dn0.js +9 -0
  827. package/server/modules/vouchers/vo-dnm.js +20 -0
  828. package/server/modules/vouchers/vo-hd1.js +37 -0
  829. package/server/modules/vouchers/vo-hd2.js +108 -0
  830. package/server/modules/vouchers/vo-hd3.js +38 -0
  831. package/server/modules/vouchers/vo-hd4.js +13 -0
  832. package/server/modules/vouchers/vo-hd7.js +29 -0
  833. package/server/modules/vouchers/vo-hd8.js +29 -0
  834. package/server/modules/vouchers/vo-hde.js +39 -0
  835. package/server/modules/vouchers/vo-htl.js +11 -0
  836. package/server/modules/vouchers/vo-kbbtpb.js +6 -0
  837. package/server/modules/vouchers/vo-kehoachmh.js +11 -0
  838. package/server/modules/vouchers/vo-lenhcapphat.js +9 -0
  839. package/server/modules/vouchers/vo-lenhsx.js +12 -0
  840. package/server/modules/vouchers/vo-pbl.js +94 -0
  841. package/server/modules/vouchers/vo-pc0.js +14 -0
  842. package/server/modules/vouchers/vo-pc1.js +31 -0
  843. package/server/modules/vouchers/vo-pc2.js +25 -0
  844. package/server/modules/vouchers/vo-pc3.js +14 -0
  845. package/server/modules/vouchers/vo-pc5.js +15 -0
  846. package/server/modules/vouchers/vo-pc6.js +19 -0
  847. package/server/modules/vouchers/vo-pcl.js +7 -0
  848. package/server/modules/vouchers/vo-pdn.js +11 -0
  849. package/server/modules/vouchers/vo-pdx.js +9 -0
  850. package/server/modules/vouchers/vo-pgh.js +16 -0
  851. package/server/modules/vouchers/vo-pht.js +6 -0
  852. package/server/modules/vouchers/vo-pkc.js +5 -0
  853. package/server/modules/vouchers/vo-pkh.js +9 -0
  854. package/server/modules/vouchers/vo-pkk.js +12 -0
  855. package/server/modules/vouchers/vo-pkt.js +12 -0
  856. package/server/modules/vouchers/vo-pn1.js +30 -0
  857. package/server/modules/vouchers/vo-pn2.js +17 -0
  858. package/server/modules/vouchers/vo-pn3.js +18 -0
  859. package/server/modules/vouchers/vo-pn5.js +18 -0
  860. package/server/modules/vouchers/vo-pn6.js +18 -0
  861. package/server/modules/vouchers/vo-pn9.js +23 -0
  862. package/server/modules/vouchers/vo-pnc.js +19 -0
  863. package/server/modules/vouchers/vo-pnh.js +17 -0
  864. package/server/modules/vouchers/vo-pnk.js +14 -0
  865. package/server/modules/vouchers/vo-pnknpp.js +12 -0
  866. package/server/modules/vouchers/vo-po1.js +14 -0
  867. package/server/modules/vouchers/vo-ppb.js +8 -0
  868. package/server/modules/vouchers/vo-pt1.js +20 -0
  869. package/server/modules/vouchers/vo-pt5.js +15 -0
  870. package/server/modules/vouchers/vo-ptl.js +8 -0
  871. package/server/modules/vouchers/vo-purchase_contract.js +9 -0
  872. package/server/modules/vouchers/vo-pxc.js +24 -0
  873. package/server/modules/vouchers/vo-pxh.js +18 -0
  874. package/server/modules/vouchers/vo-pxk.js +15 -0
  875. package/server/modules/vouchers/vo-pxknpp.js +14 -0
  876. package/server/modules/vouchers/vo-qts.js +12 -0
  877. package/server/modules/vouchers/vo-sale_contract.js +11 -0
  878. package/server/modules/vouchers/vo-shipbook.js +17 -0
  879. package/server/modules/vouchers/vo-so1.js +125 -0
  880. package/server/modules/vouchers/vo-so5.js +57 -0
  881. package/server/modules/vouchers/vo-so7.js +97 -0
  882. package/server/modules/vouchers/vo-so9.js +119 -0
  883. package/server/modules/vouchers/vo-vanchuyen.js +14 -0
  884. package/server/modules/vouchers/vo-xhd.js +33 -0
@@ -0,0 +1,1365 @@
1
+ const controller = require('../controllers/controller');
2
+ const underscore =require('underscore');
3
+ const async = require("async");
4
+ const {evalute} = require("../libs/utils");
5
+ const utils = require("../libs/utils");
6
+ //const {isSupperAdmin} = require("../libs/utils");
7
+ const PostBook = require('../libs/post-book');
8
+ const PostSocai = require('../libs/post-socai');
9
+ const moment = require("moment");
10
+ const numeral = require("numeral");
11
+ const fs = require("fs");
12
+ const _ = require("lodash")
13
+
14
+ const controllerUtils = require("../controllers/controllerUtils");
15
+
16
+ const joinModel2 = (arr,id_app, model, joinFields, fn,options={cache:true})=>{
17
+ return [...arr].joinModel2(id_app, model, joinFields, fn,options);
18
+ }
19
+ const fieldScheme = new global.Schema(
20
+ {
21
+ stt:{type:Number,default:0},
22
+ stt_col:{type:Number,default:0},
23
+ name:{type: String, required: "Yêu cầu nhập mã trường",index:true,lowercase:true,trim:true},
24
+ type:{type: String, default:'String',trim:true},
25
+ form:{type: String,trim:true},//user for type array or Mixed
26
+ header:{type: String, required: "Yêu cầu nhập tên trường"},
27
+ header2:{type: String},
28
+ api_description:{type: String},//Miêu tả field trong tài liệu api
29
+ sort:Number,
30
+ unique:Boolean,
31
+ default:global.Schema.Types.Mixed,
32
+ lowercase:{type:Boolean,default:false},
33
+ uppercase:{type:Boolean,default:false},
34
+ required:global.Schema.Types.Mixed,
35
+ index:{type:Boolean,default:false},
36
+ is_tmp:{type:Boolean,default:false},
37
+ is_title:{type:Boolean,default:false},
38
+ on_view:{type:Boolean,default:true},
39
+
40
+ maxlength:Number,
41
+ min:global.Schema.Types.Mixed,
42
+ max:global.Schema.Types.Mixed,
43
+ ref_model:{type: String,trim:true},
44
+ ref_field:{type:String,trim:true},
45
+ ref_label:{type:String,trim:true},
46
+ ref_label_as:{type:String,trim:true},
47
+ ref_search_fields:{type:String,trim:true},
48
+ ref_data_fields:{type:String,trim:true},
49
+ ref_condition:{type:String,trim:true},
50
+ multiple:Boolean,
51
+
52
+
53
+ not_display:global.Schema.Types.Mixed,
54
+ not_input:global.Schema.Types.Mixed,
55
+
56
+ min_width_display:{type:Number,default:80},
57
+ format:{type:String},
58
+ align:{type:String},
59
+ color:{type:String},
60
+ bold:Boolean,
61
+
62
+ html_variant_display:{type:String},
63
+ html_component_display:{type:String},
64
+ html_component_input:{type:String},
65
+
66
+ render_on_list:String,
67
+ render_on_view:String,
68
+ render_title:String,
69
+
70
+ grid_configs:{type:String,trim:true},
71
+
72
+ handle_value_changed:{type:String,trim:true},
73
+ handle_value_changed_on_list:{type:String,trim:true},//script chạy khi dữ liệu được thay đổi trực tiếp trên grid
74
+ handle_search_condition:{type:String,trim:true},
75
+
76
+ tab:{type:String,trim:true},
77
+ group:{type:String,trim:true},
78
+
79
+ help_text:{type:String,trim:true},
80
+ line:{type:Number,default:0}
81
+ }
82
+ )
83
+ const listinfoSchema = new global.Schema({
84
+ menu_position:String,
85
+ code: {type: String, required: true,index:true,lowercase:true,trim:true},
86
+ title: {type: String, required: true},
87
+ title2: {type: String},
88
+ mother_code: {type: String,lowercase:true,trim:true},
89
+ api_code: {type: String,lowercase:true,trim:true},
90
+ model_code: {type: String,lowercase:true,trim:true},
91
+ used_by_3rd_systems: String,//Api được sử dụng bởi phần mềm nào. ví dụ n8n
92
+
93
+ fields:[fieldScheme],
94
+ postinfos:[global.Schema.Types.Mixed],
95
+ exfields:global.Schema.Types.Mixed,
96
+ create_model: {type: Boolean, default: false},
97
+ breadcrumbs: {type: String,trim:true},
98
+ permistion_code:String,
99
+ not_add:Boolean,
100
+ not_edit:Boolean,
101
+ not_delete:Boolean,
102
+ not_copy:Boolean,
103
+ //events
104
+ handle_cell_clicked:{type: String,trim:true},
105
+ expression_check_save:{type:String,trim:true},
106
+ on_saved:{type:String,trim:true},
107
+ on_deleting:{type:String,trim:true},
108
+ on_deleted:{type:String,trim:true},
109
+ on_init:{type:String,trim:true},
110
+ on_init_update:{type:String,trim:true},
111
+ handle_view_server:{type:String,trim:true},
112
+ handle_oncreating_server:{type:String,trim:true},
113
+ handle_oncreated_server:{type:String,trim:true},
114
+ handle_onupdating_server:{type:String,trim:true},
115
+ handle_onupdated_server:{type:String,trim:true},
116
+ handle_ondeleting_server:{type:String,trim:true},
117
+ //condition
118
+ search_required:Boolean,
119
+ search_form:{type:String,trim:true},
120
+ default_condition:{type:String,trim:true},
121
+ require_condition:{type:String,trim:true},
122
+ //
123
+ export_yn:Boolean,
124
+ sort_by:String,
125
+ not_need_right:{type: Boolean,default:false},//Có cần phân quyền hay không
126
+ require_id_app:{type: Boolean,default:true},//Dữ liệu theo công ty hay dữ liệu chung
127
+ private_data:Boolean,
128
+ view_tabs:[],
129
+ allow_users:{type: String,trim:true},
130
+ input_users:{type: String,trim:true},
131
+ create_menu:Boolean,
132
+ show_view_tabs_on_grid:Boolean,
133
+ form_size:{type:String,default:"md",trim:true},
134
+ //
135
+ is_dashboard_item:{type: Boolean, default: false},
136
+ dashboard_default:{type: Boolean, default: true},
137
+ dashboard_ids:{type: String,trim:true},
138
+ dashboard_stt:{type: Number},
139
+ //
140
+ get_other_fields:String,
141
+ options:{},
142
+
143
+ status: {type: Boolean, default: true},
144
+ date_created: {type: Date, default: Date.now},
145
+ date_updated: {type: Date, default: Date.now},
146
+ user_created: {type: String, default: ''},
147
+ user_updated: {type: String, default: ''}
148
+ });
149
+ if((global.configs||{}).createIndexes){
150
+ listinfoSchema.index({code: 1},{unique:true});
151
+ listinfoSchema.index({used_by_3rd_systems: 1});
152
+
153
+ listinfoSchema.index({code:1,api_code:1,title: 1});
154
+
155
+ listinfoSchema.index({title: 1});
156
+ listinfoSchema.index({title2: 1});
157
+ listinfoSchema.index({mother_code: 1});
158
+ listinfoSchema.index({api_code: 1});
159
+ listinfoSchema.index({code:1,api_code: 1});
160
+ listinfoSchema.index({model_code: 1});
161
+
162
+ listinfoSchema.index({mother_code: 1});
163
+ listinfoSchema.index({is_dashboard_item: 1});
164
+ listinfoSchema.index({dashboard_ids: 1});
165
+ listinfoSchema.index({mother_code: "text",code:"text",title:"text"},{name:"listinfo_index2_text"});
166
+
167
+ listinfoSchema.index({status: 1});
168
+ listinfoSchema.index({user_created: 1,visible_to: 1,visible_to_users: 1});
169
+ }
170
+ const model = global.mongoose.models.listinfo || global.mongoose.model('listinfo', listinfoSchema);
171
+ const requireFields= model.requireFields ={
172
+ id_app:{type:String,required:true},
173
+ exfields:global.Schema.Types.Mixed,
174
+
175
+ listinfo_code:String,
176
+ status: {type: Boolean, default: true},
177
+ date_created: {type: Date, default: Date.now},
178
+ date_updated: {type: Date, default: Date.now},
179
+ user_created: {type: String, default: ''},
180
+ user_updated: {type: String, default: ''},
181
+ visible_to: {type: Number, default: 0},
182
+ visible_to_users: [String],
183
+ }
184
+ model.createSchema = (info)=>{
185
+ if(!info.create_model) return null;
186
+
187
+ const require_id_app = (info.require_id_app!=false && info.require_id_app!="false");
188
+ const _requireFields ={...requireFields}
189
+
190
+ if(!require_id_app){
191
+ delete _requireFields.id_app;
192
+ }
193
+ let mySchema = new global.Schema(_requireFields,{strict: false});
194
+ let require_paths = Object.keys(mySchema.paths);
195
+ let fields = {};
196
+ for(let f of info.fields.filter(f=>f.type!=="Link" && f.type!=="Files" && f.type!=="Action" && f.type!=="Group" && !f.is_tmp && require_paths.indexOf(f.name)<0)){
197
+ if(f.unique){
198
+ f.index = true;
199
+ }
200
+ let _field = Object.assign({},f);
201
+ if(_field.type=="DateTime" || _field.type=="Time") _field.type= "Date";
202
+ if(_field.type=="File" || _field.type=="OtherFile") _field.type= "Mixed";
203
+ if(_field.type=="Array") _field.type= "Mixed";
204
+ if(_field.type=="Pdf") _field.type= "String";
205
+ if(_field.type=="Image") _field.type= "String";
206
+
207
+ if(_field.type=="String") _field.trim = true;
208
+
209
+ _field.required = false;
210
+ _field.isDynamic = true;
211
+
212
+ delete _field.name;
213
+ delete _field.header;
214
+ delete _field.header2;
215
+ delete _field.line;
216
+ delete _field.sort;
217
+ delete _field.unique;
218
+ delete _field._id;
219
+ delete _field.stt;
220
+ delete _field.not_display;
221
+ delete _field.not_search;
222
+ delete _field.format;
223
+ delete _field.align;
224
+ delete _field.color;
225
+ delete _field.form;
226
+ delete _field.min_width_display;
227
+ delete _field.html_component_display;
228
+ delete _field.html_variant_display;
229
+ delete _field.html_component_input;
230
+ delete _field.handle_value_changed;
231
+ delete _field.handle_value_changed_on_list;
232
+ delete _field.default;
233
+ delete _field.multiple;
234
+
235
+ delete _field.tab;
236
+ delete _field.help_text;
237
+ delete _field.grid_configs;
238
+ delete _field.render_on_list;
239
+ delete _field.render_on_view;
240
+ delete _field.is_tmp;
241
+ delete _field.is_title;
242
+ delete _field.on_view;
243
+ delete _field.handle_view_server;
244
+ if(_field.type=="String" || _field.type=="Number" ){
245
+ _field.maxlength = _field.maxlength || 4000;
246
+ }else{
247
+ delete _field.maxlength
248
+ }
249
+ fields[f.name] = _field
250
+ }
251
+ try{
252
+ mySchema.add(fields);
253
+ }catch(e){
254
+ Logger.error("[listinfo] [createSchema]",e.message);
255
+ Logger.error(JSON.stringify(fields),null,2);
256
+ throw e
257
+ }
258
+ //create index for all fields
259
+ if((global.configs||{}).createIndexes){
260
+ //Tạo index chứng từ chuyển
261
+ if(info.fields.find(f=>f.id_ct_chuyen)){
262
+ mySchema.index({id_app: 1, id_ct_chuyen:1},{name:"index_id_ct_chuyen"});
263
+ }
264
+ //tạo dynamic index
265
+ const dynamic_indexes = info.fields.filter(f=>f.index);
266
+ let indexs = {};
267
+ if(require_id_app){
268
+ indexs.id_app =1;
269
+ }
270
+ dynamic_indexes.forEach(field=>{
271
+ indexs[field.name] = 1;
272
+ })
273
+ if(Object.keys(indexs).length>0){
274
+ mySchema.index(indexs,{name:"index_dynamic"});
275
+ }
276
+ //Tạo index cho user
277
+ let index_user = {user_created: 1,visible_to: 1,visible_to_users: 1,status:1}
278
+ if(require_id_app){
279
+ index_user.id_app =1;
280
+ }
281
+ if(info.fields.find(f=>f.name=="trang_thai")){
282
+ index_user.trang_thai =1;
283
+ }
284
+ if(info.fields.find(f=>f.name=="of_user")){
285
+ index_user.of_user =1;
286
+ }
287
+ if(info.fields.find(f=>f.name=="phu_trach")){
288
+ index_user.phu_trach =1;
289
+ }
290
+ mySchema.index(index_user);
291
+ mySchema.index({index_user,...indexs});
292
+
293
+ //create unique index
294
+ let uq = info.fields.filter(f=>f.unique);
295
+ if(uq.length>0){
296
+ let indUq = {id_app:1};
297
+ if(!require_id_app){
298
+ delete indUq.id_app;
299
+ }
300
+
301
+ uq.forEach((field) => {
302
+ indUq[field.name] =field.sort || 1;
303
+ });
304
+ mySchema.index(indUq,{unique: true });
305
+ }
306
+ //create text index
307
+ let api_code = info.api_code || info.code;
308
+ let index_name = `${api_code}_index_text`;
309
+ mySchema.index({"$**": "text" },{name:index_name});
310
+ /*//create requiere index
311
+ const requireIndex ={}
312
+ require_paths.forEach(rq=>{
313
+ requireIndex[rq] =1;
314
+ })
315
+ mySchema.index(requireIndex);*/
316
+ }
317
+ return mySchema;
318
+ }
319
+ model.updateSchema = async (schema,listinfo_code)=>{
320
+ const info = await model.findOne({code:listinfo_code}).lean();
321
+ if(!info || !info.fields) return;
322
+ for(let field of info.fields.filter(f=>f.type!=="Link" && f.type!=="Files" && f.type!=="Action" && f.type!=="Group")){
323
+ if(schema.paths[field.name]){
324
+ //Nếu là dynamic field thì remove để tạo lại
325
+ if(schema.paths[field.name].options && schema.paths[field.name].options.isDynamic){
326
+ schema.remove(field.name);
327
+ }else{
328
+ continue;
329
+ }
330
+ }
331
+ //Nếu là field tmp thì không thêm vào schema
332
+ if(field.is_tmp){
333
+ continue;
334
+ }
335
+ //
336
+ if(field.toObject) field = field.toObject();
337
+ const _field = {...field};
338
+ if(_field.type=="DateTime" || _field.type=="Time") _field.type= "Date";
339
+ if(_field.type=="File" || _field.type=="OtherFile") _field.type= "Mixed";
340
+ if(_field.type=="Array") _field.type= "Mixed";
341
+ if(_field.type=="Pdf") _field.type= "String";
342
+ if(_field.type=="Image") _field.type= "String";
343
+ if(_field.type=="String") _field.trim = true;
344
+ _field.required = false;
345
+ _field.isDynamic = true;
346
+
347
+ delete _field.stt_col;
348
+ delete _field.name;
349
+ delete _field.header;
350
+ delete _field.header2;
351
+ delete _field.line;
352
+ delete _field.sort;
353
+ delete _field.unique;
354
+ delete _field._id;
355
+ delete _field.stt;
356
+ delete _field.not_display;
357
+ delete _field.not_search;
358
+ delete _field.format;
359
+ delete _field.align;
360
+ delete _field.color;
361
+ delete _field.form;
362
+ delete _field.min_width_display;
363
+ delete _field.html_component_display;
364
+ delete _field.html_variant_display;
365
+ delete _field.html_component_input;
366
+ delete _field.handle_value_changed;
367
+ delete _field.handle_value_changed_on_list;
368
+ delete _field.default;
369
+ delete _field.multiple;
370
+ delete _field.tab;
371
+ delete _field.help_text;
372
+ delete _field.grid_configs;
373
+ delete _field.render_on_list;
374
+ delete _field.render_on_view;
375
+ delete _field.is_tmp;
376
+ delete _field.is_title;
377
+ delete _field.on_view;
378
+ delete _field.handle_view_server;
379
+ if(_field.type=="String" || _field.type=="Number" ){
380
+ _field.maxlength = _field.maxlength || 4000;
381
+ }else{
382
+ delete _field.maxlength
383
+ }
384
+ //Logger.warn(`[listinfo] [updateSchema] [${listinfo_code}] add field:`,field.name);
385
+ schema.add({[field.name]:_field});
386
+ }
387
+ }
388
+ model.updateModel = async (info,_newModel)=>{
389
+ if(info.toObject) info = info.toObject();
390
+ if(!info.create_model) return null;
391
+ let model_code = info.api_code || info.model_code || info.code;
392
+ if(!_newModel) _newModel = global.mongoose.models[model_code];
393
+ if(!_newModel) return;
394
+ if(!_newModel.schema){
395
+ Logger.error("[listinfo][updateModel] model does not have schema",_newModel);
396
+ return;
397
+ }
398
+ //
399
+ //Logger.warn("[listinfo][updateModel] update model...",model_code);
400
+ const api_code = info.api_code || info.code;
401
+ const _newList = global.controllers[api_code.toUpperCase()];
402
+ let require_paths = Object.keys(requireFields);
403
+ let fields = [...info.fields];
404
+ //add ref fields
405
+ let fields_have_ref =fields.filter(f=>f.ref_model && f.ref_model.indexOf("[")<0 && f.ref_field && f.type!=="Array" && f.type!=="Mixed" && f.ref_label)
406
+ .map(f=>f.ref_label_as || f.ref_label)
407
+ .filter(f=>!fields.find(gf=>gf.name===f))
408
+ .map(f=>{
409
+ return {
410
+ name:f,
411
+ type:"String"
412
+ }
413
+ })
414
+ //Logger.warn("ref fields",fields_have_ref);
415
+ fields = fields.concat(fields_have_ref);
416
+ const fields_can_xu_ly = fields.filter(f=>f.type!=="Link" && f.type!=="Files" && f.type!=="Action" && f.type!=="Group" && require_paths.indexOf(f.name)<0);
417
+ //
418
+ for(let field of fields_can_xu_ly){
419
+ if(field.toObject) field = field.toObject();
420
+ const _field = {...field};
421
+ const schemaCode = field.form;
422
+ if(underscore.has(_newModel.schema.paths,field.name)){
423
+ if(field.type==="Array" || field.type==="Mixed"){
424
+ //Cập nhật field cho tab detail
425
+ if(schemaCode){
426
+ const schemaOfDetail = _newModel.schema.paths[field.name].schema;
427
+ if(schemaOfDetail){
428
+ await model.updateSchema(schemaOfDetail,schemaCode)
429
+ }
430
+ }
431
+ continue;
432
+ }
433
+ //xoá field để cập nhật lại nếu là dynamic field
434
+ if(_newModel.schema.paths[field.name].options && _newModel.schema.paths[field.name].options.isDynamic){
435
+ _newModel.schema.remove(field.name);
436
+ }else{
437
+ continue;
438
+ }
439
+ }
440
+ //Nếu là field tmp thì không thêm vào schema
441
+ if(field.is_tmp){
442
+ continue;
443
+ }
444
+
445
+ if(_field.type=="DateTime" || _field.type=="Time") _field.type= "Date";
446
+ if(_field.type=="File" || _field.type=="OtherFile") _field.type= "Mixed";
447
+ if(_field.type=="Array") _field.type= "Mixed";
448
+ if(_field.type=="Pdf") _field.type= "String";
449
+ if(_field.type=="Image") _field.type= "String";
450
+
451
+ if(_field.type=="String") _field.trim = true;
452
+
453
+ if(model_code!=info.code){
454
+ _field.required = false;//phai luon dat la false neu khong se bi dung giua cac api khac dung chung model
455
+ }
456
+
457
+ _field.isDynamic = true;
458
+ delete _field.stt_col;
459
+
460
+ delete _field.name;
461
+ delete _field.header;
462
+ delete _field.header2;
463
+ delete _field.line;
464
+ delete _field.sort;
465
+ delete _field.unique;
466
+ delete _field._id;
467
+ delete _field.stt;
468
+ delete _field.not_display;
469
+ delete _field.not_search;
470
+ delete _field.format;
471
+ delete _field.align;
472
+ delete _field.color;
473
+ delete _field.form;
474
+ delete _field.min_width_display;
475
+ delete _field.html_component_display;
476
+ delete _field.html_variant_display;
477
+ delete _field.html_component_input;
478
+ delete _field.handle_value_changed;
479
+ delete _field.handle_value_changed_on_list;
480
+
481
+ delete _field.default;
482
+ delete _field.multiple;
483
+ delete _field.tab;
484
+ delete _field.help_text;
485
+ delete _field.grid_configs;
486
+ delete _field.render_on_list;
487
+ delete _field.render_on_view;
488
+
489
+ delete _field.is_tmp;
490
+ delete _field.is_title;
491
+ delete _field.on_view;
492
+ delete _field.handle_view_server;
493
+
494
+ if(_field.type=="String" || _field.type=="Number" ){
495
+ _field.maxlength = _field.maxlength || 4000;
496
+ }else{
497
+ delete _field.maxlength
498
+ }
499
+ _newModel.schema.add({[field.name]:_field});
500
+
501
+ //if(!field.unique && field.type!="Array" && field.type!="Mixed" && field.index) _newModel.schema.index({[field.name]:1});
502
+ }
503
+ //create unique index
504
+ if((global.configs||{}).createIndexes){
505
+ //tạo dynamic index
506
+ try{
507
+ await _newModel.collection.dropIndex('index_dynamic');
508
+ }catch(e){/* */}
509
+ const dynamic_indexes = info.fields.filter(f=>f.index);
510
+ if(dynamic_indexes.length>0){
511
+ let indexs = {};
512
+ if(_newModel.schema.paths.id_app){
513
+ indexs.id_app =1;
514
+ }
515
+ dynamic_indexes.forEach(field=>{
516
+ indexs[field.name] = 1;
517
+ })
518
+ if(Object.keys(indexs).length>0){
519
+ _newModel.schema.index(indexs,{name:"index_dynamic"});
520
+ }
521
+ }
522
+ //Tạo index chứng từ chuyển
523
+ if(info.fields.find(f=>f.id_ct_chuyen)){
524
+ try{
525
+ await _newModel.collection.dropIndex('index_id_ct_chuyen');
526
+ }catch(e){/* */}
527
+ _newModel.schema.index({id_app: 1, id_ct_chuyen:1},{name:"index_id_ct_chuyen"});
528
+ }
529
+ if(_newList && _newList.is_dynamic_list){
530
+ let uq = fields.filter(f=>f.unique && f.name!="so_ct");//trường so_ct không được phép unique
531
+ let indUq;
532
+ if(uq.length>0){
533
+ if(_newModel.schema.paths.id_app){
534
+ indUq = {id_app:1};
535
+ }else{
536
+ indUq = {};
537
+ }
538
+ uq.forEach((field) => {
539
+ indUq[field.name] =field.sort || 1;
540
+ });
541
+ }
542
+ if(_newList.options.unique && _newList.options.unique.length>0){
543
+ let old_index_unique ={id_app:1};
544
+ _newList.options.unique.forEach(u=>{
545
+ let field = fields.find(f=>f.name===u);
546
+ old_index_unique[u]= (field||{}).sort || 1;
547
+ });
548
+ //Logger.warn("drop current index unique...",old_index_unique);
549
+ _newModel.collection.dropIndex(old_index_unique,()=>{
550
+ //if(e) return Logger.error("Can't drop index unique",old_index_unique,model_code,e);
551
+ //create new unique
552
+ if(indUq){
553
+ //Logger.warn("create new index unique...",indUq);
554
+ _newModel.schema.index(indUq,{unique: true });
555
+ }
556
+ })
557
+ }else{
558
+ //create new unique
559
+ if(indUq){
560
+ //Logger.warn("create new index unique...",indUq)
561
+ _newModel.schema.index(indUq,{unique: true });
562
+ }
563
+ }
564
+ }
565
+ }
566
+ }
567
+
568
+ model.createModel = (info)=>{
569
+ if(!info.create_model) return null;
570
+ let model_code = info.api_code || info.model_code || info.code;
571
+ //models are not allowed to create new APIs
572
+ if(global.secu_models.indexOf(model_code)>=0){
573
+ return null;
574
+ }
575
+ //
576
+ let exModel = global.mongoose.models[model_code]
577
+ if(!exModel){
578
+ let model_path = (((global.configs||{}).paths||{}).models || __dirname) + "/" + model_code + ".js"
579
+ if(fs.existsSync(model_path)){
580
+ exModel = require(model_path);
581
+ }
582
+ }
583
+ if(!exModel){
584
+ exModel = global.mongoose.model(model_code, model.createSchema(info));
585
+ }else{
586
+ model.updateModel(info,exModel);
587
+ }
588
+ return exModel;
589
+ }
590
+ const deletePost = (_listInfo,obj)=>{
591
+ return new Promise((resolve,reject)=>{
592
+ let bookbackup={};
593
+ async.mapSeries((_listInfo.postinfos||[]).filter(info=>info.model && info.script && info.condition),(postInfo,callback)=>{
594
+ setImmediate(async ()=>{
595
+ let m = global.getModel(postInfo.model);
596
+ let scriptCondition = postInfo.condition.indexOf("return ")<0?`return ${postInfo.condition}`:postInfo.condition;
597
+ let condition = evalute(scriptCondition,{master:obj,data:obj,moment});
598
+ condition.id_app = obj.id_app;
599
+ //backup old data
600
+ bookbackup[postInfo.model] = await m.find(condition).lean();
601
+ //delete
602
+ await m.deleteMany(condition);
603
+ callback();
604
+ })
605
+ },async (e)=>{
606
+ if(e){
607
+ //restore old data
608
+ for(let key in bookbackup){
609
+ if(bookbackup[key].length>0){
610
+ await global.getModel(key.toString()).insertMany(bookbackup[key]);
611
+ }
612
+ }
613
+ return reject(e);
614
+ }
615
+ resolve(bookbackup)
616
+ })
617
+ })
618
+ }
619
+ const post = (_listInfo,obj)=>{
620
+ if(obj.toObject) obj = obj.toObject();
621
+ //console.log("[post dynamic]",_listInfo.postinfos);
622
+ return Promise.all((_listInfo.postinfos||[]).filter(info=>info.model && info.script && info.condition).map(postInfo=>{
623
+ return (async ()=>{
624
+ let script = `return (async ()=>{
625
+ try{
626
+ ${postInfo.script}
627
+ }catch(e){
628
+ Logger.error("error post data",e)
629
+ return {error:e}
630
+ }
631
+ })()`
632
+ let data = await evalute(script,{master:{...obj},data:{...obj},moment,numeral});
633
+ if(data && data.error){
634
+ throw data.error
635
+ }
636
+ //Logger.warn("post dynamic",postInfo.model,data);
637
+ return new Promise((resolve,reject)=>{
638
+ if(postInfo.model==="socai"){
639
+ const postsocai = new PostSocai(obj, data,null,null,{deleteQuery:{id_ct:"#"}});//không xoá sổ sách vì trước đó đã xoá
640
+ postsocai.run((e, rs)=>{
641
+ if(e) return reject(e);
642
+ resolve(rs);
643
+ });
644
+ }else{
645
+ let m = global.getModel(postInfo.model);
646
+ const posttdttno = new PostBook(obj, data, m, function(detail, callback) {
647
+ callback(detail);
648
+ },{deleteQuery:{id_ct:"#"}});//không xoá sổ sách vì trước đó đã xoá
649
+
650
+ posttdttno.run(function(e, rs) {
651
+ //Logger.warn("posted dynamic",rs,e)
652
+ if(e) return reject(e);
653
+ resolve(rs);
654
+ })
655
+ }
656
+ })
657
+
658
+ })()
659
+ }))
660
+ }
661
+ const dynamicFinding = (_listInfo,user,condition,next,options={})=>{
662
+ if(_listInfo.api_code && _listInfo.api_code!=_listInfo.code){
663
+ //don't change condition of original api
664
+ return next(null,condition);
665
+ }
666
+ if(_listInfo.private_data){
667
+ condition.user_created = user.email
668
+ }
669
+ if(_listInfo.require_condition){
670
+ try{
671
+ let script = _listInfo.require_condition;
672
+ if(script.indexOf("return ")<0) script = `return ${script}`;
673
+ const require_condition = evalute(script,{user,condition,moment,numeral,request:options.req});
674
+ if(require_condition && Object.keys(require_condition).length>0){
675
+ for(let key in require_condition){
676
+ condition[key] = require_condition[key];
677
+ }
678
+ }
679
+ }catch(e){
680
+ Logger.error(e);
681
+ return next(`Error on require condition: ${e.message}`);
682
+ }
683
+ }
684
+ next(null,condition);
685
+ }
686
+
687
+ const dynamicCreating = async (listInfo,user,obj,next,options={})=>{
688
+ let _listInfo = await model.findOne({_id:listInfo._id}).lean();
689
+ if(!_listInfo) return next("Không tìm thấy danh mục này");
690
+ for(let key in _listInfo){
691
+ listInfo[key] = _listInfo[key];
692
+
693
+ }
694
+ /*const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
695
+ const supportUsers = configs.supportUsers || []
696
+ if (!require_id_app && (_listInfo.input_users||"").toLowerCase().indexOf(user.email.toLowerCase())<0 && !supportUsers.includes(user.email.toLowerCase()) && !isSupperAdmin(user.email.toLowerCase())) {
697
+ return next('Bạn không có quyền thực hiện thao tác này');
698
+ }*/
699
+ if(_listInfo.handle_oncreating_server && _listInfo.handle_oncreating_server.trim()!==""){
700
+ if(_listInfo.handle_oncreating_server.indexOf("next")<0) return next("Script xử lý dữ liệu trước khi tạo yêu cầu gọi function next");
701
+ try{
702
+ await new Promise((resolve,reject)=>{
703
+ async.parallel([
704
+ (next)=>{
705
+ const func_body = `(async ()=>{
706
+ try{
707
+ ${_listInfo.handle_oncreating_server}
708
+ }catch(e){
709
+ next(e);
710
+ }
711
+
712
+ })();`
713
+ setImmediate(async ()=>{
714
+ try{
715
+ await evalute(func_body,{obj,user,getLib:global.getLib,getModel:global.getModel,utils,query:utils.query,async,controller,controllerUtils,controllers:global.controllers,joinModel2,next,moment,numeral,request:options.req})
716
+ }catch(e){
717
+ Logger.error("[dynamicCreating][handle_oncreating_server]",{code:listInfo.code,handle_oncreating_server:_listInfo.handle_oncreating_server,e})
718
+ next(e);
719
+ }
720
+ })
721
+
722
+ }
723
+ ],(e,rs)=>{
724
+ if(e){
725
+ Logger.error("[dynamicCreating][handle_oncreating_server]",listInfo.code,e,_listInfo.handle_oncreating_server);
726
+ return reject(e)
727
+ }
728
+ resolve(rs);
729
+ })
730
+ })
731
+ }catch(e){
732
+ Logger.error("[dynamicCreating]",listInfo.code,e);
733
+ return next(e);
734
+ }
735
+
736
+ }
737
+ next(null,obj);
738
+ }
739
+ const dynamicCreated = async (_listInfo,user,obj,next,options={})=>{
740
+ if(_listInfo.handle_oncreated_server && _listInfo.handle_oncreated_server.trim()!==""){
741
+ if(_listInfo.handle_oncreated_server.indexOf("next")<0) return next("Script xử lý dữ liệu sau khi tạo yêu cầu gọi function next");
742
+ try{
743
+ await new Promise((resolve,reject)=>{
744
+ async.parallel([
745
+ (next)=>{
746
+ const func_body = `(async ()=>{
747
+ try{
748
+ ${_listInfo.handle_oncreated_server}
749
+ }catch(e){
750
+ next(e);
751
+ }
752
+ })();`
753
+ setImmediate(async ()=>{
754
+ try{
755
+ await evalute(func_body,{obj,user,getLib:global.getLib,getModel:global.getModel,controller,controllerUtils,controllers:global.controllers,utils,query:utils.query,async,joinModel2,next,moment,numeral,request:options.req})
756
+ }catch(e){
757
+ Logger.error("error dynamic created",_listInfo.handle_oncreated_server,e)
758
+ next(e)
759
+ }
760
+ })
761
+ }
762
+ ],(e,rs)=>{
763
+ if(e){
764
+ Logger.error(e);
765
+ return reject(e)
766
+ }
767
+ resolve(rs);
768
+ })
769
+ })
770
+ }catch(e){
771
+ Logger.error(e);
772
+ return next(e);
773
+ }
774
+
775
+ }
776
+ next(null,obj);
777
+ }
778
+
779
+ const dynamicUpdating = async (listInfo,user,data,obj,next,options={})=>{
780
+ let _listInfo = await model.findOne({_id:listInfo._id}).lean();
781
+ if(!_listInfo) return next("Không tìm thấy danh mục này");
782
+ for(let key in _listInfo){
783
+ listInfo[key] = _listInfo[key];
784
+
785
+ }
786
+ /*const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
787
+ const supportUsers = configs.supportUsers || [];
788
+ if (!require_id_app && (_listInfo.input_users||"").toLowerCase().indexOf(user.email.toLowerCase())<0 && !supportUsers.includes(user.email.toLowerCase()) && !isSupperAdmin(user.email.toLowerCase())) {
789
+ return next('Bạn không có quyền thực hiện thao tác này');
790
+ }*/
791
+ if(_listInfo.handle_onupdating_server && _listInfo.handle_onupdating_server.trim()!==""){
792
+ //Logger.warn("[listinof] [dynamicUpdating]",_listInfo.code,_listInfo.handle_onupdating_server);
793
+ if(_listInfo.handle_onupdating_server.indexOf("next")<0) return next("Script xử lý dữ liệu trước khi update yêu cầu gọi function next");
794
+ try{
795
+ await new Promise((resolve,reject)=>{
796
+ async.series([
797
+ (next)=>{
798
+ const func_body = `(async ()=>{
799
+ try{
800
+ ${_listInfo.handle_onupdating_server}
801
+ }catch(e){
802
+ next(e);
803
+ }
804
+
805
+ })();`
806
+ setImmediate(async ()=>{
807
+ try{
808
+ await evalute(func_body,{data,obj,user,getLib:global.getLib,getModel:global.getModel,controller,controllerUtils,controllers:global.controllers,utils,query:utils.query,async,joinModel2,next,moment,numeral,request:options.req})
809
+ }catch(e){
810
+ Logger.error("[listinfo][dynamicUpdating] error dynamic update",_listInfo.handle_onupdating_server,e)
811
+ next(e)
812
+ }
813
+ })
814
+ }
815
+ ],(e,rs)=>{
816
+ if(e){
817
+ Logger.error("[listinfo][dynamicUpdating]",e);
818
+ return reject(e)
819
+ }
820
+ resolve(rs);
821
+ })
822
+ })
823
+ }catch(e){
824
+ Logger.error(e);
825
+ return next(e);
826
+ }
827
+
828
+ }else{
829
+ //Logger.warn("[listinof] [dynamicUpdating]",_listInfo.code,"không xử lý updating");
830
+ }
831
+ next(null,data,obj);
832
+ }
833
+
834
+ const dynamicUpdated = async (_listInfo,user,obj,next,options={})=>{
835
+ if(_listInfo.handle_onupdated_server && _listInfo.handle_onupdated_server.trim()!==""){
836
+ if(_listInfo.handle_onupdated_server.indexOf("next")<0) return next("Script xử lý dữ liệu sau khi update yêu cầu gọi function next");
837
+ try{
838
+ await new Promise((resolve,reject)=>{
839
+ async.series([
840
+ (next)=>{
841
+ const func_body = `(async ()=>{
842
+ try{
843
+ ${_listInfo.handle_onupdated_server}
844
+ }catch(e){
845
+ next(e)
846
+ }
847
+ })();`
848
+ setImmediate(async ()=>{
849
+ try{
850
+ await evalute(func_body,{obj,user,getLib:global.getLib,getModel:global.getModel,controller,controllerUtils,controllers:global.controllers,utils,query:utils.query,async,joinModel2,next,moment,numeral,request:options.req})
851
+ }catch(e){
852
+ Logger.error("error dynamic updated",_listInfo.handle_onupdated_server,e)
853
+ next(e)
854
+ }
855
+ })
856
+ }
857
+ ],(e,rs)=>{
858
+ if(e){
859
+ Logger.error(e);
860
+ return reject(e)
861
+ }
862
+ resolve(rs);
863
+ })
864
+ })
865
+ }catch(e){
866
+ Logger.error(e);
867
+ return next(e);
868
+ }
869
+
870
+ }
871
+ next(null,obj);
872
+ }
873
+
874
+ const dynamicDeleting = async (listInfo,user,obj,next,options={})=>{
875
+ let _listInfo = await model.findOne({_id:listInfo._id}).lean();
876
+ if(!_listInfo) return next("Không tìm thấy danh mục này");
877
+ for(let key in _listInfo){
878
+ listInfo[key] = _listInfo[key];
879
+ }
880
+
881
+ /*const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
882
+ const supportUsers = configs.supportUsers || [];
883
+ if (!require_id_app && (_listInfo.input_users||"").toLowerCase().indexOf(user.email.toLowerCase())<0 && !supportUsers.includes(user.email) && !isSupperAdmin(user.email.toLowerCase())) {
884
+ return next('Bạn không có quyền thực hiện thao tác này');
885
+ }*/
886
+
887
+ if(_listInfo.handle_ondeleting_server && _listInfo.handle_ondeleting_server.trim()!==""){
888
+ if(_listInfo.handle_ondeleting_server.indexOf("next")<0) return next("Script xử lý dữ liệu trước khi update yêu cầu gọi function next");
889
+ try{
890
+ await new Promise((resolve,reject)=>{
891
+ async.series([
892
+ (next)=>{
893
+ const func_body = `(async ()=>{
894
+ try{
895
+ ${_listInfo.handle_ondeleting_server}
896
+ }catch(e){
897
+ next(e);
898
+ }
899
+ })();`
900
+ setImmediate(async ()=>{
901
+ try{
902
+ await evalute(func_body,{obj,user,getLib:global.getLib,getModel:global.getModel,controller,controllerUtils,controllers:global.controllers,utils,query:utils.query,async,joinModel2,next,moment,numeral,request:options.req})
903
+ }catch(e){
904
+ Logger.error("error dynamic delete",_listInfo.handle_ondeleting_server,e)
905
+ next(e)
906
+ }
907
+ })
908
+
909
+ }
910
+ ],(e,rs)=>{
911
+ if(e){
912
+ Logger.error(e);
913
+ return reject(e)
914
+ }
915
+ resolve(rs);
916
+ })
917
+ })
918
+ }catch(e){
919
+ Logger.error(e);
920
+ return next(e);
921
+ }
922
+
923
+ }
924
+ next(null,obj);
925
+ }
926
+
927
+ const onView = async (control,obj,user,items,next,options={})=>{
928
+ /*//chỉ xử lý view trên main code và current code
929
+ let listinfo_code = options.listinfo_code || obj.api_code || obj.code;//nếu không cung cấp listinfo_code thì sẽ chạy dynamic view của api gốc
930
+ let co_xu_ly_view = ((!obj.api_code || obj.code===obj.api_code) && control.is_dynamic_list) || (listinfo_code && listinfo_code.toLowerCase()===(obj.code||"").toLowerCase())
931
+ if(!co_xu_ly_view){
932
+ return next(null,items);
933
+ }*/
934
+ const api_code = (obj.api_code || obj.code).toUpperCase();
935
+ if(obj.private_data){
936
+ items = items.filter(item=>item.user_created===user.email)
937
+ }
938
+ //handle view
939
+ if(obj.handle_view_server && obj.handle_view_server.trim()!==""){
940
+ if(obj.handle_view_server.indexOf("next")<0) return next("Script xử lý view yêu cầu gọi function next");
941
+ await new Promise((resolve,reject)=>{
942
+ async.parallel([
943
+ (next)=>{
944
+ setImmediate(async ()=>{
945
+ const func_body = `(async ()=>{
946
+ try{
947
+ ${obj.handle_view_server}
948
+ }catch(e){
949
+ next(e);
950
+ }
951
+
952
+ })();`
953
+ try{
954
+ //Logger.warn("[listinfo][dynamicView] [handle view]",obj.code);
955
+ await evalute(func_body,{items,user,getLib:global.getLib,utils,query:utils.query,next,async,joinModel2,moment,numeral,request:options.req})
956
+ }catch(e){
957
+ Logger.error("[listinfo][dynamicView] [handle view] error dynamic view",obj.handle_view_serve,e);
958
+ next(e);
959
+ }
960
+ })
961
+ }
962
+ ],(e,rs)=>{
963
+ if(e){
964
+ Logger.error(e);
965
+ return reject(e);
966
+ }
967
+ resolve(rs);
968
+ })
969
+ })
970
+
971
+ }
972
+ //
973
+
974
+ //let fields_have_ref = obj.fields.filter(f=>["Number","String"].indexOf(f.type)>0 && f.ref_model && f.ref_model.indexOf("[")<0 && f.ref_field && f.ref_label);
975
+ let fields_have_ref = obj.fields.filter(f=>["Number","String"].indexOf(f.type)>0 && f.ref_model && f.ref_field && f.ref_label && ["tinhthanh","xaphuong","quanhuyen","account","currency","templatevoucher"].indexOf(f.ref_model)<0);
976
+ if(fields_have_ref.length===0){
977
+ //console.timeEnd(timer);
978
+ return next(null,items);
979
+ }
980
+
981
+ async.map(fields_have_ref, (f,cb)=>{
982
+ setImmediate(async ()=>{
983
+ let ref_model,where,fields,ref_name_model,ref_field,ref_condition,field_name,ref_label;
984
+ ref_label = f.ref_label_as || f.ref_label;
985
+ ref_field = f.ref_field;
986
+ ref_condition = f.ref_condition;
987
+ field_name = f.name;
988
+ try{
989
+ ref_name_model= f.ref_model;
990
+ if(ref_name_model.indexOf("[")>=0 || ref_name_model.indexOf(",")>=0){
991
+ try{
992
+ if(ref_name_model.indexOf("[")>=0){
993
+ ref_model = utils.JSONParser(ref_name_model)
994
+ }else{
995
+ ref_model = ref_name_model.split(",");
996
+ }
997
+ }catch(e){
998
+ Logger.error("ref_model is not valid",ref_name_model,e);
999
+ return cb(e);
1000
+ }
1001
+
1002
+ }else{
1003
+ if(ref_name_model==="dmkh") ref_name_model = "customer";
1004
+ if(ref_name_model==="dmtk") ref_name_model = "account";
1005
+ if(ref_name_model==="dmnt") ref_name_model = "currency";
1006
+ if(ref_name_model==="dmnhtask") ref_name_model = "group";
1007
+
1008
+ ref_model = global.mongoose.models[ref_name_model];
1009
+ if(!ref_model){
1010
+ let _listInofOfRef = await model.findOne({code:ref_name_model}).lean();
1011
+ if(_listInofOfRef && (_listInofOfRef.api_code || _listInofOfRef.model_code)){
1012
+ let model_code = _listInofOfRef.api_code || _listInofOfRef.model_code;
1013
+ ref_model = global.mongoose.models[model_code];
1014
+ }
1015
+ if(!ref_model){
1016
+ let ctrl = global.controllers[ref_name_model.trim().toUpperCase()];
1017
+ if(ctrl) ref_model = ctrl.getProperty("model");
1018
+ }
1019
+ }
1020
+ if(!ref_model) ref_model = global.getModel(ref_name_model);
1021
+ }
1022
+ }catch(e){
1023
+ Logger.error(e);
1024
+ return cb(e);
1025
+ }
1026
+ /*//chỉ xử lý dynamic joinview nếu field có giá trị
1027
+ let items_will_join = items.filter(item=>{
1028
+ return (item[f.name] || item[f.name]==0) //Chỉ joinview nếu trường đó có giá trị
1029
+ && (
1030
+ !item[ref_label] //chỉ joinview nếu chưa từng join với ref_model
1031
+
1032
+ ||!Object.keys(item.__refs||{}).find(k=>k.includes(ref_name_model)
1033
+ && k.includes(f.name))
1034
+ )
1035
+ });*/
1036
+ //Cần xử lý joinview tất cả các field để xoá dữ liệu ref không phù hợp
1037
+ let items_will_join = items;
1038
+ //
1039
+ if(items_will_join.length==0) return cb();
1040
+ //xác định các fields cần lấy dữ liệu
1041
+ fields = {[ref_label]:f.ref_label};
1042
+ if(f.ref_model==="trangthai" && f.name=="trang_thai"){
1043
+ fields.color="color";
1044
+ }
1045
+ //
1046
+ if(!_.isArray(ref_model)){
1047
+ if(Object.keys(fields).length>0){
1048
+ //create where
1049
+ //Logger.warn("[listinfo][dynamicView] handle joinview",obj.code,{field_name,ref_name_model,ref_field,ref_label,rows:items_will_join.length});
1050
+ where = (item)=>{
1051
+ let w = {
1052
+ [ref_field]:item[field_name]
1053
+ }
1054
+ //other condition
1055
+ let condition;
1056
+ if(ref_condition && ref_condition.indexOf("API")<0){
1057
+ let func_string = ref_condition;
1058
+ if(func_string.indexOf("return ")<0){
1059
+ func_string = `return ${func_string}`;
1060
+ }
1061
+ let userInfo = {...user};
1062
+ try{
1063
+ condition = evalute(func_string,{master:item,data:item,detail:item,userInfo});
1064
+ }catch(e){
1065
+ Logger.error(e,func_string);
1066
+ }
1067
+ }
1068
+ if(condition){
1069
+ if(ref_name_model==="participant"){
1070
+ delete condition.groups
1071
+ }
1072
+ //check where of trangthai. Chỉ sử dụng ma_ct và ma_trang_thai
1073
+ if(ref_name_model==="trangthai"){
1074
+ if(condition.ma_ct){
1075
+ w.ma_ct = condition.ma_ct
1076
+ }
1077
+ }else{
1078
+ for(let key in condition){
1079
+ w.$and = w.$and||[];
1080
+ w.$and.push({[key]:condition[key]})
1081
+ }
1082
+ }
1083
+ }
1084
+ //model trạng thái yêu cầu phải có ma_ct
1085
+ if(ref_name_model==="trangthai" && !w.ma_ct){
1086
+ w.ma_ct = api_code
1087
+ }
1088
+ return w;
1089
+ }
1090
+ //id app
1091
+ let id_app;
1092
+ if(underscore.has(ref_model.schema.paths,"id_app")){
1093
+ id_app = user.current_id_app;
1094
+ }
1095
+ //Logger.warn("[listinfo][dynamicView] [handle join]",obj.code,f.name,ref_name_model,fields);
1096
+ await items_will_join.asyncJoinModel2(id_app,ref_model,{where,fields});
1097
+ }
1098
+ }else{
1099
+ if(f.ref_field && f.ref_label){
1100
+ items_will_join.forEach(item=>{
1101
+ let ref_item = ref_model.find(r=>r[f.ref_field]==item[f.name]);
1102
+ if(ref_item) item[ref_label] = ref_item[f.ref_label]
1103
+
1104
+ })
1105
+ }
1106
+ }
1107
+ cb();
1108
+ })
1109
+
1110
+ },(e)=>{
1111
+ //console.timeEnd(timer);
1112
+ if(e) return next(e);
1113
+ next(null,items);
1114
+
1115
+ })
1116
+ }
1117
+ model.createController = (router,_listInfo)=>{
1118
+ let api_code = _listInfo.api_code || _listInfo.code;
1119
+ //Logger.warn("[listinfo] [createController] create_model",_listInfo.api_code || _listInfo.code,_listInfo.create_model)
1120
+ if(!_listInfo.create_model){
1121
+ return null;
1122
+ }
1123
+
1124
+
1125
+ let sort={},unique=[],_newModel,_newList;
1126
+ _listInfo.fields.filter(f=>f.sort).forEach(f=>{
1127
+ sort[f.name] = f.sort;
1128
+ })
1129
+ if(_listInfo.sort_by){
1130
+ if(_listInfo.sort_by.indexOf("return ")>=0 || _listInfo.sort_by.indexOf("{")===0) {
1131
+ let func_string = _listInfo.sort_by;
1132
+ if(func_string.indexOf("return ")<0){
1133
+ func_string = "return " + func_string;
1134
+ }
1135
+ try{
1136
+ sort = evalute(func_string);
1137
+ }catch(e){
1138
+ Logger.error("[listinfo] error create sort", func_string,e);
1139
+ }
1140
+ }else{
1141
+ sort = _listInfo.sort_by.split(",").reduce((sort,b)=>sort[b]=1,{})
1142
+ }
1143
+ }
1144
+ //tạo danh sách unique. không được phép unique trường số chứng từ
1145
+ _listInfo.fields.filter(f=>f.unique && f.name!="so_ct").forEach(f=>{
1146
+ unique.push(f.name);
1147
+ })
1148
+ _newList = global.controllers[api_code.toUpperCase()];
1149
+ if(!_newList){
1150
+ //if(api_code=="moduleinfo") Logger.warn("[listinfo] create new API",api_code);
1151
+ if(Object.keys(sort).length===0) sort.date_created = -1;
1152
+ //create new model
1153
+ const require_id_app = (_listInfo.require_id_app!=false && _listInfo.require_id_app!="false");
1154
+
1155
+ _newModel = model.createModel(_listInfo);
1156
+ if(!_newModel){
1157
+ //Logger.warn("[listinfo] không thể tạo model",api_code);
1158
+ return;
1159
+ }
1160
+ _newList = new controller(router,_newModel,api_code.toLowerCase(),{
1161
+ sort: sort,
1162
+ unique:unique,
1163
+ notNeedRight:_listInfo.not_need_right,
1164
+ require_id_app,
1165
+ onView:(user,items,next)=>{
1166
+ next(null,items);
1167
+ //onView(_newList,_listInfo,user,items,next,options);
1168
+ },
1169
+ onCreating:async (user,data,next)=>{
1170
+ next(null,data);
1171
+ },
1172
+ onUpdating:async (user,data,obj,next)=>{
1173
+ next(null,data,obj);
1174
+ },
1175
+ onDeleting:async (user,obj,next)=>{
1176
+ next(null,obj);
1177
+ }
1178
+ })
1179
+ _newList.is_dynamic_list = true;
1180
+ _newList.dynamicDeletePosts ={};
1181
+ _newList.dynamicPosts ={};
1182
+ if(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0){
1183
+ //xoá post
1184
+ _newList.dynamicDeletePosts[_listInfo.code] = function(_listInfo,obj){
1185
+ return deletePost(_listInfo,obj);
1186
+ }
1187
+ _newList.dynamicDeletePost = async (obj)=>{
1188
+ return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
1189
+ }
1190
+ //tạo post
1191
+ _newList.dynamicPosts[_listInfo.code] = async function(obj, fn,options){
1192
+ if(_newList.post){
1193
+ _newList.post(obj, async function(e){
1194
+ if(e) return fn(e);
1195
+ try{
1196
+ let rs = await post(_listInfo,obj);
1197
+ fn(null,rs)
1198
+ }catch(e){
1199
+ fn(e.message || e.error || e)
1200
+ }
1201
+ },options)
1202
+ }else{
1203
+ try{
1204
+ let rs = await post(_listInfo,obj);
1205
+ fn(null,rs)
1206
+ }catch(e){
1207
+ fn(e.message || e.error || e)
1208
+ }
1209
+ }
1210
+ }
1211
+ _newList.dynamicPost = async (obj, fn,options)=>{
1212
+ _newList.dynamicPosts[_listInfo.code](obj, fn,options)
1213
+ }
1214
+ }
1215
+ _newList.route();
1216
+ }else{
1217
+ //if(api_code=="moduleinfo") Logger.warn("[listinfo] update API",api_code);
1218
+ //Logger.warn("update API",api_code);
1219
+ //update options
1220
+ if(Object.keys(sort).length>0) _newList.sort = _newList.options.sort = sort;
1221
+ //update model
1222
+ _newModel = _newList.model;
1223
+ model.updateModel(_listInfo,_newModel);
1224
+ //set new unique and view
1225
+ if(_newList.is_dynamic_list || !_newList.unique || _newList.unique.length===0 ){
1226
+ _newList.unique = _newList.options.unique=unique;
1227
+ }
1228
+ _newList.dynamicDeletePosts =_newList.dynamicDeletePosts || {};
1229
+ _newList.dynamicPosts =_newList.dynamicPosts || {};
1230
+ //Logger.warn("[listinfo] update api",_listInfo.code,api_code,(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0));
1231
+ if(_listInfo.fields && _listInfo.postinfos && _listInfo.postinfos.length>0){
1232
+ //xoá post
1233
+ _newList.dynamicDeletePosts[_listInfo.code] = function(_listInfo,obj){
1234
+ return deletePost(_listInfo,obj);
1235
+ }
1236
+ if(!_newList.dynamicDeletePost) _newList.dynamicDeletePost = async (obj)=>{
1237
+ return _newList.dynamicDeletePosts[_listInfo.code](_listInfo,obj)
1238
+ }
1239
+ //tạo post
1240
+ _newList.dynamicPosts[_listInfo.code] = async function(obj, fn,options){
1241
+ //Logger.warn("[listinfo] dynamicPost",_listInfo.code);
1242
+ if(_newList.post){
1243
+ _newList.post(obj, async function(e){
1244
+ if(e) return fn(e);
1245
+ try{
1246
+ let rs = await post(_listInfo,obj);
1247
+ fn(null,rs)
1248
+ }catch(e){
1249
+ fn(e.message || e.error || e)
1250
+ }
1251
+ },options)
1252
+ }else{
1253
+ try{
1254
+ let rs = await post(_listInfo,obj);
1255
+ fn(null,rs)
1256
+ }catch(e){
1257
+ fn(e.message || e.error || e)
1258
+ }
1259
+ }
1260
+ }
1261
+ if(!_newList.dynamicPost) _newList.dynamicPost = async (obj, fn,options)=>{
1262
+ _newList.dynamicPosts[_listInfo.code](obj, fn,options)
1263
+ }
1264
+ }else{
1265
+ _newList.dynamicPosts[_listInfo.code] = undefined
1266
+ _newList.dynamicDeletePosts[_listInfo.code] = undefined
1267
+ }
1268
+
1269
+ }
1270
+ //dynamic View handler
1271
+ _newList.dynamicViews = _newList.dynamicViews ||{};
1272
+ _newList.dynamicViews[_listInfo.code] = (user,items,next,options)=>{
1273
+ onView(_newList,_listInfo,user,items,next,options);
1274
+ }
1275
+ _newList.dynamicView = (user,items,next,options={})=>{
1276
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1277
+ if(_newList.dynamicViews[listinfo_code]){
1278
+ _newList.dynamicViews[listinfo_code](user,items,next,JSON.parse(JSON.stringify(options)));
1279
+ }else{
1280
+ next(null,items);
1281
+ }
1282
+ }
1283
+ //dynamic Creating handler
1284
+ _newList.dynamicFindings = _newList.dynamicFindings ||{};
1285
+ _newList.dynamicFindings[_listInfo.code] = (user,condition,next,options)=>{
1286
+ dynamicFinding(_listInfo,user,condition,next,options);
1287
+ }
1288
+ _newList.dynamicFinding = (user,condition,next,options={})=>{
1289
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1290
+ if(_newList.dynamicFindings[listinfo_code]){
1291
+ _newList.dynamicFindings[listinfo_code](user,condition,next,JSON.parse(JSON.stringify(options)));
1292
+ }else{
1293
+ next(null,condition);
1294
+ }
1295
+ }
1296
+ //dynamic Creating handler
1297
+ _newList.dynamicCreatings = _newList.dynamicCreatings ||{};
1298
+ _newList.dynamicCreatings[_listInfo.code] = (user,obj,next,options)=>{
1299
+ dynamicCreating(_listInfo,user,obj,next,options);
1300
+ }
1301
+ _newList.dynamicCreating = (user,obj,next,options={})=>{
1302
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1303
+ if(_newList.dynamicCreatings[listinfo_code]){
1304
+ _newList.dynamicCreatings[listinfo_code](user,obj,next,JSON.parse(JSON.stringify(options)));
1305
+ }else{
1306
+ next(null,obj);
1307
+ }
1308
+ }
1309
+
1310
+ //dynamic Created handler
1311
+ _newList.dynamicCreateds = _newList.dynamicCreateds ||{};
1312
+ _newList.dynamicCreateds[_listInfo.code] = (user,obj,next,options)=>{
1313
+ dynamicCreated(_listInfo,user,obj,next,options);
1314
+ }
1315
+ _newList.dynamicCreated = (user,obj,next,options={})=>{
1316
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1317
+ if(_newList.dynamicCreateds[listinfo_code]){
1318
+ _newList.dynamicCreateds[listinfo_code](user,obj,next,JSON.parse(JSON.stringify(options)));
1319
+ }else{
1320
+ next(null,obj);
1321
+ }
1322
+ }
1323
+ //dynamic Updating handler
1324
+ _newList.dynamicUpdatings = _newList.dynamicUpdatings ||{};
1325
+ _newList.dynamicUpdatings[_listInfo.code] = (user,data,obj,next,options)=>{
1326
+ dynamicUpdating(_listInfo,user,data,obj,next,options);
1327
+ }
1328
+ _newList.dynamicUpdating = (user,data,obj,next,options={})=>{
1329
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1330
+ //Logger.warn("[listinfo] [dynamicUpdating] chọn hàm xử lý updating...",listinfo_code);
1331
+ if(_newList.dynamicUpdatings[listinfo_code]){
1332
+ _newList.dynamicUpdatings[listinfo_code](user,data,obj,next,JSON.parse(JSON.stringify(options)));
1333
+ }else{
1334
+ next(null,data,obj);
1335
+ }
1336
+ }
1337
+ //dynamic Updated handler
1338
+ _newList.dynamicUpdateds = _newList.dynamicUpdateds ||{};
1339
+ _newList.dynamicUpdateds[_listInfo.code] = (user,obj,next,options)=>{
1340
+ dynamicUpdated(_listInfo,user,obj,next,options);
1341
+ }
1342
+ _newList.dynamicUpdated = (user,obj,next,options={})=>{
1343
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1344
+ if(_newList.dynamicUpdateds[listinfo_code]){
1345
+ _newList.dynamicUpdateds[listinfo_code](user,obj,next,JSON.parse(JSON.stringify(options)));
1346
+ }else{
1347
+ next(null,obj);
1348
+ }
1349
+ }
1350
+ //dynamic Deleting handler
1351
+ _newList.dynamicDeletings = _newList.dynamicDeletings ||{};
1352
+ _newList.dynamicDeletings[_listInfo.code] = (user,obj,next,options)=>{
1353
+ dynamicDeleting(_listInfo,user,obj,next,options);
1354
+ }
1355
+ _newList.dynamicDeleting = (user,obj,next,options={})=>{
1356
+ let listinfo_code = options.listinfo_code || _listInfo.api_code || _listInfo.code
1357
+ if(_newList.dynamicDeletings[listinfo_code]){
1358
+ _newList.dynamicDeletings[listinfo_code](user,obj,next,JSON.parse(JSON.stringify(options)));
1359
+ }else{
1360
+ next(null,obj);
1361
+ }
1362
+ }
1363
+ return _newList;
1364
+ }
1365
+ module.exports = model;