shutro-erp 0.3.4 → 0.3.5

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 (381) hide show
  1. package/dist/account_portal/.kosh/bindings.js +1 -1
  2. package/dist/account_portal/.kosh/schema.d.ts +54 -3
  3. package/dist/account_portal/module.d.ts +359 -6
  4. package/dist/accounting/.kosh/bindings.js +1 -1
  5. package/dist/accounting/.kosh/schema.d.ts +54 -3
  6. package/dist/accounting/index.js +214 -2
  7. package/dist/accounting/module.d.ts +217 -5
  8. package/dist/accounting/module.js +23 -2
  9. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  10. package/dist/calendar/.kosh/bindings.js +15 -0
  11. package/dist/calendar/.kosh/schema.d.ts +795 -0
  12. package/dist/calendar/demo.d.ts +6 -0
  13. package/dist/calendar/demo.js +24 -0
  14. package/dist/calendar/index.d.ts +3 -0
  15. package/dist/calendar/index.js +291 -0
  16. package/dist/calendar/module.d.ts +1705 -0
  17. package/dist/calendar/module.js +180 -0
  18. package/dist/cli/init.js +48 -0
  19. package/dist/cli/templates.d.ts +1 -1
  20. package/dist/cli/templates.js +137 -0
  21. package/dist/contacts/.kosh/bindings.js +1 -1
  22. package/dist/contacts/.kosh/schema.d.ts +78 -3
  23. package/dist/contacts/demo.js +30 -1
  24. package/dist/contacts/index.d.ts +1 -1
  25. package/dist/contacts/index.js +155 -9
  26. package/dist/contacts/module.d.ts +338 -2
  27. package/dist/contacts/module.js +82 -5
  28. package/dist/crm/.kosh/bindings.d.ts +22 -0
  29. package/dist/crm/.kosh/bindings.js +15 -0
  30. package/dist/crm/.kosh/schema.d.ts +799 -0
  31. package/dist/crm/demo.d.ts +6 -0
  32. package/dist/crm/demo.js +45 -0
  33. package/dist/crm/index.d.ts +3 -0
  34. package/dist/crm/index.js +361 -0
  35. package/dist/crm/module.d.ts +1843 -0
  36. package/dist/crm/module.js +207 -0
  37. package/dist/event/.kosh/bindings.d.ts +22 -0
  38. package/dist/event/.kosh/bindings.js +15 -0
  39. package/dist/event/.kosh/schema.d.ts +843 -0
  40. package/dist/event/demo.d.ts +6 -0
  41. package/dist/event/demo.js +65 -0
  42. package/dist/event/index.d.ts +14 -0
  43. package/dist/event/index.js +333 -0
  44. package/dist/event/mails.d.ts +15 -0
  45. package/dist/event/mails.js +112 -0
  46. package/dist/event/module.d.ts +2800 -0
  47. package/dist/event/module.js +323 -0
  48. package/dist/event/web/CheckInBox.d.ts +9 -0
  49. package/dist/event/web/CheckInBox.js +87 -0
  50. package/dist/event/web/index.d.ts +11 -0
  51. package/dist/event/web/index.js +16 -0
  52. package/dist/event/web/messages.d.ts +2 -0
  53. package/dist/event/web/messages.js +23 -0
  54. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  55. package/dist/event_account/.kosh/bindings.js +15 -0
  56. package/dist/event_account/.kosh/schema.d.ts +1639 -0
  57. package/dist/event_account/index.d.ts +3 -0
  58. package/dist/event_account/index.js +28 -0
  59. package/dist/event_account/module.d.ts +6968 -0
  60. package/dist/event_account/module.js +90 -0
  61. package/dist/hr/.kosh/bindings.d.ts +22 -0
  62. package/dist/hr/.kosh/bindings.js +15 -0
  63. package/dist/hr/.kosh/schema.d.ts +878 -0
  64. package/dist/hr/demo.d.ts +6 -0
  65. package/dist/hr/demo.js +60 -0
  66. package/dist/hr/index.d.ts +3 -0
  67. package/dist/hr/index.js +483 -0
  68. package/dist/hr/module.d.ts +2611 -0
  69. package/dist/hr/module.js +350 -0
  70. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  71. package/dist/l10n_bd/.kosh/schema.d.ts +54 -3
  72. package/dist/l10n_bd/module.d.ts +359 -6
  73. package/dist/l10n_in/.kosh/bindings.js +1 -1
  74. package/dist/l10n_in/.kosh/schema.d.ts +54 -3
  75. package/dist/l10n_in/module.d.ts +380 -7
  76. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  77. package/dist/maintenance/.kosh/bindings.js +15 -0
  78. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  79. package/dist/maintenance/demo.d.ts +6 -0
  80. package/dist/maintenance/demo.js +60 -0
  81. package/dist/maintenance/index.d.ts +3 -0
  82. package/dist/maintenance/index.js +422 -0
  83. package/dist/maintenance/module.d.ts +3545 -0
  84. package/dist/maintenance/module.js +446 -0
  85. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  86. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  87. package/dist/maintenance_stock/.kosh/schema.d.ts +1371 -0
  88. package/dist/maintenance_stock/index.d.ts +9 -0
  89. package/dist/maintenance_stock/index.js +52 -0
  90. package/dist/maintenance_stock/module.d.ts +6953 -0
  91. package/dist/maintenance_stock/module.js +192 -0
  92. package/dist/modules-sdk/index.d.ts +1 -1
  93. package/dist/modules-sdk/manifest.d.ts +70 -0
  94. package/dist/modules-sdk/manifest.js +35 -1
  95. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  96. package/dist/mrp/.kosh/bindings.js +15 -0
  97. package/dist/mrp/.kosh/schema.d.ts +1378 -0
  98. package/dist/mrp/demo.d.ts +7 -0
  99. package/dist/mrp/demo.js +42 -0
  100. package/dist/mrp/index.d.ts +3 -0
  101. package/dist/mrp/index.js +392 -0
  102. package/dist/mrp/module.d.ts +8608 -0
  103. package/dist/mrp/module.js +695 -0
  104. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  105. package/dist/mrp_account/.kosh/bindings.js +15 -0
  106. package/dist/mrp_account/.kosh/schema.d.ts +2106 -0
  107. package/dist/mrp_account/index.d.ts +3 -0
  108. package/dist/mrp_account/index.js +22 -0
  109. package/dist/mrp_account/module.d.ts +20840 -0
  110. package/dist/mrp_account/module.js +123 -0
  111. package/dist/payment/.kosh/bindings.js +1 -1
  112. package/dist/payment/.kosh/schema.d.ts +54 -3
  113. package/dist/payment/module.d.ts +359 -6
  114. package/dist/portal/.kosh/bindings.js +1 -1
  115. package/dist/portal/.kosh/schema.d.ts +78 -3
  116. package/dist/portal/module.d.ts +166 -2
  117. package/dist/pos/.kosh/bindings.d.ts +22 -0
  118. package/dist/pos/.kosh/bindings.js +15 -0
  119. package/dist/pos/.kosh/schema.d.ts +1690 -0
  120. package/dist/pos/accounting.d.ts +10 -0
  121. package/dist/pos/accounting.js +149 -0
  122. package/dist/pos/demo.d.ts +6 -0
  123. package/dist/pos/demo.js +90 -0
  124. package/dist/pos/index.d.ts +9 -0
  125. package/dist/pos/index.js +349 -0
  126. package/dist/pos/module.d.ts +9636 -0
  127. package/dist/pos/module.js +423 -0
  128. package/dist/pos/routes.d.ts +39 -0
  129. package/dist/pos/routes.js +368 -0
  130. package/dist/pos/web/Register.d.ts +9 -0
  131. package/dist/pos/web/Register.js +252 -0
  132. package/dist/pos/web/index.d.ts +11 -0
  133. package/dist/pos/web/index.js +16 -0
  134. package/dist/pos/web/messages.d.ts +2 -0
  135. package/dist/pos/web/messages.js +87 -0
  136. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  137. package/dist/pos_stock/.kosh/bindings.js +15 -0
  138. package/dist/pos_stock/.kosh/schema.d.ts +2015 -0
  139. package/dist/pos_stock/index.d.ts +9 -0
  140. package/dist/pos_stock/index.js +35 -0
  141. package/dist/pos_stock/module.d.ts +11935 -0
  142. package/dist/pos_stock/module.js +115 -0
  143. package/dist/product/.kosh/bindings.js +1 -1
  144. package/dist/product/.kosh/schema.d.ts +51 -1
  145. package/dist/product/index.js +81 -4
  146. package/dist/product/module.d.ts +43 -1
  147. package/dist/product/module.js +9 -2
  148. package/dist/project/.kosh/bindings.js +1 -1
  149. package/dist/project/.kosh/schema.d.ts +54 -3
  150. package/dist/project/index.js +147 -7
  151. package/dist/project/module.d.ts +210 -2
  152. package/dist/project/module.js +52 -5
  153. package/dist/project_portal/.kosh/bindings.js +1 -1
  154. package/dist/project_portal/.kosh/schema.d.ts +54 -3
  155. package/dist/project_portal/module.d.ts +353 -4
  156. package/dist/purchase/.kosh/bindings.js +1 -1
  157. package/dist/purchase/.kosh/schema.d.ts +54 -3
  158. package/dist/purchase/index.js +163 -3
  159. package/dist/purchase/module.d.ts +215 -3
  160. package/dist/purchase/module.js +21 -3
  161. package/dist/purchase_account/.kosh/bindings.js +1 -1
  162. package/dist/purchase_account/.kosh/schema.d.ts +55 -3
  163. package/dist/purchase_account/index.js +26 -1
  164. package/dist/purchase_account/module.d.ts +393 -7
  165. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  166. package/dist/purchase_portal/.kosh/schema.d.ts +54 -3
  167. package/dist/purchase_portal/module.d.ts +366 -5
  168. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  169. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  170. package/dist/purchase_stock/.kosh/schema.d.ts +1310 -0
  171. package/dist/purchase_stock/index.d.ts +7 -0
  172. package/dist/purchase_stock/index.js +91 -0
  173. package/dist/purchase_stock/module.d.ts +6763 -0
  174. package/dist/purchase_stock/module.js +144 -0
  175. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  176. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  177. package/dist/purchase_stock_account/.kosh/schema.d.ts +1959 -0
  178. package/dist/purchase_stock_account/index.d.ts +3 -0
  179. package/dist/purchase_stock_account/index.js +24 -0
  180. package/dist/purchase_stock_account/module.d.ts +35366 -0
  181. package/dist/purchase_stock_account/module.js +162 -0
  182. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  183. package/dist/recruitment/.kosh/bindings.js +15 -0
  184. package/dist/recruitment/.kosh/schema.d.ts +990 -0
  185. package/dist/recruitment/demo.d.ts +6 -0
  186. package/dist/recruitment/demo.js +45 -0
  187. package/dist/recruitment/index.d.ts +3 -0
  188. package/dist/recruitment/index.js +385 -0
  189. package/dist/recruitment/module.d.ts +3247 -0
  190. package/dist/recruitment/module.js +193 -0
  191. package/dist/recruitment/web/HireButton.d.ts +9 -0
  192. package/dist/recruitment/web/HireButton.js +32 -0
  193. package/dist/recruitment/web/index.d.ts +11 -0
  194. package/dist/recruitment/web/index.js +16 -0
  195. package/dist/recruitment/web/messages.d.ts +2 -0
  196. package/dist/recruitment/web/messages.js +19 -0
  197. package/dist/reporting/documents.d.ts +5 -0
  198. package/dist/reporting/documents.js +28 -1
  199. package/dist/reporting/index.d.ts +1 -1
  200. package/dist/reporting/index.js +4 -2
  201. package/dist/reporting/models.js +9 -0
  202. package/dist/reporting/overviews.d.ts +16 -0
  203. package/dist/reporting/overviews.js +56 -0
  204. package/dist/reporting/routes-documents.js +1 -1
  205. package/dist/reporting/routes.js +138 -80
  206. package/dist/reporting/web/DashboardView.d.ts +11 -0
  207. package/dist/reporting/web/DashboardView.js +2 -2
  208. package/dist/reporting/web/DesignerView.js +5 -0
  209. package/dist/reporting/web/Overview.d.ts +9 -0
  210. package/dist/reporting/web/Overview.js +53 -0
  211. package/dist/reporting/web/index.d.ts +1 -0
  212. package/dist/reporting/web/index.js +4 -1
  213. package/dist/reporting/web/messages.js +9 -0
  214. package/dist/sale_account/.kosh/bindings.js +1 -1
  215. package/dist/sale_account/.kosh/schema.d.ts +59 -3
  216. package/dist/sale_account/index.js +22 -1
  217. package/dist/sale_account/module.d.ts +461 -7
  218. package/dist/sale_portal/.kosh/bindings.js +1 -1
  219. package/dist/sale_portal/.kosh/schema.d.ts +58 -3
  220. package/dist/sale_portal/module.d.ts +434 -5
  221. package/dist/sale_project/.kosh/bindings.js +1 -1
  222. package/dist/sale_project/.kosh/schema.d.ts +60 -3
  223. package/dist/sale_project/module.d.ts +476 -6
  224. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  225. package/dist/sale_stock/.kosh/bindings.js +15 -0
  226. package/dist/sale_stock/.kosh/schema.d.ts +1228 -0
  227. package/dist/sale_stock/index.d.ts +7 -0
  228. package/dist/sale_stock/index.js +84 -0
  229. package/dist/sale_stock/module.d.ts +6791 -0
  230. package/dist/sale_stock/module.js +146 -0
  231. package/dist/sales/.kosh/bindings.js +1 -1
  232. package/dist/sales/.kosh/schema.d.ts +58 -3
  233. package/dist/sales/index.js +191 -4
  234. package/dist/sales/module.d.ts +355 -3
  235. package/dist/sales/module.js +78 -3
  236. package/dist/server/api/metadata.d.ts +5 -0
  237. package/dist/server/api/metadata.js +5 -0
  238. package/dist/server/api/rest.js +64 -1
  239. package/dist/server/api/views.js +1 -0
  240. package/dist/server/app-settings.d.ts +7 -0
  241. package/dist/server/app-settings.js +10 -0
  242. package/dist/server/auth/base.js +9 -0
  243. package/dist/server/index.d.ts +1 -0
  244. package/dist/server/index.js +1 -0
  245. package/dist/settings/app-settings.d.ts +2 -0
  246. package/dist/settings/app-settings.js +518 -0
  247. package/dist/settings/index.d.ts +1 -0
  248. package/dist/settings/index.js +15 -0
  249. package/dist/settings/people.js +29 -5
  250. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  251. package/dist/settings/web/AppSettingsPage.js +210 -0
  252. package/dist/settings/web/OverviewPage.js +16 -3
  253. package/dist/settings/web/PeoplePage.js +20 -6
  254. package/dist/settings/web/index.d.ts +1 -0
  255. package/dist/settings/web/index.js +3 -0
  256. package/dist/settings/web/messages.js +118 -2
  257. package/dist/stock/.kosh/bindings.d.ts +22 -0
  258. package/dist/stock/.kosh/bindings.js +15 -0
  259. package/dist/stock/.kosh/schema.d.ts +1147 -0
  260. package/dist/stock/demo.d.ts +7 -0
  261. package/dist/stock/demo.js +55 -0
  262. package/dist/stock/index.d.ts +3 -0
  263. package/dist/stock/index.js +674 -0
  264. package/dist/stock/module.d.ts +6330 -0
  265. package/dist/stock/module.js +1325 -0
  266. package/dist/stock/web/ScanBox.d.ts +8 -0
  267. package/dist/stock/web/ScanBox.js +90 -0
  268. package/dist/stock/web/index.d.ts +11 -0
  269. package/dist/stock/web/index.js +16 -0
  270. package/dist/stock/web/messages.d.ts +2 -0
  271. package/dist/stock/web/messages.js +25 -0
  272. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  273. package/dist/stock_account/.kosh/bindings.js +15 -0
  274. package/dist/stock_account/.kosh/schema.d.ts +1875 -0
  275. package/dist/stock_account/index.d.ts +3 -0
  276. package/dist/stock_account/index.js +130 -0
  277. package/dist/stock_account/module.d.ts +10655 -0
  278. package/dist/stock_account/module.js +339 -0
  279. package/dist/storage/attachments.d.ts +5 -0
  280. package/dist/storage/attachments.js +12 -1
  281. package/dist/storage/models.js +3 -0
  282. package/dist/storage/routes.js +13 -2
  283. package/dist/todo/.kosh/bindings.d.ts +22 -0
  284. package/dist/todo/.kosh/bindings.js +15 -0
  285. package/dist/todo/.kosh/schema.d.ts +732 -0
  286. package/dist/todo/demo.d.ts +6 -0
  287. package/dist/todo/demo.js +35 -0
  288. package/dist/todo/index.d.ts +3 -0
  289. package/dist/todo/index.js +187 -0
  290. package/dist/todo/module.d.ts +1180 -0
  291. package/dist/todo/module.js +130 -0
  292. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  293. package/dist/trade_finance/.kosh/bindings.js +15 -0
  294. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  295. package/dist/trade_finance/demo.d.ts +6 -0
  296. package/dist/trade_finance/demo.js +63 -0
  297. package/dist/trade_finance/index.d.ts +3 -0
  298. package/dist/trade_finance/index.js +413 -0
  299. package/dist/trade_finance/module.d.ts +3779 -0
  300. package/dist/trade_finance/module.js +505 -0
  301. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  302. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  303. package/dist/trade_finance_account/.kosh/schema.d.ts +1711 -0
  304. package/dist/trade_finance_account/index.d.ts +3 -0
  305. package/dist/trade_finance_account/index.js +92 -0
  306. package/dist/trade_finance_account/module.d.ts +7928 -0
  307. package/dist/trade_finance_account/module.js +244 -0
  308. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  309. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  310. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1153 -0
  311. package/dist/trade_finance_purchase/index.d.ts +8 -0
  312. package/dist/trade_finance_purchase/index.js +50 -0
  313. package/dist/trade_finance_purchase/module.d.ts +4252 -0
  314. package/dist/trade_finance_purchase/module.js +44 -0
  315. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  316. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  317. package/dist/trade_finance_sale/.kosh/schema.d.ts +1071 -0
  318. package/dist/trade_finance_sale/index.d.ts +8 -0
  319. package/dist/trade_finance_sale/index.js +50 -0
  320. package/dist/trade_finance_sale/module.d.ts +4280 -0
  321. package/dist/trade_finance_sale/module.js +44 -0
  322. package/dist/ui/api.d.ts +2 -1
  323. package/dist/ui/api.js +2 -1
  324. package/dist/ui/app.js +2 -1
  325. package/dist/ui/components/AppIcon.js +23 -1
  326. package/dist/ui/components/primitives.d.ts +2 -0
  327. package/dist/ui/components/primitives.js +7 -1
  328. package/dist/ui/i18n/messages.d.ts +23 -0
  329. package/dist/ui/i18n/messages.js +38 -0
  330. package/dist/ui/index.d.ts +1 -0
  331. package/dist/ui/index.js +1 -0
  332. package/dist/ui/offline/queue.d.ts +5 -1
  333. package/dist/ui/offline/queue.js +2 -0
  334. package/dist/ui/registry.d.ts +5 -0
  335. package/dist/ui/shell/Home.js +55 -4
  336. package/dist/ui/views/FormView.js +98 -17
  337. package/dist/ui/views/KanbanView.d.ts +2 -0
  338. package/dist/ui/views/KanbanView.js +32 -3
  339. package/dist/ui/views/ListView.js +108 -11
  340. package/dist/ui/views/StatsRow.d.ts +14 -0
  341. package/dist/ui/views/StatsRow.js +88 -0
  342. package/dist/ui/views/widgets.d.ts +2 -1
  343. package/dist/ui/views/widgets.js +194 -1
  344. package/dist/views/builders.d.ts +19 -2
  345. package/dist/views/builders.js +21 -1
  346. package/dist/views/condition.d.ts +6 -0
  347. package/dist/views/condition.js +20 -0
  348. package/dist/views/documents.d.ts +8 -0
  349. package/dist/views/extend.d.ts +2 -2
  350. package/dist/views/extend.js +11 -1
  351. package/dist/views/index.d.ts +2 -2
  352. package/dist/views/index.js +2 -2
  353. package/dist/views/types.d.ts +52 -5
  354. package/dist/views/validate.js +39 -1
  355. package/dist/website/.kosh/bindings.d.ts +22 -0
  356. package/dist/website/.kosh/bindings.js +15 -0
  357. package/dist/website/.kosh/schema.d.ts +881 -0
  358. package/dist/website/demo.d.ts +6 -0
  359. package/dist/website/demo.js +115 -0
  360. package/dist/website/index.d.ts +9 -0
  361. package/dist/website/index.js +250 -0
  362. package/dist/website/module.d.ts +2987 -0
  363. package/dist/website/module.js +281 -0
  364. package/dist/website/render.d.ts +45 -0
  365. package/dist/website/render.js +102 -0
  366. package/dist/website/routes.d.ts +12 -0
  367. package/dist/website/routes.js +246 -0
  368. package/dist/website/web/PagePreview.d.ts +7 -0
  369. package/dist/website/web/PagePreview.js +33 -0
  370. package/dist/website/web/index.d.ts +11 -0
  371. package/dist/website/web/index.js +16 -0
  372. package/dist/website/web/messages.d.ts +2 -0
  373. package/dist/website/web/messages.js +15 -0
  374. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  375. package/dist/website_crm/.kosh/bindings.js +15 -0
  376. package/dist/website_crm/.kosh/schema.d.ts +966 -0
  377. package/dist/website_crm/index.d.ts +3 -0
  378. package/dist/website_crm/index.js +39 -0
  379. package/dist/website_crm/module.d.ts +2955 -0
  380. package/dist/website_crm/module.js +44 -0
  381. package/package.json +118 -1
