shutro-erp 0.3.6 → 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 (623) hide show
  1. package/dist/account_asset/.kosh/bindings.js +1 -1
  2. package/dist/account_asset/.kosh/schema.d.ts +530 -8
  3. package/dist/account_asset/i18n/bn.d.ts +2 -0
  4. package/dist/account_asset/i18n/bn.js +97 -0
  5. package/dist/account_asset/index.js +2 -0
  6. package/dist/account_asset/module.d.ts +4899 -1445
  7. package/dist/account_budget/.kosh/bindings.js +1 -1
  8. package/dist/account_budget/.kosh/schema.d.ts +1130 -56
  9. package/dist/account_budget/i18n/bn.d.ts +2 -0
  10. package/dist/account_budget/i18n/bn.js +63 -0
  11. package/dist/account_budget/index.js +14 -0
  12. package/dist/account_budget/module.d.ts +17958 -4532
  13. package/dist/account_budget/module.js +15 -0
  14. package/dist/account_portal/.kosh/bindings.js +1 -1
  15. package/dist/account_portal/.kosh/schema.d.ts +530 -8
  16. package/dist/account_portal/i18n/bn.d.ts +2 -0
  17. package/dist/account_portal/i18n/bn.js +6 -0
  18. package/dist/account_portal/index.js +2 -0
  19. package/dist/account_portal/module.d.ts +5167 -1693
  20. package/dist/accounting/.kosh/bindings.js +1 -1
  21. package/dist/accounting/.kosh/schema.d.ts +530 -8
  22. package/dist/accounting/closing.js +1 -0
  23. package/dist/accounting/fiscal.d.ts +578 -0
  24. package/dist/accounting/fiscal.js +401 -0
  25. package/dist/accounting/followups.d.ts +618 -0
  26. package/dist/accounting/followups.js +420 -0
  27. package/dist/accounting/i18n/bn.d.ts +2 -0
  28. package/dist/accounting/i18n/bn.js +425 -0
  29. package/dist/accounting/index.d.ts +2 -0
  30. package/dist/accounting/index.js +649 -2
  31. package/dist/accounting/module.d.ts +4998 -1451
  32. package/dist/accounting/module.js +124 -18
  33. package/dist/accounting/statements.d.ts +878 -0
  34. package/dist/accounting/statements.js +728 -0
  35. package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
  36. package/dist/accounting/web/BankReconcilePage.js +138 -0
  37. package/dist/accounting/web/FollowupsPage.d.ts +8 -0
  38. package/dist/accounting/web/FollowupsPage.js +54 -0
  39. package/dist/accounting/web/PostingPreview.d.ts +8 -0
  40. package/dist/accounting/web/PostingPreview.js +26 -0
  41. package/dist/accounting/web/index.d.ts +3 -0
  42. package/dist/accounting/web/index.js +9 -0
  43. package/dist/accounting/web/messages.js +140 -0
  44. package/dist/approvals/.kosh/bindings.js +1 -1
  45. package/dist/approvals/.kosh/schema.d.ts +272 -4
  46. package/dist/approvals/demo.d.ts +7 -0
  47. package/dist/approvals/demo.js +41 -0
  48. package/dist/approvals/i18n/bn.d.ts +2 -0
  49. package/dist/approvals/i18n/bn.js +133 -0
  50. package/dist/approvals/index.d.ts +19 -1
  51. package/dist/approvals/index.js +477 -7
  52. package/dist/approvals/mails.d.ts +7 -2
  53. package/dist/approvals/mails.js +8 -3
  54. package/dist/approvals/module.d.ts +2930 -1
  55. package/dist/approvals/module.js +468 -7
  56. package/dist/approvals/web/Config.d.ts +12 -0
  57. package/dist/approvals/web/Config.js +60 -0
  58. package/dist/approvals/web/Matrix.d.ts +9 -0
  59. package/dist/approvals/web/Matrix.js +26 -0
  60. package/dist/approvals/web/index.d.ts +3 -1
  61. package/dist/approvals/web/index.js +8 -1
  62. package/dist/approvals/web/messages.js +92 -0
  63. package/dist/approvals_purchase/.kosh/bindings.js +15 -0
  64. package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
  65. package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
  66. package/dist/approvals_purchase/i18n/bn.js +5 -0
  67. package/dist/approvals_purchase/index.d.ts +3 -0
  68. package/dist/approvals_purchase/index.js +47 -0
  69. package/dist/approvals_purchase/module.d.ts +12670 -0
  70. package/dist/approvals_purchase/module.js +84 -0
  71. package/dist/attendance/.kosh/bindings.js +1 -1
  72. package/dist/attendance/.kosh/schema.d.ts +59 -1
  73. package/dist/attendance/i18n/bn.d.ts +2 -0
  74. package/dist/attendance/i18n/bn.js +147 -0
  75. package/dist/attendance/index.js +3 -1
  76. package/dist/attendance/module.d.ts +452 -8
  77. package/dist/automation/engine.js +1 -1
  78. package/dist/calendar/.kosh/bindings.js +1 -1
  79. package/dist/calendar/.kosh/schema.d.ts +2 -1
  80. package/dist/calendar/i18n/bn.d.ts +2 -0
  81. package/dist/calendar/i18n/bn.js +80 -0
  82. package/dist/calendar/index.js +77 -0
  83. package/dist/calendar/module.d.ts +26 -0
  84. package/dist/calendar/module.js +14 -4
  85. package/dist/cli/apps.js +25 -5
  86. package/dist/cli/init.js +14 -4
  87. package/dist/cli/templates.d.ts +1 -1
  88. package/dist/cli/templates.js +34 -5
  89. package/dist/contacts/.kosh/bindings.js +1 -1
  90. package/dist/contacts/.kosh/schema.d.ts +2 -1
  91. package/dist/contacts/i18n/bn.d.ts +2 -0
  92. package/dist/contacts/i18n/bn.js +67 -0
  93. package/dist/contacts/index.js +3 -0
  94. package/dist/contacts/module.d.ts +42 -0
  95. package/dist/contacts/module.js +6 -1
  96. package/dist/crm/.kosh/bindings.js +1 -1
  97. package/dist/crm/.kosh/schema.d.ts +2 -1
  98. package/dist/crm/i18n/bn.d.ts +2 -0
  99. package/dist/crm/i18n/bn.js +80 -0
  100. package/dist/crm/index.js +22 -0
  101. package/dist/crm/module.d.ts +20 -0
  102. package/dist/crm/module.js +4 -2
  103. package/dist/documents/.kosh/bindings.js +1 -1
  104. package/dist/documents/.kosh/schema.d.ts +2 -1
  105. package/dist/documents/i18n/bn.d.ts +2 -0
  106. package/dist/documents/i18n/bn.js +83 -0
  107. package/dist/documents/index.js +128 -1
  108. package/dist/documents/module.d.ts +20 -0
  109. package/dist/documents/module.js +1 -0
  110. package/dist/event/.kosh/bindings.js +1 -1
  111. package/dist/event/.kosh/schema.d.ts +2 -1
  112. package/dist/event/i18n/bn.d.ts +2 -0
  113. package/dist/event/i18n/bn.js +101 -0
  114. package/dist/event/index.js +66 -0
  115. package/dist/event/module.d.ts +20 -0
  116. package/dist/event/module.js +8 -1
  117. package/dist/event_account/.kosh/bindings.js +1 -1
  118. package/dist/event_account/.kosh/schema.d.ts +530 -8
  119. package/dist/event_account/i18n/bn.d.ts +2 -0
  120. package/dist/event_account/i18n/bn.js +5 -0
  121. package/dist/event_account/index.js +2 -0
  122. package/dist/event_account/module.d.ts +4905 -1431
  123. package/dist/expense/.kosh/bindings.js +1 -1
  124. package/dist/expense/.kosh/schema.d.ts +323 -2
  125. package/dist/expense/i18n/bn.d.ts +2 -0
  126. package/dist/expense/i18n/bn.js +155 -0
  127. package/dist/expense/index.js +8 -1
  128. package/dist/expense/module.d.ts +2715 -694
  129. package/dist/expense/module.js +3 -1
  130. package/dist/expense_account/.kosh/bindings.js +1 -1
  131. package/dist/expense_account/.kosh/schema.d.ts +587 -8
  132. package/dist/expense_account/i18n/bn.d.ts +2 -0
  133. package/dist/expense_account/i18n/bn.js +15 -0
  134. package/dist/expense_account/index.js +2 -0
  135. package/dist/expense_account/module.d.ts +8094 -2619
  136. package/dist/helpdesk/.kosh/bindings.js +1 -1
  137. package/dist/helpdesk/.kosh/schema.d.ts +2 -1
  138. package/dist/helpdesk/i18n/bn.d.ts +2 -0
  139. package/dist/helpdesk/i18n/bn.js +127 -0
  140. package/dist/helpdesk/index.js +2 -0
  141. package/dist/helpdesk/module.d.ts +20 -0
  142. package/dist/hr/.kosh/bindings.js +1 -1
  143. package/dist/hr/.kosh/schema.d.ts +59 -1
  144. package/dist/hr/demo.js +11 -1
  145. package/dist/hr/i18n/bn.d.ts +2 -0
  146. package/dist/hr/i18n/bn.js +126 -0
  147. package/dist/hr/index.d.ts +1 -1
  148. package/dist/hr/index.js +158 -12
  149. package/dist/hr/module.d.ts +932 -59
  150. package/dist/hr/module.js +114 -17
  151. package/dist/{mrp → indent}/.kosh/bindings.js +2 -2
  152. package/dist/indent/.kosh/schema.d.ts +2084 -0
  153. package/dist/indent/demo.d.ts +7 -0
  154. package/dist/indent/demo.js +48 -0
  155. package/dist/indent/i18n/bn.d.ts +2 -0
  156. package/dist/indent/i18n/bn.js +143 -0
  157. package/dist/indent/index.d.ts +3 -0
  158. package/dist/indent/index.js +450 -0
  159. package/dist/{mrp → indent}/module.d.ts +7164 -3075
  160. package/dist/indent/module.js +792 -0
  161. package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
  162. package/dist/indent_purchase/.kosh/bindings.js +15 -0
  163. package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
  164. package/dist/indent_purchase/i18n/bn.d.ts +2 -0
  165. package/dist/indent_purchase/i18n/bn.js +13 -0
  166. package/dist/indent_purchase/index.d.ts +3 -0
  167. package/dist/indent_purchase/index.js +61 -0
  168. package/dist/indent_purchase/module.d.ts +27950 -0
  169. package/dist/indent_purchase/module.js +163 -0
  170. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  171. package/dist/l10n_bd/.kosh/schema.d.ts +530 -8
  172. package/dist/l10n_bd/i18n/bn.d.ts +2 -0
  173. package/dist/l10n_bd/i18n/bn.js +69 -0
  174. package/dist/l10n_bd/index.js +2 -0
  175. package/dist/l10n_bd/module.d.ts +5167 -1693
  176. package/dist/l10n_bd_payroll/.kosh/bindings.js +1 -1
  177. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +587 -8
  178. package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
  179. package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
  180. package/dist/l10n_bd_payroll/index.js +2 -0
  181. package/dist/l10n_bd_payroll/module.d.ts +5910 -1548
  182. package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
  183. package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
  184. package/dist/{mrp_account → l10n_bd_pos}/.kosh/schema.d.ts +693 -651
  185. package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
  186. package/dist/l10n_bd_pos/i18n/bn.js +32 -0
  187. package/dist/l10n_bd_pos/index.d.ts +3 -0
  188. package/dist/l10n_bd_pos/index.js +111 -0
  189. package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +7402 -7647
  190. package/dist/l10n_bd_pos/module.js +43 -0
  191. package/dist/l10n_in/.kosh/bindings.js +1 -1
  192. package/dist/l10n_in/.kosh/schema.d.ts +530 -8
  193. package/dist/l10n_in/i18n/bn.d.ts +2 -0
  194. package/dist/l10n_in/i18n/bn.js +95 -0
  195. package/dist/l10n_in/index.js +2 -0
  196. package/dist/l10n_in/module.d.ts +6703 -1652
  197. package/dist/l10n_in/module.js +25 -5
  198. package/dist/l10n_in/web/GstSettings.js +2 -2
  199. package/dist/mail/inbound/handle.js +2 -4
  200. package/dist/mail/inbound/models.js +5 -3
  201. package/dist/mail/index.d.ts +12 -1
  202. package/dist/mail/index.js +139 -2
  203. package/dist/mail/send.d.ts +56 -0
  204. package/dist/mail/send.js +394 -0
  205. package/dist/mail/web/SendButton.d.ts +9 -0
  206. package/dist/mail/web/SendButton.js +71 -0
  207. package/dist/mail/web/SendSelected.d.ts +8 -0
  208. package/dist/mail/web/SendSelected.js +33 -0
  209. package/dist/mail/web/index.d.ts +2 -0
  210. package/dist/mail/web/index.js +6 -0
  211. package/dist/mail/web/messages.js +36 -0
  212. package/dist/maintenance/.kosh/bindings.js +1 -1
  213. package/dist/maintenance/.kosh/schema.d.ts +2 -1
  214. package/dist/maintenance/i18n/bn.d.ts +2 -0
  215. package/dist/maintenance/i18n/bn.js +132 -0
  216. package/dist/maintenance/index.js +85 -0
  217. package/dist/maintenance/module.d.ts +25 -0
  218. package/dist/maintenance/module.js +27 -9
  219. package/dist/maintenance_stock/.kosh/bindings.js +1 -1
  220. package/dist/maintenance_stock/.kosh/schema.d.ts +298 -2
  221. package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
  222. package/dist/maintenance_stock/i18n/bn.js +21 -0
  223. package/dist/maintenance_stock/index.js +2 -0
  224. package/dist/maintenance_stock/module.d.ts +5302 -1256
  225. package/dist/maintenance_stock/module.js +1 -0
  226. package/dist/modules-sdk/apps.d.ts +10 -0
  227. package/dist/modules-sdk/apps.js +32 -0
  228. package/dist/modules-sdk/index.d.ts +1 -1
  229. package/dist/modules-sdk/manifest.d.ts +68 -2
  230. package/dist/payment/.kosh/bindings.js +1 -1
  231. package/dist/payment/.kosh/schema.d.ts +530 -8
  232. package/dist/payment/i18n/bn.d.ts +2 -0
  233. package/dist/payment/i18n/bn.js +59 -0
  234. package/dist/payment/index.js +85 -0
  235. package/dist/payment/module.d.ts +5134 -1660
  236. package/dist/payment/module.js +17 -3
  237. package/dist/payment/settle.js +1 -0
  238. package/dist/payroll/.kosh/bindings.js +1 -1
  239. package/dist/payroll/.kosh/schema.d.ts +59 -1
  240. package/dist/payroll/i18n/bn.d.ts +2 -0
  241. package/dist/payroll/i18n/bn.js +206 -0
  242. package/dist/payroll/index.js +2 -0
  243. package/dist/payroll/module.d.ts +936 -48
  244. package/dist/payroll_account/.kosh/bindings.js +1 -1
  245. package/dist/payroll_account/.kosh/schema.d.ts +587 -8
  246. package/dist/payroll_account/i18n/bn.d.ts +2 -0
  247. package/dist/payroll_account/i18n/bn.js +10 -0
  248. package/dist/payroll_account/index.js +2 -0
  249. package/dist/payroll_account/module.d.ts +7534 -3192
  250. package/dist/permissions/approvals.d.ts +97 -4
  251. package/dist/permissions/approvals.js +780 -31
  252. package/dist/permissions/index.d.ts +1 -1
  253. package/dist/permissions/index.js +2 -2
  254. package/dist/permissions/models.js +177 -5
  255. package/dist/permissions/routes.d.ts +3 -0
  256. package/dist/permissions/routes.js +36 -2
  257. package/dist/permissions/web/ApprovalPanel.js +43 -5
  258. package/dist/permissions/web/messages.js +52 -0
  259. package/dist/portal/.kosh/bindings.js +1 -1
  260. package/dist/portal/.kosh/schema.d.ts +2 -1
  261. package/dist/portal/documents.d.ts +3 -0
  262. package/dist/portal/documents.js +21 -1
  263. package/dist/portal/i18n/bn.d.ts +2 -0
  264. package/dist/portal/i18n/bn.js +33 -0
  265. package/dist/portal/index.js +2 -0
  266. package/dist/portal/module.d.ts +20 -0
  267. package/dist/portal/routes-documents.js +76 -0
  268. package/dist/pos/.kosh/bindings.js +1 -1
  269. package/dist/pos/.kosh/schema.d.ts +531 -8
  270. package/dist/pos/i18n/bn.d.ts +2 -0
  271. package/dist/pos/i18n/bn.js +133 -0
  272. package/dist/pos/index.js +83 -1
  273. package/dist/pos/module.d.ts +6888 -1777
  274. package/dist/pos/module.js +49 -5
  275. package/dist/pos/routes.js +80 -7
  276. package/dist/pos/web/Register.js +2 -5
  277. package/dist/pos_stock/.kosh/bindings.js +1 -1
  278. package/dist/pos_stock/.kosh/schema.d.ts +626 -9
  279. package/dist/pos_stock/i18n/bn.d.ts +2 -0
  280. package/dist/pos_stock/i18n/bn.js +6 -0
  281. package/dist/pos_stock/index.js +2 -0
  282. package/dist/pos_stock/module.d.ts +10798 -3276
  283. package/dist/product/.kosh/bindings.js +1 -1
  284. package/dist/product/.kosh/schema.d.ts +202 -1
  285. package/dist/product/i18n/bn.d.ts +2 -0
  286. package/dist/product/i18n/bn.js +175 -0
  287. package/dist/product/index.d.ts +1 -0
  288. package/dist/product/index.js +288 -1
  289. package/dist/product/module.d.ts +1725 -0
  290. package/dist/product/module.js +66 -6
  291. package/dist/product/pricelist.d.ts +575 -0
  292. package/dist/product/pricelist.js +257 -0
  293. package/dist/product/variants.d.ts +908 -0
  294. package/dist/product/variants.js +251 -0
  295. package/dist/production/.kosh/bindings.d.ts +22 -0
  296. package/dist/production/.kosh/bindings.js +15 -0
  297. package/dist/production/.kosh/schema.d.ts +2345 -0
  298. package/dist/{mrp → production}/demo.d.ts +1 -1
  299. package/dist/{mrp → production}/demo.js +5 -5
  300. package/dist/production/depth.d.ts +790 -0
  301. package/dist/production/depth.js +262 -0
  302. package/dist/production/i18n/bn.d.ts +2 -0
  303. package/dist/production/i18n/bn.js +350 -0
  304. package/dist/production/index.d.ts +6 -0
  305. package/dist/production/index.js +1256 -0
  306. package/dist/production/module.d.ts +17327 -0
  307. package/dist/production/module.js +1333 -0
  308. package/dist/production/plan.d.ts +921 -0
  309. package/dist/production/plan.js +511 -0
  310. package/dist/production/schedule.d.ts +656 -0
  311. package/dist/production/schedule.js +309 -0
  312. package/dist/production_account/.kosh/bindings.d.ts +22 -0
  313. package/dist/production_account/.kosh/bindings.js +15 -0
  314. package/dist/production_account/.kosh/schema.d.ts +3496 -0
  315. package/dist/production_account/i18n/bn.d.ts +2 -0
  316. package/dist/production_account/i18n/bn.js +93 -0
  317. package/dist/production_account/index.d.ts +4 -0
  318. package/dist/production_account/index.js +246 -0
  319. package/dist/production_account/module.d.ts +1192 -0
  320. package/dist/{mrp_account → production_account}/module.js +72 -18
  321. package/dist/production_account/overhead.d.ts +1195 -0
  322. package/dist/production_account/overhead.js +554 -0
  323. package/dist/project/.kosh/bindings.js +1 -1
  324. package/dist/project/.kosh/schema.d.ts +65 -2
  325. package/dist/project/i18n/bn.d.ts +2 -0
  326. package/dist/project/i18n/bn.js +383 -0
  327. package/dist/project/index.js +123 -0
  328. package/dist/project/module.d.ts +20 -0
  329. package/dist/project/module.js +73 -14
  330. package/dist/project_account/.kosh/bindings.js +1 -1
  331. package/dist/project_account/.kosh/schema.d.ts +530 -8
  332. package/dist/project_account/i18n/bn.d.ts +2 -0
  333. package/dist/project_account/i18n/bn.js +6 -0
  334. package/dist/project_account/index.js +2 -0
  335. package/dist/project_account/module.d.ts +4926 -1452
  336. package/dist/project_portal/.kosh/bindings.js +1 -1
  337. package/dist/project_portal/.kosh/schema.d.ts +65 -2
  338. package/dist/project_portal/i18n/bn.d.ts +2 -0
  339. package/dist/project_portal/i18n/bn.js +6 -0
  340. package/dist/project_portal/index.js +2 -0
  341. package/dist/project_portal/module.d.ts +40 -0
  342. package/dist/project_purchase/.kosh/bindings.js +1 -1
  343. package/dist/project_purchase/.kosh/schema.d.ts +1126 -53
  344. package/dist/project_purchase/i18n/bn.d.ts +2 -0
  345. package/dist/project_purchase/i18n/bn.js +4 -0
  346. package/dist/project_purchase/index.js +2 -0
  347. package/dist/project_purchase/module.d.ts +17912 -4446
  348. package/dist/purchase/.kosh/bindings.js +1 -1
  349. package/dist/purchase/.kosh/schema.d.ts +813 -3
  350. package/dist/purchase/comparison.d.ts +993 -0
  351. package/dist/purchase/comparison.js +415 -0
  352. package/dist/purchase/extras.d.ts +1509 -0
  353. package/dist/purchase/extras.js +445 -0
  354. package/dist/purchase/i18n/bn.d.ts +2 -0
  355. package/dist/purchase/i18n/bn.js +413 -0
  356. package/dist/purchase/index.d.ts +5 -0
  357. package/dist/purchase/index.js +1280 -4
  358. package/dist/purchase/module.d.ts +7139 -398
  359. package/dist/purchase/module.js +295 -11
  360. package/dist/purchase/request.d.ts +696 -0
  361. package/dist/purchase/request.js +446 -0
  362. package/dist/purchase/tender.d.ts +1208 -0
  363. package/dist/purchase/tender.js +507 -0
  364. package/dist/purchase/vendorprice.d.ts +340 -0
  365. package/dist/purchase/vendorprice.js +153 -0
  366. package/dist/purchase_account/.kosh/bindings.js +1 -1
  367. package/dist/purchase_account/.kosh/schema.d.ts +1130 -57
  368. package/dist/purchase_account/i18n/bn.d.ts +2 -0
  369. package/dist/purchase_account/i18n/bn.js +22 -0
  370. package/dist/purchase_account/index.js +19 -0
  371. package/dist/purchase_account/module.d.ts +12276 -2247
  372. package/dist/purchase_account/module.js +241 -9
  373. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  374. package/dist/purchase_portal/.kosh/schema.d.ts +813 -3
  375. package/dist/purchase_portal/i18n/bn.d.ts +2 -0
  376. package/dist/purchase_portal/i18n/bn.js +5 -0
  377. package/dist/purchase_portal/index.js +2 -0
  378. package/dist/purchase_portal/module.d.ts +6849 -353
  379. package/dist/purchase_stock/.kosh/bindings.js +1 -1
  380. package/dist/purchase_stock/.kosh/schema.d.ts +910 -4
  381. package/dist/purchase_stock/i18n/bn.d.ts +2 -0
  382. package/dist/purchase_stock/i18n/bn.js +19 -0
  383. package/dist/purchase_stock/index.d.ts +1 -1
  384. package/dist/purchase_stock/index.js +29 -0
  385. package/dist/purchase_stock/module.d.ts +12410 -1864
  386. package/dist/purchase_stock/module.js +81 -9
  387. package/dist/purchase_stock/scorecard.d.ts +22 -0
  388. package/dist/purchase_stock/scorecard.js +77 -0
  389. package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
  390. package/dist/purchase_stock/web/Scorecard.js +22 -0
  391. package/dist/purchase_stock/web/index.d.ts +11 -0
  392. package/dist/purchase_stock/web/index.js +16 -0
  393. package/dist/purchase_stock/web/messages.d.ts +2 -0
  394. package/dist/purchase_stock/web/messages.js +27 -0
  395. package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
  396. package/dist/purchase_stock_account/.kosh/schema.d.ts +1286 -58
  397. package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
  398. package/dist/purchase_stock_account/i18n/bn.js +8 -0
  399. package/dist/purchase_stock_account/index.js +18 -0
  400. package/dist/purchase_stock_account/module.d.ts +7 -37995
  401. package/dist/purchase_stock_account/module.js +24 -3
  402. package/dist/recruitment/.kosh/bindings.js +1 -1
  403. package/dist/recruitment/.kosh/schema.d.ts +59 -1
  404. package/dist/recruitment/i18n/bn.d.ts +2 -0
  405. package/dist/recruitment/i18n/bn.js +93 -0
  406. package/dist/recruitment/index.js +64 -0
  407. package/dist/recruitment/module.d.ts +458 -8
  408. package/dist/recruitment/module.js +11 -3
  409. package/dist/reporting/documents.d.ts +5 -0
  410. package/dist/reporting/documents.js +11 -1
  411. package/dist/reporting/index.d.ts +1 -1
  412. package/dist/reporting/index.js +1 -1
  413. package/dist/reporting/web/CalendarView.d.ts +18 -5
  414. package/dist/reporting/web/CalendarView.js +163 -29
  415. package/dist/reporting/web/messages.js +18 -0
  416. package/dist/sale_account/.kosh/bindings.js +1 -1
  417. package/dist/sale_account/.kosh/schema.d.ts +642 -16
  418. package/dist/sale_account/i18n/bn.d.ts +2 -0
  419. package/dist/sale_account/i18n/bn.js +48 -0
  420. package/dist/sale_account/index.d.ts +1 -1
  421. package/dist/sale_account/index.js +102 -4
  422. package/dist/sale_account/module.d.ts +8254 -2212
  423. package/dist/sale_account/module.js +535 -46
  424. package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
  425. package/dist/sale_crm/.kosh/bindings.js +15 -0
  426. package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +389 -567
  427. package/dist/sale_crm/i18n/bn.d.ts +2 -0
  428. package/dist/sale_crm/i18n/bn.js +9 -0
  429. package/dist/sale_crm/index.d.ts +7 -0
  430. package/dist/sale_crm/index.js +104 -0
  431. package/dist/sale_crm/module.d.ts +5609 -0
  432. package/dist/sale_crm/module.js +73 -0
  433. package/dist/sale_portal/.kosh/bindings.js +1 -1
  434. package/dist/sale_portal/.kosh/schema.d.ts +291 -4
  435. package/dist/sale_portal/i18n/bn.d.ts +2 -0
  436. package/dist/sale_portal/i18n/bn.js +7 -0
  437. package/dist/sale_portal/index.js +10 -0
  438. package/dist/sale_portal/module.d.ts +2564 -294
  439. package/dist/sale_project/.kosh/bindings.js +1 -1
  440. package/dist/sale_project/.kosh/schema.d.ts +354 -5
  441. package/dist/sale_project/i18n/bn.d.ts +2 -0
  442. package/dist/sale_project/i18n/bn.js +12 -0
  443. package/dist/sale_project/index.js +2 -0
  444. package/dist/sale_project/module.d.ts +6249 -2402
  445. package/dist/sale_stock/.kosh/bindings.js +1 -1
  446. package/dist/sale_stock/.kosh/schema.d.ts +387 -5
  447. package/dist/sale_stock/i18n/bn.d.ts +2 -0
  448. package/dist/sale_stock/i18n/bn.js +15 -0
  449. package/dist/sale_stock/index.js +2 -0
  450. package/dist/sale_stock/module.d.ts +8057 -1759
  451. package/dist/sale_stock/module.js +20 -3
  452. package/dist/sales/.kosh/bindings.js +1 -1
  453. package/dist/sales/.kosh/schema.d.ts +291 -4
  454. package/dist/sales/i18n/bn.d.ts +2 -0
  455. package/dist/sales/i18n/bn.js +128 -0
  456. package/dist/sales/index.js +120 -5
  457. package/dist/sales/module.d.ts +3567 -633
  458. package/dist/sales/module.js +306 -11
  459. package/dist/server/api/duplicate.d.ts +14 -0
  460. package/dist/server/api/duplicate.js +75 -0
  461. package/dist/server/api/explain.d.ts +70 -0
  462. package/dist/server/api/explain.js +111 -0
  463. package/dist/server/api/metadata.d.ts +2 -0
  464. package/dist/server/api/metadata.js +9 -0
  465. package/dist/server/api/openapi.js +15 -0
  466. package/dist/server/api/rest.d.ts +1 -0
  467. package/dist/server/api/rest.js +76 -12
  468. package/dist/server/api/views.js +1 -1
  469. package/dist/server/apps.d.ts +16 -1
  470. package/dist/server/apps.js +164 -2
  471. package/dist/server/auth/base.js +2 -0
  472. package/dist/server/auth/service.d.ts +8 -0
  473. package/dist/server/auth/service.js +19 -0
  474. package/dist/server/events.d.ts +13 -0
  475. package/dist/server/events.js +22 -0
  476. package/dist/server/i18n.d.ts +27 -0
  477. package/dist/server/i18n.js +143 -0
  478. package/dist/server/index.d.ts +2 -0
  479. package/dist/server/index.js +2 -0
  480. package/dist/server/server.js +6 -0
  481. package/dist/settings/company.d.ts +3 -1
  482. package/dist/settings/company.js +26 -5
  483. package/dist/settings/routes.d.ts +10 -0
  484. package/dist/settings/routes.js +19 -3
  485. package/dist/settings/web/AppsPage.d.ts +3 -2
  486. package/dist/settings/web/AppsPage.js +26 -8
  487. package/dist/settings/web/CompaniesPage.js +91 -6
  488. package/dist/settings/web/messages.js +64 -0
  489. package/dist/sign/.kosh/bindings.js +1 -1
  490. package/dist/sign/.kosh/schema.d.ts +2 -1
  491. package/dist/sign/i18n/bn.d.ts +2 -0
  492. package/dist/sign/i18n/bn.js +97 -0
  493. package/dist/sign/index.d.ts +15 -0
  494. package/dist/sign/index.js +129 -1
  495. package/dist/sign/module.d.ts +40 -0
  496. package/dist/sign/module.js +11 -2
  497. package/dist/stock/.kosh/bindings.js +1 -1
  498. package/dist/stock/.kosh/schema.d.ts +298 -2
  499. package/dist/stock/i18n/bn.d.ts +2 -0
  500. package/dist/stock/i18n/bn.js +311 -0
  501. package/dist/stock/index.d.ts +3 -1
  502. package/dist/stock/index.js +442 -3
  503. package/dist/stock/ledger.d.ts +78 -0
  504. package/dist/stock/ledger.js +582 -0
  505. package/dist/stock/module.d.ts +5280 -2044
  506. package/dist/stock/module.js +222 -23
  507. package/dist/stock/replenish.js +16 -1
  508. package/dist/stock/returns.d.ts +157 -0
  509. package/dist/stock/returns.js +163 -0
  510. package/dist/stock/web/Ledger.d.ts +9 -0
  511. package/dist/stock/web/Ledger.js +108 -0
  512. package/dist/stock/web/Operations.d.ts +8 -0
  513. package/dist/stock/web/Operations.js +33 -0
  514. package/dist/stock/web/ReturnButton.d.ts +7 -0
  515. package/dist/stock/web/ReturnButton.js +62 -0
  516. package/dist/stock/web/index.d.ts +3 -0
  517. package/dist/stock/web/index.js +9 -0
  518. package/dist/stock/web/messages.js +154 -0
  519. package/dist/stock_account/.kosh/bindings.js +1 -1
  520. package/dist/stock_account/.kosh/schema.d.ts +682 -9
  521. package/dist/stock_account/i18n/bn.d.ts +2 -0
  522. package/dist/stock_account/i18n/bn.js +73 -0
  523. package/dist/stock_account/index.d.ts +1 -0
  524. package/dist/stock_account/index.js +131 -3
  525. package/dist/stock_account/landed.d.ts +429 -0
  526. package/dist/stock_account/landed.js +335 -0
  527. package/dist/stock_account/module.d.ts +11247 -3363
  528. package/dist/stock_account/module.js +135 -6
  529. package/dist/stock_account/web/LandedPreview.d.ts +7 -0
  530. package/dist/stock_account/web/LandedPreview.js +23 -0
  531. package/dist/stock_account/web/index.d.ts +11 -0
  532. package/dist/stock_account/web/index.js +16 -0
  533. package/dist/stock_account/web/messages.d.ts +2 -0
  534. package/dist/stock_account/web/messages.js +27 -0
  535. package/dist/todo/i18n/bn.d.ts +2 -0
  536. package/dist/todo/i18n/bn.js +66 -0
  537. package/dist/todo/index.js +59 -0
  538. package/dist/todo/module.d.ts +5 -0
  539. package/dist/todo/module.js +5 -3
  540. package/dist/trade_finance/.kosh/bindings.js +1 -1
  541. package/dist/trade_finance/.kosh/schema.d.ts +2 -1
  542. package/dist/trade_finance/i18n/bn.d.ts +2 -0
  543. package/dist/trade_finance/i18n/bn.js +162 -0
  544. package/dist/trade_finance/index.js +93 -0
  545. package/dist/trade_finance/module.d.ts +26 -0
  546. package/dist/trade_finance/module.js +27 -8
  547. package/dist/trade_finance_account/.kosh/bindings.js +1 -1
  548. package/dist/trade_finance_account/.kosh/schema.d.ts +530 -8
  549. package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
  550. package/dist/trade_finance_account/i18n/bn.js +27 -0
  551. package/dist/trade_finance_account/index.js +2 -0
  552. package/dist/trade_finance_account/module.d.ts +4906 -1432
  553. package/dist/trade_finance_account/module.js +1 -0
  554. package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
  555. package/dist/trade_finance_purchase/.kosh/schema.d.ts +813 -3
  556. package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
  557. package/dist/trade_finance_purchase/i18n/bn.js +6 -0
  558. package/dist/trade_finance_purchase/index.js +2 -0
  559. package/dist/trade_finance_purchase/module.d.ts +6909 -413
  560. package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
  561. package/dist/trade_finance_sale/.kosh/schema.d.ts +291 -4
  562. package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
  563. package/dist/trade_finance_sale/i18n/bn.js +6 -0
  564. package/dist/trade_finance_sale/index.js +2 -0
  565. package/dist/trade_finance_sale/module.d.ts +2601 -331
  566. package/dist/ui/api.d.ts +2 -0
  567. package/dist/ui/app.d.ts +9 -0
  568. package/dist/ui/app.js +24 -4
  569. package/dist/ui/components/AppIcon.js +2 -2
  570. package/dist/ui/components/Explain.d.ts +69 -0
  571. package/dist/ui/components/Explain.js +62 -0
  572. package/dist/ui/context.d.ts +8 -1
  573. package/dist/ui/context.js +34 -1
  574. package/dist/ui/i18n/messages.d.ts +36 -0
  575. package/dist/ui/i18n/messages.js +72 -0
  576. package/dist/ui/index.d.ts +2 -1
  577. package/dist/ui/index.js +1 -0
  578. package/dist/ui/registry.d.ts +14 -0
  579. package/dist/ui/registry.js +10 -0
  580. package/dist/ui/views/FormView.d.ts +6 -0
  581. package/dist/ui/views/FormView.js +47 -10
  582. package/dist/ui/views/ListView.d.ts +8 -0
  583. package/dist/ui/views/ListView.js +10 -3
  584. package/dist/ui/views/StatsRow.js +2 -1
  585. package/dist/views/extend.js +12 -0
  586. package/dist/views/types.d.ts +13 -2
  587. package/dist/views/validate.js +8 -1
  588. package/dist/website/.kosh/bindings.js +1 -1
  589. package/dist/website/.kosh/schema.d.ts +2 -1
  590. package/dist/website/i18n/bn.d.ts +2 -0
  591. package/dist/website/i18n/bn.js +113 -0
  592. package/dist/website/index.js +36 -0
  593. package/dist/website/module.d.ts +20 -0
  594. package/dist/website/module.js +29 -5
  595. package/dist/website_crm/.kosh/bindings.js +1 -1
  596. package/dist/website_crm/.kosh/schema.d.ts +2 -1
  597. package/dist/website_crm/i18n/bn.d.ts +2 -0
  598. package/dist/website_crm/i18n/bn.js +5 -0
  599. package/dist/website_crm/index.js +2 -0
  600. package/dist/website_crm/module.d.ts +40 -0
  601. package/dist/website_sale/.kosh/bindings.js +1 -1
  602. package/dist/website_sale/.kosh/schema.d.ts +642 -17
  603. package/dist/website_sale/i18n/bn.d.ts +2 -0
  604. package/dist/website_sale/i18n/bn.js +132 -0
  605. package/dist/website_sale/index.js +83 -1
  606. package/dist/website_sale/module.d.ts +18705 -5550
  607. package/dist/website_sale/module.js +32 -10
  608. package/dist/website_sale/shop.js +22 -9
  609. package/dist/website_sale_stock/.kosh/bindings.js +1 -1
  610. package/dist/website_sale_stock/.kosh/schema.d.ts +737 -18
  611. package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
  612. package/dist/website_sale_stock/i18n/bn.js +4 -0
  613. package/dist/website_sale_stock/index.js +2 -0
  614. package/dist/website_sale_stock/module.d.ts +10 -24997
  615. package/dist/website_sale_stock/module.js +7 -3
  616. package/package.json +36 -8
  617. package/dist/mrp/index.d.ts +0 -3
  618. package/dist/mrp/index.js +0 -393
  619. package/dist/mrp/module.js +0 -757
  620. package/dist/mrp_account/index.d.ts +0 -3
  621. package/dist/mrp_account/index.js +0 -22
  622. /package/dist/{mrp → approvals_purchase}/.kosh/bindings.d.ts +0 -0
  623. /package/dist/{mrp_account → indent}/.kosh/bindings.d.ts +0 -0
