shutro-erp 0.3.4 → 0.3.6

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 (618) hide show
  1. package/dist/account_asset/.kosh/bindings.d.ts +22 -0
  2. package/dist/account_asset/.kosh/bindings.js +15 -0
  3. package/dist/account_asset/.kosh/schema.d.ts +1755 -0
  4. package/dist/account_asset/board.d.ts +61 -0
  5. package/dist/account_asset/board.js +86 -0
  6. package/dist/account_asset/books.d.ts +42 -0
  7. package/dist/account_asset/books.js +398 -0
  8. package/dist/account_asset/demo.d.ts +7 -0
  9. package/dist/account_asset/demo.js +72 -0
  10. package/dist/account_asset/index.d.ts +9 -0
  11. package/dist/account_asset/index.js +335 -0
  12. package/dist/account_asset/module.d.ts +7622 -0
  13. package/dist/account_asset/module.js +230 -0
  14. package/dist/account_budget/.kosh/bindings.d.ts +22 -0
  15. package/dist/account_budget/.kosh/bindings.js +15 -0
  16. package/dist/account_budget/.kosh/schema.d.ts +1767 -0
  17. package/dist/account_budget/budget.d.ts +5 -0
  18. package/dist/account_budget/budget.js +142 -0
  19. package/dist/account_budget/demo.d.ts +6 -0
  20. package/dist/account_budget/demo.js +30 -0
  21. package/dist/account_budget/index.d.ts +4 -0
  22. package/dist/account_budget/index.js +223 -0
  23. package/dist/account_budget/module.d.ts +13863 -0
  24. package/dist/account_budget/module.js +167 -0
  25. package/dist/account_portal/.kosh/bindings.js +1 -1
  26. package/dist/account_portal/.kosh/schema.d.ts +176 -6
  27. package/dist/account_portal/module.d.ts +505 -6
  28. package/dist/accounting/.kosh/bindings.js +1 -1
  29. package/dist/accounting/.kosh/schema.d.ts +176 -6
  30. package/dist/accounting/index.d.ts +1 -1
  31. package/dist/accounting/index.js +344 -4
  32. package/dist/accounting/module.d.ts +513 -5
  33. package/dist/accounting/module.js +55 -3
  34. package/dist/approvals/.kosh/bindings.d.ts +22 -0
  35. package/dist/approvals/.kosh/bindings.js +15 -0
  36. package/dist/approvals/.kosh/schema.d.ts +611 -0
  37. package/dist/approvals/index.d.ts +18 -0
  38. package/dist/approvals/index.js +302 -0
  39. package/dist/approvals/mails.d.ts +25 -0
  40. package/dist/approvals/mails.js +82 -0
  41. package/dist/approvals/module.d.ts +1 -0
  42. package/dist/approvals/module.js +12 -0
  43. package/dist/approvals/web/History.d.ts +4 -0
  44. package/dist/approvals/web/History.js +13 -0
  45. package/dist/approvals/web/Inbox.d.ts +9 -0
  46. package/dist/approvals/web/Inbox.js +114 -0
  47. package/dist/approvals/web/Mine.d.ts +7 -0
  48. package/dist/approvals/web/Mine.js +27 -0
  49. package/dist/approvals/web/index.d.ts +13 -0
  50. package/dist/approvals/web/index.js +22 -0
  51. package/dist/approvals/web/messages.d.ts +2 -0
  52. package/dist/approvals/web/messages.js +119 -0
  53. package/dist/approvals/web/shared.d.ts +59 -0
  54. package/dist/approvals/web/shared.js +46 -0
  55. package/dist/attendance/.kosh/bindings.d.ts +22 -0
  56. package/dist/attendance/.kosh/bindings.js +15 -0
  57. package/dist/attendance/.kosh/schema.d.ts +1048 -0
  58. package/dist/attendance/days.d.ts +96 -0
  59. package/dist/attendance/days.js +430 -0
  60. package/dist/attendance/demo.d.ts +7 -0
  61. package/dist/attendance/demo.js +58 -0
  62. package/dist/attendance/index.d.ts +4 -0
  63. package/dist/attendance/index.js +513 -0
  64. package/dist/attendance/module.d.ts +3969 -0
  65. package/dist/attendance/module.js +412 -0
  66. package/dist/attendance/routes.d.ts +16 -0
  67. package/dist/attendance/routes.js +266 -0
  68. package/dist/attendance/web/Check.d.ts +8 -0
  69. package/dist/attendance/web/Check.js +40 -0
  70. package/dist/attendance/web/Kiosk.d.ts +8 -0
  71. package/dist/attendance/web/Kiosk.js +62 -0
  72. package/dist/attendance/web/PinButton.d.ts +7 -0
  73. package/dist/attendance/web/PinButton.js +29 -0
  74. package/dist/attendance/web/index.d.ts +13 -0
  75. package/dist/attendance/web/index.js +22 -0
  76. package/dist/attendance/web/messages.d.ts +2 -0
  77. package/dist/attendance/web/messages.js +61 -0
  78. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  79. package/dist/calendar/.kosh/bindings.js +15 -0
  80. package/dist/calendar/.kosh/schema.d.ts +795 -0
  81. package/dist/calendar/demo.d.ts +6 -0
  82. package/dist/calendar/demo.js +24 -0
  83. package/dist/calendar/index.d.ts +3 -0
  84. package/dist/calendar/index.js +291 -0
  85. package/dist/calendar/module.d.ts +1705 -0
  86. package/dist/calendar/module.js +180 -0
  87. package/dist/cli/init.js +80 -0
  88. package/dist/cli/templates.d.ts +1 -1
  89. package/dist/cli/templates.js +226 -0
  90. package/dist/contacts/.kosh/bindings.js +1 -1
  91. package/dist/contacts/.kosh/schema.d.ts +78 -3
  92. package/dist/contacts/demo.js +30 -1
  93. package/dist/contacts/index.d.ts +1 -1
  94. package/dist/contacts/index.js +155 -9
  95. package/dist/contacts/module.d.ts +338 -2
  96. package/dist/contacts/module.js +93 -5
  97. package/dist/crm/.kosh/bindings.d.ts +22 -0
  98. package/dist/crm/.kosh/bindings.js +15 -0
  99. package/dist/crm/.kosh/schema.d.ts +800 -0
  100. package/dist/crm/demo.d.ts +6 -0
  101. package/dist/crm/demo.js +45 -0
  102. package/dist/crm/index.d.ts +3 -0
  103. package/dist/crm/index.js +361 -0
  104. package/dist/crm/module.d.ts +1845 -0
  105. package/dist/crm/module.js +208 -0
  106. package/dist/documents/.kosh/bindings.d.ts +22 -0
  107. package/dist/documents/.kosh/bindings.js +15 -0
  108. package/dist/documents/.kosh/schema.d.ts +862 -0
  109. package/dist/documents/demo.d.ts +6 -0
  110. package/dist/documents/demo.js +22 -0
  111. package/dist/documents/documents.d.ts +98 -0
  112. package/dist/documents/documents.js +318 -0
  113. package/dist/documents/index.d.ts +30 -0
  114. package/dist/documents/index.js +442 -0
  115. package/dist/documents/module.d.ts +2781 -0
  116. package/dist/documents/module.js +214 -0
  117. package/dist/documents/web/Versions.d.ts +7 -0
  118. package/dist/documents/web/Versions.js +45 -0
  119. package/dist/documents/web/index.d.ts +11 -0
  120. package/dist/documents/web/index.js +16 -0
  121. package/dist/documents/web/messages.d.ts +2 -0
  122. package/dist/documents/web/messages.js +21 -0
  123. package/dist/event/.kosh/bindings.d.ts +22 -0
  124. package/dist/event/.kosh/bindings.js +15 -0
  125. package/dist/event/.kosh/schema.d.ts +843 -0
  126. package/dist/event/demo.d.ts +6 -0
  127. package/dist/event/demo.js +65 -0
  128. package/dist/event/index.d.ts +14 -0
  129. package/dist/event/index.js +333 -0
  130. package/dist/event/mails.d.ts +15 -0
  131. package/dist/event/mails.js +112 -0
  132. package/dist/event/module.d.ts +2800 -0
  133. package/dist/event/module.js +323 -0
  134. package/dist/event/web/CheckInBox.d.ts +9 -0
  135. package/dist/event/web/CheckInBox.js +87 -0
  136. package/dist/event/web/index.d.ts +11 -0
  137. package/dist/event/web/index.js +16 -0
  138. package/dist/event/web/messages.d.ts +2 -0
  139. package/dist/event/web/messages.js +23 -0
  140. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  141. package/dist/event_account/.kosh/bindings.js +15 -0
  142. package/dist/event_account/.kosh/schema.d.ts +1758 -0
  143. package/dist/event_account/index.d.ts +3 -0
  144. package/dist/event_account/index.js +28 -0
  145. package/dist/event_account/module.d.ts +7114 -0
  146. package/dist/event_account/module.js +90 -0
  147. package/dist/expense/.kosh/bindings.d.ts +22 -0
  148. package/dist/expense/.kosh/bindings.js +15 -0
  149. package/dist/expense/.kosh/schema.d.ts +1299 -0
  150. package/dist/expense/demo.d.ts +7 -0
  151. package/dist/expense/demo.js +69 -0
  152. package/dist/expense/index.d.ts +3 -0
  153. package/dist/expense/index.js +495 -0
  154. package/dist/expense/module.d.ts +4747 -0
  155. package/dist/expense/module.js +647 -0
  156. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  157. package/dist/expense_account/.kosh/bindings.js +15 -0
  158. package/dist/expense_account/.kosh/schema.d.ts +1936 -0
  159. package/dist/expense_account/index.d.ts +3 -0
  160. package/dist/expense_account/index.js +74 -0
  161. package/dist/expense_account/module.d.ts +9153 -0
  162. package/dist/expense_account/module.js +318 -0
  163. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  164. package/dist/helpdesk/.kosh/bindings.js +15 -0
  165. package/dist/helpdesk/.kosh/schema.d.ts +885 -0
  166. package/dist/helpdesk/demo.d.ts +7 -0
  167. package/dist/helpdesk/demo.js +65 -0
  168. package/dist/helpdesk/hours.d.ts +17 -0
  169. package/dist/helpdesk/hours.js +94 -0
  170. package/dist/helpdesk/index.d.ts +10 -0
  171. package/dist/helpdesk/index.js +461 -0
  172. package/dist/helpdesk/module.d.ts +2940 -0
  173. package/dist/helpdesk/module.js +326 -0
  174. package/dist/helpdesk/routes.d.ts +12 -0
  175. package/dist/helpdesk/routes.js +132 -0
  176. package/dist/helpdesk/sla.d.ts +37 -0
  177. package/dist/helpdesk/sla.js +226 -0
  178. package/dist/hr/.kosh/bindings.d.ts +22 -0
  179. package/dist/hr/.kosh/bindings.js +15 -0
  180. package/dist/hr/.kosh/schema.d.ts +878 -0
  181. package/dist/hr/demo.d.ts +6 -0
  182. package/dist/hr/demo.js +60 -0
  183. package/dist/hr/index.d.ts +3 -0
  184. package/dist/hr/index.js +483 -0
  185. package/dist/hr/module.d.ts +2611 -0
  186. package/dist/hr/module.js +350 -0
  187. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  188. package/dist/l10n_bd/.kosh/schema.d.ts +176 -6
  189. package/dist/l10n_bd/module.d.ts +505 -6
  190. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  191. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  192. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2312 -0
  193. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  194. package/dist/l10n_bd_payroll/data.js +347 -0
  195. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  196. package/dist/l10n_bd_payroll/index.js +24 -0
  197. package/dist/l10n_bd_payroll/module.d.ts +12932 -0
  198. package/dist/l10n_bd_payroll/module.js +86 -0
  199. package/dist/l10n_in/.kosh/bindings.js +1 -1
  200. package/dist/l10n_in/.kosh/schema.d.ts +176 -6
  201. package/dist/l10n_in/module.d.ts +527 -7
  202. package/dist/mail/inbound/handle.js +6 -1
  203. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  204. package/dist/maintenance/.kosh/bindings.js +15 -0
  205. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  206. package/dist/maintenance/demo.d.ts +6 -0
  207. package/dist/maintenance/demo.js +60 -0
  208. package/dist/maintenance/index.d.ts +3 -0
  209. package/dist/maintenance/index.js +422 -0
  210. package/dist/maintenance/module.d.ts +3545 -0
  211. package/dist/maintenance/module.js +446 -0
  212. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  213. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  214. package/dist/maintenance_stock/.kosh/schema.d.ts +1446 -0
  215. package/dist/maintenance_stock/index.d.ts +9 -0
  216. package/dist/maintenance_stock/index.js +52 -0
  217. package/dist/maintenance_stock/module.d.ts +7675 -0
  218. package/dist/maintenance_stock/module.js +192 -0
  219. package/dist/modules-sdk/index.d.ts +1 -1
  220. package/dist/modules-sdk/manifest.d.ts +109 -2
  221. package/dist/modules-sdk/manifest.js +35 -1
  222. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  223. package/dist/mrp/.kosh/bindings.js +15 -0
  224. package/dist/mrp/.kosh/schema.d.ts +1453 -0
  225. package/dist/mrp/demo.d.ts +7 -0
  226. package/dist/mrp/demo.js +42 -0
  227. package/dist/mrp/index.d.ts +3 -0
  228. package/dist/mrp/index.js +393 -0
  229. package/dist/mrp/module.d.ts +9335 -0
  230. package/dist/mrp/module.js +757 -0
  231. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  232. package/dist/mrp_account/.kosh/bindings.js +15 -0
  233. package/dist/mrp_account/.kosh/schema.d.ts +2299 -0
  234. package/dist/mrp_account/index.d.ts +3 -0
  235. package/dist/mrp_account/index.js +22 -0
  236. package/dist/mrp_account/module.d.ts +23151 -0
  237. package/dist/mrp_account/module.js +123 -0
  238. package/dist/payment/.kosh/bindings.js +1 -1
  239. package/dist/payment/.kosh/schema.d.ts +178 -7
  240. package/dist/payment/index.d.ts +41 -0
  241. package/dist/payment/index.js +131 -74
  242. package/dist/payment/module.d.ts +569 -12
  243. package/dist/payment/module.js +19 -3
  244. package/dist/payment/settle.js +10 -1
  245. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  246. package/dist/payroll/.kosh/bindings.js +15 -0
  247. package/dist/payroll/.kosh/schema.d.ts +1390 -0
  248. package/dist/payroll/compute.d.ts +35 -0
  249. package/dist/payroll/compute.js +398 -0
  250. package/dist/payroll/demo.d.ts +55 -0
  251. package/dist/payroll/demo.js +121 -0
  252. package/dist/payroll/formula.d.ts +62 -0
  253. package/dist/payroll/formula.js +320 -0
  254. package/dist/payroll/index.d.ts +230 -0
  255. package/dist/payroll/index.js +713 -0
  256. package/dist/payroll/module.d.ts +9390 -0
  257. package/dist/payroll/module.js +606 -0
  258. package/dist/payroll/routes.d.ts +10 -0
  259. package/dist/payroll/routes.js +112 -0
  260. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  261. package/dist/payroll_account/.kosh/bindings.js +15 -0
  262. package/dist/payroll_account/.kosh/schema.d.ts +2308 -0
  263. package/dist/payroll_account/index.d.ts +3 -0
  264. package/dist/payroll_account/index.js +40 -0
  265. package/dist/payroll_account/module.d.ts +12396 -0
  266. package/dist/payroll_account/module.js +256 -0
  267. package/dist/permissions/approvals.d.ts +131 -9
  268. package/dist/permissions/approvals.js +662 -57
  269. package/dist/permissions/index.d.ts +1 -1
  270. package/dist/permissions/index.js +2 -2
  271. package/dist/permissions/models.js +191 -12
  272. package/dist/permissions/routes.d.ts +6 -1
  273. package/dist/permissions/routes.js +37 -4
  274. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  275. package/dist/permissions/web/ApprovalPanel.js +39 -13
  276. package/dist/permissions/web/index.d.ts +6 -4
  277. package/dist/permissions/web/index.js +13 -4
  278. package/dist/permissions/web/messages.d.ts +2 -0
  279. package/dist/permissions/web/messages.js +43 -0
  280. package/dist/portal/.kosh/bindings.js +1 -1
  281. package/dist/portal/.kosh/schema.d.ts +78 -3
  282. package/dist/portal/index.js +1 -1
  283. package/dist/portal/module.d.ts +166 -2
  284. package/dist/pos/.kosh/bindings.d.ts +22 -0
  285. package/dist/pos/.kosh/bindings.js +15 -0
  286. package/dist/pos/.kosh/schema.d.ts +1809 -0
  287. package/dist/pos/accounting.d.ts +10 -0
  288. package/dist/pos/accounting.js +149 -0
  289. package/dist/pos/demo.d.ts +6 -0
  290. package/dist/pos/demo.js +90 -0
  291. package/dist/pos/index.d.ts +9 -0
  292. package/dist/pos/index.js +353 -0
  293. package/dist/pos/module.d.ts +9783 -0
  294. package/dist/pos/module.js +423 -0
  295. package/dist/pos/routes.d.ts +39 -0
  296. package/dist/pos/routes.js +368 -0
  297. package/dist/pos/web/Register.d.ts +9 -0
  298. package/dist/pos/web/Register.js +252 -0
  299. package/dist/pos/web/index.d.ts +11 -0
  300. package/dist/pos/web/index.js +16 -0
  301. package/dist/pos/web/messages.d.ts +2 -0
  302. package/dist/pos/web/messages.js +87 -0
  303. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  304. package/dist/pos_stock/.kosh/bindings.js +15 -0
  305. package/dist/pos_stock/.kosh/schema.d.ts +2208 -0
  306. package/dist/pos_stock/index.d.ts +9 -0
  307. package/dist/pos_stock/index.js +35 -0
  308. package/dist/pos_stock/module.d.ts +12803 -0
  309. package/dist/pos_stock/module.js +115 -0
  310. package/dist/product/.kosh/bindings.js +1 -1
  311. package/dist/product/.kosh/schema.d.ts +52 -1
  312. package/dist/product/index.js +94 -4
  313. package/dist/product/module.d.ts +45 -1
  314. package/dist/product/module.js +11 -3
  315. package/dist/project/.kosh/bindings.js +1 -1
  316. package/dist/project/.kosh/schema.d.ts +725 -3
  317. package/dist/project/index.d.ts +3 -1
  318. package/dist/project/index.js +1045 -18
  319. package/dist/project/module.d.ts +10168 -458
  320. package/dist/project/module.js +1578 -14
  321. package/dist/project/routes.d.ts +44 -0
  322. package/dist/project/routes.js +314 -0
  323. package/dist/project/schedule.d.ts +72 -0
  324. package/dist/project/schedule.js +192 -0
  325. package/dist/project/web/Refresh.d.ts +8 -0
  326. package/dist/project/web/Refresh.js +29 -0
  327. package/dist/project/web/Schedule.d.ts +9 -0
  328. package/dist/project/web/Schedule.js +93 -0
  329. package/dist/project/web/Structure.d.ts +8 -0
  330. package/dist/project/web/Structure.js +86 -0
  331. package/dist/project/web/Workload.d.ts +8 -0
  332. package/dist/project/web/Workload.js +43 -0
  333. package/dist/project/web/index.d.ts +14 -0
  334. package/dist/project/web/index.js +25 -0
  335. package/dist/project/web/messages.d.ts +2 -0
  336. package/dist/project/web/messages.js +85 -0
  337. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  338. package/dist/project_account/.kosh/bindings.js +15 -0
  339. package/dist/project_account/.kosh/schema.d.ts +2241 -0
  340. package/dist/project_account/index.d.ts +3 -0
  341. package/dist/project_account/index.js +27 -0
  342. package/dist/project_account/module.d.ts +11539 -0
  343. package/dist/project_account/module.js +76 -0
  344. package/dist/project_portal/.kosh/bindings.js +1 -1
  345. package/dist/project_portal/.kosh/schema.d.ts +725 -3
  346. package/dist/project_portal/module.d.ts +5137 -119
  347. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  348. package/dist/project_purchase/.kosh/bindings.js +15 -0
  349. package/dist/project_purchase/.kosh/schema.d.ts +2320 -0
  350. package/dist/project_purchase/index.d.ts +9 -0
  351. package/dist/project_purchase/index.js +22 -0
  352. package/dist/project_purchase/module.d.ts +25147 -0
  353. package/dist/project_purchase/module.js +56 -0
  354. package/dist/purchase/.kosh/bindings.js +1 -1
  355. package/dist/purchase/.kosh/schema.d.ts +150 -6
  356. package/dist/purchase/index.js +163 -3
  357. package/dist/purchase/module.d.ts +228 -5
  358. package/dist/purchase/module.js +30 -3
  359. package/dist/purchase_account/.kosh/bindings.js +1 -1
  360. package/dist/purchase_account/.kosh/schema.d.ts +180 -8
  361. package/dist/purchase_account/index.js +27 -1
  362. package/dist/purchase_account/module.d.ts +591 -30
  363. package/dist/purchase_account/module.js +13 -2
  364. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  365. package/dist/purchase_portal/.kosh/schema.d.ts +150 -6
  366. package/dist/purchase_portal/module.d.ts +372 -6
  367. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  368. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  369. package/dist/purchase_stock/.kosh/schema.d.ts +1479 -0
  370. package/dist/purchase_stock/index.d.ts +7 -0
  371. package/dist/purchase_stock/index.js +98 -0
  372. package/dist/purchase_stock/module.d.ts +7535 -0
  373. package/dist/purchase_stock/module.js +380 -0
  374. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  375. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  376. package/dist/purchase_stock_account/.kosh/schema.d.ts +2155 -0
  377. package/dist/purchase_stock_account/index.d.ts +3 -0
  378. package/dist/purchase_stock_account/index.js +24 -0
  379. package/dist/purchase_stock_account/module.d.ts +38015 -0
  380. package/dist/purchase_stock_account/module.js +168 -0
  381. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  382. package/dist/recruitment/.kosh/bindings.js +15 -0
  383. package/dist/recruitment/.kosh/schema.d.ts +991 -0
  384. package/dist/recruitment/demo.d.ts +6 -0
  385. package/dist/recruitment/demo.js +45 -0
  386. package/dist/recruitment/index.d.ts +3 -0
  387. package/dist/recruitment/index.js +385 -0
  388. package/dist/recruitment/module.d.ts +3249 -0
  389. package/dist/recruitment/module.js +194 -0
  390. package/dist/recruitment/web/HireButton.d.ts +9 -0
  391. package/dist/recruitment/web/HireButton.js +32 -0
  392. package/dist/recruitment/web/index.d.ts +11 -0
  393. package/dist/recruitment/web/index.js +16 -0
  394. package/dist/recruitment/web/messages.d.ts +2 -0
  395. package/dist/recruitment/web/messages.js +19 -0
  396. package/dist/reporting/documents.d.ts +5 -0
  397. package/dist/reporting/documents.js +28 -1
  398. package/dist/reporting/index.d.ts +1 -1
  399. package/dist/reporting/index.js +4 -2
  400. package/dist/reporting/models.js +9 -0
  401. package/dist/reporting/overviews.d.ts +16 -0
  402. package/dist/reporting/overviews.js +56 -0
  403. package/dist/reporting/routes-documents.js +1 -1
  404. package/dist/reporting/routes.js +138 -80
  405. package/dist/reporting/web/DashboardView.d.ts +11 -0
  406. package/dist/reporting/web/DashboardView.js +2 -2
  407. package/dist/reporting/web/DesignerView.js +5 -0
  408. package/dist/reporting/web/Overview.d.ts +9 -0
  409. package/dist/reporting/web/Overview.js +53 -0
  410. package/dist/reporting/web/index.d.ts +1 -0
  411. package/dist/reporting/web/index.js +4 -1
  412. package/dist/reporting/web/messages.js +9 -0
  413. package/dist/sale_account/.kosh/bindings.js +1 -1
  414. package/dist/sale_account/.kosh/schema.d.ts +181 -6
  415. package/dist/sale_account/index.js +22 -1
  416. package/dist/sale_account/module.d.ts +639 -38
  417. package/dist/sale_portal/.kosh/bindings.js +1 -1
  418. package/dist/sale_portal/.kosh/schema.d.ts +59 -3
  419. package/dist/sale_portal/module.d.ts +435 -5
  420. package/dist/sale_project/.kosh/bindings.js +1 -1
  421. package/dist/sale_project/.kosh/schema.d.ts +732 -3
  422. package/dist/sale_project/module.d.ts +5349 -208
  423. package/dist/sale_project/module.js +17 -1
  424. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  425. package/dist/sale_stock/.kosh/bindings.js +15 -0
  426. package/dist/sale_stock/.kosh/schema.d.ts +1303 -0
  427. package/dist/sale_stock/index.d.ts +7 -0
  428. package/dist/sale_stock/index.js +84 -0
  429. package/dist/sale_stock/module.d.ts +7514 -0
  430. package/dist/sale_stock/module.js +146 -0
  431. package/dist/sales/.kosh/bindings.js +1 -1
  432. package/dist/sales/.kosh/schema.d.ts +59 -3
  433. package/dist/sales/index.js +195 -4
  434. package/dist/sales/module.d.ts +356 -3
  435. package/dist/sales/module.js +78 -3
  436. package/dist/server/api/metadata.d.ts +5 -0
  437. package/dist/server/api/metadata.js +5 -0
  438. package/dist/server/api/rest.js +64 -1
  439. package/dist/server/api/views.js +1 -0
  440. package/dist/server/app-settings.d.ts +7 -0
  441. package/dist/server/app-settings.js +10 -0
  442. package/dist/server/auth/base.js +9 -0
  443. package/dist/server/index.d.ts +1 -0
  444. package/dist/server/index.js +1 -0
  445. package/dist/settings/app-settings.d.ts +2 -0
  446. package/dist/settings/app-settings.js +518 -0
  447. package/dist/settings/index.d.ts +1 -0
  448. package/dist/settings/index.js +15 -0
  449. package/dist/settings/people.js +29 -5
  450. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  451. package/dist/settings/web/AppSettingsPage.js +210 -0
  452. package/dist/settings/web/OverviewPage.js +16 -3
  453. package/dist/settings/web/PeoplePage.js +20 -6
  454. package/dist/settings/web/index.d.ts +1 -0
  455. package/dist/settings/web/index.js +3 -0
  456. package/dist/settings/web/messages.js +118 -2
  457. package/dist/sign/.kosh/bindings.d.ts +22 -0
  458. package/dist/sign/.kosh/bindings.js +15 -0
  459. package/dist/sign/.kosh/schema.d.ts +990 -0
  460. package/dist/sign/index.d.ts +14 -0
  461. package/dist/sign/index.js +350 -0
  462. package/dist/sign/module.d.ts +4478 -0
  463. package/dist/sign/module.js +158 -0
  464. package/dist/sign/sign.d.ts +82 -0
  465. package/dist/sign/sign.js +474 -0
  466. package/dist/stock/.kosh/bindings.d.ts +22 -0
  467. package/dist/stock/.kosh/bindings.js +15 -0
  468. package/dist/stock/.kosh/schema.d.ts +1222 -0
  469. package/dist/stock/demo.d.ts +8 -0
  470. package/dist/stock/demo.js +82 -0
  471. package/dist/stock/index.d.ts +4 -0
  472. package/dist/stock/index.js +903 -0
  473. package/dist/stock/module.d.ts +7856 -0
  474. package/dist/stock/module.js +1880 -0
  475. package/dist/stock/replenish.d.ts +38 -0
  476. package/dist/stock/replenish.js +176 -0
  477. package/dist/stock/web/Replenishment.d.ts +8 -0
  478. package/dist/stock/web/Replenishment.js +84 -0
  479. package/dist/stock/web/ScanBox.d.ts +8 -0
  480. package/dist/stock/web/ScanBox.js +90 -0
  481. package/dist/stock/web/index.d.ts +13 -0
  482. package/dist/stock/web/index.js +20 -0
  483. package/dist/stock/web/messages.d.ts +2 -0
  484. package/dist/stock/web/messages.js +77 -0
  485. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  486. package/dist/stock_account/.kosh/bindings.js +15 -0
  487. package/dist/stock_account/.kosh/schema.d.ts +2068 -0
  488. package/dist/stock_account/index.d.ts +3 -0
  489. package/dist/stock_account/index.js +140 -0
  490. package/dist/stock_account/module.d.ts +11523 -0
  491. package/dist/stock_account/module.js +339 -0
  492. package/dist/storage/attachments.d.ts +5 -0
  493. package/dist/storage/attachments.js +12 -1
  494. package/dist/storage/models.js +3 -0
  495. package/dist/storage/routes.js +13 -2
  496. package/dist/todo/.kosh/bindings.d.ts +22 -0
  497. package/dist/todo/.kosh/bindings.js +15 -0
  498. package/dist/todo/.kosh/schema.d.ts +732 -0
  499. package/dist/todo/demo.d.ts +6 -0
  500. package/dist/todo/demo.js +35 -0
  501. package/dist/todo/index.d.ts +3 -0
  502. package/dist/todo/index.js +187 -0
  503. package/dist/todo/module.d.ts +1180 -0
  504. package/dist/todo/module.js +130 -0
  505. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  506. package/dist/trade_finance/.kosh/bindings.js +15 -0
  507. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  508. package/dist/trade_finance/demo.d.ts +6 -0
  509. package/dist/trade_finance/demo.js +63 -0
  510. package/dist/trade_finance/index.d.ts +3 -0
  511. package/dist/trade_finance/index.js +415 -0
  512. package/dist/trade_finance/module.d.ts +3779 -0
  513. package/dist/trade_finance/module.js +507 -0
  514. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  515. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  516. package/dist/trade_finance_account/.kosh/schema.d.ts +1830 -0
  517. package/dist/trade_finance_account/index.d.ts +3 -0
  518. package/dist/trade_finance_account/index.js +93 -0
  519. package/dist/trade_finance_account/module.d.ts +8074 -0
  520. package/dist/trade_finance_account/module.js +245 -0
  521. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  522. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  523. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1246 -0
  524. package/dist/trade_finance_purchase/index.d.ts +8 -0
  525. package/dist/trade_finance_purchase/index.js +50 -0
  526. package/dist/trade_finance_purchase/module.d.ts +4257 -0
  527. package/dist/trade_finance_purchase/module.js +44 -0
  528. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  529. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  530. package/dist/trade_finance_sale/.kosh/schema.d.ts +1072 -0
  531. package/dist/trade_finance_sale/index.d.ts +8 -0
  532. package/dist/trade_finance_sale/index.js +50 -0
  533. package/dist/trade_finance_sale/module.d.ts +4281 -0
  534. package/dist/trade_finance_sale/module.js +44 -0
  535. package/dist/ui/api.d.ts +2 -1
  536. package/dist/ui/api.js +2 -1
  537. package/dist/ui/app.js +26 -13
  538. package/dist/ui/components/AppIcon.js +30 -1
  539. package/dist/ui/components/primitives.d.ts +2 -0
  540. package/dist/ui/components/primitives.js +7 -1
  541. package/dist/ui/i18n/messages.d.ts +27 -0
  542. package/dist/ui/i18n/messages.js +46 -0
  543. package/dist/ui/index.d.ts +1 -0
  544. package/dist/ui/index.js +1 -0
  545. package/dist/ui/offline/queue.d.ts +5 -1
  546. package/dist/ui/offline/queue.js +2 -0
  547. package/dist/ui/registry.d.ts +5 -0
  548. package/dist/ui/shell/Home.js +55 -4
  549. package/dist/ui/views/FormView.js +102 -19
  550. package/dist/ui/views/KanbanView.d.ts +2 -0
  551. package/dist/ui/views/KanbanView.js +40 -3
  552. package/dist/ui/views/ListView.js +110 -11
  553. package/dist/ui/views/StatsRow.d.ts +14 -0
  554. package/dist/ui/views/StatsRow.js +88 -0
  555. package/dist/ui/views/widgets.d.ts +2 -1
  556. package/dist/ui/views/widgets.js +200 -1
  557. package/dist/views/builders.d.ts +19 -2
  558. package/dist/views/builders.js +21 -1
  559. package/dist/views/condition.d.ts +6 -0
  560. package/dist/views/condition.js +20 -0
  561. package/dist/views/documents.d.ts +8 -0
  562. package/dist/views/extend.d.ts +2 -2
  563. package/dist/views/extend.js +11 -1
  564. package/dist/views/index.d.ts +2 -2
  565. package/dist/views/index.js +2 -2
  566. package/dist/views/types.d.ts +52 -5
  567. package/dist/views/validate.js +39 -1
  568. package/dist/website/.kosh/bindings.d.ts +22 -0
  569. package/dist/website/.kosh/bindings.js +15 -0
  570. package/dist/website/.kosh/schema.d.ts +881 -0
  571. package/dist/website/demo.d.ts +6 -0
  572. package/dist/website/demo.js +115 -0
  573. package/dist/website/index.d.ts +9 -0
  574. package/dist/website/index.js +251 -0
  575. package/dist/website/module.d.ts +2987 -0
  576. package/dist/website/module.js +282 -0
  577. package/dist/website/render.d.ts +45 -0
  578. package/dist/website/render.js +102 -0
  579. package/dist/website/routes.d.ts +12 -0
  580. package/dist/website/routes.js +246 -0
  581. package/dist/website/web/PagePreview.d.ts +7 -0
  582. package/dist/website/web/PagePreview.js +33 -0
  583. package/dist/website/web/index.d.ts +11 -0
  584. package/dist/website/web/index.js +16 -0
  585. package/dist/website/web/messages.d.ts +2 -0
  586. package/dist/website/web/messages.js +15 -0
  587. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  588. package/dist/website_crm/.kosh/bindings.js +15 -0
  589. package/dist/website_crm/.kosh/schema.d.ts +967 -0
  590. package/dist/website_crm/index.d.ts +3 -0
  591. package/dist/website_crm/index.js +39 -0
  592. package/dist/website_crm/module.d.ts +2956 -0
  593. package/dist/website_crm/module.js +44 -0
  594. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  595. package/dist/website_sale/.kosh/bindings.js +15 -0
  596. package/dist/website_sale/.kosh/schema.d.ts +2284 -0
  597. package/dist/website_sale/couriers.d.ts +50 -0
  598. package/dist/website_sale/couriers.js +59 -0
  599. package/dist/website_sale/demo.d.ts +7 -0
  600. package/dist/website_sale/demo.js +90 -0
  601. package/dist/website_sale/growth.d.ts +31 -0
  602. package/dist/website_sale/growth.js +163 -0
  603. package/dist/website_sale/index.d.ts +49 -0
  604. package/dist/website_sale/index.js +538 -0
  605. package/dist/website_sale/module.d.ts +22027 -0
  606. package/dist/website_sale/module.js +397 -0
  607. package/dist/website_sale/shipments.d.ts +16 -0
  608. package/dist/website_sale/shipments.js +113 -0
  609. package/dist/website_sale/shop.d.ts +81 -0
  610. package/dist/website_sale/shop.js +649 -0
  611. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  612. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  613. package/dist/website_sale_stock/.kosh/schema.d.ts +2681 -0
  614. package/dist/website_sale_stock/index.d.ts +9 -0
  615. package/dist/website_sale_stock/index.js +20 -0
  616. package/dist/website_sale_stock/module.d.ts +24998 -0
  617. package/dist/website_sale_stock/module.js +28 -0
  618. package/package.json +200 -2
