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,339 @@
1
+ /**
2
+ * The data layer of the Stockroom ↔ Accounting bridge (RFC 0021 step 3, perpetual valuation): every validated
3
+ * transfer that brings goods into stock or takes them out is valued — at the product's average cost, or FIFO from
4
+ * the receipts still in stock — in a valuation layer, and posted at once in the Stock journal: a receipt to
5
+ * Inventory against Goods received not billed, a delivery to Cost of goods sold, a count's gain or loss to Stock
6
+ * adjustments. Internal moves keep their value. The stock's value at a date is the sum of its layers.
7
+ */
8
+ import { accountingShutro } from '../accounting/index.js';
9
+ import { productShutro } from '../product/index.js';
10
+ import { orm } from '../server/orm.js';
11
+ import { stockShutro } from '../stock/index.js';
12
+ import { defineModel, defineModule, extendModel, f, method, } from './.kosh/bindings.js';
13
+ const zero = orm.toDecimal(0);
14
+ const money = (d) => d.toDecimalPlaces(2);
15
+ /** The accounts this bridge adds to a chart (by code), when the chart has none with that code. */
16
+ export const STOCK_ACCOUNTS = [
17
+ { code: '1250', name: 'Work in progress', type: 'asset_current' },
18
+ { code: '2150', name: 'Goods received not billed', type: 'liability_current' },
19
+ { code: '5100', name: 'Stock adjustments', type: 'expense_direct_cost' },
20
+ { code: '5110', name: 'Price differences', type: 'expense_direct_cost' },
21
+ ];
22
+ const COMPANY_DEFAULTS = {
23
+ stockValuationAccount: '1200',
24
+ stockInterimAccount: '2150',
25
+ stockCogsAccount: '5000',
26
+ stockAdjustmentAccount: '5100',
27
+ stockPriceDiffAccount: '5110',
28
+ stockProductionAccount: '1250',
29
+ };
30
+ export const CategoryValuation = extendModel('product.category', {
31
+ fields: {
32
+ costMethod: f.selection({ average: 'Average cost', fifo: 'First in, first out (FIFO)' }, { label: 'Cost method' }),
33
+ stockValuationAccount: f.many2one('account.account', { label: 'Inventory account' }),
34
+ stockCogsAccount: f.many2one('account.account', { label: 'Cost of goods sold account' }),
35
+ },
36
+ });
37
+ export const ProductValuation = extendModel('product.product', {
38
+ fields: {
39
+ /** Empty: the category's, else average cost. */
40
+ costMethod: f.selection({ average: 'Average cost', fifo: 'First in, first out (FIFO)' }, { label: 'Cost method' }),
41
+ valuationLayers: f.one2many('stock.valuation.layer', 'product'),
42
+ },
43
+ });
44
+ export const CompanyStockAccounts = extendModel('res.company', {
45
+ fields: {
46
+ stockJournal: f.many2one('account.journal', { label: 'Stock journal' }),
47
+ stockValuationAccount: f.many2one('account.account', { label: 'Inventory account' }),
48
+ stockInterimAccount: f.many2one('account.account', {
49
+ label: 'Goods received not billed account',
50
+ }),
51
+ stockCogsAccount: f.many2one('account.account', { label: 'Cost of goods sold account' }),
52
+ stockAdjustmentAccount: f.many2one('account.account', { label: 'Stock adjustments account' }),
53
+ stockPriceDiffAccount: f.many2one('account.account', { label: 'Price differences account' }),
54
+ stockProductionAccount: f.many2one('account.account', { label: 'Work in progress account' }),
55
+ },
56
+ });
57
+ /**
58
+ * What a validated transfer did to a product's value: in (positive) or out (negative), at what unit cost, with its
59
+ * entry; an incoming layer keeps what of it is still in stock (FIFO). Written only by validations.
60
+ */
61
+ export const StockValuationLayer = defineModel('stock.valuation.layer', {
62
+ label: 'Stock valuation',
63
+ order: ['id asc'],
64
+ companyScoped: { required: true },
65
+ access: {
66
+ 'stock_account.user': ['read', 'export'],
67
+ 'stock.manager': ['read', 'export'],
68
+ 'account.user': ['read', 'export'],
69
+ 'account.manager': ['read', 'export'],
70
+ },
71
+ fields: {
72
+ product: f.many2one('product.product', { required: true, ondelete: 'restrict' }),
73
+ picking: f.many2one('stock.picking', { ondelete: 'set null', label: 'Transfer' }),
74
+ move: f.many2one('stock.move', { ondelete: 'set null', label: 'Transfer line' }),
75
+ date: f.date({ required: true, default: (env) => env.today() }),
76
+ /** In the product's unit: positive in, negative out. */
77
+ quantity: f.decimal({ scale: 4, required: true }),
78
+ unitCost: f.decimal({ scale: 4, required: true, default: '0', label: 'Unit cost' }),
79
+ value: f.decimal({ scale: 2, required: true, default: '0' }),
80
+ remainingQty: f.decimal({ scale: 4, required: true, default: '0', label: 'Still in stock' }),
81
+ remainingValue: f.decimal({
82
+ scale: 2,
83
+ required: true,
84
+ default: '0',
85
+ label: 'Value still in stock',
86
+ }),
87
+ accountMove: f.many2one('account.move', { ondelete: 'set null', label: 'Entry' }),
88
+ },
89
+ });
90
+ export const PickingLayers = extendModel('stock.picking', {
91
+ fields: {
92
+ valuationLayers: f.one2many('stock.valuation.layer', 'picking'),
93
+ },
94
+ });
95
+ /**
96
+ * The accounts and the Stock journal of a company, made when missing: the bridge's accounts are added to the
97
+ * company's chart, the company's defaults point to them. Null when the company has no chart yet.
98
+ */
99
+ export async function stockAccountsOf(env, company) {
100
+ const [c] = await env.model('res.company').browse([company]).load({});
101
+ if (c === undefined)
102
+ return null;
103
+ const chart = await env.model('account.account').search({ where: { company }, limit: 1 });
104
+ if (chart.length === 0)
105
+ return null;
106
+ const byCode = async (code) => (await env.model('account.account').search({ where: { company, code }, limit: 1 })).ids[0];
107
+ for (const a of STOCK_ACCOUNTS)
108
+ if ((await byCode(a.code)) === undefined)
109
+ await env.model('account.account').create([{ ...a, company }]);
110
+ const changes = {};
111
+ for (const [field, code] of Object.entries(COMPANY_DEFAULTS))
112
+ if (c[field] === null)
113
+ changes[field] = (await byCode(code)) ?? null;
114
+ if (c.stockJournal === null) {
115
+ const existing = await env
116
+ .model('account.journal')
117
+ .search({ where: { company, code: 'STJ' }, limit: 1 });
118
+ changes['stockJournal'] =
119
+ existing.ids[0] ??
120
+ (await env
121
+ .model('account.journal')
122
+ .create([{ name: 'Stock', code: 'STJ', type: 'general', company }])).ids[0];
123
+ }
124
+ if (Object.keys(changes).length > 0)
125
+ await env
126
+ .model('res.company')
127
+ .browse([company])
128
+ .write(changes);
129
+ const [after] = await env.model('res.company').browse([company]).load({});
130
+ if (after?.stockJournal == null ||
131
+ after.stockValuationAccount == null ||
132
+ after.stockInterimAccount == null ||
133
+ after.stockCogsAccount == null ||
134
+ after.stockAdjustmentAccount == null ||
135
+ after.stockPriceDiffAccount == null ||
136
+ after.stockProductionAccount == null)
137
+ return null;
138
+ return {
139
+ journal: after.stockJournal.id,
140
+ valuation: after.stockValuationAccount.id,
141
+ interim: after.stockInterimAccount.id,
142
+ cogs: after.stockCogsAccount.id,
143
+ adjustment: after.stockAdjustmentAccount.id,
144
+ priceDiff: after.stockPriceDiffAccount.id,
145
+ production: after.stockProductionAccount.id,
146
+ };
147
+ }
148
+ /**
149
+ * Values the validated transfers' goods and posts them (see the module's documentation). Incoming stock is valued
150
+ * at `incomingUnitCost` (the product's cost; a bridge may know better, a purchase order's price); outgoing stock at
151
+ * the average cost or, FIFO, from the oldest incoming layers still in stock.
152
+ */
153
+ async function valueTransfers(pickings) {
154
+ const env = pickings.env;
155
+ const loaded = await pickings.load({
156
+ source: true,
157
+ destination: true,
158
+ company: true,
159
+ partner: true,
160
+ moves: { product: { category: true } },
161
+ });
162
+ for (const p of loaded) {
163
+ const incoming = p.source.usage !== 'internal' && p.destination.usage === 'internal';
164
+ const outgoing = p.source.usage === 'internal' && p.destination.usage !== 'internal';
165
+ if (!incoming && !outgoing)
166
+ continue;
167
+ const accounts = await stockAccountsOf(env, p.company.id);
168
+ if (accounts === null)
169
+ continue; // no chart yet: nothing to post to
170
+ const costs = incoming
171
+ ? await env
172
+ .model('stock.move')
173
+ .browse([...p.moves].map((m) => m.id))
174
+ .incomingUnitCost()
175
+ : new Map();
176
+ const lines = [];
177
+ const layers = [];
178
+ for (const m of p.moves) {
179
+ const quantity = m.doneQty ?? zero;
180
+ if (quantity.lte(0))
181
+ continue;
182
+ const product = m.product;
183
+ const fifo = (product.costMethod ?? product.category?.costMethod ?? 'average') === 'fifo';
184
+ let value = zero;
185
+ if (incoming) {
186
+ const given = costs.get(m.id);
187
+ const unit = given === undefined ? product.standardPrice : orm.toDecimal(given);
188
+ value = money(quantity.times(unit));
189
+ if (!fifo) {
190
+ // The average weighs what was on hand before this receipt (the quants already hold it).
191
+ const [now] = await env.model('product.product').browse([product.id]).load(['qtyOnHand']);
192
+ const before = (now?.qtyOnHand ?? quantity).minus(quantity);
193
+ const total = before.gt(0) ? before.plus(quantity) : quantity;
194
+ const cost = before.gt(0)
195
+ ? before.times(product.standardPrice).plus(value).div(total)
196
+ : unit;
197
+ await env
198
+ .model('product.product')
199
+ .browse([product.id])
200
+ .write({ standardPrice: money(cost) });
201
+ }
202
+ layers.push({
203
+ company: p.company.id,
204
+ product: product.id,
205
+ picking: p.id,
206
+ move: m.id,
207
+ quantity,
208
+ unitCost: unit,
209
+ value,
210
+ remainingQty: quantity,
211
+ remainingValue: value,
212
+ });
213
+ }
214
+ else {
215
+ let left = quantity;
216
+ if (fifo) {
217
+ const open = await (await env.model('stock.valuation.layer').search({
218
+ where: { company: p.company.id, product: product.id, remainingQty: { gt: '0' } },
219
+ order: ['id asc'],
220
+ })).load(['remainingQty', 'remainingValue']);
221
+ for (const layer of open) {
222
+ if (left.lte(0))
223
+ break;
224
+ const take = left.lt(layer.remainingQty) ? left : layer.remainingQty;
225
+ const part = take.eq(layer.remainingQty)
226
+ ? layer.remainingValue
227
+ : money(layer.remainingValue.times(take).div(layer.remainingQty));
228
+ value = value.plus(part);
229
+ left = left.minus(take);
230
+ await layer.write({
231
+ remainingQty: layer.remainingQty.minus(take),
232
+ remainingValue: layer.remainingValue.minus(part),
233
+ });
234
+ }
235
+ }
236
+ // Average cost, or FIFO beyond the layers (stock from before valuation): the product's cost.
237
+ if (left.gt(0))
238
+ value = value.plus(money(left.times(product.standardPrice)));
239
+ layers.push({
240
+ company: p.company.id,
241
+ product: product.id,
242
+ picking: p.id,
243
+ move: m.id,
244
+ quantity: quantity.negated(),
245
+ unitCost: quantity.gt(0) ? money(value.div(quantity)) : zero,
246
+ value: value.negated(),
247
+ remainingQty: zero,
248
+ remainingValue: zero,
249
+ });
250
+ }
251
+ if (value.lte(0))
252
+ continue;
253
+ // Production consumes into and produces out of Work in progress.
254
+ const against = p.kind === 'production'
255
+ ? accounts.production
256
+ : p.kind === 'adjustment'
257
+ ? accounts.adjustment
258
+ : incoming
259
+ ? accounts.interim
260
+ : (product.category?.stockCogsAccount?.id ?? accounts.cogs);
261
+ const stock = product.category?.stockValuationAccount?.id ?? accounts.valuation;
262
+ const label = `${p.name} ${product.name}`;
263
+ if (incoming) {
264
+ lines.push({ account: stock, debit: value, credit: zero, name: label });
265
+ lines.push({ account: against, debit: zero, credit: value, name: label });
266
+ }
267
+ else {
268
+ lines.push({ account: against, debit: value, credit: zero, name: label });
269
+ lines.push({ account: stock, debit: zero, credit: value, name: label });
270
+ }
271
+ }
272
+ let entry = null;
273
+ if (lines.length > 0) {
274
+ const [company] = await env.model('res.company').browse([p.company.id]).load({});
275
+ const made = await env.model('account.move').create([
276
+ {
277
+ kind: 'entry',
278
+ journal: accounts.journal,
279
+ company: p.company.id,
280
+ currency: company?.currency.id,
281
+ date: env.today(),
282
+ ref: p.origin ? `${p.name} (${p.origin})` : p.name,
283
+ partner: p.partner?.id ?? null,
284
+ lines: { create: lines },
285
+ },
286
+ ]);
287
+ await env.withGrants({ grants: ['account.post'], reason: `stock valuation ${p.name}` }, (e) => e.model('account.move').browse(made.ids).post());
288
+ entry = made.ids[0] ?? null;
289
+ }
290
+ if (layers.length > 0)
291
+ await env
292
+ .model('stock.valuation.layer')
293
+ .create(layers.map((l) => ({ ...l, accountMove: entry })));
294
+ }
295
+ }
296
+ export const MoveCost = extendModel('stock.move', {
297
+ methods: {
298
+ /**
299
+ * What each of these lines' stock costs when it comes in, by line, in the product's unit, as a decimal string:
300
+ * the product's cost. A bridge that knows better overrides it (a purchase order's price).
301
+ */
302
+ incomingUnitCost: method('stock.move', async function () {
303
+ const out = new Map();
304
+ for (const m of await this.load({ product: true }))
305
+ out.set(m.id, m.product.standardPrice.toString());
306
+ return out;
307
+ }),
308
+ },
309
+ });
310
+ export const PickingValued = extendModel('stock.picking', {
311
+ overrides: {
312
+ // A validated transfer's stock is valued and posted.
313
+ validated: async function (next) {
314
+ await next();
315
+ await valueTransfers(this);
316
+ },
317
+ },
318
+ });
319
+ export const stockAccountShutro = defineModule({
320
+ name: 'stock_account',
321
+ version: '0.1.0',
322
+ depends: [stockShutro, accountingShutro, productShutro],
323
+ groups: [
324
+ orm.defineGroup({
325
+ code: 'stock_account.user',
326
+ label: 'Stock valuation',
327
+ implies: ['stock.user'],
328
+ }),
329
+ ],
330
+ models: [StockValuationLayer],
331
+ extensions: [
332
+ CategoryValuation,
333
+ ProductValuation,
334
+ CompanyStockAccounts,
335
+ PickingLayers,
336
+ MoveCost,
337
+ PickingValued,
338
+ ],
339
+ });
@@ -27,7 +27,12 @@ export declare function saveAttachment(env: Env, storage: Storage, models: Reado
27
27
  readonly name: string;
28
28
  readonly mime?: string | undefined;
29
29
  readonly data: Uint8Array;
30
+ /** A variant (a thumbnail) of an attachment of the same record, `width` pixels wide. */
31
+ readonly variantOf?: number | undefined;
32
+ readonly width?: number | undefined;
30
33
  }): Promise<AttachmentInfo>;
