shutro-erp 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/dist/account_portal/.kosh/bindings.js +1 -1
  2. package/dist/account_portal/.kosh/schema.d.ts +181 -3
  3. package/dist/account_portal/module.d.ts +359 -6
  4. package/dist/accounting/.kosh/bindings.js +1 -1
  5. package/dist/accounting/.kosh/schema.d.ts +181 -3
  6. package/dist/accounting/index.js +214 -2
  7. package/dist/accounting/module.d.ts +217 -5
  8. package/dist/accounting/module.js +23 -2
  9. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  10. package/dist/calendar/.kosh/bindings.js +15 -0
  11. package/dist/calendar/.kosh/schema.d.ts +795 -0
  12. package/dist/calendar/demo.d.ts +6 -0
  13. package/dist/calendar/demo.js +24 -0
  14. package/dist/calendar/index.d.ts +3 -0
  15. package/dist/calendar/index.js +291 -0
  16. package/dist/calendar/module.d.ts +1705 -0
  17. package/dist/calendar/module.js +180 -0
  18. package/dist/cli/init.js +48 -0
  19. package/dist/cli/templates.d.ts +1 -1
  20. package/dist/cli/templates.js +137 -0
  21. package/dist/contacts/.kosh/bindings.js +1 -1
  22. package/dist/contacts/.kosh/schema.d.ts +205 -3
  23. package/dist/contacts/demo.js +30 -1
  24. package/dist/contacts/index.d.ts +1 -1
  25. package/dist/contacts/index.js +155 -9
  26. package/dist/contacts/module.d.ts +338 -2
  27. package/dist/contacts/module.js +82 -5
  28. package/dist/crm/.kosh/bindings.d.ts +22 -0
  29. package/dist/crm/.kosh/bindings.js +15 -0
  30. package/dist/crm/.kosh/schema.d.ts +799 -0
  31. package/dist/crm/demo.d.ts +6 -0
  32. package/dist/crm/demo.js +45 -0
  33. package/dist/crm/index.d.ts +3 -0
  34. package/dist/crm/index.js +361 -0
  35. package/dist/crm/module.d.ts +1843 -0
  36. package/dist/crm/module.js +207 -0
  37. package/dist/event/.kosh/bindings.d.ts +22 -0
  38. package/dist/event/.kosh/bindings.js +15 -0
  39. package/dist/event/.kosh/schema.d.ts +843 -0
  40. package/dist/event/demo.d.ts +6 -0
  41. package/dist/event/demo.js +65 -0
  42. package/dist/event/index.d.ts +14 -0
  43. package/dist/event/index.js +333 -0
  44. package/dist/event/mails.d.ts +15 -0
  45. package/dist/event/mails.js +112 -0
  46. package/dist/event/module.d.ts +2800 -0
  47. package/dist/event/module.js +323 -0
  48. package/dist/event/web/CheckInBox.d.ts +9 -0
  49. package/dist/event/web/CheckInBox.js +87 -0
  50. package/dist/event/web/index.d.ts +11 -0
  51. package/dist/event/web/index.js +16 -0
  52. package/dist/event/web/messages.d.ts +2 -0
  53. package/dist/event/web/messages.js +23 -0
  54. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  55. package/dist/event_account/.kosh/bindings.js +15 -0
  56. package/dist/event_account/.kosh/schema.d.ts +1639 -0
  57. package/dist/event_account/index.d.ts +3 -0
  58. package/dist/event_account/index.js +28 -0
  59. package/dist/event_account/module.d.ts +6968 -0
  60. package/dist/event_account/module.js +90 -0
  61. package/dist/hr/.kosh/bindings.d.ts +22 -0
  62. package/dist/hr/.kosh/bindings.js +15 -0
  63. package/dist/hr/.kosh/schema.d.ts +878 -0
  64. package/dist/hr/demo.d.ts +6 -0
  65. package/dist/hr/demo.js +60 -0
  66. package/dist/hr/index.d.ts +3 -0
  67. package/dist/hr/index.js +483 -0
  68. package/dist/hr/module.d.ts +2611 -0
  69. package/dist/hr/module.js +350 -0
  70. package/dist/integrations/index.js +12 -0
  71. package/dist/integrations/web/OAuthAppsPage.d.ts +9 -0
  72. package/dist/integrations/web/OAuthAppsPage.js +79 -0
  73. package/dist/integrations/web/index.d.ts +1 -0
  74. package/dist/integrations/web/index.js +3 -0
  75. package/dist/integrations/web/messages.js +58 -0
  76. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  77. package/dist/l10n_bd/.kosh/schema.d.ts +181 -3
  78. package/dist/l10n_bd/module.d.ts +359 -6
  79. package/dist/l10n_in/.kosh/bindings.js +1 -1
  80. package/dist/l10n_in/.kosh/schema.d.ts +181 -3
  81. package/dist/l10n_in/module.d.ts +380 -7
  82. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  83. package/dist/maintenance/.kosh/bindings.js +15 -0
  84. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  85. package/dist/maintenance/demo.d.ts +6 -0
  86. package/dist/maintenance/demo.js +60 -0
  87. package/dist/maintenance/index.d.ts +3 -0
  88. package/dist/maintenance/index.js +422 -0
  89. package/dist/maintenance/module.d.ts +3545 -0
  90. package/dist/maintenance/module.js +446 -0
  91. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  92. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  93. package/dist/maintenance_stock/.kosh/schema.d.ts +1371 -0
  94. package/dist/maintenance_stock/index.d.ts +9 -0
  95. package/dist/maintenance_stock/index.js +52 -0
  96. package/dist/maintenance_stock/module.d.ts +6953 -0
  97. package/dist/maintenance_stock/module.js +192 -0
  98. package/dist/messaging/web/index.js +1 -1
  99. package/dist/modules-sdk/index.d.ts +1 -1
  100. package/dist/modules-sdk/manifest.d.ts +70 -0
  101. package/dist/modules-sdk/manifest.js +35 -1
  102. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  103. package/dist/mrp/.kosh/bindings.js +15 -0
  104. package/dist/mrp/.kosh/schema.d.ts +1378 -0
  105. package/dist/mrp/demo.d.ts +7 -0
  106. package/dist/mrp/demo.js +42 -0
  107. package/dist/mrp/index.d.ts +3 -0
  108. package/dist/mrp/index.js +392 -0
  109. package/dist/mrp/module.d.ts +8608 -0
  110. package/dist/mrp/module.js +695 -0
  111. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  112. package/dist/mrp_account/.kosh/bindings.js +15 -0
  113. package/dist/mrp_account/.kosh/schema.d.ts +2106 -0
  114. package/dist/mrp_account/index.d.ts +3 -0
  115. package/dist/mrp_account/index.js +22 -0
  116. package/dist/mrp_account/module.d.ts +20840 -0
  117. package/dist/mrp_account/module.js +123 -0
  118. package/dist/notify/web/index.js +1 -1
  119. package/dist/payment/.kosh/bindings.js +1 -1
  120. package/dist/payment/.kosh/schema.d.ts +181 -3
  121. package/dist/payment/module.d.ts +359 -6
  122. package/dist/portal/.kosh/bindings.js +1 -1
  123. package/dist/portal/.kosh/schema.d.ts +205 -3
  124. package/dist/portal/module.d.ts +166 -2
  125. package/dist/pos/.kosh/bindings.d.ts +22 -0
  126. package/dist/pos/.kosh/bindings.js +15 -0
  127. package/dist/pos/.kosh/schema.d.ts +1690 -0
  128. package/dist/pos/accounting.d.ts +10 -0
  129. package/dist/pos/accounting.js +149 -0
  130. package/dist/pos/demo.d.ts +6 -0
  131. package/dist/pos/demo.js +90 -0
  132. package/dist/pos/index.d.ts +9 -0
  133. package/dist/pos/index.js +349 -0
  134. package/dist/pos/module.d.ts +9636 -0
  135. package/dist/pos/module.js +423 -0
  136. package/dist/pos/routes.d.ts +39 -0
  137. package/dist/pos/routes.js +368 -0
  138. package/dist/pos/web/Register.d.ts +9 -0
  139. package/dist/pos/web/Register.js +252 -0
  140. package/dist/pos/web/index.d.ts +11 -0
  141. package/dist/pos/web/index.js +16 -0
  142. package/dist/pos/web/messages.d.ts +2 -0
  143. package/dist/pos/web/messages.js +87 -0
  144. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  145. package/dist/pos_stock/.kosh/bindings.js +15 -0
  146. package/dist/pos_stock/.kosh/schema.d.ts +2015 -0
  147. package/dist/pos_stock/index.d.ts +9 -0
  148. package/dist/pos_stock/index.js +35 -0
  149. package/dist/pos_stock/module.d.ts +11935 -0
  150. package/dist/pos_stock/module.js +115 -0
  151. package/dist/product/.kosh/bindings.js +1 -1
  152. package/dist/product/.kosh/schema.d.ts +178 -1
  153. package/dist/product/index.js +81 -4
  154. package/dist/product/module.d.ts +43 -1
  155. package/dist/product/module.js +9 -2
  156. package/dist/project/.kosh/bindings.js +1 -1
  157. package/dist/project/.kosh/schema.d.ts +181 -3
  158. package/dist/project/index.js +147 -7
  159. package/dist/project/module.d.ts +210 -2
  160. package/dist/project/module.js +52 -5
  161. package/dist/project_portal/.kosh/bindings.js +1 -1
  162. package/dist/project_portal/.kosh/schema.d.ts +181 -3
  163. package/dist/project_portal/module.d.ts +353 -4
  164. package/dist/purchase/.kosh/bindings.js +1 -1
  165. package/dist/purchase/.kosh/schema.d.ts +181 -3
  166. package/dist/purchase/index.js +163 -3
  167. package/dist/purchase/module.d.ts +215 -3
  168. package/dist/purchase/module.js +21 -3
  169. package/dist/purchase_account/.kosh/bindings.js +1 -1
  170. package/dist/purchase_account/.kosh/schema.d.ts +182 -3
  171. package/dist/purchase_account/index.js +26 -1
  172. package/dist/purchase_account/module.d.ts +393 -7
  173. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  174. package/dist/purchase_portal/.kosh/schema.d.ts +181 -3
  175. package/dist/purchase_portal/module.d.ts +366 -5
  176. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  177. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  178. package/dist/purchase_stock/.kosh/schema.d.ts +1310 -0
  179. package/dist/purchase_stock/index.d.ts +7 -0
  180. package/dist/purchase_stock/index.js +91 -0
  181. package/dist/purchase_stock/module.d.ts +6763 -0
  182. package/dist/purchase_stock/module.js +144 -0
  183. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  184. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  185. package/dist/purchase_stock_account/.kosh/schema.d.ts +1959 -0
  186. package/dist/purchase_stock_account/index.d.ts +3 -0
  187. package/dist/purchase_stock_account/index.js +24 -0
  188. package/dist/purchase_stock_account/module.d.ts +35366 -0
  189. package/dist/purchase_stock_account/module.js +162 -0
  190. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  191. package/dist/recruitment/.kosh/bindings.js +15 -0
  192. package/dist/recruitment/.kosh/schema.d.ts +990 -0
  193. package/dist/recruitment/demo.d.ts +6 -0
  194. package/dist/recruitment/demo.js +45 -0
  195. package/dist/recruitment/index.d.ts +3 -0
  196. package/dist/recruitment/index.js +385 -0
  197. package/dist/recruitment/module.d.ts +3247 -0
  198. package/dist/recruitment/module.js +193 -0
  199. package/dist/recruitment/web/HireButton.d.ts +9 -0
  200. package/dist/recruitment/web/HireButton.js +32 -0
  201. package/dist/recruitment/web/index.d.ts +11 -0
  202. package/dist/recruitment/web/index.js +16 -0
  203. package/dist/recruitment/web/messages.d.ts +2 -0
  204. package/dist/recruitment/web/messages.js +19 -0
  205. package/dist/reporting/documents.d.ts +5 -0
  206. package/dist/reporting/documents.js +28 -1
  207. package/dist/reporting/index.d.ts +1 -1
  208. package/dist/reporting/index.js +4 -2
  209. package/dist/reporting/models.js +9 -0
  210. package/dist/reporting/overviews.d.ts +16 -0
  211. package/dist/reporting/overviews.js +56 -0
  212. package/dist/reporting/routes-documents.js +1 -1
  213. package/dist/reporting/routes.js +138 -80
  214. package/dist/reporting/web/DashboardView.d.ts +11 -0
  215. package/dist/reporting/web/DashboardView.js +2 -2
  216. package/dist/reporting/web/DesignerView.js +5 -0
  217. package/dist/reporting/web/Overview.d.ts +9 -0
  218. package/dist/reporting/web/Overview.js +53 -0
  219. package/dist/reporting/web/index.d.ts +1 -0
  220. package/dist/reporting/web/index.js +4 -1
  221. package/dist/reporting/web/messages.js +9 -0
  222. package/dist/sale_account/.kosh/bindings.js +1 -1
  223. package/dist/sale_account/.kosh/schema.d.ts +186 -3
  224. package/dist/sale_account/index.js +22 -1
  225. package/dist/sale_account/module.d.ts +461 -7
  226. package/dist/sale_portal/.kosh/bindings.js +1 -1
  227. package/dist/sale_portal/.kosh/schema.d.ts +185 -3
  228. package/dist/sale_portal/module.d.ts +434 -5
  229. package/dist/sale_project/.kosh/bindings.js +1 -1
  230. package/dist/sale_project/.kosh/schema.d.ts +187 -3
  231. package/dist/sale_project/module.d.ts +476 -6
  232. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  233. package/dist/sale_stock/.kosh/bindings.js +15 -0
  234. package/dist/sale_stock/.kosh/schema.d.ts +1228 -0
  235. package/dist/sale_stock/index.d.ts +7 -0
  236. package/dist/sale_stock/index.js +84 -0
  237. package/dist/sale_stock/module.d.ts +6791 -0
  238. package/dist/sale_stock/module.js +146 -0
  239. package/dist/sales/.kosh/bindings.js +1 -1
  240. package/dist/sales/.kosh/schema.d.ts +185 -3
  241. package/dist/sales/index.js +191 -4
  242. package/dist/sales/module.d.ts +355 -3
  243. package/dist/sales/module.js +78 -3
  244. package/dist/server/api/metadata.d.ts +5 -0
  245. package/dist/server/api/metadata.js +5 -0
  246. package/dist/server/api/rest.js +64 -1
  247. package/dist/server/api/views.js +1 -0
  248. package/dist/server/app-settings.d.ts +7 -0
  249. package/dist/server/app-settings.js +10 -0
  250. package/dist/server/auth/base.js +85 -0
  251. package/dist/server/auth/oauth.d.ts +21 -0
  252. package/dist/server/auth/oauth.js +579 -0
  253. package/dist/server/auth/service.d.ts +4 -0
  254. package/dist/server/auth/service.js +17 -0
  255. package/dist/server/identity.d.ts +2 -0
  256. package/dist/server/images.d.ts +12 -0
  257. package/dist/server/images.js +139 -0
  258. package/dist/server/index.d.ts +2 -0
  259. package/dist/server/index.js +2 -0
  260. package/dist/server/server.d.ts +4 -0
  261. package/dist/server/server.js +9 -1
  262. package/dist/settings/app-settings.d.ts +2 -0
  263. package/dist/settings/app-settings.js +518 -0
  264. package/dist/settings/company.js +3 -1
  265. package/dist/settings/index.d.ts +1 -0
  266. package/dist/settings/index.js +15 -0
  267. package/dist/settings/people.js +32 -6
  268. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  269. package/dist/settings/web/AppSettingsPage.js +210 -0
  270. package/dist/settings/web/CompaniesPage.js +2 -2
  271. package/dist/settings/web/CompanyPage.js +13 -2
  272. package/dist/settings/web/ConnectedAppsPage.d.ts +7 -0
  273. package/dist/settings/web/ConnectedAppsPage.js +33 -0
  274. package/dist/settings/web/OverviewPage.js +28 -4
  275. package/dist/settings/web/PeoplePage.js +23 -18
  276. package/dist/settings/web/ProfilePage.js +9 -7
  277. package/dist/settings/web/index.d.ts +2 -0
  278. package/dist/settings/web/index.js +8 -0
  279. package/dist/settings/web/messages.js +146 -2
  280. package/dist/stock/.kosh/bindings.d.ts +22 -0
  281. package/dist/stock/.kosh/bindings.js +15 -0
  282. package/dist/stock/.kosh/schema.d.ts +1147 -0
  283. package/dist/stock/demo.d.ts +7 -0
  284. package/dist/stock/demo.js +55 -0
  285. package/dist/stock/index.d.ts +3 -0
  286. package/dist/stock/index.js +674 -0
  287. package/dist/stock/module.d.ts +6330 -0
  288. package/dist/stock/module.js +1325 -0
  289. package/dist/stock/web/ScanBox.d.ts +8 -0
  290. package/dist/stock/web/ScanBox.js +90 -0
  291. package/dist/stock/web/index.d.ts +11 -0
  292. package/dist/stock/web/index.js +16 -0
  293. package/dist/stock/web/messages.d.ts +2 -0
  294. package/dist/stock/web/messages.js +25 -0
  295. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  296. package/dist/stock_account/.kosh/bindings.js +15 -0
  297. package/dist/stock_account/.kosh/schema.d.ts +1875 -0
  298. package/dist/stock_account/index.d.ts +3 -0
  299. package/dist/stock_account/index.js +130 -0
  300. package/dist/stock_account/module.d.ts +10655 -0
  301. package/dist/stock_account/module.js +339 -0
  302. package/dist/storage/attachments.d.ts +5 -0
  303. package/dist/storage/attachments.js +12 -1
  304. package/dist/storage/models.js +3 -0
  305. package/dist/storage/routes.js +13 -2
  306. package/dist/todo/.kosh/bindings.d.ts +22 -0
  307. package/dist/todo/.kosh/bindings.js +15 -0
  308. package/dist/todo/.kosh/schema.d.ts +732 -0
  309. package/dist/todo/demo.d.ts +6 -0
  310. package/dist/todo/demo.js +35 -0
  311. package/dist/todo/index.d.ts +3 -0
  312. package/dist/todo/index.js +187 -0
  313. package/dist/todo/module.d.ts +1180 -0
  314. package/dist/todo/module.js +130 -0
  315. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  316. package/dist/trade_finance/.kosh/bindings.js +15 -0
  317. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  318. package/dist/trade_finance/demo.d.ts +6 -0
  319. package/dist/trade_finance/demo.js +63 -0
  320. package/dist/trade_finance/index.d.ts +3 -0
  321. package/dist/trade_finance/index.js +413 -0
  322. package/dist/trade_finance/module.d.ts +3779 -0
  323. package/dist/trade_finance/module.js +505 -0
  324. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  325. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  326. package/dist/trade_finance_account/.kosh/schema.d.ts +1711 -0
  327. package/dist/trade_finance_account/index.d.ts +3 -0
  328. package/dist/trade_finance_account/index.js +92 -0
  329. package/dist/trade_finance_account/module.d.ts +7928 -0
  330. package/dist/trade_finance_account/module.js +244 -0
  331. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  332. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  333. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1153 -0
  334. package/dist/trade_finance_purchase/index.d.ts +8 -0
  335. package/dist/trade_finance_purchase/index.js +50 -0
  336. package/dist/trade_finance_purchase/module.d.ts +4252 -0
  337. package/dist/trade_finance_purchase/module.js +44 -0
  338. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  339. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  340. package/dist/trade_finance_sale/.kosh/schema.d.ts +1071 -0
  341. package/dist/trade_finance_sale/index.d.ts +8 -0
  342. package/dist/trade_finance_sale/index.js +50 -0
  343. package/dist/trade_finance_sale/module.d.ts +4280 -0
  344. package/dist/trade_finance_sale/module.js +44 -0
  345. package/dist/ui/api.d.ts +6 -1
  346. package/dist/ui/api.js +2 -1
  347. package/dist/ui/app.js +51 -17
  348. package/dist/ui/components/AppIcon.js +33 -1
  349. package/dist/ui/components/Avatar.d.ts +21 -0
  350. package/dist/ui/components/Avatar.js +71 -0
  351. package/dist/ui/components/primitives.d.ts +2 -0
  352. package/dist/ui/components/primitives.js +7 -1
  353. package/dist/ui/i18n/messages.d.ts +53 -0
  354. package/dist/ui/i18n/messages.js +98 -0
  355. package/dist/ui/index.d.ts +2 -0
  356. package/dist/ui/index.js +2 -0
  357. package/dist/ui/offline/queue.d.ts +5 -1
  358. package/dist/ui/offline/queue.js +2 -0
  359. package/dist/ui/registry.d.ts +12 -1
  360. package/dist/ui/registry.js +10 -1
  361. package/dist/ui/search/ViewTabs.d.ts +14 -0
  362. package/dist/ui/search/ViewTabs.js +42 -0
  363. package/dist/ui/shell/Consent.d.ts +5 -0
  364. package/dist/ui/shell/Consent.js +35 -0
  365. package/dist/ui/shell/Home.js +136 -16
  366. package/dist/ui/shell/Sidebar.js +15 -22
  367. package/dist/ui/views/FormView.js +98 -17
  368. package/dist/ui/views/KanbanView.d.ts +2 -0
  369. package/dist/ui/views/KanbanView.js +32 -3
  370. package/dist/ui/views/ListView.js +155 -31
  371. package/dist/ui/views/StatsRow.d.ts +14 -0
  372. package/dist/ui/views/StatsRow.js +88 -0
  373. package/dist/ui/views/widgets.d.ts +2 -1
  374. package/dist/ui/views/widgets.js +194 -1
  375. package/dist/views/builders.d.ts +19 -2
  376. package/dist/views/builders.js +21 -1
  377. package/dist/views/condition.d.ts +6 -0
  378. package/dist/views/condition.js +20 -0
  379. package/dist/views/documents.d.ts +8 -0
  380. package/dist/views/extend.d.ts +2 -2
  381. package/dist/views/extend.js +11 -1
  382. package/dist/views/index.d.ts +2 -2
  383. package/dist/views/index.js +2 -2
  384. package/dist/views/types.d.ts +52 -5
  385. package/dist/views/validate.js +39 -1
  386. package/dist/website/.kosh/bindings.d.ts +22 -0
  387. package/dist/website/.kosh/bindings.js +15 -0
  388. package/dist/website/.kosh/schema.d.ts +881 -0
  389. package/dist/website/demo.d.ts +6 -0
  390. package/dist/website/demo.js +115 -0
  391. package/dist/website/index.d.ts +9 -0
  392. package/dist/website/index.js +250 -0
  393. package/dist/website/module.d.ts +2987 -0
  394. package/dist/website/module.js +281 -0
  395. package/dist/website/render.d.ts +45 -0
  396. package/dist/website/render.js +102 -0
  397. package/dist/website/routes.d.ts +12 -0
  398. package/dist/website/routes.js +246 -0
  399. package/dist/website/web/PagePreview.d.ts +7 -0
  400. package/dist/website/web/PagePreview.js +33 -0
  401. package/dist/website/web/index.d.ts +11 -0
  402. package/dist/website/web/index.js +16 -0
  403. package/dist/website/web/messages.d.ts +2 -0
  404. package/dist/website/web/messages.js +15 -0
  405. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  406. package/dist/website_crm/.kosh/bindings.js +15 -0
  407. package/dist/website_crm/.kosh/schema.d.ts +966 -0
  408. package/dist/website_crm/index.d.ts +3 -0
  409. package/dist/website_crm/index.js +39 -0
  410. package/dist/website_crm/module.d.ts +2955 -0
  411. package/dist/website_crm/module.js +44 -0
  412. package/package.json +118 -1
