shutro-erp 0.3.5 → 0.3.7

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 (768) hide show
  1. package/dist/account_asset/.kosh/bindings.js +15 -0
  2. package/dist/{mrp_account → account_asset}/.kosh/schema.d.ts +785 -614
  3. package/dist/account_asset/board.d.ts +61 -0
  4. package/dist/account_asset/board.js +86 -0
  5. package/dist/account_asset/books.d.ts +42 -0
  6. package/dist/account_asset/books.js +398 -0
  7. package/dist/account_asset/demo.d.ts +7 -0
  8. package/dist/account_asset/demo.js +72 -0
  9. package/dist/account_asset/i18n/bn.d.ts +2 -0
  10. package/dist/account_asset/i18n/bn.js +97 -0
  11. package/dist/account_asset/index.d.ts +9 -0
  12. package/dist/account_asset/index.js +337 -0
  13. package/dist/account_asset/module.d.ts +11076 -0
  14. package/dist/account_asset/module.js +230 -0
  15. package/dist/account_budget/.kosh/bindings.js +15 -0
  16. package/dist/account_budget/.kosh/schema.d.ts +2841 -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/i18n/bn.d.ts +2 -0
  22. package/dist/account_budget/i18n/bn.js +63 -0
  23. package/dist/account_budget/index.d.ts +4 -0
  24. package/dist/account_budget/index.js +237 -0
  25. package/dist/account_budget/module.d.ts +27289 -0
  26. package/dist/account_budget/module.js +182 -0
  27. package/dist/account_portal/.kosh/bindings.js +1 -1
  28. package/dist/account_portal/.kosh/schema.d.ts +651 -10
  29. package/dist/account_portal/i18n/bn.d.ts +2 -0
  30. package/dist/account_portal/i18n/bn.js +6 -0
  31. package/dist/account_portal/index.js +2 -0
  32. package/dist/account_portal/module.d.ts +5212 -1592
  33. package/dist/accounting/.kosh/bindings.js +1 -1
  34. package/dist/accounting/.kosh/schema.d.ts +651 -10
  35. package/dist/accounting/closing.js +1 -0
  36. package/dist/accounting/fiscal.d.ts +578 -0
  37. package/dist/accounting/fiscal.js +401 -0
  38. package/dist/accounting/followups.d.ts +618 -0
  39. package/dist/accounting/followups.js +420 -0
  40. package/dist/accounting/i18n/bn.d.ts +2 -0
  41. package/dist/accounting/i18n/bn.js +425 -0
  42. package/dist/accounting/index.d.ts +3 -1
  43. package/dist/accounting/index.js +780 -5
  44. package/dist/accounting/module.d.ts +5386 -1543
  45. package/dist/accounting/module.js +155 -18
  46. package/dist/accounting/statements.d.ts +878 -0
  47. package/dist/accounting/statements.js +728 -0
  48. package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
  49. package/dist/accounting/web/BankReconcilePage.js +138 -0
  50. package/dist/accounting/web/FollowupsPage.d.ts +8 -0
  51. package/dist/accounting/web/FollowupsPage.js +54 -0
  52. package/dist/accounting/web/PostingPreview.d.ts +8 -0
  53. package/dist/accounting/web/PostingPreview.js +26 -0
  54. package/dist/accounting/web/index.d.ts +3 -0
  55. package/dist/accounting/web/index.js +9 -0
  56. package/dist/accounting/web/messages.js +140 -0
  57. package/dist/approvals/.kosh/bindings.d.ts +22 -0
  58. package/dist/approvals/.kosh/bindings.js +15 -0
  59. package/dist/approvals/.kosh/schema.d.ts +879 -0
  60. package/dist/approvals/demo.d.ts +7 -0
  61. package/dist/approvals/demo.js +41 -0
  62. package/dist/approvals/i18n/bn.d.ts +2 -0
  63. package/dist/approvals/i18n/bn.js +133 -0
  64. package/dist/approvals/index.d.ts +36 -0
  65. package/dist/approvals/index.js +772 -0
  66. package/dist/approvals/mails.d.ts +30 -0
  67. package/dist/approvals/mails.js +87 -0
  68. package/dist/approvals/module.d.ts +2930 -0
  69. package/dist/approvals/module.js +473 -0
  70. package/dist/approvals/web/Config.d.ts +12 -0
  71. package/dist/approvals/web/Config.js +60 -0
  72. package/dist/approvals/web/History.d.ts +4 -0
  73. package/dist/approvals/web/History.js +13 -0
  74. package/dist/approvals/web/Inbox.d.ts +9 -0
  75. package/dist/approvals/web/Inbox.js +114 -0
  76. package/dist/approvals/web/Matrix.d.ts +9 -0
  77. package/dist/approvals/web/Matrix.js +26 -0
  78. package/dist/approvals/web/Mine.d.ts +7 -0
  79. package/dist/approvals/web/Mine.js +27 -0
  80. package/dist/approvals/web/index.d.ts +15 -0
  81. package/dist/approvals/web/index.js +29 -0
  82. package/dist/approvals/web/messages.d.ts +2 -0
  83. package/dist/approvals/web/messages.js +211 -0
  84. package/dist/approvals/web/shared.d.ts +59 -0
  85. package/dist/approvals/web/shared.js +46 -0
  86. package/dist/approvals_purchase/.kosh/bindings.d.ts +22 -0
  87. package/dist/approvals_purchase/.kosh/bindings.js +15 -0
  88. package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
  89. package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
  90. package/dist/approvals_purchase/i18n/bn.js +5 -0
  91. package/dist/approvals_purchase/index.d.ts +3 -0
  92. package/dist/approvals_purchase/index.js +47 -0
  93. package/dist/approvals_purchase/module.d.ts +12670 -0
  94. package/dist/approvals_purchase/module.js +84 -0
  95. package/dist/attendance/.kosh/bindings.d.ts +22 -0
  96. package/dist/attendance/.kosh/bindings.js +15 -0
  97. package/dist/attendance/.kosh/schema.d.ts +1106 -0
  98. package/dist/attendance/days.d.ts +96 -0
  99. package/dist/attendance/days.js +430 -0
  100. package/dist/attendance/demo.d.ts +7 -0
  101. package/dist/attendance/demo.js +58 -0
  102. package/dist/attendance/i18n/bn.d.ts +2 -0
  103. package/dist/attendance/i18n/bn.js +147 -0
  104. package/dist/attendance/index.d.ts +4 -0
  105. package/dist/attendance/index.js +515 -0
  106. package/dist/attendance/module.d.ts +4413 -0
  107. package/dist/attendance/module.js +412 -0
  108. package/dist/attendance/routes.d.ts +16 -0
  109. package/dist/attendance/routes.js +266 -0
  110. package/dist/attendance/web/Check.d.ts +8 -0
  111. package/dist/attendance/web/Check.js +40 -0
  112. package/dist/attendance/web/Kiosk.d.ts +8 -0
  113. package/dist/attendance/web/Kiosk.js +62 -0
  114. package/dist/attendance/web/PinButton.d.ts +7 -0
  115. package/dist/attendance/web/PinButton.js +29 -0
  116. package/dist/attendance/web/index.d.ts +13 -0
  117. package/dist/attendance/web/index.js +22 -0
  118. package/dist/attendance/web/messages.d.ts +2 -0
  119. package/dist/attendance/web/messages.js +61 -0
  120. package/dist/automation/engine.js +1 -1
  121. package/dist/calendar/.kosh/bindings.js +1 -1
  122. package/dist/calendar/.kosh/schema.d.ts +2 -1
  123. package/dist/calendar/i18n/bn.d.ts +2 -0
  124. package/dist/calendar/i18n/bn.js +80 -0
  125. package/dist/calendar/index.js +77 -0
  126. package/dist/calendar/module.d.ts +26 -0
  127. package/dist/calendar/module.js +14 -4
  128. package/dist/cli/apps.js +25 -5
  129. package/dist/cli/init.js +46 -4
  130. package/dist/cli/templates.d.ts +1 -1
  131. package/dist/cli/templates.js +123 -5
  132. package/dist/contacts/.kosh/bindings.js +1 -1
  133. package/dist/contacts/.kosh/schema.d.ts +2 -1
  134. package/dist/contacts/i18n/bn.d.ts +2 -0
  135. package/dist/contacts/i18n/bn.js +67 -0
  136. package/dist/contacts/index.js +3 -0
  137. package/dist/contacts/module.d.ts +42 -0
  138. package/dist/contacts/module.js +19 -3
  139. package/dist/crm/.kosh/bindings.js +1 -1
  140. package/dist/crm/.kosh/schema.d.ts +3 -1
  141. package/dist/crm/i18n/bn.d.ts +2 -0
  142. package/dist/crm/i18n/bn.js +80 -0
  143. package/dist/crm/index.js +22 -0
  144. package/dist/crm/module.d.ts +22 -0
  145. package/dist/crm/module.js +6 -3
  146. package/dist/documents/.kosh/bindings.d.ts +22 -0
  147. package/dist/documents/.kosh/bindings.js +15 -0
  148. package/dist/documents/.kosh/schema.d.ts +863 -0
  149. package/dist/documents/demo.d.ts +6 -0
  150. package/dist/documents/demo.js +22 -0
  151. package/dist/documents/documents.d.ts +98 -0
  152. package/dist/documents/documents.js +318 -0
  153. package/dist/documents/i18n/bn.d.ts +2 -0
  154. package/dist/documents/i18n/bn.js +83 -0
  155. package/dist/documents/index.d.ts +30 -0
  156. package/dist/documents/index.js +569 -0
  157. package/dist/documents/module.d.ts +2801 -0
  158. package/dist/documents/module.js +215 -0
  159. package/dist/documents/web/Versions.d.ts +7 -0
  160. package/dist/documents/web/Versions.js +45 -0
  161. package/dist/documents/web/index.d.ts +11 -0
  162. package/dist/documents/web/index.js +16 -0
  163. package/dist/documents/web/messages.d.ts +2 -0
  164. package/dist/documents/web/messages.js +21 -0
  165. package/dist/event/.kosh/bindings.js +1 -1
  166. package/dist/event/.kosh/schema.d.ts +2 -1
  167. package/dist/event/i18n/bn.d.ts +2 -0
  168. package/dist/event/i18n/bn.js +101 -0
  169. package/dist/event/index.js +66 -0
  170. package/dist/event/module.d.ts +20 -0
  171. package/dist/event/module.js +8 -1
  172. package/dist/event_account/.kosh/bindings.js +1 -1
  173. package/dist/event_account/.kosh/schema.d.ts +651 -10
  174. package/dist/event_account/i18n/bn.d.ts +2 -0
  175. package/dist/event_account/i18n/bn.js +5 -0
  176. package/dist/event_account/index.js +2 -0
  177. package/dist/event_account/module.d.ts +5133 -1513
  178. package/dist/expense/.kosh/bindings.d.ts +22 -0
  179. package/dist/expense/.kosh/bindings.js +15 -0
  180. package/dist/expense/.kosh/schema.d.ts +1620 -0
  181. package/dist/expense/demo.d.ts +7 -0
  182. package/dist/expense/demo.js +69 -0
  183. package/dist/expense/i18n/bn.d.ts +2 -0
  184. package/dist/expense/i18n/bn.js +155 -0
  185. package/dist/expense/index.d.ts +3 -0
  186. package/dist/expense/index.js +502 -0
  187. package/dist/expense/module.d.ts +6768 -0
  188. package/dist/expense/module.js +649 -0
  189. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  190. package/dist/expense_account/.kosh/bindings.js +15 -0
  191. package/dist/expense_account/.kosh/schema.d.ts +2515 -0
  192. package/dist/expense_account/i18n/bn.d.ts +2 -0
  193. package/dist/expense_account/i18n/bn.js +15 -0
  194. package/dist/expense_account/index.d.ts +3 -0
  195. package/dist/expense_account/index.js +76 -0
  196. package/dist/expense_account/module.d.ts +14628 -0
  197. package/dist/expense_account/module.js +318 -0
  198. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  199. package/dist/helpdesk/.kosh/bindings.js +15 -0
  200. package/dist/helpdesk/.kosh/schema.d.ts +886 -0
  201. package/dist/helpdesk/demo.d.ts +7 -0
  202. package/dist/helpdesk/demo.js +65 -0
  203. package/dist/helpdesk/hours.d.ts +17 -0
  204. package/dist/helpdesk/hours.js +94 -0
  205. package/dist/helpdesk/i18n/bn.d.ts +2 -0
  206. package/dist/helpdesk/i18n/bn.js +127 -0
  207. package/dist/helpdesk/index.d.ts +10 -0
  208. package/dist/helpdesk/index.js +463 -0
  209. package/dist/helpdesk/module.d.ts +2960 -0
  210. package/dist/helpdesk/module.js +326 -0
  211. package/dist/helpdesk/routes.d.ts +12 -0
  212. package/dist/helpdesk/routes.js +132 -0
  213. package/dist/helpdesk/sla.d.ts +37 -0
  214. package/dist/helpdesk/sla.js +226 -0
  215. package/dist/hr/.kosh/bindings.js +1 -1
  216. package/dist/hr/.kosh/schema.d.ts +59 -1
  217. package/dist/hr/demo.js +11 -1
  218. package/dist/hr/i18n/bn.d.ts +2 -0
  219. package/dist/hr/i18n/bn.js +126 -0
  220. package/dist/hr/index.d.ts +1 -1
  221. package/dist/hr/index.js +158 -12
  222. package/dist/hr/module.d.ts +932 -59
  223. package/dist/hr/module.js +114 -17
  224. package/dist/indent/.kosh/bindings.d.ts +22 -0
  225. package/dist/indent/.kosh/bindings.js +15 -0
  226. package/dist/indent/.kosh/schema.d.ts +2084 -0
  227. package/dist/indent/demo.d.ts +7 -0
  228. package/dist/indent/demo.js +48 -0
  229. package/dist/indent/i18n/bn.d.ts +2 -0
  230. package/dist/indent/i18n/bn.js +143 -0
  231. package/dist/indent/index.d.ts +3 -0
  232. package/dist/indent/index.js +450 -0
  233. package/dist/indent/module.d.ts +13424 -0
  234. package/dist/indent/module.js +792 -0
  235. package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
  236. package/dist/indent_purchase/.kosh/bindings.js +15 -0
  237. package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
  238. package/dist/indent_purchase/i18n/bn.d.ts +2 -0
  239. package/dist/indent_purchase/i18n/bn.js +13 -0
  240. package/dist/indent_purchase/index.d.ts +3 -0
  241. package/dist/indent_purchase/index.js +61 -0
  242. package/dist/indent_purchase/module.d.ts +27950 -0
  243. package/dist/indent_purchase/module.js +163 -0
  244. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  245. package/dist/l10n_bd/.kosh/schema.d.ts +651 -10
  246. package/dist/l10n_bd/i18n/bn.d.ts +2 -0
  247. package/dist/l10n_bd/i18n/bn.js +69 -0
  248. package/dist/l10n_bd/index.js +2 -0
  249. package/dist/l10n_bd/module.d.ts +5212 -1592
  250. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  251. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  252. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2891 -0
  253. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  254. package/dist/l10n_bd_payroll/data.js +347 -0
  255. package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
  256. package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
  257. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  258. package/dist/l10n_bd_payroll/index.js +26 -0
  259. package/dist/l10n_bd_payroll/module.d.ts +17294 -0
  260. package/dist/l10n_bd_payroll/module.js +86 -0
  261. package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
  262. package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
  263. package/dist/l10n_bd_pos/.kosh/schema.d.ts +2341 -0
  264. package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
  265. package/dist/l10n_bd_pos/i18n/bn.js +32 -0
  266. package/dist/l10n_bd_pos/index.d.ts +3 -0
  267. package/dist/l10n_bd_pos/index.js +111 -0
  268. package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +9047 -6981
  269. package/dist/l10n_bd_pos/module.js +43 -0
  270. package/dist/l10n_in/.kosh/bindings.js +1 -1
  271. package/dist/l10n_in/.kosh/schema.d.ts +651 -10
  272. package/dist/l10n_in/i18n/bn.d.ts +2 -0
  273. package/dist/l10n_in/i18n/bn.js +95 -0
  274. package/dist/l10n_in/index.js +2 -0
  275. package/dist/l10n_in/module.d.ts +6778 -1580
  276. package/dist/l10n_in/module.js +25 -5
  277. package/dist/l10n_in/web/GstSettings.js +2 -2
  278. package/dist/mail/inbound/handle.js +8 -5
  279. package/dist/mail/inbound/models.js +5 -3
  280. package/dist/mail/index.d.ts +12 -1
  281. package/dist/mail/index.js +139 -2
  282. package/dist/mail/send.d.ts +56 -0
  283. package/dist/mail/send.js +394 -0
  284. package/dist/mail/web/SendButton.d.ts +9 -0
  285. package/dist/mail/web/SendButton.js +71 -0
  286. package/dist/mail/web/SendSelected.d.ts +8 -0
  287. package/dist/mail/web/SendSelected.js +33 -0
  288. package/dist/mail/web/index.d.ts +2 -0
  289. package/dist/mail/web/index.js +6 -0
  290. package/dist/mail/web/messages.js +36 -0
  291. package/dist/maintenance/.kosh/bindings.js +1 -1
  292. package/dist/maintenance/.kosh/schema.d.ts +2 -1
  293. package/dist/maintenance/i18n/bn.d.ts +2 -0
  294. package/dist/maintenance/i18n/bn.js +132 -0
  295. package/dist/maintenance/index.js +85 -0
  296. package/dist/maintenance/module.d.ts +25 -0
  297. package/dist/maintenance/module.js +27 -9
  298. package/dist/maintenance_stock/.kosh/bindings.js +1 -1
  299. package/dist/maintenance_stock/.kosh/schema.d.ts +374 -3
  300. package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
  301. package/dist/maintenance_stock/i18n/bn.js +21 -0
  302. package/dist/maintenance_stock/index.js +2 -0
  303. package/dist/maintenance_stock/module.d.ts +6095 -1327
  304. package/dist/maintenance_stock/module.js +1 -0
  305. package/dist/modules-sdk/apps.d.ts +10 -0
  306. package/dist/modules-sdk/apps.js +32 -0
  307. package/dist/modules-sdk/index.d.ts +1 -1
  308. package/dist/modules-sdk/manifest.d.ts +105 -2
  309. package/dist/payment/.kosh/bindings.js +1 -1
  310. package/dist/payment/.kosh/schema.d.ts +653 -11
  311. package/dist/payment/i18n/bn.d.ts +2 -0
  312. package/dist/payment/i18n/bn.js +59 -0
  313. package/dist/payment/index.d.ts +41 -0
  314. package/dist/payment/index.js +216 -74
  315. package/dist/payment/module.d.ts +5353 -1675
  316. package/dist/payment/module.js +36 -6
  317. package/dist/payment/settle.js +11 -1
  318. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  319. package/dist/payroll/.kosh/bindings.js +15 -0
  320. package/dist/payroll/.kosh/schema.d.ts +1448 -0
  321. package/dist/payroll/compute.d.ts +35 -0
  322. package/dist/payroll/compute.js +398 -0
  323. package/dist/payroll/demo.d.ts +55 -0
  324. package/dist/payroll/demo.js +121 -0
  325. package/dist/payroll/formula.d.ts +62 -0
  326. package/dist/payroll/formula.js +320 -0
  327. package/dist/payroll/i18n/bn.d.ts +2 -0
  328. package/dist/payroll/i18n/bn.js +206 -0
  329. package/dist/payroll/index.d.ts +230 -0
  330. package/dist/payroll/index.js +715 -0
  331. package/dist/{mrp → payroll}/module.d.ts +4294 -2624
  332. package/dist/payroll/module.js +606 -0
  333. package/dist/payroll/routes.d.ts +10 -0
  334. package/dist/payroll/routes.js +112 -0
  335. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  336. package/dist/payroll_account/.kosh/bindings.js +15 -0
  337. package/dist/payroll_account/.kosh/schema.d.ts +2887 -0
  338. package/dist/payroll_account/i18n/bn.d.ts +2 -0
  339. package/dist/payroll_account/i18n/bn.js +10 -0
  340. package/dist/payroll_account/index.d.ts +3 -0
  341. package/dist/payroll_account/index.js +42 -0
  342. package/dist/payroll_account/module.d.ts +16738 -0
  343. package/dist/payroll_account/module.js +256 -0
  344. package/dist/permissions/approvals.d.ts +227 -12
  345. package/dist/permissions/approvals.js +1421 -67
  346. package/dist/permissions/index.d.ts +1 -1
  347. package/dist/permissions/index.js +2 -2
  348. package/dist/permissions/models.js +364 -13
  349. package/dist/permissions/routes.d.ts +9 -1
  350. package/dist/permissions/routes.js +72 -5
  351. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  352. package/dist/permissions/web/ApprovalPanel.js +75 -11
  353. package/dist/permissions/web/index.d.ts +6 -4
  354. package/dist/permissions/web/index.js +13 -4
  355. package/dist/permissions/web/messages.d.ts +2 -0
  356. package/dist/permissions/web/messages.js +95 -0
  357. package/dist/portal/.kosh/bindings.js +1 -1
  358. package/dist/portal/.kosh/schema.d.ts +2 -1
  359. package/dist/portal/documents.d.ts +3 -0
  360. package/dist/portal/documents.js +21 -1
  361. package/dist/portal/i18n/bn.d.ts +2 -0
  362. package/dist/portal/i18n/bn.js +33 -0
  363. package/dist/portal/index.js +3 -1
  364. package/dist/portal/module.d.ts +20 -0
  365. package/dist/portal/routes-documents.js +76 -0
  366. package/dist/pos/.kosh/bindings.js +1 -1
  367. package/dist/pos/.kosh/schema.d.ts +652 -10
  368. package/dist/pos/i18n/bn.d.ts +2 -0
  369. package/dist/pos/i18n/bn.js +133 -0
  370. package/dist/pos/index.js +87 -1
  371. package/dist/pos/module.d.ts +6967 -1709
  372. package/dist/pos/module.js +49 -5
  373. package/dist/pos/routes.js +80 -7
  374. package/dist/pos/web/Register.js +2 -5
  375. package/dist/pos_stock/.kosh/bindings.js +1 -1
  376. package/dist/pos_stock/.kosh/schema.d.ts +822 -12
  377. package/dist/pos_stock/i18n/bn.d.ts +2 -0
  378. package/dist/pos_stock/i18n/bn.js +6 -0
  379. package/dist/pos_stock/index.js +2 -0
  380. package/dist/pos_stock/module.d.ts +11241 -2851
  381. package/dist/product/.kosh/bindings.js +1 -1
  382. package/dist/product/.kosh/schema.d.ts +203 -1
  383. package/dist/product/i18n/bn.d.ts +2 -0
  384. package/dist/product/i18n/bn.js +175 -0
  385. package/dist/product/index.d.ts +1 -0
  386. package/dist/product/index.js +301 -1
  387. package/dist/product/module.d.ts +1727 -0
  388. package/dist/product/module.js +67 -6
  389. package/dist/product/pricelist.d.ts +575 -0
  390. package/dist/product/pricelist.js +257 -0
  391. package/dist/product/variants.d.ts +908 -0
  392. package/dist/product/variants.js +251 -0
  393. package/dist/production/.kosh/bindings.d.ts +22 -0
  394. package/dist/production/.kosh/bindings.js +15 -0
  395. package/dist/production/.kosh/schema.d.ts +2345 -0
  396. package/dist/{mrp → production}/demo.d.ts +1 -1
  397. package/dist/{mrp → production}/demo.js +5 -5
  398. package/dist/production/depth.d.ts +790 -0
  399. package/dist/production/depth.js +262 -0
  400. package/dist/production/i18n/bn.d.ts +2 -0
  401. package/dist/production/i18n/bn.js +350 -0
  402. package/dist/production/index.d.ts +6 -0
  403. package/dist/production/index.js +1256 -0
  404. package/dist/production/module.d.ts +17327 -0
  405. package/dist/production/module.js +1333 -0
  406. package/dist/production/plan.d.ts +921 -0
  407. package/dist/production/plan.js +511 -0
  408. package/dist/production/schedule.d.ts +656 -0
  409. package/dist/production/schedule.js +309 -0
  410. package/dist/production_account/.kosh/bindings.d.ts +22 -0
  411. package/dist/production_account/.kosh/bindings.js +15 -0
  412. package/dist/production_account/.kosh/schema.d.ts +3496 -0
  413. package/dist/production_account/i18n/bn.d.ts +2 -0
  414. package/dist/production_account/i18n/bn.js +93 -0
  415. package/dist/production_account/index.d.ts +4 -0
  416. package/dist/production_account/index.js +246 -0
  417. package/dist/production_account/module.d.ts +1192 -0
  418. package/dist/{mrp_account → production_account}/module.js +72 -18
  419. package/dist/production_account/overhead.d.ts +1195 -0
  420. package/dist/production_account/overhead.js +554 -0
  421. package/dist/project/.kosh/bindings.js +1 -1
  422. package/dist/project/.kosh/schema.d.ts +735 -1
  423. package/dist/project/i18n/bn.d.ts +2 -0
  424. package/dist/project/i18n/bn.js +383 -0
  425. package/dist/project/index.d.ts +3 -1
  426. package/dist/project/index.js +1024 -14
  427. package/dist/project/module.d.ts +9912 -390
  428. package/dist/project/module.js +1590 -14
  429. package/dist/project/routes.d.ts +44 -0
  430. package/dist/project/routes.js +314 -0
  431. package/dist/project/schedule.d.ts +72 -0
  432. package/dist/project/schedule.js +192 -0
  433. package/dist/project/web/Refresh.d.ts +8 -0
  434. package/dist/project/web/Refresh.js +29 -0
  435. package/dist/project/web/Schedule.d.ts +9 -0
  436. package/dist/project/web/Schedule.js +93 -0
  437. package/dist/project/web/Structure.d.ts +8 -0
  438. package/dist/project/web/Structure.js +86 -0
  439. package/dist/project/web/Workload.d.ts +8 -0
  440. package/dist/project/web/Workload.js +43 -0
  441. package/dist/project/web/index.d.ts +14 -0
  442. package/dist/project/web/index.js +25 -0
  443. package/dist/project/web/messages.d.ts +2 -0
  444. package/dist/project/web/messages.js +85 -0
  445. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  446. package/dist/project_account/.kosh/bindings.js +15 -0
  447. package/dist/project_account/.kosh/schema.d.ts +2763 -0
  448. package/dist/project_account/i18n/bn.d.ts +2 -0
  449. package/dist/project_account/i18n/bn.js +6 -0
  450. package/dist/project_account/index.d.ts +3 -0
  451. package/dist/project_account/index.js +29 -0
  452. package/dist/project_account/module.d.ts +15013 -0
  453. package/dist/project_account/module.js +76 -0
  454. package/dist/project_portal/.kosh/bindings.js +1 -1
  455. package/dist/project_portal/.kosh/schema.d.ts +735 -1
  456. package/dist/project_portal/i18n/bn.d.ts +2 -0
  457. package/dist/project_portal/i18n/bn.js +6 -0
  458. package/dist/project_portal/index.js +2 -0
  459. package/dist/project_portal/module.d.ts +4796 -87
  460. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  461. package/dist/project_purchase/.kosh/bindings.js +15 -0
  462. package/dist/project_purchase/.kosh/schema.d.ts +3393 -0
  463. package/dist/project_purchase/i18n/bn.d.ts +2 -0
  464. package/dist/project_purchase/i18n/bn.js +4 -0
  465. package/dist/project_purchase/index.d.ts +9 -0
  466. package/dist/project_purchase/index.js +24 -0
  467. package/dist/project_purchase/module.d.ts +38613 -0
  468. package/dist/project_purchase/module.js +56 -0
  469. package/dist/purchase/.kosh/bindings.js +1 -1
  470. package/dist/purchase/.kosh/schema.d.ts +908 -5
  471. package/dist/purchase/comparison.d.ts +993 -0
  472. package/dist/purchase/comparison.js +415 -0
  473. package/dist/purchase/extras.d.ts +1509 -0
  474. package/dist/purchase/extras.js +445 -0
  475. package/dist/purchase/i18n/bn.d.ts +2 -0
  476. package/dist/purchase/i18n/bn.js +413 -0
  477. package/dist/purchase/index.d.ts +5 -0
  478. package/dist/purchase/index.js +1280 -4
  479. package/dist/purchase/module.d.ts +7147 -395
  480. package/dist/purchase/module.js +303 -10
  481. package/dist/purchase/request.d.ts +696 -0
  482. package/dist/purchase/request.js +446 -0
  483. package/dist/purchase/tender.d.ts +1208 -0
  484. package/dist/purchase/tender.js +507 -0
  485. package/dist/purchase/vendorprice.d.ts +340 -0
  486. package/dist/purchase/vendorprice.js +153 -0
  487. package/dist/purchase_account/.kosh/bindings.js +1 -1
  488. package/dist/purchase_account/.kosh/schema.d.ts +1209 -16
  489. package/dist/purchase_account/i18n/bn.d.ts +2 -0
  490. package/dist/purchase_account/i18n/bn.js +22 -0
  491. package/dist/purchase_account/index.js +20 -0
  492. package/dist/purchase_account/module.d.ts +12232 -2028
  493. package/dist/purchase_account/module.js +252 -9
  494. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  495. package/dist/purchase_portal/.kosh/schema.d.ts +908 -5
  496. package/dist/purchase_portal/i18n/bn.d.ts +2 -0
  497. package/dist/purchase_portal/i18n/bn.js +5 -0
  498. package/dist/purchase_portal/index.js +2 -0
  499. package/dist/purchase_portal/module.d.ts +6853 -352
  500. package/dist/purchase_stock/.kosh/bindings.js +1 -1
  501. package/dist/purchase_stock/.kosh/schema.d.ts +1096 -21
  502. package/dist/purchase_stock/i18n/bn.d.ts +2 -0
  503. package/dist/purchase_stock/i18n/bn.js +19 -0
  504. package/dist/purchase_stock/index.d.ts +2 -2
  505. package/dist/purchase_stock/index.js +38 -2
  506. package/dist/purchase_stock/module.d.ts +12930 -1612
  507. package/dist/purchase_stock/module.js +317 -9
  508. package/dist/purchase_stock/scorecard.d.ts +22 -0
  509. package/dist/purchase_stock/scorecard.js +77 -0
  510. package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
  511. package/dist/purchase_stock/web/Scorecard.js +22 -0
  512. package/dist/purchase_stock/web/index.d.ts +11 -0
  513. package/dist/purchase_stock/web/index.js +16 -0
  514. package/dist/purchase_stock/web/messages.d.ts +2 -0
  515. package/dist/purchase_stock/web/messages.js +27 -0
  516. package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
  517. package/dist/purchase_stock_account/.kosh/schema.d.ts +1444 -20
  518. package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
  519. package/dist/purchase_stock_account/i18n/bn.js +8 -0
  520. package/dist/purchase_stock_account/index.js +18 -0
  521. package/dist/purchase_stock_account/module.d.ts +7 -35346
  522. package/dist/purchase_stock_account/module.js +35 -8
  523. package/dist/recruitment/.kosh/bindings.js +1 -1
  524. package/dist/recruitment/.kosh/schema.d.ts +60 -1
  525. package/dist/recruitment/i18n/bn.d.ts +2 -0
  526. package/dist/recruitment/i18n/bn.js +93 -0
  527. package/dist/recruitment/index.js +64 -0
  528. package/dist/recruitment/module.d.ts +460 -8
  529. package/dist/recruitment/module.js +13 -4
  530. package/dist/reporting/documents.d.ts +5 -0
  531. package/dist/reporting/documents.js +11 -1
  532. package/dist/reporting/index.d.ts +1 -1
  533. package/dist/reporting/index.js +1 -1
  534. package/dist/reporting/web/CalendarView.d.ts +18 -5
  535. package/dist/reporting/web/CalendarView.js +163 -29
  536. package/dist/reporting/web/messages.js +18 -0
  537. package/dist/sale_account/.kosh/bindings.js +1 -1
  538. package/dist/sale_account/.kosh/schema.d.ts +763 -18
  539. package/dist/sale_account/i18n/bn.d.ts +2 -0
  540. package/dist/sale_account/i18n/bn.js +48 -0
  541. package/dist/sale_account/index.d.ts +1 -1
  542. package/dist/sale_account/index.js +102 -4
  543. package/dist/sale_account/module.d.ts +8241 -2052
  544. package/dist/sale_account/module.js +535 -46
  545. package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
  546. package/dist/sale_crm/.kosh/bindings.js +15 -0
  547. package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +391 -494
  548. package/dist/sale_crm/i18n/bn.d.ts +2 -0
  549. package/dist/sale_crm/i18n/bn.js +9 -0
  550. package/dist/sale_crm/index.d.ts +7 -0
  551. package/dist/sale_crm/index.js +104 -0
  552. package/dist/sale_crm/module.d.ts +5609 -0
  553. package/dist/sale_crm/module.js +73 -0
  554. package/dist/sale_portal/.kosh/bindings.js +1 -1
  555. package/dist/sale_portal/.kosh/schema.d.ts +292 -4
  556. package/dist/sale_portal/i18n/bn.d.ts +2 -0
  557. package/dist/sale_portal/i18n/bn.js +7 -0
  558. package/dist/sale_portal/index.js +10 -0
  559. package/dist/sale_portal/module.d.ts +2563 -292
  560. package/dist/sale_project/.kosh/bindings.js +1 -1
  561. package/dist/sale_project/.kosh/schema.d.ts +1025 -4
  562. package/dist/sale_project/i18n/bn.d.ts +2 -0
  563. package/dist/sale_project/i18n/bn.js +12 -0
  564. package/dist/sale_project/index.js +2 -0
  565. package/dist/sale_project/module.d.ts +9280 -762
  566. package/dist/sale_project/module.js +17 -1
  567. package/dist/sale_stock/.kosh/bindings.js +1 -1
  568. package/dist/sale_stock/.kosh/schema.d.ts +463 -6
  569. package/dist/sale_stock/i18n/bn.d.ts +2 -0
  570. package/dist/sale_stock/i18n/bn.js +15 -0
  571. package/dist/sale_stock/index.js +2 -0
  572. package/dist/sale_stock/module.d.ts +8355 -1334
  573. package/dist/sale_stock/module.js +20 -3
  574. package/dist/sales/.kosh/bindings.js +1 -1
  575. package/dist/sales/.kosh/schema.d.ts +292 -4
  576. package/dist/sales/i18n/bn.d.ts +2 -0
  577. package/dist/sales/i18n/bn.js +128 -0
  578. package/dist/sales/index.js +124 -5
  579. package/dist/sales/module.d.ts +3568 -633
  580. package/dist/sales/module.js +306 -11
  581. package/dist/server/api/duplicate.d.ts +14 -0
  582. package/dist/server/api/duplicate.js +75 -0
  583. package/dist/server/api/explain.d.ts +70 -0
  584. package/dist/server/api/explain.js +111 -0
  585. package/dist/server/api/metadata.d.ts +2 -0
  586. package/dist/server/api/metadata.js +9 -0
  587. package/dist/server/api/openapi.js +15 -0
  588. package/dist/server/api/rest.d.ts +1 -0
  589. package/dist/server/api/rest.js +76 -12
  590. package/dist/server/api/views.js +1 -1
  591. package/dist/server/apps.d.ts +16 -1
  592. package/dist/server/apps.js +164 -2
  593. package/dist/server/auth/base.js +2 -0
  594. package/dist/server/auth/service.d.ts +8 -0
  595. package/dist/server/auth/service.js +19 -0
  596. package/dist/server/events.d.ts +13 -0
  597. package/dist/server/events.js +22 -0
  598. package/dist/server/i18n.d.ts +27 -0
  599. package/dist/server/i18n.js +143 -0
  600. package/dist/server/index.d.ts +2 -0
  601. package/dist/server/index.js +2 -0
  602. package/dist/server/server.js +6 -0
  603. package/dist/settings/company.d.ts +3 -1
  604. package/dist/settings/company.js +26 -5
  605. package/dist/settings/routes.d.ts +10 -0
  606. package/dist/settings/routes.js +19 -3
  607. package/dist/settings/web/AppsPage.d.ts +3 -2
  608. package/dist/settings/web/AppsPage.js +26 -8
  609. package/dist/settings/web/CompaniesPage.js +91 -6
  610. package/dist/settings/web/messages.js +64 -0
  611. package/dist/sign/.kosh/bindings.d.ts +22 -0
  612. package/dist/{mrp → sign}/.kosh/bindings.js +2 -2
  613. package/dist/sign/.kosh/schema.d.ts +991 -0
  614. package/dist/sign/i18n/bn.d.ts +2 -0
  615. package/dist/sign/i18n/bn.js +97 -0
  616. package/dist/sign/index.d.ts +29 -0
  617. package/dist/sign/index.js +478 -0
  618. package/dist/sign/module.d.ts +4518 -0
  619. package/dist/sign/module.js +167 -0
  620. package/dist/sign/sign.d.ts +82 -0
  621. package/dist/sign/sign.js +474 -0
  622. package/dist/stock/.kosh/bindings.js +1 -1
  623. package/dist/stock/.kosh/schema.d.ts +374 -3
  624. package/dist/stock/demo.d.ts +2 -1
  625. package/dist/stock/demo.js +28 -1
  626. package/dist/stock/i18n/bn.d.ts +2 -0
  627. package/dist/stock/i18n/bn.js +311 -0
  628. package/dist/stock/index.d.ts +4 -1
  629. package/dist/stock/index.js +674 -6
  630. package/dist/stock/ledger.d.ts +78 -0
  631. package/dist/stock/ledger.js +582 -0
  632. package/dist/stock/module.d.ts +6142 -1380
  633. package/dist/stock/module.js +780 -26
  634. package/dist/stock/replenish.d.ts +38 -0
  635. package/dist/stock/replenish.js +191 -0
  636. package/dist/stock/returns.d.ts +157 -0
  637. package/dist/stock/returns.js +163 -0
  638. package/dist/stock/web/Ledger.d.ts +9 -0
  639. package/dist/stock/web/Ledger.js +108 -0
  640. package/dist/stock/web/Operations.d.ts +8 -0
  641. package/dist/stock/web/Operations.js +33 -0
  642. package/dist/stock/web/Replenishment.d.ts +8 -0
  643. package/dist/stock/web/Replenishment.js +84 -0
  644. package/dist/stock/web/ReturnButton.d.ts +7 -0
  645. package/dist/stock/web/ReturnButton.js +62 -0
  646. package/dist/stock/web/index.d.ts +7 -2
  647. package/dist/stock/web/index.js +15 -2
  648. package/dist/stock/web/messages.js +206 -0
  649. package/dist/stock_account/.kosh/bindings.js +1 -1
  650. package/dist/stock_account/.kosh/schema.d.ts +878 -12
  651. package/dist/stock_account/i18n/bn.d.ts +2 -0
  652. package/dist/stock_account/i18n/bn.js +73 -0
  653. package/dist/stock_account/index.d.ts +1 -0
  654. package/dist/stock_account/index.js +141 -3
  655. package/dist/stock_account/landed.d.ts +429 -0
  656. package/dist/stock_account/landed.js +335 -0
  657. package/dist/stock_account/module.d.ts +12143 -3391
  658. package/dist/stock_account/module.js +135 -6
  659. package/dist/stock_account/web/LandedPreview.d.ts +7 -0
  660. package/dist/stock_account/web/LandedPreview.js +23 -0
  661. package/dist/stock_account/web/index.d.ts +11 -0
  662. package/dist/stock_account/web/index.js +16 -0
  663. package/dist/stock_account/web/messages.d.ts +2 -0
  664. package/dist/stock_account/web/messages.js +27 -0
  665. package/dist/todo/i18n/bn.d.ts +2 -0
  666. package/dist/todo/i18n/bn.js +66 -0
  667. package/dist/todo/index.js +59 -0
  668. package/dist/todo/module.d.ts +5 -0
  669. package/dist/todo/module.js +5 -3
  670. package/dist/trade_finance/.kosh/bindings.js +1 -1
  671. package/dist/trade_finance/.kosh/schema.d.ts +2 -1
  672. package/dist/trade_finance/i18n/bn.d.ts +2 -0
  673. package/dist/trade_finance/i18n/bn.js +162 -0
  674. package/dist/trade_finance/index.js +95 -0
  675. package/dist/trade_finance/module.d.ts +26 -0
  676. package/dist/trade_finance/module.js +29 -8
  677. package/dist/trade_finance_account/.kosh/bindings.js +1 -1
  678. package/dist/trade_finance_account/.kosh/schema.d.ts +651 -10
  679. package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
  680. package/dist/trade_finance_account/i18n/bn.js +27 -0
  681. package/dist/trade_finance_account/index.js +3 -0
  682. package/dist/trade_finance_account/module.d.ts +5129 -1509
  683. package/dist/trade_finance_account/module.js +2 -0
  684. package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
  685. package/dist/trade_finance_purchase/.kosh/schema.d.ts +908 -5
  686. package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
  687. package/dist/trade_finance_purchase/i18n/bn.js +6 -0
  688. package/dist/trade_finance_purchase/index.js +2 -0
  689. package/dist/trade_finance_purchase/module.d.ts +6909 -408
  690. package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
  691. package/dist/trade_finance_sale/.kosh/schema.d.ts +292 -4
  692. package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
  693. package/dist/trade_finance_sale/i18n/bn.js +6 -0
  694. package/dist/trade_finance_sale/index.js +2 -0
  695. package/dist/trade_finance_sale/module.d.ts +2602 -331
  696. package/dist/ui/api.d.ts +2 -0
  697. package/dist/ui/app.d.ts +9 -0
  698. package/dist/ui/app.js +47 -15
  699. package/dist/ui/components/AppIcon.js +9 -2
  700. package/dist/ui/components/Explain.d.ts +69 -0
  701. package/dist/ui/components/Explain.js +62 -0
  702. package/dist/ui/context.d.ts +8 -1
  703. package/dist/ui/context.js +34 -1
  704. package/dist/ui/i18n/messages.d.ts +40 -0
  705. package/dist/ui/i18n/messages.js +80 -0
  706. package/dist/ui/index.d.ts +2 -1
  707. package/dist/ui/index.js +1 -0
  708. package/dist/ui/registry.d.ts +14 -0
  709. package/dist/ui/registry.js +10 -0
  710. package/dist/ui/views/FormView.d.ts +6 -0
  711. package/dist/ui/views/FormView.js +51 -12
  712. package/dist/ui/views/KanbanView.js +9 -1
  713. package/dist/ui/views/ListView.d.ts +8 -0
  714. package/dist/ui/views/ListView.js +14 -5
  715. package/dist/ui/views/StatsRow.js +2 -1
  716. package/dist/ui/views/widgets.js +7 -1
  717. package/dist/views/extend.js +12 -0
  718. package/dist/views/types.d.ts +13 -2
  719. package/dist/views/validate.js +8 -1
  720. package/dist/website/.kosh/bindings.js +1 -1
  721. package/dist/website/.kosh/schema.d.ts +2 -1
  722. package/dist/website/i18n/bn.d.ts +2 -0
  723. package/dist/website/i18n/bn.js +113 -0
  724. package/dist/website/index.js +37 -0
  725. package/dist/website/module.d.ts +20 -0
  726. package/dist/website/module.js +30 -5
  727. package/dist/website_crm/.kosh/bindings.js +1 -1
  728. package/dist/website_crm/.kosh/schema.d.ts +3 -1
  729. package/dist/website_crm/i18n/bn.d.ts +2 -0
  730. package/dist/website_crm/i18n/bn.js +5 -0
  731. package/dist/website_crm/index.js +2 -0
  732. package/dist/website_crm/module.d.ts +41 -0
  733. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  734. package/dist/website_sale/.kosh/bindings.js +15 -0
  735. package/dist/website_sale/.kosh/schema.d.ts +2909 -0
  736. package/dist/website_sale/couriers.d.ts +50 -0
  737. package/dist/website_sale/couriers.js +59 -0
  738. package/dist/website_sale/demo.d.ts +7 -0
  739. package/dist/website_sale/demo.js +90 -0
  740. package/dist/website_sale/growth.d.ts +31 -0
  741. package/dist/website_sale/growth.js +163 -0
  742. package/dist/website_sale/i18n/bn.d.ts +2 -0
  743. package/dist/website_sale/i18n/bn.js +132 -0
  744. package/dist/website_sale/index.d.ts +49 -0
  745. package/dist/website_sale/index.js +620 -0
  746. package/dist/website_sale/module.d.ts +35182 -0
  747. package/dist/website_sale/module.js +419 -0
  748. package/dist/website_sale/shipments.d.ts +16 -0
  749. package/dist/website_sale/shipments.js +113 -0
  750. package/dist/website_sale/shop.d.ts +81 -0
  751. package/dist/website_sale/shop.js +662 -0
  752. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  753. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  754. package/dist/website_sale_stock/.kosh/schema.d.ts +3400 -0
  755. package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
  756. package/dist/website_sale_stock/i18n/bn.js +4 -0
  757. package/dist/website_sale_stock/index.d.ts +9 -0
  758. package/dist/website_sale_stock/index.js +22 -0
  759. package/dist/website_sale_stock/module.d.ts +11 -0
  760. package/dist/website_sale_stock/module.js +32 -0
  761. package/package.json +117 -8
  762. package/dist/mrp/index.d.ts +0 -3
  763. package/dist/mrp/index.js +0 -392
  764. package/dist/mrp/module.js +0 -695
  765. package/dist/mrp_account/index.d.ts +0 -3
  766. package/dist/mrp_account/index.js +0 -22
  767. /package/dist/{mrp → account_asset}/.kosh/bindings.d.ts +0 -0
  768. /package/dist/{mrp_account → account_budget}/.kosh/bindings.d.ts +0 -0