34
+ /** The variant of attachment `id` that is `width` pixels wide, if one was uploaded; else `id` itself. */
35
+ export declare function variantOf(env: Env, id: number, width: number): Promise<number>;
31
36
  /** The attachments of a record `env` may read, newest first. */
32
37
  export declare function attachmentsOf(env: Env, models: ReadonlySet<string>, model: string, id: number): Promise<AttachmentInfo[]>;
33
38
  /** Attachments by id, each checked through its record. @throws 404 for any `env` may not see */
@@ -74,16 +74,27 @@ export async function saveAttachment(env, storage, models, input) {
74
74
  key,
75
75
  resModel: input.model,
76
76
  resId: input.id,
77
+ ...(input.variantOf === undefined
78
+ ? {}
79
+ : { variantOf: input.variantOf, width: input.width ?? null }),
77
80
  },
78
81
  ]);
79
82
  const [row] = (await created.load(KEYS)).read(['id', ...KEYS]);
80
83
  return info(row);
81
84
  }
85
+ /** The variant of attachment `id` that is `width` pixels wide, if one was uploaded; else `id` itself. */
86
+ export async function variantOf(env, id, width) {
87
+ const found = await ref(env, 'storage.attachment').search({
88
+ where: { variantOf: id, width },
89
+ limit: 1,
90
+ });
91
+ return found.ids[0] ?? id;
92
+ }
82
93
  /** The attachments of a record `env` may read, newest first. */
