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
@@ -2,19 +2,31 @@
2
2
  * The data layer of the Purchase ↔ Stockroom bridge (RFC 0021): a confirmed purchase order gets its receipt — one
3
3
  * Stockroom transfer with a line per goods line, in the line's unit, from the vendors into the company's main
4
4
  * warehouse, expected on the order's arrival date — made once through the outbox (`purchase.order.confirmed`) and
5
- * confirmed. The order shows its receipts and what is received; each line, its received quantity.
5
+ * confirmed. The order shows its receipts and what is received; each line, its received quantity. An order may name
6
+ * the warehouse it is delivered to (the main one otherwise). Reorder rules that buy (RFC 0024 §2.6) order on
7
+ * requests for quotation to their vendor — a draft one from replenishment gets the new lines — and count what is
8
+ * on requests and orders not received yet as on order. Dropshipped products leave a delivery as it is confirmed:
9
+ * a dropship transfer from the vendor to the customer, with its request for quotation (no receipt: the vendor
10
+ * delivers).
6
11
  */
7
12
  import { productShutro } from '../product/index.js';
8
- import { purchaseShutro } from '../purchase/index.js';
13
+ import { purchaseShutro, vendorPriceFor } from '../purchase/index.js';
9
14
  import { orm } from '../server/orm.js';
10
- import { defaultLocations, stockShutro } from '../stock/index.js';
15
+ import { defaultLocations, inProductUnit, stockShutro } from '../stock/index.js';
11
16
  import { compute, defineModule, extendModel, f } from './.kosh/bindings.js';
17
+ import { vendorScorecard } from './scorecard.js';
12
18
  const zero = orm.toDecimal(0);
