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
@@ -0,0 +1,157 @@
1
+ import { type Env } from './.kosh/bindings.js';
2
+ /** Why goods come back: reported by product and partner. */
3
+ export declare const StockReturnReason: import("../server/orm.js").Model<"stock.return.reason", {
4
+ readonly id: import("../server/orm.js").IdField<"stock.return.reason">;
5
+ readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
6
+ required: true;
7
+ readonly: true;
8
+ computed: false;
9
+ inverse: false;
10
+ hasDefault: false;
11
+ sequence: false;
12
+ }>;
13
+ readonly updatedAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
14
+ required: true;
15
+ readonly: true;
16
+ computed: false;
17
+ inverse: false;
18
+ hasDefault: false;
19
+ sequence: false;
20
+ }>;
21
+ readonly createdBy: import("../server/orm.js").Many2oneField<'res.users', {
22
+ required: false;
23
+ readonly: true;
24
+ computed: false;
25
+ inverse: false;
26
+ hasDefault: false;
27
+ sequence: false;
28
+ }>;
29
+ readonly updatedBy: import("../server/orm.js").Many2oneField<'res.users', {
30
+ required: false;
31
+ readonly: true;
32
+ computed: false;
33
+ inverse: false;
34
+ hasDefault: false;
35
+ sequence: false;
36
+ }>;
37
+ readonly displayName: import("../server/orm.js").CharField<{
38
+ required: true;
39
+ readonly: true;
40
+ computed: true;
41
+ inverse: false;
42
+ hasDefault: false;
43
+ sequence: false;
44
+ }>;
45
+ readonly active: import("../server/orm.js").ActiveField;
46
+ readonly name: import("../server/orm.js").CharField<{
47
+ readonly required: true;
48
+ readonly computed: false;
49
+ readonly inverse: false;
50
+ readonly sequence: false;
51
+ readonly computeName: undefined;
52
+ readonly store: true;
53
+ readonly hasDefault: false;
54
+ readonly readonly: false;
55
+ }, string | Readonly<Record<string, string>>>;
56
+ readonly sequence: import("../server/orm.js").ScalarField<"integer", number, number, {
57
+ readonly required: false;
58
+ readonly computed: false;
59
+ readonly inverse: false;
60
+ readonly sequence: false;
61
+ readonly computeName: undefined;
62
+ readonly store: true;
63
+ readonly hasDefault: true;
64
+ readonly readonly: false;
65
+ }>;
66
+ readonly code: import("../server/orm.js").CharField<{
67
+ readonly required: false;
68
+ readonly computed: false;
69
+ readonly inverse: false;
70
+ readonly sequence: false;
71
+ readonly computeName: undefined;
72
+ readonly store: true;
73
+ readonly hasDefault: false;
74
+ readonly readonly: false;
75
+ }, string>;
76
+ }, {} & import("../server/orm.js").TransitionMethods<{
77
+ readonly name: import("../server/orm.js").CharField<{
78
+ readonly required: true;
79
+ readonly computed: false;
80
+ readonly inverse: false;
81
+ readonly sequence: false;
82
+ readonly computeName: undefined;
83
+ readonly store: true;
84
+ readonly hasDefault: false;
85
+ readonly readonly: false;
86
+ }, string | Readonly<Record<string, string>>>;
87
+ readonly sequence: import("../server/orm.js").ScalarField<"integer", number, number, {
88
+ readonly required: false;
89
+ readonly computed: false;
90
+ readonly inverse: false;
91
+ readonly sequence: false;
92
+ readonly computeName: undefined;
93
+ readonly store: true;
94
+ readonly hasDefault: true;
95
+ readonly readonly: false;
96
+ }>;
97
+ readonly code: import("../server/orm.js").CharField<{
98
+ readonly required: false;
99
+ readonly computed: false;
100
+ readonly inverse: false;
101
+ readonly sequence: false;
102
+ readonly computeName: undefined;
103
+ readonly store: true;
104
+ readonly hasDefault: false;
105
+ readonly readonly: false;
106
+ }, string>;
107
+ }>>;
108
+ /** The reasons a database starts with. */
109
+ export declare const DEFAULT_RETURN_REASONS: readonly [{
110
+ readonly code: 'damaged';
111
+ readonly en: 'Damaged';
112
+ readonly bn: 'ক্ষতিগ্রস্ত';
113
+ }, {
114
+ readonly code: 'wrong_item';
115
+ readonly en: 'Wrong item';
116
+ readonly bn: 'ভুল পণ্য';
117
+ }, {
118
+ readonly code: 'not_as_ordered';
119
+ readonly en: 'Not as ordered';
120
+ readonly bn: 'অর্ডার অনুযায়ী নয়';
121
+ }, {
122
+ readonly code: 'surplus';
123
+ readonly en: 'Surplus';
124
+ readonly bn: 'অতিরিক্ত';
125
+ }, {
126
+ readonly code: 'quality';
127
+ readonly en: 'Quality';
128
+ readonly bn: 'মানের সমস্যা';
129
+ }];
130
+ export declare function installReturnReasons(env: Env): Promise<number>;
131
+ /** What each line of a done transfer can still return. */
132
+ export interface Returnable {
133
+ readonly move: number;
134
+ readonly product: number;
135
+ readonly name: string;
136
+ readonly done: string;
137
+ readonly returned: string;
138
+ readonly returnable: string;
139
+ }
140
+ /** The lines of a done delivery or receipt with what is left to return (in the product's unit). */
141
+ export declare function returnableLines(env: Env, pickingId: number): Promise<Returnable[]>;
142
+ /**
143
+ * Makes and confirms the return of `lines` (move and quantity, in the product's unit) with a reason; `location`
144
+ * receives it instead of where the goods came from (a damaged-goods location). Returns the new transfer.
145
+ */
146
+ export declare function createReturn(env: Env, pickingId: number, input: {
147
+ readonly lines: readonly {
148
+ readonly move: number;
149
+ readonly quantity: string;
150
+ }[];
151
+ readonly reason: number;
152
+ readonly note?: string | null;
153
+ readonly location?: number | null;
154
+ }): Promise<{
155
+ picking: number;
156
+ name: string;
157
+ }>;
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Returns (RFC 0030 §3.2). A done delivery or receipt can be returned, in part: each line up to what was done and
3
+ * not returned yet (returns in progress count), with a reason. The return is a transfer of the other way — a
4
+ * customer's goods back in, goods back to the vendor —, linked to the original (`returnOf`) and line by line, with
5
+ * the original's links carried (an order's, through `backorderValues`), and lots taken back from the original's.
6
+ * It is confirmed, and validated like any transfer; `stock_account` values it at the original cost.
7
+ */
8
+ import { HttpProblem } from '../server/index.js';
9
+ import { orm } from '../server/orm.js';
10
+ import { defineModel, f } from './.kosh/bindings.js';
11
+ const ALL = ['read', 'write', 'create', 'unlink', 'export', 'import'];
12
+ const zero = orm.toDecimal('0');
13
+ /** Why goods come back: reported by product and partner. */
14
+ export const StockReturnReason = defineModel('stock.return.reason', {
15
+ label: 'Return reason',
16
+ archivable: true,
17
+ order: ['sequence asc', 'id asc'],
18
+ access: { 'stock.user': ['read'], 'stock.manager': ALL },
19
+ fields: {
20
+ name: f.char({ required: true, translate: true, label: 'Reason' }),
21
+ sequence: f.integer({ default: 10 }),
22
+ code: f.char({ index: 'unique', label: 'Code' }),
23
+ },
24
+ });
25
+ /** The reasons a database starts with. */
26
+ export const DEFAULT_RETURN_REASONS = [
27
+ { code: 'damaged', en: 'Damaged', bn: 'ক্ষতিগ্রস্ত' },
28
+ { code: 'wrong_item', en: 'Wrong item', bn: 'ভুল পণ্য' },
29
+ { code: 'not_as_ordered', en: 'Not as ordered', bn: 'অর্ডার অনুযায়ী নয়' },
30
+ { code: 'surplus', en: 'Surplus', bn: 'অতিরিক্ত' },
31
+ { code: 'quality', en: 'Quality', bn: 'মানের সমস্যা' },
32
+ ];
33
+ export async function installReturnReasons(env) {
34
+ let made = 0;
35
+ const model = env.withFlags({ activeTest: false }).model('stock.return.reason');
36
+ for (const [i, r] of DEFAULT_RETURN_REASONS.entries()) {
37
+ if ((await model.search({ where: { code: r.code } })).ids.length > 0)
38
+ continue;
39
+ await model.create([
40
+ { code: r.code, name: { en_US: r.en, bn_BD: r.bn }, sequence: (i + 1) * 10 },
41
+ ]);
42
+ made++;
43
+ }
44
+ return made;
45
+ }
46
+ const OTHER_WAY = {
47
+ delivery: 'receipt',
48
+ receipt: 'delivery',
49
+ };
50
+ async function loadDone(env, pickingId) {
51
+ const [picking] = await env
52
+ .model('stock.picking')
53
+ .browse([pickingId])
54
+ .load({
55
+ moves: { product: true, returns: { picking: true } },
56
+ source: true,
57
+ destination: true,
58
+ });
59
+ if (picking === undefined)
60
+ throw new HttpProblem(404, 'missing-record', 'Not found', 'No such transfer.');
61
+ if (picking.state !== 'done')
62
+ throw new HttpProblem(409, 'not-done', 'Not done', 'Only a done transfer can be returned.');
63
+ if (OTHER_WAY[picking.kind] === undefined)
64
+ throw new HttpProblem(409, 'not-returnable', 'Not returnable', 'Deliveries and receipts are returned; other transfers are moved back by hand.');
65
+ return picking;
66
+ }
67
+ /** The lines of a done delivery or receipt with what is left to return (in the product's unit). */
68
+ export async function returnableLines(env, pickingId) {
69
+ const picking = await loadDone(env, pickingId);
70
+ return [...picking.moves].map((m) => {
71
+ const done = m.doneQty ?? zero;
72
+ const returned = [...m.returns]
73
+ .filter((r) => r.picking.state !== 'cancel')
74
+ .reduce((s, r) => s.plus(r.quantity), zero);
75
+ const left = done.minus(returned);
76
+ return {
77
+ move: m.id,
78
+ product: m.product.id,
79
+ name: String(m.name ?? m.product.name),
80
+ done: done.toString(),
81
+ returned: returned.toString(),
82
+ returnable: (left.gt(0) ? left : zero).toString(),
83
+ };
84
+ });
85
+ }
86
+ /**
87
+ * Makes and confirms the return of `lines` (move and quantity, in the product's unit) with a reason; `location`
88
+ * receives it instead of where the goods came from (a damaged-goods location). Returns the new transfer.
89
+ */
90
+ export async function createReturn(env, pickingId, input) {
91
+ const picking = await loadDone(env, pickingId);
92
+ const left = new Map((await returnableLines(env, pickingId)).map((l) => [l.move, l]));
93
+ const wanted = input.lines
94
+ .map((l) => ({ move: l.move, quantity: orm.toDecimal(l.quantity || '0') }))
95
+ .filter((l) => l.quantity.gt(0));
96
+ if (wanted.length === 0)
97
+ throw new HttpProblem(400, 'invalid-body', 'Nothing to return', 'Give a quantity to return.');
98
+ for (const w of wanted) {
99
+ const l = left.get(w.move);
100
+ if (l === undefined)
101
+ throw new HttpProblem(400, 'invalid-body', 'Unknown line', 'A line of this transfer.');
102
+ if (w.quantity.gt(orm.toDecimal(l.returnable)))
103
+ throw new HttpProblem(409, 'too-much', 'More than can be returned', `${l.name}: ${l.returnable} can still be returned.`);
104
+ }
105
+ const [reason] = await env
106
+ .model('stock.return.reason')
107
+ .browse([input.reason])
108
+ .load(['name']);
109
+ if (reason === undefined)
110
+ throw new HttpProblem(400, 'invalid-body', 'Reason required', 'Give the reason of the return.');
111
+ // The original's links (an order's) carried, the way reversed.
112
+ const base = (await env
113
+ .model('stock.picking')
114
+ .browse([pickingId])
115
+ .backorderValues()).get(pickingId) ?? {};
116
+ const moveValues = await env
117
+ .model('stock.move')
118
+ .browse(wanted.map((w) => w.move))
119
+ .backorderValues();
120
+ const made = await env.model('stock.picking').create([
121
+ {
122
+ ...base,
123
+ kind: OTHER_WAY[picking.kind],
124
+ source: picking.destination.id,
125
+ destination: input.location ?? picking.source.id,
126
+ origin: `Return of ${picking.name}`,
127
+ scheduledDate: env.today(),
128
+ next: null,
129
+ returnOf: picking.id,
130
+ returnReason: input.reason,
131
+ ...(input.note == null || input.note.trim() === '' ? {} : { note: input.note.trim() }),
132
+ moves: {
133
+ create: wanted.map((w) => ({
134
+ ...(moveValues.get(w.move) ?? {}),
135
+ // In the product's unit: what was done is counted that way.
136
+ uom: [...picking.moves].find((m) => m.id === w.move)?.product.uom?.id ?? null,
137
+ quantity: w.quantity.toString(),
138
+ returnOf: w.move,
139
+ })),
140
+ },
141
+ },
142
+ ]);
143
+ const id = made.ids[0];
144
+ // The lots taken back are the original's, as far as the quantities go.
145
+ const lots = await (await env.model('stock.lot.line').search({ where: { picking: pickingId } })).load({ product: true, lot: true });
146
+ const rows = [];
147
+ for (const w of wanted) {
148
+ const product = [...picking.moves].find((m) => m.id === w.move)?.product.id;
149
+ let rest = w.quantity;
150
+ for (const l of lots) {
151
+ if (rest.lte(0) || l.product.id !== product || l.lot === null)
152
+ continue;
153
+ const take = rest.lt(l.quantity) ? rest : l.quantity;
154
+ rows.push({ picking: id, product, lot: l.lot.id, quantity: take.toString() });
155
+ rest = rest.minus(take);
156
+ }
157
+ }
158
+ if (rows.length > 0)
159
+ await env.model('stock.lot.line').create(rows);
160
+ await made.confirm();
161
+ const [row] = await made.load(['name']);
162
+ return { picking: id, name: String(row?.name ?? '') };
163
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stockroom › Stock ledger (RFC 0032 §3.3): for a period and the chosen warehouses (or every one), each product's
3
+ * opening, what came in and went out by movement type, and its closing — as a summary or every movement —, and the
4
+ * stock report (on hand, reserved, available, incoming, outgoing per product and location), as the server computes
5
+ * them, with their XLSX and PDF files.
6
+ */
7
+ import { type PageProps } from '../../ui/index.js';
8
+ import { type ReactElement } from 'react';
9
+ export declare function Ledger({ api }: PageProps): ReactElement;
@@ -0,0 +1,108 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Stockroom › Stock ledger (RFC 0032 §3.3): for a period and the chosen warehouses (or every one), each product's
4
+ * opening, what came in and went out by movement type, and its closing — as a summary or every movement —, and the
5
+ * stock report (on hand, reserved, available, incoming, outgoing per product and location), as the server computes
6
+ * them, with their XLSX and PDF files.
7
+ */
8
+ import { ApiError, Button, Input, Label, useKosh } from '../../ui/index.js';
9
+ import { useMutation, useQuery } from '@tanstack/react-query';
10
+ import { useId, useState } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
+ const IN_TYPES = [
13
+ 'purchase_receipt',
14
+ 'sales_return',
15
+ 'production_in',
16
+ 'transfer_in',
17
+ 'adjustment_in',
18
+ 'other_in',
19
+ ];
20
+ const OUT_TYPES = [
21
+ 'sales_delivery',
22
+ 'purchase_return',
23
+ 'production_out',
24
+ 'transfer_out',
25
+ 'consumption',
26
+ 'scrap',
27
+ 'adjustment_out',
28
+ 'other_out',
29
+ ];
30
+ const TABS = ['summary', 'details', 'stock'];
31
+ function saveFile(blob, filename) {
32
+ const url = URL.createObjectURL(blob);
33
+ const a = document.createElement('a');
34
+ a.href = url;
35
+ a.download = filename;
36
+ a.click();
37
+ setTimeout(() => URL.revokeObjectURL(url), 1000);
38
+ }
39
+ const firstOfMonth = () => {
40
+ const d = new Date();
41
+ return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-01`;
42
+ };
43
+ const today = () => new Date().toISOString().slice(0, 10);
44
+ const cell = 'px-2 py-1 whitespace-nowrap';
45
+ const num = `${cell} text-end tabular-nums`;
46
+ export function Ledger({ api }) {
47
+ const { t } = useTranslation('stock');
48
+ const { format } = useKosh();
49
+ const id = useId();
50
+ const [tab, setTab] = useState('summary');
51
+ const [from, setFrom] = useState(firstOfMonth);
52
+ const [to, setTo] = useState(today);
53
+ const [warehouses, setWarehouses] = useState([]);
54
+ const [categories, setCategories] = useState([]);
55
+ const warehouseList = useQuery({
56
+ queryKey: ['stock', 'ledger', 'warehouses'],
57
+ queryFn: async () => (await api.list('stock.warehouse', {
58
+ fields: ['id', 'name'],
59
+ order: ['name asc'],
60
+ limit: 200,
61
+ })).items,
62
+ });
63
+ const categoryList = useQuery({
64
+ queryKey: ['stock', 'ledger', 'categories'],
65
+ queryFn: async () => (await api.list('product.category', {
66
+ fields: ['id', 'name'],
67
+ order: ['name asc'],
68
+ limit: 500,
69
+ })).items,
70
+ });
71
+ const scope = `warehouses=${warehouses.join(',')}&categories=${categories.join(',')}`;
72
+ const path = tab === 'stock'
73
+ ? `/api/v1/stockroom/stock?${scope}`
74
+ : `/api/v1/stockroom/ledger?from=${from}&to=${to}&mode=${tab}&${scope}`;
75
+ const valid = /^\d{4}-\d{2}-\d{2}$/.test(from) && /^\d{4}-\d{2}-\d{2}$/.test(to) && from <= to;
76
+ const data = useQuery({
77
+ queryKey: ['stock', 'ledger', tab, from, to, warehouses, categories],
78
+ queryFn: () => api.call('GET', path),
79
+ enabled: tab === 'stock' || valid,
80
+ });
81
+ const download = useMutation({
82
+ mutationFn: async (kind) => {
83
+ const { blob, filename } = await api.download(`${path}&format=${kind}`, undefined, 'GET');
84
+ saveFile(blob, filename);
85
+ },
86
+ });
87
+ const error = data.error ?? download.error;
88
+ const chosen = (e) => [...e.target.selectedOptions].map((o) => Number(o.value));
89
+ return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('ledger.title') }), _jsxs("div", { className: "flex flex-wrap items-end gap-2", children: [_jsxs("fieldset", { className: "flex flex-wrap gap-1", children: [_jsx("legend", { className: "sr-only", children: t('ledger.tab') }), TABS.map((k) => (_jsx(Button, { variant: tab === k ? 'primary' : 'secondary', "aria-pressed": tab === k, onClick: () => setTab(k), children: t(`ledger.tabs.${k}`) }, k)))] }), tab === 'stock' ? null : (_jsxs(_Fragment, { children: [_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-from`, children: t('ledger.from') }), _jsx(Input, { id: `${id}-from`, type: "date", value: from, onChange: (e) => setFrom(e.target.value) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-to`, children: t('ledger.to') }), _jsx(Input, { id: `${id}-to`, type: "date", value: to, onChange: (e) => setTo(e.target.value) })] })] })), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-warehouses`, children: t('ledger.warehouses') }), _jsx("select", { id: `${id}-warehouses`, multiple: true, className: "min-w-48 rounded-md border bg-background px-2 py-1 text-sm", value: warehouses.map(String), onChange: (e) => setWarehouses(chosen(e)), children: (warehouseList.data ?? []).map((w) => (_jsx("option", { value: w.id, children: w.name }, w.id))) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-categories`, children: t('ledger.categories') }), _jsx("select", { id: `${id}-categories`, multiple: true, className: "min-w-48 rounded-md border bg-background px-2 py-1 text-sm", value: categories.map(String), onChange: (e) => setCategories(chosen(e)), children: (categoryList.data ?? []).map((c) => (_jsx("option", { value: c.id, children: c.name }, c.id))) })] }), _jsx(Button, { variant: "secondary", disabled: download.isPending, onClick: () => download.mutate('xlsx'), children: t('ledger.xlsx') }), _jsx(Button, { variant: "secondary", disabled: download.isPending, onClick: () => download.mutate('pdf'), children: t('ledger.pdf') })] }), _jsx("p", { className: "text-sm text-muted-foreground", children: t(`ledger.hints.${tab}`) }), error === null ? null : (_jsx("p", { role: "alert", className: "text-sm text-danger", children: error instanceof ApiError ? error.message : String(error) })), data.data === undefined ? null : tab === 'stock' ? (_jsx(StockTable, { rows: data.data.rows })) : tab === 'details' ? (_jsx(Details, { data: data.data })) : (_jsx(Summary, { data: data.data }))] }));
90
+ function Summary({ data }) {
91
+ const rows = data.rows;
92
+ if (rows.length === 0)
93
+ return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
94
+ const q = (f) => format.decimal(f.qty, 3);
95
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.unit') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.opening') }), IN_TYPES.map((k) => (_jsx("th", { className: `${cell} text-end`, children: t(`ledger.types.${k}`) }, k))), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.totalIn') }), OUT_TYPES.map((k) => (_jsx("th", { className: `${cell} text-end`, children: t(`ledger.types.${k}`) }, k))), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.totalOut') }), _jsx("th", { className: `${cell} text-end font-semibold`, children: t('ledger.closing') }), data.valued ? (_jsx("th", { className: `${cell} text-end`, children: t('ledger.closingValue') })) : null] }) }), _jsx("tbody", { children: rows.map((r) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: r.product.name }), _jsx("td", { className: cell, children: r.product.uom }), _jsx("td", { className: num, children: q(r.opening) }), IN_TYPES.map((k) => (_jsx("td", { className: num, children: q(r.in[k]) }, k))), _jsx("td", { className: `${num} font-semibold`, children: q(r.totalIn) }), OUT_TYPES.map((k) => (_jsx("td", { className: num, children: q(r.out[k]) }, k))), _jsx("td", { className: `${num} font-semibold`, children: q(r.totalOut) }), _jsx("td", { className: `${num} font-semibold`, children: q(r.closing) }), data.valued ? _jsx("td", { className: num, children: format.decimal(r.closing.value, 2) }) : null] }, r.product.id))) })] }) }));
96
+ }
97
+ function Details({ data }) {
98
+ const rows = data.rows;
99
+ if (rows.length === 0)
100
+ return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
101
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.date') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.reference') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.origin') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.fromPlace') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.toPlace') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.movement') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.quantity') }), data.valued ? _jsx("th", { className: `${cell} text-end`, children: t('ledger.value') }) : null] }) }), _jsx("tbody", { children: rows.map((r, i) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: format.date(r.date) }), _jsx("td", { className: cell, children: r.reference }), _jsx("td", { className: cell, children: r.origin ?? '' }), _jsxs("td", { className: cell, children: [r.product.name, " ", _jsx("span", { className: "text-muted-foreground", children: r.product.uom })] }), _jsx("td", { className: cell, children: r.from }), _jsx("td", { className: cell, children: r.to }), _jsx("td", { className: cell, children: t(`ledger.types.${r.type}`) }), _jsx("td", { className: num, children: format.decimal(r.qty, 3) }), data.valued ? _jsx("td", { className: num, children: format.decimal(r.value, 2) }) : null] }, i))) })] }) }));
102
+ }
103
+ function StockTable({ rows }) {
104
+ if (rows.length === 0)
105
+ return _jsx("p", { className: "text-sm text-muted-foreground", children: t('ledger.empty') });
106
+ return (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "bg-muted", children: _jsxs("tr", { children: [_jsx("th", { className: `${cell} text-start`, children: t('ledger.product') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.unit') }), _jsx("th", { className: `${cell} text-start`, children: t('ledger.location') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.onHand') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.reserved') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.available') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.incoming') }), _jsx("th", { className: `${cell} text-end`, children: t('ledger.outgoing') })] }) }), _jsx("tbody", { children: rows.map((r) => (_jsxs("tr", { className: "border-b", children: [_jsx("td", { className: cell, children: r.product.name }), _jsx("td", { className: cell, children: r.product.uom }), _jsx("td", { className: cell, children: r.location.name }), _jsx("td", { className: num, children: format.decimal(r.onHand, 3) }), _jsx("td", { className: num, children: format.decimal(r.reserved, 3) }), _jsx("td", { className: num, children: format.decimal(r.available, 3) }), _jsx("td", { className: num, children: format.decimal(r.incoming, 3) }), _jsx("td", { className: num, children: format.decimal(r.outgoing, 3) })] }, `${r.product.id}-${r.location.id}`))) })] }) }));
107
+ }
108
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Stockroom › My operations (RFC 0032 §3.3): a card per warehouse and kind of transfer — receipts, deliveries,
3
+ * internal moves — with what is ready, waiting and late. The server counts (`GET /api/v1/stockroom/operations`);
4
+ * each count opens the transfers it counts.
5
+ */
6
+ import { type PageProps } from '../../ui/index.js';
7
+ import type { ReactElement } from 'react';
8
+ export declare function Operations({ api, app }: PageProps): ReactElement;
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Stockroom › My operations (RFC 0032 §3.3): a card per warehouse and kind of transfer — receipts, deliveries,
4
+ * internal moves — with what is ready, waiting and late. The server counts (`GET /api/v1/stockroom/operations`);
5
+ * each count opens the transfers it counts.
6
+ */
7
+ import { Alert } from '../../ui/index.js';
8
+ import { useQuery } from '@tanstack/react-query';
9
+ import { useTranslation } from 'react-i18next';
10
+ /** A link to an action's list filtered by `domain`, labelled in its search bar. */
11
+ function hrefOf(app, action, domain, label) {
12
+ const q = JSON.stringify({ c: domain, cl: label });
13
+ // The router reads search values as JSON: a string is quoted.
14
+ return `/${app}/a/${action}?q=${encodeURIComponent(JSON.stringify(q))}`;
15
+ }
16
+ export function Operations({ api, app = 'stockroom' }) {
17
+ const { t } = useTranslation('stock');
18
+ const operations = useQuery({
19
+ queryKey: ['stock', 'operations'],
20
+ queryFn: () => api.call('GET', '/api/v1/stockroom/operations'),
21
+ refetchInterval: 60_000,
22
+ });
23
+ if (operations.isError)
24
+ return _jsx(Alert, { tone: "danger", children: operations.error.message });
25
+ const list = operations.data?.operations ?? [];
26
+ return (_jsxs("div", { className: "grid gap-4 p-4", children: [_jsx("h1", { className: "text-xl font-semibold", children: t('operations.title') }), _jsx("p", { className: "max-w-3xl text-sm text-muted-foreground", children: t('operations.hint') }), operations.isLoading ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('operations.loading') })) : list.length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('operations.empty') })) : (_jsx("ul", { className: "grid gap-3 sm:grid-cols-2 xl:grid-cols-3", children: list.map((o) => {
27
+ const title = `${o.warehouse.name}: ${t(`operations.kind.${o.kind}`)}`;
28
+ const link = (count, which) => (_jsxs("a", { href: hrefOf(app, o.action, count.domain, `${title} · ${t(`operations.${which}`)}`), className: which === 'late' && count.count > 0
29
+ ? 'rounded-md border border-destructive/40 px-3 py-2 text-destructive hover:bg-destructive/10'
30
+ : 'rounded-md border px-3 py-2 hover:bg-accent', "aria-label": t(`operations.${which}Of`, { count: count.count, title }), children: [_jsx("span", { className: "block text-2xl font-semibold tabular-nums", children: count.count }), _jsx("span", { className: "text-xs text-muted-foreground", children: t(`operations.${which}`) })] }));
31
+ return (_jsx("li", { children: _jsxs("section", { "aria-label": title, className: "space-y-3 rounded-lg border bg-card p-4 text-card-foreground", children: [_jsx("h2", { className: "font-medium", children: title }), _jsxs("div", { className: "grid grid-cols-3 gap-2", children: [link(o.ready, 'ready'), link(o.waiting, 'waiting'), link(o.late, 'late')] })] }) }, `${o.warehouse.id}-${o.kind}`));
32
+ }) }))] }));
33
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * "Return" on a done delivery or receipt (RFC 0030 §3.2): the lines with what can still come back, a quantity for
3
+ * each, the reason and a note; the server makes the linked return, confirmed, and refuses more than was done.
4
+ */
5
+ import { type NodeComponentProps } from '../../ui/index.js';
6
+ import { type ReactElement } from 'react';
7
+ export declare function ReturnButton({ record, api, reload }: NodeComponentProps): ReactElement | null;
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * "Return" on a done delivery or receipt (RFC 0030 §3.2): the lines with what can still come back, a quantity for
4
+ * each, the reason and a note; the server makes the linked return, confirmed, and refuses more than was done.
5
+ */
6
+ import { Alert, ApiError, Button, Dialog, Input, Label, Select, } from '../../ui/index.js';
7
+ import { useMutation, useQuery } from '@tanstack/react-query';
8
+ import { useId, useState } from 'react';
9
+ import { useTranslation } from 'react-i18next';
10
+ export function ReturnButton({ record, api, reload }) {
11
+ const { t } = useTranslation('stock');
12
+ const id = useId();
13
+ const [open, setOpen] = useState(false);
14
+ const [quantities, setQuantities] = useState({});
15
+ const [reason, setReason] = useState(null);
16
+ const [note, setNote] = useState('');
17
+ const [made, setMade] = useState(null);
18
+ const eligible = record !== null &&
19
+ record['state'] === 'done' &&
20
+ (record['kind'] === 'delivery' || record['kind'] === 'receipt');
21
+ const lines = useQuery({
22
+ queryKey: ['stock', 'returnable', record?.id],
23
+ queryFn: () => api.call('GET', `/api/v1/stockroom/pickings/${record?.id}/returnable`),
24
+ enabled: eligible && open,
25
+ });
26
+ const reasons = useQuery({
27
+ queryKey: ['stock', 'return-reasons'],
28
+ queryFn: () => api.list('stock.return.reason', {
29
+ fields: ['id', 'name'],
30
+ order: ['sequence asc'],
31
+ limit: 50,
32
+ }),
33
+ enabled: eligible && open,
34
+ });
35
+ const send = useMutation({
36
+ mutationFn: () => api.call('POST', `/api/v1/stockroom/pickings/${record?.id}/return`, {
37
+ lines: Object.entries(quantities)
38
+ .filter(([, q]) => q !== '' && Number(q) > 0)
39
+ .map(([move, quantity]) => ({ move: Number(move), quantity })),
40
+ reason: Number(reason),
41
+ note,
42
+ }),
43
+ onSuccess: (r) => {
44
+ setOpen(false);
45
+ setMade(r.name);
46
+ reload?.();
47
+ },
48
+ });
49
+ if (!eligible)
50
+ return null;
51
+ const rows = lines.data?.lines ?? [];
52
+ const any = Object.values(quantities).some((q) => q !== '' && Number(q) > 0);
53
+ return (_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [_jsx(Button, { size: "sm", onClick: () => {
54
+ setQuantities({});
55
+ setReason(null);
56
+ setNote('');
57
+ setOpen(true);
58
+ }, children: t('returns.button') }), made === null ? null : (_jsx("span", { role: "status", className: "text-xs text-muted-foreground", children: t('returns.made', { name: made }) })), _jsx(Dialog, { open: open, onOpenChange: setOpen, title: t('returns.title'), description: t('returns.intro'), footer: _jsx(Button, { variant: "primary", disabled: !any || reason === null, busy: send.isPending, onClick: () => send.mutate(), children: t('returns.confirm') }), children: _jsxs("div", { className: "space-y-3", children: [rows.map((l) => (_jsxs("div", { className: "grid grid-cols-[1fr_8rem] items-end gap-2", children: [_jsxs(Label, { htmlFor: `${id}-q-${l.move}`, children: [l.name, _jsx("span", { className: "block text-xs text-muted-foreground", children: t('returns.left', { done: l.done, left: l.returnable }) })] }), _jsx(Input, { id: `${id}-q-${l.move}`, inputMode: "decimal", disabled: Number(l.returnable) <= 0, value: quantities[l.move] ?? '', onChange: (e) => setQuantities({ ...quantities, [l.move]: e.target.value }) })] }, l.move))), _jsx(Select, { id: `${id}-reason`, label: t('returns.reason'), value: reason, options: (reasons.data?.items ?? []).map((r) => ({
59
+ value: String(r.id),
60
+ label: r.name,
61
+ })), onChange: setReason }), _jsxs("div", { className: "space-y-1", children: [_jsx(Label, { htmlFor: `${id}-note`, children: t('returns.note') }), _jsx(Input, { id: `${id}-note`, value: note, onChange: (e) => setNote(e.target.value) })] }), send.error === null ? null : (_jsx(Alert, { children: send.error instanceof ApiError ? send.error.message : String(send.error) }))] }) })] }));
62
+ }
@@ -6,7 +6,10 @@
6
6
  import { type Registry } from '../../ui/index.js';
7
7
  import type { i18n } from 'i18next';
8
8
  import { messages } from './messages.js';
9
+ export { Ledger } from './Ledger.js';
10
+ export { Operations } from './Operations.js';
9
11
  export { Replenishment } from './Replenishment.js';
12
+ export { ReturnButton } from './ReturnButton.js';
10
13
  export { ScanBox } from './ScanBox.js';
11
14
  /** Registers the component and the page (and the messages in `i18n`, when given). */
12
15
  export declare function registerStockWeb(registry: Registry, i18n?: i18n): Registry;
@@ -4,15 +4,24 @@
4
4
  * the Replenishment page.
5
5
  */
6
6
  import { addMessages } from '../../ui/index.js';
7
+ import { Ledger } from './Ledger.js';
7
8
  import { messages } from './messages.js';
9
+ import { Operations } from './Operations.js';
8
10
  import { Replenishment } from './Replenishment.js';
11
+ import { ReturnButton } from './ReturnButton.js';
9
12
  import { ScanBox } from './ScanBox.js';
13
+ export { Ledger } from './Ledger.js';
14
+ export { Operations } from './Operations.js';
10
15
  export { Replenishment } from './Replenishment.js';
16
+ export { ReturnButton } from './ReturnButton.js';
11
17
  export { ScanBox } from './ScanBox.js';
12
18
  /** Registers the component and the page (and the messages in `i18n`, when given). */
13
19
  export function registerStockWeb(registry, i18n) {
14
20
  registry.registerComponent('stock.Scan', ScanBox);
21
+ registry.registerComponent('stock.Return', ReturnButton);
15
22
  registry.registerPage('stock.Replenishment', Replenishment);
23
+ registry.registerPage('stock.Operations', Operations);
24
+ registry.registerPage('stock.Ledger', Ledger);
16
25
  if (i18n !== undefined)
17
26
  addMessages(i18n, 'stock', messages);
18
27
  return registry;