@@ -10,10 +10,11 @@
10
10
  * delivers).
11
11
  */
12
12
  import { productShutro } from '../product/index.js';
13
- import { purchaseShutro } from '../purchase/index.js';
13
+ import { purchaseShutro, vendorPriceFor } from '../purchase/index.js';
14
14
  import { orm } from '../server/orm.js';
15
15
  import { defaultLocations, inProductUnit, stockShutro } from '../stock/index.js';
16
16
  import { compute, defineModule, extendModel, f } from './.kosh/bindings.js';
17
+ import { vendorScorecard } from './scorecard.js';
17
18
  const zero = orm.toDecimal(0);
18
19
  export const PickingPurchase = extendModel('stock.picking', {
19
20
  fields: {
@@ -51,17 +52,34 @@ export const MovePurchase = extendModel('stock.move', {
51
52
  });
52
53
  export const LineReceived = extendModel('purchase.order.line', {
53
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
+ }),
54
68
  moves: f.one2many('stock.move', 'purchaseLine'),
55
69
  /** Received by validated receipts, in the line's unit. */
56
70
  qtyReceived: f.decimal({
57
71
  scale: 3,
58
72
  store: true,
59
73
  label: 'Received',
60
- ...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.
61
76
  for (const l of lines)
62
77
  l.qtyReceived = [...l.moves]
63
78
  .filter((m) => m.picking.state === 'done')
64
- .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);
65
83
  }),
66
84
  }),