@@ -0,0 +1,473 @@
1
+ /**
2
+ * The data layer of the Approvals app (RFC 0025). The engine's models (`approval.policy`, `approval.level`,
3
+ * `approval.request`, `approval.vote`) are in `shutro-erp/permissions`; this module adds **generic requests** (step 4):
4
+ * categories (Business trip, Payment, Equipment…) saying which fields a request has and what it leads to, and the
5
+ * requests themselves, decided through the category's own policy — a policy on `approval.ask` whose condition is the
6
+ * category, made when the category's first request is submitted (or from the category), its levels edited like any
7
+ * policy's. On approval, the category's **outcome** runs: nothing here; apps add theirs (`approvals_purchase`: a
8
+ * request for quotation from the lines).
9
+ */
10
+ import { contactsShutro } from '../contacts/index.js';
11
+ import { approvalGuard, decidersOf, permissionsShutro, requestApprovals, requestsOf, } from '../permissions/index.js';
12
+ import { orm } from '../server/orm.js';
13
+ import { check, compute, defineModel, defineModule, f, method, record, records, } from './.kosh/bindings.js';
14
+ const ALL = ['read', 'write', 'create', 'unlink', 'export', 'import'];
15
+ const me = { $env: 'uid' };
16
+ const ZERO = orm.toDecimal(0);
17
+ /** Whether a request of the category shows a field, and whether it must be filled. */
18
+ const PRESENCE = { none: 'Not asked', optional: 'Optional', required: 'Required' };
19
+ /** The presence fields of a category, by the request field they govern. */
20
+ export const ASKED = {
21
+ amount: 'askAmount',
22
+ period: 'askPeriod',
23
+ partner: 'askPartner',
24
+ location: 'askLocation',
25
+ quantity: 'askQuantity',
26
+ lines: 'askLines',
27
+ attachment: 'askAttachment',
28
+ };
29
+ const asksOf = (env, ids) => env.model('approval.ask').browse(ids);
30
+ /** The outcomes the installed apps offer, by code (`approval.ask.outcomes()`, which they extend). */
31
+ export async function outcomesOffered(env) {
32
+ return asksOf(env, []).outcomes();
33
+ }
34
+ /** A kind of request, its fields and its outcome. */
35
+ export const ApprovalCategory = defineModel('approval.category', {
36
+ label: 'Request category',
37
+ recName: 'name',
38
+ order: ['sequence asc', 'name asc'],
39
+ archivable: true,
40
+ access: { 'base.user': ['read'], 'approvals.manager': ALL },
41
+ fields: {
42
+ name: f.char({ required: true, translate: true }),
43
+ code: f.char({ size: 32 }),
44
+ /** Empty: every company's. */
45
+ company: f.many2one('res.company', { ondelete: 'cascade' }),
46
+ sequence: f.integer({ required: true, default: 10 }),
47
+ description: f.text({ translate: true, help: 'Shown to whoever asks: what to give and why.' }),
48
+ askAmount: f.selection(PRESENCE, {
49
+ required: true,
50
+ default: 'optional',
51
+ label: 'Amount',
52
+ help: 'Whether a request of this category asks for an amount: not asked, optional or required.',
53
+ }),
54
+ askPeriod: f.selection(PRESENCE, {
55
+ required: true,
56
+ default: 'none',
57
+ label: 'Period',
58
+ help: 'Whether a request of this category asks for a period, from and until: not asked, optional or required.',
59
+ }),
60
+ askPartner: f.selection(PRESENCE, {
61
+ required: true,
62
+ default: 'none',
63
+ label: 'Contact',
64
+ help: 'Whether a request of this category asks for a contact: not asked, optional or required.',
65
+ }),
66
+ askLocation: f.selection(PRESENCE, {
67
+ required: true,
68
+ default: 'none',
69
+ label: 'Location',
70
+ help: 'Whether a request of this category asks for a location: not asked, optional or required.',
71
+ }),
72
+ askQuantity: f.selection(PRESENCE, {
73
+ required: true,
74
+ default: 'none',
75
+ label: 'Quantity',
76
+ help: 'Whether a request of this category asks for a quantity: not asked, optional or required.',
77
+ }),
78
+ askLines: f.selection(PRESENCE, {
79
+ required: true,
80
+ default: 'none',
81
+ label: 'Lines',
82
+ help: 'Whether a request of this category asks for lines with quantities and prices: not asked, optional or required.',
83
+ }),
84
+ askAttachment: f.selection(PRESENCE, {
85
+ required: true,
86
+ default: 'none',
87
+ label: 'Attachment',
88
+ help: 'Required: the request is submitted only with a file attached.',
89
+ }),
90
+ /** What an approved request leads to: one of the outcomes the installed apps offer (empty: nothing). */
91
+ outcome: f.char({
92
+ size: 32,
93
+ label: 'On approval',
94
+ help: 'Empty: nothing more. `purchase`: a request for quotation from the lines (with Purchase).',
95
+ }),
96
+ /** Its policy on requests (made when the first request is submitted; its levels are edited there). */
97
+ policy: f.many2one('approval.policy', { ondelete: 'set null', label: 'Approval policy' }),
98
+ requestCount: f.integer({
99
+ label: 'Requests',
100
+ ...compute('approval.category', 'requestCount', ['asks'], (categories) => {
101
+ for (const c of categories)
102
+ c.requestCount = c.asks.length;
103
+ }),
104
+ }),
105
+ asks: f.one2many('approval.ask', 'category'),
106
+ },
107
+ sqlConstraints: {
108
+ oneCode: { unique: ['company', 'code'], message: 'Another category has this code.' },
109
+ },
110
+ constraints: {
111
+ // An outcome is one an installed app offers.
112
+ knownOutcome: {
113
+ ...check('approval.category', ['outcome'], async (categories) => {
114
+ const offered = await outcomesOffered(categories.env);
115
+ return categories
116
+ .filter((c) => c.outcome !== null && c.outcome !== '' && !offered.has(c.outcome))
117
+ .map((c) => c.id);
118
+ }),
119
+ message: 'No installed app offers this outcome.',
120
+ },
121
+ },
122
+ });
123
+ const STATES = {
124
+ draft: 'Draft',
125
+ submitted: 'Waiting for approval',
126
+ approved: 'Approved',
127
+ refused: 'Refused',
128
+ cancelled: 'Cancelled',
129
+ };
130
+ /** A request of a category: what is asked, by whom, with its fields, lines and outcome. */
131
+ export const ApprovalAsk = defineModel('approval.ask', {
132
+ label: 'Request',
133
+ recName: 'title',
134
+ order: ['id desc'],
135
+ companyScoped: { required: true },
136
+ tracking: ['state', 'amount', 'dateFrom', 'dateTo'],
137
+ access: { 'base.user': ['read', 'write', 'create'], 'approvals.manager': ALL },
138
+ rules: {
139
+ // One's own requests (deciders see them through the inbox, as the system); changed while a draft or refused.
140
+ own: { groups: ['base.user'], perms: ['read'], domain: { requester: me } },
141
+ // Who may decide it reads it (named when it is submitted).
142
+ deciding: { groups: ['base.user'], perms: ['read'], domain: { deciders: { any: { id: me } } } },
143
+ ownDraft: {
144
+ groups: ['base.user'],
145
+ perms: ['write', 'create'],
146
+ domain: { requester: me, state: { in: ['draft', 'refused'] } },
147
+ },
148
+ managers: {
149
+ groups: ['approvals.manager'],
150
+ perms: ['read', 'write', 'create', 'unlink'],
151
+ domain: {},
152
+ },
153
+ },
154
+ fields: {
155
+ name: f.char({ readonly: true, sequence: 'approval.ask', label: 'Number' }),
156
+ category: f.many2one('approval.category', { required: true, ondelete: 'restrict' }),
157
+ title: f.char({ required: true, label: 'What for' }),
158
+ requester: f.many2one('res.users', {
159
+ required: true,
160
+ default: (env) => env.userId,
161
+ ondelete: 'restrict',
162
+ label: 'Asked by',
163
+ }),
164
+ description: f.text(),
165
+ amount: f.decimal({ scale: 2 }),
166
+ dateFrom: f.date({ label: 'From' }),
167
+ dateTo: f.date({ label: 'Until' }),
168
+ partner: f.many2one('res.partner', { ondelete: 'set null', label: 'Contact' }),
169
+ location: f.char(),
170
+ quantity: f.decimal({ scale: 3 }),
171
+ lines: f.one2many('approval.ask.line', 'ask'),
172
+ linesTotal: f.decimal({
173
+ scale: 2,
174
+ store: true,
175
+ label: 'Lines total',
176
+ help: 'The sum of the lines’ subtotals.',
177
+ ...compute('approval.ask', 'linesTotal', ['lines.subtotal'], (asks) => {
178
+ for (const a of asks)
179
+ a.linesTotal = [...a.lines].reduce((s, l) => s.plus(l.subtotal ?? 0), ZERO);
180
+ }),
181
+ }),
182
+ /** The document the outcome made (`purchase.order` 12…), shown on the request. */
183
+ resultModel: f.char({ label: 'Made' }),
184
+ resultId: f.integer(),
185
+ resultName: f.char({ label: 'Made document' }),
186
+ approvedAt: f.datetime({ label: 'Approved on' }),
187
+ /** What the category asks for (the form shows and marks the fields by them). */
188
+ askAmount: f.selection(PRESENCE, {
189
+ store: true,
190
+ help: 'Whether this request asks for an amount, as its category says.',
191
+ ...compute('approval.ask', 'askAmount', ['category.askAmount'], (asks) => {
192
+ for (const a of asks)
193
+ a.askAmount = a.category?.askAmount ?? 'none';
194
+ }),
195
+ }),
196
+ askPeriod: f.selection(PRESENCE, {
197
+ store: true,
198
+ help: 'Whether this request asks for a period, as its category says.',
199
+ ...compute('approval.ask', 'askPeriod', ['category.askPeriod'], (asks) => {
200
+ for (const a of asks)
201
+ a.askPeriod = a.category?.askPeriod ?? 'none';
202
+ }),
203
+ }),
204
+ askPartner: f.selection(PRESENCE, {
205
+ store: true,
206
+ help: 'Whether this request asks for a contact, as its category says.',
207
+ ...compute('approval.ask', 'askPartner', ['category.askPartner'], (asks) => {
208
+ for (const a of asks)
209
+ a.askPartner = a.category?.askPartner ?? 'none';
210
+ }),
211
+ }),
212
+ askLocation: f.selection(PRESENCE, {
213
+ store: true,
214
+ help: 'Whether this request asks for a location, as its category says.',
215
+ ...compute('approval.ask', 'askLocation', ['category.askLocation'], (asks) => {
216
+ for (const a of asks)
217
+ a.askLocation = a.category?.askLocation ?? 'none';
218
+ }),
219
+ }),
220
+ askQuantity: f.selection(PRESENCE, {
221
+ store: true,
222
+ help: 'Whether this request asks for a quantity, as its category says.',
223
+ ...compute('approval.ask', 'askQuantity', ['category.askQuantity'], (asks) => {
224
+ for (const a of asks)
225
+ a.askQuantity = a.category?.askQuantity ?? 'none';
226
+ }),
227
+ }),
228
+ askLines: f.selection(PRESENCE, {
229
+ store: true,
230
+ help: 'Whether this request asks for lines, as its category says.',
231
+ ...compute('approval.ask', 'askLines', ['category.askLines'], (asks) => {
232
+ for (const a of asks)
233
+ a.askLines = a.category?.askLines ?? 'none';
234
+ }),
235
+ }),
236
+ askAttachment: f.selection(PRESENCE, {
237
+ store: true,
238
+ help: 'Whether this request asks for an attached file, as its category says.',
239
+ ...compute('approval.ask', 'askAttachment', ['category.askAttachment'], (asks) => {
240
+ for (const a of asks)
241
+ a.askAttachment = a.category?.askAttachment ?? 'none';
242
+ }),
243
+ }),
244
+ /** Who may decide it: its levels' approvers and their delegates, when it was submitted. */
245
+ deciders: f.many2many('res.users', {
246
+ relation: 'approval_ask_decider_rel',
247
+ label: 'Decided by',
248
+ }),
249
+ state: f.state({
250
+ states: STATES,
251
+ initial: 'draft',
252
+ help: 'Submitted to the category’s approvers; approved, its outcome runs.',
253
+ transitions: {
254
+ submit: {
255
+ from: ['draft', 'refused'],
256
+ to: 'submitted',
257
+ guard: records('approval.ask', async (asks) => missingFields(asks.env, asks.ids)),
258
+ message: 'Fill in what the category asks for (and attach a file when it is required).',
259
+ before: records('approval.ask', async (asks) => {
260
+ // The category's policy exists before the engine looks for it.
261
+ const env = asks.env;
262
+ const categories = new Set();
263
+ for (const a of await asks.load(['category']))
264
+ categories.add(a.category.id);
265
+ await env.asSuperuser({ reason: 'request category policy' }, async (su) => {
266
+ for (const c of categories)
267
+ await ensureCategoryPolicy(su, c);
268
+ });
269
+ }),
270
+ after: records('approval.ask', async (asks) => {
271
+ await requestApprovals(asks);
272
+ const env = asks.env;
273
+ const today = new Date().toISOString().slice(0, 10);
274
+ await env.asSuperuser({ reason: 'request deciders' }, async (su) => {
275
+ for (const id of asks.ids) {
276
+ const people = new Set();
277
+ for (const r of await requestsOf(su, 'approval.ask', id))
278
+ if (r.state === 'pending')
279
+ for (const u of await decidersOf(su, r, today))
280
+ people.add(u);
281
+ await su
282
+ .model('approval.ask')
283
+ .browse([id])
284
+ .write({ deciders: { set: [...people] } });
285
+ }
286
+ });
287
+ }),
288
+ },
289
+ approve: {
290
+ from: ['submitted'],
291
+ to: 'approved',
292
+ guard: records('approval.ask', (asks) => approvalGuard(asks)),
293
+ message: 'Waiting for approvals.',
294
+ // Run as the system by the engine: the outcome of each request's category.
295
+ after: records('approval.ask', async (asks) => {
296
+ const env = asks.env;
297
+ await env
298
+ .model('approval.ask')
299
+ .browse(asks.ids)
300
+ .write({ approvedAt: new Date() });
301
+ await asksOf(env, asks.ids).runOutcome();
302
+ for (const id of asks.ids)
303
+ await env.emit('approval.ask.approved', { id });
304
+ }),
305
+ },
306
+ refuse: { from: ['submitted'], to: 'refused' },
307
+ redraft: { from: ['submitted', 'refused', 'cancelled'], to: 'draft' },
308
+ cancel: { from: ['draft', 'submitted', 'refused'], to: 'cancelled' },
309
+ },
310
+ }),
311
+ },
312
+ sqlConstraints: {
313
+ amountPositive: {
314
+ check: orm.sql `amount IS NULL OR amount >= 0`,
315
+ message: 'An amount is not negative.',
316
+ },
317
+ period: {
318
+ check: orm.sql `date_from IS NULL OR date_to IS NULL OR date_to >= date_from`,
319
+ message: 'A period ends on or after it starts.',
320
+ },
321
+ },
322
+ methods: {
323
+ /** The outcomes the installed apps offer, by code. None here; apps add theirs. */
324
+ outcomes: method('approval.ask', async () => new Map()),
325
+ /**
326
+ * Runs the outcome of each approved request's category (as the system). Nothing here; an app that offers an
327
+ * outcome makes its document for the requests of that outcome and writes `resultModel` / `resultId`.
328
+ */
329
+ runOutcome: method('approval.ask', async () => undefined),
330
+ },
331
+ });
332
+ /** A line of a request: what, how many, at what price. Apps add theirs (a product, with Purchase). */
333
+ export const ApprovalAskLine = defineModel('approval.ask.line', {
334
+ label: 'Request line',
335
+ order: ['ask asc', 'sequence asc', 'id asc'],
336
+ access: { 'base.user': ['read', 'write', 'create', 'unlink'], 'approvals.manager': ALL },
337
+ fields: {
338
+ ask: f.many2one('approval.ask', { required: true, ondelete: 'cascade' }),
339
+ sequence: f.integer({ required: true, default: 10 }),
340
+ name: f.char({ required: true, label: 'Description' }),
341
+ quantity: f.decimal({ scale: 3, required: true, default: '1' }),
342
+ priceUnit: f.decimal({ scale: 2, required: true, default: '0', label: 'Unit price' }),
343
+ subtotal: f.decimal({
344
+ scale: 2,
345
+ store: true,
346
+ help: 'The quantity times the unit price.',
347
+ ...compute('approval.ask.line', 'subtotal', ['quantity', 'priceUnit'], (lines) => {
348
+ for (const l of lines)
349
+ l.subtotal = l.quantity.times(l.priceUnit).toDecimalPlaces(2);
350
+ }),
351
+ }),
352
+ },
353
+ sqlConstraints: {
354
+ positive: {
355
+ check: orm.sql `quantity > 0 AND price_unit >= 0`,
356
+ message: 'A line asks for a positive quantity at a price not below zero.',
357
+ },
358
+ },
359
+ });
360
+ /** The requests (of `ids`) missing a field their category requires. */
361
+ export async function missingFields(env, ids) {
362
+ const bad = [];
363
+ for (const a of await env
364
+ .model('approval.ask')
365
+ .browse(ids)
366
+ .load({ category: true, lines: ['id'] })) {
367
+ const c = a.category;
368
+ const required = (key) => c[ASKED[key]] === 'required';
369
+ const empty = (required('amount') && a.amount === null) ||
370
+ (required('period') && (a.dateFrom === null || a.dateTo === null)) ||
371
+ (required('partner') && a.partner === null) ||
372
+ (required('location') && (a.location ?? '').trim() === '') ||
373
+ (required('quantity') && a.quantity === null) ||
374
+ (required('lines') && a.lines.length === 0);
375
+ if (empty) {
376
+ bad.push(a.id);
377
+ continue;
378
+ }
379
+ if (required('attachment')) {
380
+ const files = await env.asSuperuser({ reason: 'request attachments' }, (su) => su.model('storage.attachment').search({
381
+ where: { resModel: 'approval.ask', resId: a.id },
382
+ limit: 1,
383
+ }));
384
+ if (files.ids.length === 0)
385
+ bad.push(a.id);
386
+ }
387
+ }
388
+ return bad;
389
+ }
390
+ /**
391
+ * The category's policy on requests (as the system): made when missing — its condition the category, one level
392
+ * decided by the requester's manager (an Approvals manager without one) —, kept as it is when it exists.
393
+ */
394
+ export async function ensureCategoryPolicy(su, category) {
395
+ const [c] = await su
396
+ .model('approval.category')
397
+ .browse([category])
398
+ .load(['name', 'policy', 'company']);
399
+ if (c === undefined)
400
+ throw new Error(`approval.category ${category} is missing`);
401
+ if (c.policy !== null)
402
+ return c.policy.id;
403
+ const policy = await su.model('approval.policy').create([
404
+ {
405
+ name: `Requests: ${String(c.name)}`,
406
+ targetModel: 'approval.ask',
407
+ condition: { category },
408
+ company: c.company?.id ?? null,
409
+ onApproved: 'approve',
410
+ onRejected: 'refuse',
411
+ onSentBack: 'redraft',
412
+ onWithdrawn: 'redraft',
413
+ },
414
+ ]);
415
+ const id = policy.ids[0];
416
+ await su.model('approval.level').create([
417
+ {
418
+ policy: id,
419
+ sequence: 10,
420
+ name: 'Manager',
421
+ approverKind: 'manager',
422
+ approverRole: 'approvals.manager',
423
+ },
424
+ ]);
425
+ await su
426
+ .model('approval.category')
427
+ .browse([category])
428
+ .write({ policy: id });
429
+ return id;
430
+ }
431
+ export const approvalsShutro = defineModule({
432
+ name: 'approvals',
433
+ version: '0.2.0',
434
+ depends: [permissionsShutro, contactsShutro],
435
+ sequences: [orm.defineSequence({ code: 'approval.ask', prefix: 'REQ-', padding: 5 })],
436
+ models: [ApprovalCategory, ApprovalAsk, ApprovalAskLine],
437
+ // The categories every installation starts with (theirs to change afterwards).
438
+ data: [
439
+ record('approval.category', 'category_trip', {
440
+ name: 'Business trip',
441
+ code: 'TRIP',
442
+ sequence: 10,
443
+ description: 'Where, when and the estimated cost.',
444
+ askAmount: 'required',
445
+ askPeriod: 'required',
446
+ askLocation: 'required',
447
+ }, { noupdate: true }),
448
+ record('approval.category', 'category_payment', {
449
+ name: 'Payment',
450
+ code: 'PAY',
451
+ sequence: 20,
452
+ description: 'To whom, how much and why; attach the invoice or quotation.',
453
+ askAmount: 'required',
454
+ askPartner: 'required',
455
+ askAttachment: 'required',
456
+ }, { noupdate: true }),
457
+ record('approval.category', 'category_purchase', {
458
+ name: 'Purchase request',
459
+ code: 'PR',
460
+ sequence: 30,
461
+ description: 'What to buy: the lines, and the vendor when known.',
462
+ askAmount: 'none',
463
+ askPartner: 'optional',
464
+ askLines: 'required',
465
+ }, { noupdate: true }),
466
+ record('approval.category', 'category_general', {
467
+ name: 'General',
468
+ code: 'GEN',
469
+ sequence: 90,
470
+ description: 'Anything else that needs a decision.',
471
+ }, { noupdate: true }),
472
+ ],
473
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * The policy and category editor's helpers (RFC 0025 step 4), node components of their forms:
3
+ * - `approvals.PolicyPreview`: which of the last 50 records each level of the policy would have asked about, so a
4
+ * condition is checked before anyone submits; and "Sync waiting requests" (RFC 0027 §2.6);
5
+ * - `approvals.CategoryPolicy`: a request category's approval policy — made on demand when it has none, opened when
6
+ * it has one (its levels are edited there).
7
+ * Shown to Approvals managers (the server decides).
8
+ */
9
+ import { type NodeComponentProps } from '../../ui/index.js';
10
+ import { type ReactElement } from 'react';
11
+ export declare function PolicyPreview({ api, record, version }: NodeComponentProps): ReactElement | null;
12
+ export declare function CategoryPolicy({ api, record, reload }: NodeComponentProps): ReactElement | null;
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * The policy and category editor's helpers (RFC 0025 step 4), node components of their forms:
4
+ * - `approvals.PolicyPreview`: which of the last 50 records each level of the policy would have asked about, so a
5
+ * condition is checked before anyone submits; and "Sync waiting requests" (RFC 0027 §2.6);
6
+ * - `approvals.CategoryPolicy`: a request category's approval policy — made on demand when it has none, opened when
7
+ * it has one (its levels are edited there).
8
+ * Shown to Approvals managers (the server decides).
9
+ */
10
+ import { Alert, Button } from '../../ui/index.js';
11
+ import { useMutation, useQuery } from '@tanstack/react-query';
12
+ import { useState } from 'react';
13
+ import { useTranslation } from 'react-i18next';
14
+ export function PolicyPreview({ api, record, version }) {
15
+ const { t } = useTranslation('approvals');
16
+ const id = typeof record?.id === 'number' ? record.id : null;
17
+ const preview = useQuery({
18
+ queryKey: ['approvals.preview', id, version],
19
+ enabled: id !== null,
20
+ queryFn: () => api.call('GET', `/api/v1/approvals/policies/${String(id)}/preview`),
21
+ });
22
+ const [synced, setSynced] = useState(null);
23
+ const sync = useMutation({
24
+ mutationFn: () => api.call('POST', `/api/v1/approvals/policies/${String(id)}/sync`, {}),
25
+ onSuccess: (r) => setSynced(r.synced),
26
+ });
27
+ if (id === null || preview.isError)
28
+ return null;
29
+ if (preview.isPending)
30
+ return _jsx("p", { className: "text-sm text-muted-foreground", children: t('loading') });
31
+ const { records, levels, covers } = preview.data;
32
+ return (_jsxs("section", { "aria-label": t('preview.title'), className: "grid gap-1 rounded-md border border-border p-3", children: [_jsx("h3", { className: "text-sm font-semibold", children: t('preview.title') }), covers === undefined ? null : (_jsx("p", { className: "text-xs", children: covers.all
33
+ ? t('preview.everyCompany')
34
+ : covers.companies.length === 0
35
+ ? t('preview.noCompany')
36
+ : t('preview.covers', { companies: covers.companies.join(', ') }) })), _jsx("p", { className: "text-xs text-muted-foreground", children: t('preview.explain', { count: records }) }), _jsx("ul", { className: "grid gap-1 text-sm", children: levels.map((l) => (_jsxs("li", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { children: l.name }), _jsx("span", { className: "tabular-nums text-muted-foreground", children: t('preview.matched', { matched: l.matched.length, count: records }) })] }, l.id))) }), _jsxs("div", { className: "flex flex-wrap items-center gap-2 pt-1", children: [_jsx(Button, { size: "sm", variant: "secondary", disabled: sync.isPending, onClick: () => sync.mutate(), children: t('preview.sync') }), synced === null ? null : (_jsx("span", { role: "status", className: "text-xs text-muted-foreground", children: t('preview.synced', { count: synced }) }))] })] }));
37
+ }
38
+ export function CategoryPolicy({ api, record, reload }) {
39
+ const { t } = useTranslation('approvals');
40
+ const [error, setError] = useState(null);
41
+ const id = typeof record?.id === 'number' ? record.id : null;
42
+ const make = useMutation({
43
+ mutationFn: () => api.call('POST', `/api/v1/approvals/categories/${String(id)}/policy`, {}),
44
+ onSuccess: (r) => {
45
+ setError(null);
46
+ reload();
47
+ window.location.assign(`/approvals/a/approvals.action_policies/${r.policy}`);
48
+ },
49
+ onError: (e) => setError(e.message),
50
+ });
51
+ if (id === null)
52
+ return null;
53
+ const policy = record?.['policy'];
54
+ const policyId = typeof policy === 'number'
55
+ ? policy
56
+ : typeof policy === 'object' && policy !== null
57
+ ? Number(policy.id)
58
+ : null;
59
+ return (_jsxs("div", { className: "grid gap-2", children: [error === null ? null : _jsx(Alert, { tone: "danger", children: error }), policyId === null ? (_jsx("div", { children: _jsx(Button, { busy: make.isPending, onClick: () => make.mutate(), children: t('category.setUp') }) })) : (_jsx("a", { className: "text-sm text-primary underline", href: `/approvals/a/approvals.action_policies/${policyId}`, children: t('category.editLevels') }))] }));
60
+ }
@@ -0,0 +1,4 @@
1
+ /** What I decided (RFC 0025 §3.1): each decision with the record, my answer, my comment and when. */
2
+ import { type PageProps } from '../../ui/index.js';
3
+ import type { ReactElement } from 'react';
4
+ export declare function History({ api }: PageProps): ReactElement;
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /** What I decided (RFC 0025 §3.1): each decision with the record, my answer, my comment and when. */
3
+ import { Badge, EmptyState, useKosh } from '../../ui/index.js';
4
+ import { useQuery } from '@tanstack/react-query';
5
+ import { useTranslation } from 'react-i18next';
6
+ import { cardsQuery, TONE } from './shared.js';
7
+ export function History({ api }) {
8
+ const { t } = useTranslation('approvals');
9
+ const { format } = useKosh();
10
+ const cards = useQuery(cardsQuery(api, 'history'));
11
+ const rows = cards.data ?? [];
12
+ return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('history.title') }), rows.length === 0 ? (_jsx(EmptyState, { title: cards.isLoading ? t('loading') : t('history.empty') })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: "px-2 py-1 text-start", children: t('history.record') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('history.level') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('history.answer') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('history.comment') }), _jsx("th", { className: "px-2 py-1 text-start", children: t('history.when') })] }) }), _jsx("tbody", { children: rows.map((c) => (_jsxs("tr", { className: "border-b", children: [_jsxs("td", { className: "px-2 py-1", children: [_jsx("span", { className: "font-medium", children: c.record.name }), ' ', _jsx("span", { className: "text-muted-foreground", children: c.record.label })] }), _jsx("td", { className: "px-2 py-1", children: c.levelName }), _jsx("td", { className: "px-2 py-1", children: _jsx(Badge, { tone: TONE[c.state], children: t(`state.${c.state}`) }) }), _jsx("td", { className: "px-2 py-1", children: c.comment ?? '' }), _jsx("td", { className: "px-2 py-1", children: c.decidedAt === null ? '' : format.datetime(c.decidedAt) })] }, c.id))) })] }) }))] }));
13
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The Approvals inbox (RFC 0025 §3.1): what waits for me, as cards — the record and its app, who asked and how long
3
+ * ago, every level of the round as a step with its votes —, decided one by one (approve, reject or send back, with a
4
+ * comment; a reason is needed for the last two) or many at once. Keyboard: J / K move, A approves, R rejects, X
5
+ * selects. The server decides who may decide what; this page shows and sends.
6
+ */
7
+ import { type PageProps } from '../../ui/index.js';
8
+ import { type ReactElement } from 'react';
9
+ export declare function Inbox({ api }: PageProps): ReactElement;