@@ -9,7 +9,8 @@ import { messaging } from '../messaging/index.js';
9
9
  import { defineModule } from '../modules-sdk/index.js';
10
10
  import { permissions } from '../permissions/index.js';
11
11
  import { product } from '../product/index.js';
12
- import { action, form, kanban, list, search } from '../views/index.js';
12
+ import { reporting } from '../reporting/index.js';
13
+ import { action, calendar, form, kanban, list, search, stat } from '../views/index.js';
13
14
  import { purchaseDemo } from './demo.js';
14
15
  import { PurchaseOrder, purchaseShutro } from './module.js';
15
16
  export { PurchaseOrder, PurchaseOrderLine, purchaseShutro } from './module.js';
@@ -17,7 +18,14 @@ export const purchase = defineModule({
17
18
  shutro: purchaseShutro,
18
19
  kosh: '^0.1.0',
19
20
  hooks: { demo: purchaseDemo },
20
- depends: [contacts, product, messaging, permissions],
21
+ depends: [contacts, product, messaging, permissions, reporting],
22
+ events: [
23
+ {
24
+ topic: 'purchase.order.confirmed',
25
+ model: 'purchase.order',
26
+ label: 'Purchase order confirmed',
27
+ },
28
+ ],
21
29
  app: {
22
30
  code: 'purchase',
23
31
  label: 'Purchase',
@@ -31,6 +39,22 @@ export const purchase = defineModule({
31
39
  manager: { label: 'Manager (all orders)', groups: ['purchase.manager'], implies: ['user'] },
32
40
  director: { label: 'Director', groups: ['purchase.director'], implies: ['manager'] },
33
41
  },
42
+ // Settings › App settings › Purchase (RFC 0020): per company, changed by purchase managers.
43
+ settings: {
44
+ sections: [
45
+ {
46
+ key: 'orders',
47
+ label: 'Purchase orders',
48
+ description: 'The terms new requests for quotation and purchase orders start with.',
49
+ keywords: 'purchase order rfq terms conditions vendor',
50
+ scope: 'company',
51
+ editors: ['purchase.manager'],
52
+ fields: [
53
+ { key: 'purchaseTerms', help: 'Filled in on new orders; each can still be changed.' },
54
+ ],
55
+ },
56
+ ],
57
+ },
34
58
  approvals: [
35
59
  {
36
60
  name: 'Purchase approvals',
@@ -51,6 +75,134 @@ export const purchase = defineModule({
51
75
  ],
52
76
  },
53
77
  ],
78
+ // The Overview (RFC 0022 step 2): spend against last month, what waits, who we buy from.
79
+ overview: {
80
+ cards: [
81
+ {
82
+ id: 'spend_month',
83
+ title: 'Purchases this month',
84
+ kind: 'kpi',
85
+ model: 'purchase.order',
86
+ measure: 'sum:amountTotal',
87
+ filter: { state: { in: ['purchase', 'done'] } },
88
+ comparison: { field: 'dateOrder', mode: 'previous' },
89
+ w: 3,
90
+ },
91
+ {
92
+ id: 'orders_month',
93
+ title: 'Orders this month',
94
+ kind: 'kpi',
95
+ model: 'purchase.order',
96
+ measure: 'count',
97
+ filter: { state: { in: ['purchase', 'done'] } },
98
+ comparison: { field: 'dateOrder', mode: 'previous' },
99
+ w: 3,
100
+ },
101
+ {
102
+ id: 'open_rfqs',
103
+ title: 'Open requests',
104
+ kind: 'kpi',
105
+ model: 'purchase.order',
106
+ measure: 'count',
107
+ filter: { state: { in: ['draft', 'sent'] } },
108
+ w: 3,
109
+ },
110
+ {
111
+ id: 'to_approve',
112
+ title: 'Waiting approval',
113
+ kind: 'kpi',
114
+ model: 'purchase.order',
115
+ measure: 'count',
116
+ filter: { state: 'to_approve' },
117
+ w: 3,
118
+ },
119
+ {
120
+ id: 'spend_by_month',
121
+ title: 'Purchases by month',
122
+ kind: 'chart',
123
+ model: 'purchase.order',
124
+ measure: 'sum:amountTotal',
125
+ groupBy: 'dateOrder:month',
126
+ filter: { state: { in: ['purchase', 'done'] } },
127
+ chart: 'bar',
128
+ w: 6,
129
+ },
130
+ {
131
+ id: 'top_vendors',
132
+ title: 'Top vendors',
133
+ kind: 'pivot',
134
+ model: 'purchase.order',
135
+ measure: 'sum:amountTotal',
136
+ groupBy: 'partner',
137
+ filter: { state: { in: ['purchase', 'done'] } },
138
+ w: 6,
139
+ },
140
+ {
141
+ id: 'by_buyer',
142
+ title: 'By buyer',
143
+ kind: 'chart',
144
+ model: 'purchase.order',
145
+ measure: 'sum:amountTotal',
146
+ groupBy: 'user',
147
+ filter: { state: { in: ['purchase', 'done'] } },
148
+ chart: 'pie',
149
+ w: 6,
150
+ },
151
+ {
152
+ id: 'biggest_open',
153
+ title: 'Biggest open requests',
154
+ kind: 'list',
155
+ model: 'purchase.order',
156
+ measure: 'sum:amountTotal',
157
+ filter: { state: { in: ['draft', 'sent', 'to_approve'] } },
158
+ w: 6,
159
+ },
160
+ ],
161
+ },
162
+ viewExtensions: [
163
+ {
164
+ view: 'product.product.form',
165
+ operations: [
166
+ {
167
+ append: 'related',
168
+ nodes: [
169
+ stat({
170
+ id: 'product_bought',
171
+ label: 'Bought',
172
+ model: 'purchase.order.line',
173
+ where: { product: { $record: 'id' }, 'order.state': { in: ['purchase', 'done'] } },
174
+ measure: { sum: 'quantity' },
175
+ }),
176
+ ],
177
+ },
178
+ ],
179
+ },
180
+ {
181
+ view: 'res.partner.form',
182
+ operations: [
183
+ {
184
+ append: 'related',
185
+ nodes: [
186
+ stat({
187
+ id: 'purchase_orders',
188
+ label: 'Purchase orders',
189
+ model: PurchaseOrder,
190
+ where: { partner: { $record: 'id' }, state: { in: ['purchase', 'done'] } },
191
+ action: 'purchase.action_orders',
192
+ }),
193
+ stat({
194
+ id: 'purchase_spend',
195
+ label: 'Purchases',
196
+ model: PurchaseOrder,
197
+ where: { partner: { $record: 'id' }, state: { in: ['purchase', 'done'] } },
198
+ measure: { sum: 'amountTotal' },
199
+ action: 'purchase.action_orders',
200
+ }),
201
+ ],
202
+ },
203
+ ],
204
+ },
205
+ ],
54
206
  actions: {
55
207
  'purchase.action_rfqs': action(PurchaseOrder, {
56
208
  label: 'Requests for quotation',
@@ -59,7 +211,7 @@ export const purchase = defineModule({
59
211
  }),
60
212
  'purchase.action_orders': action(PurchaseOrder, {
61
213
  label: 'Purchase orders',
62
- views: ['list', 'kanban', 'form'],
214
+ views: ['list', 'kanban', 'calendar', 'form'],
63
215
  defaultFilters: ['orders'],
64
216
  }),
65
217
  'purchase.action_to_approve': action(PurchaseOrder, {
@@ -138,6 +290,8 @@ export const purchase = defineModule({
138
290
  ],
139
291
  },
140
292
  sheet: [
293
+ // Bills and receipts: the bridges append their tiles (RFC 0022 §3.1).
294
+ k.stats('related', []),
141
295
  k.group('vendor', ['partner', 'partnerReference', 'currency']),
142
296
  k.group('dates', ['name', 'dateOrder', 'datePlanned', 'user', 'origin']),
143
297
  k.lines('lines', [
@@ -157,6 +311,12 @@ export const purchase = defineModule({
157
311
  readonlyWhen: { state: { in: ['done', 'cancel'] } },
158
312
  chatter: true,
159
313
  })),
314
+ 'purchase.order.calendar': calendar(PurchaseOrder, {
315
+ dateStart: 'datePlanned',
316
+ title: 'name',
317
+ color: 'state',
318
+ mode: 'month',
319
+ }),
160
320
  },
161
321
  search: {
162
322
  'purchase.order': search(PurchaseOrder, {
@@ -188,6 +188,7 @@ export declare const PurchaseOrder: import("../server/orm.js").Model<"purchase.o
188
188
  readonly to: "purchase";
189
189
  readonly guard: (records: never) => unknown;
190
190
  readonly message: "Waiting for approvals.";
191
+ readonly after: (records: never) => unknown;
191
192
  };
192
193
  readonly reject: {
193
194
  readonly from: readonly ["to_approve"];
@@ -365,6 +366,7 @@ export declare const PurchaseOrder: import("../server/orm.js").Model<"purchase.o
365
366
  readonly to: "purchase";
366
367
  readonly guard: (records: never) => unknown;
367
368
  readonly message: "Waiting for approvals.";
369
+ readonly after: (records: never) => unknown;
368
370
  };
369
371
  readonly reject: {
370
372
  readonly from: readonly ["to_approve"];
@@ -395,6 +397,19 @@ export declare const PurchaseOrder: import("../server/orm.js").Model<"purchase.o
395
397
  sequence: false;
396
398
  }>;
397
399
  }>>;
400
+ /** The company's purchase settings (RFC 0020): the terms new orders start with. */
401
+ export declare const CompanyPurchase: import("../server/orm.js").Extension<"res.company", {
402
+ readonly purchaseTerms: import("../server/orm.js").ScalarField<"text", string, string, {
403
+ readonly required: false;
404
+ readonly computed: false;
405
+ readonly inverse: false;
406
+ readonly sequence: false;
407
+ readonly computeName: undefined;
408
+ readonly store: true;
409
+ readonly hasDefault: false;
410
+ readonly readonly: false;
411
+ }>;
412
+ }, Record<never, never>>;
398
413
  export declare const PurchaseOrderLine: import("../server/orm.js").Model<"purchase.order.line", {
399
414
  readonly id: import("../server/orm.js").IdField<"purchase.order.line">;
400
415
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
@@ -871,6 +886,7 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
871
886
  readonly to: "purchase";
872
887
  readonly guard: (records: never) => unknown;
873
888
  readonly message: "Waiting for approvals.";
889
+ readonly after: (records: never) => unknown;
874
890
  };
875
891
  readonly reject: {
876
892
  readonly from: readonly ["to_approve"];
@@ -1048,6 +1064,7 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
1048
1064
  readonly to: "purchase";
1049
1065
  readonly guard: (records: never) => unknown;
1050
1066
  readonly message: "Waiting for approvals.";
1067
+ readonly after: (records: never) => unknown;
1051
1068
  };
1052
1069
  readonly reject: {
1053
1070
  readonly from: readonly ["to_approve"];
@@ -1362,7 +1379,70 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
1362
1379
  readonly hasDefault: false;
1363
1380
  readonly readonly: true;
1364
1381
  }>;
1365
- }>>], readonly [import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"res.partner", {
1382
+ }>>], readonly [import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"res.partner.tag", {
1383
+ readonly id: import("../server/orm.js").IdField<"res.partner.tag">;
1384
+ readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1385
+ required: true;
1386
+ readonly: true;
1387
+ computed: false;
1388
+ inverse: false;
1389
+ hasDefault: false;
1390
+ sequence: false;
1391
+ }>;
1392
+ readonly updatedAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1393
+ required: true;
1394
+ readonly: true;
1395
+ computed: false;
1396
+ inverse: false;
1397
+ hasDefault: false;
1398
+ sequence: false;
1399
+ }>;
1400
+ readonly createdBy: import("../server/orm.js").Many2oneField<'res.users', {
1401
+ required: false;
1402
+ readonly: true;
1403
+ computed: false;
1404
+ inverse: false;
1405
+ hasDefault: false;
1406
+ sequence: false;
1407
+ }>;
1408
+ readonly updatedBy: import("../server/orm.js").Many2oneField<'res.users', {
1409
+ required: false;
1410
+ readonly: true;
1411
+ computed: false;
1412
+ inverse: false;
1413
+ hasDefault: false;
1414
+ sequence: false;
1415
+ }>;
1416
+ readonly displayName: import("../server/orm.js").CharField<{
1417
+ required: true;
1418
+ readonly: true;
1419
+ computed: true;
1420
+ inverse: false;
1421
+ hasDefault: false;
1422
+ sequence: false;
1423
+ }>;
1424
+ readonly name: import("../server/orm.js").CharField<{
1425
+ readonly required: true;
1426
+ readonly computed: false;
1427
+ readonly inverse: false;
1428
+ readonly sequence: false;
1429
+ readonly computeName: undefined;
1430
+ readonly store: true;
1431
+ readonly hasDefault: false;
1432
+ readonly readonly: false;
1433
+ }, string>;
1434
+ }, {} & import("../server/orm.js").TransitionMethods<{
1435
+ readonly name: import("../server/orm.js").CharField<{
1436
+ readonly required: true;
1437
+ readonly computed: false;
1438
+ readonly inverse: false;
1439
+ readonly sequence: false;
1440
+ readonly computeName: undefined;
1441
+ readonly store: true;
1442
+ readonly hasDefault: false;
1443
+ readonly readonly: false;
1444
+ }, string>;
1445
+ }>>, import("../server/orm.js").Model<"res.partner", {
1366
1446
  readonly id: import("../server/orm.js").IdField<"res.partner">;
1367
1447
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1368
1448
  required: true;
@@ -1416,6 +1496,46 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
1416
1496
  readonly hasDefault: false;
1417
1497
  readonly readonly: false;
1418
1498
  }, string>;
1499
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
1500
+ readonly required: false;
1501
+ readonly computed: false;
1502
+ readonly inverse: false;
1503
+ readonly sequence: false;
1504
+ readonly computeName: undefined;
1505
+ readonly store: true;
1506
+ readonly hasDefault: false;
1507
+ readonly readonly: false;
1508
+ }>;
1509
+ readonly tags: import("../server/orm.js").Many2manyField<"res.partner.tag", {
1510
+ readonly required: true;
1511
+ readonly computed: false;
1512
+ readonly inverse: false;
1513
+ readonly sequence: false;
1514
+ readonly computeName: undefined;
1515
+ readonly store: true;
1516
+ readonly hasDefault: true;
1517
+ readonly readonly: false;
1518
+ }>;
1519
+ readonly latitude: import("../server/orm.js").DecimalField<{
1520
+ readonly required: false;
1521
+ readonly computed: false;
1522
+ readonly inverse: false;
1523
+ readonly sequence: false;
1524
+ readonly computeName: undefined;
1525
+ readonly store: true;
1526
+ readonly hasDefault: false;
1527
+ readonly readonly: false;
1528
+ }>;
1529
+ readonly longitude: import("../server/orm.js").DecimalField<{
1530
+ readonly required: false;
1531
+ readonly computed: false;
1532
+ readonly inverse: false;
1533
+ readonly sequence: false;
1534
+ readonly computeName: undefined;
1535
+ readonly store: true;
1536
+ readonly hasDefault: false;
1537
+ readonly readonly: false;
1538
+ }>;
1419
1539
  readonly isCompany: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1420
1540
  readonly required: true;
1421
1541
  readonly computed: false;
@@ -1597,6 +1717,46 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
1597
1717
  readonly hasDefault: false;
1598
1718
  readonly readonly: false;
1599
1719
  }, string>;
1720
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
1721
+ readonly required: false;
1722
+ readonly computed: false;
1723
+ readonly inverse: false;
1724
+ readonly sequence: false;
1725
+ readonly computeName: undefined;
1726
+ readonly store: true;
1727
+ readonly hasDefault: false;
1728
+ readonly readonly: false;
1729
+ }>;
1730
+ readonly tags: import("../server/orm.js").Many2manyField<"res.partner.tag", {
1731
+ readonly required: true;
1732
+ readonly computed: false;
1733
+ readonly inverse: false;
1734
+ readonly sequence: false;
1735
+ readonly computeName: undefined;
1736
+ readonly store: true;
1737
+ readonly hasDefault: true;
1738
+ readonly readonly: false;
1739
+ }>;
1740
+ readonly latitude: import("../server/orm.js").DecimalField<{
1741
+ readonly required: false;
1742
+ readonly computed: false;
1743
+ readonly inverse: false;
1744
+ readonly sequence: false;
1745
+ readonly computeName: undefined;
1746
+ readonly store: true;
1747
+ readonly hasDefault: false;
1748
+ readonly readonly: false;
1749
+ }>;
1750
+ readonly longitude: import("../server/orm.js").DecimalField<{
1751
+ readonly required: false;
1752
+ readonly computed: false;
1753
+ readonly inverse: false;
1754
+ readonly sequence: false;
1755
+ readonly computeName: undefined;
1756
+ readonly store: true;
1757
+ readonly hasDefault: false;
1758
+ readonly readonly: false;
1759
+ }>;
1600
1760
  readonly isCompany: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1601
1761
  readonly required: true;
1602
1762
  readonly computed: false;
@@ -1767,7 +1927,28 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
1767
1927
  readonly hasDefault: false;
1768
1928
  readonly readonly: false;
1769
1929
  }>;
1770
- }>>], readonly [import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly []>, import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"uom.uom", {
1930
+ }>>], readonly [import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly [import("../server/orm.js").Extension<"res.company", {
1931
+ readonly contactTaxIdRequired: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1932
+ readonly required: true;
1933
+ readonly computed: false;
1934
+ readonly inverse: false;
1935
+ readonly sequence: false;
1936
+ readonly computeName: undefined;
1937
+ readonly store: true;
1938
+ readonly hasDefault: true;
1939
+ readonly readonly: false;
1940
+ }>;
1941
+ readonly contactUniqueEmail: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1942
+ readonly required: true;
1943
+ readonly computed: false;
1944
+ readonly inverse: false;
1945
+ readonly sequence: false;
1946
+ readonly computeName: undefined;
1947
+ readonly store: true;
1948
+ readonly hasDefault: true;
1949
+ readonly readonly: false;
1950
+ }>;
1951
+ }, Record<never, never>>]>, import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"uom.uom", {
1771
1952
  readonly id: import("../server/orm.js").IdField<"uom.uom">;
1772
1953
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1773
1954
  required: true;
@@ -2301,6 +2482,16 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
2301
2482
  readonly hasDefault: false;
2302
2483
  readonly readonly: false;
2303
2484
  }, string>;
2485
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
2486
+ readonly required: false;
2487
+ readonly computed: false;
2488
+ readonly inverse: false;
2489
+ readonly sequence: false;
2490
+ readonly computeName: undefined;
2491
+ readonly store: true;
2492
+ readonly hasDefault: false;
2493
+ readonly readonly: false;
2494
+ }>;
2304
2495
  readonly listPrice: import("../server/orm.js").DecimalField<{
2305
2496
  readonly required: true;
2306
2497
  readonly computed: false;
@@ -2452,6 +2643,16 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
2452
2643
  readonly hasDefault: false;
2453
2644
  readonly readonly: false;
2454
2645
  }, string>;
2646
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
2647
+ readonly required: false;
2648
+ readonly computed: false;
2649
+ readonly inverse: false;
2650
+ readonly sequence: false;
2651
+ readonly computeName: undefined;
2652
+ readonly store: true;
2653
+ readonly hasDefault: false;
2654
+ readonly readonly: false;
2655
+ }>;
2455
2656
  readonly listPrice: import("../server/orm.js").DecimalField<{
2456
2657
  readonly required: true;
2457
2658
  readonly computed: false;
@@ -2542,4 +2743,15 @@ export declare const purchaseShutro: import("../server/orm.js").Module<readonly
2542
2743
  readonly hasDefault: false;
2543
2744
  readonly readonly: false;
2544
2745
  }>;