83
94
  export async function attachmentsOf(env, models, model, id) {
84
95
  await checkRecord(env, models, model, id);
85
96
  const found = await ref(env, 'storage.attachment').search({
86
- where: { resModel: model, resId: id },
97
+ where: { resModel: model, resId: id, variantOf: null },
87
98
  order: ['id desc'],
88
99
  });
89
100
  return found.length === 0 ? [] : (await found.load(KEYS)).read(['id', ...KEYS]).map(info);
@@ -23,6 +23,9 @@ const Attachment = defineModel('storage.attachment', {
23
23
  key: f.char({ required: true, index: 'unique' }),
24
24
  resModel: f.char({ required: true, label: 'Model' }),
25
25
  resId: f.integer({ required: true, label: 'Record' }),
26
+ /** A smaller rendering of another attachment (RFC 0022 §3.3: an image's thumbnail), `width` pixels wide. */
27
+ variantOf: f.many2one('storage.attachment', { ondelete: 'cascade', label: 'Variant of' }),
28
+ width: f.integer({ label: 'Width (px)' }),
26
29
  },
27
30
  });
28
31
  export const storageShutro = defineModule({
@@ -7,7 +7,7 @@
7
7
  * - `DELETE /api/v1/attachments/:id` by the uploader
8
8
  */
9
9
  import { HttpProblem, publicApiModels } from '../server/index.js';
10
- import { attachmentsOf, cleanName, disposition, INLINE_TYPES, openAttachment, removeAttachments, saveAttachment, } from './attachments.js';
10
+ import { attachmentsOf, cleanName, disposition, INLINE_TYPES, openAttachment, removeAttachments, saveAttachment, variantOf, } from './attachments.js';
11
11
  import { StorageError, storageFromEnv } from './backends.js';
12
12
  /** Upload limit (`KOSH_ATTACHMENT_MAX_BYTES`, default 25 MB). */
13
13
  export function maxAttachmentBytes(env = process.env) {
@@ -86,6 +86,7 @@ export function registerAttachmentRoutes(context) {
86
86
  name,
87
87
  mime: request.headers['content-type'],
88
88
  data: body,
89
+ ...variantHeaders(request.headers),
89
90
  }), { write: true })
90
91
  .catch((e) => storageProblem(e, request));
91
92
  return reply.code(201).send(created);
@@ -102,8 +103,10 @@ export function registerAttachmentRoutes(context) {
102
103
  const id = positive(request.params.id, 'id');
103
104
  const inline = request.query.inline === 'true';
104
105
  const storage = storageOf(app);
106
+ // `?w=256`: the variant of that width when one was uploaded (an image's thumbnail), else the file itself.
107
+ const width = Number(request.query.w);
105
108
  const opened = await request
106
- .env((env) => openAttachment(env, storage, models, id))
109
+ .env(async (env) => openAttachment(env, storage, models, Number.isInteger(width) && width > 0 ? await variantOf(env, id, width) : id))
107
110
  .catch((e) => storageProblem(e, request));
108
111
  const shown = inline && INLINE_TYPES.has(opened.info.mime);
109
112
  return reply
@@ -132,3 +135,11 @@ export async function deleteObjects(app, keys, request) {
132
135
  request.log.warn({ err, key }, 'attachment object left behind');
133
136
  });
134
137
  }