67
85
  },
@@ -69,6 +87,24 @@ export const LineReceived = extendModel('purchase.order.line', {
69
87
  export const OrderReceipts = extendModel('purchase.order', {
70
88
  fields: {
71
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
+ }),
72
108
  /** The vendor delivers to the customer: the order's transfer is a dropship, never received in stock. */
73
109
  dropship: f.boolean({ default: false, label: 'Dropship' }),
74
110
  /** Where the goods are received (the company's main warehouse when empty). */
@@ -277,6 +313,19 @@ async function dropship(env, ids) {
277
313
  async function receivedInto(env, warehouse, company) {
278
314
  return warehouse ?? (await defaultLocations(env, 'receipt', null, company)).warehouse;
279
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
+ }
280
329
  export const ReorderBuy = extendModel('stock.reorder', {
281
330
  overrides: {
282
331
  // Requests for quotation and orders not received yet (their receipt is still to be made) are on order.
@@ -308,6 +357,24 @@ export const ReorderBuy = extendModel('stock.reorder', {
308
357
  }
309
358
  return out;
310
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
+ },
311
378
  // Buying: one request for quotation per vendor and warehouse — a draft one from replenishment gets the lines.
312
379
  procure: async function (next, quantities) {
313
380
  const out = await next(quantities);
@@ -316,21 +383,26 @@ export const ReorderBuy = extendModel('stock.reorder', {
316
383
  const today = env.today();
317
384
  for (const r of await rules.load({ product: { purchaseTaxes: true }, company: true })) {
318
385
  const qty = quantities.get(r.id);
319
- if (r.method !== 'buy' || r.vendor === null || qty === undefined)
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)
320
392
  continue;
321
393
  const arrival = new Date(`${today}T00:00:00Z`);
322
- arrival.setUTCDate(arrival.getUTCDate() + r.leadDays);
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).
323
396
  const line = {
324
397
  product: r.product.id,
325
398
  name: r.product.name,
326
399
  quantity: qty,
327
400
  uom: r.product.uom?.id ?? null,
328
- priceUnit: r.product.standardPrice,
329
401
  taxes: { set: [...r.product.purchaseTaxes.ids] },
330
402
  };
331
403
  const [open] = await (await env.model('purchase.order').search({
332
404
  where: {
333
- partner: r.vendor.id,
405
+ partner: vendor,
334
406
  company: r.company.id,
335
407
  warehouse: r.warehouse.id,
336
408
  state: 'draft',
@@ -346,7 +418,7 @@ export const ReorderBuy = extendModel('stock.reorder', {
346
418
  }
347
419
  const made = await env.model('purchase.order').create([
348
420
  {
349
- partner: r.vendor.id,
421
+ partner: vendor,
350
422
  company: r.company.id,
351
423
  currency: r.company.currency.id,
352
424
  warehouse: r.warehouse.id,
@@ -366,7 +438,7 @@ export const ReorderBuy = extendModel('stock.reorder', {
366
438
  });
367
439
  export const purchaseStockShutro = defineModule({
368
440
  name: 'purchase_stock',
369
- version: '0.2.0',
441
+ version: '0.3.0',
370
442
  depends: [purchaseShutro, stockShutro, productShutro],
371
443
  groups: [
372
444
  orm.defineGroup({
@@ -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: 12ed1cd9243b4281
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';