shutro-erp 0.3.5 → 0.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/dist/account_asset/.kosh/bindings.js +15 -0
  2. package/dist/{mrp_account → account_asset}/.kosh/schema.d.ts +785 -614
  3. package/dist/account_asset/board.d.ts +61 -0
  4. package/dist/account_asset/board.js +86 -0
  5. package/dist/account_asset/books.d.ts +42 -0
  6. package/dist/account_asset/books.js +398 -0
  7. package/dist/account_asset/demo.d.ts +7 -0
  8. package/dist/account_asset/demo.js +72 -0
  9. package/dist/account_asset/i18n/bn.d.ts +2 -0
  10. package/dist/account_asset/i18n/bn.js +97 -0
  11. package/dist/account_asset/index.d.ts +9 -0
  12. package/dist/account_asset/index.js +337 -0
  13. package/dist/account_asset/module.d.ts +11076 -0
  14. package/dist/account_asset/module.js +230 -0
  15. package/dist/account_budget/.kosh/bindings.js +15 -0
  16. package/dist/account_budget/.kosh/schema.d.ts +2841 -0
  17. package/dist/account_budget/budget.d.ts +5 -0
  18. package/dist/account_budget/budget.js +142 -0
  19. package/dist/account_budget/demo.d.ts +6 -0
  20. package/dist/account_budget/demo.js +30 -0
  21. package/dist/account_budget/i18n/bn.d.ts +2 -0
  22. package/dist/account_budget/i18n/bn.js +63 -0
  23. package/dist/account_budget/index.d.ts +4 -0
  24. package/dist/account_budget/index.js +237 -0
  25. package/dist/account_budget/module.d.ts +27289 -0
  26. package/dist/account_budget/module.js +182 -0
  27. package/dist/account_portal/.kosh/bindings.js +1 -1
  28. package/dist/account_portal/.kosh/schema.d.ts +651 -10
  29. package/dist/account_portal/i18n/bn.d.ts +2 -0
  30. package/dist/account_portal/i18n/bn.js +6 -0
  31. package/dist/account_portal/index.js +2 -0
  32. package/dist/account_portal/module.d.ts +5212 -1592
  33. package/dist/accounting/.kosh/bindings.js +1 -1
  34. package/dist/accounting/.kosh/schema.d.ts +651 -10
  35. package/dist/accounting/closing.js +1 -0
  36. package/dist/accounting/fiscal.d.ts +578 -0
  37. package/dist/accounting/fiscal.js +401 -0
  38. package/dist/accounting/followups.d.ts +618 -0
  39. package/dist/accounting/followups.js +420 -0
  40. package/dist/accounting/i18n/bn.d.ts +2 -0
  41. package/dist/accounting/i18n/bn.js +425 -0
  42. package/dist/accounting/index.d.ts +3 -1
  43. package/dist/accounting/index.js +780 -5
  44. package/dist/accounting/module.d.ts +5386 -1543
  45. package/dist/accounting/module.js +155 -18
  46. package/dist/accounting/statements.d.ts +878 -0
  47. package/dist/accounting/statements.js +728 -0
  48. package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
  49. package/dist/accounting/web/BankReconcilePage.js +138 -0
  50. package/dist/accounting/web/FollowupsPage.d.ts +8 -0
  51. package/dist/accounting/web/FollowupsPage.js +54 -0
  52. package/dist/accounting/web/PostingPreview.d.ts +8 -0
  53. package/dist/accounting/web/PostingPreview.js +26 -0
  54. package/dist/accounting/web/index.d.ts +3 -0
  55. package/dist/accounting/web/index.js +9 -0
  56. package/dist/accounting/web/messages.js +140 -0
  57. package/dist/approvals/.kosh/bindings.d.ts +22 -0
  58. package/dist/approvals/.kosh/bindings.js +15 -0
  59. package/dist/approvals/.kosh/schema.d.ts +879 -0
  60. package/dist/approvals/demo.d.ts +7 -0
  61. package/dist/approvals/demo.js +41 -0
  62. package/dist/approvals/i18n/bn.d.ts +2 -0
  63. package/dist/approvals/i18n/bn.js +133 -0
  64. package/dist/approvals/index.d.ts +36 -0
  65. package/dist/approvals/index.js +772 -0
  66. package/dist/approvals/mails.d.ts +30 -0
  67. package/dist/approvals/mails.js +87 -0
  68. package/dist/approvals/module.d.ts +2930 -0
  69. package/dist/approvals/module.js +473 -0
  70. package/dist/approvals/web/Config.d.ts +12 -0
  71. package/dist/approvals/web/Config.js +60 -0
  72. package/dist/approvals/web/History.d.ts +4 -0
  73. package/dist/approvals/web/History.js +13 -0
  74. package/dist/approvals/web/Inbox.d.ts +9 -0
  75. package/dist/approvals/web/Inbox.js +114 -0
  76. package/dist/approvals/web/Matrix.d.ts +9 -0
  77. package/dist/approvals/web/Matrix.js +26 -0
  78. package/dist/approvals/web/Mine.d.ts +7 -0
  79. package/dist/approvals/web/Mine.js +27 -0
  80. package/dist/approvals/web/index.d.ts +15 -0
  81. package/dist/approvals/web/index.js +29 -0
  82. package/dist/approvals/web/messages.d.ts +2 -0
  83. package/dist/approvals/web/messages.js +211 -0
  84. package/dist/approvals/web/shared.d.ts +59 -0
  85. package/dist/approvals/web/shared.js +46 -0
  86. package/dist/approvals_purchase/.kosh/bindings.d.ts +22 -0
  87. package/dist/approvals_purchase/.kosh/bindings.js +15 -0
  88. package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
  89. package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
  90. package/dist/approvals_purchase/i18n/bn.js +5 -0
  91. package/dist/approvals_purchase/index.d.ts +3 -0
  92. package/dist/approvals_purchase/index.js +47 -0
  93. package/dist/approvals_purchase/module.d.ts +12670 -0
  94. package/dist/approvals_purchase/module.js +84 -0
  95. package/dist/attendance/.kosh/bindings.d.ts +22 -0
  96. package/dist/attendance/.kosh/bindings.js +15 -0
  97. package/dist/attendance/.kosh/schema.d.ts +1106 -0
  98. package/dist/attendance/days.d.ts +96 -0
  99. package/dist/attendance/days.js +430 -0
  100. package/dist/attendance/demo.d.ts +7 -0
  101. package/dist/attendance/demo.js +58 -0
  102. package/dist/attendance/i18n/bn.d.ts +2 -0
  103. package/dist/attendance/i18n/bn.js +147 -0
  104. package/dist/attendance/index.d.ts +4 -0
  105. package/dist/attendance/index.js +515 -0
  106. package/dist/attendance/module.d.ts +4413 -0
  107. package/dist/attendance/module.js +412 -0
  108. package/dist/attendance/routes.d.ts +16 -0
  109. package/dist/attendance/routes.js +266 -0
  110. package/dist/attendance/web/Check.d.ts +8 -0
  111. package/dist/attendance/web/Check.js +40 -0
  112. package/dist/attendance/web/Kiosk.d.ts +8 -0
  113. package/dist/attendance/web/Kiosk.js +62 -0
  114. package/dist/attendance/web/PinButton.d.ts +7 -0
  115. package/dist/attendance/web/PinButton.js +29 -0
  116. package/dist/attendance/web/index.d.ts +13 -0
  117. package/dist/attendance/web/index.js +22 -0
  118. package/dist/attendance/web/messages.d.ts +2 -0
  119. package/dist/attendance/web/messages.js +61 -0
  120. package/dist/automation/engine.js +1 -1
  121. package/dist/calendar/.kosh/bindings.js +1 -1
  122. package/dist/calendar/.kosh/schema.d.ts +2 -1
  123. package/dist/calendar/i18n/bn.d.ts +2 -0
  124. package/dist/calendar/i18n/bn.js +80 -0
  125. package/dist/calendar/index.js +77 -0
  126. package/dist/calendar/module.d.ts +26 -0
  127. package/dist/calendar/module.js +14 -4
  128. package/dist/cli/apps.js +25 -5
  129. package/dist/cli/init.js +46 -4
  130. package/dist/cli/templates.d.ts +1 -1
  131. package/dist/cli/templates.js +123 -5
  132. package/dist/contacts/.kosh/bindings.js +1 -1
  133. package/dist/contacts/.kosh/schema.d.ts +2 -1
  134. package/dist/contacts/i18n/bn.d.ts +2 -0
  135. package/dist/contacts/i18n/bn.js +67 -0
  136. package/dist/contacts/index.js +3 -0
  137. package/dist/contacts/module.d.ts +42 -0
  138. package/dist/contacts/module.js +19 -3
  139. package/dist/crm/.kosh/bindings.js +1 -1
  140. package/dist/crm/.kosh/schema.d.ts +3 -1
  141. package/dist/crm/i18n/bn.d.ts +2 -0
  142. package/dist/crm/i18n/bn.js +80 -0
  143. package/dist/crm/index.js +22 -0
  144. package/dist/crm/module.d.ts +22 -0
  145. package/dist/crm/module.js +6 -3
  146. package/dist/documents/.kosh/bindings.d.ts +22 -0
  147. package/dist/documents/.kosh/bindings.js +15 -0
  148. package/dist/documents/.kosh/schema.d.ts +863 -0
  149. package/dist/documents/demo.d.ts +6 -0
  150. package/dist/documents/demo.js +22 -0
  151. package/dist/documents/documents.d.ts +98 -0
  152. package/dist/documents/documents.js +318 -0
  153. package/dist/documents/i18n/bn.d.ts +2 -0
  154. package/dist/documents/i18n/bn.js +83 -0
  155. package/dist/documents/index.d.ts +30 -0
  156. package/dist/documents/index.js +569 -0
  157. package/dist/documents/module.d.ts +2801 -0
  158. package/dist/documents/module.js +215 -0
  159. package/dist/documents/web/Versions.d.ts +7 -0
  160. package/dist/documents/web/Versions.js +45 -0
  161. package/dist/documents/web/index.d.ts +11 -0
  162. package/dist/documents/web/index.js +16 -0
  163. package/dist/documents/web/messages.d.ts +2 -0
  164. package/dist/documents/web/messages.js +21 -0
  165. package/dist/event/.kosh/bindings.js +1 -1
  166. package/dist/event/.kosh/schema.d.ts +2 -1
  167. package/dist/event/i18n/bn.d.ts +2 -0
  168. package/dist/event/i18n/bn.js +101 -0
  169. package/dist/event/index.js +66 -0
  170. package/dist/event/module.d.ts +20 -0
  171. package/dist/event/module.js +8 -1
  172. package/dist/event_account/.kosh/bindings.js +1 -1
  173. package/dist/event_account/.kosh/schema.d.ts +651 -10
  174. package/dist/event_account/i18n/bn.d.ts +2 -0
  175. package/dist/event_account/i18n/bn.js +5 -0
  176. package/dist/event_account/index.js +2 -0
  177. package/dist/event_account/module.d.ts +5133 -1513
  178. package/dist/expense/.kosh/bindings.d.ts +22 -0
  179. package/dist/expense/.kosh/bindings.js +15 -0
  180. package/dist/expense/.kosh/schema.d.ts +1620 -0
  181. package/dist/expense/demo.d.ts +7 -0
  182. package/dist/expense/demo.js +69 -0
  183. package/dist/expense/i18n/bn.d.ts +2 -0
  184. package/dist/expense/i18n/bn.js +155 -0
  185. package/dist/expense/index.d.ts +3 -0
  186. package/dist/expense/index.js +502 -0
  187. package/dist/expense/module.d.ts +6768 -0
  188. package/dist/expense/module.js +649 -0
  189. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  190. package/dist/expense_account/.kosh/bindings.js +15 -0
  191. package/dist/expense_account/.kosh/schema.d.ts +2515 -0
  192. package/dist/expense_account/i18n/bn.d.ts +2 -0
  193. package/dist/expense_account/i18n/bn.js +15 -0
  194. package/dist/expense_account/index.d.ts +3 -0
  195. package/dist/expense_account/index.js +76 -0
  196. package/dist/expense_account/module.d.ts +14628 -0
  197. package/dist/expense_account/module.js +318 -0
  198. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  199. package/dist/helpdesk/.kosh/bindings.js +15 -0
  200. package/dist/helpdesk/.kosh/schema.d.ts +886 -0
  201. package/dist/helpdesk/demo.d.ts +7 -0
  202. package/dist/helpdesk/demo.js +65 -0
  203. package/dist/helpdesk/hours.d.ts +17 -0
  204. package/dist/helpdesk/hours.js +94 -0
  205. package/dist/helpdesk/i18n/bn.d.ts +2 -0
  206. package/dist/helpdesk/i18n/bn.js +127 -0
  207. package/dist/helpdesk/index.d.ts +10 -0
  208. package/dist/helpdesk/index.js +463 -0
  209. package/dist/helpdesk/module.d.ts +2960 -0
  210. package/dist/helpdesk/module.js +326 -0
  211. package/dist/helpdesk/routes.d.ts +12 -0
  212. package/dist/helpdesk/routes.js +132 -0
  213. package/dist/helpdesk/sla.d.ts +37 -0
  214. package/dist/helpdesk/sla.js +226 -0
  215. package/dist/hr/.kosh/bindings.js +1 -1
  216. package/dist/hr/.kosh/schema.d.ts +59 -1
  217. package/dist/hr/demo.js +11 -1
  218. package/dist/hr/i18n/bn.d.ts +2 -0
  219. package/dist/hr/i18n/bn.js +126 -0
  220. package/dist/hr/index.d.ts +1 -1
  221. package/dist/hr/index.js +158 -12
  222. package/dist/hr/module.d.ts +932 -59
  223. package/dist/hr/module.js +114 -17
  224. package/dist/indent/.kosh/bindings.d.ts +22 -0
  225. package/dist/indent/.kosh/bindings.js +15 -0
  226. package/dist/indent/.kosh/schema.d.ts +2084 -0
  227. package/dist/indent/demo.d.ts +7 -0
  228. package/dist/indent/demo.js +48 -0
  229. package/dist/indent/i18n/bn.d.ts +2 -0
  230. package/dist/indent/i18n/bn.js +143 -0
  231. package/dist/indent/index.d.ts +3 -0
  232. package/dist/indent/index.js +450 -0
  233. package/dist/indent/module.d.ts +13424 -0
  234. package/dist/indent/module.js +792 -0
  235. package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
  236. package/dist/indent_purchase/.kosh/bindings.js +15 -0
  237. package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
  238. package/dist/indent_purchase/i18n/bn.d.ts +2 -0
  239. package/dist/indent_purchase/i18n/bn.js +13 -0
  240. package/dist/indent_purchase/index.d.ts +3 -0
  241. package/dist/indent_purchase/index.js +61 -0
  242. package/dist/indent_purchase/module.d.ts +27950 -0
  243. package/dist/indent_purchase/module.js +163 -0
  244. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  245. package/dist/l10n_bd/.kosh/schema.d.ts +651 -10
  246. package/dist/l10n_bd/i18n/bn.d.ts +2 -0
  247. package/dist/l10n_bd/i18n/bn.js +69 -0
  248. package/dist/l10n_bd/index.js +2 -0
  249. package/dist/l10n_bd/module.d.ts +5212 -1592
  250. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  251. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  252. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2891 -0
  253. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  254. package/dist/l10n_bd_payroll/data.js +347 -0
  255. package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
  256. package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
  257. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  258. package/dist/l10n_bd_payroll/index.js +26 -0
  259. package/dist/l10n_bd_payroll/module.d.ts +17294 -0
  260. package/dist/l10n_bd_payroll/module.js +86 -0
  261. package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
  262. package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
  263. package/dist/l10n_bd_pos/.kosh/schema.d.ts +2341 -0
  264. package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
  265. package/dist/l10n_bd_pos/i18n/bn.js +32 -0
  266. package/dist/l10n_bd_pos/index.d.ts +3 -0
  267. package/dist/l10n_bd_pos/index.js +111 -0
  268. package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +9047 -6981
  269. package/dist/l10n_bd_pos/module.js +43 -0
  270. package/dist/l10n_in/.kosh/bindings.js +1 -1
  271. package/dist/l10n_in/.kosh/schema.d.ts +651 -10
  272. package/dist/l10n_in/i18n/bn.d.ts +2 -0
  273. package/dist/l10n_in/i18n/bn.js +95 -0
  274. package/dist/l10n_in/index.js +2 -0
  275. package/dist/l10n_in/module.d.ts +6778 -1580
  276. package/dist/l10n_in/module.js +25 -5
  277. package/dist/l10n_in/web/GstSettings.js +2 -2
  278. package/dist/mail/inbound/handle.js +8 -5
  279. package/dist/mail/inbound/models.js +5 -3
  280. package/dist/mail/index.d.ts +12 -1
  281. package/dist/mail/index.js +139 -2
  282. package/dist/mail/send.d.ts +56 -0
  283. package/dist/mail/send.js +394 -0
  284. package/dist/mail/web/SendButton.d.ts +9 -0
  285. package/dist/mail/web/SendButton.js +71 -0
  286. package/dist/mail/web/SendSelected.d.ts +8 -0
  287. package/dist/mail/web/SendSelected.js +33 -0
  288. package/dist/mail/web/index.d.ts +2 -0
  289. package/dist/mail/web/index.js +6 -0
  290. package/dist/mail/web/messages.js +36 -0
  291. package/dist/maintenance/.kosh/bindings.js +1 -1
  292. package/dist/maintenance/.kosh/schema.d.ts +2 -1
  293. package/dist/maintenance/i18n/bn.d.ts +2 -0
  294. package/dist/maintenance/i18n/bn.js +132 -0
  295. package/dist/maintenance/index.js +85 -0
  296. package/dist/maintenance/module.d.ts +25 -0
  297. package/dist/maintenance/module.js +27 -9
  298. package/dist/maintenance_stock/.kosh/bindings.js +1 -1
  299. package/dist/maintenance_stock/.kosh/schema.d.ts +374 -3
  300. package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
  301. package/dist/maintenance_stock/i18n/bn.js +21 -0
  302. package/dist/maintenance_stock/index.js +2 -0
  303. package/dist/maintenance_stock/module.d.ts +6095 -1327
  304. package/dist/maintenance_stock/module.js +1 -0
  305. package/dist/modules-sdk/apps.d.ts +10 -0
  306. package/dist/modules-sdk/apps.js +32 -0
  307. package/dist/modules-sdk/index.d.ts +1 -1
  308. package/dist/modules-sdk/manifest.d.ts +105 -2
  309. package/dist/payment/.kosh/bindings.js +1 -1
  310. package/dist/payment/.kosh/schema.d.ts +653 -11
  311. package/dist/payment/i18n/bn.d.ts +2 -0
  312. package/dist/payment/i18n/bn.js +59 -0
  313. package/dist/payment/index.d.ts +41 -0
  314. package/dist/payment/index.js +216 -74
  315. package/dist/payment/module.d.ts +5353 -1675
  316. package/dist/payment/module.js +36 -6
  317. package/dist/payment/settle.js +11 -1
  318. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  319. package/dist/payroll/.kosh/bindings.js +15 -0
  320. package/dist/payroll/.kosh/schema.d.ts +1448 -0
  321. package/dist/payroll/compute.d.ts +35 -0
  322. package/dist/payroll/compute.js +398 -0
  323. package/dist/payroll/demo.d.ts +55 -0
  324. package/dist/payroll/demo.js +121 -0
  325. package/dist/payroll/formula.d.ts +62 -0
  326. package/dist/payroll/formula.js +320 -0
  327. package/dist/payroll/i18n/bn.d.ts +2 -0
  328. package/dist/payroll/i18n/bn.js +206 -0
  329. package/dist/payroll/index.d.ts +230 -0
  330. package/dist/payroll/index.js +715 -0
  331. package/dist/{mrp → payroll}/module.d.ts +4294 -2624
  332. package/dist/payroll/module.js +606 -0
  333. package/dist/payroll/routes.d.ts +10 -0
  334. package/dist/payroll/routes.js +112 -0
  335. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  336. package/dist/payroll_account/.kosh/bindings.js +15 -0
  337. package/dist/payroll_account/.kosh/schema.d.ts +2887 -0
  338. package/dist/payroll_account/i18n/bn.d.ts +2 -0
  339. package/dist/payroll_account/i18n/bn.js +10 -0
  340. package/dist/payroll_account/index.d.ts +3 -0
  341. package/dist/payroll_account/index.js +42 -0
  342. package/dist/payroll_account/module.d.ts +16738 -0
  343. package/dist/payroll_account/module.js +256 -0
  344. package/dist/permissions/approvals.d.ts +227 -12
  345. package/dist/permissions/approvals.js +1421 -67
  346. package/dist/permissions/index.d.ts +1 -1
  347. package/dist/permissions/index.js +2 -2
  348. package/dist/permissions/models.js +364 -13
  349. package/dist/permissions/routes.d.ts +9 -1
  350. package/dist/permissions/routes.js +72 -5
  351. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  352. package/dist/permissions/web/ApprovalPanel.js +75 -11
  353. package/dist/permissions/web/index.d.ts +6 -4
  354. package/dist/permissions/web/index.js +13 -4
  355. package/dist/permissions/web/messages.d.ts +2 -0
  356. package/dist/permissions/web/messages.js +95 -0
  357. package/dist/portal/.kosh/bindings.js +1 -1
  358. package/dist/portal/.kosh/schema.d.ts +2 -1
  359. package/dist/portal/documents.d.ts +3 -0
  360. package/dist/portal/documents.js +21 -1
  361. package/dist/portal/i18n/bn.d.ts +2 -0
  362. package/dist/portal/i18n/bn.js +33 -0
  363. package/dist/portal/index.js +3 -1
  364. package/dist/portal/module.d.ts +20 -0
  365. package/dist/portal/routes-documents.js +76 -0
  366. package/dist/pos/.kosh/bindings.js +1 -1
  367. package/dist/pos/.kosh/schema.d.ts +652 -10
  368. package/dist/pos/i18n/bn.d.ts +2 -0
  369. package/dist/pos/i18n/bn.js +133 -0
  370. package/dist/pos/index.js +87 -1
  371. package/dist/pos/module.d.ts +6967 -1709
  372. package/dist/pos/module.js +49 -5
  373. package/dist/pos/routes.js +80 -7
  374. package/dist/pos/web/Register.js +2 -5
  375. package/dist/pos_stock/.kosh/bindings.js +1 -1
  376. package/dist/pos_stock/.kosh/schema.d.ts +822 -12
  377. package/dist/pos_stock/i18n/bn.d.ts +2 -0
  378. package/dist/pos_stock/i18n/bn.js +6 -0
  379. package/dist/pos_stock/index.js +2 -0
  380. package/dist/pos_stock/module.d.ts +11241 -2851
  381. package/dist/product/.kosh/bindings.js +1 -1
  382. package/dist/product/.kosh/schema.d.ts +203 -1
  383. package/dist/product/i18n/bn.d.ts +2 -0
  384. package/dist/product/i18n/bn.js +175 -0
  385. package/dist/product/index.d.ts +1 -0
  386. package/dist/product/index.js +301 -1
  387. package/dist/product/module.d.ts +1727 -0
  388. package/dist/product/module.js +67 -6
  389. package/dist/product/pricelist.d.ts +575 -0
  390. package/dist/product/pricelist.js +257 -0
  391. package/dist/product/variants.d.ts +908 -0
  392. package/dist/product/variants.js +251 -0
  393. package/dist/production/.kosh/bindings.d.ts +22 -0
  394. package/dist/production/.kosh/bindings.js +15 -0
  395. package/dist/production/.kosh/schema.d.ts +2345 -0
  396. package/dist/{mrp → production}/demo.d.ts +1 -1
  397. package/dist/{mrp → production}/demo.js +5 -5
  398. package/dist/production/depth.d.ts +790 -0
  399. package/dist/production/depth.js +262 -0
  400. package/dist/production/i18n/bn.d.ts +2 -0
  401. package/dist/production/i18n/bn.js +350 -0
  402. package/dist/production/index.d.ts +6 -0
  403. package/dist/production/index.js +1256 -0
  404. package/dist/production/module.d.ts +17327 -0
  405. package/dist/production/module.js +1333 -0
  406. package/dist/production/plan.d.ts +921 -0
  407. package/dist/production/plan.js +511 -0
  408. package/dist/production/schedule.d.ts +656 -0
  409. package/dist/production/schedule.js +309 -0
  410. package/dist/production_account/.kosh/bindings.d.ts +22 -0
  411. package/dist/production_account/.kosh/bindings.js +15 -0
  412. package/dist/production_account/.kosh/schema.d.ts +3496 -0
  413. package/dist/production_account/i18n/bn.d.ts +2 -0
  414. package/dist/production_account/i18n/bn.js +93 -0
  415. package/dist/production_account/index.d.ts +4 -0
  416. package/dist/production_account/index.js +246 -0
  417. package/dist/production_account/module.d.ts +1192 -0
  418. package/dist/{mrp_account → production_account}/module.js +72 -18
  419. package/dist/production_account/overhead.d.ts +1195 -0
  420. package/dist/production_account/overhead.js +554 -0
  421. package/dist/project/.kosh/bindings.js +1 -1
  422. package/dist/project/.kosh/schema.d.ts +735 -1
  423. package/dist/project/i18n/bn.d.ts +2 -0
  424. package/dist/project/i18n/bn.js +383 -0
  425. package/dist/project/index.d.ts +3 -1
  426. package/dist/project/index.js +1024 -14
  427. package/dist/project/module.d.ts +9912 -390
  428. package/dist/project/module.js +1590 -14
  429. package/dist/project/routes.d.ts +44 -0
  430. package/dist/project/routes.js +314 -0
  431. package/dist/project/schedule.d.ts +72 -0
  432. package/dist/project/schedule.js +192 -0
  433. package/dist/project/web/Refresh.d.ts +8 -0
  434. package/dist/project/web/Refresh.js +29 -0
  435. package/dist/project/web/Schedule.d.ts +9 -0
  436. package/dist/project/web/Schedule.js +93 -0
  437. package/dist/project/web/Structure.d.ts +8 -0
  438. package/dist/project/web/Structure.js +86 -0
  439. package/dist/project/web/Workload.d.ts +8 -0
  440. package/dist/project/web/Workload.js +43 -0
  441. package/dist/project/web/index.d.ts +14 -0
  442. package/dist/project/web/index.js +25 -0
  443. package/dist/project/web/messages.d.ts +2 -0
  444. package/dist/project/web/messages.js +85 -0
  445. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  446. package/dist/project_account/.kosh/bindings.js +15 -0
  447. package/dist/project_account/.kosh/schema.d.ts +2763 -0
  448. package/dist/project_account/i18n/bn.d.ts +2 -0
  449. package/dist/project_account/i18n/bn.js +6 -0
  450. package/dist/project_account/index.d.ts +3 -0
  451. package/dist/project_account/index.js +29 -0
  452. package/dist/project_account/module.d.ts +15013 -0
  453. package/dist/project_account/module.js +76 -0
  454. package/dist/project_portal/.kosh/bindings.js +1 -1
  455. package/dist/project_portal/.kosh/schema.d.ts +735 -1
  456. package/dist/project_portal/i18n/bn.d.ts +2 -0
  457. package/dist/project_portal/i18n/bn.js +6 -0
  458. package/dist/project_portal/index.js +2 -0
  459. package/dist/project_portal/module.d.ts +4796 -87
  460. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  461. package/dist/project_purchase/.kosh/bindings.js +15 -0
  462. package/dist/project_purchase/.kosh/schema.d.ts +3393 -0
  463. package/dist/project_purchase/i18n/bn.d.ts +2 -0
  464. package/dist/project_purchase/i18n/bn.js +4 -0
  465. package/dist/project_purchase/index.d.ts +9 -0
  466. package/dist/project_purchase/index.js +24 -0
  467. package/dist/project_purchase/module.d.ts +38613 -0
  468. package/dist/project_purchase/module.js +56 -0
  469. package/dist/purchase/.kosh/bindings.js +1 -1
  470. package/dist/purchase/.kosh/schema.d.ts +908 -5
  471. package/dist/purchase/comparison.d.ts +993 -0
  472. package/dist/purchase/comparison.js +415 -0
  473. package/dist/purchase/extras.d.ts +1509 -0
  474. package/dist/purchase/extras.js +445 -0
  475. package/dist/purchase/i18n/bn.d.ts +2 -0
  476. package/dist/purchase/i18n/bn.js +413 -0
  477. package/dist/purchase/index.d.ts +5 -0
  478. package/dist/purchase/index.js +1280 -4
  479. package/dist/purchase/module.d.ts +7147 -395
  480. package/dist/purchase/module.js +303 -10
  481. package/dist/purchase/request.d.ts +696 -0
  482. package/dist/purchase/request.js +446 -0
  483. package/dist/purchase/tender.d.ts +1208 -0
  484. package/dist/purchase/tender.js +507 -0
  485. package/dist/purchase/vendorprice.d.ts +340 -0
  486. package/dist/purchase/vendorprice.js +153 -0
  487. package/dist/purchase_account/.kosh/bindings.js +1 -1
  488. package/dist/purchase_account/.kosh/schema.d.ts +1209 -16
  489. package/dist/purchase_account/i18n/bn.d.ts +2 -0
  490. package/dist/purchase_account/i18n/bn.js +22 -0
  491. package/dist/purchase_account/index.js +20 -0
  492. package/dist/purchase_account/module.d.ts +12232 -2028
  493. package/dist/purchase_account/module.js +252 -9
  494. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  495. package/dist/purchase_portal/.kosh/schema.d.ts +908 -5
  496. package/dist/purchase_portal/i18n/bn.d.ts +2 -0
  497. package/dist/purchase_portal/i18n/bn.js +5 -0
  498. package/dist/purchase_portal/index.js +2 -0
  499. package/dist/purchase_portal/module.d.ts +6853 -352
  500. package/dist/purchase_stock/.kosh/bindings.js +1 -1
  501. package/dist/purchase_stock/.kosh/schema.d.ts +1096 -21
  502. package/dist/purchase_stock/i18n/bn.d.ts +2 -0
  503. package/dist/purchase_stock/i18n/bn.js +19 -0
  504. package/dist/purchase_stock/index.d.ts +2 -2
  505. package/dist/purchase_stock/index.js +38 -2
  506. package/dist/purchase_stock/module.d.ts +12930 -1612
  507. package/dist/purchase_stock/module.js +317 -9
  508. package/dist/purchase_stock/scorecard.d.ts +22 -0
  509. package/dist/purchase_stock/scorecard.js +77 -0
  510. package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
  511. package/dist/purchase_stock/web/Scorecard.js +22 -0
  512. package/dist/purchase_stock/web/index.d.ts +11 -0
  513. package/dist/purchase_stock/web/index.js +16 -0
  514. package/dist/purchase_stock/web/messages.d.ts +2 -0
  515. package/dist/purchase_stock/web/messages.js +27 -0
  516. package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
  517. package/dist/purchase_stock_account/.kosh/schema.d.ts +1444 -20
  518. package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
  519. package/dist/purchase_stock_account/i18n/bn.js +8 -0
  520. package/dist/purchase_stock_account/index.js +18 -0
  521. package/dist/purchase_stock_account/module.d.ts +7 -35346
  522. package/dist/purchase_stock_account/module.js +35 -8
  523. package/dist/recruitment/.kosh/bindings.js +1 -1
  524. package/dist/recruitment/.kosh/schema.d.ts +60 -1
  525. package/dist/recruitment/i18n/bn.d.ts +2 -0
  526. package/dist/recruitment/i18n/bn.js +93 -0
  527. package/dist/recruitment/index.js +64 -0
  528. package/dist/recruitment/module.d.ts +460 -8
  529. package/dist/recruitment/module.js +13 -4
  530. package/dist/reporting/documents.d.ts +5 -0
  531. package/dist/reporting/documents.js +11 -1
  532. package/dist/reporting/index.d.ts +1 -1
  533. package/dist/reporting/index.js +1 -1
  534. package/dist/reporting/web/CalendarView.d.ts +18 -5
  535. package/dist/reporting/web/CalendarView.js +163 -29
  536. package/dist/reporting/web/messages.js +18 -0
  537. package/dist/sale_account/.kosh/bindings.js +1 -1
  538. package/dist/sale_account/.kosh/schema.d.ts +763 -18
  539. package/dist/sale_account/i18n/bn.d.ts +2 -0
  540. package/dist/sale_account/i18n/bn.js +48 -0
  541. package/dist/sale_account/index.d.ts +1 -1
  542. package/dist/sale_account/index.js +102 -4
  543. package/dist/sale_account/module.d.ts +8241 -2052
  544. package/dist/sale_account/module.js +535 -46
  545. package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
  546. package/dist/sale_crm/.kosh/bindings.js +15 -0
  547. package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +391 -494
  548. package/dist/sale_crm/i18n/bn.d.ts +2 -0
  549. package/dist/sale_crm/i18n/bn.js +9 -0
  550. package/dist/sale_crm/index.d.ts +7 -0
  551. package/dist/sale_crm/index.js +104 -0
  552. package/dist/sale_crm/module.d.ts +5609 -0
  553. package/dist/sale_crm/module.js +73 -0
  554. package/dist/sale_portal/.kosh/bindings.js +1 -1
  555. package/dist/sale_portal/.kosh/schema.d.ts +292 -4
  556. package/dist/sale_portal/i18n/bn.d.ts +2 -0
  557. package/dist/sale_portal/i18n/bn.js +7 -0
  558. package/dist/sale_portal/index.js +10 -0
  559. package/dist/sale_portal/module.d.ts +2563 -292
  560. package/dist/sale_project/.kosh/bindings.js +1 -1
  561. package/dist/sale_project/.kosh/schema.d.ts +1025 -4
  562. package/dist/sale_project/i18n/bn.d.ts +2 -0
  563. package/dist/sale_project/i18n/bn.js +12 -0
  564. package/dist/sale_project/index.js +2 -0
  565. package/dist/sale_project/module.d.ts +9280 -762
  566. package/dist/sale_project/module.js +17 -1
  567. package/dist/sale_stock/.kosh/bindings.js +1 -1
  568. package/dist/sale_stock/.kosh/schema.d.ts +463 -6
  569. package/dist/sale_stock/i18n/bn.d.ts +2 -0
  570. package/dist/sale_stock/i18n/bn.js +15 -0
  571. package/dist/sale_stock/index.js +2 -0
  572. package/dist/sale_stock/module.d.ts +8355 -1334
  573. package/dist/sale_stock/module.js +20 -3
  574. package/dist/sales/.kosh/bindings.js +1 -1
  575. package/dist/sales/.kosh/schema.d.ts +292 -4
  576. package/dist/sales/i18n/bn.d.ts +2 -0
  577. package/dist/sales/i18n/bn.js +128 -0
  578. package/dist/sales/index.js +124 -5
  579. package/dist/sales/module.d.ts +3568 -633
  580. package/dist/sales/module.js +306 -11
  581. package/dist/server/api/duplicate.d.ts +14 -0
  582. package/dist/server/api/duplicate.js +75 -0
  583. package/dist/server/api/explain.d.ts +70 -0
  584. package/dist/server/api/explain.js +111 -0
  585. package/dist/server/api/metadata.d.ts +2 -0
  586. package/dist/server/api/metadata.js +9 -0
  587. package/dist/server/api/openapi.js +15 -0
  588. package/dist/server/api/rest.d.ts +1 -0
  589. package/dist/server/api/rest.js +76 -12
  590. package/dist/server/api/views.js +1 -1
  591. package/dist/server/apps.d.ts +16 -1
  592. package/dist/server/apps.js +164 -2
  593. package/dist/server/auth/base.js +2 -0
  594. package/dist/server/auth/service.d.ts +8 -0
  595. package/dist/server/auth/service.js +19 -0
  596. package/dist/server/events.d.ts +13 -0
  597. package/dist/server/events.js +22 -0
  598. package/dist/server/i18n.d.ts +27 -0
  599. package/dist/server/i18n.js +143 -0
  600. package/dist/server/index.d.ts +2 -0
  601. package/dist/server/index.js +2 -0
  602. package/dist/server/server.js +6 -0
  603. package/dist/settings/company.d.ts +3 -1
  604. package/dist/settings/company.js +26 -5
  605. package/dist/settings/routes.d.ts +10 -0
  606. package/dist/settings/routes.js +19 -3
  607. package/dist/settings/web/AppsPage.d.ts +3 -2
  608. package/dist/settings/web/AppsPage.js +26 -8
  609. package/dist/settings/web/CompaniesPage.js +91 -6
  610. package/dist/settings/web/messages.js +64 -0
  611. package/dist/sign/.kosh/bindings.d.ts +22 -0
  612. package/dist/{mrp → sign}/.kosh/bindings.js +2 -2
  613. package/dist/sign/.kosh/schema.d.ts +991 -0
  614. package/dist/sign/i18n/bn.d.ts +2 -0
  615. package/dist/sign/i18n/bn.js +97 -0
  616. package/dist/sign/index.d.ts +29 -0
  617. package/dist/sign/index.js +478 -0
  618. package/dist/sign/module.d.ts +4518 -0
  619. package/dist/sign/module.js +167 -0
  620. package/dist/sign/sign.d.ts +82 -0
  621. package/dist/sign/sign.js +474 -0
  622. package/dist/stock/.kosh/bindings.js +1 -1
  623. package/dist/stock/.kosh/schema.d.ts +374 -3
  624. package/dist/stock/demo.d.ts +2 -1
  625. package/dist/stock/demo.js +28 -1
  626. package/dist/stock/i18n/bn.d.ts +2 -0
  627. package/dist/stock/i18n/bn.js +311 -0
  628. package/dist/stock/index.d.ts +4 -1
  629. package/dist/stock/index.js +674 -6
  630. package/dist/stock/ledger.d.ts +78 -0
  631. package/dist/stock/ledger.js +582 -0
  632. package/dist/stock/module.d.ts +6142 -1380
  633. package/dist/stock/module.js +780 -26
  634. package/dist/stock/replenish.d.ts +38 -0
  635. package/dist/stock/replenish.js +191 -0
  636. package/dist/stock/returns.d.ts +157 -0
  637. package/dist/stock/returns.js +163 -0
  638. package/dist/stock/web/Ledger.d.ts +9 -0
  639. package/dist/stock/web/Ledger.js +108 -0
  640. package/dist/stock/web/Operations.d.ts +8 -0
  641. package/dist/stock/web/Operations.js +33 -0
  642. package/dist/stock/web/Replenishment.d.ts +8 -0
  643. package/dist/stock/web/Replenishment.js +84 -0
  644. package/dist/stock/web/ReturnButton.d.ts +7 -0
  645. package/dist/stock/web/ReturnButton.js +62 -0
  646. package/dist/stock/web/index.d.ts +7 -2
  647. package/dist/stock/web/index.js +15 -2
  648. package/dist/stock/web/messages.js +206 -0
  649. package/dist/stock_account/.kosh/bindings.js +1 -1
  650. package/dist/stock_account/.kosh/schema.d.ts +878 -12
  651. package/dist/stock_account/i18n/bn.d.ts +2 -0
  652. package/dist/stock_account/i18n/bn.js +73 -0
  653. package/dist/stock_account/index.d.ts +1 -0
  654. package/dist/stock_account/index.js +141 -3
  655. package/dist/stock_account/landed.d.ts +429 -0
  656. package/dist/stock_account/landed.js +335 -0
  657. package/dist/stock_account/module.d.ts +12143 -3391
  658. package/dist/stock_account/module.js +135 -6
  659. package/dist/stock_account/web/LandedPreview.d.ts +7 -0
  660. package/dist/stock_account/web/LandedPreview.js +23 -0
  661. package/dist/stock_account/web/index.d.ts +11 -0
  662. package/dist/stock_account/web/index.js +16 -0
  663. package/dist/stock_account/web/messages.d.ts +2 -0
  664. package/dist/stock_account/web/messages.js +27 -0
  665. package/dist/todo/i18n/bn.d.ts +2 -0
  666. package/dist/todo/i18n/bn.js +66 -0
  667. package/dist/todo/index.js +59 -0
  668. package/dist/todo/module.d.ts +5 -0
  669. package/dist/todo/module.js +5 -3
  670. package/dist/trade_finance/.kosh/bindings.js +1 -1
  671. package/dist/trade_finance/.kosh/schema.d.ts +2 -1
  672. package/dist/trade_finance/i18n/bn.d.ts +2 -0
  673. package/dist/trade_finance/i18n/bn.js +162 -0
  674. package/dist/trade_finance/index.js +95 -0
  675. package/dist/trade_finance/module.d.ts +26 -0
  676. package/dist/trade_finance/module.js +29 -8
  677. package/dist/trade_finance_account/.kosh/bindings.js +1 -1
  678. package/dist/trade_finance_account/.kosh/schema.d.ts +651 -10
  679. package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
  680. package/dist/trade_finance_account/i18n/bn.js +27 -0
  681. package/dist/trade_finance_account/index.js +3 -0
  682. package/dist/trade_finance_account/module.d.ts +5129 -1509
  683. package/dist/trade_finance_account/module.js +2 -0
  684. package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
  685. package/dist/trade_finance_purchase/.kosh/schema.d.ts +908 -5
  686. package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
  687. package/dist/trade_finance_purchase/i18n/bn.js +6 -0
  688. package/dist/trade_finance_purchase/index.js +2 -0
  689. package/dist/trade_finance_purchase/module.d.ts +6909 -408
  690. package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
  691. package/dist/trade_finance_sale/.kosh/schema.d.ts +292 -4
  692. package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
  693. package/dist/trade_finance_sale/i18n/bn.js +6 -0
  694. package/dist/trade_finance_sale/index.js +2 -0
  695. package/dist/trade_finance_sale/module.d.ts +2602 -331
  696. package/dist/ui/api.d.ts +2 -0
  697. package/dist/ui/app.d.ts +9 -0
  698. package/dist/ui/app.js +47 -15
  699. package/dist/ui/components/AppIcon.js +9 -2
  700. package/dist/ui/components/Explain.d.ts +69 -0
  701. package/dist/ui/components/Explain.js +62 -0
  702. package/dist/ui/context.d.ts +8 -1
  703. package/dist/ui/context.js +34 -1
  704. package/dist/ui/i18n/messages.d.ts +40 -0
  705. package/dist/ui/i18n/messages.js +80 -0
  706. package/dist/ui/index.d.ts +2 -1
  707. package/dist/ui/index.js +1 -0
  708. package/dist/ui/registry.d.ts +14 -0
  709. package/dist/ui/registry.js +10 -0
  710. package/dist/ui/views/FormView.d.ts +6 -0
  711. package/dist/ui/views/FormView.js +51 -12
  712. package/dist/ui/views/KanbanView.js +9 -1
  713. package/dist/ui/views/ListView.d.ts +8 -0
  714. package/dist/ui/views/ListView.js +14 -5
  715. package/dist/ui/views/StatsRow.js +2 -1
  716. package/dist/ui/views/widgets.js +7 -1
  717. package/dist/views/extend.js +12 -0
  718. package/dist/views/types.d.ts +13 -2
  719. package/dist/views/validate.js +8 -1
  720. package/dist/website/.kosh/bindings.js +1 -1
  721. package/dist/website/.kosh/schema.d.ts +2 -1
  722. package/dist/website/i18n/bn.d.ts +2 -0
  723. package/dist/website/i18n/bn.js +113 -0
  724. package/dist/website/index.js +37 -0
  725. package/dist/website/module.d.ts +20 -0
  726. package/dist/website/module.js +30 -5
  727. package/dist/website_crm/.kosh/bindings.js +1 -1
  728. package/dist/website_crm/.kosh/schema.d.ts +3 -1
  729. package/dist/website_crm/i18n/bn.d.ts +2 -0
  730. package/dist/website_crm/i18n/bn.js +5 -0
  731. package/dist/website_crm/index.js +2 -0
  732. package/dist/website_crm/module.d.ts +41 -0
  733. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  734. package/dist/website_sale/.kosh/bindings.js +15 -0
  735. package/dist/website_sale/.kosh/schema.d.ts +2909 -0
  736. package/dist/website_sale/couriers.d.ts +50 -0
  737. package/dist/website_sale/couriers.js +59 -0
  738. package/dist/website_sale/demo.d.ts +7 -0
  739. package/dist/website_sale/demo.js +90 -0
  740. package/dist/website_sale/growth.d.ts +31 -0
  741. package/dist/website_sale/growth.js +163 -0
  742. package/dist/website_sale/i18n/bn.d.ts +2 -0
  743. package/dist/website_sale/i18n/bn.js +132 -0
  744. package/dist/website_sale/index.d.ts +49 -0
  745. package/dist/website_sale/index.js +620 -0
  746. package/dist/website_sale/module.d.ts +35182 -0
  747. package/dist/website_sale/module.js +419 -0
  748. package/dist/website_sale/shipments.d.ts +16 -0
  749. package/dist/website_sale/shipments.js +113 -0
  750. package/dist/website_sale/shop.d.ts +81 -0
  751. package/dist/website_sale/shop.js +662 -0
  752. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  753. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  754. package/dist/website_sale_stock/.kosh/schema.d.ts +3400 -0
  755. package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
  756. package/dist/website_sale_stock/i18n/bn.js +4 -0
  757. package/dist/website_sale_stock/index.d.ts +9 -0
  758. package/dist/website_sale_stock/index.js +22 -0
  759. package/dist/website_sale_stock/module.d.ts +11 -0
  760. package/dist/website_sale_stock/module.js +32 -0
  761. package/package.json +117 -8
  762. package/dist/mrp/index.d.ts +0 -3
  763. package/dist/mrp/index.js +0 -392
  764. package/dist/mrp/module.js +0 -695
  765. package/dist/mrp_account/index.d.ts +0 -3
  766. package/dist/mrp_account/index.js +0 -22
  767. /package/dist/{mrp → account_asset}/.kosh/bindings.d.ts +0 -0
  768. /package/dist/{mrp_account → account_budget}/.kosh/bindings.d.ts +0 -0
