shutro-erp 0.3.3 → 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 (412) hide show
  1. package/dist/account_portal/.kosh/bindings.js +1 -1
  2. package/dist/account_portal/.kosh/schema.d.ts +181 -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 +181 -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 +205 -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/integrations/index.js +12 -0
  71. package/dist/integrations/web/OAuthAppsPage.d.ts +9 -0
  72. package/dist/integrations/web/OAuthAppsPage.js +79 -0
  73. package/dist/integrations/web/index.d.ts +1 -0
  74. package/dist/integrations/web/index.js +3 -0
  75. package/dist/integrations/web/messages.js +58 -0
  76. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  77. package/dist/l10n_bd/.kosh/schema.d.ts +181 -3
  78. package/dist/l10n_bd/module.d.ts +359 -6
  79. package/dist/l10n_in/.kosh/bindings.js +1 -1
  80. package/dist/l10n_in/.kosh/schema.d.ts +181 -3
  81. package/dist/l10n_in/module.d.ts +380 -7
  82. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  83. package/dist/maintenance/.kosh/bindings.js +15 -0
  84. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  85. package/dist/maintenance/demo.d.ts +6 -0
  86. package/dist/maintenance/demo.js +60 -0
  87. package/dist/maintenance/index.d.ts +3 -0
  88. package/dist/maintenance/index.js +422 -0
  89. package/dist/maintenance/module.d.ts +3545 -0
  90. package/dist/maintenance/module.js +446 -0
  91. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  92. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  93. package/dist/maintenance_stock/.kosh/schema.d.ts +1371 -0
  94. package/dist/maintenance_stock/index.d.ts +9 -0
  95. package/dist/maintenance_stock/index.js +52 -0
  96. package/dist/maintenance_stock/module.d.ts +6953 -0
  97. package/dist/maintenance_stock/module.js +192 -0
  98. package/dist/messaging/web/index.js +1 -1
  99. package/dist/modules-sdk/index.d.ts +1 -1
  100. package/dist/modules-sdk/manifest.d.ts +70 -0
  101. package/dist/modules-sdk/manifest.js +35 -1
  102. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  103. package/dist/mrp/.kosh/bindings.js +15 -0
  104. package/dist/mrp/.kosh/schema.d.ts +1378 -0
  105. package/dist/mrp/demo.d.ts +7 -0
  106. package/dist/mrp/demo.js +42 -0
  107. package/dist/mrp/index.d.ts +3 -0
  108. package/dist/mrp/index.js +392 -0
  109. package/dist/mrp/module.d.ts +8608 -0
  110. package/dist/mrp/module.js +695 -0
  111. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  112. package/dist/mrp_account/.kosh/bindings.js +15 -0
  113. package/dist/mrp_account/.kosh/schema.d.ts +2106 -0
  114. package/dist/mrp_account/index.d.ts +3 -0
  115. package/dist/mrp_account/index.js +22 -0
  116. package/dist/mrp_account/module.d.ts +20840 -0
  117. package/dist/mrp_account/module.js +123 -0
  118. package/dist/notify/web/index.js +1 -1
  119. package/dist/payment/.kosh/bindings.js +1 -1
  120. package/dist/payment/.kosh/schema.d.ts +181 -3
  121. package/dist/payment/module.d.ts +359 -6
  122. package/dist/portal/.kosh/bindings.js +1 -1
  123. package/dist/portal/.kosh/schema.d.ts +205 -3
  124. package/dist/portal/module.d.ts +166 -2
  125. package/dist/pos/.kosh/bindings.d.ts +22 -0
  126. package/dist/pos/.kosh/bindings.js +15 -0
  127. package/dist/pos/.kosh/schema.d.ts +1690 -0
  128. package/dist/pos/accounting.d.ts +10 -0
  129. package/dist/pos/accounting.js +149 -0
  130. package/dist/pos/demo.d.ts +6 -0
  131. package/dist/pos/demo.js +90 -0
  132. package/dist/pos/index.d.ts +9 -0
  133. package/dist/pos/index.js +349 -0
  134. package/dist/pos/module.d.ts +9636 -0
  135. package/dist/pos/module.js +423 -0
  136. package/dist/pos/routes.d.ts +39 -0
  137. package/dist/pos/routes.js +368 -0
  138. package/dist/pos/web/Register.d.ts +9 -0
  139. package/dist/pos/web/Register.js +252 -0
  140. package/dist/pos/web/index.d.ts +11 -0
  141. package/dist/pos/web/index.js +16 -0
  142. package/dist/pos/web/messages.d.ts +2 -0
  143. package/dist/pos/web/messages.js +87 -0
  144. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  145. package/dist/pos_stock/.kosh/bindings.js +15 -0
  146. package/dist/pos_stock/.kosh/schema.d.ts +2015 -0
  147. package/dist/pos_stock/index.d.ts +9 -0
  148. package/dist/pos_stock/index.js +35 -0
  149. package/dist/pos_stock/module.d.ts +11935 -0
  150. package/dist/pos_stock/module.js +115 -0
  151. package/dist/product/.kosh/bindings.js +1 -1
  152. package/dist/product/.kosh/schema.d.ts +178 -1
  153. package/dist/product/index.js +81 -4
  154. package/dist/product/module.d.ts +43 -1
  155. package/dist/product/module.js +9 -2
  156. package/dist/project/.kosh/bindings.js +1 -1
  157. package/dist/project/.kosh/schema.d.ts +181 -3
  158. package/dist/project/index.js +147 -7
  159. package/dist/project/module.d.ts +210 -2
  160. package/dist/project/module.js +52 -5
  161. package/dist/project_portal/.kosh/bindings.js +1 -1
  162. package/dist/project_portal/.kosh/schema.d.ts +181 -3
  163. package/dist/project_portal/module.d.ts +353 -4
  164. package/dist/purchase/.kosh/bindings.js +1 -1
  165. package/dist/purchase/.kosh/schema.d.ts +181 -3
  166. package/dist/purchase/index.js +163 -3
  167. package/dist/purchase/module.d.ts +215 -3
  168. package/dist/purchase/module.js +21 -3
  169. package/dist/purchase_account/.kosh/bindings.js +1 -1
  170. package/dist/purchase_account/.kosh/schema.d.ts +182 -3
  171. package/dist/purchase_account/index.js +26 -1
  172. package/dist/purchase_account/module.d.ts +393 -7
  173. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  174. package/dist/purchase_portal/.kosh/schema.d.ts +181 -3
  175. package/dist/purchase_portal/module.d.ts +366 -5
  176. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  177. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  178. package/dist/purchase_stock/.kosh/schema.d.ts +1310 -0
  179. package/dist/purchase_stock/index.d.ts +7 -0
  180. package/dist/purchase_stock/index.js +91 -0
  181. package/dist/purchase_stock/module.d.ts +6763 -0
  182. package/dist/purchase_stock/module.js +144 -0
  183. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  184. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  185. package/dist/purchase_stock_account/.kosh/schema.d.ts +1959 -0
  186. package/dist/purchase_stock_account/index.d.ts +3 -0
  187. package/dist/purchase_stock_account/index.js +24 -0
  188. package/dist/purchase_stock_account/module.d.ts +35366 -0
  189. package/dist/purchase_stock_account/module.js +162 -0
  190. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  191. package/dist/recruitment/.kosh/bindings.js +15 -0
  192. package/dist/recruitment/.kosh/schema.d.ts +990 -0
  193. package/dist/recruitment/demo.d.ts +6 -0
  194. package/dist/recruitment/demo.js +45 -0
  195. package/dist/recruitment/index.d.ts +3 -0
  196. package/dist/recruitment/index.js +385 -0
  197. package/dist/recruitment/module.d.ts +3247 -0
  198. package/dist/recruitment/module.js +193 -0
  199. package/dist/recruitment/web/HireButton.d.ts +9 -0
  200. package/dist/recruitment/web/HireButton.js +32 -0
  201. package/dist/recruitment/web/index.d.ts +11 -0
  202. package/dist/recruitment/web/index.js +16 -0
  203. package/dist/recruitment/web/messages.d.ts +2 -0
  204. package/dist/recruitment/web/messages.js +19 -0
  205. package/dist/reporting/documents.d.ts +5 -0
  206. package/dist/reporting/documents.js +28 -1
  207. package/dist/reporting/index.d.ts +1 -1
  208. package/dist/reporting/index.js +4 -2
  209. package/dist/reporting/models.js +9 -0
  210. package/dist/reporting/overviews.d.ts +16 -0
  211. package/dist/reporting/overviews.js +56 -0
  212. package/dist/reporting/routes-documents.js +1 -1
  213. package/dist/reporting/routes.js +138 -80
  214. package/dist/reporting/web/DashboardView.d.ts +11 -0
  215. package/dist/reporting/web/DashboardView.js +2 -2
  216. package/dist/reporting/web/DesignerView.js +5 -0
  217. package/dist/reporting/web/Overview.d.ts +9 -0
  218. package/dist/reporting/web/Overview.js +53 -0
  219. package/dist/reporting/web/index.d.ts +1 -0
  220. package/dist/reporting/web/index.js +4 -1
  221. package/dist/reporting/web/messages.js +9 -0
  222. package/dist/sale_account/.kosh/bindings.js +1 -1
  223. package/dist/sale_account/.kosh/schema.d.ts +186 -3
  224. package/dist/sale_account/index.js +22 -1
  225. package/dist/sale_account/module.d.ts +461 -7
  226. package/dist/sale_portal/.kosh/bindings.js +1 -1
  227. package/dist/sale_portal/.kosh/schema.d.ts +185 -3
  228. package/dist/sale_portal/module.d.ts +434 -5
  229. package/dist/sale_project/.kosh/bindings.js +1 -1
  230. package/dist/sale_project/.kosh/schema.d.ts +187 -3
  231. package/dist/sale_project/module.d.ts +476 -6
  232. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  233. package/dist/sale_stock/.kosh/bindings.js +15 -0
  234. package/dist/sale_stock/.kosh/schema.d.ts +1228 -0
  235. package/dist/sale_stock/index.d.ts +7 -0
  236. package/dist/sale_stock/index.js +84 -0
  237. package/dist/sale_stock/module.d.ts +6791 -0
  238. package/dist/sale_stock/module.js +146 -0
  239. package/dist/sales/.kosh/bindings.js +1 -1
  240. package/dist/sales/.kosh/schema.d.ts +185 -3
  241. package/dist/sales/index.js +191 -4
  242. package/dist/sales/module.d.ts +355 -3
  243. package/dist/sales/module.js +78 -3
  244. package/dist/server/api/metadata.d.ts +5 -0
  245. package/dist/server/api/metadata.js +5 -0
  246. package/dist/server/api/rest.js +64 -1
  247. package/dist/server/api/views.js +1 -0
  248. package/dist/server/app-settings.d.ts +7 -0
  249. package/dist/server/app-settings.js +10 -0
  250. package/dist/server/auth/base.js +85 -0
  251. package/dist/server/auth/oauth.d.ts +21 -0
  252. package/dist/server/auth/oauth.js +579 -0
  253. package/dist/server/auth/service.d.ts +4 -0
  254. package/dist/server/auth/service.js +17 -0
  255. package/dist/server/identity.d.ts +2 -0
  256. package/dist/server/images.d.ts +12 -0
  257. package/dist/server/images.js +139 -0
  258. package/dist/server/index.d.ts +2 -0
  259. package/dist/server/index.js +2 -0
  260. package/dist/server/server.d.ts +4 -0
  261. package/dist/server/server.js +9 -1
  262. package/dist/settings/app-settings.d.ts +2 -0
  263. package/dist/settings/app-settings.js +518 -0
  264. package/dist/settings/company.js +3 -1
  265. package/dist/settings/index.d.ts +1 -0
  266. package/dist/settings/index.js +15 -0
  267. package/dist/settings/people.js +32 -6
  268. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  269. package/dist/settings/web/AppSettingsPage.js +210 -0
  270. package/dist/settings/web/CompaniesPage.js +2 -2
  271. package/dist/settings/web/CompanyPage.js +13 -2
  272. package/dist/settings/web/ConnectedAppsPage.d.ts +7 -0
  273. package/dist/settings/web/ConnectedAppsPage.js +33 -0
  274. package/dist/settings/web/OverviewPage.js +28 -4
  275. package/dist/settings/web/PeoplePage.js +23 -18
  276. package/dist/settings/web/ProfilePage.js +9 -7
  277. package/dist/settings/web/index.d.ts +2 -0
  278. package/dist/settings/web/index.js +8 -0
  279. package/dist/settings/web/messages.js +146 -2
  280. package/dist/stock/.kosh/bindings.d.ts +22 -0
  281. package/dist/stock/.kosh/bindings.js +15 -0
  282. package/dist/stock/.kosh/schema.d.ts +1147 -0
  283. package/dist/stock/demo.d.ts +7 -0
  284. package/dist/stock/demo.js +55 -0
  285. package/dist/stock/index.d.ts +3 -0
  286. package/dist/stock/index.js +674 -0
  287. package/dist/stock/module.d.ts +6330 -0
  288. package/dist/stock/module.js +1325 -0
  289. package/dist/stock/web/ScanBox.d.ts +8 -0
  290. package/dist/stock/web/ScanBox.js +90 -0
  291. package/dist/stock/web/index.d.ts +11 -0
  292. package/dist/stock/web/index.js +16 -0
  293. package/dist/stock/web/messages.d.ts +2 -0
  294. package/dist/stock/web/messages.js +25 -0
  295. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  296. package/dist/stock_account/.kosh/bindings.js +15 -0
  297. package/dist/stock_account/.kosh/schema.d.ts +1875 -0
  298. package/dist/stock_account/index.d.ts +3 -0
  299. package/dist/stock_account/index.js +130 -0
  300. package/dist/stock_account/module.d.ts +10655 -0
  301. package/dist/stock_account/module.js +339 -0
  302. package/dist/storage/attachments.d.ts +5 -0
  303. package/dist/storage/attachments.js +12 -1
  304. package/dist/storage/models.js +3 -0
  305. package/dist/storage/routes.js +13 -2
  306. package/dist/todo/.kosh/bindings.d.ts +22 -0
  307. package/dist/todo/.kosh/bindings.js +15 -0
  308. package/dist/todo/.kosh/schema.d.ts +732 -0
  309. package/dist/todo/demo.d.ts +6 -0
  310. package/dist/todo/demo.js +35 -0
  311. package/dist/todo/index.d.ts +3 -0
  312. package/dist/todo/index.js +187 -0
  313. package/dist/todo/module.d.ts +1180 -0
  314. package/dist/todo/module.js +130 -0
  315. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  316. package/dist/trade_finance/.kosh/bindings.js +15 -0
  317. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  318. package/dist/trade_finance/demo.d.ts +6 -0
  319. package/dist/trade_finance/demo.js +63 -0
  320. package/dist/trade_finance/index.d.ts +3 -0
  321. package/dist/trade_finance/index.js +413 -0
  322. package/dist/trade_finance/module.d.ts +3779 -0
  323. package/dist/trade_finance/module.js +505 -0
  324. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  325. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  326. package/dist/trade_finance_account/.kosh/schema.d.ts +1711 -0
  327. package/dist/trade_finance_account/index.d.ts +3 -0
  328. package/dist/trade_finance_account/index.js +92 -0
  329. package/dist/trade_finance_account/module.d.ts +7928 -0
  330. package/dist/trade_finance_account/module.js +244 -0
  331. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  332. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  333. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1153 -0
  334. package/dist/trade_finance_purchase/index.d.ts +8 -0
  335. package/dist/trade_finance_purchase/index.js +50 -0
  336. package/dist/trade_finance_purchase/module.d.ts +4252 -0
  337. package/dist/trade_finance_purchase/module.js +44 -0
  338. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  339. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  340. package/dist/trade_finance_sale/.kosh/schema.d.ts +1071 -0
  341. package/dist/trade_finance_sale/index.d.ts +8 -0
  342. package/dist/trade_finance_sale/index.js +50 -0
  343. package/dist/trade_finance_sale/module.d.ts +4280 -0
  344. package/dist/trade_finance_sale/module.js +44 -0
  345. package/dist/ui/api.d.ts +6 -1
  346. package/dist/ui/api.js +2 -1
  347. package/dist/ui/app.js +51 -17
  348. package/dist/ui/components/AppIcon.js +33 -1
  349. package/dist/ui/components/Avatar.d.ts +21 -0
  350. package/dist/ui/components/Avatar.js +71 -0
  351. package/dist/ui/components/primitives.d.ts +2 -0
  352. package/dist/ui/components/primitives.js +7 -1
  353. package/dist/ui/i18n/messages.d.ts +53 -0
  354. package/dist/ui/i18n/messages.js +98 -0
  355. package/dist/ui/index.d.ts +2 -0
  356. package/dist/ui/index.js +2 -0
  357. package/dist/ui/offline/queue.d.ts +5 -1
  358. package/dist/ui/offline/queue.js +2 -0
  359. package/dist/ui/registry.d.ts +12 -1
  360. package/dist/ui/registry.js +10 -1
  361. package/dist/ui/search/ViewTabs.d.ts +14 -0
  362. package/dist/ui/search/ViewTabs.js +42 -0
  363. package/dist/ui/shell/Consent.d.ts +5 -0
  364. package/dist/ui/shell/Consent.js +35 -0
  365. package/dist/ui/shell/Home.js +136 -16
  366. package/dist/ui/shell/Sidebar.js +15 -22
  367. package/dist/ui/views/FormView.js +98 -17
  368. package/dist/ui/views/KanbanView.d.ts +2 -0
  369. package/dist/ui/views/KanbanView.js +32 -3
  370. package/dist/ui/views/ListView.js +155 -31
  371. package/dist/ui/views/StatsRow.d.ts +14 -0
  372. package/dist/ui/views/StatsRow.js +88 -0
  373. package/dist/ui/views/widgets.d.ts +2 -1
  374. package/dist/ui/views/widgets.js +194 -1
  375. package/dist/views/builders.d.ts +19 -2
  376. package/dist/views/builders.js +21 -1
  377. package/dist/views/condition.d.ts +6 -0
  378. package/dist/views/condition.js +20 -0
  379. package/dist/views/documents.d.ts +8 -0
  380. package/dist/views/extend.d.ts +2 -2
  381. package/dist/views/extend.js +11 -1
  382. package/dist/views/index.d.ts +2 -2
  383. package/dist/views/index.js +2 -2
  384. package/dist/views/types.d.ts +52 -5
  385. package/dist/views/validate.js +39 -1
  386. package/dist/website/.kosh/bindings.d.ts +22 -0
  387. package/dist/website/.kosh/bindings.js +15 -0
  388. package/dist/website/.kosh/schema.d.ts +881 -0
  389. package/dist/website/demo.d.ts +6 -0
  390. package/dist/website/demo.js +115 -0
  391. package/dist/website/index.d.ts +9 -0
  392. package/dist/website/index.js +250 -0
  393. package/dist/website/module.d.ts +2987 -0
  394. package/dist/website/module.js +281 -0
  395. package/dist/website/render.d.ts +45 -0
  396. package/dist/website/render.js +102 -0
  397. package/dist/website/routes.d.ts +12 -0
  398. package/dist/website/routes.js +246 -0
  399. package/dist/website/web/PagePreview.d.ts +7 -0
  400. package/dist/website/web/PagePreview.js +33 -0
  401. package/dist/website/web/index.d.ts +11 -0
  402. package/dist/website/web/index.js +16 -0
  403. package/dist/website/web/messages.d.ts +2 -0
  404. package/dist/website/web/messages.js +15 -0
  405. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  406. package/dist/website_crm/.kosh/bindings.js +15 -0
  407. package/dist/website_crm/.kosh/schema.d.ts +966 -0
  408. package/dist/website_crm/index.d.ts +3 -0
  409. package/dist/website_crm/index.js +39 -0
  410. package/dist/website_crm/module.d.ts +2955 -0
  411. package/dist/website_crm/module.js +44 -0
  412. package/package.json +118 -1
