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,554 @@
1
+ /**
2
+ * Overheads and costing (RFC 0031 §3.5). A **costing master** on a product or a category, valid between dates,
3
+ * lists overheads: a fixed amount per order, a percentage of the material cost or an amount per unit produced,
4
+ * each absorbed into an account. When an order produces, its overheads are **applied** (lines kept on the order,
5
+ * part of what the product is valued at, posted into Work in progress against the absorbed-overhead accounts). At
6
+ * **month end** an allocation compares each account's actual overhead (its debits in the month) with what the
7
+ * month's orders absorbed and spreads the difference over those orders by produced quantity or by cost — onto the
8
+ * stock still on hand and the cost of what was sold —, posted once; a posted month is closed.
9
+ */
10
+ import { orm } from '../server/orm.js';
11
+ import { check, compute, defineModel, extendModel, f, records, } from './.kosh/bindings.js';
12
+ const zero = orm.toDecimal(0);
13
+ const money = (d) => d.toDecimalPlaces(2);
14
+ const READ = ['read'];
15
+ const ALL = ['read', 'write', 'create', 'unlink'];
16
+ const METHODS = {
17
+ fixed: 'Fixed amount per order',
18
+ percent: 'Percentage of the material cost',
19
+ unit: 'Per unit produced',
20
+ };
21
+ function dayOf(v) {
22
+ if (!(v instanceof Date))
23
+ return String(v ?? '').slice(0, 10);
24
+ const pad = (n) => String(n).padStart(2, '0');
25
+ return `${v.getFullYear()}-${pad(v.getMonth() + 1)}-${pad(v.getDate())}`;
26
+ }
27
+ /** The first and last day of the month of a date. */
28
+ export function monthOf(day) {
29
+ const [y, m] = day.slice(0, 10).split('-').map(Number);
30
+ const last = new Date(Date.UTC(y, m, 0)).getUTCDate();
31
+ const mm = String(m).padStart(2, '0');
32
+ return { from: `${y}-${mm}-01`, to: `${y}-${mm}-${String(last).padStart(2, '0')}` };
33
+ }
34
+ export const ProductionCosting = defineModel('production.costing', {
35
+ label: 'Costing master',
36
+ recName: 'name',
37
+ order: ['name asc', 'id asc'],
38
+ companyScoped: { required: true },
39
+ tracking: ['name', 'product', 'category', 'validFrom', 'validTo', 'active'],
40
+ access: { 'production_account.user': READ, 'production.manager': [...ALL, 'export', 'import'] },
41
+ fields: {
42
+ name: f.char({ required: true }),
43
+ active: f.boolean({ required: true, default: true }),
44
+ product: f.many2one('product.product', {
45
+ ondelete: 'cascade',
46
+ help: 'The product the overheads apply to; a product’s own master comes before its category’s.',
47
+ }),
48
+ category: f.many2one('product.category', {
49
+ ondelete: 'cascade',
50
+ help: 'Every product of the category, when no product is named.',
51
+ }),
52
+ validFrom: f.date({ label: 'Valid from' }),
53
+ validTo: f.date({ label: 'Valid to' }),
54
+ lines: f.one2many('production.costing.line', 'costing', { label: 'Overheads' }),
55
+ note: f.text(),
56
+ },
57
+ constraints: {
58
+ scope: {
59
+ ...check('production.costing', ['product', 'category'], async (rows) => [...(await rows.load({}))]
60
+ .filter((r) => r.product === null && r.category === null)
61
+ .map((r) => r.id)),
62
+ message: 'A costing master applies to a product or to a category.',
63
+ },
64
+ },
65
+ });
66
+ export const ProductionCostingLine = defineModel('production.costing.line', {
67
+ label: 'Overhead rate',
68
+ order: ['sequence asc', 'id asc'],
69
+ access: { 'production_account.user': READ, 'production.manager': ALL },
70
+ fields: {
71
+ costing: f.many2one('production.costing', { required: true, ondelete: 'cascade' }),
72
+ sequence: f.integer({ required: true, default: 10 }),
73
+ name: f.char({ required: true, label: 'Overhead' }),
74
+ account: f.many2one('account.account', {
75
+ required: true,
76
+ ondelete: 'restrict',
77
+ label: 'Overhead account',
78
+ help: 'Credited with what orders absorb; its own debits are the actual overhead, compared at month end.',
79
+ }),
80
+ method: f.selection(METHODS, {
81
+ required: true,
82
+ default: 'percent',
83
+ help: 'A fixed amount for each order, a percentage of the materials consumed, or an amount per unit produced.',
84
+ }),
85
+ amount: f.decimal({
86
+ scale: 4,
87
+ required: true,
88
+ default: '0',
89
+ label: 'Rate',
90
+ help: 'The amount, the percentage or the amount per unit, by the method.',
91
+ }),
92
+ },
93
+ sqlConstraints: {
94
+ rate: { check: orm.sql `amount >= 0`, message: 'A rate is not negative.' },
95
+ },
96
+ });
97
+ export const ProductionOrderOverhead = defineModel('production.order.overhead', {
98
+ label: 'Applied overhead',
99
+ order: ['production asc', 'id asc'],
100
+ access: { 'production_account.user': READ, 'production.manager': READ },
101
+ fields: {
102
+ production: f.many2one('production.order', { required: true, ondelete: 'cascade' }),
103
+ name: f.char({ required: true, label: 'Overhead' }),
104
+ account: f.many2one('account.account', { required: true, ondelete: 'restrict' }),
105
+ method: f.selection(METHODS, {
106
+ required: true,
107
+ help: 'How the rate was applied: per order, of the material cost, or per unit produced.',
108
+ }),
109
+ rate: f.decimal({ scale: 4, required: true, default: '0' }),
110
+ amount: f.decimal({ scale: 2, required: true, default: '0' }),
111
+ costing: f.many2one('production.costing', { ondelete: 'set null', label: 'Costing master' }),
112
+ },
113
+ });
114
+ /** The order's overheads: applied when it produces, part of the product's value beside materials and operations. */
115
+ export const OrderOverhead = extendModel('production.order', {
116
+ fields: {
117
+ overheads: f.one2many('production.order.overhead', 'production', { label: 'Overheads' }),
118
+ overheadCost: f.decimal({
119
+ scale: 2,
120
+ store: true,
121
+ label: 'Overhead',
122
+ help: 'The overheads applied when the order produced, from its costing master.',
123
+ ...compute('production.order', 'overheadCost', ['overheads.amount'], (orders) => {
124
+ for (const o of orders)
125
+ o.overheadCost = [...o.overheads].reduce((s, l) => s.plus(l.amount), zero);
126
+ }),
127
+ }),
128
+ fullCost: f.decimal({
129
+ scale: 2,
130
+ store: true,
131
+ label: 'Full cost',
132
+ help: 'Materials, operations and overhead together.',
133
+ ...compute('production.order', 'fullCost', ['totalCost', 'overheadCost'], (orders) => {
134
+ for (const o of orders)
135
+ o.fullCost = (o.totalCost ?? zero).plus(o.overheadCost ?? zero);
136
+ }),
137
+ }),
138
+ },
139
+ });
140
+ function validOn(c, day) {
141
+ const from = c.validFrom === null ? null : dayOf(c.validFrom);
142
+ const to = c.validTo === null ? null : dayOf(c.validTo);
143
+ return (from === null || from <= day) && (to === null || to >= day);
144
+ }
145
+ /** The costing master valid on a day for a product: the product's own first, else its category's. */
146
+ async function costingFor(env, product, day) {
147
+ const own = await (await env
148
+ .model('production.costing')
149
+ .search({ where: { active: true, product }, order: ['id desc'] })).load({ lines: { account: true } });
150
+ const mine = [...own].find((c) => validOn(c, day));
151
+ if (mine !== undefined)
152
+ return mine;
153
+ const [p] = await env.model('product.product').browse([product]).load({});
154
+ if (p === undefined || p.category === null)
155
+ return null;
156
+ const byCategory = await (await env.model('production.costing').search({
157
+ where: { active: true, category: p.category.id, product: { isNull: true } },
158
+ order: ['id desc'],
159
+ })).load({ lines: { account: true } });
160
+ return ([...byCategory].find((c) => validOn(c, day)) ?? null);
161
+ }
162
+ /**
163
+ * Applies the costing master to an order once, when it produces: a line per overhead with the amount it works out
164
+ * to for what was consumed and produced. Returns the lines (the ones already applied on a second call).
165
+ */
166
+ export async function applyOverheads(env, order, consumedValue, produced) {
167
+ return env.asSuperuser({ reason: 'production overheads' }, async (su) => {
168
+ const [o] = await su.model('production.order').browse([order]).load({ overheads: true });
169
+ if (o === undefined)
170
+ return { total: zero, lines: [] };
171
+ if (o.overheads.length === 0) {
172
+ const costing = await costingFor(su, o.product.id, dayOf(su.today()));
173
+ if (costing !== null) {
174
+ for (const l of costing.lines) {
175
+ const amount = l.method === 'fixed'
176
+ ? l.amount
177
+ : l.method === 'percent'
178
+ ? consumedValue.times(l.amount).div(100)
179
+ : produced.times(l.amount);
180
+ if (amount.lte(0))
181
+ continue;
182
+ await su.model('production.order.overhead').create([
183
+ {
184
+ production: o.id,
185
+ name: l.name,
186
+ account: l.account.id,
187
+ method: l.method,
188
+ rate: l.amount,
189
+ amount: money(amount),
190
+ costing: costing.id,
191
+ },
192
+ ]);
193
+ }
194
+ await su.flush();
195
+ }
196
+ }
197
+ const [again] = await su
198
+ .model('production.order')
199
+ .browse([order])
200
+ .load({ overheads: { account: true } });
201
+ const lines = [...(again?.overheads ?? [])].map((l) => ({
202
+ account: l.account.id,
203
+ amount: l.amount,
204
+ name: l.name,
205
+ }));
206
+ return { total: lines.reduce((s, l) => s.plus(l.amount), zero), lines };
207
+ });
208
+ }
209
+ export const ProductionOverheadAllocation = defineModel('production.overhead.allocation', {
210
+ label: 'Overhead allocation',
211
+ recName: 'name',
212
+ order: ['month desc', 'id desc'],
213
+ companyScoped: { required: true },
214
+ tracking: ['state', 'month', 'distribution'],
215
+ access: { 'production_account.user': READ, 'production.manager': [...ALL, 'export', 'import'] },
216
+ fields: {
217
+ name: f.char({
218
+ required: true,
219
+ sequence: { code: 'production.overhead.allocation', dateField: 'month' },
220
+ label: 'Reference',
221
+ }),
222
+ month: f.date({ required: true, help: 'Any day of the month allocated.' }),
223
+ distribution: f.selection({ quantity: 'By produced quantity', cost: 'By full cost' }, {
224
+ required: true,
225
+ default: 'quantity',
226
+ help: 'How the difference is spread over the month’s done orders.',
227
+ }),
228
+ lines: f.one2many('production.overhead.allocation.line', 'allocation', { label: 'Accounts' }),
229
+ shares: f.one2many('production.overhead.allocation.share', 'allocation', {
230
+ label: 'Allocated to',
231
+ }),
232
+ difference: f.decimal({
233
+ scale: 2,
234
+ store: true,
235
+ label: 'Under-absorbed',
236
+ help: 'Actual overhead beyond what the month’s orders absorbed; negative: over-absorbed.',
237
+ ...compute('production.overhead.allocation', 'difference', ['lines.difference'], (rows) => {
238
+ for (const a of rows)
239
+ a.difference = [...a.lines].reduce((s, l) => s.plus(l.difference ?? zero), zero);
240
+ }),
241
+ }),
242
+ move: f.many2one('account.move', { ondelete: 'set null', label: 'Entry' }),
243
+ note: f.text(),
244
+ state: f.state({
245
+ states: { draft: 'Draft', posted: 'Posted', cancel: 'Cancelled' },
246
+ initial: 'draft',
247
+ help: 'Drafted and worked out; posted once, which closes the month.',
248
+ transitions: {
249
+ /** The month's actual against absorbed per account, and the shares of the difference. */
250
+ reckon: {
251
+ from: ['draft'],
252
+ to: 'draft',
253
+ after: records('production.overhead.allocation', async (rows) => {
254
+ const env = rows.env;
255
+ await env.flush();
256
+ for (const id of rows.ids)
257
+ await reckonAllocation(env, id);
258
+ }),
259
+ },
260
+ post: {
261
+ from: ['draft'],
262
+ to: 'posted',
263
+ guard: records('production.overhead.allocation', async (rows) => {
264
+ const env = rows.env;
265
+ const out = [];
266
+ for (const a of await rows.load({ lines: true, shares: true })) {
267
+ const { from, to } = monthOf(dayOf(a.month));
268
+ const closed = await env.model('production.overhead.allocation').search({
269
+ where: {
270
+ company: a.company.id,
271
+ state: 'posted',
272
+ month: { gte: from, lte: to },
273
+ id: { ne: a.id },
274
+ },
275
+ limit: 1,
276
+ });
277
+ if (closed.length > 0 ||
278
+ a.lines.length === 0 ||
279
+ a.shares.length === 0 ||
280
+ (a.difference ?? zero).eq(0))
281
+ out.push(a.id);
282
+ }
283
+ return out;
284
+ }),
285
+ message: 'Work the month out first, with a difference to allocate and done orders to carry it; a month with a posted allocation is closed.',
286
+ after: records('production.overhead.allocation', async (rows) => {
287
+ const env = rows.env;
288
+ await env.flush();
289
+ for (const id of rows.ids)
290
+ await postAllocation(env, id);
291
+ for (const a of await rows.load({}))
292
+ await env.emit('production.overhead.allocation.posted', { id: a.id });
293
+ }),
294
+ },
295
+ cancel: { from: ['draft'], to: 'cancel' },
296
+ redraft: { from: ['cancel'], to: 'draft' },
297
+ },
298
+ extensible: true,
299
+ }),
300
+ },
301
+ });
302
+ export const ProductionOverheadAllocationLine = defineModel('production.overhead.allocation.line', {
303
+ label: 'Overhead account for the month',
304
+ order: ['allocation asc', 'id asc'],
305
+ access: { 'production_account.user': READ, 'production.manager': READ },
306
+ fields: {
307
+ allocation: f.many2one('production.overhead.allocation', {
308
+ required: true,
309
+ ondelete: 'cascade',
310
+ }),
311
+ account: f.many2one('account.account', { required: true, ondelete: 'restrict' }),
312
+ actual: f.decimal({
313
+ scale: 2,
314
+ required: true,
315
+ default: '0',
316
+ help: 'The account’s debits in the month: the overhead spent.',
317
+ }),
318
+ absorbed: f.decimal({
319
+ scale: 2,
320
+ required: true,
321
+ default: '0',
322
+ help: 'What the month’s done orders absorbed into the account.',
323
+ }),
324
+ difference: f.decimal({
325
+ scale: 2,
326
+ store: true,
327
+ help: 'Actual less absorbed.',
328
+ ...compute('production.overhead.allocation.line', 'difference', ['actual', 'absorbed'], (rows) => {
329
+ for (const l of rows)
330
+ l.difference = l.actual.minus(l.absorbed);
331
+ }),
332
+ }),
333
+ },
334
+ });
335
+ export const ProductionOverheadAllocationShare = defineModel('production.overhead.allocation.share', {
336
+ label: 'Allocated overhead',
337
+ order: ['allocation asc', 'id asc'],
338
+ access: { 'production_account.user': READ, 'production.manager': READ },
339
+ fields: {
340
+ allocation: f.many2one('production.overhead.allocation', {
341
+ required: true,
342
+ ondelete: 'cascade',
343
+ }),
344
+ order: f.many2one('production.order', {
345
+ required: true,
346
+ ondelete: 'restrict',
347
+ label: 'Production order',
348
+ }),
349
+ product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
350
+ quantity: f.decimal({ scale: 4, required: true, default: '0', label: 'Produced' }),
351
+ share: f.decimal({ scale: 4, required: true, default: '0', label: 'Share %' }),
352
+ amount: f.decimal({ scale: 2, required: true, default: '0' }),
353
+ },
354
+ });
355
+ /** The month's done orders of the company: those that produced in the month. */
356
+ async function doneOrders(env, company, from, to) {
357
+ return (await env.model('production.order').search({
358
+ where: { company, state: 'done', manufacturingDate: { gte: from, lte: to } },
359
+ order: ['id asc'],
360
+ })).load({ overheads: true, product: true });
361
+ }
362
+ /** Actual against absorbed per overhead account, and the month's done orders' shares of the difference. */
363
+ export async function reckonAllocation(env, id) {
364
+ await env.asSuperuser({ reason: 'overhead allocation' }, async (su) => {
365
+ const [a] = await su
366
+ .model('production.overhead.allocation')
367
+ .browse([id])
368
+ .load({ lines: true, shares: true, company: true });
369
+ if (a === undefined)
370
+ return;
371
+ if (a.lines.length > 0)
372
+ await a.lines.unlink();
373
+ if (a.shares.length > 0)
374
+ await a.shares.unlink();
375
+ const { from, to } = monthOf(dayOf(a.month));
376
+ const orders = [...(await doneOrders(su, a.company.id, from, to))];
377
+ // The accounts: every overhead account of the company's costing masters, and those the orders absorbed into.
378
+ const accounts = new Set();
379
+ const absorbed = new Map();
380
+ for (const c of await su
381
+ .model('production.costing.line')
382
+ .search({ where: { 'costing.company': a.company.id } })
383
+ .then((r) => r.load({})))
384
+ accounts.add(c.account.id);
385
+ for (const o of orders)
386
+ for (const l of o.overheads) {
387
+ accounts.add(l.account.id);
388
+ absorbed.set(l.account.id, (absorbed.get(l.account.id) ?? zero).plus(l.amount));
389
+ }
390
+ for (const account of accounts) {
391
+ const lines = await (await su.model('account.move.line').search({
392
+ where: { account, date: { gte: from, lte: to }, 'move.state': 'posted' },
393
+ })).load(['debit']);
394
+ const actual = [...lines].reduce((s, l) => s.plus(l.debit.amount), zero);
395
+ await su.model('production.overhead.allocation.line').create([
396
+ {
397
+ allocation: a.id,
398
+ account: account,
399
+ actual: money(actual),
400
+ absorbed: money(absorbed.get(account) ?? zero),
401
+ },
402
+ ]);
403
+ }
404
+ await su.flush();
405
+ const [again] = await su
406
+ .model('production.overhead.allocation')
407
+ .browse([id])
408
+ .load({ lines: true });
409
+ const difference = [...(again?.lines ?? [])].reduce((s, l) => s.plus(l.actual.minus(l.absorbed)), zero);
410
+ // The shares: by produced quantity or by full cost, the rounding on the last.
411
+ const weights = orders.map((o) => a.distribution === 'cost'
412
+ ? (o.fullCost ?? o.totalCost ?? zero)
413
+ : (o.producedQty ?? o.quantity));
414
+ const total = weights.reduce((s, w) => s.plus(w), zero);
415
+ let left = money(difference);
416
+ for (const [i, o] of orders.entries()) {
417
+ const w = weights[i] ?? zero;
418
+ const share = total.gt(0) ? w.div(total).times(100).toDecimalPlaces(4) : zero;
419
+ const amount = i === orders.length - 1 ? left : money(difference.times(share).div(100));
420
+ left = left.minus(amount);
421
+ await su.model('production.overhead.allocation.share').create([
422
+ {
423
+ allocation: a.id,
424
+ order: o.id,
425
+ product: o.product.id,
426
+ quantity: o.producedQty ?? o.quantity,
427
+ share,
428
+ amount,
429
+ },
430
+ ]);
431
+ }
432
+ await su.flush();
433
+ });
434
+ }
435
+ /**
436
+ * Posts the allocation once: each account's difference credited (debited when over-absorbed) against the stock
437
+ * valuation account for what is still on hand and the cost of sales for what was sold, per order; the layers and
438
+ * the average costs follow.
439
+ */
440
+ export async function postAllocation(env, id) {
441
+ const { stockAccountsOf } = await import('../stock_account/index.js');
442
+ const [a] = await env
443
+ .model('production.overhead.allocation')
444
+ .browse([id])
445
+ .load({
446
+ lines: true,
447
+ shares: { order: true, product: { category: true } },
448
+ company: { currency: true },
449
+ });
450
+ if (a === undefined)
451
+ return;
452
+ const accounts = await stockAccountsOf(env, a.company.id);
453
+ if (accounts === null)
454
+ throw new orm.ValidationError('production.overhead.allocation', ['state'], 'The company has no chart of accounts.', 'Install a chart of accounts (Accounting › Configuration).');
455
+ const entryLines = [];
456
+ const updates = [];
457
+ for (const s of a.shares) {
458
+ if (s.amount.eq(0))
459
+ continue;
460
+ const output = s.order.output?.id ?? null;
461
+ const [layer] = output === null
462
+ ? []
463
+ : await (await env.model('stock.valuation.layer').search({
464
+ where: { picking: output, product: s.product.id, quantity: { gt: '0' } },
465
+ limit: 1,
466
+ })).load(['quantity', 'remainingQty']);
467
+ const onHand = layer === undefined || layer.quantity.lte(0) ? zero : layer.remainingQty.div(layer.quantity);
468
+ const toStock = money(s.amount.times(onHand.gt(1) ? orm.toDecimal(1) : onHand));
469
+ const toCogs = s.amount.minus(toStock);
470
+ const category = s.product.category;
471
+ const name = `${a.name} ${s.product.name}`;
472
+ if (!toStock.eq(0)) {
473
+ entryLines.push({
474
+ account: category?.stockValuationAccount?.id ?? accounts.valuation,
475
+ debit: toStock.gt(0) ? toStock : zero,
476
+ credit: toStock.lt(0) ? zero.minus(toStock) : zero,
477
+ name,
478
+ });
479
+ if (layer !== undefined)
480
+ updates.push({ layer: layer.id, product: s.product.id, toStock });
481
+ }
482
+ if (!toCogs.eq(0))
483
+ entryLines.push({
484
+ account: category?.stockCogsAccount?.id ?? accounts.cogs,
485
+ debit: toCogs.gt(0) ? toCogs : zero,
486
+ credit: toCogs.lt(0) ? zero.minus(toCogs) : zero,
487
+ name: `${name} (sold)`,
488
+ });
489
+ }
490
+ for (const l of a.lines) {
491
+ const d = l.difference ?? zero;
492
+ if (d.eq(0))
493
+ continue;
494
+ entryLines.push({
495
+ account: l.account.id,
496
+ debit: d.lt(0) ? zero.minus(d) : zero,
497
+ credit: d.gt(0) ? d : zero,
498
+ name: `${a.name} overhead`,
499
+ });
500
+ }
501
+ if (entryLines.length === 0)
502
+ return;
503
+ const made = await env.model('account.move').create([
504
+ {
505
+ kind: 'entry',
506
+ journal: accounts.journal,
507
+ company: a.company.id,
508
+ currency: a.company.currency?.id,
509
+ date: monthOf(dayOf(a.month)).to,
510
+ ref: a.name,
511
+ lines: {
512
+ create: entryLines.map((l) => ({
513
+ account: l.account,
514
+ name: l.name,
515
+ debit: l.debit.toFixed(2),
516
+ credit: l.credit.toFixed(2),
517
+ })),
518
+ },
519
+ },
520
+ ]);
521
+ await env.withGrants({ grants: ['account.post'], reason: `${a.name} posted` }, (e) => e.model('account.move').browse(made.ids).post());
522
+ await env.asSuperuser({ reason: `overhead allocation ${String(a.name)} posted` }, async (su) => {
523
+ for (const u of updates) {
524
+ const [layer] = await su
525
+ .model('stock.valuation.layer')
526
+ .browse([u.layer])
527
+ .load(['remainingValue', 'value']);
528
+ if (layer !== undefined)
529
+ await layer.write({
530
+ value: layer.value.plus(u.toStock),
531
+ remainingValue: layer.remainingValue.plus(u.toStock),
532
+ });
533
+ const [p] = await su
534
+ .model('product.product')
535
+ .browse([u.product])
536
+ .load({ category: true });
537
+ if (p === undefined)
538
+ continue;
539
+ const fifo = (p.costMethod ?? p.category?.costMethod ?? 'average') === 'fifo';
540
+ if (!fifo && (p.qtyOnHand ?? zero).gt(0))
541
+ await su
542
+ .model('product.product')
543
+ .browse([u.product])
544
+ .write({
545
+ standardPrice: money(p.standardPrice.plus(u.toStock.div(p.qtyOnHand ?? zero))),
546
+ });
547
+ }
548
+ await su
549
+ .model('production.overhead.allocation')
550
+ .browse([id])
551
+ .write({ move: made.ids[0] });
552
+ await su.flush();
553
+ });
554
+ }
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 573a25fb98026e3a
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 8f72ca757b9b8450
2
2
  // Bindings of module `project`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';