@@ -0,0 +1,146 @@
1
+ /**
2
+ * The data layer of the Sales ↔ Stockroom bridge (RFC 0021): a confirmed sales order gets its delivery — one
3
+ * Stockroom transfer with a line per goods line, in the line's unit, from the company's main warehouse to the
4
+ * customers — made once through the outbox (`sale.order.confirmed`) and confirmed, so its stock is reserved. The
5
+ * order shows its deliveries and what is delivered; each line, its delivered quantity.
6
+ */
7
+ import { productShutro } from '../product/index.js';
8
+ import { salesShutro } from '../sales/index.js';
9
+ import { orm } from '../server/orm.js';
10
+ import { defaultLocations, stockShutro } from '../stock/index.js';
11
+ import { compute, defineModule, extendModel, f } from './.kosh/bindings.js';
12
+ const zero = orm.toDecimal(0);
13
+ export const PickingSale = extendModel('stock.picking', {
14
+ fields: { saleOrder: f.many2one('sale.order', { ondelete: 'set null', label: 'Sales order' }) },
15
+ overrides: {
16
+ // A backorder stays with its order.
17
+ backorderValues: async function (next) {
18
+ const out = await next();
19
+ for (const p of await this.load({}))
20
+ out.set(p.id, { ...out.get(p.id), saleOrder: p.saleOrder?.id ?? null });
21
+ return out;
22
+ },
23
+ },
24
+ });
25
+ export const MoveSale = extendModel('stock.move', {
26
+ fields: {
27
+ saleLine: f.many2one('sale.order.line', { ondelete: 'set null', label: 'Order line' }),
28
+ },
29
+ overrides: {
30
+ // The rest of a line stays tied to its order line.
31
+ backorderValues: async function (next) {
32
+ const out = await next();
33
+ for (const m of await this.load({}))
34
+ out.set(m.id, { ...out.get(m.id), saleLine: m.saleLine?.id ?? null });
35
+ return out;
36
+ },
37
+ },
38
+ });
39
+ export const LineDelivered = extendModel('sale.order.line', {
40
+ fields: {
41
+ moves: f.one2many('stock.move', 'saleLine'),
42
+ /** Delivered by validated deliveries, in the line's unit. */
43
+ qtyDelivered: f.decimal({
44
+ scale: 3,
45
+ store: true,
46
+ label: 'Delivered',
47
+ ...compute('sale.order.line', 'qtyDelivered', ['moves.quantity', 'moves.quantityDone', 'moves.picking.state'], (lines) => {
48
+ for (const l of lines)
49
+ l.qtyDelivered = [...l.moves]
50
+ .filter((m) => m.picking.state === 'done')
51
+ .reduce((s, m) => s.plus(m.quantityDone ?? m.quantity), zero);
52
+ }),
53
+ }),
54
+ },
55
+ });
56
+ export const OrderDeliveries = extendModel('sale.order', {
57
+ fields: {
58
+ deliveries: f.one2many('stock.picking', 'saleOrder'),
59
+ deliveryState: f.selection({
60
+ nothing: 'Nothing to deliver',
61
+ to_deliver: 'To deliver',
62
+ partial: 'Partly delivered',
63
+ delivered: 'Delivered',
64
+ }, {
65
+ store: true,
66
+ label: 'Delivery',
67
+ ...compute('sale.order', 'deliveryState', ['state', 'lines.quantity', 'lines.qtyDelivered', 'lines.product.kind'], (orders) => {
68
+ for (const o of orders) {
69
+ const goods = [...o.lines].filter((l) => l.product.kind === 'goods');
70
+ if (goods.length === 0 || (o.state !== 'sale' && o.state !== 'done')) {
71
+ o.deliveryState = 'nothing';
72
+ continue;
73
+ }
74
+ const done = goods.every((l) => (l.qtyDelivered ?? zero).gte(l.quantity));
75
+ const some = goods.some((l) => (l.qtyDelivered ?? zero).gt(0));
76
+ o.deliveryState = done ? 'delivered' : some ? 'partial' : 'to_deliver';
77
+ }
78
+ }),
79
+ }),
80
+ },
81
+ });
82
+ /**
83
+ * Makes and confirms the delivery of a confirmed order's goods lines, once (an order with a delivery that is not
84
+ * cancelled gets no other). Runs in an audited superuser scope: the salesperson who confirmed needs no Stockroom
85
+ * rights for the warehouse to get its delivery. Returns the delivery, or null when there is nothing to deliver.
86
+ */
87
+ export async function createDeliveryFor(env, orderId) {
88
+ return env.asSuperuser({ reason: 'delivery for a confirmed sales order' }, async (su) => {
89
+ const [order] = await su
90
+ .model('sale.order')
91
+ .browse([orm.asId(orderId, 'sale.order')])
92
+ .load({
93
+ lines: { product: true, uom: true },
94
+ partner: true,
95
+ company: true,
96
+ deliveries: true,
97
+ });
98
+ if (order === undefined || (order.state !== 'sale' && order.state !== 'done'))
99
+ return null;
100
+ if ([...order.deliveries].some((d) => d.state !== 'cancel'))
101
+ return null;
102
+ const goods = order.lines.filter((l) => l.product.kind === 'goods');
103
+ if (goods.length === 0)
104
+ return null;
105
+ const places = await defaultLocations(su, 'delivery', null, order.company.id);
106
+ if (places.source === null || places.destination === null)
107
+ throw new orm.ValidationError('sale.order', ['state'], `The company of ${order.name} has no warehouse to deliver from.`, 'Add a warehouse in Stockroom › Configuration › Warehouses.');
108
+ const made = await su.model('stock.picking').create([
109
+ {
110
+ kind: 'delivery',
111
+ partner: order.partner.id,
112
+ company: order.company.id,
113
+ warehouse: places.warehouse,
114
+ source: places.source,
115
+ destination: places.destination,
116
+ origin: order.name,
117
+ saleOrder: order.id,
118
+ moves: {
119
+ create: goods.map((l) => ({
120
+ product: l.product.id,
121
+ name: l.name,
122
+ quantity: l.quantity,
123
+ uom: l.uom?.id ?? null,
124
+ saleLine: l.id,
125
+ })),
126
+ },
127
+ },
128
+ ]);
129
+ await made.confirm();
130
+ return made.ids[0] ?? null;
131
+ });
132
+ }
133
+ export const saleStockShutro = defineModule({
134
+ name: 'sale_stock',
135
+ version: '0.1.0',
136
+ depends: [salesShutro, stockShutro, productShutro],
137
+ groups: [
138
+ orm.defineGroup({
139
+ code: 'sale_stock.user',
140
+ label: 'Sales with deliveries',
141
+ implies: ['sales.user', 'stock.user'],
142
+ }),
143
+ ],
144
+ models: [],
145
+ extensions: [PickingSale, MoveSale, LineDelivered, OrderDeliveries],
146
+ });
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 680b65ef8ba5f90d
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: a6ff09639ec1931e
2
2
  // Bindings of module `sales`: 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';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 680b65ef8ba5f90d
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: a6ff09639ec1931e
2
2
  // Schema view of module `sales` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -14,6 +14,7 @@ export interface SchemaView {