@@ -161,6 +161,26 @@ export declare const SaleOrder: import("../server/orm.js").Model<"sale.order", {
161
161
  readonly hasDefault: false;
162
162
  readonly readonly: true;
163
163
  }>;
164
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
165
+ readonly required: false;
166
+ readonly computed: true;
167
+ readonly inverse: false;
168
+ readonly sequence: false;
169
+ readonly computeName: undefined;
170
+ readonly store: true;
171
+ readonly hasDefault: false;
172
+ readonly readonly: true;
173
+ }>;
174
+ readonly marginPercent: import("../server/orm.js").DecimalField<{
175
+ readonly required: false;
176
+ readonly computed: true;
177
+ readonly inverse: false;
178
+ readonly sequence: false;
179
+ readonly computeName: undefined;
180
+ readonly store: true;
181
+ readonly hasDefault: false;
182
+ readonly readonly: true;
183
+ }>;
164
184
  readonly state: import("../server/orm.js").StateField<"cancel" | "done" | "draft" | "sale" | "sent", {
165
185
  readonly send: {
166
186
  readonly from: readonly ["draft"];
@@ -318,6 +338,27 @@ export declare const SaleOrder: import("../server/orm.js").Model<"sale.order", {
318
338
  readonly hasDefault: false;
319
339
  readonly readonly: true;
320
340
  }>;
341
+ /** RFC 0022 step 2: what the order earns — the lines' untaxed amounts less their products' cost. */
342
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
343
+ readonly required: false;
344
+ readonly computed: true;
345
+ readonly inverse: false;
346
+ readonly sequence: false;
347
+ readonly computeName: undefined;
348
+ readonly store: true;
349
+ readonly hasDefault: false;
350
+ readonly readonly: true;
351
+ }>;
352
+ readonly marginPercent: import("../server/orm.js").DecimalField<{
353
+ readonly required: false;
354
+ readonly computed: true;
355
+ readonly inverse: false;
356
+ readonly sequence: false;
357
+ readonly computeName: undefined;
358
+ readonly store: true;
359
+ readonly hasDefault: false;
360
+ readonly readonly: true;
361
+ }>;
321
362
  readonly state: import("../server/orm.js").StateField<"cancel" | "done" | "draft" | "sale" | "sent", {
322
363
  readonly send: {
323
364
  readonly from: readonly ["draft"];
@@ -355,6 +396,29 @@ export declare const SaleOrder: import("../server/orm.js").Model<"sale.order", {
355
396
  sequence: false;
356
397
  }>;
357
398
  }>>;
399
+ /** The company's quotation settings (RFC 0020): how long quotations stay valid, and their default terms. */
400
+ export declare const CompanySales: import("../server/orm.js").Extension<"res.company", {
401
+ readonly saleValidityDays: import("../server/orm.js").ScalarField<"integer", number, number, {
402
+ readonly required: false;
403
+ readonly computed: false;
404
+ readonly inverse: false;
405
+ readonly sequence: false;
406
+ readonly computeName: undefined;
407
+ readonly store: true;
408
+ readonly hasDefault: true;
409
+ readonly readonly: false;
410
+ }>;
411
+ readonly saleTerms: import("../server/orm.js").ScalarField<"text", string, string, {
412
+ readonly required: false;
413
+ readonly computed: false;
414
+ readonly inverse: false;
415
+ readonly sequence: false;
416
+ readonly computeName: undefined;
417
+ readonly store: true;
418
+ readonly hasDefault: false;
419
+ readonly readonly: false;
420
+ }>;
421
+ }, Record<never, never>>;
358
422
  export declare const SaleOrderLine: import("../server/orm.js").Model<"sale.order.line", {
359
423
  readonly id: import("../server/orm.js").IdField<"sale.order.line">;
360
424
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
@@ -507,6 +571,16 @@ export declare const SaleOrderLine: import("../server/orm.js").Model<"sale.order
507
571
  readonly hasDefault: false;
508
572
  readonly readonly: true;
509
573
  }>;
574
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
575
+ readonly required: false;
576
+ readonly computed: true;
577
+ readonly inverse: false;
578
+ readonly sequence: false;
579
+ readonly computeName: undefined;
580
+ readonly store: true;
581
+ readonly hasDefault: false;
582
+ readonly readonly: true;
583
+ }>;
510
584
  readonly taxAmount: import("../server/orm.js").MonetaryField<"currency", {
511
585
  readonly required: false;
512
586
  readonly computed: true;
@@ -632,6 +706,17 @@ export declare const SaleOrderLine: import("../server/orm.js").Model<"sale.order
632
706
  readonly hasDefault: false;
633
707
  readonly readonly: true;
634
708
  }>;
709
+ /** The line's untaxed amount less its product's cost at the time (RFC 0022 step 2). */
710
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
711
+ readonly required: false;
712
+ readonly computed: true;
713
+ readonly inverse: false;
714
+ readonly sequence: false;
715
+ readonly computeName: undefined;
716
+ readonly store: true;
717
+ readonly hasDefault: false;
718
+ readonly readonly: true;
719
+ }>;
635
720
  readonly taxAmount: import("../server/orm.js").MonetaryField<"currency", {
636
721
  readonly required: false;
637
722
  readonly computed: true;
@@ -806,6 +891,26 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
806
891
  readonly hasDefault: false;
807
892
  readonly readonly: true;
808
893
  }>;