@@ -1,695 +0,0 @@
1
- /**
2
- * The data layer of Production (RFC 0021): bills of materials with versions and effective dates, work centres with
3
- * their hours and cost, and production orders that say what is required, available and short before they start and
4
- * what they will cost. Orders move stock only through Stockroom: Confirm reserves the components in a consumption
5
- * transfer (stock → Production), Produce validates it and the output transfer (Production → stock).
6
- */
7
- import { contactsShutro } from '../contacts/index.js';
8
- import { messagingShutro } from '../messaging/index.js';
9
- import { productShutro } from '../product/index.js';
10
- import { orm } from '../server/orm.js';
11
- import { defaultLocations, inProductUnit, stockShutro } from '../stock/index.js';
12
- import { check, compute, defineModel, defineModule, extendModel, f, onchange, records, } from './.kosh/bindings.js';
13
- const READ = ['read'];
14
- const ALL = ['read', 'write', 'create', 'unlink'];
15
- const zero = orm.toDecimal(0);
16
- const money = (d) => d.toDecimalPlaces(2);
17
- /** A date as `YYYY-MM-DD` (date-only values from PostgreSQL are local midnights: their local parts). */
18
- const iso = (v) => {
19
- if (!(v instanceof Date))
20
- return String(v ?? '');
21
- const pad = (n) => String(n).padStart(2, '0');
22
- return `${v.getFullYear()}-${pad(v.getMonth() + 1)}-${pad(v.getDate())}`;
23
- };
24
- /** The bill of `product` valid on `date`: the latest that starts on or before it and has not ended. */
25
- export async function validBom(env, product, date) {
26
- const bills = await (await env.model('mrp.bom').search({ where: { product } })).load([
27
- 'validFrom',
28
- 'validTo',
29
- ]);
30
- const valid = [...bills]
31
- .filter((b) => (b.validFrom === null || iso(b.validFrom) <= date) &&
32
- (b.validTo === null || iso(b.validTo) >= date))
33
- .sort((a, b) => iso(b.validFrom).localeCompare(iso(a.validFrom)) || b.id - a.id);
34
- return valid[0]?.id ?? null;
35
- }
36
- export const MrpWorkcenter = defineModel('mrp.workcenter', {
37
- label: 'Work centre',
38
- recName: 'name',
39
- order: ['name asc'],
40
- archivable: true,
41
- companyScoped: { required: true },
42
- access: { 'mrp.user': READ, 'mrp.manager': [...ALL, 'export', 'import'] },
43
- fields: {
44
- name: f.char({ required: true }),
45
- code: f.char(),
46
- /** Hours it works a day (its capacity). */
47
- hoursPerDay: f.decimal({ scale: 2, required: true, default: '8', label: 'Hours a day' }),
48
- /** Labour and overhead per hour of work. */
49
- costPerHour: f.decimal({ scale: 2, required: true, default: '0', label: 'Cost per hour' }),
50
- note: f.text(),
51
- },
52
- sqlConstraints: {
53
- positive: {
54
- check: orm.sql `hours_per_day > 0 AND cost_per_hour >= 0`,
55
- message: 'A work centre works some hours a day, at a cost that is not negative.',
56
- },
57
- },
58
- });
59
- export const MrpBom = defineModel('mrp.bom', {
60
- label: 'Bill of materials',
61
- recName: 'label',
62
- order: ['product asc', 'validFrom desc', 'id desc'],
63
- archivable: true,
64
- companyScoped: { required: true },
65
- tracking: ['quantity', 'validFrom', 'validTo'],
66
- access: { 'mrp.user': READ, 'mrp.manager': [...ALL, 'export', 'import'] },
67
- fields: {
68
- product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
69
- /** How many of the product one bill makes, in the product's unit. */
70
- quantity: f.decimal({ scale: 4, required: true, default: '1', label: 'Makes' }),
71
- version: f.char({ required: true, default: 'v1' }),
72
- /** From when this version is used (empty: always). */
73
- validFrom: f.date({ label: 'Valid from' }),
74
- validTo: f.date({ label: 'Valid until' }),
75
- lines: f.one2many('mrp.bom.line', 'bom', { label: 'Components' }),
76
- operations: f.one2many('mrp.bom.operation', 'bom'),
77
- byproducts: f.one2many('mrp.bom.byproduct', 'bom', { label: 'By-products' }),
78
- note: f.text(),
79
- label: f.char({
80
- store: true,
81
- label: 'Bill of materials',
82
- ...compute('mrp.bom', 'label', ['product.name', 'version'], (bills) => {
83
- for (const b of bills)
84
- b.label = `${b.product.name} ${b.version}`;
85
- }),
86
- }),
87
- },
88
- sqlConstraints: {
89
- positive: { check: orm.sql `quantity > 0`, message: 'A bill makes a positive quantity.' },
90
- period: {
91
- check: orm.sql `valid_from IS NULL OR valid_to IS NULL OR valid_to >= valid_from`,
92
- message: 'A bill ends on or after it starts.',
93
- },
94
- },
95
- });
96
- export const MrpBomLine = defineModel('mrp.bom.line', {
97
- label: 'Component',
98
- order: ['id asc'],
99
- access: { 'mrp.user': READ, 'mrp.manager': ALL },
100
- fields: {
101
- bom: f.many2one('mrp.bom', { required: true, ondelete: 'cascade' }),
102
- product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
103
- quantity: f.decimal({ scale: 4, required: true, default: '1' }),
104
- uom: f.many2one('uom.uom', { label: 'Unit' }),
105
- },
106
- onchange: {
107
- product: onchange('mrp.bom.line', async (d) => {
108
- const p = await d.record('product');
109
- if (p?.uom)
110
- d.set('uom', p.uom.id);
111
- }),
112
- },
113
- sqlConstraints: {
114
- positive: {
115
- check: orm.sql `quantity > 0`,
116
- message: 'A component is needed in a positive quantity.',
117
- },
118
- },
119
- constraints: {
120
- notItself: {
121
- ...check('mrp.bom.line', ['product', 'bom'], async (lines) => (await lines.load({ bom: true }))
122
- .filter((l) => l.bom.product.id === l.product.id)
123
- .map((l) => l.id)),
124
- message: 'A product is not a component of itself.',
125
- },
126
- },
127
- });
128
- /** What else one bill makes (sawdust, offcuts), and the share of the order's cost it carries. */
129
- export const MrpBomByproduct = defineModel('mrp.bom.byproduct', {
130
- label: 'By-product',
131
- order: ['id asc'],
132
- access: { 'mrp.user': READ, 'mrp.manager': ALL },
133
- fields: {
134
- bom: f.many2one('mrp.bom', { required: true, ondelete: 'cascade' }),
135
- product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
136
- quantity: f.decimal({ scale: 4, required: true, default: '1' }),
137
- uom: f.many2one('uom.uom', { label: 'Unit' }),
138
- /** Percent of the order's cost (the main product carries the rest). */
139
- costShare: f.decimal({
140
- scale: 2,
141
- required: true,
142
- default: '0',
143
- label: 'Share of the cost (%)',
144
- }),
145
- },
146
- sqlConstraints: {
147
- positive: {
148
- check: orm.sql `quantity > 0 AND cost_share >= 0 AND cost_share < 100`,
149
- message: 'A by-product is made in a positive quantity, with a share of the cost under 100 %.',
150
- },
151
- },
152
- constraints: {
153
- sharesUnderAll: {
154
- ...check('mrp.bom.byproduct', ['costShare', 'bom', 'product'], async (lines) => {
155
- const failing = [];
156
- for (const l of await lines.load({ bom: { byproducts: true } })) {
157
- const total = [...l.bom.byproducts].reduce((s, b) => s.plus(b.costShare), zero);
158
- if (total.gte(100) || l.product.id === l.bom.product.id)
159
- failing.push(l.id);
160
- }
161
- return failing;
162
- }),
163
- message: 'By-products are other products than the one made, and their shares of the cost stay under 100 %.',
164
- },
165
- },
166
- });
167
- export const MrpBomOperation = defineModel('mrp.bom.operation', {
168
- label: 'Operation',
169
- order: ['id asc'],
170
- access: { 'mrp.user': READ, 'mrp.manager': ALL },
171
- fields: {
172
- bom: f.many2one('mrp.bom', { required: true, ondelete: 'cascade' }),
173
- name: f.char({ required: true }),
174
- workcenter: f.many2one('mrp.workcenter', { required: true, ondelete: 'restrict' }),
175
- /** Minutes for what one bill makes. */
176
- minutes: f.decimal({ scale: 2, required: true, default: '0' }),
177
- },
178
- });
179
- export const MrpProductionComponent = defineModel('mrp.production.component', {
180
- label: 'Component need',
181
- order: ['id asc'],
182
- access: { 'mrp.user': READ, 'mrp.manager': READ },
183
- fields: {
184
- production: f.many2one('mrp.production', { required: true, ondelete: 'cascade' }),
185
- product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
186
- /** In the product's unit. */
187
- required: f.decimal({ scale: 4, required: true, default: '0' }),
188
- /** Available in the warehouse when the order was last checked. */
189
- available: f.decimal({ scale: 4, required: true, default: '0' }),
190
- short: f.decimal({
191
- scale: 4,
192
- store: true,
193
- label: 'Short',
194
- ...compute('mrp.production.component', 'short', ['required', 'available'], (lines) => {
195
- for (const l of lines) {
196
- const missing = l.required.minus(l.available);
197
- l.short = missing.gt(0) ? missing : zero;
198
- }
199
- }),
200
- }),
201
- cost: f.decimal({
202
- scale: 2,
203
- store: true,
204
- label: 'Cost',
205
- ...compute('mrp.production.component', 'cost', ['required', 'product.standardPrice'], (lines) => {
206
- for (const l of lines)
207
- l.cost = money(l.required.times(l.product.standardPrice));
208
- }),
209
- }),
210
- },
211
- });
212
- /**
213
- * Lists the orders' component needs from their bills (in the product's unit, for the quantity ordered) with what is
214
- * available in their warehouse now; as the system (component lines are not edited by hand).
215
- */
216
- async function explode(ids, env) {
217
- await env.asSuperuser({ reason: 'production components' }, async (su) => {
218
- const orders = await su
219
- .model('mrp.production')
220
- .browse(ids)
221
- .load({ bom: { lines: { product: { uom: true }, uom: true } }, components: true });
222
- for (const o of orders) {
223
- if (o.components.length > 0)
224
- await o.components.unlink();
225
- if (o.bom === null)
226
- continue;
227
- const factor = o.quantity.div(o.bom.quantity);
228
- const needs = new Map();
229
- for (const l of o.bom.lines) {
230
- const inUnit = inProductUnit(l.quantity.times(factor), l.uom ?? null, l.product.uom ?? null);
231
- needs.set(l.product.id, (needs.get(l.product.id) ?? zero).plus(inUnit));
232
- }
233
- const places = await defaultLocations(su, 'internal', o.warehouse?.id ?? null, o.company.id);
234
- for (const [product, required] of needs) {
235
- let available = zero;
236
- if (places.source !== null) {
237
- const quants = await (await su.model('stock.quant').search({
238
- where: {
239
- product: orm.asId(product, 'product.product'),
240
- location: { childOf: places.source },
241
- },
242
- })).load(['quantity', 'reserved']);
243
- available = [...quants].reduce((s, q) => s.plus(q.quantity).minus(q.reserved ?? zero), zero);
244
- }
245
- await su.model('mrp.production.component').create([
246
- {
247
- production: o.id,
248
- product: orm.asId(product, 'product.product'),
249
- required: required.toDecimalPlaces(4),
250
- available: available.gt(0) ? available : zero,
251
- },
252
- ]);
253
- }
254
- }
255
- });
256
- }
257
- /** When a work centre's day starts (local time). */
258
- export const DAY_STARTS_AT = 8;
259
- /**
260
- * Forward schedule of `minutes` of work at a centre working `hoursPerDay` from `DAY_STARTS_AT`, from `from`: what does
261
- * not fit in a day continues the next day. Returns the start and the end.
262
- */
263
- export function schedule(from, minutes, hoursPerDay) {
264
- const dayStart = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate(), DAY_STARTS_AT);
265
- const dayEnd = (d) => new Date(dayStart(d).getTime() + hoursPerDay * 3_600_000);
266
- let at = new Date(Math.max(from.getTime(), dayStart(from).getTime()));
267
- if (at >= dayEnd(at))
268
- at = dayStart(new Date(at.getTime() + 86_400_000));
269
- const start = at;
270
- let left = minutes * 60_000;
271
- for (;;) {
272
- const room = dayEnd(at).getTime() - at.getTime();
273
- if (left <= room)
274
- return { start, stop: new Date(at.getTime() + left) };
275
- left -= room;
276
- at = dayStart(new Date(dayStart(at).getTime() + 86_400_000));
277
- }
278
- }
279
- /**
280
- * A step of a production order at a work centre: planned from the bill's operation (its minutes for the quantity
281
- * ordered), scheduled after what the centre already has, then started and finished with the minutes it took.
282
- */
283
- export const MrpWorkorder = defineModel('mrp.workorder', {
284
- label: 'Work order',
285
- recName: 'name',
286
- order: ['plannedStart asc', 'id asc'],
287
- companyScoped: { required: true },
288
- access: {
289
- 'mrp.user': ['read', 'write'],
290
- 'mrp.manager': [...ALL, 'export'],
291
- },
292
- fields: {
293
- production: f.many2one('mrp.production', { required: true, ondelete: 'cascade' }),
294
- name: f.char({ required: true, label: 'Operation' }),
295
- workcenter: f.many2one('mrp.workcenter', { required: true, ondelete: 'restrict' }),
296
- plannedMinutes: f.decimal({ scale: 2, required: true, default: '0', label: 'Planned minutes' }),
297
- plannedStart: f.datetime({ label: 'Planned start' }),
298
- plannedStop: f.datetime({ label: 'Planned end' }),
299
- startedAt: f.datetime({ label: 'Started' }),
300
- finishedAt: f.datetime({ label: 'Finished' }),
301
- /** The minutes it took (from start to finish). */
302
- actualMinutes: f.decimal({ scale: 2, label: 'Minutes taken' }),
303
- state: f.state({
304
- states: { ready: 'Ready', progress: 'In progress', done: 'Done', cancel: 'Cancelled' },
305
- initial: 'ready',
306
- transitions: {
307
- start: {
308
- from: ['ready'],
309
- to: 'progress',
310
- after: records('mrp.workorder', async (orders) => {
311
- await orders.write({ startedAt: new Date() });
312
- }),
313
- },
314
- finish: {
315
- from: ['progress'],
316
- to: 'done',
317
- after: records('mrp.workorder', async (orders) => {
318
- const now = new Date();
319
- for (const w of await orders.load({})) {
320
- const began = w.startedAt instanceof Date ? w.startedAt : now;
321
- await w.write({
322
- finishedAt: now,
323
- // Whole milliseconds, then minutes (Shutro takes no fractional JS numbers).
324
- actualMinutes: orm
325
- .toDecimal(now.getTime() - began.getTime())
326
- .div(60_000)
327
- .toDecimalPlaces(2),
328
- });
329
- }
330
- }),
331
- },
332
- /** Done with its order (Produce), however far it got. */
333
- close: { from: ['ready', 'progress'], to: 'done' },
334
- cancel: { from: ['ready', 'progress'], to: 'cancel' },
335
- },
336
- }),
337
- },
338
- });
339
- /**
340
- * Makes the orders' work orders from their bills' operations and schedules them forward, step after step, each at
341
- * its work centre after what the centre already has planned (from the order's date).
342
- */
343
- async function planWork(ids, env) {
344
- await env.asSuperuser({ reason: 'production schedule' }, async (su) => {
345
- const orders = await su
346
- .model('mrp.production')
347
- .browse(ids)
348
- .load({ bom: { operations: { workcenter: true } } });
349
- for (const o of orders) {
350
- if (o.bom === null)
351
- continue;
352
- const factor = o.quantity.div(o.bom.quantity);
353
- // The order's day, local (a date is read as text or as a local midnight).
354
- const day = new Date(`${iso(o.date)}T00:00:00`);
355
- let after = new Date(day.getFullYear(), day.getMonth(), day.getDate(), DAY_STARTS_AT);
356
- for (const op of o.bom.operations) {
357
- const minutes = op.minutes.times(factor).toDecimalPlaces(2);
358
- // The centre is free after the last step it has that is not done or cancelled.
359
- const busy = await (await su.model('mrp.workorder').search({
360
- where: { workcenter: op.workcenter.id, state: { in: ['ready', 'progress'] } },
361
- order: ['plannedStop desc'],
362
- limit: 1,
363
- })).load(['plannedStop']);
364
- const free = [...busy][0]?.plannedStop;
365
- const from = free instanceof Date && free > after ? free : after;
366
- const { start, stop } = schedule(from, Number(minutes), Number(op.workcenter.hoursPerDay));
367
- await su.model('mrp.workorder').create([
368
- {
369
- production: o.id,
370
- company: o.company.id,
371
- name: op.name,
372
- workcenter: op.workcenter.id,
373
- plannedMinutes: minutes,
374
- plannedStart: start,
375
- plannedStop: stop,
376
- },
377
- ]);
378
- after = stop;
379
- }
380
- }
381
- });
382
- }
383
- /** The places of an order: its warehouse's stock, and the Production location. */
384
- async function placesOf(env, warehouse, company) {
385
- const stock = (await defaultLocations(env, 'internal', warehouse, company)).source;
386
- const production = (await env.model('stock.location').search({ where: { usage: 'production' }, limit: 1 })).ids[0];
387
- if (stock === null || production === undefined)
388
- throw new orm.ValidationError('mrp.production', ['warehouse'], 'There is no stock location or Production location to work from.', 'Check the warehouse in Stockroom › Configuration.');
389
- return { stock, production };
390
- }
391
- export const MrpProduction = defineModel('mrp.production', {
392
- label: 'Production order',
393
- recName: 'name',
394
- order: ['date desc', 'id desc'],
395
- companyScoped: { required: true },
396
- tracking: ['state', 'quantity', 'bom'],
397
- access: {
398
- 'mrp.user': ['read', 'write', 'create'],
399
- 'mrp.manager': [...ALL, 'export', 'import'],
400
- },
401
- fields: {
402
- name: f.char({
403
- required: true,
404
- readonly: true,
405
- sequence: { code: 'mrp.production', dateField: 'date' },
406
- label: 'Reference',
407
- }),
408
- product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
409
- quantity: f.decimal({ scale: 4, required: true, default: '1' }),
410
- bom: f.many2one('mrp.bom', { ondelete: 'restrict', label: 'Bill of materials' }),
411
- date: f.date({ required: true, default: (env) => env.today(), label: 'Planned for' }),
412
- warehouse: f.many2one('stock.warehouse', { ondelete: 'restrict' }),
413
- components: f.one2many('mrp.production.component', 'production'),
414
- /** Scrap recorded on the order, with its reasons (Stockroom's scrap). */
415
- scraps: f.one2many('stock.scrap', 'production'),
416
- workorders: f.one2many('mrp.workorder', 'production', { label: 'Work orders' }),
417
- consumption: f.many2one('stock.picking', {
418
- ondelete: 'set null',
419
- label: 'Components transfer',
420
- }),
421
- output: f.many2one('stock.picking', { ondelete: 'set null', label: 'Output transfer' }),
422
- /** The components at their cost. */
423
- materialCost: f.decimal({
424
- scale: 2,
425
- store: true,
426
- label: 'Materials',
427
- ...compute('mrp.production', 'materialCost', ['components.cost'], (orders) => {
428
- for (const o of orders)
429
- o.materialCost = [...o.components].reduce((s, c) => s.plus(c.cost ?? zero), zero);
430
- }),
431
- }),
432
- /** The operations at their work centres' cost per hour. */
433
- operationCost: f.decimal({
434
- scale: 2,
435
- store: true,
436
- label: 'Operations',
437
- ...compute('mrp.production', 'operationCost', [
438
- 'quantity',
439
- 'bom.quantity',
440
- 'bom.operations.minutes',
441
- 'bom.operations.workcenter.costPerHour',
442
- ], (orders) => {
443
- for (const o of orders) {
444
- if (o.bom === null) {
445
- o.operationCost = zero;
446
- continue;
447
- }
448
- const factor = o.quantity.div(o.bom.quantity);
449
- o.operationCost = money([...o.bom.operations].reduce((s, op) => s.plus(op.minutes.times(factor).div(60).times(op.workcenter.costPerHour)), zero));
450
- }
451
- }),
452
- }),
453
- totalCost: f.decimal({
454
- scale: 2,
455
- store: true,
456
- label: 'Total cost',
457
- ...compute('mrp.production', 'totalCost', ['materialCost', 'operationCost'], (orders) => {
458
- for (const o of orders)
459
- o.totalCost = (o.materialCost ?? zero).plus(o.operationCost ?? zero);
460
- }),
461
- }),
462
- unitCost: f.decimal({
463
- scale: 4,
464
- store: true,
465
- label: 'Unit cost',
466
- ...compute('mrp.production', 'unitCost', ['totalCost', 'quantity'], (orders) => {
467
- for (const o of orders)
468
- o.unitCost = o.quantity.gt(0)
469
- ? (o.totalCost ?? zero).div(o.quantity).toDecimalPlaces(4)
470
- : zero;
471
- }),
472
- }),
473
- /** The one chip: Draft, Waiting (components short), Ready, Done, Cancelled. */
474
- status: f.selection({ draft: 'Draft', waiting: 'Waiting', ready: 'Ready', done: 'Done', cancelled: 'Cancelled' }, {
475
- store: true,
476
- label: 'Status',
477
- ...compute('mrp.production', 'status', ['state', 'consumption.availability'], (orders) => {
478
- for (const o of orders)
479
- o.status =
480
- o.state === 'confirmed'
481
- ? o.consumption?.availability === 'full'
482
- ? 'ready'
483
- : 'waiting'
484
- : o.state === 'cancel'
485
- ? 'cancelled'
486
- : o.state;
487
- }),
488
- }),
489
- note: f.text(),
490
- state: f.state({
491
- states: { draft: 'Draft', confirmed: 'Confirmed', done: 'Done', cancel: 'Cancelled' },
492
- initial: 'draft',
493
- transitions: {
494
- /** Lists the components with what is available and short, and the cost, before anything starts. */
495
- check: {
496
- from: ['draft', 'confirmed'],
497
- to: 'draft',
498
- guard: records('mrp.production', async (orders) => (await orders.load({})).filter((o) => o.state !== 'draft')),
499
- message: 'A confirmed order is checked with Check availability.',
500
- after: records('mrp.production', async (orders) => {
501
- await explode(orders.ids, orders.env);
502
- }),
503
- },
504
- confirm: {
505
- from: ['draft'],
506
- to: 'confirmed',
507
- guard: records('mrp.production', async (orders) => (await orders.load({})).filter((o) => o.bom === null)),
508
- message: 'Choose the bill of materials first.',
509
- // The components, their transfer to Production (reserved), and the work orders, scheduled.
510
- after: records('mrp.production', async (orders) => {
511
- await explode(orders.ids, orders.env);
512
- await planWork(orders.ids, orders.env);
513
- const env = orders.env;
514
- for (const o of await env
515
- .model('mrp.production')
516
- .browse(orders.ids)
517
- .load({ components: true })) {
518
- // Nothing to consume (labour only): no components transfer.
519
- if (o.components.length === 0)
520
- continue;
521
- const { stock, production } = await placesOf(env, o.warehouse?.id ?? null, o.company.id);
522
- const made = await env.model('stock.picking').create([
523
- {
524
- kind: 'production',
525
- company: o.company.id,
526
- warehouse: o.warehouse?.id ?? null,
527
- source: stock,
528
- destination: production,
529
- origin: o.name,
530
- scheduledDate: o.date,
531
- moves: {
532
- create: [...o.components].map((c) => ({
533
- product: c.product.id,
534
- quantity: c.required,
535
- })),
536
- },
537
- },
538
- ]);
539
- await made.confirm();
540
- await env
541
- .model('mrp.production')
542
- .browse([o.id])
543
- .write({ consumption: made.ids[0] ?? null });
544
- }
545
- }),
546
- },
547
- /** "Check availability": reserve the components that came in since. */
548
- reserve: {
549
- from: ['confirmed'],
550
- to: 'confirmed',
551
- after: records('mrp.production', async (orders) => {
552
- const env = orders.env;
553
- for (const o of await env.model('mrp.production').browse(orders.ids).load({}))
554
- if (o.consumption !== null)
555
- await env.model('stock.picking').browse([o.consumption.id]).reserve();
556
- }),
557
- },
558
- produce: {
559
- from: ['confirmed'],
560
- to: 'done',
561
- guard: records('mrp.production', async (orders) => (await orders.load({ consumption: true })).filter((o) => o.consumption !== null && o.consumption.availability !== 'full')),
562
- message: 'Components are short: check availability, or wait for them to come in.',
563
- before: records('mrp.production', async (orders) => {
564
- const env = orders.env;
565
- // What is left of the work is done with the order.
566
- const open = await env.model('mrp.workorder').search({
567
- where: { production: { in: [...orders.ids] }, state: { in: ['ready', 'progress'] } },
568
- });
569
- if (open.length > 0)
570
- await open.close();
571
- for (const o of await env.model('mrp.production').browse(orders.ids).load({})) {
572
- if (o.consumption !== null)
573
- await env.model('stock.picking').browse([o.consumption.id]).validate();
574
- const { stock, production } = await placesOf(env, o.warehouse?.id ?? null, o.company.id);
575
- const [bill] = o.bom === null
576
- ? []
577
- : await env.model('mrp.bom').browse([o.bom.id]).load({ byproducts: true });
578
- const factor = bill === undefined ? zero : o.quantity.div(bill.quantity);
579
- const made = await env.model('stock.picking').create([
580
- {
581
- kind: 'production',
582
- company: o.company.id,
583
- warehouse: o.warehouse?.id ?? null,
584
- source: production,
585
- destination: stock,
586
- origin: o.name,
587
- moves: {
588
- create: [
589
- { product: o.product.id, quantity: o.quantity },
590
- ...[...(bill?.byproducts ?? [])].map((b) => ({
591
- product: b.product.id,
592
- quantity: b.quantity.times(factor).toDecimalPlaces(4),
593
- uom: b.uom?.id ?? null,
594
- })),
595
- ],
596
- },
597
- },
598
- ]);
599
- // Linked before it is validated: what values it (mrp_account) finds its order.
600
- await env
601
- .model('mrp.production')
602
- .browse([o.id])
603
- .write({ output: made.ids[0] ?? null });
604
- await made.confirm();
605
- await made.validate();
606
- }
607
- }),
608
- },
609
- cancel: {
610
- from: ['draft', 'confirmed'],
611
- to: 'cancel',
612
- after: records('mrp.production', async (orders) => {
613
- const env = orders.env;
614
- const open = await env.model('mrp.workorder').search({
615
- where: { production: { in: [...orders.ids] }, state: { in: ['ready', 'progress'] } },
616
- });
617
- for (const w of await open.load({}))
618
- await w.cancel();
619
- for (const o of await env
620
- .model('mrp.production')
621
- .browse(orders.ids)
622
- .load({ consumption: true }))
623
- if (o.consumption !== null &&
624
- o.consumption.state !== 'done' &&
625
- o.consumption.state !== 'cancel')
626
- await env.model('stock.picking').browse([o.consumption.id]).cancel();
627
- }),
628
- },
629
- redraft: { from: ['cancel'], to: 'draft' },
630
- },
631
- }),
632
- },
633
- onchange: {
634
- // The bill valid on the order's date, and the company's first warehouse.
635
- product: onchange('mrp.production', async (d, env) => {
636
- const product = d.get('product');
637
- if (product === null || product === undefined)
638
- return;
639
- d.set('bom', await validBom(env, product, String(d.get('date') ?? env.today())));
640
- if ((d.get('warehouse') ?? null) === null)
641
- d.set('warehouse', (await defaultLocations(env, 'internal')).warehouse);
642
- }),
643
- date: onchange('mrp.production', async (d, env) => {
644
- const product = d.get('product');
645
- if (product === null || product === undefined)
646
- return;
647
- d.set('bom', await validBom(env, product, String(d.get('date') ?? env.today())));
648
- }),
649
- },
650
- sqlConstraints: {
651
- positive: { check: orm.sql `quantity > 0`, message: 'An order makes a positive quantity.' },
652
- },
653
- constraints: {
654
- billOfTheProduct: {
655
- ...check('mrp.production', ['bom', 'product'], async (orders) => (await orders.load({ bom: true }))
656
- .filter((o) => o.bom !== null && o.bom.product.id !== o.product.id)
657
- .map((o) => o.id)),
658
- message: 'The bill of materials is for another product.',
659
- },
660
- },
661
- });
662
- /** Scrap recorded on a production order (a broken component, a faulty unit made), with its reason. */
663
- export const ScrapProduction = extendModel('stock.scrap', {
664
- fields: {
665
- production: f.many2one('mrp.production', { ondelete: 'set null', label: 'Production order' }),
666
- },
667
- });
668
- export const mrpShutro = defineModule({
669
- name: 'mrp',
670
- version: '0.1.0',
671
- depends: [productShutro, stockShutro, contactsShutro, messagingShutro],
672
- groups: [
673
- orm.defineGroup({ code: 'mrp.user', label: 'Production user', implies: ['stock.user'] }),
674
- orm.defineGroup({ code: 'mrp.manager', label: 'Production manager', implies: ['mrp.user'] }),
675
- ],
676
- sequences: [
677
- orm.defineSequence({
678
- code: 'mrp.production',
679
- prefix: 'MO/{year}/',
680
- padding: 5,
681
- reset: 'yearly',
682
- }),
683
- ],
684
- models: [
685
- MrpWorkcenter,
686
- MrpBom,
687
- MrpBomLine,
688
- MrpBomByproduct,
689
- MrpBomOperation,
690
- MrpProduction,
691
- MrpProductionComponent,
692
- MrpWorkorder,
693
- ],
694
- extensions: [ScrapProduction],
695
- });