shutro-erp 0.3.5 → 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 (384) 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 +123 -4
  27. package/dist/account_portal/module.d.ts +146 -0
  28. package/dist/accounting/.kosh/bindings.js +1 -1
  29. package/dist/accounting/.kosh/schema.d.ts +123 -4
  30. package/dist/accounting/index.d.ts +1 -1
  31. package/dist/accounting/index.js +131 -3
  32. package/dist/accounting/module.d.ts +296 -0
  33. package/dist/accounting/module.js +32 -1
  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/cli/init.js +32 -0
  79. package/dist/cli/templates.d.ts +1 -1
  80. package/dist/cli/templates.js +89 -0
  81. package/dist/contacts/module.js +13 -2
  82. package/dist/crm/.kosh/bindings.js +1 -1
  83. package/dist/crm/.kosh/schema.d.ts +2 -1
  84. package/dist/crm/module.d.ts +2 -0
  85. package/dist/crm/module.js +2 -1
  86. package/dist/documents/.kosh/bindings.d.ts +22 -0
  87. package/dist/documents/.kosh/bindings.js +15 -0
  88. package/dist/documents/.kosh/schema.d.ts +862 -0
  89. package/dist/documents/demo.d.ts +6 -0
  90. package/dist/documents/demo.js +22 -0
  91. package/dist/documents/documents.d.ts +98 -0
  92. package/dist/documents/documents.js +318 -0
  93. package/dist/documents/index.d.ts +30 -0
  94. package/dist/documents/index.js +442 -0
  95. package/dist/documents/module.d.ts +2781 -0
  96. package/dist/documents/module.js +214 -0
  97. package/dist/documents/web/Versions.d.ts +7 -0
  98. package/dist/documents/web/Versions.js +45 -0
  99. package/dist/documents/web/index.d.ts +11 -0
  100. package/dist/documents/web/index.js +16 -0
  101. package/dist/documents/web/messages.d.ts +2 -0
  102. package/dist/documents/web/messages.js +21 -0
  103. package/dist/event_account/.kosh/bindings.js +1 -1
  104. package/dist/event_account/.kosh/schema.d.ts +123 -4
  105. package/dist/event_account/module.d.ts +146 -0
  106. package/dist/expense/.kosh/bindings.d.ts +22 -0
  107. package/dist/expense/.kosh/bindings.js +15 -0
  108. package/dist/expense/.kosh/schema.d.ts +1299 -0
  109. package/dist/expense/demo.d.ts +7 -0
  110. package/dist/expense/demo.js +69 -0
  111. package/dist/expense/index.d.ts +3 -0
  112. package/dist/expense/index.js +495 -0
  113. package/dist/expense/module.d.ts +4747 -0
  114. package/dist/expense/module.js +647 -0
  115. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  116. package/dist/expense_account/.kosh/bindings.js +15 -0
  117. package/dist/expense_account/.kosh/schema.d.ts +1936 -0
  118. package/dist/expense_account/index.d.ts +3 -0
  119. package/dist/expense_account/index.js +74 -0
  120. package/dist/expense_account/module.d.ts +9153 -0
  121. package/dist/expense_account/module.js +318 -0
  122. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  123. package/dist/helpdesk/.kosh/bindings.js +15 -0
  124. package/dist/helpdesk/.kosh/schema.d.ts +885 -0
  125. package/dist/helpdesk/demo.d.ts +7 -0
  126. package/dist/helpdesk/demo.js +65 -0
  127. package/dist/helpdesk/hours.d.ts +17 -0
  128. package/dist/helpdesk/hours.js +94 -0
  129. package/dist/helpdesk/index.d.ts +10 -0
  130. package/dist/helpdesk/index.js +461 -0
  131. package/dist/helpdesk/module.d.ts +2940 -0
  132. package/dist/helpdesk/module.js +326 -0
  133. package/dist/helpdesk/routes.d.ts +12 -0
  134. package/dist/helpdesk/routes.js +132 -0
  135. package/dist/helpdesk/sla.d.ts +37 -0
  136. package/dist/helpdesk/sla.js +226 -0
  137. package/dist/hr/index.d.ts +1 -1
  138. package/dist/hr/index.js +1 -1
  139. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  140. package/dist/l10n_bd/.kosh/schema.d.ts +123 -4
  141. package/dist/l10n_bd/module.d.ts +146 -0
  142. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  143. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  144. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2312 -0
  145. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  146. package/dist/l10n_bd_payroll/data.js +347 -0
  147. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  148. package/dist/l10n_bd_payroll/index.js +24 -0
  149. package/dist/l10n_bd_payroll/module.d.ts +12932 -0
  150. package/dist/l10n_bd_payroll/module.js +86 -0
  151. package/dist/l10n_in/.kosh/bindings.js +1 -1
  152. package/dist/l10n_in/.kosh/schema.d.ts +123 -4
  153. package/dist/l10n_in/module.d.ts +147 -0
  154. package/dist/mail/inbound/handle.js +6 -1
  155. package/dist/maintenance_stock/.kosh/bindings.js +1 -1
  156. package/dist/maintenance_stock/.kosh/schema.d.ts +77 -2
  157. package/dist/maintenance_stock/module.d.ts +788 -66
  158. package/dist/modules-sdk/index.d.ts +1 -1
  159. package/dist/modules-sdk/manifest.d.ts +39 -2
  160. package/dist/mrp/.kosh/bindings.js +1 -1
  161. package/dist/mrp/.kosh/schema.d.ts +77 -2
  162. package/dist/mrp/index.d.ts +1 -1
  163. package/dist/mrp/index.js +2 -1
  164. package/dist/mrp/module.d.ts +781 -54
  165. package/dist/mrp/module.js +64 -2
  166. package/dist/mrp_account/.kosh/bindings.js +1 -1
  167. package/dist/mrp_account/.kosh/schema.d.ts +198 -5
  168. package/dist/mrp_account/module.d.ts +4852 -2541
  169. package/dist/payment/.kosh/bindings.js +1 -1
  170. package/dist/payment/.kosh/schema.d.ts +125 -5
  171. package/dist/payment/index.d.ts +41 -0
  172. package/dist/payment/index.js +131 -74
  173. package/dist/payment/module.d.ts +210 -6
  174. package/dist/payment/module.js +19 -3
  175. package/dist/payment/settle.js +10 -1
  176. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  177. package/dist/payroll/.kosh/bindings.js +15 -0
  178. package/dist/payroll/.kosh/schema.d.ts +1390 -0
  179. package/dist/payroll/compute.d.ts +35 -0
  180. package/dist/payroll/compute.js +398 -0
  181. package/dist/payroll/demo.d.ts +55 -0
  182. package/dist/payroll/demo.js +121 -0
  183. package/dist/payroll/formula.d.ts +62 -0
  184. package/dist/payroll/formula.js +320 -0
  185. package/dist/payroll/index.d.ts +230 -0
  186. package/dist/payroll/index.js +713 -0
  187. package/dist/payroll/module.d.ts +9390 -0
  188. package/dist/payroll/module.js +606 -0
  189. package/dist/payroll/routes.d.ts +10 -0
  190. package/dist/payroll/routes.js +112 -0
  191. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  192. package/dist/payroll_account/.kosh/bindings.js +15 -0
  193. package/dist/payroll_account/.kosh/schema.d.ts +2308 -0
  194. package/dist/payroll_account/index.d.ts +3 -0
  195. package/dist/payroll_account/index.js +40 -0
  196. package/dist/payroll_account/module.d.ts +12396 -0
  197. package/dist/payroll_account/module.js +256 -0
  198. package/dist/permissions/approvals.d.ts +131 -9
  199. package/dist/permissions/approvals.js +662 -57
  200. package/dist/permissions/index.d.ts +1 -1
  201. package/dist/permissions/index.js +2 -2
  202. package/dist/permissions/models.js +191 -12
  203. package/dist/permissions/routes.d.ts +6 -1
  204. package/dist/permissions/routes.js +37 -4
  205. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  206. package/dist/permissions/web/ApprovalPanel.js +39 -13
  207. package/dist/permissions/web/index.d.ts +6 -4
  208. package/dist/permissions/web/index.js +13 -4
  209. package/dist/permissions/web/messages.d.ts +2 -0
  210. package/dist/permissions/web/messages.js +43 -0
  211. package/dist/portal/index.js +1 -1
  212. package/dist/pos/.kosh/bindings.js +1 -1
  213. package/dist/pos/.kosh/schema.d.ts +123 -4
  214. package/dist/pos/index.js +4 -0
  215. package/dist/pos/module.d.ts +147 -0
  216. package/dist/pos_stock/.kosh/bindings.js +1 -1
  217. package/dist/pos_stock/.kosh/schema.d.ts +198 -5
  218. package/dist/pos_stock/module.d.ts +914 -46
  219. package/dist/product/.kosh/bindings.js +1 -1
  220. package/dist/product/.kosh/schema.d.ts +2 -1
  221. package/dist/product/index.js +13 -0
  222. package/dist/product/module.d.ts +2 -0
  223. package/dist/product/module.js +2 -1
  224. package/dist/project/.kosh/bindings.js +1 -1
  225. package/dist/project/.kosh/schema.d.ts +672 -1
  226. package/dist/project/index.d.ts +3 -1
  227. package/dist/project/index.js +901 -14
  228. package/dist/project/module.d.ts +9892 -390
  229. package/dist/project/module.js +1530 -13
  230. package/dist/project/routes.d.ts +44 -0
  231. package/dist/project/routes.js +314 -0
  232. package/dist/project/schedule.d.ts +72 -0
  233. package/dist/project/schedule.js +192 -0
  234. package/dist/project/web/Refresh.d.ts +8 -0
  235. package/dist/project/web/Refresh.js +29 -0
  236. package/dist/project/web/Schedule.d.ts +9 -0
  237. package/dist/project/web/Schedule.js +93 -0
  238. package/dist/project/web/Structure.d.ts +8 -0
  239. package/dist/project/web/Structure.js +86 -0
  240. package/dist/project/web/Workload.d.ts +8 -0
  241. package/dist/project/web/Workload.js +43 -0
  242. package/dist/project/web/index.d.ts +14 -0
  243. package/dist/project/web/index.js +25 -0
  244. package/dist/project/web/messages.d.ts +2 -0
  245. package/dist/project/web/messages.js +85 -0
  246. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  247. package/dist/project_account/.kosh/bindings.js +15 -0
  248. package/dist/project_account/.kosh/schema.d.ts +2241 -0
  249. package/dist/project_account/index.d.ts +3 -0
  250. package/dist/project_account/index.js +27 -0
  251. package/dist/project_account/module.d.ts +11539 -0
  252. package/dist/project_account/module.js +76 -0
  253. package/dist/project_portal/.kosh/bindings.js +1 -1
  254. package/dist/project_portal/.kosh/schema.d.ts +672 -1
  255. package/dist/project_portal/module.d.ts +4798 -129
  256. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  257. package/dist/project_purchase/.kosh/bindings.js +15 -0
  258. package/dist/project_purchase/.kosh/schema.d.ts +2320 -0
  259. package/dist/project_purchase/index.d.ts +9 -0
  260. package/dist/project_purchase/index.js +22 -0
  261. package/dist/project_purchase/module.d.ts +25147 -0
  262. package/dist/project_purchase/module.js +56 -0
  263. package/dist/purchase/.kosh/bindings.js +1 -1
  264. package/dist/purchase/.kosh/schema.d.ts +97 -4
  265. package/dist/purchase/module.d.ts +13 -2
  266. package/dist/purchase/module.js +10 -1
  267. package/dist/purchase_account/.kosh/bindings.js +1 -1
  268. package/dist/purchase_account/.kosh/schema.d.ts +126 -6
  269. package/dist/purchase_account/index.js +1 -0
  270. package/dist/purchase_account/module.d.ts +176 -1
  271. package/dist/purchase_account/module.js +13 -2
  272. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  273. package/dist/purchase_portal/.kosh/schema.d.ts +97 -4
  274. package/dist/purchase_portal/module.d.ts +6 -1
  275. package/dist/purchase_stock/.kosh/bindings.js +1 -1
  276. package/dist/purchase_stock/.kosh/schema.d.ts +174 -5
  277. package/dist/purchase_stock/index.d.ts +1 -1
  278. package/dist/purchase_stock/index.js +9 -2
  279. package/dist/purchase_stock/module.d.ts +840 -68
  280. package/dist/purchase_stock/module.js +242 -6
  281. package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
  282. package/dist/purchase_stock_account/.kosh/schema.d.ts +203 -7
  283. package/dist/purchase_stock_account/module.d.ts +8163 -5514
  284. package/dist/purchase_stock_account/module.js +11 -5
  285. package/dist/recruitment/.kosh/bindings.js +1 -1
  286. package/dist/recruitment/.kosh/schema.d.ts +2 -1
  287. package/dist/recruitment/module.d.ts +2 -0
  288. package/dist/recruitment/module.js +2 -1
  289. package/dist/sale_account/.kosh/bindings.js +1 -1
  290. package/dist/sale_account/.kosh/schema.d.ts +123 -4
  291. package/dist/sale_account/module.d.ts +147 -0
  292. package/dist/sale_portal/.kosh/bindings.js +1 -1
  293. package/dist/sale_portal/.kosh/schema.d.ts +2 -1
  294. package/dist/sale_portal/module.d.ts +1 -0
  295. package/dist/sale_project/.kosh/bindings.js +1 -1
  296. package/dist/sale_project/.kosh/schema.d.ts +673 -1
  297. package/dist/sale_project/module.d.ts +4800 -129
  298. package/dist/sale_project/module.js +17 -1
  299. package/dist/sale_stock/.kosh/bindings.js +1 -1
  300. package/dist/sale_stock/.kosh/schema.d.ts +77 -2
  301. package/dist/sale_stock/module.d.ts +789 -66
  302. package/dist/sales/.kosh/bindings.js +1 -1
  303. package/dist/sales/.kosh/schema.d.ts +2 -1
  304. package/dist/sales/index.js +4 -0
  305. package/dist/sales/module.d.ts +1 -0
  306. package/dist/sign/.kosh/bindings.d.ts +22 -0
  307. package/dist/sign/.kosh/bindings.js +15 -0
  308. package/dist/sign/.kosh/schema.d.ts +990 -0
  309. package/dist/sign/index.d.ts +14 -0
  310. package/dist/sign/index.js +350 -0
  311. package/dist/sign/module.d.ts +4478 -0
  312. package/dist/sign/module.js +158 -0
  313. package/dist/sign/sign.d.ts +82 -0
  314. package/dist/sign/sign.js +474 -0
  315. package/dist/stock/.kosh/bindings.js +1 -1
  316. package/dist/stock/.kosh/schema.d.ts +77 -2
  317. package/dist/stock/demo.d.ts +2 -1
  318. package/dist/stock/demo.js +28 -1
  319. package/dist/stock/index.d.ts +2 -1
  320. package/dist/stock/index.js +233 -4
  321. package/dist/stock/module.d.ts +2363 -837
  322. package/dist/stock/module.js +569 -14
  323. package/dist/stock/replenish.d.ts +38 -0
  324. package/dist/stock/replenish.js +176 -0
  325. package/dist/stock/web/Replenishment.d.ts +8 -0
  326. package/dist/stock/web/Replenishment.js +84 -0
  327. package/dist/stock/web/index.d.ts +4 -2
  328. package/dist/stock/web/index.js +6 -2
  329. package/dist/stock/web/messages.js +52 -0
  330. package/dist/stock_account/.kosh/bindings.js +1 -1
  331. package/dist/stock_account/.kosh/schema.d.ts +198 -5
  332. package/dist/stock_account/index.js +10 -0
  333. package/dist/stock_account/module.d.ts +969 -101
  334. package/dist/trade_finance/index.js +2 -0
  335. package/dist/trade_finance/module.js +2 -0
  336. package/dist/trade_finance_account/.kosh/bindings.js +1 -1
  337. package/dist/trade_finance_account/.kosh/schema.d.ts +123 -4
  338. package/dist/trade_finance_account/index.js +1 -0
  339. package/dist/trade_finance_account/module.d.ts +146 -0
  340. package/dist/trade_finance_account/module.js +1 -0
  341. package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
  342. package/dist/trade_finance_purchase/.kosh/schema.d.ts +97 -4
  343. package/dist/trade_finance_purchase/module.d.ts +6 -1
  344. package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
  345. package/dist/trade_finance_sale/.kosh/schema.d.ts +2 -1
  346. package/dist/trade_finance_sale/module.d.ts +1 -0
  347. package/dist/ui/app.js +24 -12
  348. package/dist/ui/components/AppIcon.js +8 -1
  349. package/dist/ui/i18n/messages.d.ts +4 -0
  350. package/dist/ui/i18n/messages.js +8 -0
  351. package/dist/ui/views/FormView.js +4 -2
  352. package/dist/ui/views/KanbanView.js +9 -1
  353. package/dist/ui/views/ListView.js +4 -2
  354. package/dist/ui/views/widgets.js +7 -1
  355. package/dist/website/index.js +1 -0
  356. package/dist/website/module.js +1 -0
  357. package/dist/website_crm/.kosh/bindings.js +1 -1
  358. package/dist/website_crm/.kosh/schema.d.ts +2 -1
  359. package/dist/website_crm/module.d.ts +1 -0
  360. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  361. package/dist/website_sale/.kosh/bindings.js +15 -0
  362. package/dist/website_sale/.kosh/schema.d.ts +2284 -0
  363. package/dist/website_sale/couriers.d.ts +50 -0
  364. package/dist/website_sale/couriers.js +59 -0
  365. package/dist/website_sale/demo.d.ts +7 -0
  366. package/dist/website_sale/demo.js +90 -0
  367. package/dist/website_sale/growth.d.ts +31 -0
  368. package/dist/website_sale/growth.js +163 -0
  369. package/dist/website_sale/index.d.ts +49 -0
  370. package/dist/website_sale/index.js +538 -0
  371. package/dist/website_sale/module.d.ts +22027 -0
  372. package/dist/website_sale/module.js +397 -0
  373. package/dist/website_sale/shipments.d.ts +16 -0
  374. package/dist/website_sale/shipments.js +113 -0
  375. package/dist/website_sale/shop.d.ts +81 -0
  376. package/dist/website_sale/shop.js +649 -0
  377. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  378. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  379. package/dist/website_sale_stock/.kosh/schema.d.ts +2681 -0
  380. package/dist/website_sale_stock/index.d.ts +9 -0
  381. package/dist/website_sale_stock/index.js +20 -0
  382. package/dist/website_sale_stock/module.d.ts +24998 -0
  383. package/dist/website_sale_stock/module.js +28 -0
  384. package/package.json +83 -2
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Spend in the books (RFC 0024 §2.1, `expense_account`): each category has its expense account; an approved report
3
+ * is **booked** as one posted entry — each expense's amount less its tax to the category's account, the tax to the
4
+ * tax's account; against it what the advance covered (Employee advances), what the employee paid (Employee
5
+ * reimbursements payable) and what the company card paid (Company card clearing) — and **reimbursed** from the cash
6
+ * or bank journal chosen on the report. An advance's payout and the cash returned at its settlement are booked from
7
+ * its journal. Accounts and the Expenses journal are found by their codes, and made when the chart lacks them.
8
+ */
9
+ import { accountingShutro } from '../accounting/index.js';
10
+ import { expenseShutro } from '../expense/index.js';
11
+ import { orm } from '../server/orm.js';
12
+ import { defineModule, extendModel, f, records } from './.kosh/bindings.js';
13
+ const ZERO = orm.toDecimal(0);
14
+ /** The accounts Spend books to, by code, made when missing. */
15
+ export const EXPENSE_ACCOUNTS = {
16
+ advances: { code: '1170', name: 'Employee advances', type: 'asset_current', reconcile: true },
17
+ payable: {
18
+ code: '2170',
19
+ name: 'Employee reimbursements payable',
20
+ type: 'liability_current',
21
+ reconcile: true,
22
+ },
23
+ card: { code: '2180', name: 'Company card clearing', type: 'liability_current', reconcile: true },
24
+ expense: { code: '6350', name: 'Staff expenses', type: 'expense', reconcile: false },
25
+ };
26
+ /** The company's Spend accounts and the Expenses journal (`EXP`); `null` without a chart. */
27
+ export async function expenseAccountsOf(env, company) {
28
+ const chart = await env.model('account.account').search({ where: { company }, limit: 1 });
29
+ if (chart.length === 0)
30
+ return null;
31
+ const out = {};
32
+ for (const [key, spec] of Object.entries(EXPENSE_ACCOUNTS)) {
33
+ const found = (await env.model('account.account').search({ where: { company, code: spec.code }, limit: 1 })).ids[0];
34
+ out[key] =
35
+ found ??
36
+ (await env.model('account.account').create([{ ...spec, company }]))
37
+ .ids[0];
38
+ }
39
+ const journal = (await env.model('account.journal').search({ where: { company, code: 'EXP' }, limit: 1 }))
40
+ .ids[0] ??
41
+ (await env
42
+ .model('account.journal')
43
+ .create([{ company, code: 'EXP', name: 'Expenses', type: 'general' }])).ids[0];
44
+ out.journal = journal;
45
+ return out;
46
+ }
47
+ /** Posts one balanced entry in `journal` and returns it. */
48
+ async function post(env, company, journal, ref, lines) {
49
+ const kept = lines.filter((l) => !l.debit.isZero() || !l.credit.isZero());
50
+ const [c] = await env.model('res.company').browse([company]).load({});
51
+ const made = await env.model('account.move').create([
52
+ {
53
+ kind: 'entry',
54
+ journal,
55
+ company,
56
+ currency: c?.currency.id,
57
+ date: env.today(),
58
+ ref,
59
+ lines: {
60
+ create: kept.map((l) => ({
61
+ account: l.account,
62
+ name: l.name,
63
+ debit: l.debit.toDecimalPlaces(2).toString(),
64
+ credit: l.credit.toDecimalPlaces(2).toString(),
65
+ })),
66
+ },
67
+ },
68
+ ]);
69
+ await env.withGrants({ grants: ['account.post'], reason: `Spend ${ref}` }, (e) => e.model('account.move').browse(made.ids).post());
70
+ return made.ids[0];
71
+ }
72
+ const noChart = (model) => new orm.ValidationError(model, ['state'], 'The company has no chart of accounts yet.', 'Install a chart in Accounting first.');
73
+ /** The cash or bank journal's account. @throws {ValidationError} without one */
74
+ async function moneyAccount(env, model, journal) {
75
+ if (journal === null)
76
+ throw new orm.ValidationError(model, ['paymentJournal'], 'Choose the cash or bank journal it is paid from.', 'Set “Paid from” on the record, then try again.');
77
+ const [j] = await env.model('account.journal').browse([journal.id]).load({});
78
+ const account = j?.defaultAccount?.id;
79
+ if (j === undefined || account === undefined || (j.type !== 'cash' && j.type !== 'bank'))
80
+ throw new orm.ValidationError(model, ['paymentJournal'], 'Pay from a cash or bank journal with its account.', 'Choose a cash or bank journal (Accounting › Configuration › Journals).');
81
+ return { journal: journal.id, account };
82
+ }
83
+ /** Books approved reports: one posted entry each. */
84
+ async function bookSheets(env, ids) {
85
+ for (const s of await env
86
+ .model('expense.sheet')
87
+ .browse(ids)
88
+ .load({
89
+ expenses: { category: true, tax: true },
90
+ company: true,
91
+ employee: true,
92
+ })) {
93
+ const accounts = await expenseAccountsOf(env, s.company.id);
94
+ if (accounts === null)
95
+ throw noChart('expense.sheet');
96
+ const lines = [];
97
+ let employeePaid = ZERO;
98
+ let companyPaid = ZERO;
99
+ for (const e of s.expenses) {
100
+ const tax = e.taxAmount ?? ZERO;
101
+ const account = e.category.account?.id ?? accounts.expense;
102
+ lines.push({ account, debit: e.amount.minus(tax), credit: ZERO, name: e.name });
103
+ if (!tax.isZero())
104
+ lines.push({
105
+ account: e.tax?.account?.id ?? account,
106
+ debit: tax,
107
+ credit: ZERO,
108
+ name: `${e.name} (${e.tax?.name ?? 'tax'})`,
109
+ });
110
+ if (e.paidBy === 'company')
111
+ companyPaid = companyPaid.plus(e.amount);
112
+ else
113
+ employeePaid = employeePaid.plus(e.amount);
114
+ }
115
+ const fromAdvance = s.advanceUsed.gt(employeePaid) ? employeePaid : s.advanceUsed;
116
+ lines.push({
117
+ account: accounts.advances,
118
+ debit: ZERO,
119
+ credit: fromAdvance,
120
+ name: `${s.name} from the advance`,
121
+ });
122
+ lines.push({
123
+ account: accounts.payable,
124
+ debit: ZERO,
125
+ credit: employeePaid.minus(fromAdvance),
126
+ name: `${s.name} to reimburse ${s.employee.name}`,
127
+ });
128
+ lines.push({
129
+ account: accounts.card,
130
+ debit: ZERO,
131
+ credit: companyPaid,
132
+ name: `${s.name} company card`,
133
+ });
134
+ const entry = await post(env, s.company.id, accounts.journal, s.name, lines);
135
+ await env
136
+ .model('expense.sheet')
137
+ .browse([s.id])
138
+ .write({ entry });
139
+ }
140
+ }
141
+ /** Pays reports out: the payable cleared against the cash or bank journal. */
142
+ async function reimburseSheets(env, ids) {
143
+ for (const s of await env
144
+ .model('expense.sheet')
145
+ .browse(ids)
146
+ .load({ company: true, employee: true })) {
147
+ const accounts = await expenseAccountsOf(env, s.company.id);
148
+ if (accounts === null)
149
+ throw noChart('expense.sheet');
150
+ const amount = s.toReimburse ?? ZERO;
151
+ if (amount.isZero())
152
+ continue;
153
+ const money = await moneyAccount(env, 'expense.sheet', s.paymentJournal);
154
+ const entry = await post(env, s.company.id, money.journal, `${s.name} reimbursed`, [
155
+ {
156
+ account: accounts.payable,
157
+ debit: amount,
158
+ credit: ZERO,
159
+ name: `${s.name} ${s.employee.name}`,
160
+ },
161
+ { account: money.account, debit: ZERO, credit: amount, name: `${s.name} ${s.employee.name}` },
162
+ ]);
163
+ await env
164
+ .model('expense.sheet')
165
+ .browse([s.id])
166
+ .write({ paymentEntry: entry });
167
+ }
168
+ }
169
+ export const CategoryAccount = extendModel('expense.category', {
170
+ fields: {
171
+ account: f.many2one('account.account', {
172
+ ondelete: 'restrict',
173
+ label: 'Expense account',
174
+ help: 'Where this category is booked; empty: Staff expenses (6350).',
175
+ }),
176
+ },
177
+ });
178
+ export const SheetBooks = extendModel('expense.sheet', {
179
+ fields: {
180
+ entry: f.many2one('account.move', { ondelete: 'restrict', label: 'Journal entry' }),
181
+ paymentJournal: f.many2one('account.journal', {
182
+ ondelete: 'restrict',
183
+ label: 'Paid from',
184
+ help: 'The cash or bank journal the reimbursement is paid from.',
185
+ }),
186
+ paymentEntry: f.many2one('account.move', {
187
+ ondelete: 'restrict',
188
+ label: 'Reimbursement entry',
189
+ }),
190
+ },
191
+ fieldOverrides: {
192
+ state: {
193
+ statesAdd: { posted: 'Booked', paid: 'Reimbursed' },
194
+ transitionsAdd: {
195
+ post: {
196
+ from: ['approved'],
197
+ to: 'posted',
198
+ requires: 'expense.settle',
199
+ after: records('expense.sheet', async (sheets) => {
200
+ const env = sheets.env;
201
+ await env.flush();
202
+ await env.asSuperuser({ reason: 'book expense reports' }, (su) => bookSheets(su, sheets.ids));
203
+ }),
204
+ },
205
+ reimburse: {
206
+ from: ['posted'],
207
+ to: 'paid',
208
+ requires: 'expense.settle',
209
+ after: records('expense.sheet', async (sheets) => {
210
+ const env = sheets.env;
211
+ await env.flush();
212
+ await env.asSuperuser({ reason: 'reimburse expense reports' }, (su) => reimburseSheets(su, sheets.ids));
213
+ }),
214
+ },
215
+ },
216
+ },
217
+ },
218
+ });
219
+ export const AdvanceBooks = extendModel('expense.advance', {
220
+ fields: {
221
+ paymentJournal: f.many2one('account.journal', {
222
+ ondelete: 'restrict',
223
+ label: 'Paid from',
224
+ help: 'The cash or bank journal the advance is paid from, and the rest returned to.',
225
+ }),
226
+ entry: f.many2one('account.move', { ondelete: 'restrict', label: 'Payout entry' }),
227
+ returnEntry: f.many2one('account.move', { ondelete: 'restrict', label: 'Return entry' }),
228
+ },
229
+ overrides: {
230
+ // The payout: Employee advances against the cash or bank journal.
231
+ paidOut: async function (next) {
232
+ await next();
233
+ const advances = this;
234
+ const env = advances.env;
235
+ await env.asSuperuser({ reason: 'book advance payouts' }, async (su) => {
236
+ for (const a of await su
237
+ .model('expense.advance')
238
+ .browse(advances.ids)
239
+ .load({ company: true, employee: true })) {
240
+ const accounts = await expenseAccountsOf(su, a.company.id);
241
+ if (accounts === null)
242
+ throw noChart('expense.advance');
243
+ const money = await moneyAccount(su, 'expense.advance', a.paymentJournal);
244
+ const entry = await post(su, a.company.id, money.journal, `${a.name} paid out`, [
245
+ {
246
+ account: accounts.advances,
247
+ debit: a.amount,
248
+ credit: ZERO,
249
+ name: `${a.name} ${a.employee.name}`,
250
+ },
251
+ {
252
+ account: money.account,
253
+ debit: ZERO,
254
+ credit: a.amount,
255
+ name: `${a.name} ${a.employee.name}`,
256
+ },
257
+ ]);
258
+ await su
259
+ .model('expense.advance')
260
+ .browse([a.id])
261
+ .write({ entry });
262
+ }
263
+ });
264
+ },
265
+ // The settlement: what is left comes back to the cash or bank journal.
266
+ settledOut: async function (next) {
267
+ await next();
268
+ const advances = this;
269
+ const env = advances.env;
270
+ await env.asSuperuser({ reason: 'book advance returns' }, async (su) => {
271
+ for (const a of await su
272
+ .model('expense.advance')
273
+ .browse(advances.ids)
274
+ .load({ company: true, employee: true })) {
275
+ const left = a.balance ?? ZERO;
276
+ if (left.lte(0))
277
+ continue;
278
+ const accounts = await expenseAccountsOf(su, a.company.id);
279
+ if (accounts === null)
280
+ throw noChart('expense.advance');
281
+ const money = await moneyAccount(su, 'expense.advance', a.paymentJournal);
282
+ const entry = await post(su, a.company.id, money.journal, `${a.name} returned`, [
283
+ {
284
+ account: money.account,
285
+ debit: left,
286
+ credit: ZERO,
287
+ name: `${a.name} ${a.employee.name}`,
288
+ },
289
+ {
290
+ account: accounts.advances,
291
+ debit: ZERO,
292
+ credit: left,
293
+ name: `${a.name} ${a.employee.name}`,
294
+ },
295
+ ]);
296
+ await su
297
+ .model('expense.advance')
298
+ .browse([a.id])
299
+ .write({ returnEntry: entry });
300
+ }
301
+ });
302
+ },
303
+ },
304
+ });
305
+ export const expenseAccountShutro = defineModule({
306
+ name: 'expense_account',
307
+ version: '0.1.0',
308
+ depends: [expenseShutro, accountingShutro],
309
+ groups: [
310
+ orm.defineGroup({
311
+ code: 'expense_account.user',
312
+ label: 'Spend in the books',
313
+ implies: ['expense.user'],
314
+ }),
315
+ ],
316
+ models: [],
317
+ extensions: [CategoryAccount, SheetBooks, AdvanceBooks],
318
+ });
@@ -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: 68417e703dd003a1
2
+ // Bindings of module `helpdesk`: 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;