894
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
895
+ readonly required: false;
896
+ readonly computed: true;
897
+ readonly inverse: false;
898
+ readonly sequence: false;
899
+ readonly computeName: undefined;
900
+ readonly store: true;
901
+ readonly hasDefault: false;
902
+ readonly readonly: true;
903
+ }>;
904
+ readonly marginPercent: import("../server/orm.js").DecimalField<{
905
+ readonly required: false;
906
+ readonly computed: true;
907
+ readonly inverse: false;
908
+ readonly sequence: false;
909
+ readonly computeName: undefined;
910
+ readonly store: true;
911
+ readonly hasDefault: false;
912
+ readonly readonly: true;
913
+ }>;
809
914
  readonly state: import("../server/orm.js").StateField<"cancel" | "done" | "draft" | "sale" | "sent", {
810
915
  readonly send: {
811
916
  readonly from: readonly ["draft"];
@@ -963,6 +1068,27 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
963
1068
  readonly hasDefault: false;
964
1069
  readonly readonly: true;
965
1070
  }>;
1071
+ /** RFC 0022 step 2: what the order earns — the lines' untaxed amounts less their products' cost. */
1072
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
1073
+ readonly required: false;
1074
+ readonly computed: true;
1075
+ readonly inverse: false;
1076
+ readonly sequence: false;
1077
+ readonly computeName: undefined;
1078
+ readonly store: true;
1079
+ readonly hasDefault: false;
1080
+ readonly readonly: true;
1081
+ }>;
1082
+ readonly marginPercent: import("../server/orm.js").DecimalField<{
1083
+ readonly required: false;
1084
+ readonly computed: true;
1085
+ readonly inverse: false;
1086
+ readonly sequence: false;
1087
+ readonly computeName: undefined;
1088
+ readonly store: true;
1089
+ readonly hasDefault: false;
1090
+ readonly readonly: true;
1091
+ }>;
966
1092
  readonly state: import("../server/orm.js").StateField<"cancel" | "done" | "draft" | "sale" | "sent", {
967
1093
  readonly send: {
968
1094
  readonly from: readonly ["draft"];
@@ -1151,6 +1277,16 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1151
1277
  readonly hasDefault: false;
1152
1278
  readonly readonly: true;
1153
1279
  }>;
1280
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
1281
+ readonly required: false;
1282
+ readonly computed: true;
1283
+ readonly inverse: false;
1284
+ readonly sequence: false;
1285
+ readonly computeName: undefined;
1286
+ readonly store: true;
1287
+ readonly hasDefault: false;
1288
+ readonly readonly: true;
1289
+ }>;
1154
1290
  readonly taxAmount: import("../server/orm.js").MonetaryField<"currency", {
1155
1291
  readonly required: false;
1156
1292
  readonly computed: true;
@@ -1276,6 +1412,17 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1276
1412
  readonly hasDefault: false;
1277
1413
  readonly readonly: true;
1278
1414
  }>;
