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,192 @@
1
+ /**
2
+ * The data layer of the Asset Care ↔ Stockroom bridge (RFC 0021, Asset Care step 2): a maintenance order lists the
3
+ * spare parts it uses; starting it reserves them in a transfer from the main stock to the Maintenance location,
4
+ * finishing it consumes them (refused while some are short), cancelling it releases them. Parts cost what they cost
5
+ * in stock; with `stock_account` they leave Inventory as a stock adjustment.
6
+ */
7
+ import { maintenanceShutro } from '../maintenance/index.js';
8
+ import { productShutro } from '../product/index.js';
9
+ import { orm } from '../server/orm.js';
10
+ import { defaultLocations, inProductUnit, stockShutro } from '../stock/index.js';
11
+ import { compute, defineModel, defineModule, extendModel, f, onchange, record, } from './.kosh/bindings.js';
12
+ const zero = orm.toDecimal(0);
13
+ export const MaintenancePart = defineModel('maintenance.request.part', {
14
+ label: 'Spare part',
15
+ order: ['id asc'],
16
+ access: {
17
+ 'maintenance.user': ['read', 'write', 'create', 'unlink'],
18
+ 'maintenance.manager': ['read', 'write', 'create', 'unlink', 'export'],
19
+ },
20
+ fields: {
21
+ request: f.many2one('maintenance.request', { required: true, ondelete: 'cascade' }),
22
+ product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
23
+ quantity: f.decimal({ scale: 4, required: true, default: '1' }),
24
+ uom: f.many2one('uom.uom', { label: 'Unit' }),
25
+ /** The quantity at the product's cost (in the product's unit). */
26
+ cost: f.decimal({
27
+ scale: 2,
28
+ store: true,
29
+ label: 'Cost',
30
+ ...compute('maintenance.request.part', 'cost', [
31
+ 'quantity',
32
+ 'uom.ratio',
33
+ 'uom.category',
34
+ 'uom.name',
35
+ 'uom.rounding',
36
+ 'product.standardPrice',
37
+ 'product.uom.ratio',
38
+ 'product.uom.category',
39
+ 'product.uom.name',
40
+ 'product.uom.rounding',
41
+ ], (parts) => {
42
+ for (const p of parts)
43
+ p.cost = inProductUnit(p.quantity, p.uom ?? null, p.product.uom ?? null)
44
+ .times(p.product.standardPrice)
45
+ .toDecimalPlaces(2);
46
+ }),
47
+ }),
48
+ },
49
+ onchange: {
50
+ product: onchange('maintenance.request.part', async (d) => {
51
+ const p = await d.record('product');
52
+ if (p?.uom)
53
+ d.set('uom', p.uom.id);
54
+ }),
55
+ },
56
+ sqlConstraints: {
57
+ positive: { check: orm.sql `quantity > 0`, message: 'A part is used in a positive quantity.' },
58
+ },
59
+ });
60
+ export const RequestParts = extendModel('maintenance.request', {
61
+ fields: {
62
+ parts: f.one2many('maintenance.request.part', 'request', { label: 'Spare parts' }),
63
+ partsTransfer: f.many2one('stock.picking', { ondelete: 'set null', label: 'Parts transfer' }),
64
+ partsCost: f.decimal({
65
+ scale: 2,
66
+ store: true,
67
+ label: 'Parts cost',
68
+ ...compute('maintenance.request', 'partsCost', ['parts.cost'], (requests) => {
69
+ for (const r of requests)
70
+ r.partsCost = [...r.parts].reduce((s, p) => s.plus(p.cost ?? zero), zero);
71
+ }),
72
+ }),
73
+ },
74
+ overrides: {
75
+ started: async function (next) {
76
+ await next();
77
+ await reserveParts(this);
78
+ },
79
+ finishing: async function (next) {
80
+ await next();
81
+ await consumeParts(this);
82
+ },
83
+ cancelled: async function (next) {
84
+ await next();
85
+ await releaseParts(this);
86
+ },
87
+ },
88
+ });
89
+ /** The orders' parts transfers (made when missing), reserved; as the system (technicians need no stock rights). */
90
+ async function reserveParts(requests) {
91
+ const env = requests.env;
92
+ await env.asSuperuser({ reason: 'maintenance parts' }, async (su) => {
93
+ const maintenance = (await su
94
+ .model('stock.location')
95
+ .search({ where: { usage: 'adjustment', name: 'Maintenance' }, limit: 1 })).ids[0];
96
+ if (maintenance === undefined)
97
+ return;
98
+ for (const r of await su
99
+ .model('maintenance.request')
100
+ .browse(requests.ids)
101
+ .load({ parts: true, partsTransfer: true })) {
102
+ if (r.parts.length === 0)
103
+ continue;
104
+ const transfer = r.partsTransfer;
105
+ if (transfer === null || transfer.state === 'cancel') {
106
+ const from = (await defaultLocations(su, 'internal', null, r.company.id)).source;
107
+ if (from === null)
108
+ continue;
109
+ const made = await su.model('stock.picking').create([
110
+ {
111
+ kind: 'adjustment',
112
+ company: r.company.id,
113
+ source: from,
114
+ destination: maintenance,
115
+ origin: r.name,
116
+ moves: {
117
+ create: [...r.parts].map((p) => ({
118
+ product: p.product.id,
119
+ quantity: p.quantity,
120
+ uom: p.uom?.id ?? null,
121
+ })),
122
+ },
123
+ },
124
+ ]);
125
+ await made.confirm();
126
+ await su
127
+ .model('maintenance.request')
128
+ .browse([r.id])
129
+ .write({ partsTransfer: made.ids[0] ?? null });
130
+ continue;
131
+ }
132
+ if (transfer.state === 'confirmed')
133
+ await su.model('stock.picking').browse([transfer.id]).reserve();
134
+ }
135
+ });
136
+ }
137
+ /** The parts consumed: their transfer validated, refused while some are short. */
138
+ async function consumeParts(requests) {
139
+ await reserveParts(requests);
140
+ const env = requests.env;
141
+ await env.asSuperuser({ reason: 'maintenance parts used' }, async (su) => {
142
+ for (const r of await su
143
+ .model('maintenance.request')
144
+ .browse(requests.ids)
145
+ .load({ partsTransfer: { moves: { product: true } } })) {
146
+ const t = r.partsTransfer;
147
+ if (t === null || t.state === 'done' || t.state === 'cancel')
148
+ continue;
149
+ if (t.availability !== 'full') {
150
+ const short = [...t.moves]
151
+ .filter((m) => (m.reserved ?? zero).lt(m.productQty ?? zero))
152
+ .map((m) => `${m.product.name} (${(m.productQty ?? zero).minus(m.reserved ?? zero).toString()})`);
153
+ throw new orm.ValidationError('maintenance.request', ['parts'], `Parts are short: ${short.join(', ')}.`, 'Wait for them to come in, or use fewer.');
154
+ }
155
+ await su.model('stock.picking').browse([t.id]).validate();
156
+ }
157
+ });
158
+ }
159
+ /** The parts released: their transfer cancelled. */
160
+ async function releaseParts(requests) {
161
+ const env = requests.env;
162
+ await env.asSuperuser({ reason: 'maintenance parts released' }, async (su) => {
163
+ for (const r of await su
164
+ .model('maintenance.request')
165
+ .browse(requests.ids)
166
+ .load({ partsTransfer: true })) {
167
+ const t = r.partsTransfer;
168
+ if (t !== null && (t.state === 'draft' || t.state === 'confirmed'))
169
+ await su
170
+ .model('stock.picking')
171
+ .browse([t.id])
172
+ .cancel();
173
+ }
174
+ });
175
+ }
176
+ export const maintenanceStockShutro = defineModule({
177
+ name: 'maintenance_stock',
178
+ version: '0.1.0',
179
+ depends: [maintenanceShutro, stockShutro, productShutro],
180
+ groups: [
181
+ orm.defineGroup({
182
+ code: 'maintenance_stock.user',
183
+ label: 'Maintenance with spare parts',
184
+ implies: ['maintenance.user', 'product.user'],
185
+ }),
186
+ ],
187
+ models: [MaintenancePart],
188
+ extensions: [RequestParts],
189
+ data: [
190
+ record('stock.location', 'location_maintenance', { name: 'Maintenance', usage: 'adjustment', company: null }, { noupdate: true }),
191
+ ],
192
+ });
@@ -6,5 +6,5 @@ export { type AppChange, type AppPlan, AppPlanError, type AppReason, type AppSta
6
6
  export { idByName, maybeIdByName } from './demo.js';
7
7
  export { ModuleDefinitionError, ModuleLoadError } from './errors.js';
8
8
  export { type LoadedModules, type LoadOptions, loadModules } from './loader.js';
9
- export { type AccessLevel, type ApprovalLevelSpec, type ApprovalSpec, type AppSpec, type AutomationActionSpec, type AutomationRuleSpec, type DemoContext, type DemoUser, type DocumentSpec, defineModule, type EventSpec, type ImportTemplateSpec, type InboundAliasSpec, type InboundCall, type InboundWebhookSpec, type KoshModule, type LocalizationSpec, type MenuSpec, type ModuleHooks, type ModuleInput, type PortalActionSpec, type PortalDocumentSpec, type ShutroModuleShape, } from './manifest.js';
9
+ export { type AccessLevel, type ApprovalLevelSpec, type ApprovalSpec, type AppSpec, type AutomationActionSpec, type AutomationRuleSpec, type DemoContext, type DemoUser, type DocumentSpec, defineModule, type EventSpec, type ImportTemplateSpec, type InboundAliasSpec, type InboundCall, type InboundWebhookSpec, type KoshModule, type LocalizationSpec, type MenuSpec, type ModuleHooks, type ModuleInput, type PortalActionSpec, type PortalDocumentSpec, type SettingFieldSpec, type SettingsSectionSpec, type SettingsSpec, type ShutroModuleShape, type StandardWaiver, } from './manifest.js';
10
10
  export { compareVersions, satisfies } from './semver.js';
@@ -57,8 +57,17 @@ export interface ApprovalLevelSpec {
57
57
  readonly name: string;
58
58
  /** A Shutro domain on the record (e.g. `{ amountTotal: { gt: '500000' } }`); empty or omitted: always. */
59
59
  readonly condition?: Readonly<Record<string, unknown>>;
60
- /** The group or role whose holders (in the record's company) decide. */
60
+ /**
61
+ * The group or role whose holders (in the record's company) decide; with `approver`, the role used when there is
62
+ * nobody (no manager, an empty field).
63
+ */
61
64
  readonly approverRole: string;
65
+ /** Decided by the requester's manager (Workforce), or the person in a field of the record (RFC 0025). */
66
+ readonly approver?: 'manager' | {
67
+ readonly field: string;
68
+ };
69
+ /** How many decide: any one (default), all of them, or a number. */
70
+ readonly quorum?: 'any' | 'all' | number;
62
71
  }
63
72
  /** A default approval policy of a model. */
64
73
  export interface ApprovalSpec {
@@ -69,6 +78,12 @@ export interface ApprovalSpec {
69
78
  readonly onApproved?: string;
70
79
  /** A transition run when a level rejects. */
71
80
  readonly onRejected?: string;
81
+ /** A transition run when an approver sends the record back for changes. */
82
+ readonly onSentBack?: string;
83
+ /** A transition run when the requester withdraws the request. */
84
+ readonly onWithdrawn?: string;
85
+ /** A rejection or a sending back must say why (default: yes). */
86
+ readonly reasonRequired?: boolean;
72
87
  }
73
88
  /**
74
89
  * An automation rule a module ships (RFC 0011, RFC 0012 §5.1): installed by the Automation app as a rule owned by
@@ -297,7 +312,14 @@ export interface InboundAliasSpec {
297
312
  readonly subjectField: string;
298
313
  /** The field that takes the message text, when any. */
299
314
  readonly bodyField?: string;
300
- readonly defaults?: Readonly<Record<string, unknown>> | ((env: unknown) => Promise<Readonly<Record<string, unknown>> | null>);
315
+ /**
316
+ * The new record's values: fixed, or from the system scope and the sender (a helpdesk ticket names its customer by
317
+ * the sender's address); `null` quarantines the message.
318
+ */
319
+ readonly defaults?: Readonly<Record<string, unknown>> | ((env: unknown, sender: {
320
+ readonly address: string;
321
+ readonly name: string | null;
322
+ }) => Promise<Readonly<Record<string, unknown>> | null>);
301
323
  }
302
324
  /** An action a module offers to automation rules (RFC 0011 §5.3). */
303
325
  export interface AutomationActionSpec {
@@ -415,12 +437,16 @@ export interface ModuleInput {
415
437
  readonly events?: readonly EventSpec[];
416
438
  /** Endpoints the module receives calls on from outside (RFC 0017 §5.4). */
417
439
  readonly inboundWebhooks?: readonly InboundWebhookSpec[];
440
+ /** The app's own settings, shown in Settings › App settings (RFC 0020). */
441
+ readonly settings?: SettingsSpec;
418
442
  /** What the module shows in the customer and vendor portal (RFC 0015), when `portal` is installed. */
419
443
  readonly portal?: {
420
444
  readonly documents: readonly PortalDocumentSpec[];
421
445
  };
422
446
  /** Import templates for the module's models (RFC 0014 §5.4), offered when `import` is installed. */
423
447
  readonly importTemplates?: readonly ImportTemplateSpec[];
448
+ /** The app's overview page: KPIs, charts and lists on its first menu (RFC 0022 §3.2). Needs `reporting`. */
449
+ readonly overview?: OverviewSpec;
424
450
  /**
425
451
  * Server routes of this module (admin APIs, custom endpoints). Called once at startup with the server context
426
452
  * (`ModuleContext` of `shutro-erp`); typed by the server, so modules declare the parameter type they use.
@@ -429,8 +455,89 @@ export interface ModuleInput {
429
455
  readonly hooks?: ModuleHooks;
430
456
  /** Translations per locale, loaded lazily. */
431
457
  readonly i18n?: Readonly<Record<string, () => Promise<unknown>>>;
458
+ /**
459
+ * Exceptions to the module standard (RFC 0023), each with its reason: `pnpm lint` (`scripts/check-modules.ts`)
460
+ * refuses a module that breaks an enforced rule for a model it has not waived here.
461
+ */
462
+ readonly standard?: {
463
+ readonly waive: readonly StandardWaiver[];
464
+ };
465
+ }
466
+ /** A rule of the module standard a module does not meet for one model (or at all), and why. */
467
+ export interface StandardWaiver {
468
+ /** The rule's code (`M2`, `V1`, `P1`…), as RFC 0023 §3 names them. */
469
+ readonly rule: string;
470
+ /** The model the waiver is for; none: the whole module. */
471
+ readonly model?: string;
472
+ readonly reason: string;
473
+ }
474
+ /**
475
+ * A card of an app's overview (RFC 0022 §3.2): a live report query within the viewer's rules — a KPI (with the
476
+ * change against the previous period or last year), a chart, a small pivot, or the top records.
477
+ */
478
+ export interface OverviewCardSpec {
479
+ readonly id: string;
480
+ readonly title: string;
481
+ readonly kind: 'kpi' | 'chart' | 'pivot' | 'list';
482
+ readonly model: string;
483
+ /** `count`, or `op:field` (`sum:amountTotal`, `avg:amountTotal`). */
484
+ readonly measure: string;
485
+ readonly groupBy?: string;
486
+ readonly filter?: Readonly<Record<string, unknown>>;
487
+ /** KPIs: this month against the previous one, or the same month last year, over this date field. */
488
+ readonly comparison?: {
489
+ readonly field: string;
490
+ readonly mode: 'previous' | 'yoy';
491
+ };
492
+ readonly chart?: 'bar' | 'line' | 'area' | 'pie';
493
+ /** Width in twelfths of the page. */
494
+ readonly w: 3 | 4 | 6 | 12;
495
+ }
496
+ /**
497
+ * An app's overview page (RFC 0022 §3.2): installed by `reporting` as a shared dashboard keyed by the module, and
498
+ * opened by the app's first menu (`<module>.action_overview`, generated). The module depends on `reporting`.
499
+ */
500
+ export interface OverviewSpec {
501
+ readonly cards: readonly OverviewCardSpec[];
432
502
  }
433
503
  /** A defined module: frozen, with its name and version taken from the Shutro module. */
504
+ /**
505
+ * A setting (RFC 0020 §3.1). In a `company` section, `key` names a `res.company` field the module adds with
506
+ * `extendModel`: its type, label and default come from the field; `help`, bounds and `visibleWhen` add to it. In an
507
+ * `installation` section, the setting is a key / value of its own: `type` and `label` are required.
508
+ */
509
+ export interface SettingFieldSpec {
510
+ readonly key: string;
511
+ readonly type?: 'boolean' | 'integer' | 'decimal' | 'char' | 'text' | 'selection' | 'date';
512
+ readonly label?: string;
513
+ readonly help?: string;
514
+ readonly default?: string | number | boolean | null;
515
+ readonly min?: number;
516
+ readonly max?: number;
517
+ /** Selection options (installation settings): value → label. */
518
+ readonly options?: Readonly<Record<string, string>>;
519
+ /** Shown only when another setting of the section has this value. */
520
+ readonly visibleWhen?: {
521
+ readonly key: string;
522
+ readonly equals: string | number | boolean;
523
+ };
524
+ }
525
+ /** A section of an app's settings (RFC 0020 §3.1). */
526
+ export interface SettingsSectionSpec {
527
+ readonly key: string;
528
+ readonly label: string;
529
+ readonly description?: string;
530
+ /** Words the Settings search also finds it by. */
531
+ readonly keywords?: string;
532
+ /** Per company (`res.company` fields) or for the whole installation. */
533
+ readonly scope: 'company' | 'installation';
534
+ /** Groups whose holders may change it; Administrators always may. Empty: administrators only. */
535
+ readonly editors?: readonly string[];
536
+ readonly fields: readonly SettingFieldSpec[];
537
+ }
538
+ export interface SettingsSpec {
539
+ readonly sections: readonly SettingsSectionSpec[];
540
+ }
434
541
  export interface KoshModule extends Omit<ModuleInput, 'depends'> {
435
542
  readonly name: string;
436
543
  readonly version: string;
@@ -95,12 +95,46 @@ export function defineModule(input) {
95
95
  if (template.columns.length === 0)
96
96
  fail(`import template '${template.key}' has no columns.`, 'List the columns of the file.');
97
97
  }
98
+ // The overview (RFC 0022 §3.2): an action and a menu of its own, generated; reporting installs the dashboard.
99
+ const overviewActions = {};
100
+ const overviewMenus = [];
101
+ if (input.overview !== undefined) {
102
+ if (input.app === undefined)
103
+ fail('declares an overview without an app.', 'An overview is the first page of an app.');
104
+ if (!(input.depends ?? []).some((d) => d.name === 'reporting'))
105
+ fail('declares an overview without depending on reporting.', "Add `reporting` (from '../reporting/index.js') to `depends`.");
106
+ if (input.overview.cards.length === 0)
107
+ fail('declares an overview with no cards.', 'Give at least one KPI, chart, pivot or list card.');
108
+ const cardIds = new Set();
109
+ for (const card of input.overview.cards) {
110
+ if (!LEVEL.test(card.id) || cardIds.has(card.id))
111
+ fail(`overview card id '${card.id}' is not a unique snake_case name.`, "Use e.g. id: 'sales_month'.");
112
+ cardIds.add(card.id);
113
+ if (!/^(count|(sum|avg|min|max):[A-Za-z_][A-Za-z0-9_]*)$/.test(card.measure))
114
+ fail(`overview card '${card.id}' has the measure '${card.measure}'.`, "Use 'count' or 'sum:field'.");
115
+ }
116
+ overviewActions[`${name}.action_overview`] = {
117
+ type: 'client',
118
+ page: 'reporting.Overview',
119
+ label: 'Overview',
120
+ };
121
+ const root = (input.menus ?? []).find((menu) => menu.parent === undefined && menu.app !== undefined);
122
+ if (root !== undefined)
123
+ overviewMenus.push({
124
+ id: `${name}.overview`,
125
+ parent: root.id,
126
+ label: 'Overview',
127
+ action: `${name}.action_overview`,
128
+ sequence: 0,
129
+ });
130
+ }
98
131
  return Object.freeze({
99
132
  ...input,
100
133
  name,
101
134
  version: input.shutro.version,
102
135
  depends: Object.freeze([...(input.depends ?? [])]),
103
136
  accessLevels: Object.freeze({ ...input.accessLevels }),
104
- menus: Object.freeze([...(input.menus ?? [])]),
137
+ actions: Object.freeze({ ...overviewActions, ...(input.actions ?? {}) }),
138
+ menus: Object.freeze([...(input.menus ?? []), ...overviewMenus]),
105
139
  });
106
140
  }
@@ -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: 5cfa5bbf11a2ffb6
2
+ // Bindings of module `mrp`: 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;