13
19
  export const PickingPurchase = extendModel('stock.picking', {
14
20
  fields: {
15
21
  purchaseOrder: f.many2one('purchase.order', { ondelete: 'set null', label: 'Purchase order' }),
16
22
  },
17
23
  overrides: {
24
+ // Lines of products dropshipped from the warehouse leave the delivery for a dropship and its request.
25
+ routing: async function (next) {
26
+ await next();
27
+ const pickings = this;
28
+ await dropship(pickings.env, pickings.ids);
29
+ },
18
30
  // A backorder stays with its order.
19
31
  backorderValues: async function (next) {
20
32
  const out = await next();
@@ -40,17 +52,34 @@ export const MovePurchase = extendModel('stock.move', {
40
52
  });
41
53
  export const LineReceived = extendModel('purchase.order.line', {
42
54
  fields: {
55
+ /** What went back to the vendor by validated returns (RFC 0030 §3.2), in the line's unit. */
56
+ qtyReturned: f.decimal({
57
+ scale: 3,
58
+ store: true,
59
+ label: 'Returned',
60
+ help: 'What was sent back to the vendor by validated returns of its receipts.',
61
+ ...compute('purchase.order.line', 'qtyReturned', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state', 'moves.returnOf'], (lines) => {
62
+ for (const l of lines)
63
+ l.qtyReturned = [...l.moves]
64
+ .filter((m) => m.picking.state === 'done' && m.returnOf !== null)
65
+ .reduce((s, m) => s.plus(m.quantityDone ?? m.quantity), zero);
66
+ }),
67
+ }),
43
68
  moves: f.one2many('stock.move', 'purchaseLine'),
44
69
  /** Received by validated receipts, in the line's unit. */
45
70
  qtyReceived: f.decimal({
46
71
  scale: 3,
47
72
  store: true,
48
73
  label: 'Received',
49
- ...compute('purchase.order.line', 'qtyReceived', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state'], (lines) => {
74
+ ...compute('purchase.order.line', 'qtyReceived', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state', 'moves.returnOf'], (lines) => {
75
+ // What went back to the vendor (a return of a receipt, RFC 0030 §3.2) is not received any more.
50
76
  for (const l of lines)
51
77
  l.qtyReceived = [...l.moves]
52
78
  .filter((m) => m.picking.state === 'done')
53
- .reduce((s, m) => s.plus(m.quantityDone ?? m.quantity), zero);
79
+ .reduce((s, m) => {
80
+ const qty = m.quantityDone ?? m.quantity;
81
+ return m.returnOf === null ? s.plus(qty) : s.minus(qty);
82
+ }, zero);
54
83
  }),
55
84
  }),
56
85
  },
@@ -58,6 +87,32 @@ export const LineReceived = extendModel('purchase.order.line', {
58
87
  export const OrderReceipts = extendModel('purchase.order', {
59
88
  fields: {
60
89
  receipts: f.one2many('stock.picking', 'purchaseOrder'),
90
+ /** The vendor's on-time delivery rate (RFC 0030 §3.1), shown beside the expected arrival (RFC 0032 §3.4). */
91
+ vendorOnTime: f.char({
92
+ label: 'On-time delivery',
93
+ help: 'The share of the vendor’s receipts that arrived by their expected date.',
94
+ ...compute('purchase.order', 'vendorOnTime', ['partner'], async (orders) => {
95
+ const env = orders.env;
96
+ for (const o of orders) {
97
+ // A new order has no vendor yet.
98
+ if (o.partner === null) {
99
+ o.vendorOnTime = '';
100
+ continue;
101
+ }
102
+ const card = await vendorScorecard(env, o.partner.id);
103
+ o.vendorOnTime =
104
+ card.onTimeRate === null ? '' : `${card.onTimeRate}% on time (${card.onTime} receipts)`;
105
+ }
106
+ }),
107
+ }),
108
+ /** The vendor delivers to the customer: the order's transfer is a dropship, never received in stock. */
109
+ dropship: f.boolean({ default: false, label: 'Dropship' }),
110
+ /** Where the goods are received (the company's main warehouse when empty). */
111
+ warehouse: f.many2one('stock.warehouse', {
112
+ ondelete: 'set null',
113
+ checkCompany: true,
114
+ label: 'Deliver to',
115
+ }),
61
116
  receiptState: f.selection({
62
117
  nothing: 'Nothing to receive',
63
118
  to_receive: 'To receive',
@@ -91,7 +146,13 @@ export async function createReceiptFor(env, orderId) {
91
146
  const [order] = await su
92
147
  .model('purchase.order')
93
148
  .browse([orm.asId(orderId, 'purchase.order')])
94
- .load({ lines: { product: true, uom: true }, partner: true, company: true, receipts: true });
149
+ .load({
150
+ lines: { product: true, uom: true },
151
+ partner: true,
152
+ company: true,
153
+ receipts: true,
154
+ warehouse: true,
155
+ });
95
156
  if (order === undefined || (order.state !== 'purchase' && order.state !== 'done'))
96
157
  return null;
97
158
  if ([...order.receipts].some((r) => r.state !== 'cancel'))
@@ -99,7 +160,7 @@ export async function createReceiptFor(env, orderId) {
99
160
  const goods = order.lines.filter((l) => l.product.kind === 'goods');
100
161
  if (goods.length === 0)
101
162
  return null;
102
- const places = await defaultLocations(su, 'receipt', null, order.company.id);
163
+ const places = await defaultLocations(su, 'receipt', order.warehouse?.id ?? null, order.company.id);
103
164
  if (places.source === null || places.destination === null)
104
165
  throw new orm.ValidationError('purchase.order', ['state'], `The company of ${order.name} has no warehouse to receive into.`, 'Add a warehouse in Stockroom › Configuration › Warehouses.');
105
166
  const made = await su.model('stock.picking').create([
@@ -128,9 +189,256 @@ export async function createReceiptFor(env, orderId) {
128
189
  return made.ids[0] ?? null;
129
190
  });
130
191
  }
192
+ const OPEN_RFQ = ['draft', 'sent', 'to_approve'];
193
+ const isoPlus = (today, days) => {
194
+ const d = new Date(`${today}T00:00:00Z`);
195
+ d.setUTCDate(d.getUTCDate() + days);
196
+ return d.toISOString().slice(0, 10);
197
+ };
198
+ /**
199
+ * Draft deliveries' lines of products with a dropship rule in the warehouse they leave from go to a dropship
200
+ * transfer per vendor — vendors to the delivery's customer, with every link of the delivery and its lines (a sales
201
+ * order's) — and a request for quotation to that vendor, marked as a dropship, linked line by line. A delivery left
202
+ * with no lines becomes the dropship itself.
203
+ */
204
+ async function dropship(env, ids) {
205
+ await env.asSuperuser({ reason: 'dropship' }, async (su) => {
206
+ const [vendors] = (await su.model('stock.location').search({ where: { usage: 'vendor' }, limit: 1 })).ids;
207
+ if (vendors === undefined)
208
+ return;
209
+ const pickings = await su
210
+ .model('stock.picking')
211
+ .browse(ids)
212
+ .load({
213
+ source: { warehouse: true },
214
+ company: true,
215
+ moves: { product: { purchaseTaxes: true }, uom: true },
216
+ });
217
+ for (const p of pickings) {
218
+ const wh = p.source.warehouse;
219
+ if (p.kind !== 'delivery' || p.state !== 'draft' || wh === null)
220
+ continue;
221
+ const moves = [...p.moves];
222
+ const byVendor = new Map();
223
+ for (const m of moves) {
224
+ const [rule] = await (await su.model('stock.reorder').search({
225
+ where: { product: m.product.id, warehouse: wh.id, method: 'dropship' },
226
+ limit: 1,
227
+ })).load({ vendor: true });
228
+ if (rule?.vendor === null || rule?.vendor === undefined)
229
+ continue;
230
+ const v = byVendor.get(rule.vendor.id) ?? { leadDays: rule.leadDays, moves: [] };
231
+ v.moves.push(m);
232
+ byVendor.set(rule.vendor.id, v);
233
+ }
234
+ if (byVendor.size === 0)
235
+ continue;
236
+ const total = byVendor.size === 1 && [...byVendor.values()][0]?.moves.length === moves.length;
237
+ const pickingValues = (await su.model('stock.picking').browse([p.id]).backorderValues()).get(p.id);
238
+ const today = su.today();
239
+ for (const [vendor, v] of byVendor) {
240
+ const made = await su.model('purchase.order').create([
241
+ {
242
+ partner: vendor,
243
+ company: p.company.id,
244
+ currency: p.company.currency.id,
245
+ warehouse: wh.id,
246
+ dropship: true,
247
+ dateOrder: today,
248
+ datePlanned: isoPlus(today, v.leadDays),
249
+ origin: p.origin ?? p.name,
250
+ lines: {
251
+ create: v.moves.map((m) => ({
252
+ product: m.product.id,
253
+ name: m.name ?? m.product.name,
254
+ quantity: m.quantity,
255
+ uom: m.uom?.id ?? m.product.uom?.id ?? null,
256
+ priceUnit: m.product.standardPrice,
257
+ taxes: { set: [...m.product.purchaseTaxes.ids] },
258
+ })),
259
+ },
260
+ },
261
+ ]);
262
+ const order = made.ids[0];
263
+ const orderLines = (await su.model('purchase.order.line').search({
264
+ where: { order: order },
265
+ order: ['id asc'],
266
+ })).ids;
267
+ if (total) {
268
+ await su
269
+ .model('stock.picking')
270
+ .browse([p.id])
271
+ .write({ kind: 'dropship', source: vendors, purchaseOrder: order });
272
+ for (const [i, m] of v.moves.entries())
273
+ await su
274
+ .model('stock.move')
275
+ .browse([m.id])
276
+ .write({ purchaseLine: orderLines[i] ?? null });
277
+ continue;
278
+ }
279
+ const lineValues = await su
280
+ .model('stock.move')
281
+ .browse(v.moves.map((m) => m.id))
282
+ .backorderValues();
283
+ const split = await su.model('stock.picking').create([
284
+ {
285
+ ...pickingValues,
286
+ kind: 'dropship',
287
+ source: vendors,
288
+ next: null,
289
+ purchaseOrder: order,
290
+ moves: {
291
+ create: v.moves.map((m, i) => ({
292
+ ...lineValues.get(m.id),
293
+ quantity: m.quantity,
294
+ purchaseLine: orderLines[i] ?? null,
295
+ })),
296
+ },
297
+ },
298
+ ]);
299
+ await su
300
+ .model('stock.move')
301
+ .browse(v.moves.map((m) => m.id))
302
+ .unlink();
303
+ await su
304
+ .model('stock.picking')
305
+ .browse(split.ids)
306
+ .confirm();
307
+ }
308
+ }
309
+ await su.flush();
310
+ });
311
+ }
312
+ /** The warehouse an order is received into: its own, else the company's main one. */
313
+ async function receivedInto(env, warehouse, company) {
314
+ return warehouse ?? (await defaultLocations(env, 'receipt', null, company)).warehouse;
315
+ }
316
+ /** The vendor price a buying rule would use for `qty`: in the company's currency, arriving within the rule's days. */
317
+ async function chooseVendor(env, r, qty) {
318
+ const today = env.today();
319
+ const needBy = new Date(`${today}T00:00:00Z`);
320
+ needBy.setUTCDate(needBy.getUTCDate() + r.leadDays);
321
+ return vendorPriceFor(env, {
322
+ product: r.product.id,
323
+ quantity: orm.toDecimal(qty),
324
+ date: today,
325
+ currency: r.company.currency.id,
326
+ needBy: needBy.toISOString().slice(0, 10),
327
+ });
328
+ }
329
+ export const ReorderBuy = extendModel('stock.reorder', {
330
+ overrides: {
331
+ // Requests for quotation and orders not received yet (their receipt is still to be made) are on order.
332
+ pending: async function (next) {
333
+ const out = await next();
334
+ const rules = this;
335
+ const env = rules.env;
336
+ for (const r of await rules.load({ product: true })) {
337
+ const lines = await (await env.model('purchase.order.line').search({
338
+ where: {
339
+ product: r.product.id,
340
+ 'order.company': r.company.id,
341
+ 'order.state': { in: [...OPEN_RFQ, 'purchase', 'done'] },
342
+ },
343
+ })).load({ order: { receipts: true }, uom: true, product: { uom: true } });
344
+ const found = out.get(r.id) ?? [];
345
+ for (const l of lines) {
346
+ if (l.order.dropship)
347
+ continue;
348
+ if (!OPEN_RFQ.includes(l.order.state) && l.order.receipts.length > 0)
349
+ continue;
350
+ if ((await receivedInto(env, l.order.warehouse?.id ?? null, r.company.id)) !==
351
+ r.warehouse.id)
352
+ continue;
353
+ const qty = inProductUnit(l.quantity, l.uom, l.product.uom);
354
+ found.push({ quantity: qty.toString(), document: l.order.name });
355
+ }
356
+ out.set(r.id, found);
357
+ }
358
+ return out;
359
+ },
360
+ // The vendor a buying rule would order from, and why (RFC 0030 §3.1).
361
+ sourcing: async function (next, proposed) {
362
+ const out = await next(proposed);
363
+ const rules = this;
364
+ const env = rules.env;
365
+ for (const r of await rules.load({ company: true, vendor: true })) {
366
+ const qty = proposed.get(r.id);
367
+ if (r.method !== 'buy' || qty === undefined)
368
+ continue;
369
+ const choice = await chooseVendor(env, r, qty);
370
+ out.set(r.id, choice === null
371
+ ? r.vendor === null
372
+ ? ''
373
+ : `Bought from ${String(r.vendor.name)} (the rule’s vendor: no vendor price fits).`
374
+ : `Bought from ${choice.vendorName}: ${choice.explanation}`);
375
+ }
376
+ return out;
377
+ },
378
+ // Buying: one request for quotation per vendor and warehouse — a draft one from replenishment gets the lines.
379
+ procure: async function (next, quantities) {
380
+ const out = await next(quantities);
381
+ const rules = this;
382
+ const env = rules.env;
383
+ const today = env.today();
384
+ for (const r of await rules.load({ product: { purchaseTaxes: true }, company: true })) {
385
+ const qty = quantities.get(r.id);
386
+ if (r.method !== 'buy' || qty === undefined)
387
+ continue;
388
+ // The vendor prices choose the vendor (the cheapest that arrives in time); else the rule's vendor.
389
+ const choice = await chooseVendor(env, r, qty);
390
+ const vendor = choice?.vendor ?? r.vendor?.id ?? null;
391
+ if (vendor === null)
392
+ continue;
393
+ const arrival = new Date(`${today}T00:00:00Z`);
394
+ arrival.setUTCDate(arrival.getUTCDate() + (choice?.leadDays ?? r.leadDays));
395
+ // The price comes from the vendor's price on the line (or the product's cost).
396
+ const line = {
397
+ product: r.product.id,
398
+ name: r.product.name,
399
+ quantity: qty,
400
+ uom: r.product.uom?.id ?? null,
401
+ taxes: { set: [...r.product.purchaseTaxes.ids] },
402
+ };
403
+ const [open] = await (await env.model('purchase.order').search({
404
+ where: {
405
+ partner: vendor,
406
+ company: r.company.id,
407
+ warehouse: r.warehouse.id,
408
+ state: 'draft',
409
+ origin: 'Replenishment',
410
+ },
411
+ order: ['id desc'],
412
+ limit: 1,
413
+ })).load({});
414
+ if (open !== undefined) {
415
+ await env.model('purchase.order.line').create([{ ...line, order: open.id }]);
416
+ out.set(r.id, open.name);
417
+ continue;
418
+ }
419
+ const made = await env.model('purchase.order').create([
420
+ {
421
+ partner: vendor,
422
+ company: r.company.id,
423
+ currency: r.company.currency.id,
424
+ warehouse: r.warehouse.id,
425
+ dateOrder: today,
426
+ datePlanned: arrival.toISOString().slice(0, 10),
427
+ origin: 'Replenishment',
428
+ lines: { create: [line] },
429
+ },
430
+ ]);
431
+ const [order] = await made.load({});
432
+ out.set(r.id, order?.name ?? '');
433
+ }
434
+ await env.flush();
435
+ return out;
436
+ },
437
+ },
438
+ });
131
439
  export const purchaseStockShutro = defineModule({
132
440
  name: 'purchase_stock',
133
- version: '0.1.0',
441
+ version: '0.3.0',
134
442
  depends: [purchaseShutro, stockShutro, productShutro],
135
443
  groups: [
136
444
  orm.defineGroup({
@@ -140,5 +448,5 @@ export const purchaseStockShutro = defineModule({
140
448
  }),
141
449
  ],
142
450
  models: [],
143
- extensions: [PickingPurchase, MovePurchase, LineReceived, OrderReceipts],
451
+ extensions: [PickingPurchase, MovePurchase, LineReceived, OrderReceipts, ReorderBuy],
144
452
  });
@@ -0,0 +1,22 @@
1
+ /**
2
+ * A vendor's scorecard (RFC 0030 §3.1), from what actually happened over the last year: the confirmed orders, the
3
+ * receipts done and how many by the order's expected date, the average days from order to receipt, and for the
4
+ * products bought most, the last price against the year's average. Read as the caller (Purchase users).
5
+ */
6
+ import type { Env } from './.kosh/bindings.js';
7
+ export interface Scorecard {
8
+ readonly orders: number;
9
+ readonly receipts: number;
10
+ readonly onTime: number;
11
+ /** Percent of receipts done by the expected date, or null without receipts. */
12
+ readonly onTimeRate: number | null;
13
+ readonly averageLeadDays: number | null;
14
+ readonly products: readonly {
15
+ readonly name: string;
16
+ readonly lastPrice: string;
17
+ readonly averagePrice: string;
18
+ /** Percent change of the last price against the average. */
19
+ readonly change: number;
20
+ }[];
21
+ }
22
+ export declare function vendorScorecard(env: Env, vendor: number): Promise<Scorecard>;
@@ -0,0 +1,77 @@
1
+ const ref = (env, name) => env.model(name);
2
+ const dayOf = (v) => v instanceof Date ? v.toISOString().slice(0, 10) : String(v ?? '').slice(0, 10);
3
+ const days = (from, to) => Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / 86_400_000);
4
+ const idOf = (v) => typeof v === 'number' ? v : (v?.id ?? null);
5
+ const decimal = (v) => Number(String(v ?? '0'));
6
+ export async function vendorScorecard(env, vendor) {
7
+ const today = env.today();
8
+ const since = new Date(`${today}T00:00:00Z`);
9
+ since.setUTCFullYear(since.getUTCFullYear() - 1);
10
+ const from = since.toISOString().slice(0, 10);
11
+ const orders = (await (await ref(env, 'purchase.order').search({
12
+ where: { partner: vendor, state: { in: ['purchase', 'done'] }, dateOrder: { gte: from } },
13
+ })).load(['dateOrder', 'datePlanned'])).read(['id', 'dateOrder', 'datePlanned']);
14
+ const byOrder = new Map(orders.map((o) => [o['id'], o]));
15
+ const receipts = orders.length === 0
16
+ ? []
17
+ : (await (await ref(env, 'stock.picking').search({
18
+ where: { purchaseOrder: { in: [...byOrder.keys()] }, state: 'done' },
19
+ })).load(['doneDate', 'purchaseOrder'])).read(['doneDate', 'purchaseOrder']);
20
+ let onTime = 0;
21
+ let lead = 0;
22
+ let counted = 0;
23
+ for (const r of receipts) {
24
+ const order = byOrder.get(idOf(r['purchaseOrder']) ?? -1);
25
+ if (order === undefined || r['doneDate'] == null)
26
+ continue;
27
+ const done = dayOf(r['doneDate']);
28
+ const expected = order['datePlanned'] == null ? null : dayOf(order['datePlanned']);
29
+ if (expected === null || done <= expected)
30
+ onTime++;
31
+ lead += days(dayOf(order['dateOrder']), done);
32
+ counted++;
33
+ }
34
+ const lines = orders.length === 0
35
+ ? []
36
+ : (await (await ref(env, 'purchase.order.line').search({
37
+ where: { order: { in: [...byOrder.keys()] } },
38
+ order: ['id asc'],
39
+ })).load({ product: true })).read(['product', 'priceUnit', 'quantity']);
40
+ const productIds = [...new Set(lines.map((l) => idOf(l['product'])).filter((p) => p !== null))];
41
+ const names = new Map(productIds.length === 0
42
+ ? []
43
+ : (await (await ref(env, 'product.product').search({ where: { id: { in: productIds } } })).load(['name']))
44
+ .read(['id', 'name'])
45
+ .map((p) => [p['id'], String(p['name'] ?? '')]));
46
+ const perProduct = new Map();
47
+ for (const l of lines) {
48
+ const id = idOf(l['product']);
49
+ if (id === null)
50
+ continue;
51
+ const entry = perProduct.get(id) ?? { name: names.get(id) ?? '', prices: [], quantity: 0 };
52
+ entry.prices.push(decimal(l['priceUnit']));
53
+ entry.quantity += decimal(l['quantity']);
54
+ perProduct.set(id, entry);
55
+ }
56
+ const products = [...perProduct.values()]
57
+ .sort((a, b) => b.quantity - a.quantity)
58
+ .slice(0, 5)
59
+ .map((e) => {
60
+ const last = e.prices.at(-1) ?? 0;
61
+ const average = e.prices.reduce((s, x) => s + x, 0) / e.prices.length;
62
+ return {
63
+ name: e.name,
64
+ lastPrice: last.toFixed(2),
65
+ averagePrice: average.toFixed(2),
66
+ change: average === 0 ? 0 : Math.round(((last - average) / average) * 1000) / 10,
67
+ };
68
+ });
69
+ return {
70
+ orders: orders.length,
71
+ receipts: counted,
72
+ onTime,
73
+ onTimeRate: counted === 0 ? null : Math.round((onTime / counted) * 1000) / 10,
74
+ averageLeadDays: counted === 0 ? null : Math.round((lead / counted) * 10) / 10,
75
+ products,
76
+ };
77
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The vendor's scorecard on their contact (RFC 0030 §3.1): on-time receipts, average lead days and the price trend
3
+ * of what is bought most, over the last year. Shown to Purchase users for vendors with orders; the server computes.
4
+ */
5
+ import type { NodeComponentProps } from '../../ui/index.js';
6
+ import { type ReactElement } from 'react';
7
+ export declare function VendorScorecard({ record, api }: NodeComponentProps): ReactElement | null;
@@ -0,0 +1,22 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { useId } from 'react';
4
+ import { useTranslation } from 'react-i18next';
5
+ export function VendorScorecard({ record, api }) {
6
+ const { t } = useTranslation('purchase_stock');
7
+ const id = useId();
8
+ const card = useQuery({
9
+ queryKey: ['purchase', 'scorecard', record?.id],
10
+ queryFn: () => api.call('GET', `/api/v1/purchase/vendors/${record?.id}/scorecard`),
11
+ enabled: record !== null && record['isVendor'] === true,
12
+ retry: false,
13
+ });
14
+ const c = card.data;
15
+ if (c === undefined || c.orders === 0)
16
+ return null;
17
+ return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-2 rounded-md border p-3 text-sm", children: [_jsx("h3", { id: `${id}-title`, className: "font-medium", children: t('scorecard.title') }), _jsxs("dl", { className: "grid grid-cols-3 gap-2", children: [_jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.onTime') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.onTimeRate === null ? '—' : `${c.onTimeRate}%` }), _jsx("dd", { className: "text-xs text-muted-foreground", children: t('scorecard.receipts', { onTime: c.onTime, count: c.receipts }) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.lead') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.averageLeadDays === null ? '—' : t('scorecard.days', { count: c.averageLeadDays }) })] }), _jsxs("div", { children: [_jsx("dt", { className: "text-muted-foreground", children: t('scorecard.orders') }), _jsx("dd", { className: "text-lg font-semibold tabular-nums", children: c.orders })] })] }), c.products.length === 0 ? null : (_jsx("ul", { className: "grid gap-0.5", children: c.products.map((p) => (_jsxs("li", { className: "flex justify-between gap-2", children: [_jsx("span", { className: "truncate", children: p.name }), _jsx("span", { className: "tabular-nums", children: t('scorecard.price', {
18
+ last: p.lastPrice,
19
+ average: p.averagePrice,
20
+ change: `${p.change > 0 ? '+' : ''}${p.change}`,
21
+ }) })] }, p.name))) }))] }));
22
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * The web contribution of `shutro-erp/purchase_stock`: the vendor scorecard on contacts (RFC 0030 §3.1).
4
+ */
5
+ import { type Registry } from '../../ui/index.js';
6
+ import type { i18n } from 'i18next';
7
+ import { messages } from './messages.js';
8
+ export { VendorScorecard } from './Scorecard.js';
9
+ /** Registers the component (and the messages in `i18n`, when given). */
10
+ export declare function registerPurchaseStockWeb(registry: Registry, i18n?: i18n): Registry;
11
+ export { messages as purchaseStockMessages };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * The web contribution of `shutro-erp/purchase_stock`: the vendor scorecard on contacts (RFC 0030 §3.1).
4
+ */
5
+ import { addMessages } from '../../ui/index.js';
6
+ import { messages } from './messages.js';
7
+ import { VendorScorecard } from './Scorecard.js';
8
+ export { VendorScorecard } from './Scorecard.js';
9
+ /** Registers the component (and the messages in `i18n`, when given). */
10
+ export function registerPurchaseStockWeb(registry, i18n) {
11
+ registry.registerComponent('purchase_stock.Scorecard', VendorScorecard);
12
+ if (i18n !== undefined)
13
+ addMessages(i18n, 'purchase_stock', messages);
14
+ return registry;
15
+ }
16
+ export { messages as purchaseStockMessages };
@@ -0,0 +1,2 @@
1
+ /** Messages of the Purchase with receipts components (namespace `purchase_stock`), in English and Bangla. */
2
+ export declare const messages: Readonly<Record<string, object>>;
@@ -0,0 +1,27 @@
1
+ /** Messages of the Purchase with receipts components (namespace `purchase_stock`), in English and Bangla. */
2
+ export const messages = {
3
+ en: {
4
+ scorecard: {
5
+ title: 'Vendor scorecard (last 12 months)',
6
+ onTime: 'On time',
7
+ receipts: '{{onTime}} of {{count}} receipts',
8
+ lead: 'Average lead time',
9
+ days_one: '{{count}} day',
10
+ days_other: '{{count}} days',
11
+ orders: 'Orders',
12
+ price: 'last {{last}}, average {{average}} ({{change}}%)',
13
+ },
14
+ },
15
+ bn: {
16
+ scorecard: {
17
+ title: 'সরবরাহকারীর স্কোরকার্ড (গত ১২ মাস)',
18
+ onTime: 'সময়মতো',
19
+ receipts: '{{count}}টি রিসিটের {{onTime}}টি',
20
+ lead: 'গড় সরবরাহ সময়',
21
+ days_one: '{{count}} দিন',
22
+ days_other: '{{count}} দিন',
23
+ orders: 'অর্ডার',
24
+ price: 'শেষ {{last}}, গড় {{average}} ({{change}}%)',
25
+ },
26
+ },
27
+ };
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: affe9e70bc2ae97c
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 70dff6019010b96d
2
2
  // Bindings of module `purchase_stock_account`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';