1415
+ /** The line's untaxed amount less its product's cost at the time (RFC 0022 step 2). */
1416
+ readonly margin: import("../server/orm.js").MonetaryField<"currency", {
1417
+ readonly required: false;
1418
+ readonly computed: true;
1419
+ readonly inverse: false;
1420
+ readonly sequence: false;
1421
+ readonly computeName: undefined;
1422
+ readonly store: true;
1423
+ readonly hasDefault: false;
1424
+ readonly readonly: true;
1425
+ }>;
1279
1426
  readonly taxAmount: import("../server/orm.js").MonetaryField<"currency", {
1280
1427
  readonly required: false;
1281
1428
  readonly computed: true;
@@ -1286,7 +1433,70 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1286
1433
  readonly hasDefault: false;
1287
1434
  readonly readonly: true;
1288
1435
  }>;
1289
- }>>], readonly [import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"res.partner", {
1436
+ }>>], readonly [import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"res.partner.tag", {
1437
+ readonly id: import("../server/orm.js").IdField<"res.partner.tag">;
1438
+ readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1439
+ required: true;
1440
+ readonly: true;
1441
+ computed: false;
1442
+ inverse: false;
1443
+ hasDefault: false;
1444
+ sequence: false;
1445
+ }>;
1446
+ readonly updatedAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1447
+ required: true;
1448
+ readonly: true;
1449
+ computed: false;
1450
+ inverse: false;
1451
+ hasDefault: false;
1452
+ sequence: false;
1453
+ }>;
1454
+ readonly createdBy: import("../server/orm.js").Many2oneField<'res.users', {
1455
+ required: false;
1456
+ readonly: true;
1457
+ computed: false;
1458
+ inverse: false;
1459
+ hasDefault: false;
1460
+ sequence: false;
1461
+ }>;
1462
+ readonly updatedBy: import("../server/orm.js").Many2oneField<'res.users', {
1463
+ required: false;
1464
+ readonly: true;
1465
+ computed: false;
1466
+ inverse: false;
1467
+ hasDefault: false;
1468
+ sequence: false;
1469
+ }>;
1470
+ readonly displayName: import("../server/orm.js").CharField<{
1471
+ required: true;
1472
+ readonly: true;
1473
+ computed: true;
1474
+ inverse: false;
1475
+ hasDefault: false;
1476
+ sequence: false;
1477
+ }>;
1478
+ readonly name: import("../server/orm.js").CharField<{
1479
+ readonly required: true;
1480
+ readonly computed: false;
1481
+ readonly inverse: false;
1482
+ readonly sequence: false;
1483
+ readonly computeName: undefined;
1484
+ readonly store: true;
1485
+ readonly hasDefault: false;
1486
+ readonly readonly: false;
1487
+ }, string>;
1488
+ }, {} & import("../server/orm.js").TransitionMethods<{
1489
+ readonly name: import("../server/orm.js").CharField<{
1490
+ readonly required: true;
1491
+ readonly computed: false;
1492
+ readonly inverse: false;
1493
+ readonly sequence: false;
1494
+ readonly computeName: undefined;
1495
+ readonly store: true;
1496
+ readonly hasDefault: false;
1497
+ readonly readonly: false;
1498
+ }, string>;
1499
+ }>>, import("../server/orm.js").Model<"res.partner", {
1290
1500
  readonly id: import("../server/orm.js").IdField<"res.partner">;
1291
1501
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1292
1502
  required: true;
@@ -1340,6 +1550,46 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1340
1550
  readonly hasDefault: false;
1341
1551
  readonly readonly: false;
1342
1552
  }, string>;