@@ -0,0 +1,505 @@
1
+ /**
2
+ * The data layer of Trade Finance (RFC 0021): import and export letters of credit under UCP 600 — the amount with its
3
+ * tolerance, at sight or usance, the shipment and expiry dates —, amendments applied only once accepted,
4
+ * presentations of documents with their discrepancies, accepted (with their maturity) and paid, and the limits each
5
+ * bank gives, which issuing an LC never passes.
6
+ */
7
+ import { contactsShutro } from '../contacts/index.js';
8
+ import { messagingShutro } from '../messaging/index.js';
9
+ import { installationSetting } from '../server/index.js';
10
+ import { orm } from '../server/orm.js';
11
+ import { check, compute, defineModel, defineModule, f, method, records, } from './.kosh/bindings.js';
12
+ const ALL = ['read', 'write', 'create', 'unlink'];
13
+ const zero = orm.toDecimal(0);
14
+ /** A date as `YYYY-MM-DD` (date-only values from PostgreSQL are local midnights: their local parts). */
15
+ export const iso = (v) => {
16
+ if (!(v instanceof Date))
17
+ return String(v ?? '').slice(0, 10);
18
+ const pad = (n) => String(n).padStart(2, '0');
19
+ return `${v.getFullYear()}-${pad(v.getMonth() + 1)}-${pad(v.getDate())}`;
20
+ };
21
+ export const addDays = (date, days) => {
22
+ const d = new Date(`${date}T00:00:00`);
23
+ d.setDate(d.getDate() + days);
24
+ return iso(d);
25
+ };
26
+ /** A monetary or decimal value as a Decimal. */
27
+ const amountOf = (v) => v === null || v === undefined
28
+ ? zero
29
+ : typeof v === 'object' && 'amount' in v
30
+ ? (v.amount ?? zero)
31
+ : orm.toDecimal(String(v));
32
+ /** How many days ahead the alerts look (App settings › Trade Finance). */
33
+ export async function alertDays(env) {
34
+ const value = Number(await installationSetting(env, 'trade_finance.alertDays', 15));
35
+ return Number.isInteger(value) && value >= 0 ? value : 15;
36
+ }
37
+ export const INCOTERMS = {
38
+ exw: 'EXW — Ex works',
39
+ fca: 'FCA — Free carrier',
40
+ fob: 'FOB — Free on board',
41
+ cfr: 'CFR — Cost and freight',
42
+ cif: 'CIF — Cost, insurance and freight',
43
+ cpt: 'CPT — Carriage paid to',
44
+ cip: 'CIP — Carriage and insurance paid to',
45
+ dap: 'DAP — Delivered at place',
46
+ ddp: 'DDP — Delivered duty paid',
47
+ };
48
+ export const TradeLimit = defineModel('trade.lc.limit', {
49
+ label: 'LC limit',
50
+ order: ['bank asc', 'currency asc'],
51
+ companyScoped: { required: true },
52
+ access: {
53
+ 'trade_finance.user': ['read'],
54
+ 'trade_finance.manager': [...ALL, 'export'],
55
+ },
56
+ fields: {
57
+ bank: f.many2one('res.partner', { required: true, ondelete: 'restrict' }),
58
+ currency: f.many2one('res.currency', { required: true, ondelete: 'restrict' }),
59
+ amount: f.monetary({ currency: 'currency', required: true, label: 'Limit' }),
60
+ note: f.text(),
61
+ },
62
+ sqlConstraints: {
63
+ onePerBank: {
64
+ unique: ['company', 'bank', 'currency'],
65
+ message: 'This bank already has a limit in this currency.',
66
+ },
67
+ },
68
+ });
69
+ export const TradeLc = defineModel('trade.lc', {
70
+ label: 'Letter of credit',
71
+ recName: 'name',
72
+ order: ['expiryDate asc', 'id desc'],
73
+ companyScoped: { required: true },
74
+ tracking: ['state', 'amount', 'expiryDate', 'latestShipmentDate', 'bankReference'],
75
+ access: {
76
+ 'trade_finance.user': ['read', 'write', 'create'],
77
+ 'trade_finance.manager': [...ALL, 'export', 'import'],
78
+ },
79
+ fields: {
80
+ name: f.char({
81
+ required: true,
82
+ readonly: true,
83
+ sequence: { code: 'trade.lc', dateField: 'applicationDate' },
84
+ label: 'Reference',
85
+ }),
86
+ /** The LC number the bank gives when it issues it. */
87
+ bankReference: f.char({ label: 'LC number' }),
88
+ direction: f.selection({ import: 'Import (we apply)', export: 'Export (opened for us)' }, { required: true, default: 'import' }),
89
+ bank: f.many2one('res.partner', {
90
+ required: true,
91
+ ondelete: 'restrict',
92
+ label: 'Issuing bank',
93
+ }),
94
+ /** The vendor (import) or the customer (export). */
95
+ partner: f.many2one('res.partner', {
96
+ required: true,
97
+ ondelete: 'restrict',
98
+ label: 'Counterparty',
99
+ }),
100
+ currency: f.many2one('res.currency', { required: true, ondelete: 'restrict' }),
101
+ amount: f.monetary({ currency: 'currency', required: true }),
102
+ /** ± percent drawn beyond or short of the amount (UCP 600 art. 30). */
103
+ tolerance: f.decimal({ scale: 2, required: true, default: '0', label: 'Tolerance (± %)' }),
104
+ payment: f.selection({ sight: 'At sight', usance: 'Usance (days after acceptance)' }, { required: true, default: 'sight' }),
105
+ usanceDays: f.integer({ label: 'Usance (days)' }),
106
+ incoterm: f.selection(INCOTERMS, { label: 'Incoterm' }),
107
+ applicationDate: f.date({
108
+ required: true,
109
+ default: (env) => env.today(),
110
+ label: 'Applied on',
111
+ }),
112
+ issueDate: f.date({ label: 'Issued on' }),
113
+ latestShipmentDate: f.date({ required: true, label: 'Latest shipment' }),
114
+ expiryDate: f.date({ required: true, label: 'Expires on' }),
115
+ expiryPlace: f.char({ label: 'Expires at' }),
116
+ partialShipment: f.boolean({ default: false, label: 'Partial shipments allowed' }),
117
+ transshipment: f.boolean({ default: false, label: 'Transshipment allowed' }),
118
+ documents: f.text({ label: 'Documents required' }),
119
+ /** What the bank holds of ours against the LC (percent of the amount). */
120
+ marginPercent: f.decimal({ scale: 2, default: '0', label: 'Margin (%)' }),
121
+ origin: f.char({ label: 'Source document' }),
122
+ amendments: f.one2many('trade.lc.amendment', 'lc'),
123
+ presentations: f.one2many('trade.lc.presentation', 'lc'),
124
+ shipments: f.one2many('trade.lc.shipment', 'lc'),
125
+ shipped: f.decimal({
126
+ scale: 2,
127
+ store: true,
128
+ label: 'Shipped',
129
+ ...compute('trade.lc', 'shipped', ['shipments.value'], (lcs) => {
130
+ for (const lc of lcs)
131
+ lc.shipped = [...lc.shipments].reduce((s, x) => s.plus(amountOf(x.value)), zero);
132
+ }),
133
+ }),
134
+ /** At most the amount plus the tolerance. */
135
+ maxDrawable: f.decimal({
136
+ scale: 2,
137
+ store: true,
138
+ label: 'Can be drawn',
139
+ ...compute('trade.lc', 'maxDrawable', ['amount', 'tolerance'], (lcs) => {
140
+ for (const lc of lcs)
141
+ lc.maxDrawable = amountOf(lc.amount)
142
+ .times(orm.toDecimal(100).plus(lc.tolerance))
143
+ .div(100)
144
+ .toDecimalPlaces(2);
145
+ }),
146
+ }),
147
+ drawn: f.decimal({
148
+ scale: 2,
149
+ store: true,
150
+ label: 'Drawn',
151
+ ...compute('trade.lc', 'drawn', ['presentations.amount', 'presentations.state'], (lcs) => {
152
+ for (const lc of lcs)
153
+ lc.drawn = [...lc.presentations]
154
+ .filter((p) => p.state !== 'refused')
155
+ .reduce((s, p) => s.plus(amountOf(p.amount)), zero);
156
+ }),
157
+ }),
158
+ paid: f.decimal({
159
+ scale: 2,
160
+ store: true,
161
+ label: 'Paid',
162
+ ...compute('trade.lc', 'paid', ['presentations.amount', 'presentations.state'], (lcs) => {
163
+ for (const lc of lcs)
164
+ lc.paid = [...lc.presentations]
165
+ .filter((p) => p.state === 'paid')
166
+ .reduce((s, p) => s.plus(amountOf(p.amount)), zero);
167
+ }),
168
+ }),
169
+ /** What the LC still commits the bank to (amount less paid), while issued. */
170
+ outstanding: f.decimal({
171
+ scale: 2,
172
+ store: true,
173
+ label: 'Outstanding',
174
+ ...compute('trade.lc', 'outstanding', ['amount', 'paid', 'state'], (lcs) => {
175
+ for (const lc of lcs) {
176
+ const left = amountOf(lc.amount).minus(amountOf(lc.paid));
177
+ lc.outstanding = lc.state === 'issued' && left.gt(0) ? left : zero;
178
+ }
179
+ }),
180
+ }),
181
+ note: f.text(),
182
+ state: f.state({
183
+ states: {
184
+ draft: 'Draft',
185
+ applied: 'Applied',
186
+ issued: 'Issued',
187
+ settled: 'Settled',
188
+ cancel: 'Cancelled',
189
+ },
190
+ initial: 'draft',
191
+ transitions: {
192
+ apply: { from: ['draft'], to: 'applied' },
193
+ issue: {
194
+ from: ['applied'],
195
+ to: 'issued',
196
+ requires: 'trade_finance.issue',
197
+ // Within the bank's limit, if it has one in the LC's currency.
198
+ guard: records('trade.lc', async (lcs) => {
199
+ const env = lcs.env;
200
+ const over = [];
201
+ for (const lc of await lcs.load({})) {
202
+ const [limit] = await (await env.model('trade.lc.limit').search({
203
+ where: { company: lc.company.id, bank: lc.bank.id, currency: lc.currency.id },
204
+ limit: 1,
205
+ })).load({});
206
+ if (limit === undefined)
207
+ continue;
208
+ const others = await (await env.model('trade.lc').search({
209
+ where: {
210
+ company: lc.company.id,
211
+ bank: lc.bank.id,
212
+ currency: lc.currency.id,
213
+ state: 'issued',
214
+ id: { ne: lc.id },
215
+ },
216
+ })).load(['outstanding']);
217
+ const used = [...others].reduce((s, o) => s.plus(amountOf(o.outstanding)), zero);
218
+ if (used.plus(amountOf(lc.amount)).gt(amountOf(limit.amount)))
219
+ over.push(lc.id);
220
+ }
221
+ return over;
222
+ }),
223
+ message: 'The bank’s limit would be passed: settle other LCs, or have the limit raised.',
224
+ after: records('trade.lc', async (lcs) => {
225
+ for (const lc of await lcs.load({}))
226
+ if (lc.issueDate === null)
227
+ await lc.write({ issueDate: lcs.env.today() });
228
+ await lcs.env.model('trade.lc').browse(lcs.ids).issued();
229
+ }),
230
+ },
231
+ settle: {
232
+ from: ['issued'],
233
+ to: 'settled',
234
+ after: records('trade.lc', async (lcs) => {
235
+ await lcs.env.model('trade.lc').browse(lcs.ids).closed();
236
+ }),
237
+ },
238
+ cancel: {
239
+ from: ['draft', 'applied', 'issued'],
240
+ to: 'cancel',
241
+ after: records('trade.lc', async (lcs) => {
242
+ await lcs.env.model('trade.lc').browse(lcs.ids).closed();
243
+ }),
244
+ },
245
+ redraft: { from: ['cancel'], to: 'draft' },
246
+ },
247
+ }),
248
+ },
249
+ methods: {
250
+ /** Runs once these LCs are recorded issued. Nothing here; `trade_finance_account` posts their margin. */
251
+ issued: method('trade.lc', async () => undefined),
252
+ /** Runs once these LCs are settled or cancelled. Nothing here; `trade_finance_account` releases the margin. */
253
+ closed: method('trade.lc', async () => undefined),
254
+ },
255
+ sqlConstraints: {
256
+ sensible: {
257
+ check: orm.sql `tolerance >= 0 AND tolerance <= 100 AND margin_percent >= 0 AND margin_percent <= 100`,
258
+ message: 'Tolerance and margin are percents between 0 and 100.',
259
+ },
260
+ },
261
+ constraints: {
262
+ dates: {
263
+ ...check('trade.lc', ['latestShipmentDate', 'expiryDate', 'applicationDate'], async (lcs) => [...lcs]
264
+ .filter((lc) => iso(lc.latestShipmentDate) > iso(lc.expiryDate) ||
265
+ iso(lc.expiryDate) < iso(lc.applicationDate))
266
+ .map((lc) => lc.id)),
267
+ message: 'Goods ship on or before the LC expires, and it expires after it is applied for.',
268
+ },
269
+ usance: {
270
+ ...check('trade.lc', ['payment', 'usanceDays'], async (lcs) => [...lcs]
271
+ .filter((lc) => lc.payment === 'usance' && (lc.usanceDays === null || lc.usanceDays <= 0))
272
+ .map((lc) => lc.id)),
273
+ message: 'A usance LC says after how many days it is paid.',
274
+ },
275
+ positive: {
276
+ ...check('trade.lc', ['amount'], async (lcs) => [...lcs].filter((lc) => amountOf(lc.amount).lte(0)).map((lc) => lc.id)),
277
+ message: 'An LC is for a positive amount.',
278
+ },
279
+ },
280
+ });
281
+ export const TradeAmendment = defineModel('trade.lc.amendment', {
282
+ label: 'LC amendment',
283
+ order: ['id asc'],
284
+ access: {
285
+ 'trade_finance.user': ['read', 'write', 'create'],
286
+ 'trade_finance.manager': [...ALL, 'export'],
287
+ },
288
+ fields: {
289
+ lc: f.many2one('trade.lc', { required: true, ondelete: 'cascade', label: 'LC' }),
290
+ date: f.date({ required: true, default: (env) => env.today() }),
291
+ newAmount: f.decimal({ scale: 2, label: 'New amount' }),
292
+ newExpiryDate: f.date({ label: 'New expiry' }),
293
+ newShipmentDate: f.date({ label: 'New latest shipment' }),
294
+ note: f.text({ label: 'What changes' }),
295
+ state: f.state({
296
+ states: { draft: 'Requested', accepted: 'Accepted', refused: 'Refused' },
297
+ initial: 'draft',
298
+ transitions: {
299
+ // Binding once accepted (UCP 600 art. 10): only then does the LC change.
300
+ accept: {
301
+ from: ['draft'],
302
+ to: 'accepted',
303
+ requires: 'trade_finance.issue',
304
+ before: records('trade.lc.amendment', async (amendments) => {
305
+ for (const a of await amendments.load({ lc: true })) {
306
+ const changes = {};
307
+ if (a.newAmount !== null)
308
+ changes['amount'] = a.newAmount.toString();
309
+ if (a.newExpiryDate !== null)
310
+ changes['expiryDate'] = iso(a.newExpiryDate);
311
+ if (a.newShipmentDate !== null)
312
+ changes['latestShipmentDate'] = iso(a.newShipmentDate);
313
+ if (Object.keys(changes).length > 0)
314
+ await amendments.env
315
+ .model('trade.lc')
316
+ .browse([a.lc.id])
317
+ .write(changes);
318
+ }
319
+ }),
320
+ },
321
+ refuse: { from: ['draft'], to: 'refused' },
322
+ },
323
+ }),
324
+ },
325
+ constraints: {
326
+ // Amendments are to issued LCs.
327
+ issuedOnly: {
328
+ ...check('trade.lc.amendment', ['lc'], async (amendments) => (await amendments.load({ lc: true }))
329
+ .filter((a) => a.lc.state !== 'issued')
330
+ .map((a) => a.id)),
331
+ message: 'Only an issued LC is amended.',
332
+ },
333
+ },
334
+ });
335
+ export const TradePresentation = defineModel('trade.lc.presentation', {
336
+ label: 'Presentation',
337
+ order: ['date asc', 'id asc'],
338
+ access: {
339
+ 'trade_finance.user': ['read', 'write', 'create'],
340
+ 'trade_finance.manager': [...ALL, 'export'],
341
+ },
342
+ fields: {
343
+ lc: f.many2one('trade.lc', { required: true, ondelete: 'cascade', label: 'LC' }),
344
+ currency: f.many2one('res.currency', {
345
+ store: true,
346
+ readonly: true,
347
+ ...compute('trade.lc.presentation', 'currency', ['lc.currency'], (presentations) => {
348
+ for (const p of presentations)
349
+ p.currency = p.lc.currency.id;
350
+ }),
351
+ }),
352
+ date: f.date({ required: true, default: (env) => env.today(), label: 'Presented on' }),
353
+ amount: f.monetary({ currency: 'currency', required: true, label: 'Drawn' }),
354
+ documents: f.text({ label: 'Documents presented' }),
355
+ /** What the bank found that does not comply. */
356
+ discrepancies: f.text(),
357
+ /** The applicant accepts the documents despite the discrepancies. */
358
+ waived: f.boolean({ default: false, label: 'Discrepancies waived' }),
359
+ acceptedOn: f.date({ label: 'Accepted on' }),
360
+ maturityDate: f.date({ label: 'Due on' }),
361
+ paidOn: f.date({ label: 'Paid on' }),
362
+ state: f.state({
363
+ states: { presented: 'Presented', accepted: 'Accepted', paid: 'Paid', refused: 'Refused' },
364
+ initial: 'presented',
365
+ transitions: {
366
+ accept: {
367
+ from: ['presented'],
368
+ to: 'accepted',
369
+ guard: records('trade.lc.presentation', async (presentations) => (await presentations.load({})).filter((p) => (p.discrepancies ?? '').trim() !== '' && !p.waived)),
370
+ message: 'The documents are discrepant: waive the discrepancies, or refuse them.',
371
+ // The maturity: at sight the acceptance date; usance, so many days after it.
372
+ after: records('trade.lc.presentation', async (presentations) => {
373
+ const today = iso(presentations.env.today());
374
+ for (const p of await presentations.load({ lc: true }))
375
+ await p.write({
376
+ acceptedOn: today,
377
+ maturityDate: p.lc.payment === 'usance' ? addDays(today, p.lc.usanceDays ?? 0) : today,
378
+ });
379
+ }),
380
+ },
381
+ pay: {
382
+ from: ['accepted'],
383
+ to: 'paid',
384
+ after: records('trade.lc.presentation', async (presentations) => {
385
+ const env = presentations.env;
386
+ await presentations.write({ paidOn: env.today() });
387
+ await env.model('trade.lc.presentation').browse(presentations.ids).paid();
388
+ // An LC paid in full is settled.
389
+ for (const p of await presentations.load({ lc: true })) {
390
+ const [lc] = await env.model('trade.lc').browse([p.lc.id]).load({});
391
+ if (lc?.state === 'issued' && amountOf(lc.paid).gte(amountOf(lc.amount)))
392
+ await env.model('trade.lc').browse([lc.id]).settle();
393
+ }
394
+ }),
395
+ },
396
+ refuse: { from: ['presented'], to: 'refused' },
397
+ },
398
+ }),
399
+ },
400
+ methods: {
401
+ /** Runs once these presentations are paid. Nothing here; `trade_finance_account` posts the payment. */
402
+ paid: method('trade.lc.presentation', async () => undefined),
403
+ },
404
+ constraints: {
405
+ // Drawn only on an issued LC, never beyond the amount plus the tolerance, nor after it expired.
406
+ withinTheLc: {
407
+ ...check('trade.lc.presentation', ['amount', 'lc', 'date'], async (presentations) => {
408
+ const failing = [];
409
+ for (const p of await presentations.load({ lc: { presentations: true } })) {
410
+ const lc = p.lc;
411
+ const drawn = [...lc.presentations]
412
+ .filter((x) => x.state !== 'refused')
413
+ .reduce((s, x) => s.plus(amountOf(x.amount)), zero);
414
+ if (lc.state !== 'issued' ||
415
+ amountOf(p.amount).lte(0) ||
416
+ drawn.gt(amountOf(lc.maxDrawable)) ||
417
+ iso(p.date) > iso(lc.expiryDate))
418
+ failing.push(p.id);
419
+ }
420
+ return failing;
421
+ }),
422
+ message: 'Documents are presented under an issued LC, before it expires, for no more than it allows (its amount and tolerance).',
423
+ },
424
+ },
425
+ });
426
+ /**
427
+ * A shipment under an LC: when, the bill of lading, the vessel and ports, when it arrives, and the value shipped.
428
+ * On or before the latest shipment date, within what the LC allows, and once only unless partial shipments are
429
+ * allowed (UCP 600 art. 31).
430
+ */
431
+ export const TradeShipment = defineModel('trade.lc.shipment', {
432
+ label: 'Shipment',
433
+ order: ['date asc', 'id asc'],
434
+ access: {
435
+ 'trade_finance.user': ['read', 'write', 'create'],
436
+ 'trade_finance.manager': [...ALL, 'export'],
437
+ },
438
+ fields: {
439
+ lc: f.many2one('trade.lc', { required: true, ondelete: 'cascade', label: 'LC' }),
440
+ currency: f.many2one('res.currency', {
441
+ store: true,
442
+ readonly: true,
443
+ ...compute('trade.lc.shipment', 'currency', ['lc.currency'], (shipments) => {
444
+ for (const x of shipments)
445
+ x.currency = x.lc.currency.id;
446
+ }),
447
+ }),
448
+ date: f.date({ required: true, default: (env) => env.today(), label: 'Shipped on' }),
449
+ blNumber: f.char({ label: 'Bill of lading / airway bill' }),
450
+ vessel: f.char({ label: 'Vessel / flight' }),
451
+ portLoading: f.char({ label: 'Port of loading' }),
452
+ portDischarge: f.char({ label: 'Port of discharge' }),
453
+ eta: f.date({ label: 'Arrives on' }),
454
+ value: f.monetary({ currency: 'currency', required: true, label: 'Value shipped' }),
455
+ note: f.text(),
456
+ },
457
+ constraints: {
458
+ withinTheLc: {
459
+ ...check('trade.lc.shipment', ['lc', 'date', 'value'], async (shipments) => {
460
+ const failing = [];
461
+ for (const x of await shipments.load({ lc: { shipments: true } })) {
462
+ const lc = x.lc;
463
+ const total = [...lc.shipments].reduce((s, y) => s.plus(amountOf(y.value)), zero);
464
+ if (lc.state !== 'issued' ||
465
+ amountOf(x.value).lte(0) ||
466
+ iso(x.date) > iso(lc.latestShipmentDate) ||
467
+ total.gt(amountOf(lc.maxDrawable)) ||
468
+ (!lc.partialShipment && lc.shipments.length > 1))
469
+ failing.push(x.id);
470
+ }
471
+ return failing;
472
+ }),
473
+ message: 'A shipment is under an issued LC, on or before its latest shipment date, within what it allows — and the only one unless partial shipments are allowed.',
474
+ },
475
+ },
476
+ });
477
+ export const tradeFinanceShutro = defineModule({
478
+ name: 'trade_finance',
479
+ version: '0.1.0',
480
+ depends: [contactsShutro, messagingShutro],
481
+ groups: [
482
+ // Users see the banks and counterparties of their LCs.
483
+ orm.defineGroup({
484
+ code: 'trade_finance.user',
485
+ label: 'Trade Finance user',
486
+ implies: ['contacts.user'],
487
+ }),
488
+ orm.defineGroup({
489
+ code: 'trade_finance.manager',
490
+ label: 'Trade Finance manager',
491
+ implies: ['trade_finance.user'],
492
+ }),
493
+ ],
494
+ permissions: [
495
+ orm.definePermission({
496
+ code: 'trade_finance.issue',
497
+ label: 'Record LCs issued and amendments accepted',
498
+ groups: ['trade_finance.manager'],
499
+ }),
500
+ ],
501
+ sequences: [
502
+ orm.defineSequence({ code: 'trade.lc', prefix: 'LC/{year}/', padding: 5, reset: 'yearly' }),
503
+ ],
504
+ models: [TradeLimit, TradeLc, TradeAmendment, TradePresentation, TradeShipment],
505
+ });
@@ -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: d775b7060fb10416
2
+ // Bindings of module `trade_finance_account`: 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;