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,401 @@
1
+ /**
2
+ * Fiscal positions and account determination (RFC 0029 §3.5).
3
+ *
4
+ * A fiscal position maps taxes (a tax to another, or to none: exports) and accounts (domestic sales to export
5
+ * sales). A document's position is the one chosen on it, else its partner's, else the first automatic one whose
6
+ * conditions the partner meets (countries, states, a tax number). Taxes are mapped when the document is posted;
7
+ * accounts as its lines are posted.
8
+ *
9
+ * A product line's account is the line's own, else what an app proposes (`productLineAccounts`), else the product's
10
+ * income or expense account, else its category's, else the journal's default. The counterpart is the partner's
11
+ * receivable or payable account, else the company's. Every choice says where it came from, for the preview.
12
+ */
13
+ import { HttpProblem } from '../server/index.js';
14
+ import { defineModel, extendModel, f } from './.kosh/bindings.js';
15
+ const ALL = ['read', 'write', 'create', 'unlink', 'export', 'import'];
16
+ export const AccountFiscalPosition = defineModel('account.fiscal.position', {
17
+ label: 'Fiscal position',
18
+ archivable: true,
19
+ companyScoped: { required: true },
20
+ order: ['sequence asc', 'id asc'],
21
+ access: { 'account.invoicing': ['read'], 'account.user': ['read'], 'account.manager': ALL },
22
+ fields: {
23
+ name: f.char({ required: true, translate: true, label: 'Fiscal position' }),
24
+ sequence: f.integer({ default: 10 }),
25
+ autoApply: f.boolean({
26
+ default: false,
27
+ label: 'Apply by itself',
28
+ help: 'Chosen for partners who meet its conditions, unless a document or the partner names another.',
29
+ }),
30
+ countries: f.char({
31
+ label: 'Countries',
32
+ help: 'ISO codes separated by commas (BD, IN); empty: any country. "!BD" means any country but BD.',
33
+ }),
34
+ states: f.char({ label: 'States', help: 'ISO codes (IN-MH) separated by commas; empty: any.' }),
35
+ vatRequired: f.selection({ any: 'With or without', with: 'With a tax number', without: 'Without a tax number' }, {
36
+ required: true,
37
+ default: 'any',
38
+ label: 'Tax number',
39
+ help: 'Whether the partner must have a tax number (BIN, GSTIN, VAT) for it to apply.',
40
+ }),
41
+ note: f.text({ translate: true, label: 'Note on documents' }),
42
+ taxes: f.one2many('account.fiscal.position.tax', 'position', { label: 'Tax mapping' }),
43
+ accounts: f.one2many('account.fiscal.position.account', 'position', {
44
+ label: 'Account mapping',
45
+ }),
46
+ },
47
+ });
48
+ export const AccountFiscalPositionTax = defineModel('account.fiscal.position.tax', {
49
+ label: 'Tax mapping',
50
+ access: { 'account.invoicing': ['read'], 'account.user': ['read'], 'account.manager': ALL },
51
+ fields: {
52
+ position: f.many2one('account.fiscal.position', { required: true, ondelete: 'cascade' }),
53
+ taxSrc: f.many2one('account.tax', { required: true, ondelete: 'cascade', label: 'Tax' }),
54
+ taxDest: f.many2one('account.tax', {
55
+ ondelete: 'restrict',
56
+ label: 'Becomes',
57
+ help: 'Empty: the tax is removed (an export, an exempt customer).',
58
+ }),
59
+ },
60
+ });
61
+ export const AccountFiscalPositionAccount = defineModel('account.fiscal.position.account', {
62
+ label: 'Account mapping',
63
+ access: { 'account.invoicing': ['read'], 'account.user': ['read'], 'account.manager': ALL },
64
+ fields: {
65
+ position: f.many2one('account.fiscal.position', { required: true, ondelete: 'cascade' }),
66
+ accountSrc: f.many2one('account.account', {
67
+ required: true,
68
+ ondelete: 'cascade',
69
+ label: 'Account',
70
+ }),
71
+ accountDest: f.many2one('account.account', {
72
+ required: true,
73
+ ondelete: 'restrict',
74
+ label: 'Becomes',
75
+ }),
76
+ },
77
+ });
78
+ /** Income and expense accounts on products and their categories. */
79
+ export const ProductAccounts = extendModel('product.product', {
80
+ fields: {
81
+ incomeAccount: f.many2one('account.account', {
82
+ ondelete: 'set null',
83
+ label: 'Income account',
84
+ help: 'Where its sales post; empty: its category’s, else the journal’s.',
85
+ }),
86
+ expenseAccount: f.many2one('account.account', {
87
+ ondelete: 'set null',
88
+ label: 'Expense account',
89
+ help: 'Where its purchases post; empty: its category’s, else the journal’s.',
90
+ }),
91
+ },
92
+ });
93
+ export const CategoryAccounts = extendModel('product.category', {
94
+ fields: {
95
+ incomeAccount: f.many2one('account.account', {
96
+ ondelete: 'set null',
97
+ label: 'Income account',
98
+ help: 'Where its products’ sales post when they name none.',
99
+ }),
100
+ expenseAccount: f.many2one('account.account', {
101
+ ondelete: 'set null',
102
+ label: 'Expense account',
103
+ help: 'Where its products’ purchases post when they name none.',
104
+ }),
105
+ },
106
+ });
107
+ /** The partner's own receivable and payable accounts, and its fiscal position. */
108
+ export const PartnerAccounts = extendModel('res.partner', {
109
+ fields: {
110
+ receivableAccount: f.many2one('account.account', {
111
+ ondelete: 'set null',
112
+ label: 'Receivable account',
113
+ help: 'What they owe us posts here; empty: the company’s.',
114
+ }),
115
+ payableAccount: f.many2one('account.account', {
116
+ ondelete: 'set null',
117
+ label: 'Payable account',
118
+ help: 'What we owe them posts here; empty: the company’s.',
119
+ }),
120
+ fiscalPosition: f.many2one('account.fiscal.position', {
121
+ ondelete: 'set null',
122
+ label: 'Fiscal position',
123
+ help: 'Always used for their documents; empty: chosen by the positions that apply by themselves.',
124
+ }),
125
+ },
126
+ });
127
+ const ref = (env, name) => env.model(name);
128
+ const idOf = (value) => typeof value === 'number' ? value : (value?.id ?? null);
129
+ const codes = (value) => String(value ?? '')
130
+ .split(',')
131
+ .map((c) => c.trim().toUpperCase())
132
+ .filter((c) => c !== '');
133
+ async function positionById(env, id) {
134
+ const [p] = (await ref(env, 'account.fiscal.position').browse([id]).load(['name'])).read([
135
+ 'id',
136
+ 'name',
137
+ ]);
138
+ if (p === undefined)
139
+ return null;
140
+ const taxes = (await ref(env, 'account.fiscal.position.tax').search({ where: { position: id } })).read(['taxSrc', 'taxDest']);
141
+ const accounts = (await ref(env, 'account.fiscal.position.account').search({ where: { position: id } })).read(['accountSrc', 'accountDest']);
142
+ return {
143
+ id,
144
+ name: String(p['name']),
145
+ taxes: new Map(taxes.map((t) => [idOf(t['taxSrc']), idOf(t['taxDest'])])),
146
+ accounts: new Map(accounts.map((a) => [idOf(a['accountSrc']), idOf(a['accountDest'])])),
147
+ };
148
+ }
149
+ /** Whether an automatic position's conditions hold for a partner. */
150
+ function meets(position, partner) {
151
+ const country = String(partner['country'] ?? '').toUpperCase();
152
+ const wanted = codes(position['countries']);
153
+ const excluded = wanted.filter((c) => c.startsWith('!')).map((c) => c.slice(1));
154
+ const included = wanted.filter((c) => !c.startsWith('!'));
155
+ if (included.length > 0 && !included.includes(country))
156
+ return false;
157
+ if (excluded.includes(country))
158
+ return false;
159
+ const states = codes(position['states']);
160
+ if (states.length > 0 && !states.includes(String(partner['state'] ?? '').toUpperCase()))
161
+ return false;
162
+ const vat = String(partner['taxId'] ?? '').trim() !== '';
163
+ if (position['vatRequired'] === 'with' && !vat)
164
+ return false;
165
+ if (position['vatRequired'] === 'without' && vat)
166
+ return false;
167
+ return true;
168
+ }
169
+ /** A document's fiscal position and why: chosen on it, the partner's, or automatic. */
170
+ export async function positionOf(env, move) {
171
+ if (move.fiscalPosition !== null)
172
+ return {
173
+ position: await positionById(env, move.fiscalPosition),
174
+ why: 'chosen on the document',
175
+ };
176
+ if (move.partner === null)
177
+ return { position: null, why: 'no partner' };
178
+ const [partner] = (await ref(env, 'res.partner')
179
+ .browse([move.partner])
180
+ .load(['country', 'state', 'taxId', 'fiscalPosition'])).read(['country', 'state', 'taxId', 'fiscalPosition']);
181
+ if (partner === undefined)
182
+ return { position: null, why: 'no partner' };
183
+ const own = idOf(partner['fiscalPosition']);
184
+ if (own !== null)
185
+ return { position: await positionById(env, own), why: 'the partner’s' };
186
+ const auto = (await ref(env, 'account.fiscal.position').search({
187
+ where: { autoApply: true },
188
+ order: ['sequence asc', 'id asc'],
189
+ })).read(['id', 'countries', 'states', 'vatRequired']);
190
+ const found = auto.find((p) => meets(p, partner));
191
+ if (found === undefined)
192
+ return { position: null, why: 'none applies' };
193
+ return {
194
+ position: await positionById(env, found['id']),
195
+ why: 'applied by itself (the partner’s country, state or tax number)',
196
+ };
197
+ }
198
+ /** Taxes after the position: each replaced or removed, in order, without duplicates. */
199
+ export function mapTaxes(position, taxes) {
200
+ if (position === null)
201
+ return [...taxes];
202
+ const out = [];
203
+ for (const t of taxes) {
204
+ const to = position.taxes.has(t) ? position.taxes.get(t) : t;
205
+ if (to !== null && to !== undefined && !out.includes(to))
206
+ out.push(to);
207
+ }
208
+ return out;
209
+ }
210
+ /** An account after the position. */
211
+ export const mapAccount = (position, account) => account === null ? null : (position?.accounts.get(account) ?? account);
212
+ /** Determines a document's accounts (`proposed`: what an app proposes per line, `productLineAccounts`). */
213
+ export async function determineAccounts(env, moveId, proposed = new Map()) {
214
+ const [move] = (await ref(env, 'account.move')
215
+ .browse([moveId])
216
+ .load(['kind', 'partner', 'fiscalPosition', 'journal', 'company'])).read(['kind', 'partner', 'fiscalPosition', 'journal', 'company']);
217
+ if (move === undefined)
218
+ throw new HttpProblem(404, 'missing-record', 'Not found', 'No such entry.');
219
+ const customer = String(move['kind']).startsWith('out_');
220
+ const partner = idOf(move['partner']);
221
+ const { position, why } = await positionOf(env, {
222
+ fiscalPosition: idOf(move['fiscalPosition']),
223
+ partner,
224
+ });
225
+ const [journal] = (await ref(env, 'account.journal')
226
+ .browse([idOf(move['journal'])])
227
+ .load(['defaultAccount'])).read(['defaultAccount']);
228
+ const journalAccount = idOf(journal?.['defaultAccount']);
229
+ const company = idOf(move['company']);
230
+ // Accounts of another company (products and categories are shared) are not used.
231
+ const ofCompany = async (ids) => {
232
+ const wanted = ids.filter((i) => i !== null);
233
+ if (wanted.length === 0)
234
+ return new Set();
235
+ const rows = (await ref(env, 'account.account').browse(wanted).load(['company'])).read([
236
+ 'id',
237
+ 'company',
238
+ ]);
239
+ return new Set(rows.filter((r) => idOf(r['company']) === company).map((r) => r['id']));
240
+ };
241
+ const key = customer ? 'incomeAccount' : 'expenseAccount';
242
+ const lines = (await ref(env, 'account.move.line').search({
243
+ where: { move: moveId, lineKind: 'product' },
244
+ })).read(['id', 'account', 'product']);
245
+ const productIds = [...new Set(lines.map((l) => idOf(l['product'])).filter((p) => p !== null))];
246
+ const products = new Map(productIds.length === 0
247
+ ? []
248
+ : (await ref(env, 'product.product')
249
+ .browse(productIds)
250
+ .load([key, 'category']))
251
+ .read(['id', key, 'category'])
252
+ .map((p) => [p['id'], p]));
253
+ const categoryIds = [
254
+ ...new Set([...products.values()].map((p) => idOf(p['category'])).filter((c) => c !== null)),
255
+ ];
256
+ const categories = new Map(categoryIds.length === 0
257
+ ? []
258
+ : (await ref(env, 'product.category')
259
+ .browse(categoryIds)
260
+ .load([key]))
261
+ .read(['id', key])
262
+ .map((c) => [c['id'], idOf(c[key])]));
263
+ const valid = await ofCompany([
264
+ ...[...products.values()].map((p) => idOf(p[key])),
265
+ ...[...categories.values()],
266
+ ]);
267
+ const out = new Map();
268
+ for (const l of lines) {
269
+ const id = l['id'];
270
+ const product = products.get(idOf(l['product']) ?? -1);
271
+ const own = idOf(product?.[key]);
272
+ const category = categories.get(idOf(product?.['category']) ?? -1) ?? null;
273
+ const [account, source] = idOf(l['account']) !== null
274
+ ? [idOf(l['account']), 'line']
275
+ : proposed.has(id)
276
+ ? [proposed.get(id), 'app']
277
+ : own !== null && valid.has(own)
278
+ ? [own, 'product']
279
+ : category !== null && valid.has(category)
280
+ ? [category, 'category']
281
+ : journalAccount !== null
282
+ ? [journalAccount, 'journal']
283
+ : [null, 'none'];
284
+ // The line's own account is kept as typed; the others go through the position.
285
+ const final = source === 'line' ? account : mapAccount(position, account);
286
+ out.set(id, { account: final, source, mapped: final !== account });
287
+ }
288
+ // The counterpart: the partner's account, else the company's.
289
+ let counterpart = { account: null, source: 'none', mapped: false };
290
+ if (partner !== null) {
291
+ const pKey = customer ? 'receivableAccount' : 'payableAccount';
292
+ const [p] = (await ref(env, 'res.partner').browse([partner]).load([pKey])).read([pKey]);
293
+ const own = idOf(p?.[pKey]);
294
+ const [c] = (await ref(env, 'res.company')
295
+ .browse([company])
296
+ .load(['accountReceivable', 'accountPayable'])).read(['accountReceivable', 'accountPayable']);
297
+ const fallback = idOf(c?.[customer ? 'accountReceivable' : 'accountPayable']);
298
+ const valid2 = await ofCompany([own]);
299
+ const [account, source] = own !== null && valid2.has(own)
300
+ ? [own, 'partner']
301
+ : fallback !== null
302
+ ? [fallback, 'company']
303
+ : [null, 'none'];
304
+ const final = mapAccount(position, account);
305
+ counterpart = { account: final, source, mapped: final !== account };
306
+ }
307
+ return { position, why, lines: out, counterpart };
308
+ }
309
+ /**
310
+ * Before posting: each document's fiscal position written on it, and its product lines' taxes mapped (a tax
311
+ * replaced or removed). Entries without a partner are left alone.
312
+ */
313
+ export async function applyFiscalPositions(env, moveIds) {
314
+ for (const moveId of moveIds) {
315
+ const [move] = (await ref(env, 'account.move').browse([moveId]).load(['kind', 'partner', 'fiscalPosition'])).read(['kind', 'partner', 'fiscalPosition']);
316
+ if (move === undefined || move['kind'] === 'entry')
317
+ continue;
318
+ const { position } = await positionOf(env, {
319
+ fiscalPosition: idOf(move['fiscalPosition']),
320
+ partner: idOf(move['partner']),
321
+ });
322
+ if (position === null)
323
+ continue;
324
+ if (idOf(move['fiscalPosition']) !== position.id)
325
+ await ref(env, 'account.move').browse([moveId]).write({ fiscalPosition: position.id });
326
+ if (position.taxes.size === 0)
327
+ continue;
328
+ const lines = await (await ref(env, 'account.move.line').search({ where: { move: moveId, lineKind: 'product' } })).load({ taxes: true });
329
+ for (const l of lines.read(['id', 'taxes'])) {
330
+ const before = [...(l['taxes'] ?? [])].map((t) => idOf(t));
331
+ const after = mapTaxes(position, before);
332
+ if (after.join(',') !== before.join(','))
333
+ await ref(env, 'account.move.line')
334
+ .browse([l['id']])
335
+ .write({ taxes: { set: after } });
336
+ }
337
+ }
338
+ }
339
+ /** What posting would do to a draft document's lines: taxes and accounts after the position, and why. */
340
+ export async function previewMove(env, moveId) {
341
+ const [move] = (await ref(env, 'account.move').browse([moveId]).load(['kind', 'partner', 'fiscalPosition'])).read(['kind', 'partner', 'fiscalPosition']);
342
+ if (move === undefined)
343
+ throw new HttpProblem(404, 'missing-record', 'Not found', 'No such entry.');
344
+ const proposed = await env.model('account.move').browse([moveId]).productLineAccounts();
345
+ const determined = await determineAccounts(env, moveId, proposed);
346
+ const lines = await (await ref(env, 'account.move.line').search({
347
+ where: { move: moveId, lineKind: 'product' },
348
+ order: ['id asc'],
349
+ })).load({ taxes: true });
350
+ const accountIds = new Set();
351
+ const taxIds = new Set();
352
+ const rows = lines.read(['id', 'name', 'taxes']).map((l) => {
353
+ const before = [...(l['taxes'] ?? [])].map((t) => idOf(t));
354
+ const after = mapTaxes(determined.position, before);
355
+ for (const t of [...before, ...after])
356
+ taxIds.add(t);
357
+ const d = determined.lines.get(l['id']);
358
+ if (d?.account != null)
359
+ accountIds.add(d.account);
360
+ return { id: l['id'], name: String(l['name'] ?? ''), before, after, ...d };
361
+ });
362
+ if (determined.counterpart.account !== null)
363
+ accountIds.add(determined.counterpart.account);
364
+ const names = async (model, ids, keys) => new Map(ids.size === 0
365
+ ? []
366
+ : (await ref(env, model)
367
+ .browse([...ids])
368
+ .load(keys))
369
+ .read(['id', ...keys])
370
+ .map((r) => [
371
+ r['id'],
372
+ keys
373
+ .map((k) => String(r[k] ?? ''))
374
+ .join(' ')
375
+ .trim(),
376
+ ]));
377
+ const accounts = await names('account.account', accountIds, ['code', 'name']);
378
+ const taxes = await names('account.tax', taxIds, ['name']);
379
+ return {
380
+ position: determined.position === null
381
+ ? null
382
+ : { id: determined.position.id, name: determined.position.name },
383
+ why: determined.why,
384
+ lines: rows.map((r) => ({
385
+ id: r.id,
386
+ name: r.name,
387
+ taxesBefore: r.before.map((t) => taxes.get(t) ?? String(t)),
388
+ taxesAfter: r.after.map((t) => taxes.get(t) ?? String(t)),
389
+ account: r.account == null ? null : (accounts.get(r.account) ?? String(r.account)),
390
+ source: r.source ?? 'none',
391
+ mapped: r.mapped === true,
392
+ })),
393
+ counterpart: {
394
+ account: determined.counterpart.account === null
395
+ ? null
396
+ : (accounts.get(determined.counterpart.account) ?? null),
397
+ source: determined.counterpart.source,
398
+ mapped: determined.counterpart.mapped,
399
+ },
400
+ };
401
+ }