1553
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
1554
+ readonly required: false;
1555
+ readonly computed: false;
1556
+ readonly inverse: false;
1557
+ readonly sequence: false;
1558
+ readonly computeName: undefined;
1559
+ readonly store: true;
1560
+ readonly hasDefault: false;
1561
+ readonly readonly: false;
1562
+ }>;
1563
+ readonly tags: import("../server/orm.js").Many2manyField<"res.partner.tag", {
1564
+ readonly required: true;
1565
+ readonly computed: false;
1566
+ readonly inverse: false;
1567
+ readonly sequence: false;
1568
+ readonly computeName: undefined;
1569
+ readonly store: true;
1570
+ readonly hasDefault: true;
1571
+ readonly readonly: false;
1572
+ }>;
1573
+ readonly latitude: import("../server/orm.js").DecimalField<{
1574
+ readonly required: false;
1575
+ readonly computed: false;
1576
+ readonly inverse: false;
1577
+ readonly sequence: false;
1578
+ readonly computeName: undefined;
1579
+ readonly store: true;
1580
+ readonly hasDefault: false;
1581
+ readonly readonly: false;
1582
+ }>;
1583
+ readonly longitude: import("../server/orm.js").DecimalField<{
1584
+ readonly required: false;
1585
+ readonly computed: false;
1586
+ readonly inverse: false;
1587
+ readonly sequence: false;
1588
+ readonly computeName: undefined;
1589
+ readonly store: true;
1590
+ readonly hasDefault: false;
1591
+ readonly readonly: false;
1592
+ }>;
1343
1593
  readonly isCompany: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1344