14
14
  readonly 'auth.user_group': AuthUserGroup;
15
15
  readonly 'kosh.image': KoshImage;
16
16
  readonly 'kosh.saved_view': KoshSavedView;
17
+ readonly 'kosh.setting': KoshSetting;
17
18
  readonly 'mail.activity': MailActivity;
18
19
  readonly 'mail.activity.type': MailActivityType;
19
20
  readonly 'mail.channel': MailChannel;
@@ -30,6 +31,7 @@ export interface SchemaView {
30
31
  readonly 'res.company': ResCompany;
31
32
  readonly 'res.currency': ResCurrency;
32
33
  readonly 'res.partner': ResPartner;
34
+ readonly 'res.partner.tag': ResPartnerTag;
33
35
  readonly 'res.users': ResUsers;
34
36
  readonly 'sale.order': SaleOrder;
35
37
  readonly 'sale.order.line': SaleOrderLine;
@@ -281,6 +283,26 @@ export interface KoshSavedView {
281
283
  export interface KoshSavedViewMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'kosh.saved_view'> {
282
284
  }
283
285
 
286
+ /** `kosh.setting` (owner: base). */
287
+ export interface KoshSetting {
288
+ readonly name: 'kosh.setting';
289
+ readonly fields: {
290
+ readonly id: F.Id<'kosh.setting'>;
291
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
292
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
293
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
294
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
295
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
296
+ readonly key: F.Char<{ readonly required: true }>;
297
+ readonly value: F.Json;
298
+ };
299
+ readonly methods: KoshSettingMethods;
300
+ }
301
+
302
+ /** Methods of `kosh.setting`: declared ones and transitions. */
303
+ export interface KoshSettingMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'kosh.setting'> {
304
+ }
305
+
284
306
  /** `mail.activity` (owner: messaging). */
285
307
  export interface MailActivity {
286
308
  readonly name: 'mail.activity';
@@ -568,6 +590,7 @@ export interface ProductCategory {
568
590
  readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
569
591
  readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
570
592
  readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
593
+ readonly active: F.Bool<{ readonly required: true; readonly default: true }>;
571
594
  readonly name: F.Char<{ readonly required: true; readonly translate: true }>;
572
595
  readonly parent: F.Many2one<'product.category'>;
573
596
  };
@@ -595,6 +618,7 @@ export interface ProductProduct {
595
618
  readonly category: F.Many2one<'product.category'>;
596
619
  readonly uom: F.Many2one<'uom.uom'>;
597
620
  readonly barcode: F.Char;
621
+ readonly image: F.Many2one<'storage.attachment'>;
598
622
  readonly listPrice: F.Decimal<{ readonly required: true; readonly default: true }>;
599
623
  readonly standardPrice: F.Decimal<{ readonly required: true; readonly default: true }>;
600
624
  readonly saleOk: F.Bool<{ readonly required: true; readonly default: true }>;
@@ -612,7 +636,7 @@ export interface ProductProduct {
612
636
  export interface ProductProductMethods extends F.Methods<typeof import('../../product/index.js').productShutro, 'product.product'> {
613
637
  }
614
638
 
615
- /** `res.company` (owner: base). */
639
+ /** `res.company` (owner: base; extended by: contacts, sales). */
616
640
  export interface ResCompany {
617
641
  readonly name: 'res.company';
618
642
  readonly fields: {
@@ -632,12 +656,16 @@ export interface ResCompany {
632
656
  readonly email: F.Char;
633
657
  readonly phone: F.Char;
634
658
  readonly website: F.Char;
659
+ readonly contactTaxIdRequired: F.Bool<{ readonly required: true; readonly default: true }>; // contacts
660
+ readonly contactUniqueEmail: F.Bool<{ readonly required: true; readonly default: true }>; // contacts
661
+ readonly saleValidityDays: F.Integer<{ readonly default: true }>; // sales
662
+ readonly saleTerms: F.Text; // sales
635
663
  };
636
664
  readonly methods: ResCompanyMethods;
637
665
  }
638
666
 
639
667
  /** Methods of `res.company`: declared ones and transitions. */
640
- export interface ResCompanyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'res.company'> {
668
+ export interface ResCompanyMethods extends F.Methods<typeof import('../../server/index.js').baseShutro, 'res.company'>, F.Methods<typeof import('../../contacts/index.js').contactsShutro, 'res.company'>, F.Methods<typeof import('../module.js').salesShutro, 'res.company'> {
641
669
  }
642
670
 
643
671
  /** `res.currency` (owner: base). */
@@ -674,6 +702,10 @@ export interface ResPartner {
674
702
  readonly active: F.Bool<{ readonly required: true; readonly default: true }>;
675
703
  readonly company: F.Many2one<'res.company', { readonly default: true }>;
676
704
  readonly name: F.Char<{ readonly required: true }>;
705
+ readonly image: F.Many2one<'storage.attachment'>;
706
+ readonly tags: F.Many2many<'res.partner.tag', { readonly required: true }>;
707
+ readonly latitude: F.Decimal;
708
+ readonly longitude: F.Decimal;
677
709
  readonly isCompany: F.Bool<{ readonly required: true; readonly default: true }>;
678
710
  readonly parent: F.Many2one<'res.partner'>;
679
711
  readonly contacts: F.One2many<'res.partner', { readonly required: true }>;
@@ -699,6 +731,25 @@ export interface ResPartner {
699
731
  export interface ResPartnerMethods extends F.Methods<typeof import('../../contacts/index.js').contactsShutro, 'res.partner'> {
700
732
  }
701
733
 
734
+ /** `res.partner.tag` (owner: contacts). */
735
+ export interface ResPartnerTag {
736
+ readonly name: 'res.partner.tag';
737
+ readonly fields: {
738
+ readonly id: F.Id<'res.partner.tag'>;
739
+ readonly createdAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
740
+ readonly updatedAt: F.Datetime<{ readonly required: true; readonly readonly: true }>;
741
+ readonly createdBy: F.Many2one<'res.users', { readonly readonly: true }>;
742
+ readonly updatedBy: F.Many2one<'res.users', { readonly readonly: true }>;
743
+ readonly displayName: F.Char<{ readonly required: true; readonly readonly: true; readonly compute: true }>;
744
+ readonly name: F.Char<{ readonly required: true }>;
745
+ };
746
+ readonly methods: ResPartnerTagMethods;
747
+ }
748
+
749
+ /** Methods of `res.partner.tag`: declared ones and transitions. */
750
+ export interface ResPartnerTagMethods extends F.Methods<typeof import('../../contacts/index.js').contactsShutro, 'res.partner.tag'> {
751
+ }
752
+
702
753
  /** `res.users` (owner: base). */
703
754
  export interface ResUsers {
704
755
  readonly name: 'res.users';
@@ -750,6 +801,8 @@ export interface SaleOrder {
750
801
  readonly amountUntaxed: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
751
802
  readonly amountTax: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
752
803
  readonly amountTotal: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
804
+ readonly margin: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
805
+ readonly marginPercent: F.Decimal<{ readonly readonly: true; readonly compute: true; readonly store: true }>;
753
806
  readonly state: F.State<'draft' | 'sent' | 'sale' | 'done' | 'cancel', { readonly required: true; readonly readonly: true; readonly default: true }>;
754
807
  };
755
808
  readonly methods: SaleOrderMethods;
@@ -786,6 +839,7 @@ export interface SaleOrderLine {
786
839
  readonly tax: F.Many2one<'account.tax', { readonly readonly: true }>;
787
840
  readonly currency: F.Many2one<'res.currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
788
841
  readonly subtotal: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
842
+ readonly margin: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
789
843
  readonly taxAmount: F.Monetary<'currency', { readonly readonly: true; readonly compute: true; readonly store: true }>;
790
844
  };
791
845
  readonly methods: SaleOrderLineMethods;
@@ -812,6 +866,8 @@ export interface StorageAttachment {
812
866
  readonly key: F.Char<{ readonly required: true }>;
813
867
  readonly resModel: F.Char<{ readonly required: true }>;
814
868
  readonly resId: F.Integer<{ readonly required: true }>;
869
+ readonly variantOf: F.Many2one<'storage.attachment'>;
870
+ readonly width: F.Integer;
815
871
  };
816
872
  readonly methods: StorageAttachmentMethods;
817
873
  }
@@ -8,7 +8,8 @@ import { contacts } from '../contacts/index.js';
8
8
  import { messaging } from '../messaging/index.js';
9
9
  import { defineModule } from '../modules-sdk/index.js';
10
10
  import { product } from '../product/index.js';
11
- import { action, form, kanban, list, search } from '../views/index.js';
11
+ import { reporting } from '../reporting/index.js';
12
+ import { action, calendar, form, kanban, list, search, stat } from '../views/index.js';
12
13
  import { salesDemo } from './demo.js';
13
14
  import { SaleOrder, SaleOrderLine, salesShutro } from './module.js';
14
15
  export { SaleOrder, SaleOrderLine, salesShutro } from './module.js';
@@ -16,7 +17,7 @@ export const sales = defineModule({
16
17
  shutro: salesShutro,
17
18
  kosh: '^0.1.0',
18
19
  hooks: { demo: salesDemo },
19
- depends: [contacts, product, messaging],
20
+ depends: [contacts, product, messaging, reporting],
20
21
  // What webhooks may subscribe to besides record changes (RFC 0017 §5.3).
21
22
  events: [{ topic: 'sale.order.confirmed', model: 'sale.order', label: 'Sales order confirmed' }],
22
23
  app: {
@@ -31,6 +32,31 @@ export const sales = defineModule({
31
32
  user: { label: 'Salesperson (own orders)', groups: ['sales.user'] },
32
33
  manager: { label: 'Manager (all orders)', groups: ['sales.manager'], implies: ['user'] },
33
34
  },
35
+ // Settings › App settings › Sales (RFC 0020): per company, changed by sales managers.
36
+ settings: {
37
+ sections: [
38
+ {
39
+ key: 'quotations',
40
+ label: 'Quotations',
41
+ description: 'How long new quotations stay valid, and the terms they start with.',
42
+ keywords: 'quote validity expiry terms conditions',
43
+ scope: 'company',
44
+ editors: ['sales.manager'],
45
+ fields: [
46
+ {
47
+ key: 'saleValidityDays',
48
+ min: 0,
49
+ max: 365,
50
+ help: 'A new quotation is valid until its date plus these days; 0 leaves it open.',
51
+ },
52
+ {
53
+ key: 'saleTerms',
54
+ help: 'Filled in on new quotations; each can still be changed.',
55
+ },
56
+ ],
57
+ },
58
+ ],
59
+ },
34
60
  // The printed quotation (RFC 0005), installed as a template designers can change; the portal prints it too.
35
61
  documents: [
36
62
  {
@@ -97,10 +123,157 @@ export const sales = defineModule({
97
123
  },
98
124
  },
99
125
  ],
126
+ // The Overview page (RFC 0022 §3.2): this month against the last, the year's curve, who buys, what to chase.
127
+ overview: {
128
+ cards: [
129
+ {
130
+ id: 'sales_month',
131
+ title: 'Sales this month',
132
+ kind: 'kpi',
133
+ model: 'sale.order',
134
+ measure: 'sum:amountTotal',
135
+ filter: { state: { in: ['sale', 'done'] } },
136
+ comparison: { field: 'dateOrder', mode: 'previous' },
137
+ w: 3,
138
+ },
139
+ {
140
+ id: 'orders_month',
141
+ title: 'Orders this month',
142
+ kind: 'kpi',
143
+ model: 'sale.order',
144
+ measure: 'count',
145
+ filter: { state: { in: ['sale', 'done'] } },
146
+ comparison: { field: 'dateOrder', mode: 'previous' },
147
+ w: 3,
148
+ },
149
+ {
150
+ id: 'open_quotations',
151
+ title: 'Open quotations',
152
+ kind: 'kpi',
153
+ model: 'sale.order',
154
+ measure: 'count',
155
+ filter: { state: { in: ['draft', 'sent'] } },
156
+ w: 3,
157
+ },
158
+ {
159
+ id: 'average_order',
160
+ title: 'Average order',
161
+ kind: 'kpi',
162
+ model: 'sale.order',
163
+ measure: 'avg:amountTotal',
164
+ filter: { state: { in: ['sale', 'done'] } },
165
+ w: 3,
166
+ },
167
+ {
168
+ id: 'margin_month',
169
+ title: 'Margin this month',
170
+ kind: 'kpi',
171
+ model: 'sale.order',
172
+ measure: 'sum:margin',
173
+ filter: { state: { in: ['sale', 'done'] } },
174
+ comparison: { field: 'dateOrder', mode: 'previous' },
175
+ w: 3,
176
+ },
177
+ {
178
+ id: 'sales_by_month',
179
+ title: 'Sales by month',
180
+ kind: 'chart',
181
+ model: 'sale.order',
182
+ measure: 'sum:amountTotal',
183
+ groupBy: 'dateOrder:month',
184
+ filter: { state: { in: ['sale', 'done'] } },
185
+ chart: 'bar',
186
+ w: 6,
187
+ },
188
+ {
189
+ id: 'top_customers',
190
+ title: 'Top customers',
191
+ kind: 'pivot',
192
+ model: 'sale.order',
193
+ measure: 'sum:amountTotal',
194
+ groupBy: 'partner',
195
+ filter: { state: { in: ['sale', 'done'] } },
196
+ w: 6,
197
+ },
198
+ {
199
+ id: 'by_salesperson',
200
+ title: 'By salesperson',
201
+ kind: 'chart',
202
+ model: 'sale.order',
203
+ measure: 'sum:amountTotal',
204
+ groupBy: 'user',
205
+ filter: { state: { in: ['sale', 'done'] } },
206
+ chart: 'pie',
207
+ w: 6,
208
+ },
209
+ {
210
+ id: 'quotations_to_chase',
211
+ title: 'Biggest open quotations',
212
+ kind: 'list',
213
+ model: 'sale.order',
214
+ measure: 'sum:amountTotal',
215
+ filter: { state: { in: ['draft', 'sent'] } },
216
+ w: 6,
217
+ },
218
+ ],
219
+ },
220
+ viewExtensions: [
221
+ {
222
+ view: 'product.product.form',
223
+ operations: [
224
+ {
225
+ append: 'related',
226
+ nodes: [
227
+ stat({
228
+ id: 'product_sold',
229
+ label: 'Sold',
230
+ model: SaleOrderLine,
231
+ where: { product: { $record: 'id' }, 'order.state': { in: ['sale', 'done'] } },
232
+ measure: { sum: 'quantity' },
233
+ }),
234
+ stat({
235
+ id: 'product_revenue',
236
+ label: 'Sales',
237
+ model: SaleOrderLine,
238
+ where: { product: { $record: 'id' }, 'order.state': { in: ['sale', 'done'] } },
239
+ measure: { sum: 'subtotal' },
240
+ tone: 'success',
241
+ }),
242
+ ],
243
+ },
244
+ ],
245
+ },
246
+ {
247
+ view: 'res.partner.form',
248
+ operations: [
249
+ {
250
+ append: 'related',
251
+ nodes: [
252
+ stat({
253
+ id: 'sale_orders',
254
+ label: 'Sales orders',
255
+ model: SaleOrder,
256
+ where: { partner: { $record: 'id' }, state: { in: ['sale', 'done'] } },
257
+ action: 'sales.action_orders',
258
+ }),
259
+ stat({
260
+ id: 'sale_revenue',
261
+ label: 'Sales',
262
+ model: SaleOrder,
263
+ where: { partner: { $record: 'id' }, state: { in: ['sale', 'done'] } },
264
+ measure: { sum: 'amountTotal' },
265
+ action: 'sales.action_orders',
266
+ tone: 'success',
267
+ }),
268
+ ],
269
+ },
270
+ ],
271
+ },
272
+ ],
100
273
  actions: {
101
274
  'sales.action_quotations': action(SaleOrder, {
102
275
  label: 'Quotations',
103
- views: ['list', 'kanban', 'form'],
276
+ views: ['list', 'kanban', 'calendar', 'form'],
104
277
  defaultFilters: ['quotations'],
105
278
  }),
106
279
  'sales.action_orders': action(SaleOrder, {
@@ -147,9 +320,12 @@ export const sales = defineModule({
147
320
  'partner',
148
321
  'user',
149
322
  { field: 'amountTotal', sum: true },
323
+ { field: 'margin', sum: true },
324
+ { field: 'marginPercent', widget: 'percentage' },
150
325
  { field: 'state', widget: 'badge' },
151
326
  ],
152
327
  defaultOrder: ['dateOrder desc'],
328
+ decorations: { success: { state: 'done' }, neutral: { state: 'cancel' } },
153
329
  }),
154
330
  'sale.order.kanban': kanban(SaleOrder, {
155
331
  groupBy: 'state',
@@ -168,6 +344,8 @@ export const sales = defineModule({
168
344
  ],
169
345
  },
170
346
  sheet: [
347
+ // Invoices, deliveries, tasks: the bridges append their tiles (RFC 0022 §3.1).
348
+ k.stats('related', []),
171
349
  k.group('customer', ['partner', 'clientReference', 'currency']),
172
350
  k.group('dates', ['name', 'dateOrder', 'validityDate', 'user']),
173
351
  k.lines('lines', [
@@ -180,17 +358,30 @@ export const sales = defineModule({
180
358
  'taxes',
181
359
  'subtotal',
182
360
  ], { readonlyWhen: { state: { in: ['done', 'cancel'] } } }),
183
- k.group('totals', ['amountUntaxed', 'amountTax', 'amountTotal'], { label: 'Totals' }),
361
+ k.group('totals', ['amountUntaxed', 'amountTax', 'amountTotal', 'margin', 'marginPercent'], {
362
+ label: 'Totals',
363
+ }),
184
364
  k.group('terms', ['note'], { columns: 1 }),
185
365
  ],
186
366
  readonlyWhen: { state: { in: ['done', 'cancel'] } },
187
367
  chatter: true,
188
368
  })),
369
+ // Quotations by the day they expire: what to chase this week.
370
+ 'sale.order.calendar': calendar(SaleOrder, {
371
+ dateStart: 'validityDate',
372
+ title: 'name',
373
+ color: 'state',
374
+ mode: 'month',
375
+ }),
189
376
  'sale.order.line.list': list(SaleOrderLine, {
190
377
  columns: ['order', 'product', 'quantity', 'priceUnit', 'subtotal'],
191
378
  }),
192
379
  },
193
380
  search: {
381
+ 'sale.order.line': search(SaleOrderLine, {
382
+ fields: ['name', 'product.name', 'order.name'],
383
+ groupBy: ['product', 'order'],
384
+ }),
194
385
  'sale.order': search(SaleOrder, {
195
386
  fields: ['name', 'partner.name', 'clientReference'],
196
387
  filters: {