138
+ /** `X-Variant-Of` and `X-Width` on an upload: the file is a thumbnail of that attachment, that wide. */
139
+ function variantHeaders(headers) {
140
+ const of = Number(headers['x-variant-of']);
141
+ const width = Number(headers['x-width']);
142
+ if (!Number.isInteger(of) || of <= 0)
143
+ return {};
144
+ return { variantOf: of, ...(Number.isInteger(width) && width > 0 ? { width } : {}) };
145
+ }
@@ -0,0 +1,22 @@
1
+ export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
2
+ import { type DefinitionHelpers } from '../../server/orm.js';
3
+ import type { DefaultLoaded, Env as CoreEnv, RecordSet as CoreRecordSet, Shutro as CoreShutro } from '../../server/orm.js';
4
+ import type { SchemaView } from './schema.js';
5
+ export type { SchemaView };
6
+ /** Every model visible in this view. */
7
+ export type ModelName = keyof SchemaView & string;
8
+ /** `Env` typed to this view. */
9
+ export type Env = CoreEnv<SchemaView>;
10
+ /** `Shutro` typed to this view. */
11
+ export type Shutro = CoreShutro<SchemaView>;
12
+ /** A recordset of `M`, with the default loaded shape unless `L` is given. */
13
+ export type Records<M extends ModelName, L = DefaultLoaded<SchemaView, M>> = CoreRecordSet<SchemaView, M, L>;
14
+ export declare const compute: DefinitionHelpers<SchemaView>['compute'];
15
+ export declare const check: DefinitionHelpers<SchemaView>['check'];
16
+ export declare const onchange: DefinitionHelpers<SchemaView>['onchange'];
17
+ export declare const records: DefinitionHelpers<SchemaView>['records'];
18
+ export declare const method: DefinitionHelpers<SchemaView>['method'];
19
+ /** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
20
+ export declare const record: DefinitionHelpers<SchemaView>['record'];
21
+ export declare const override: DefinitionHelpers<SchemaView>['override'];
22
+ export declare const ref: DefinitionHelpers<SchemaView>['ref'];
@@ -0,0 +1,15 @@
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 552b3bb4df0f7a15
2
+ // Bindings of module `todo`: import the definition API from here to get types scoped to what it can see.
3
+ export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
+ import { definitions } from '../../server/orm.js';
5
+ /** Definition callbacks typed against this module's view: no casts in computes, checks, onchange, methods. */
6
+ const helpers = definitions();
7
+ export const compute = helpers.compute;
8
+ export const check = helpers.check;
9
+ export const onchange = helpers.onchange;
10
+ export const records = helpers.records;
11
+ export const method = helpers.method;
12
+ /** Module data (RFC 0017): records, overrides of dependencies' records, and references, typed like creates. */
13
+ export const record = helpers.record;
14
+ export const override = helpers.override;
15
+ export const ref = helpers.ref;