1594
  readonly required: true;
1345
1595
  readonly computed: false;
@@ -1521,6 +1771,46 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1521
1771
  readonly hasDefault: false;
1522
1772
  readonly readonly: false;
1523
1773
  }, string>;
1774
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
1775
+ readonly required: false;
1776
+ readonly computed: false;
1777
+ readonly inverse: false;
1778
+ readonly sequence: false;
1779
+ readonly computeName: undefined;
1780
+ readonly store: true;
1781
+ readonly hasDefault: false;
1782
+ readonly readonly: false;
1783
+ }>;
1784
+ readonly tags: import("../server/orm.js").Many2manyField<"res.partner.tag", {
1785
+ readonly required: true;
1786
+ readonly computed: false;
1787
+ readonly inverse: false;
1788
+ readonly sequence: false;
1789
+ readonly computeName: undefined;
1790
+ readonly store: true;
1791
+ readonly hasDefault: true;
1792
+ readonly readonly: false;
1793
+ }>;
1794
+ readonly latitude: import("../server/orm.js").DecimalField<{
1795
+ readonly required: false;
1796
+ readonly computed: false;
1797
+ readonly inverse: false;
1798
+ readonly sequence: false;
1799
+ readonly computeName: undefined;
1800
+ readonly store: true;
1801
+ readonly hasDefault: false;
1802
+ readonly readonly: false;
1803
+ }>;
1804
+ readonly longitude: import("../server/orm.js").DecimalField<{
1805
+ readonly required: false;
1806
+ readonly computed: false;
1807
+ readonly inverse: false;
1808
+ readonly sequence: false;
1809
+ readonly computeName: undefined;
1810
+ readonly store: true;
1811
+ readonly hasDefault: false;
1812
+ readonly readonly: false;
1813
+ }>;
1524
1814
  readonly isCompany: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1525
1815
  readonly required: true;
1526
1816
  readonly computed: false;
@@ -1691,7 +1981,28 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
1691
1981
  readonly hasDefault: false;
1692
1982
  readonly readonly: false;
1693
1983
  }>;
