shutro-erp 0.3.4 → 0.3.6

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 (618) hide show
  1. package/dist/account_asset/.kosh/bindings.d.ts +22 -0
  2. package/dist/account_asset/.kosh/bindings.js +15 -0
  3. package/dist/account_asset/.kosh/schema.d.ts +1755 -0
  4. package/dist/account_asset/board.d.ts +61 -0
  5. package/dist/account_asset/board.js +86 -0
  6. package/dist/account_asset/books.d.ts +42 -0
  7. package/dist/account_asset/books.js +398 -0
  8. package/dist/account_asset/demo.d.ts +7 -0
  9. package/dist/account_asset/demo.js +72 -0
  10. package/dist/account_asset/index.d.ts +9 -0
  11. package/dist/account_asset/index.js +335 -0
  12. package/dist/account_asset/module.d.ts +7622 -0
  13. package/dist/account_asset/module.js +230 -0
  14. package/dist/account_budget/.kosh/bindings.d.ts +22 -0
  15. package/dist/account_budget/.kosh/bindings.js +15 -0
  16. package/dist/account_budget/.kosh/schema.d.ts +1767 -0
  17. package/dist/account_budget/budget.d.ts +5 -0
  18. package/dist/account_budget/budget.js +142 -0
  19. package/dist/account_budget/demo.d.ts +6 -0
  20. package/dist/account_budget/demo.js +30 -0
  21. package/dist/account_budget/index.d.ts +4 -0
  22. package/dist/account_budget/index.js +223 -0
  23. package/dist/account_budget/module.d.ts +13863 -0
  24. package/dist/account_budget/module.js +167 -0
  25. package/dist/account_portal/.kosh/bindings.js +1 -1
  26. package/dist/account_portal/.kosh/schema.d.ts +176 -6
  27. package/dist/account_portal/module.d.ts +505 -6
  28. package/dist/accounting/.kosh/bindings.js +1 -1
  29. package/dist/accounting/.kosh/schema.d.ts +176 -6
  30. package/dist/accounting/index.d.ts +1 -1
  31. package/dist/accounting/index.js +344 -4
  32. package/dist/accounting/module.d.ts +513 -5
  33. package/dist/accounting/module.js +55 -3
  34. package/dist/approvals/.kosh/bindings.d.ts +22 -0
  35. package/dist/approvals/.kosh/bindings.js +15 -0
  36. package/dist/approvals/.kosh/schema.d.ts +611 -0
  37. package/dist/approvals/index.d.ts +18 -0
  38. package/dist/approvals/index.js +302 -0
  39. package/dist/approvals/mails.d.ts +25 -0
  40. package/dist/approvals/mails.js +82 -0
  41. package/dist/approvals/module.d.ts +1 -0
  42. package/dist/approvals/module.js +12 -0
  43. package/dist/approvals/web/History.d.ts +4 -0
  44. package/dist/approvals/web/History.js +13 -0
  45. package/dist/approvals/web/Inbox.d.ts +9 -0
  46. package/dist/approvals/web/Inbox.js +114 -0
  47. package/dist/approvals/web/Mine.d.ts +7 -0
  48. package/dist/approvals/web/Mine.js +27 -0
  49. package/dist/approvals/web/index.d.ts +13 -0
  50. package/dist/approvals/web/index.js +22 -0
  51. package/dist/approvals/web/messages.d.ts +2 -0
  52. package/dist/approvals/web/messages.js +119 -0
  53. package/dist/approvals/web/shared.d.ts +59 -0
  54. package/dist/approvals/web/shared.js +46 -0
  55. package/dist/attendance/.kosh/bindings.d.ts +22 -0
  56. package/dist/attendance/.kosh/bindings.js +15 -0
  57. package/dist/attendance/.kosh/schema.d.ts +1048 -0
  58. package/dist/attendance/days.d.ts +96 -0
  59. package/dist/attendance/days.js +430 -0
  60. package/dist/attendance/demo.d.ts +7 -0
  61. package/dist/attendance/demo.js +58 -0
  62. package/dist/attendance/index.d.ts +4 -0
  63. package/dist/attendance/index.js +513 -0
  64. package/dist/attendance/module.d.ts +3969 -0
  65. package/dist/attendance/module.js +412 -0
  66. package/dist/attendance/routes.d.ts +16 -0
  67. package/dist/attendance/routes.js +266 -0
  68. package/dist/attendance/web/Check.d.ts +8 -0
  69. package/dist/attendance/web/Check.js +40 -0
  70. package/dist/attendance/web/Kiosk.d.ts +8 -0
  71. package/dist/attendance/web/Kiosk.js +62 -0
  72. package/dist/attendance/web/PinButton.d.ts +7 -0
  73. package/dist/attendance/web/PinButton.js +29 -0
  74. package/dist/attendance/web/index.d.ts +13 -0
  75. package/dist/attendance/web/index.js +22 -0
  76. package/dist/attendance/web/messages.d.ts +2 -0
  77. package/dist/attendance/web/messages.js +61 -0
  78. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  79. package/dist/calendar/.kosh/bindings.js +15 -0
  80. package/dist/calendar/.kosh/schema.d.ts +795 -0
  81. package/dist/calendar/demo.d.ts +6 -0
  82. package/dist/calendar/demo.js +24 -0
  83. package/dist/calendar/index.d.ts +3 -0
  84. package/dist/calendar/index.js +291 -0
  85. package/dist/calendar/module.d.ts +1705 -0
  86. package/dist/calendar/module.js +180 -0
  87. package/dist/cli/init.js +80 -0
  88. package/dist/cli/templates.d.ts +1 -1
  89. package/dist/cli/templates.js +226 -0
  90. package/dist/contacts/.kosh/bindings.js +1 -1
  91. package/dist/contacts/.kosh/schema.d.ts +78 -3
  92. package/dist/contacts/demo.js +30 -1
  93. package/dist/contacts/index.d.ts +1 -1
  94. package/dist/contacts/index.js +155 -9
  95. package/dist/contacts/module.d.ts +338 -2
  96. package/dist/contacts/module.js +93 -5
  97. package/dist/crm/.kosh/bindings.d.ts +22 -0
  98. package/dist/crm/.kosh/bindings.js +15 -0
  99. package/dist/crm/.kosh/schema.d.ts +800 -0
  100. package/dist/crm/demo.d.ts +6 -0
  101. package/dist/crm/demo.js +45 -0
  102. package/dist/crm/index.d.ts +3 -0
  103. package/dist/crm/index.js +361 -0
  104. package/dist/crm/module.d.ts +1845 -0
  105. package/dist/crm/module.js +208 -0
  106. package/dist/documents/.kosh/bindings.d.ts +22 -0
  107. package/dist/documents/.kosh/bindings.js +15 -0
  108. package/dist/documents/.kosh/schema.d.ts +862 -0
  109. package/dist/documents/demo.d.ts +6 -0
  110. package/dist/documents/demo.js +22 -0
  111. package/dist/documents/documents.d.ts +98 -0
  112. package/dist/documents/documents.js +318 -0
  113. package/dist/documents/index.d.ts +30 -0
  114. package/dist/documents/index.js +442 -0
  115. package/dist/documents/module.d.ts +2781 -0
  116. package/dist/documents/module.js +214 -0
  117. package/dist/documents/web/Versions.d.ts +7 -0
  118. package/dist/documents/web/Versions.js +45 -0
  119. package/dist/documents/web/index.d.ts +11 -0
  120. package/dist/documents/web/index.js +16 -0
  121. package/dist/documents/web/messages.d.ts +2 -0
  122. package/dist/documents/web/messages.js +21 -0
  123. package/dist/event/.kosh/bindings.d.ts +22 -0
  124. package/dist/event/.kosh/bindings.js +15 -0
  125. package/dist/event/.kosh/schema.d.ts +843 -0
  126. package/dist/event/demo.d.ts +6 -0
  127. package/dist/event/demo.js +65 -0
  128. package/dist/event/index.d.ts +14 -0
  129. package/dist/event/index.js +333 -0
  130. package/dist/event/mails.d.ts +15 -0
  131. package/dist/event/mails.js +112 -0
  132. package/dist/event/module.d.ts +2800 -0
  133. package/dist/event/module.js +323 -0
  134. package/dist/event/web/CheckInBox.d.ts +9 -0
  135. package/dist/event/web/CheckInBox.js +87 -0
  136. package/dist/event/web/index.d.ts +11 -0
  137. package/dist/event/web/index.js +16 -0
  138. package/dist/event/web/messages.d.ts +2 -0
  139. package/dist/event/web/messages.js +23 -0
  140. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  141. package/dist/event_account/.kosh/bindings.js +15 -0
  142. package/dist/event_account/.kosh/schema.d.ts +1758 -0
  143. package/dist/event_account/index.d.ts +3 -0
  144. package/dist/event_account/index.js +28 -0
  145. package/dist/event_account/module.d.ts +7114 -0
  146. package/dist/event_account/module.js +90 -0
  147. package/dist/expense/.kosh/bindings.d.ts +22 -0
  148. package/dist/expense/.kosh/bindings.js +15 -0
  149. package/dist/expense/.kosh/schema.d.ts +1299 -0
  150. package/dist/expense/demo.d.ts +7 -0
  151. package/dist/expense/demo.js +69 -0
  152. package/dist/expense/index.d.ts +3 -0
  153. package/dist/expense/index.js +495 -0
  154. package/dist/expense/module.d.ts +4747 -0
  155. package/dist/expense/module.js +647 -0
  156. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  157. package/dist/expense_account/.kosh/bindings.js +15 -0
  158. package/dist/expense_account/.kosh/schema.d.ts +1936 -0
  159. package/dist/expense_account/index.d.ts +3 -0
  160. package/dist/expense_account/index.js +74 -0
  161. package/dist/expense_account/module.d.ts +9153 -0
  162. package/dist/expense_account/module.js +318 -0
  163. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  164. package/dist/helpdesk/.kosh/bindings.js +15 -0
  165. package/dist/helpdesk/.kosh/schema.d.ts +885 -0
  166. package/dist/helpdesk/demo.d.ts +7 -0
  167. package/dist/helpdesk/demo.js +65 -0
  168. package/dist/helpdesk/hours.d.ts +17 -0
  169. package/dist/helpdesk/hours.js +94 -0
  170. package/dist/helpdesk/index.d.ts +10 -0
  171. package/dist/helpdesk/index.js +461 -0
  172. package/dist/helpdesk/module.d.ts +2940 -0
  173. package/dist/helpdesk/module.js +326 -0
  174. package/dist/helpdesk/routes.d.ts +12 -0
  175. package/dist/helpdesk/routes.js +132 -0
  176. package/dist/helpdesk/sla.d.ts +37 -0
  177. package/dist/helpdesk/sla.js +226 -0
  178. package/dist/hr/.kosh/bindings.d.ts +22 -0
  179. package/dist/hr/.kosh/bindings.js +15 -0
  180. package/dist/hr/.kosh/schema.d.ts +878 -0
  181. package/dist/hr/demo.d.ts +6 -0
  182. package/dist/hr/demo.js +60 -0
  183. package/dist/hr/index.d.ts +3 -0
  184. package/dist/hr/index.js +483 -0
  185. package/dist/hr/module.d.ts +2611 -0
  186. package/dist/hr/module.js +350 -0
  187. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  188. package/dist/l10n_bd/.kosh/schema.d.ts +176 -6
  189. package/dist/l10n_bd/module.d.ts +505 -6
  190. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  191. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  192. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2312 -0
  193. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  194. package/dist/l10n_bd_payroll/data.js +347 -0
  195. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  196. package/dist/l10n_bd_payroll/index.js +24 -0
  197. package/dist/l10n_bd_payroll/module.d.ts +12932 -0
  198. package/dist/l10n_bd_payroll/module.js +86 -0
  199. package/dist/l10n_in/.kosh/bindings.js +1 -1
  200. package/dist/l10n_in/.kosh/schema.d.ts +176 -6
  201. package/dist/l10n_in/module.d.ts +527 -7
  202. package/dist/mail/inbound/handle.js +6 -1
  203. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  204. package/dist/maintenance/.kosh/bindings.js +15 -0
  205. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  206. package/dist/maintenance/demo.d.ts +6 -0
  207. package/dist/maintenance/demo.js +60 -0
  208. package/dist/maintenance/index.d.ts +3 -0
  209. package/dist/maintenance/index.js +422 -0
  210. package/dist/maintenance/module.d.ts +3545 -0
  211. package/dist/maintenance/module.js +446 -0
  212. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  213. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  214. package/dist/maintenance_stock/.kosh/schema.d.ts +1446 -0
  215. package/dist/maintenance_stock/index.d.ts +9 -0
  216. package/dist/maintenance_stock/index.js +52 -0
  217. package/dist/maintenance_stock/module.d.ts +7675 -0
  218. package/dist/maintenance_stock/module.js +192 -0
  219. package/dist/modules-sdk/index.d.ts +1 -1
  220. package/dist/modules-sdk/manifest.d.ts +109 -2
  221. package/dist/modules-sdk/manifest.js +35 -1
  222. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  223. package/dist/mrp/.kosh/bindings.js +15 -0
  224. package/dist/mrp/.kosh/schema.d.ts +1453 -0
  225. package/dist/mrp/demo.d.ts +7 -0
  226. package/dist/mrp/demo.js +42 -0
  227. package/dist/mrp/index.d.ts +3 -0
  228. package/dist/mrp/index.js +393 -0
  229. package/dist/mrp/module.d.ts +9335 -0
  230. package/dist/mrp/module.js +757 -0
  231. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  232. package/dist/mrp_account/.kosh/bindings.js +15 -0
  233. package/dist/mrp_account/.kosh/schema.d.ts +2299 -0
  234. package/dist/mrp_account/index.d.ts +3 -0
  235. package/dist/mrp_account/index.js +22 -0
  236. package/dist/mrp_account/module.d.ts +23151 -0
  237. package/dist/mrp_account/module.js +123 -0
  238. package/dist/payment/.kosh/bindings.js +1 -1
  239. package/dist/payment/.kosh/schema.d.ts +178 -7
  240. package/dist/payment/index.d.ts +41 -0
  241. package/dist/payment/index.js +131 -74
  242. package/dist/payment/module.d.ts +569 -12
  243. package/dist/payment/module.js +19 -3
  244. package/dist/payment/settle.js +10 -1
  245. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  246. package/dist/payroll/.kosh/bindings.js +15 -0
  247. package/dist/payroll/.kosh/schema.d.ts +1390 -0
  248. package/dist/payroll/compute.d.ts +35 -0
  249. package/dist/payroll/compute.js +398 -0
  250. package/dist/payroll/demo.d.ts +55 -0
  251. package/dist/payroll/demo.js +121 -0
  252. package/dist/payroll/formula.d.ts +62 -0
  253. package/dist/payroll/formula.js +320 -0
  254. package/dist/payroll/index.d.ts +230 -0
  255. package/dist/payroll/index.js +713 -0
  256. package/dist/payroll/module.d.ts +9390 -0
  257. package/dist/payroll/module.js +606 -0
  258. package/dist/payroll/routes.d.ts +10 -0
  259. package/dist/payroll/routes.js +112 -0
  260. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  261. package/dist/payroll_account/.kosh/bindings.js +15 -0
  262. package/dist/payroll_account/.kosh/schema.d.ts +2308 -0
  263. package/dist/payroll_account/index.d.ts +3 -0
  264. package/dist/payroll_account/index.js +40 -0
  265. package/dist/payroll_account/module.d.ts +12396 -0
  266. package/dist/payroll_account/module.js +256 -0
  267. package/dist/permissions/approvals.d.ts +131 -9
  268. package/dist/permissions/approvals.js +662 -57
  269. package/dist/permissions/index.d.ts +1 -1
  270. package/dist/permissions/index.js +2 -2
  271. package/dist/permissions/models.js +191 -12
  272. package/dist/permissions/routes.d.ts +6 -1
  273. package/dist/permissions/routes.js +37 -4
  274. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  275. package/dist/permissions/web/ApprovalPanel.js +39 -13
  276. package/dist/permissions/web/index.d.ts +6 -4
  277. package/dist/permissions/web/index.js +13 -4
  278. package/dist/permissions/web/messages.d.ts +2 -0
  279. package/dist/permissions/web/messages.js +43 -0
  280. package/dist/portal/.kosh/bindings.js +1 -1
  281. package/dist/portal/.kosh/schema.d.ts +78 -3
  282. package/dist/portal/index.js +1 -1
  283. package/dist/portal/module.d.ts +166 -2
  284. package/dist/pos/.kosh/bindings.d.ts +22 -0
  285. package/dist/pos/.kosh/bindings.js +15 -0
  286. package/dist/pos/.kosh/schema.d.ts +1809 -0
  287. package/dist/pos/accounting.d.ts +10 -0
  288. package/dist/pos/accounting.js +149 -0
  289. package/dist/pos/demo.d.ts +6 -0
  290. package/dist/pos/demo.js +90 -0
  291. package/dist/pos/index.d.ts +9 -0
  292. package/dist/pos/index.js +353 -0
  293. package/dist/pos/module.d.ts +9783 -0
  294. package/dist/pos/module.js +423 -0
  295. package/dist/pos/routes.d.ts +39 -0
  296. package/dist/pos/routes.js +368 -0
  297. package/dist/pos/web/Register.d.ts +9 -0
  298. package/dist/pos/web/Register.js +252 -0
  299. package/dist/pos/web/index.d.ts +11 -0
  300. package/dist/pos/web/index.js +16 -0
  301. package/dist/pos/web/messages.d.ts +2 -0
  302. package/dist/pos/web/messages.js +87 -0
  303. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  304. package/dist/pos_stock/.kosh/bindings.js +15 -0
  305. package/dist/pos_stock/.kosh/schema.d.ts +2208 -0
  306. package/dist/pos_stock/index.d.ts +9 -0
  307. package/dist/pos_stock/index.js +35 -0
  308. package/dist/pos_stock/module.d.ts +12803 -0
  309. package/dist/pos_stock/module.js +115 -0
  310. package/dist/product/.kosh/bindings.js +1 -1
  311. package/dist/product/.kosh/schema.d.ts +52 -1
  312. package/dist/product/index.js +94 -4
  313. package/dist/product/module.d.ts +45 -1
  314. package/dist/product/module.js +11 -3
  315. package/dist/project/.kosh/bindings.js +1 -1
  316. package/dist/project/.kosh/schema.d.ts +725 -3
  317. package/dist/project/index.d.ts +3 -1
  318. package/dist/project/index.js +1045 -18
  319. package/dist/project/module.d.ts +10168 -458
  320. package/dist/project/module.js +1578 -14
  321. package/dist/project/routes.d.ts +44 -0
  322. package/dist/project/routes.js +314 -0
  323. package/dist/project/schedule.d.ts +72 -0
  324. package/dist/project/schedule.js +192 -0
  325. package/dist/project/web/Refresh.d.ts +8 -0
  326. package/dist/project/web/Refresh.js +29 -0
  327. package/dist/project/web/Schedule.d.ts +9 -0
  328. package/dist/project/web/Schedule.js +93 -0
  329. package/dist/project/web/Structure.d.ts +8 -0
  330. package/dist/project/web/Structure.js +86 -0
  331. package/dist/project/web/Workload.d.ts +8 -0
  332. package/dist/project/web/Workload.js +43 -0
  333. package/dist/project/web/index.d.ts +14 -0
  334. package/dist/project/web/index.js +25 -0
  335. package/dist/project/web/messages.d.ts +2 -0
  336. package/dist/project/web/messages.js +85 -0
  337. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  338. package/dist/project_account/.kosh/bindings.js +15 -0
  339. package/dist/project_account/.kosh/schema.d.ts +2241 -0
  340. package/dist/project_account/index.d.ts +3 -0
  341. package/dist/project_account/index.js +27 -0
  342. package/dist/project_account/module.d.ts +11539 -0
  343. package/dist/project_account/module.js +76 -0
  344. package/dist/project_portal/.kosh/bindings.js +1 -1
  345. package/dist/project_portal/.kosh/schema.d.ts +725 -3
  346. package/dist/project_portal/module.d.ts +5137 -119
  347. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  348. package/dist/project_purchase/.kosh/bindings.js +15 -0
  349. package/dist/project_purchase/.kosh/schema.d.ts +2320 -0
  350. package/dist/project_purchase/index.d.ts +9 -0
  351. package/dist/project_purchase/index.js +22 -0
  352. package/dist/project_purchase/module.d.ts +25147 -0
  353. package/dist/project_purchase/module.js +56 -0
  354. package/dist/purchase/.kosh/bindings.js +1 -1
  355. package/dist/purchase/.kosh/schema.d.ts +150 -6
  356. package/dist/purchase/index.js +163 -3
  357. package/dist/purchase/module.d.ts +228 -5
  358. package/dist/purchase/module.js +30 -3
  359. package/dist/purchase_account/.kosh/bindings.js +1 -1
  360. package/dist/purchase_account/.kosh/schema.d.ts +180 -8
  361. package/dist/purchase_account/index.js +27 -1
  362. package/dist/purchase_account/module.d.ts +591 -30
  363. package/dist/purchase_account/module.js +13 -2
  364. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  365. package/dist/purchase_portal/.kosh/schema.d.ts +150 -6
  366. package/dist/purchase_portal/module.d.ts +372 -6
  367. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  368. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  369. package/dist/purchase_stock/.kosh/schema.d.ts +1479 -0
  370. package/dist/purchase_stock/index.d.ts +7 -0
  371. package/dist/purchase_stock/index.js +98 -0
  372. package/dist/purchase_stock/module.d.ts +7535 -0
  373. package/dist/purchase_stock/module.js +380 -0
  374. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  375. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  376. package/dist/purchase_stock_account/.kosh/schema.d.ts +2155 -0
  377. package/dist/purchase_stock_account/index.d.ts +3 -0
  378. package/dist/purchase_stock_account/index.js +24 -0
  379. package/dist/purchase_stock_account/module.d.ts +38015 -0
  380. package/dist/purchase_stock_account/module.js +168 -0
  381. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  382. package/dist/recruitment/.kosh/bindings.js +15 -0
  383. package/dist/recruitment/.kosh/schema.d.ts +991 -0
  384. package/dist/recruitment/demo.d.ts +6 -0
  385. package/dist/recruitment/demo.js +45 -0
  386. package/dist/recruitment/index.d.ts +3 -0
  387. package/dist/recruitment/index.js +385 -0
  388. package/dist/recruitment/module.d.ts +3249 -0
  389. package/dist/recruitment/module.js +194 -0
  390. package/dist/recruitment/web/HireButton.d.ts +9 -0
  391. package/dist/recruitment/web/HireButton.js +32 -0
  392. package/dist/recruitment/web/index.d.ts +11 -0
  393. package/dist/recruitment/web/index.js +16 -0
  394. package/dist/recruitment/web/messages.d.ts +2 -0
  395. package/dist/recruitment/web/messages.js +19 -0
  396. package/dist/reporting/documents.d.ts +5 -0
  397. package/dist/reporting/documents.js +28 -1
  398. package/dist/reporting/index.d.ts +1 -1
  399. package/dist/reporting/index.js +4 -2
  400. package/dist/reporting/models.js +9 -0
  401. package/dist/reporting/overviews.d.ts +16 -0
  402. package/dist/reporting/overviews.js +56 -0
  403. package/dist/reporting/routes-documents.js +1 -1
  404. package/dist/reporting/routes.js +138 -80
  405. package/dist/reporting/web/DashboardView.d.ts +11 -0
  406. package/dist/reporting/web/DashboardView.js +2 -2
  407. package/dist/reporting/web/DesignerView.js +5 -0
  408. package/dist/reporting/web/Overview.d.ts +9 -0
  409. package/dist/reporting/web/Overview.js +53 -0
  410. package/dist/reporting/web/index.d.ts +1 -0
  411. package/dist/reporting/web/index.js +4 -1
  412. package/dist/reporting/web/messages.js +9 -0
  413. package/dist/sale_account/.kosh/bindings.js +1 -1
  414. package/dist/sale_account/.kosh/schema.d.ts +181 -6
  415. package/dist/sale_account/index.js +22 -1
  416. package/dist/sale_account/module.d.ts +639 -38
  417. package/dist/sale_portal/.kosh/bindings.js +1 -1
  418. package/dist/sale_portal/.kosh/schema.d.ts +59 -3
  419. package/dist/sale_portal/module.d.ts +435 -5
  420. package/dist/sale_project/.kosh/bindings.js +1 -1
  421. package/dist/sale_project/.kosh/schema.d.ts +732 -3
  422. package/dist/sale_project/module.d.ts +5349 -208
  423. package/dist/sale_project/module.js +17 -1
  424. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  425. package/dist/sale_stock/.kosh/bindings.js +15 -0
  426. package/dist/sale_stock/.kosh/schema.d.ts +1303 -0
  427. package/dist/sale_stock/index.d.ts +7 -0
  428. package/dist/sale_stock/index.js +84 -0
  429. package/dist/sale_stock/module.d.ts +7514 -0
  430. package/dist/sale_stock/module.js +146 -0
  431. package/dist/sales/.kosh/bindings.js +1 -1
  432. package/dist/sales/.kosh/schema.d.ts +59 -3
  433. package/dist/sales/index.js +195 -4
  434. package/dist/sales/module.d.ts +356 -3
  435. package/dist/sales/module.js +78 -3
  436. package/dist/server/api/metadata.d.ts +5 -0
  437. package/dist/server/api/metadata.js +5 -0
  438. package/dist/server/api/rest.js +64 -1
  439. package/dist/server/api/views.js +1 -0
  440. package/dist/server/app-settings.d.ts +7 -0
  441. package/dist/server/app-settings.js +10 -0
  442. package/dist/server/auth/base.js +9 -0
  443. package/dist/server/index.d.ts +1 -0
  444. package/dist/server/index.js +1 -0
  445. package/dist/settings/app-settings.d.ts +2 -0
  446. package/dist/settings/app-settings.js +518 -0
  447. package/dist/settings/index.d.ts +1 -0
  448. package/dist/settings/index.js +15 -0
  449. package/dist/settings/people.js +29 -5
  450. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  451. package/dist/settings/web/AppSettingsPage.js +210 -0
  452. package/dist/settings/web/OverviewPage.js +16 -3
  453. package/dist/settings/web/PeoplePage.js +20 -6
  454. package/dist/settings/web/index.d.ts +1 -0
  455. package/dist/settings/web/index.js +3 -0
  456. package/dist/settings/web/messages.js +118 -2
  457. package/dist/sign/.kosh/bindings.d.ts +22 -0
  458. package/dist/sign/.kosh/bindings.js +15 -0
  459. package/dist/sign/.kosh/schema.d.ts +990 -0
  460. package/dist/sign/index.d.ts +14 -0
  461. package/dist/sign/index.js +350 -0
  462. package/dist/sign/module.d.ts +4478 -0
  463. package/dist/sign/module.js +158 -0
  464. package/dist/sign/sign.d.ts +82 -0
  465. package/dist/sign/sign.js +474 -0
  466. package/dist/stock/.kosh/bindings.d.ts +22 -0
  467. package/dist/stock/.kosh/bindings.js +15 -0
  468. package/dist/stock/.kosh/schema.d.ts +1222 -0
  469. package/dist/stock/demo.d.ts +8 -0
  470. package/dist/stock/demo.js +82 -0
  471. package/dist/stock/index.d.ts +4 -0
  472. package/dist/stock/index.js +903 -0
  473. package/dist/stock/module.d.ts +7856 -0
  474. package/dist/stock/module.js +1880 -0
  475. package/dist/stock/replenish.d.ts +38 -0
  476. package/dist/stock/replenish.js +176 -0
  477. package/dist/stock/web/Replenishment.d.ts +8 -0
  478. package/dist/stock/web/Replenishment.js +84 -0
  479. package/dist/stock/web/ScanBox.d.ts +8 -0
  480. package/dist/stock/web/ScanBox.js +90 -0
  481. package/dist/stock/web/index.d.ts +13 -0
  482. package/dist/stock/web/index.js +20 -0
  483. package/dist/stock/web/messages.d.ts +2 -0
  484. package/dist/stock/web/messages.js +77 -0
  485. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  486. package/dist/stock_account/.kosh/bindings.js +15 -0
  487. package/dist/stock_account/.kosh/schema.d.ts +2068 -0
  488. package/dist/stock_account/index.d.ts +3 -0
  489. package/dist/stock_account/index.js +140 -0
  490. package/dist/stock_account/module.d.ts +11523 -0
  491. package/dist/stock_account/module.js +339 -0
  492. package/dist/storage/attachments.d.ts +5 -0
  493. package/dist/storage/attachments.js +12 -1
  494. package/dist/storage/models.js +3 -0
  495. package/dist/storage/routes.js +13 -2
  496. package/dist/todo/.kosh/bindings.d.ts +22 -0
  497. package/dist/todo/.kosh/bindings.js +15 -0
  498. package/dist/todo/.kosh/schema.d.ts +732 -0
  499. package/dist/todo/demo.d.ts +6 -0
  500. package/dist/todo/demo.js +35 -0
  501. package/dist/todo/index.d.ts +3 -0
  502. package/dist/todo/index.js +187 -0
  503. package/dist/todo/module.d.ts +1180 -0
  504. package/dist/todo/module.js +130 -0
  505. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  506. package/dist/trade_finance/.kosh/bindings.js +15 -0
  507. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  508. package/dist/trade_finance/demo.d.ts +6 -0
  509. package/dist/trade_finance/demo.js +63 -0
  510. package/dist/trade_finance/index.d.ts +3 -0
  511. package/dist/trade_finance/index.js +415 -0
  512. package/dist/trade_finance/module.d.ts +3779 -0
  513. package/dist/trade_finance/module.js +507 -0
  514. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  515. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  516. package/dist/trade_finance_account/.kosh/schema.d.ts +1830 -0
  517. package/dist/trade_finance_account/index.d.ts +3 -0
  518. package/dist/trade_finance_account/index.js +93 -0
  519. package/dist/trade_finance_account/module.d.ts +8074 -0
  520. package/dist/trade_finance_account/module.js +245 -0
  521. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  522. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  523. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1246 -0
  524. package/dist/trade_finance_purchase/index.d.ts +8 -0
  525. package/dist/trade_finance_purchase/index.js +50 -0
  526. package/dist/trade_finance_purchase/module.d.ts +4257 -0
  527. package/dist/trade_finance_purchase/module.js +44 -0
  528. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  529. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  530. package/dist/trade_finance_sale/.kosh/schema.d.ts +1072 -0
  531. package/dist/trade_finance_sale/index.d.ts +8 -0
  532. package/dist/trade_finance_sale/index.js +50 -0
  533. package/dist/trade_finance_sale/module.d.ts +4281 -0
  534. package/dist/trade_finance_sale/module.js +44 -0
  535. package/dist/ui/api.d.ts +2 -1
  536. package/dist/ui/api.js +2 -1
  537. package/dist/ui/app.js +26 -13
  538. package/dist/ui/components/AppIcon.js +30 -1
  539. package/dist/ui/components/primitives.d.ts +2 -0
  540. package/dist/ui/components/primitives.js +7 -1
  541. package/dist/ui/i18n/messages.d.ts +27 -0
  542. package/dist/ui/i18n/messages.js +46 -0
  543. package/dist/ui/index.d.ts +1 -0
  544. package/dist/ui/index.js +1 -0
  545. package/dist/ui/offline/queue.d.ts +5 -1
  546. package/dist/ui/offline/queue.js +2 -0
  547. package/dist/ui/registry.d.ts +5 -0
  548. package/dist/ui/shell/Home.js +55 -4
  549. package/dist/ui/views/FormView.js +102 -19
  550. package/dist/ui/views/KanbanView.d.ts +2 -0
  551. package/dist/ui/views/KanbanView.js +40 -3
  552. package/dist/ui/views/ListView.js +110 -11
  553. package/dist/ui/views/StatsRow.d.ts +14 -0
  554. package/dist/ui/views/StatsRow.js +88 -0
  555. package/dist/ui/views/widgets.d.ts +2 -1
  556. package/dist/ui/views/widgets.js +200 -1
  557. package/dist/views/builders.d.ts +19 -2
  558. package/dist/views/builders.js +21 -1
  559. package/dist/views/condition.d.ts +6 -0
  560. package/dist/views/condition.js +20 -0
  561. package/dist/views/documents.d.ts +8 -0
  562. package/dist/views/extend.d.ts +2 -2
  563. package/dist/views/extend.js +11 -1
  564. package/dist/views/index.d.ts +2 -2
  565. package/dist/views/index.js +2 -2
  566. package/dist/views/types.d.ts +52 -5
  567. package/dist/views/validate.js +39 -1
  568. package/dist/website/.kosh/bindings.d.ts +22 -0
  569. package/dist/website/.kosh/bindings.js +15 -0
  570. package/dist/website/.kosh/schema.d.ts +881 -0
  571. package/dist/website/demo.d.ts +6 -0
  572. package/dist/website/demo.js +115 -0
  573. package/dist/website/index.d.ts +9 -0
  574. package/dist/website/index.js +251 -0
  575. package/dist/website/module.d.ts +2987 -0
  576. package/dist/website/module.js +282 -0
  577. package/dist/website/render.d.ts +45 -0
  578. package/dist/website/render.js +102 -0
  579. package/dist/website/routes.d.ts +12 -0
  580. package/dist/website/routes.js +246 -0
  581. package/dist/website/web/PagePreview.d.ts +7 -0
  582. package/dist/website/web/PagePreview.js +33 -0
  583. package/dist/website/web/index.d.ts +11 -0
  584. package/dist/website/web/index.js +16 -0
  585. package/dist/website/web/messages.d.ts +2 -0
  586. package/dist/website/web/messages.js +15 -0
  587. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  588. package/dist/website_crm/.kosh/bindings.js +15 -0
  589. package/dist/website_crm/.kosh/schema.d.ts +967 -0
  590. package/dist/website_crm/index.d.ts +3 -0
  591. package/dist/website_crm/index.js +39 -0
  592. package/dist/website_crm/module.d.ts +2956 -0
  593. package/dist/website_crm/module.js +44 -0
  594. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  595. package/dist/website_sale/.kosh/bindings.js +15 -0
  596. package/dist/website_sale/.kosh/schema.d.ts +2284 -0
  597. package/dist/website_sale/couriers.d.ts +50 -0
  598. package/dist/website_sale/couriers.js +59 -0
  599. package/dist/website_sale/demo.d.ts +7 -0
  600. package/dist/website_sale/demo.js +90 -0
  601. package/dist/website_sale/growth.d.ts +31 -0
  602. package/dist/website_sale/growth.js +163 -0
  603. package/dist/website_sale/index.d.ts +49 -0
  604. package/dist/website_sale/index.js +538 -0
  605. package/dist/website_sale/module.d.ts +22027 -0
  606. package/dist/website_sale/module.js +397 -0
  607. package/dist/website_sale/shipments.d.ts +16 -0
  608. package/dist/website_sale/shipments.js +113 -0
  609. package/dist/website_sale/shop.d.ts +81 -0
  610. package/dist/website_sale/shop.js +649 -0
  611. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  612. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  613. package/dist/website_sale_stock/.kosh/schema.d.ts +2681 -0
  614. package/dist/website_sale_stock/index.d.ts +9 -0
  615. package/dist/website_sale_stock/index.js +20 -0
  616. package/dist/website_sale_stock/module.d.ts +24998 -0
  617. package/dist/website_sale_stock/module.js +28 -0
  618. package/package.json +200 -2