2545
- }>>], readonly [import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly []>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly []>;
2746
+ }>>], readonly [import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly []>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>, import("../server/orm.js").Module<readonly import("../server/orm.js").AnyModel[], readonly import("../server/orm.js").ModuleBase[], readonly import("../server/orm.js").AnyExtension[]>], readonly [import("../server/orm.js").Extension<"res.company", {
2747
+ readonly purchaseTerms: import("../server/orm.js").ScalarField<"text", string, string, {
2748
+ readonly required: false;
2749
+ readonly computed: false;
2750
+ readonly inverse: false;
2751
+ readonly sequence: false;
2752
+ readonly computeName: undefined;
2753
+ readonly store: true;
2754
+ readonly hasDefault: false;
2755
+ readonly readonly: false;
2756
+ }>;
2757
+ }, Record<never, never>>]>;
@@ -9,7 +9,7 @@ import { messagingShutro } from '../messaging/index.js';
9
9
  import { approvalGuard, permissionsShutro, requestApprovals } from '../permissions/index.js';
10
10
  import { computeTaxes, productShutro, taxRule } from '../product/index.js';
11
11
  import { orm } from '../server/orm.js';
12
- import { check, compute, defineModel, defineModule, f, onchange, records, } from './.kosh/bindings.js';
12
+ import { check, compute, defineModel, defineModule, extendModel, f, onchange, records, } from './.kosh/bindings.js';
13
13
  /** A line's taxes through the engine (RFC 0016): its amount, its taxes in order. */
