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,582 @@
1
+ /**
2
+ * The stock ledger and the stock report (RFC 0032 §3.3), over HTTP:
3
+ *
4
+ * - `GET /api/v1/stockroom/ledger?from&to&mode=summary|details&warehouses=1,2&locations=&categories=&products=`
5
+ * — for a period and a scope of locations (chosen warehouses' stock, or chosen locations; every warehouse
6
+ * otherwise), per product: the opening quantity, what came in by **movement type** (purchase receipt, sales
7
+ * return, production, transfer in, adjustment, other), what went out by type (sales delivery, purchase return,
8
+ * production consumption, transfer out, internal use, scrap, adjustment, other) and the closing quantity; or every
9
+ * movement of the period. Movement types come from where the goods came from and went to, never typed by hand.
10
+ * With `stock_account`, and for people who may read the valuation, each figure carries its value.
11
+ * - `GET /api/v1/stockroom/stock?warehouses&locations&categories&products` — on hand, reserved, available, incoming
12
+ * and outgoing per product and location in the scope.
13
+ *
14
+ * Both as JSON for the screen, or with `format=xlsx` / `format=pdf` as a file (the export right; audited).
15
+ */
16
+ import { moneyFormat, renderPdf, workbook } from '../reporting/index.js';
17
+ import { audit, HttpProblem } from '../server/index.js';
18
+ import { orm } from '../server/orm.js';
19
+ const zero = orm.toDecimal(0);
20
+ export const IN_TYPES = [
21
+ 'purchase_receipt',
22
+ 'sales_return',
23
+ 'production_in',
24
+ 'transfer_in',
25
+ 'adjustment_in',
26
+ 'other_in',
27
+ ];
28
+ export const OUT_TYPES = [
29
+ 'sales_delivery',
30
+ 'purchase_return',
31
+ 'production_out',
32
+ 'transfer_out',
33
+ 'consumption',
34
+ 'scrap',
35
+ 'adjustment_out',
36
+ 'other_out',
37
+ ];
38
+ export const TYPE_LABELS = {
39
+ purchase_receipt: 'Purchase receipt',
40
+ sales_return: 'Sales return',
41
+ production_in: 'Production in',
42
+ transfer_in: 'Transfer in',
43
+ adjustment_in: 'Adjustment in',
44
+ other_in: 'Other in',
45
+ sales_delivery: 'Sales delivery',
46
+ purchase_return: 'Purchase return',
47
+ production_out: 'Production out',
48
+ transfer_out: 'Transfer out',
49
+ consumption: 'Internal use',
50
+ scrap: 'Scrap',
51
+ adjustment_out: 'Adjustment out',
52
+ other_out: 'Other out',
53
+ };
54
+ /** A date-only value as `YYYY-MM-DD`. */
55
+ export function isoDay(v) {
56
+ if (!(v instanceof Date))
57
+ return String(v ?? '').slice(0, 10);
58
+ const pad = (n) => String(n).padStart(2, '0');
59
+ return `${v.getFullYear()}-${pad(v.getMonth() + 1)}-${pad(v.getDate())}`;
60
+ }
61
+ /**
62
+ * The locations the scope covers — the chosen locations and what is inside them, or the stock of the chosen (else
63
+ * every) warehouses — with every location's name. Transit locations count only when chosen by name.
64
+ */
65
+ async function insideLocations(env, scope) {
66
+ const loaded = await (await env.model('stock.location').search({})).load({
67
+ parent: true,
68
+ warehouse: true,
69
+ });
70
+ const all = [...loaded].map((l) => ({
71
+ id: l.id,
72
+ name: l.fullName ?? l.name,
73
+ usage: l.usage,
74
+ parent: l.parent?.id ?? null,
75
+ warehouse: l.warehouse?.id ?? null,
76
+ transit: l.transit === true,
77
+ }));
78
+ const places = new Map(all.map((l) => [l.id, l]));
79
+ const roots = new Set(scope.locations);
80
+ if (roots.size === 0)
81
+ for (const l of all)
82
+ if (l.usage === 'internal' &&
83
+ !l.transit &&
84
+ l.parent === null &&
85
+ l.warehouse !== null &&
86
+ (scope.warehouses.length === 0 || scope.warehouses.includes(l.warehouse)))
87
+ roots.add(l.id);
88
+ const inside = new Set();
89
+ for (const l of all) {
90
+ let p = l;
91
+ for (let depth = 0; p !== undefined && depth < 30; depth += 1) {
92
+ if (roots.has(p.id)) {
93
+ if (!l.transit || scope.locations.includes(l.id))
94
+ inside.add(l.id);
95
+ break;
96
+ }
97
+ p = p.parent === null ? undefined : places.get(p.parent);
98
+ }
99
+ }
100
+ return { inside, names: new Map(all.map((l) => [l.id, l.name])), places };
101
+ }
102
+ /** Whether this person may see stock values (`stock_account` installed and the valuation readable). */
103
+ function canValue(env) {
104
+ try {
105
+ return env.access.can('stock.valuation.layer', 'read');
106
+ }
107
+ catch {
108
+ return false;
109
+ }
110
+ }
111
+ /** The done lines whose transfer was done in `[from, to]` (both optional), in the scope's products. */
112
+ async function doneLines(env, scope, from, to) {
113
+ const where = { 'picking.state': 'done' };
114
+ if (from !== null && to !== null)
115
+ where['picking.doneDate'] = { gte: from, lte: to };
116
+ else if (to !== null)
117
+ where['picking.doneDate'] = { lte: to };
118
+ else if (from !== null)
119
+ where['picking.doneDate'] = { gte: from };
120
+ if (scope.products.length > 0)
121
+ where['product'] = { in: scope.products };
122
+ if (scope.categories.length > 0)
123
+ where['product.category'] = { in: scope.categories };
124
+ const found = await env.model('stock.move').search({ where: where, limit: 200000 });
125
+ return found.load({
126
+ picking: { source: true, destination: true },
127
+ product: { uom: true },
128
+ destination: true,
129
+ });
130
+ }
131
+ /** Where a line's goods came from and went to against the scope: in, out, or inside only (null). */
132
+ function classify(line, inside, places) {
133
+ const sourceId = line.picking.source.id;
134
+ const destinationId = (line.destination?.id ?? line.picking.destination.id);
135
+ const sIn = inside.has(sourceId);
136
+ const dIn = inside.has(destinationId);
137
+ if (sIn === dIn)
138
+ return null;
139
+ if (dIn) {
140
+ const usage = places.get(sourceId)?.usage ?? line.picking.source.usage;
141
+ const type = usage === 'vendor'
142
+ ? 'purchase_receipt'
143
+ : usage === 'customer'
144
+ ? 'sales_return'
145
+ : usage === 'production'
146
+ ? 'production_in'
147
+ : usage === 'adjustment'
148
+ ? 'adjustment_in'
149
+ : usage === 'internal' || usage === 'transit' || usage === 'consumption'
150
+ ? 'transfer_in'
151
+ : 'other_in';
152
+ return { dir: 'in', type };
153
+ }
154
+ const place = places.get(destinationId);
155
+ const usage = place?.usage ?? line.picking.destination.usage;
156
+ const type = usage === 'customer'
157
+ ? 'sales_delivery'
158
+ : usage === 'vendor'
159
+ ? 'purchase_return'
160
+ : usage === 'production'
161
+ ? 'production_out'
162
+ : usage === 'adjustment'
163
+ ? (place?.name ?? '').endsWith('Scrap')
164
+ ? 'scrap'
165
+ : 'adjustment_out'
166
+ : usage === 'consumption'
167
+ ? 'consumption'
168
+ : usage === 'internal' || usage === 'transit'
169
+ ? 'transfer_out'
170
+ : 'other_out';
171
+ return { dir: 'out', type };
172
+ }
173
+ /** Each line's value as it moved (signed), from the valuation when readable, else at the product's cost. */
174
+ async function valuesOf(env, lines, valued) {
175
+ const out = new Map();
176
+ if (!valued)
177
+ return out;
178
+ const ids = lines.map((l) => l.id);
179
+ const given = new Map();
180
+ for (let i = 0; i < ids.length; i += 2000) {
181
+ const chunk = ids.slice(i, i + 2000);
182
+ const values = await env
183
+ .model('stock.move')
184
+ .browse(chunk)
185
+ .moveValues();
186
+ for (const [id, v] of values)
187
+ given.set(id, orm.toDecimal(v));
188
+ }
189
+ for (const l of lines) {
190
+ const v = given.get(l.id);
191
+ if (v !== undefined && !v.eq(0))
192
+ out.set(l.id, v.abs());
193
+ else
194
+ out.set(l.id, (l.doneQty ?? zero).times(l.product.standardPrice ?? zero).abs());
195
+ }
196
+ return out;
197
+ }
198
+ const figure = () => ({ qty: zero, value: zero });
199
+ const add = (f, qty, value) => {
200
+ f.qty = f.qty.plus(qty);
201
+ f.value = f.value.plus(value);
202
+ };
203
+ const productOf = (l) => ({
204
+ id: l.product.id,
205
+ name: l.product.name,
206
+ uom: l.product.uom?.name ?? '',
207
+ });
208
+ /** The ledger's summary: per product, opening, in and out by type, closing. */
209
+ export async function ledgerSummary(env, scope, from, to) {
210
+ const valued = canValue(env);
211
+ const { inside, places } = await insideLocations(env, scope);
212
+ const before = [...(await doneLines(env, scope, null, isoDay(dayBefore(from))))];
213
+ const during = [...(await doneLines(env, scope, from, to))];
214
+ const values = await valuesOf(env, [...before, ...during], valued);
215
+ const rows = new Map();
216
+ const rowOf = (l) => {
217
+ const id = l.product.id;
218
+ let r = rows.get(id);
219
+ if (r === undefined) {
220
+ r = {
221
+ product: productOf(l),
222
+ opening: figure(),
223
+ in: Object.fromEntries(IN_TYPES.map((t) => [t, figure()])),
224
+ out: Object.fromEntries(OUT_TYPES.map((t) => [t, figure()])),
225
+ };
226
+ rows.set(id, r);
227
+ }
228
+ return r;
229
+ };
230
+ for (const l of before) {
231
+ const c = classify(l, inside, places);
232
+ if (c === null)
233
+ continue;
234
+ const qty = l.doneQty ?? zero;
235
+ const value = values.get(l.id) ?? zero;
236
+ const r = rowOf(l);
237
+ add(r.opening, c.dir === 'in' ? qty : qty.negated(), c.dir === 'in' ? value : value.negated());
238
+ }
239
+ for (const l of during) {
240
+ const c = classify(l, inside, places);
241
+ if (c === null)
242
+ continue;
243
+ const r = rowOf(l);
244
+ const qty = l.doneQty ?? zero;
245
+ const value = values.get(l.id) ?? zero;
246
+ if (c.dir === 'in')
247
+ add(r.in[c.type], qty, value);
248
+ else
249
+ add(r.out[c.type], qty, value);
250
+ }
251
+ const out = [...rows.values()]
252
+ .map((r) => {
253
+ const totalIn = figure();
254
+ const totalOut = figure();
255
+ for (const t of IN_TYPES)
256
+ add(totalIn, r.in[t].qty, r.in[t].value);
257
+ for (const t of OUT_TYPES)
258
+ add(totalOut, r.out[t].qty, r.out[t].value);
259
+ const closing = {
260
+ qty: r.opening.qty.plus(totalIn.qty).minus(totalOut.qty),
261
+ value: r.opening.value.plus(totalIn.value).minus(totalOut.value),
262
+ };
263
+ return { ...r, totalIn, totalOut, closing };
264
+ })
265
+ .filter((r) => !r.opening.qty.eq(0) || !r.totalIn.qty.eq(0) || !r.totalOut.qty.eq(0))
266
+ .sort((a, b) => a.product.name.localeCompare(b.product.name));
267
+ return { valued, rows: out };
268
+ }
269
+ /** The ledger's details: every movement of the period in the scope. */
270
+ export async function ledgerDetails(env, scope, from, to) {
271
+ const valued = canValue(env);
272
+ const { inside, names, places } = await insideLocations(env, scope);
273
+ const during = [...(await doneLines(env, scope, from, to))];
274
+ const values = await valuesOf(env, during, valued);
275
+ const rows = [];
276
+ for (const l of during) {
277
+ const c = classify(l, inside, places);
278
+ if (c === null)
279
+ continue;
280
+ const qty = l.doneQty ?? zero;
281
+ const value = values.get(l.id) ?? zero;
282
+ const destination = (l.destination?.id ?? l.picking.destination.id);
283
+ rows.push({
284
+ date: isoDay(l.picking.doneDate),
285
+ reference: l.picking.name,
286
+ origin: l.picking.origin ?? null,
287
+ product: productOf(l),
288
+ from: names.get(l.picking.source.id) ?? '',
289
+ to: names.get(destination) ?? '',
290
+ type: c.type,
291
+ qty: c.dir === 'in' ? qty : qty.negated(),
292
+ value: c.dir === 'in' ? value : value.negated(),
293
+ });
294
+ }
295
+ rows.sort((a, b) => a.date.localeCompare(b.date) ||
296
+ a.reference.localeCompare(b.reference) ||
297
+ a.product.name.localeCompare(b.product.name));
298
+ return { valued, rows };
299
+ }
300
+ /** The stock report: on hand, reserved, available, incoming and outgoing per product and location in the scope. */
301
+ export async function stockReport(env, scope) {
302
+ const { inside, names } = await insideLocations(env, scope);
303
+ const where = { location: { in: [...inside] } };
304
+ if (scope.products.length > 0)
305
+ where['product'] = { in: scope.products };
306
+ if (scope.categories.length > 0)
307
+ where['product.category'] = { in: scope.categories };
308
+ const quants = await (await env.model('stock.quant').search({ where: where, limit: 200000 })).load({ product: { uom: true }, location: true });
309
+ const rows = new Map();
310
+ const rowOf = (product, location) => {
311
+ const key = `${product.id}:${location.id}`;
312
+ let r = rows.get(key);
313
+ if (r === undefined) {
314
+ r = { product, location, onHand: zero, reserved: zero, incoming: zero, outgoing: zero };
315
+ rows.set(key, r);
316
+ }
317
+ return r;
318
+ };
319
+ for (const q of quants) {
320
+ const r = rowOf({ id: q.product.id, name: q.product.name, uom: q.product.uom?.name ?? '' }, { id: q.location.id, name: names.get(q.location.id) ?? '' });
321
+ r.onHand = r.onHand.plus(q.quantity);
322
+ r.reserved = r.reserved.plus(q.reserved ?? zero);
323
+ }
324
+ // What confirmed transfers will bring in or take out.
325
+ const openWhere = { 'picking.state': 'confirmed' };
326
+ if (scope.products.length > 0)
327
+ openWhere['product'] = { in: scope.products };
328
+ if (scope.categories.length > 0)
329
+ openWhere['product.category'] = { in: scope.categories };
330
+ const open = await (await env.model('stock.move').search({ where: openWhere, limit: 200000 })).load({
331
+ picking: { source: true, destination: true },
332
+ product: { uom: true },
333
+ destination: true,
334
+ });
335
+ for (const m of open) {
336
+ const sourceId = m.picking.source.id;
337
+ const destinationId = (m.destination?.id ?? m.picking.destination.id);
338
+ const sIn = inside.has(sourceId);
339
+ const dIn = inside.has(destinationId);
340
+ if (sIn === dIn)
341
+ continue;
342
+ const product = {
343
+ id: m.product.id,
344
+ name: m.product.name,
345
+ uom: m.product.uom?.name ?? '',
346
+ };
347
+ const at = dIn ? destinationId : sourceId;
348
+ const r = rowOf(product, { id: at, name: names.get(at) ?? '' });
349
+ const qty = m.productQty ?? m.quantity;
350
+ if (dIn)
351
+ r.incoming = r.incoming.plus(qty);
352
+ else
353
+ r.outgoing = r.outgoing.plus(qty);
354
+ }
355
+ return [...rows.values()]
356
+ .map((r) => ({ ...r, available: r.onHand.minus(r.reserved) }))
357
+ .filter((r) => !r.onHand.eq(0) || !r.incoming.eq(0) || !r.outgoing.eq(0))
358
+ .sort((a, b) => a.product.name.localeCompare(b.product.name) ||
359
+ a.location.name.localeCompare(b.location.name));
360
+ }
361
+ function dayBefore(day) {
362
+ const d = new Date(`${day}T00:00:00`);
363
+ d.setDate(d.getDate() - 1);
364
+ return d;
365
+ }
366
+ // ---------------------------------------------------------------------------------------------------- HTTP
367
+ const DAY = /^\d{4}-\d{2}-\d{2}$/;
368
+ const ints = (v) => typeof v === 'string' && v !== ''
369
+ ? v
370
+ .split(',')
371
+ .map((x) => Number(x))
372
+ .filter((n) => Number.isInteger(n) && n > 0)
373
+ : [];
374
+ const money = (d) => d.toFixed(2);
375
+ const qtyText = (d) => d.toFixed(3);
376
+ const esc = (s) => s.replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' })[c]);
377
+ const isDecimal = (v) => typeof v === 'object' && v !== null && typeof v.toFixed === 'function';
378
+ /** The table of a report as rows of cells (the first the header), for XLSX and PDF. */
379
+ function tableOf(kind, data) {
380
+ if (kind === 'summary') {
381
+ const head = ['Product', 'Unit', 'Opening'];
382
+ for (const t of IN_TYPES)
383
+ head.push(TYPE_LABELS[t]);
384
+ head.push('Total in');
385
+ for (const t of OUT_TYPES)
386
+ head.push(TYPE_LABELS[t]);
387
+ head.push('Total out', 'Closing');
388
+ if (data.valued)
389
+ head.push('Opening value', 'Value in', 'Value out', 'Closing value');
390
+ return [
391
+ head,
392
+ ...data.rows.map((r) => {
393
+ const row = [r.product.name, r.product.uom, r.opening.qty];
394
+ for (const t of IN_TYPES)
395
+ row.push(r.in[t].qty);
396
+ row.push(r.totalIn.qty);
397
+ for (const t of OUT_TYPES)
398
+ row.push(r.out[t].qty);
399
+ row.push(r.totalOut.qty, r.closing.qty);
400
+ if (data.valued)
401
+ row.push(r.opening.value, r.totalIn.value, r.totalOut.value, r.closing.value);
402
+ return row;
403
+ }),
404
+ ];
405
+ }
406
+ if (kind === 'details')
407
+ return [
408
+ [
409
+ 'Date',
410
+ 'Reference',
411
+ 'Source document',
412
+ 'Product',
413
+ 'Unit',
414
+ 'From',
415
+ 'To',
416
+ 'Movement',
417
+ 'Quantity',
418
+ ...(data.valued ? ['Value'] : []),
419
+ ],
420
+ ...data.rows.map((r) => [
421
+ r.date,
422
+ r.reference,
423
+ r.origin ?? '',
424
+ r.product.name,
425
+ r.product.uom,
426
+ r.from,
427
+ r.to,
428
+ TYPE_LABELS[r.type],
429
+ r.qty,
430
+ ...(data.valued ? [r.value] : []),
431
+ ]),
432
+ ];
433
+ return [
434
+ ['Product', 'Unit', 'Location', 'On hand', 'Reserved', 'Available', 'Incoming', 'Outgoing'],
435
+ ...data.rows.map((r) => [
436
+ r.product.name,
437
+ r.product.uom,
438
+ r.location.name,
439
+ r.onHand,
440
+ r.reserved,
441
+ r.available,
442
+ r.incoming,
443
+ r.outgoing,
444
+ ]),
445
+ ];
446
+ }
447
+ function sheetOf(name, rows, currency) {
448
+ const format = moneyFormat(currency);
449
+ const valueColumns = new Set((rows[0] ?? []).map((h, i) => (String(h).toLowerCase().includes('value') ? i : -1)));
450
+ return {
451
+ name,
452
+ rows: rows.map((r, i) => r.map((v, j) => {
453
+ if (isDecimal(v))
454
+ return valueColumns.has(j) ? { decimal: money(v), format } : Number(qtyText(v));
455
+ return i === 0 ? { text: String(v), bold: true } : String(v);
456
+ })),
457
+ headerRows: 1,
458
+ widths: (rows[0] ?? []).map((h, i) => i === 0 ? 32 : Math.max(10, Math.min(18, String(h).length + 2))),
459
+ };
460
+ }
461
+ function htmlOf(title, subtitle, rows, locale) {
462
+ const number = new Intl.NumberFormat(locale, { maximumFractionDigits: 3 });
463
+ const cell = (v, tag) => isDecimal(v)
464
+ ? `<${tag} class="n">${number.format(Number(v.toFixed(3)))}</${tag}>`
465
+ : `<${tag}>${esc(v)}</${tag}>`;
466
+ const [head, ...body] = rows;
467
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><title>${esc(title)}</title><style>
468
+ body { font: 8pt system-ui, sans-serif; color: #111; }
469
+ h1 { font-size: 13pt; margin: 0 0 2mm; } p { margin: 0 0 4mm; }
470
+ table { width: 100%; border-collapse: collapse; }
471
+ th, td { border-bottom: 1px solid #ccc; padding: 1mm 1.2mm; text-align: start; vertical-align: top; }
472
+ th { background: #f2f2f2; } .n { text-align: end; white-space: nowrap; }
473
+ </style></head><body><h1>${esc(title)}</h1><p>${esc(subtitle)}</p><table><thead><tr>${(head ?? [])
474
+ .map((v) => cell(v, 'th'))
475
+ .join('')}</tr></thead><tbody>${body
476
+ .map((r) => `<tr>${r.map((v) => cell(v, 'td')).join('')}</tr>`)
477
+ .join('')}</tbody></table></body></html>`;
478
+ }
479
+ const figureJson = (f) => ({ qty: qtyText(f.qty), value: money(f.value) });
480
+ export function registerLedgerRoutes(context) {
481
+ const { app } = context;
482
+ const scopeOf = (query) => ({
483
+ warehouses: ints(query['warehouses']),
484
+ locations: ints(query['locations']),
485
+ categories: ints(query['categories']),
486
+ products: ints(query['products']),
487
+ });
488
+ const serve = async (request, reply, kind, filename, compute, json, subtitle) => {
489
+ const query = request.query;
490
+ const format = query['format'] === 'xlsx' || query['format'] === 'pdf' ? query['format'] : 'json';
491
+ const out = await request.env(async (raw) => {
492
+ const env = raw;
493
+ env.access.check('stock.move', format === 'json' ? 'read' : 'export');
494
+ const data = await compute(env);
495
+ if (format === 'json')
496
+ return { json: json(data) };
497
+ await audit(raw, {
498
+ kind: 'data.export',
499
+ summary: `Exported the stock ${kind === 'stock' ? 'report' : 'ledger'} as ${format}.`,
500
+ targetModel: 'stock.move',
501
+ details: { kind, query },
502
+ ip: request.ip,
503
+ });
504
+ const [company] = await env
505
+ .model('res.company')
506
+ .search({ where: { id: env.companyRef }, limit: 1 })
507
+ .then((c) => c.load({ currency: ['name'] }));
508
+ return {
509
+ rows: tableOf(kind, data),
510
+ company: {
511
+ name: company?.name ?? '',
512
+ currency: company?.currency.name ?? 'BDT',
513
+ locale: company?.numberGrouping === 'lakh' ? 'en-IN' : 'en-US',
514
+ },
515
+ };
516
+ }, { write: format !== 'json' });
517
+ if ('json' in out)
518
+ return out.json;
519
+ const title = kind === 'stock' ? 'Stock report' : 'Stock ledger';
520
+ const content = format === 'xlsx'
521
+ ? workbook([sheetOf(title, out.rows, out.company.currency)])
522
+ : await renderPdf(htmlOf(title, `${out.company.name} · ${subtitle}`, out.rows, out.company.locale), {
523
+ paper: 'A4',
524
+ orientation: 'landscape',
525
+ blocks: [],
526
+ });
527
+ await reply
528
+ .type(format === 'xlsx'
529
+ ? 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
530
+ : 'application/pdf')
531
+ .header('content-disposition', `attachment; filename="${filename}.${format}"`)
532
+ .send(content);
533
+ return reply;
534
+ };
535
+ app.get('/api/v1/stockroom/ledger', async (request, reply) => {
536
+ const query = request.query;
537
+ const from = typeof query['from'] === 'string' ? query['from'] : '';
538
+ const to = typeof query['to'] === 'string' ? query['to'] : '';
539
+ if (!DAY.test(from) || !DAY.test(to) || from > to)
540
+ throw new HttpProblem(400, 'invalid-period', 'Invalid period', 'Give from and to as YYYY-MM-DD, from first.');
541
+ const mode = query['mode'] === 'details' ? 'details' : 'summary';
542
+ const scope = scopeOf(query);
543
+ return serve(request, reply, mode, `stock-ledger-${from}-${to}`, (env) => mode === 'details'
544
+ ? ledgerDetails(env, scope, from, to)
545
+ : ledgerSummary(env, scope, from, to), (data) => ({
546
+ valued: data.valued,
547
+ from,
548
+ to,
549
+ mode,
550
+ rows: mode === 'details'
551
+ ? data.rows.map((r) => ({
552
+ ...r,
553
+ qty: qtyText(r.qty),
554
+ value: money(r.value),
555
+ }))
556
+ : data.rows.map((r) => ({
557
+ product: r.product,
558
+ opening: figureJson(r.opening),
559
+ in: Object.fromEntries(IN_TYPES.map((t) => [t, figureJson(r.in[t])])),
560
+ out: Object.fromEntries(OUT_TYPES.map((t) => [t, figureJson(r.out[t])])),
561
+ totalIn: figureJson(r.totalIn),
562
+ totalOut: figureJson(r.totalOut),
563
+ closing: figureJson(r.closing),
564
+ })),
565
+ }), `${from} – ${to}`);
566
+ });
567
+ app.get('/api/v1/stockroom/stock', async (request, reply) => {
568
+ const query = request.query;
569
+ const scope = scopeOf(query);
570
+ return serve(request, reply, 'stock', 'stock-report', async (env) => ({ valued: false, rows: await stockReport(env, scope) }), (data) => ({
571
+ rows: data.rows.map((r) => ({
572
+ product: r.product,
573
+ location: r.location,
574
+ onHand: qtyText(r.onHand),
575
+ reserved: qtyText(r.reserved),
576
+ available: qtyText(r.available),
577
+ incoming: qtyText(r.incoming),
578
+ outgoing: qtyText(r.outgoing),
579
+ })),
580
+ }), isoDay(new Date()));
581
+ });
582
+ }