@@ -0,0 +1,323 @@
1
+ /**
2
+ * The data layer of Event Hub (RFC 0021): events with their sessions and ticket types, seats limited per event and
3
+ * per ticket, registrations confirmed while seats remain — else on a waiting list, promoted in order when a seat
4
+ * frees — and checked in once by their code (the QR on the ticket).
5
+ */
6
+ import { randomBytes } from 'node:crypto';
7
+ import { contactsShutro } from '../contacts/index.js';
8
+ import { messagingShutro } from '../messaging/index.js';
9
+ import { orm } from '../server/orm.js';
10
+ import { check, compute, defineModel, defineModule, f, method, records, } from './.kosh/bindings.js';
11
+ const ALL = ['read', 'write', 'create', 'unlink'];
12
+ const HOLDS = ['confirmed', 'attended'];
13
+ /** A registration's code: what its QR carries (unguessable, short enough to type). */
14
+ export const newCode = () => randomBytes(6).toString('hex').toUpperCase();
15
+ export const EventEvent = defineModel('event.event', {
16
+ label: 'Event',
17
+ recName: 'name',
18
+ order: ['dateBegin desc', 'id desc'],
19
+ companyScoped: { required: true },
20
+ tracking: ['state', 'dateBegin', 'seatsMax'],
21
+ access: {
22
+ 'event.user': ['read', 'write', 'create'],
23
+ 'event.manager': [...ALL, 'export', 'import'],
24
+ },
25
+ fields: {
26
+ name: f.char({ required: true }),
27
+ dateBegin: f.datetime({ required: true, label: 'Starts' }),
28
+ dateEnd: f.datetime({ required: true, label: 'Ends' }),
29
+ venue: f.char(),
30
+ organizer: f.many2one('res.users', {
31
+ default: (env) => env.userId,
32
+ ondelete: 'set null',
33
+ label: 'Organiser',
34
+ }),
35
+ /** 0: no limit. */
36
+ seatsMax: f.integer({ required: true, default: 0, label: 'Seats (0: no limit)' }),
37
+ waitingList: f.boolean({ default: true, label: 'Waiting list when full' }),
38
+ currency: f.many2one('res.currency', { ondelete: 'restrict' }),
39
+ tickets: f.one2many('event.ticket', 'event', { label: 'Tickets' }),
40
+ sessions: f.one2many('event.session', 'event'),
41
+ registrations: f.one2many('event.registration', 'event'),
42
+ seatsTaken: f.integer({
43
+ store: true,
44
+ label: 'Seats taken',
45
+ ...compute('event.event', 'seatsTaken', ['registrations.state'], (events) => {
46
+ for (const e of events)
47
+ e.seatsTaken = [...e.registrations].filter((r) => HOLDS.includes(r.state)).length;
48
+ }),
49
+ }),
50
+ seatsAvailable: f.integer({
51
+ store: true,
52
+ label: 'Seats left',
53
+ ...compute('event.event', 'seatsAvailable', ['seatsMax', 'seatsTaken'], (events) => {
54
+ for (const e of events)
55
+ e.seatsAvailable = e.seatsMax > 0 ? Math.max(0, e.seatsMax - (e.seatsTaken ?? 0)) : null;
56
+ }),
57
+ }),
58
+ attended: f.integer({
59
+ store: true,
60
+ label: 'Checked in',
61
+ ...compute('event.event', 'attended', ['registrations.state'], (events) => {
62
+ for (const e of events)
63
+ e.attended = [...e.registrations].filter((r) => r.state === 'attended').length;
64
+ }),
65
+ }),
66
+ description: f.text(),
67
+ state: f.state({
68
+ states: {
69
+ draft: 'Draft',
70
+ published: 'Open for registration',
71
+ done: 'Ended',
72
+ cancel: 'Cancelled',
73
+ },
74
+ initial: 'draft',
75
+ transitions: {
76
+ publish: { from: ['draft'], to: 'published' },
77
+ close: {
78
+ from: ['published'],
79
+ to: 'done',
80
+ // Those who came are thanked (the outbox: Event Hub's emails).
81
+ after: records('event.event', async (events) => {
82
+ for (const id of events.ids)
83
+ await events.env.emit('event.event.ended', { id });
84
+ }),
85
+ },
86
+ cancel: { from: ['draft', 'published'], to: 'cancel' },
87
+ redraft: { from: ['cancel'], to: 'draft' },
88
+ },
89
+ }),
90
+ },
91
+ sqlConstraints: {
92
+ seats: { check: orm.sql `seats_max >= 0`, message: 'Seats are a number, 0 for no limit.' },
93
+ dates: { check: orm.sql `date_end >= date_begin`, message: 'An event ends after it starts.' },
94
+ },
95
+ });
96
+ export const EventTicket = defineModel('event.ticket', {
97
+ label: 'Ticket type',
98
+ recName: 'name',
99
+ order: ['id asc'],
100
+ access: { 'event.user': ['read'], 'event.manager': ALL },
101
+ fields: {
102
+ event: f.many2one('event.event', { required: true, ondelete: 'cascade' }),
103
+ name: f.char({ required: true }),
104
+ price: f.decimal({ scale: 2, required: true, default: '0' }),
105
+ /** 0: no limit of its own. */
106
+ seatsMax: f.integer({ required: true, default: 0, label: 'Seats (0: no limit)' }),
107
+ /** The last day it is sold (empty: until the event). */
108
+ saleEnd: f.date({ label: 'Sold until' }),
109
+ registrations: f.one2many('event.registration', 'ticket'),
110
+ seatsTaken: f.integer({
111
+ store: true,
112
+ label: 'Sold',
113
+ ...compute('event.ticket', 'seatsTaken', ['registrations.state'], (tickets) => {
114
+ for (const t of tickets)
115
+ t.seatsTaken = [...t.registrations].filter((r) => HOLDS.includes(r.state)).length;
116
+ }),
117
+ }),
118
+ },
119
+ sqlConstraints: {
120
+ sensible: {
121
+ check: orm.sql `price >= 0 AND seats_max >= 0`,
122
+ message: 'A ticket has a price and seats that are not negative.',
123
+ },
124
+ },
125
+ });
126
+ export const EventSession = defineModel('event.session', {
127
+ label: 'Session',
128
+ recName: 'name',
129
+ order: ['dateBegin asc', 'id asc'],
130
+ access: { 'event.user': ['read'], 'event.manager': ALL },
131
+ fields: {
132
+ event: f.many2one('event.event', { required: true, ondelete: 'cascade' }),
133
+ name: f.char({ required: true }),
134
+ dateBegin: f.datetime({ required: true, label: 'Starts' }),
135
+ dateEnd: f.datetime({ required: true, label: 'Ends' }),
136
+ room: f.char(),
137
+ speaker: f.char(),
138
+ },
139
+ constraints: {
140
+ // A session happens during its event, and ends after it starts.
141
+ withinTheEvent: {
142
+ ...check('event.session', ['dateBegin', 'dateEnd', 'event'], async (sessions) => (await sessions.load({ event: true }))
143
+ .filter((s) => s.dateEnd < s.dateBegin ||
144
+ s.dateBegin < s.event.dateBegin ||
145
+ s.dateEnd > s.event.dateEnd)
146
+ .map((s) => s.id)),
147
+ message: 'A session happens during its event.',
148
+ },
149
+ },
150
+ });
151
+ /** Whether `registration` would find a seat (its event's and its ticket's), not counting itself. */
152
+ async function seatFor(env, registration) {
153
+ return env.asSuperuser({ reason: 'event seats' }, async (su) => {
154
+ const [event] = await su.model('event.event').browse([registration.event]).load({});
155
+ if (event === undefined)
156
+ return false;
157
+ const holding = async (where) => (await su.model('event.registration').search({
158
+ where: { ...where, state: { in: [...HOLDS] }, id: { ne: registration.id } },
159
+ })).length;
160
+ if (event.seatsMax > 0 && (await holding({ event: registration.event })) >= event.seatsMax)
161
+ return false;
162
+ if (registration.ticket !== null) {
163
+ const [ticket] = await su.model('event.ticket').browse([registration.ticket]).load({});
164
+ if (ticket !== undefined &&
165
+ ticket.seatsMax > 0 &&
166
+ (await holding({ ticket: registration.ticket })) >= ticket.seatsMax)
167
+ return false;
168
+ }
169
+ return true;
170
+ });
171
+ }
172
+ /** What follows a confirmed place: other apps' hook, and the confirmation email (through the outbox). */
173
+ async function placeConfirmed(env, ids) {
174
+ await env.model('event.registration').browse(ids).confirmed();
175
+ for (const id of ids)
176
+ await env.emit('event.registration.confirmed', { id });
177
+ }
178
+ /** Promotes the first waiting registrations of these events while seats are free (in the order they came). */
179
+ async function promoteWaiting(env, events) {
180
+ await env.asSuperuser({ reason: 'event waiting list' }, async (su) => {
181
+ for (const event of events) {
182
+ const waiting = await (await su.model('event.registration').search({
183
+ where: { event, state: 'waiting' },
184
+ order: ['id asc'],
185
+ })).load({});
186
+ for (const r of waiting) {
187
+ if (!(await seatFor(su, { id: r.id, event, ticket: r.ticket?.id ?? null })))
188
+ continue;
189
+ await su.model('event.registration').browse([r.id]).promote();
190
+ }
191
+ }
192
+ });
193
+ }
194
+ export const EventRegistration = defineModel('event.registration', {
195
+ label: 'Registration',
196
+ recName: 'name',
197
+ order: ['id desc'],
198
+ companyScoped: { required: true },
199
+ tracking: ['state'],
200
+ access: {
201
+ 'event.user': ['read', 'write', 'create'],
202
+ 'event.manager': [...ALL, 'export', 'import'],
203
+ },
204
+ fields: {
205
+ event: f.many2one('event.event', { required: true, ondelete: 'cascade' }),
206
+ ticket: f.many2one('event.ticket', { ondelete: 'restrict' }),
207
+ name: f.char({ required: true, label: 'Attendee' }),
208
+ email: f.char(),
209
+ phone: f.char(),
210
+ partner: f.many2one('res.partner', { ondelete: 'set null', label: 'Contact' }),
211
+ /** The attendee's language, for their emails. */
212
+ lang: f.selection({ en: 'English', bn: 'Bangla' }, { required: true, default: 'en', label: 'Language' }),
213
+ /** What the attendee's QR carries; checked in once with it. */
214
+ code: f.char({
215
+ required: true,
216
+ default: () => newCode(),
217
+ index: 'unique',
218
+ label: 'Check-in code',
219
+ }),
220
+ price: f.decimal({ scale: 2, default: '0' }),
221
+ checkedInAt: f.datetime({ label: 'Checked in at' }),
222
+ /** When the confirmation email went (once). */
223
+ confirmationSentAt: f.datetime({ label: 'Confirmation sent' }),
224
+ /** When the thanks went, after the event (once). */
225
+ thanksSentAt: f.datetime({ label: 'Thanks sent' }),
226
+ state: f.state({
227
+ states: {
228
+ draft: 'Draft',
229
+ confirmed: 'Confirmed',
230
+ waiting: 'Waiting list',
231
+ attended: 'Checked in',
232
+ cancel: 'Cancelled',
233
+ },
234
+ initial: 'draft',
235
+ transitions: {
236
+ confirm: {
237
+ from: ['draft'],
238
+ to: 'confirmed',
239
+ // Only while the event takes registrations and has a seat; a full event offers its waiting list.
240
+ guard: records('event.registration', async (registrations) => {
241
+ const env = registrations.env;
242
+ const refused = [];
243
+ for (const r of await registrations.load({ event: true, ticket: true })) {
244
+ const open = r.event.state === 'published';
245
+ const saleOver = r.ticket?.saleEnd != null && String(r.ticket.saleEnd) < String(env.today());
246
+ const seat = await seatFor(env, {
247
+ id: r.id,
248
+ event: r.event.id,
249
+ ticket: r.ticket?.id ?? null,
250
+ });
251
+ if (!open || saleOver || !seat)
252
+ refused.push(r.id);
253
+ }
254
+ return refused;
255
+ }),
256
+ message: 'No seat: the event is not open for registration, the ticket is no longer sold, or it is full (use the waiting list).',
257
+ after: records('event.registration', async (registrations) => {
258
+ for (const r of await registrations.load({ ticket: true }))
259
+ if (r.ticket !== null)
260
+ await r.write({ price: r.ticket.price });
261
+ await placeConfirmed(registrations.env, registrations.ids);
262
+ }),
263
+ },
264
+ wait: {
265
+ from: ['draft'],
266
+ to: 'waiting',
267
+ guard: records('event.registration', async (registrations) => (await registrations.load({ event: true })).filter((r) => !r.event.waitingList || r.event.state !== 'published')),
268
+ message: 'This event has no waiting list, or does not take registrations.',
269
+ },
270
+ /** A seat freed: the first waiting takes it. */
271
+ promote: {
272
+ from: ['waiting'],
273
+ to: 'confirmed',
274
+ after: records('event.registration', async (registrations) => {
275
+ for (const r of await registrations.load({ ticket: true }))
276
+ if (r.ticket !== null)
277
+ await r.write({ price: r.ticket.price });
278
+ await placeConfirmed(registrations.env, registrations.ids);
279
+ }),
280
+ },
281
+ attend: {
282
+ from: ['confirmed'],
283
+ to: 'attended',
284
+ after: records('event.registration', async (registrations) => {
285
+ await registrations.write({ checkedInAt: new Date() });
286
+ }),
287
+ },
288
+ cancel: {
289
+ from: ['draft', 'confirmed', 'waiting'],
290
+ to: 'cancel',
291
+ // A confirmed seat freed goes to the waiting list, in order.
292
+ after: records('event.registration', async (registrations) => {
293
+ const env = registrations.env;
294
+ const events = [...new Set([...(await registrations.load({})).map((r) => r.event.id)])];
295
+ await promoteWaiting(env, events);
296
+ }),
297
+ },
298
+ },
299
+ }),
300
+ },
301
+ methods: {
302
+ /** Runs once these registrations hold a confirmed place. Nothing here; `event_account` invoices them. */
303
+ confirmed: method('event.registration', async () => undefined),
304
+ },
305
+ constraints: {
306
+ ticketOfTheEvent: {
307
+ ...check('event.registration', ['ticket', 'event'], async (registrations) => (await registrations.load({ ticket: true }))
308
+ .filter((r) => r.ticket !== null && r.ticket.event.id !== r.event.id)
309
+ .map((r) => r.id)),
310
+ message: 'The ticket is for another event.',
311
+ },
312
+ },
313
+ });
314
+ export const eventShutro = defineModule({
315
+ name: 'event',
316
+ version: '0.1.0',
317
+ depends: [contactsShutro, messagingShutro],
318
+ groups: [
319
+ orm.defineGroup({ code: 'event.user', label: 'Event Hub user', implies: ['contacts.user'] }),
320
+ orm.defineGroup({ code: 'event.manager', label: 'Event Hub manager', implies: ['event.user'] }),
321
+ ],
322
+ models: [EventEvent, EventTicket, EventSession, EventRegistration],
323
+ });
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Check-in at the door (a node component of the event form): while the event is open, a code box — a scanner or the
3
+ * keyboard types into it, Enter checks in — and, where the browser reads codes, the phone's camera scanning the QR on
4
+ * the ticket. Each code goes to `POST /api/v1/eventhub/checkin`; the result (who, which ticket, or why not) is
5
+ * announced, and the form reloads its counts.
6
+ */
7
+ import { type NodeComponentProps } from '../../ui/index.js';
8
+ import { type ReactElement } from 'react';
9
+ export declare function CheckInBox({ api, record, reload }: NodeComponentProps): ReactElement | null;
@@ -0,0 +1,87 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Check-in at the door (a node component of the event form): while the event is open, a code box — a scanner or the
4
+ * keyboard types into it, Enter checks in — and, where the browser reads codes, the phone's camera scanning the QR on
5
+ * the ticket. Each code goes to `POST /api/v1/eventhub/checkin`; the result (who, which ticket, or why not) is
6
+ * announced, and the form reloads its counts.
7
+ */
8
+ import { Alert, Button, Input, Label } from '../../ui/index.js';
9
+ import { useEffect, useId, useRef, useState } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+ const readerClass = () => globalThis.BarcodeDetector;
12
+ export function CheckInBox({ api, record, reload }) {
13
+ const { t } = useTranslation('event');
14
+ const id = useId();
15
+ const [code, setCode] = useState('');
16
+ const [result, setResult] = useState(null);
17
+ const [error, setError] = useState(null);
18
+ const [camera, setCamera] = useState(false);
19
+ const video = useRef(null);
20
+ const last = useRef(null);
21
+ const send = async (value) => {
22
+ if (value.trim() === '')
23
+ return;
24
+ try {
25
+ const answer = await api.call('POST', '/api/v1/eventhub/checkin', { code: value.trim() });
26
+ setError(null);
27
+ setResult(t('checkin.done', { name: answer.name, ticket: answer.ticket ?? '' }));
28
+ setCode('');
29
+ reload();
30
+ }
31
+ catch (e) {
32
+ setResult(null);
33
+ setError(e instanceof Error ? e.message : String(e));
34
+ }
35
+ };
36
+ // The camera: a frame read every half second; the same code is taken once every three seconds.
37
+ // biome-ignore lint/correctness/useExhaustiveDependencies: restarts only when the camera is switched
38
+ useEffect(() => {
39
+ const Reader = readerClass();
40
+ if (!camera || Reader === undefined)
41
+ return;
42
+ let stream;
43
+ let timer;
44
+ const reader = new Reader();
45
+ void navigator.mediaDevices
46
+ .getUserMedia({ video: { facingMode: 'environment' } })
47
+ .then((s) => {
48
+ stream = s;
49
+ if (video.current === null)
50
+ return;
51
+ video.current.srcObject = s;
52
+ void video.current.play();
53
+ timer = setInterval(() => {
54
+ if (video.current === null)
55
+ return;
56
+ void reader.detect(video.current).then((codes) => {
57
+ const found = codes[0]?.rawValue;
58
+ if (found === undefined)
59
+ return;
60
+ const now = Date.now();
61
+ if (last.current?.code === found && now - last.current.at < 3000)
62
+ return;
63
+ last.current = { code: found, at: now };
64
+ void send(found);
65
+ });
66
+ }, 500);
67
+ })
68
+ .catch((e) => {
69
+ setError(e instanceof Error ? e.message : String(e));
70
+ setCamera(false);
71
+ });
72
+ return () => {
73
+ if (timer !== undefined)
74
+ clearInterval(timer);
75
+ for (const track of stream?.getTracks() ?? [])
76
+ track.stop();
77
+ };
78
+ }, [camera]);
79
+ if (record === null || record['state'] !== 'published')
80
+ return null;
81
+ return (_jsxs("section", { className: "grid gap-2 rounded-md border p-3", "aria-labelledby": `${id}-title`, children: [_jsx("h3", { id: `${id}-title`, className: "text-sm font-medium", children: t('checkin.title') }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("div", { className: "grid min-w-48 flex-1 gap-1", children: [_jsx(Label, { htmlFor: `${id}-code`, children: t('checkin.code') }), _jsx(Input, { id: `${id}-code`, value: code, autoComplete: "off", onChange: (e) => setCode(e.target.value), onKeyDown: (e) => {
82
+ if (e.key !== 'Enter')
83
+ return;
84
+ e.preventDefault();
85
+ void send(code);
86
+ } })] }), _jsx(Button, { type: "button", variant: "primary", onClick: () => void send(code), children: t('checkin.go') }), readerClass() === undefined ? null : (_jsx(Button, { type: "button", variant: "secondary", onClick: () => setCamera((c) => !c), children: camera ? t('checkin.stop') : t('checkin.camera') }))] }), camera ? (_jsx("video", { ref: video, className: "max-h-64 w-full rounded-md bg-black", playsInline: true, muted: true })) : null, _jsx("p", { "aria-live": "polite", className: "text-sm text-muted-foreground", children: result }), error === null ? null : _jsx(Alert, { tone: "danger", children: error })] }));
87
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * The web contribution of `shutro-erp/event`: check-in at the door (a scanner, the keyboard or the phone's camera).
4
+ */
5
+ import { type Registry } from '../../ui/index.js';
6
+ import type { i18n } from 'i18next';
7
+ import { messages } from './messages.js';
8
+ export { CheckInBox } from './CheckInBox.js';
9
+ /** Registers the component (and the messages in `i18n`, when given). */
10
+ export declare function registerEventWeb(registry: Registry, i18n?: i18n): Registry;
11
+ export { messages as eventMessages };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * The web contribution of `shutro-erp/event`: check-in at the door (a scanner, the keyboard or the phone's camera).
4
+ */
5
+ import { addMessages } from '../../ui/index.js';
6
+ import { CheckInBox } from './CheckInBox.js';
7
+ import { messages } from './messages.js';
8
+ export { CheckInBox } from './CheckInBox.js';
9
+ /** Registers the component (and the messages in `i18n`, when given). */
10
+ export function registerEventWeb(registry, i18n) {
11
+ registry.registerComponent('event.CheckIn', CheckInBox);
12
+ if (i18n !== undefined)
13
+ addMessages(i18n, 'event', messages);
14
+ return registry;
15
+ }
16
+ export { messages as eventMessages };
@@ -0,0 +1,2 @@
1
+ /** Messages of the Event Hub screens (namespace `event`), in English and Bangla. */
2
+ export declare const messages: Readonly<Record<string, object>>;
@@ -0,0 +1,23 @@
1
+ /** Messages of the Event Hub screens (namespace `event`), in English and Bangla. */
2
+ export const messages = {
3
+ en: {
4
+ checkin: {
5
+ title: 'Check-in',
6
+ code: 'Ticket code',
7
+ go: 'Check in',
8
+ camera: 'Scan with the camera',
9
+ stop: 'Stop the camera',
10
+ done: '{{name}} checked in {{ticket}}',
11
+ },
12
+ },
13
+ bn: {
14
+ checkin: {
15
+ title: 'চেক-ইন',
16
+ code: 'টিকিট কোড',
17
+ go: 'চেক-ইন করুন',
18
+ camera: 'ক্যামেরায় স্ক্যান করুন',
19
+ stop: 'ক্যামেরা বন্ধ করুন',
20
+ done: '{{name}} চেক-ইন হয়েছে {{ticket}}',
21
+ },
22
+ },
23
+ };
@@ -0,0 +1,22 @@
1
+ export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
2
+ import { type DefinitionHelpers } from '../../server/orm.js';
3
+ import type { DefaultLoaded, Env as CoreEnv, RecordSet as CoreRecordSet, Shutro as CoreShutro } from '../../server/orm.js';
4
+ import type { SchemaView } from './schema.js';
5
+ export type { SchemaView };
6
+ /** Every model visible in this view. */
7
+ export type ModelName = keyof SchemaView & string;
8
+ /** `Env` typed to this view. */
9
+ export type Env = CoreEnv<SchemaView>;
10
+ /** `Shutro` typed to this view. */
11
+ export type Shutro = CoreShutro<SchemaView>;
12
+ /** A recordset of `M`, with the default loaded shape unless `L` is given. */
13
+ export type Records<M extends ModelName, L = DefaultLoaded<SchemaView, M>> = CoreRecordSet<SchemaView, M, L>;
14
+ export declare const compute: DefinitionHelpers<SchemaView>['compute'];
15
+ export declare const check: DefinitionHelpers<SchemaView>['check'];
16
+ export declare const onchange: DefinitionHelpers<SchemaView>['onchange'];
17
+ export declare const records: DefinitionHelpers<SchemaView>['records'];
18
+ export declare const method: DefinitionHelpers<SchemaView>['method'];
19
+ /** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
20
+ export declare const record: DefinitionHelpers<SchemaView>['record'];
21
+ export declare const override: DefinitionHelpers<SchemaView>['override'];
22
+ export declare const ref: DefinitionHelpers<SchemaView>['ref'];
@@ -0,0 +1,15 @@
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 0f41dee2e33036c2
2
+ // Bindings of module `event_account`: import the definition API from here to get types scoped to what it can see.
3
+ export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
+ import { definitions } from '../../server/orm.js';
5
+ /** Definition callbacks typed against this module's view: no casts in computes, checks, onchange, methods. */
6
+ const helpers = definitions();
7
+ export const compute = helpers.compute;
8
+ export const check = helpers.check;
9
+ export const onchange = helpers.onchange;
10
+ export const records = helpers.records;
11
+ export const method = helpers.method;
12
+ /** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
13
+ export const record = helpers.record;
14
+ export const override = helpers.override;
15
+ export const ref = helpers.ref;