14
14
  function taxesOf(l) {
15
15
  return computeTaxes(l.quantity.times(l.priceUnit), l.quantity, [...l.taxes].map(taxRule));
@@ -93,6 +93,11 @@ export const PurchaseOrder = defineModel('purchase.order', {
93
93
  to: 'purchase',
94
94
  guard: records('purchase.order', (orders) => approvalGuard(orders)),
95
95
  message: 'Waiting for approvals.',
96
+ // Other apps act on a confirmation through the outbox (purchase_stock makes the receipt).
97
+ after: records('purchase.order', async (orders) => {
98
+ for (const o of await orders.load({}))
99
+ await orders.env.emit('purchase.order.confirmed', { id: o.id });
100
+ }),
96
101
  },
97
102
  reject: { from: ['to_approve'], to: 'draft' },
98
103
  lock: { from: ['purchase'], to: 'done' },
@@ -104,8 +109,14 @@ export const PurchaseOrder = defineModel('purchase.order', {
104
109
  }),
105
110
  },
106
111
  onchange: {
107
- // The vendor's currency, else the company's.
112
+ // The vendor's currency, else the company's; empty terms from the company's settings.
108
113
  partner: onchange('purchase.order', async (d, env) => {
114
+ if ((d.get('note') ?? '') === '') {
115
+ const [company] = (await env.model('res.company').browse([env.companyId]).load(['purchaseTerms'])).read(['purchaseTerms']);
116
+ const terms = company?.['purchaseTerms'];
117
+ if (typeof terms === 'string' && terms !== '')
118
+ d.set('note', terms);
119
+ }
109
120
  const p = await d.record('partner');
110
121
  if (p?.currency) {
111
122
  d.set('currency', p.currency.id);
@@ -120,6 +131,12 @@ export const PurchaseOrder = defineModel('purchase.order', {
120
131
  }),
121
132
  },
122
133
  });
134
+ /** The company's purchase settings (RFC 0020): the terms new orders start with. */
135
+ export const CompanyPurchase = extendModel('res.company', {
136
+ fields: {
137
+ purchaseTerms: f.text({ label: 'Default terms and conditions' }),
138
+ },
139
+ });
123
140
  export const PurchaseOrderLine = defineModel('purchase.order.line', {
124
141
  label: 'Purchase line',
125
142
  access: {
@@ -208,7 +225,7 @@ export const PurchaseOrderLine = defineModel('purchase.order.line', {
208
225
  });
209
226
  export const purchaseShutro = defineModule({
210
227
  name: 'purchase',
211
- version: '0.2.0',
228
+ version: '0.3.0',
212
229
  migrations: [
213
230
  {
214
231
  version: '0.2.0',
@@ -246,4 +263,5 @@ export const purchaseShutro = defineModule({
246
263
  }),
247
264
  ],
248
265
  models: [PurchaseOrder, PurchaseOrderLine],
266
+ extensions: [CompanyPurchase],
249
267
  });
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 44c407ac55365894
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 43079420e45369c2
2
2
  // Bindings of module `purchase_account`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';