1694
- }>>], 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", {
1984
+ }>>], 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", {
1985
+ readonly contactTaxIdRequired: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1986
+ readonly required: true;
1987
+ readonly computed: false;
1988
+ readonly inverse: false;
1989
+ readonly sequence: false;
1990
+ readonly computeName: undefined;
1991
+ readonly store: true;
1992
+ readonly hasDefault: true;
1993
+ readonly readonly: false;
1994
+ }>;
1995
+ readonly contactUniqueEmail: import("../server/orm.js").ScalarField<"boolean", boolean, boolean, {
1996
+ readonly required: true;
1997
+ readonly computed: false;
1998
+ readonly inverse: false;
1999
+ readonly sequence: false;
2000
+ readonly computeName: undefined;
2001
+ readonly store: true;
2002
+ readonly hasDefault: true;
2003
+ readonly readonly: false;
2004
+ }>;
2005
+ }, Record<never, never>>]>, import("../server/orm.js").Module<readonly [import("../server/orm.js").Model<"uom.uom", {
1695
2006
  readonly id: import("../server/orm.js").IdField<"uom.uom">;
1696
2007
  readonly createdAt: import("../server/orm.js").ScalarField<'datetime', Date, Date, {
1697
2008
  required: true;
@@ -2225,6 +2536,16 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
2225
2536
  readonly hasDefault: false;
2226
2537
  readonly readonly: false;
2227
2538
  }, string>;
2539
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
2540
+ readonly required: false;
2541
+ readonly computed: false;
2542
+ readonly inverse: false;
2543
+ readonly sequence: false;
2544
+ readonly computeName: undefined;
2545
+ readonly store: true;
2546
+ readonly hasDefault: false;
2547
+ readonly readonly: false;
2548
+ }>;
2228
2549
  readonly listPrice: import("../server/orm.js").DecimalField<{
2229
2550
  readonly required: true;
2230
2551
  readonly computed: false;
@@ -2376,6 +2697,16 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
2376
2697
  readonly hasDefault: false;
2377
2698
  readonly readonly: false;
2378
2699
  }, string>;
2700
+ readonly image: import("../server/orm.js").Many2oneField<"storage.attachment", {
2701
+ readonly required: false;
2702
+ readonly computed: false;
2703
+ readonly inverse: false;
2704
+ readonly sequence: false;
2705
+ readonly computeName: undefined;
2706
+ readonly store: true;
2707
+ readonly hasDefault: false;
2708
+ readonly readonly: false;
2709
+ }>;
2379
2710
  readonly listPrice: import("../server/orm.js").DecimalField<{
2380
2711
  readonly required: true;
2381
2712
  readonly computed: false;
@@ -2466,4 +2797,25 @@ export declare const salesShutro: import("../server/orm.js").Module<readonly [im
2466
2797
  readonly hasDefault: false;
2467
2798
  readonly readonly: false;
2468
2799
  }>;
2469
- }>>], 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[]>], readonly []>;
2800
+ }>>], 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[]>], readonly [import("../server/orm.js").Extension<"res.company", {
2801
+ readonly saleValidityDays: import("../server/orm.js").ScalarField<"integer", number, number, {
2802
+ readonly required: false;
2803
+ readonly computed: false;
2804
+ readonly inverse: false;
2805
+ readonly sequence: false;
2806
+ readonly computeName: undefined;
2807
+ readonly store: true;
2808
+ readonly hasDefault: true;
2809
+ readonly readonly: false;
2810
+ }>;
2811
+ readonly saleTerms: import("../server/orm.js").ScalarField<"text", string, string, {
2812
+ readonly required: false;
2813
+ readonly computed: false;
2814
+ readonly inverse: false;
2815
+ readonly sequence: false;
2816
+ readonly computeName: undefined;
2817
+ readonly store: true;
2818
+ readonly hasDefault: false;
2819
+ readonly readonly: false;
2820
+ }>;
2821
+ }, Record<never, never>>]>;
@@ -7,12 +7,20 @@ import { contactsShutro } from '../contacts/index.js';
7
7
  import { messagingShutro } from '../messaging/index.js';
8
8
  import { computeTaxes, productShutro, taxRule } from '../product/index.js';
9
9
  import { orm } from '../server/orm.js';
10
- import { check, compute, defineModel, defineModule, f, onchange, records, } from './.kosh/bindings.js';
10
+ import { check, compute, defineModel, defineModule, extendModel, f, onchange, records, } from './.kosh/bindings.js';
11
11
  /** A line's taxes through the engine (RFC 0016): its amount after discount, its taxes in order. */
12
12
  function taxesOf(l) {
13
13
  const amount = l.quantity.times(l.priceUnit).times(orm.toDecimal(100).minus(l.discount)).div(100);
14
14
  return computeTaxes(amount, l.quantity, [...l.taxes].map(taxRule));
15
15
  }
16
+ /** A monetary value's amount (a Money object or a plain Decimal), or null. */
17
+ function amountOf(value) {
18
+ if (value === null || value === undefined)
19
+ return null;
20
+ if (typeof value === 'object' && 'amount' in value)
21
+ return value.amount;
22
+ return value;
23
+ }
16
24
  const amounts = compute('sale.order', ['amountUntaxed', 'amountTax', 'amountTotal'], ['lines.subtotal', 'lines.taxAmount'], (orders) => {
17
25
  for (const o of orders) {
18
26
  // A new order has no currency until its partner is chosen: no amounts yet.
@@ -64,6 +72,31 @@ export const SaleOrder = defineModel('sale.order', {
64
72
  amountUntaxed: f.monetary({ currency: 'currency', store: true, label: 'Untaxed', ...amounts }),
65
73
  amountTax: f.monetary({ currency: 'currency', store: true, label: 'Taxes', ...amounts }),
66
74
  amountTotal: f.monetary({ currency: 'currency', store: true, label: 'Total', ...amounts }),
75
+ /** RFC 0022 step 2: what the order earns — the lines' untaxed amounts less their products' cost. */
76
+ margin: f.monetary({
77
+ currency: 'currency',
78
+ store: true,
79
+ label: 'Margin',
80
+ ...compute('sale.order', 'margin', ['lines.margin', 'currency'], (orders) => {
81
+ for (const o of orders)
82
+ o.margin = o.currency === null ? null : o.lines.sum('margin', o.currency);
83
+ }),
84
+ }),
85
+ marginPercent: f.decimal({
86
+ scale: 1,
87
+ store: true,
88
+ label: 'Margin (%)',
89
+ ...compute('sale.order', 'marginPercent', ['margin', 'amountUntaxed'], (orders) => {
90
+ for (const o of orders) {
91
+ const untaxed = amountOf(o.amountUntaxed);
92
+ const margin = amountOf(o.margin);
93
+ o.marginPercent =
94
+ untaxed === null || margin === null || untaxed.isZero()
95
+ ? null
96
+ : margin.times(100).div(untaxed).toDecimalPlaces(1);
97
+ }
98
+ }),
99
+ }),
67
100
  state: f.state({
68
101
  states: {
69
102
  draft: 'Quotation',
@@ -98,8 +131,9 @@ export const SaleOrder = defineModel('sale.order', {
98
131
  }),
99
132
  },
100
133
  onchange: {
101
- // The customer's currency, else the company's.
134
+ // The customer's currency, else the company's; an empty validity and terms from the company's settings.
102
135
  partner: onchange('sale.order', async (d, env) => {
136
+ await quotationDefaults(d, env);
103
137
  const p = await d.record('partner');
104
138
  if (p?.currency) {
105
139
  d.set('currency', p.currency.id);
@@ -112,8 +146,33 @@ export const SaleOrder = defineModel('sale.order', {
112
146
  if (company !== undefined)
113
147
  d.set('currency', company.currency.id);
114
148
  }),
149
+ // A new order date moves the validity with it.
150
+ dateOrder: onchange('sale.order', async (d, env) => {
151
+ d.set('validityDate', null);
152
+ await quotationDefaults(d, env);
153
+ }),
115
154
  },
116
155
  });
156
+ /** The company's quotation settings (RFC 0020): how long quotations stay valid, and their default terms. */
157
+ export const CompanySales = extendModel('res.company', {
158
+ fields: {
159
+ saleValidityDays: f.integer({ default: 30, label: 'Quotations valid for (days, 0: no limit)' }),
160
+ saleTerms: f.text({ label: 'Default terms and conditions' }),
161
+ },
162
+ });
163
+ /** Fills an order's empty validity and terms from its company's settings. */
164
+ async function quotationDefaults(d, env) {
165
+ const [company] = (await env.model('res.company').browse([env.companyId]).load(['saleValidityDays', 'saleTerms'])).read(['saleValidityDays', 'saleTerms']);
166
+ const days = Number(company?.['saleValidityDays'] ?? 0);
167
+ const date = d.get('dateOrder');
168
+ if ((d.get('validityDate') ?? null) === null && days > 0 && typeof date === 'string') {
169
+ const [y, m, day] = date.split('-').map(Number);
170
+ d.set('validityDate', new Date(Date.UTC(y, m - 1, day + days)).toISOString().slice(0, 10));
171
+ }
172
+ const terms = company?.['saleTerms'];
173
+ if ((d.get('note') ?? '') === '' && typeof terms === 'string' && terms !== '')
174
+ d.set('note', terms);
175
+ }
117
176
  export const SaleOrderLine = defineModel('sale.order.line', {
118
177
  label: 'Order line',
119
178
  access: {
@@ -160,6 +219,21 @@ export const SaleOrderLine = defineModel('sale.order.line', {
160
219
  l.subtotal = taxesOf(l).untaxed;
161
220
  }),
162
221
  }),
222
+ /** The line's untaxed amount less its product's cost at the time (RFC 0022 step 2). */
223
+ margin: f.monetary({
224
+ currency: 'currency',
225
+ store: true,
226
+ label: 'Margin',
227
+ ...compute('sale.order.line', 'margin', ['subtotal', 'quantity', 'product.standardPrice'], (lines) => {
228
+ for (const l of lines) {
229
+ const untaxed = amountOf(l.subtotal);
230
+ l.margin =
231
+ untaxed === null || l.product === null
232
+ ? null
233
+ : untaxed.minus(l.quantity.times(l.product.standardPrice));
234
+ }
235
+ }),
236
+ }),
163
237
  taxAmount: f.monetary({
164
238
  currency: 'currency',
165
239
  store: true,
@@ -207,7 +281,7 @@ export const SaleOrderLine = defineModel('sale.order.line', {
207
281
  });
208
282
  export const salesShutro = defineModule({
209
283
  name: 'sales',
210
- version: '0.2.0',
284
+ version: '0.3.0',
211
285
  migrations: [
212
286
  {
213
287
  version: '0.2.0',
@@ -231,4 +305,5 @@ export const salesShutro = defineModule({
231
305
  orm.defineSequence({ code: 'sale.order', prefix: 'SO/{year}/', padding: 5, reset: 'yearly' }),
232
306
  ],
233
307
  models: [SaleOrder, SaleOrderLine],
308
+ extensions: [CompanySales],
234
309
  });
@@ -20,6 +20,8 @@ export interface ApiField {
20
20
  /** `[value, label]` for selection and state fields with a static list. */
21
21
  readonly options: readonly (readonly [string, string])[] | null;
22
22
  readonly translate: boolean;
23
+ /** The field's help text, for hints on forms (RFC 0022 §3.4). */
24
+ readonly help: string | null;
23
25
  }
24
26
  /** A state transition. */
25
27
  export interface TransitionSpec {
@@ -29,6 +31,9 @@ export interface TransitionSpec {
29
31
  readonly to: string;
30
32
  /** A feature permission the user needs (`definePermission`), or `null`. */
31
33
  readonly requires: string | null;
34
+ /** The transition's guard (the records that may not go) and the message when it refuses (RFC 0022 §3.4). */
35
+ readonly guard: ((records: unknown) => unknown) | null;
36
+ readonly message: string | null;
32
37
  }
33
38
  /** One model as the API exposes it. */
34
39
  export interface ApiModel {
@@ -34,6 +34,10 @@ export function apiModels(registry) {
34
34
  from: Array.isArray(spec['from']) ? spec['from'] : [],
35
35
  to: String(spec['to'] ?? ''),
36
36
  requires: typeof spec['requires'] === 'string' ? spec['requires'] : null,
37
+ guard: typeof spec['guard'] === 'function'
38
+ ? spec['guard']
39
+ : null,
40
+ message: typeof spec['message'] === 'string' ? spec['message'] : null,
37
41
  });
38
42
  }
39
43
  const computedReadonly = d.computed && raw['inverse'] === undefined;
@@ -41,6 +45,7 @@ export function apiModels(registry) {
41
45
  key,
42
46
  kind: d.kind,
43
47
  label: d.label,
48
+ help: d.help ?? null,
44
49
  required: d.required,
45
50
  readonly: d.readonly || computedReadonly || IMPLICIT_READONLY.has(key) || d.kind === 'state',
46
51
  stored: d.column !== null,