shutro-erp 0.3.6 → 0.3.7

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 (623) hide show
  1. package/dist/account_asset/.kosh/bindings.js +1 -1
  2. package/dist/account_asset/.kosh/schema.d.ts +530 -8
  3. package/dist/account_asset/i18n/bn.d.ts +2 -0
  4. package/dist/account_asset/i18n/bn.js +97 -0
  5. package/dist/account_asset/index.js +2 -0
  6. package/dist/account_asset/module.d.ts +4899 -1445
  7. package/dist/account_budget/.kosh/bindings.js +1 -1
  8. package/dist/account_budget/.kosh/schema.d.ts +1130 -56
  9. package/dist/account_budget/i18n/bn.d.ts +2 -0
  10. package/dist/account_budget/i18n/bn.js +63 -0
  11. package/dist/account_budget/index.js +14 -0
  12. package/dist/account_budget/module.d.ts +17958 -4532
  13. package/dist/account_budget/module.js +15 -0
  14. package/dist/account_portal/.kosh/bindings.js +1 -1
  15. package/dist/account_portal/.kosh/schema.d.ts +530 -8
  16. package/dist/account_portal/i18n/bn.d.ts +2 -0
  17. package/dist/account_portal/i18n/bn.js +6 -0
  18. package/dist/account_portal/index.js +2 -0
  19. package/dist/account_portal/module.d.ts +5167 -1693
  20. package/dist/accounting/.kosh/bindings.js +1 -1
  21. package/dist/accounting/.kosh/schema.d.ts +530 -8
  22. package/dist/accounting/closing.js +1 -0
  23. package/dist/accounting/fiscal.d.ts +578 -0
  24. package/dist/accounting/fiscal.js +401 -0
  25. package/dist/accounting/followups.d.ts +618 -0
  26. package/dist/accounting/followups.js +420 -0
  27. package/dist/accounting/i18n/bn.d.ts +2 -0
  28. package/dist/accounting/i18n/bn.js +425 -0
  29. package/dist/accounting/index.d.ts +2 -0
  30. package/dist/accounting/index.js +649 -2
  31. package/dist/accounting/module.d.ts +4998 -1451
  32. package/dist/accounting/module.js +124 -18
  33. package/dist/accounting/statements.d.ts +878 -0
  34. package/dist/accounting/statements.js +728 -0
  35. package/dist/accounting/web/BankReconcilePage.d.ts +9 -0
  36. package/dist/accounting/web/BankReconcilePage.js +138 -0
  37. package/dist/accounting/web/FollowupsPage.d.ts +8 -0
  38. package/dist/accounting/web/FollowupsPage.js +54 -0
  39. package/dist/accounting/web/PostingPreview.d.ts +8 -0
  40. package/dist/accounting/web/PostingPreview.js +26 -0
  41. package/dist/accounting/web/index.d.ts +3 -0
  42. package/dist/accounting/web/index.js +9 -0
  43. package/dist/accounting/web/messages.js +140 -0
  44. package/dist/approvals/.kosh/bindings.js +1 -1
  45. package/dist/approvals/.kosh/schema.d.ts +272 -4
  46. package/dist/approvals/demo.d.ts +7 -0
  47. package/dist/approvals/demo.js +41 -0
  48. package/dist/approvals/i18n/bn.d.ts +2 -0
  49. package/dist/approvals/i18n/bn.js +133 -0
  50. package/dist/approvals/index.d.ts +19 -1
  51. package/dist/approvals/index.js +477 -7
  52. package/dist/approvals/mails.d.ts +7 -2
  53. package/dist/approvals/mails.js +8 -3
  54. package/dist/approvals/module.d.ts +2930 -1
  55. package/dist/approvals/module.js +468 -7
  56. package/dist/approvals/web/Config.d.ts +12 -0
  57. package/dist/approvals/web/Config.js +60 -0
  58. package/dist/approvals/web/Matrix.d.ts +9 -0
  59. package/dist/approvals/web/Matrix.js +26 -0
  60. package/dist/approvals/web/index.d.ts +3 -1
  61. package/dist/approvals/web/index.js +8 -1
  62. package/dist/approvals/web/messages.js +92 -0
  63. package/dist/approvals_purchase/.kosh/bindings.js +15 -0
  64. package/dist/approvals_purchase/.kosh/schema.d.ts +1997 -0
  65. package/dist/approvals_purchase/i18n/bn.d.ts +2 -0
  66. package/dist/approvals_purchase/i18n/bn.js +5 -0
  67. package/dist/approvals_purchase/index.d.ts +3 -0
  68. package/dist/approvals_purchase/index.js +47 -0
  69. package/dist/approvals_purchase/module.d.ts +12670 -0
  70. package/dist/approvals_purchase/module.js +84 -0
  71. package/dist/attendance/.kosh/bindings.js +1 -1
  72. package/dist/attendance/.kosh/schema.d.ts +59 -1
  73. package/dist/attendance/i18n/bn.d.ts +2 -0
  74. package/dist/attendance/i18n/bn.js +147 -0
  75. package/dist/attendance/index.js +3 -1
  76. package/dist/attendance/module.d.ts +452 -8
  77. package/dist/automation/engine.js +1 -1
  78. package/dist/calendar/.kosh/bindings.js +1 -1
  79. package/dist/calendar/.kosh/schema.d.ts +2 -1
  80. package/dist/calendar/i18n/bn.d.ts +2 -0
  81. package/dist/calendar/i18n/bn.js +80 -0
  82. package/dist/calendar/index.js +77 -0
  83. package/dist/calendar/module.d.ts +26 -0
  84. package/dist/calendar/module.js +14 -4
  85. package/dist/cli/apps.js +25 -5
  86. package/dist/cli/init.js +14 -4
  87. package/dist/cli/templates.d.ts +1 -1
  88. package/dist/cli/templates.js +34 -5
  89. package/dist/contacts/.kosh/bindings.js +1 -1
  90. package/dist/contacts/.kosh/schema.d.ts +2 -1
  91. package/dist/contacts/i18n/bn.d.ts +2 -0
  92. package/dist/contacts/i18n/bn.js +67 -0
  93. package/dist/contacts/index.js +3 -0
  94. package/dist/contacts/module.d.ts +42 -0
  95. package/dist/contacts/module.js +6 -1
  96. package/dist/crm/.kosh/bindings.js +1 -1
  97. package/dist/crm/.kosh/schema.d.ts +2 -1
  98. package/dist/crm/i18n/bn.d.ts +2 -0
  99. package/dist/crm/i18n/bn.js +80 -0
  100. package/dist/crm/index.js +22 -0
  101. package/dist/crm/module.d.ts +20 -0
  102. package/dist/crm/module.js +4 -2
  103. package/dist/documents/.kosh/bindings.js +1 -1
  104. package/dist/documents/.kosh/schema.d.ts +2 -1
  105. package/dist/documents/i18n/bn.d.ts +2 -0
  106. package/dist/documents/i18n/bn.js +83 -0
  107. package/dist/documents/index.js +128 -1
  108. package/dist/documents/module.d.ts +20 -0
  109. package/dist/documents/module.js +1 -0
  110. package/dist/event/.kosh/bindings.js +1 -1
  111. package/dist/event/.kosh/schema.d.ts +2 -1
  112. package/dist/event/i18n/bn.d.ts +2 -0
  113. package/dist/event/i18n/bn.js +101 -0
  114. package/dist/event/index.js +66 -0
  115. package/dist/event/module.d.ts +20 -0
  116. package/dist/event/module.js +8 -1
  117. package/dist/event_account/.kosh/bindings.js +1 -1
  118. package/dist/event_account/.kosh/schema.d.ts +530 -8
  119. package/dist/event_account/i18n/bn.d.ts +2 -0
  120. package/dist/event_account/i18n/bn.js +5 -0
  121. package/dist/event_account/index.js +2 -0
  122. package/dist/event_account/module.d.ts +4905 -1431
  123. package/dist/expense/.kosh/bindings.js +1 -1
  124. package/dist/expense/.kosh/schema.d.ts +323 -2
  125. package/dist/expense/i18n/bn.d.ts +2 -0
  126. package/dist/expense/i18n/bn.js +155 -0
  127. package/dist/expense/index.js +8 -1
  128. package/dist/expense/module.d.ts +2715 -694
  129. package/dist/expense/module.js +3 -1
  130. package/dist/expense_account/.kosh/bindings.js +1 -1
  131. package/dist/expense_account/.kosh/schema.d.ts +587 -8
  132. package/dist/expense_account/i18n/bn.d.ts +2 -0
  133. package/dist/expense_account/i18n/bn.js +15 -0
  134. package/dist/expense_account/index.js +2 -0
  135. package/dist/expense_account/module.d.ts +8094 -2619
  136. package/dist/helpdesk/.kosh/bindings.js +1 -1
  137. package/dist/helpdesk/.kosh/schema.d.ts +2 -1
  138. package/dist/helpdesk/i18n/bn.d.ts +2 -0
  139. package/dist/helpdesk/i18n/bn.js +127 -0
  140. package/dist/helpdesk/index.js +2 -0
  141. package/dist/helpdesk/module.d.ts +20 -0
  142. package/dist/hr/.kosh/bindings.js +1 -1
  143. package/dist/hr/.kosh/schema.d.ts +59 -1
  144. package/dist/hr/demo.js +11 -1
  145. package/dist/hr/i18n/bn.d.ts +2 -0
  146. package/dist/hr/i18n/bn.js +126 -0
  147. package/dist/hr/index.d.ts +1 -1
  148. package/dist/hr/index.js +158 -12
  149. package/dist/hr/module.d.ts +932 -59
  150. package/dist/hr/module.js +114 -17
  151. package/dist/{mrp → indent}/.kosh/bindings.js +2 -2
  152. package/dist/indent/.kosh/schema.d.ts +2084 -0
  153. package/dist/indent/demo.d.ts +7 -0
  154. package/dist/indent/demo.js +48 -0
  155. package/dist/indent/i18n/bn.d.ts +2 -0
  156. package/dist/indent/i18n/bn.js +143 -0
  157. package/dist/indent/index.d.ts +3 -0
  158. package/dist/indent/index.js +450 -0
  159. package/dist/{mrp → indent}/module.d.ts +7164 -3075
  160. package/dist/indent/module.js +792 -0
  161. package/dist/indent_purchase/.kosh/bindings.d.ts +22 -0
  162. package/dist/indent_purchase/.kosh/bindings.js +15 -0
  163. package/dist/indent_purchase/.kosh/schema.d.ts +2710 -0
  164. package/dist/indent_purchase/i18n/bn.d.ts +2 -0
  165. package/dist/indent_purchase/i18n/bn.js +13 -0
  166. package/dist/indent_purchase/index.d.ts +3 -0
  167. package/dist/indent_purchase/index.js +61 -0
  168. package/dist/indent_purchase/module.d.ts +27950 -0
  169. package/dist/indent_purchase/module.js +163 -0
  170. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  171. package/dist/l10n_bd/.kosh/schema.d.ts +530 -8
  172. package/dist/l10n_bd/i18n/bn.d.ts +2 -0
  173. package/dist/l10n_bd/i18n/bn.js +69 -0
  174. package/dist/l10n_bd/index.js +2 -0
  175. package/dist/l10n_bd/module.d.ts +5167 -1693
  176. package/dist/l10n_bd_payroll/.kosh/bindings.js +1 -1
  177. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +587 -8
  178. package/dist/l10n_bd_payroll/i18n/bn.d.ts +2 -0
  179. package/dist/l10n_bd_payroll/i18n/bn.js +4 -0
  180. package/dist/l10n_bd_payroll/index.js +2 -0
  181. package/dist/l10n_bd_payroll/module.d.ts +5910 -1548
  182. package/dist/l10n_bd_pos/.kosh/bindings.d.ts +22 -0
  183. package/dist/{mrp_account → l10n_bd_pos}/.kosh/bindings.js +2 -2
  184. package/dist/{mrp_account → l10n_bd_pos}/.kosh/schema.d.ts +693 -651
  185. package/dist/l10n_bd_pos/i18n/bn.d.ts +2 -0
  186. package/dist/l10n_bd_pos/i18n/bn.js +32 -0
  187. package/dist/l10n_bd_pos/index.d.ts +3 -0
  188. package/dist/l10n_bd_pos/index.js +111 -0
  189. package/dist/{mrp_account → l10n_bd_pos}/module.d.ts +7402 -7647
  190. package/dist/l10n_bd_pos/module.js +43 -0
  191. package/dist/l10n_in/.kosh/bindings.js +1 -1
  192. package/dist/l10n_in/.kosh/schema.d.ts +530 -8
  193. package/dist/l10n_in/i18n/bn.d.ts +2 -0
  194. package/dist/l10n_in/i18n/bn.js +95 -0
  195. package/dist/l10n_in/index.js +2 -0
  196. package/dist/l10n_in/module.d.ts +6703 -1652
  197. package/dist/l10n_in/module.js +25 -5
  198. package/dist/l10n_in/web/GstSettings.js +2 -2
  199. package/dist/mail/inbound/handle.js +2 -4
  200. package/dist/mail/inbound/models.js +5 -3
  201. package/dist/mail/index.d.ts +12 -1
  202. package/dist/mail/index.js +139 -2
  203. package/dist/mail/send.d.ts +56 -0
  204. package/dist/mail/send.js +394 -0
  205. package/dist/mail/web/SendButton.d.ts +9 -0
  206. package/dist/mail/web/SendButton.js +71 -0
  207. package/dist/mail/web/SendSelected.d.ts +8 -0
  208. package/dist/mail/web/SendSelected.js +33 -0
  209. package/dist/mail/web/index.d.ts +2 -0
  210. package/dist/mail/web/index.js +6 -0
  211. package/dist/mail/web/messages.js +36 -0
  212. package/dist/maintenance/.kosh/bindings.js +1 -1
  213. package/dist/maintenance/.kosh/schema.d.ts +2 -1
  214. package/dist/maintenance/i18n/bn.d.ts +2 -0
  215. package/dist/maintenance/i18n/bn.js +132 -0
  216. package/dist/maintenance/index.js +85 -0
  217. package/dist/maintenance/module.d.ts +25 -0
  218. package/dist/maintenance/module.js +27 -9
  219. package/dist/maintenance_stock/.kosh/bindings.js +1 -1
  220. package/dist/maintenance_stock/.kosh/schema.d.ts +298 -2
  221. package/dist/maintenance_stock/i18n/bn.d.ts +2 -0
  222. package/dist/maintenance_stock/i18n/bn.js +21 -0
  223. package/dist/maintenance_stock/index.js +2 -0
  224. package/dist/maintenance_stock/module.d.ts +5302 -1256
  225. package/dist/maintenance_stock/module.js +1 -0
  226. package/dist/modules-sdk/apps.d.ts +10 -0
  227. package/dist/modules-sdk/apps.js +32 -0
  228. package/dist/modules-sdk/index.d.ts +1 -1
  229. package/dist/modules-sdk/manifest.d.ts +68 -2
  230. package/dist/payment/.kosh/bindings.js +1 -1
  231. package/dist/payment/.kosh/schema.d.ts +530 -8
  232. package/dist/payment/i18n/bn.d.ts +2 -0
  233. package/dist/payment/i18n/bn.js +59 -0
  234. package/dist/payment/index.js +85 -0
  235. package/dist/payment/module.d.ts +5134 -1660
  236. package/dist/payment/module.js +17 -3
  237. package/dist/payment/settle.js +1 -0
  238. package/dist/payroll/.kosh/bindings.js +1 -1
  239. package/dist/payroll/.kosh/schema.d.ts +59 -1
  240. package/dist/payroll/i18n/bn.d.ts +2 -0
  241. package/dist/payroll/i18n/bn.js +206 -0
  242. package/dist/payroll/index.js +2 -0
  243. package/dist/payroll/module.d.ts +936 -48
  244. package/dist/payroll_account/.kosh/bindings.js +1 -1
  245. package/dist/payroll_account/.kosh/schema.d.ts +587 -8
  246. package/dist/payroll_account/i18n/bn.d.ts +2 -0
  247. package/dist/payroll_account/i18n/bn.js +10 -0
  248. package/dist/payroll_account/index.js +2 -0
  249. package/dist/payroll_account/module.d.ts +7534 -3192
  250. package/dist/permissions/approvals.d.ts +97 -4
  251. package/dist/permissions/approvals.js +780 -31
  252. package/dist/permissions/index.d.ts +1 -1
  253. package/dist/permissions/index.js +2 -2
  254. package/dist/permissions/models.js +177 -5
  255. package/dist/permissions/routes.d.ts +3 -0
  256. package/dist/permissions/routes.js +36 -2
  257. package/dist/permissions/web/ApprovalPanel.js +43 -5
  258. package/dist/permissions/web/messages.js +52 -0
  259. package/dist/portal/.kosh/bindings.js +1 -1
  260. package/dist/portal/.kosh/schema.d.ts +2 -1
  261. package/dist/portal/documents.d.ts +3 -0
  262. package/dist/portal/documents.js +21 -1
  263. package/dist/portal/i18n/bn.d.ts +2 -0
  264. package/dist/portal/i18n/bn.js +33 -0
  265. package/dist/portal/index.js +2 -0
  266. package/dist/portal/module.d.ts +20 -0
  267. package/dist/portal/routes-documents.js +76 -0
  268. package/dist/pos/.kosh/bindings.js +1 -1
  269. package/dist/pos/.kosh/schema.d.ts +531 -8
  270. package/dist/pos/i18n/bn.d.ts +2 -0
  271. package/dist/pos/i18n/bn.js +133 -0
  272. package/dist/pos/index.js +83 -1
  273. package/dist/pos/module.d.ts +6888 -1777
  274. package/dist/pos/module.js +49 -5
  275. package/dist/pos/routes.js +80 -7
  276. package/dist/pos/web/Register.js +2 -5
  277. package/dist/pos_stock/.kosh/bindings.js +1 -1
  278. package/dist/pos_stock/.kosh/schema.d.ts +626 -9
  279. package/dist/pos_stock/i18n/bn.d.ts +2 -0
  280. package/dist/pos_stock/i18n/bn.js +6 -0
  281. package/dist/pos_stock/index.js +2 -0
  282. package/dist/pos_stock/module.d.ts +10798 -3276
  283. package/dist/product/.kosh/bindings.js +1 -1
  284. package/dist/product/.kosh/schema.d.ts +202 -1
  285. package/dist/product/i18n/bn.d.ts +2 -0
  286. package/dist/product/i18n/bn.js +175 -0
  287. package/dist/product/index.d.ts +1 -0
  288. package/dist/product/index.js +288 -1
  289. package/dist/product/module.d.ts +1725 -0
  290. package/dist/product/module.js +66 -6
  291. package/dist/product/pricelist.d.ts +575 -0
  292. package/dist/product/pricelist.js +257 -0
  293. package/dist/product/variants.d.ts +908 -0
  294. package/dist/product/variants.js +251 -0
  295. package/dist/production/.kosh/bindings.d.ts +22 -0
  296. package/dist/production/.kosh/bindings.js +15 -0
  297. package/dist/production/.kosh/schema.d.ts +2345 -0
  298. package/dist/{mrp → production}/demo.d.ts +1 -1
  299. package/dist/{mrp → production}/demo.js +5 -5
  300. package/dist/production/depth.d.ts +790 -0
  301. package/dist/production/depth.js +262 -0
  302. package/dist/production/i18n/bn.d.ts +2 -0
  303. package/dist/production/i18n/bn.js +350 -0
  304. package/dist/production/index.d.ts +6 -0
  305. package/dist/production/index.js +1256 -0
  306. package/dist/production/module.d.ts +17327 -0
  307. package/dist/production/module.js +1333 -0
  308. package/dist/production/plan.d.ts +921 -0
  309. package/dist/production/plan.js +511 -0
  310. package/dist/production/schedule.d.ts +656 -0
  311. package/dist/production/schedule.js +309 -0
  312. package/dist/production_account/.kosh/bindings.d.ts +22 -0
  313. package/dist/production_account/.kosh/bindings.js +15 -0
  314. package/dist/production_account/.kosh/schema.d.ts +3496 -0
  315. package/dist/production_account/i18n/bn.d.ts +2 -0
  316. package/dist/production_account/i18n/bn.js +93 -0
  317. package/dist/production_account/index.d.ts +4 -0
  318. package/dist/production_account/index.js +246 -0
  319. package/dist/production_account/module.d.ts +1192 -0
  320. package/dist/{mrp_account → production_account}/module.js +72 -18
  321. package/dist/production_account/overhead.d.ts +1195 -0
  322. package/dist/production_account/overhead.js +554 -0
  323. package/dist/project/.kosh/bindings.js +1 -1
  324. package/dist/project/.kosh/schema.d.ts +65 -2
  325. package/dist/project/i18n/bn.d.ts +2 -0
  326. package/dist/project/i18n/bn.js +383 -0
  327. package/dist/project/index.js +123 -0
  328. package/dist/project/module.d.ts +20 -0
  329. package/dist/project/module.js +73 -14
  330. package/dist/project_account/.kosh/bindings.js +1 -1
  331. package/dist/project_account/.kosh/schema.d.ts +530 -8
  332. package/dist/project_account/i18n/bn.d.ts +2 -0
  333. package/dist/project_account/i18n/bn.js +6 -0
  334. package/dist/project_account/index.js +2 -0
  335. package/dist/project_account/module.d.ts +4926 -1452
  336. package/dist/project_portal/.kosh/bindings.js +1 -1
  337. package/dist/project_portal/.kosh/schema.d.ts +65 -2
  338. package/dist/project_portal/i18n/bn.d.ts +2 -0
  339. package/dist/project_portal/i18n/bn.js +6 -0
  340. package/dist/project_portal/index.js +2 -0
  341. package/dist/project_portal/module.d.ts +40 -0
  342. package/dist/project_purchase/.kosh/bindings.js +1 -1
  343. package/dist/project_purchase/.kosh/schema.d.ts +1126 -53
  344. package/dist/project_purchase/i18n/bn.d.ts +2 -0
  345. package/dist/project_purchase/i18n/bn.js +4 -0
  346. package/dist/project_purchase/index.js +2 -0
  347. package/dist/project_purchase/module.d.ts +17912 -4446
  348. package/dist/purchase/.kosh/bindings.js +1 -1
  349. package/dist/purchase/.kosh/schema.d.ts +813 -3
  350. package/dist/purchase/comparison.d.ts +993 -0
  351. package/dist/purchase/comparison.js +415 -0
  352. package/dist/purchase/extras.d.ts +1509 -0
  353. package/dist/purchase/extras.js +445 -0
  354. package/dist/purchase/i18n/bn.d.ts +2 -0
  355. package/dist/purchase/i18n/bn.js +413 -0
  356. package/dist/purchase/index.d.ts +5 -0
  357. package/dist/purchase/index.js +1280 -4
  358. package/dist/purchase/module.d.ts +7139 -398
  359. package/dist/purchase/module.js +295 -11
  360. package/dist/purchase/request.d.ts +696 -0
  361. package/dist/purchase/request.js +446 -0
  362. package/dist/purchase/tender.d.ts +1208 -0
  363. package/dist/purchase/tender.js +507 -0
  364. package/dist/purchase/vendorprice.d.ts +340 -0
  365. package/dist/purchase/vendorprice.js +153 -0
  366. package/dist/purchase_account/.kosh/bindings.js +1 -1
  367. package/dist/purchase_account/.kosh/schema.d.ts +1130 -57
  368. package/dist/purchase_account/i18n/bn.d.ts +2 -0
  369. package/dist/purchase_account/i18n/bn.js +22 -0
  370. package/dist/purchase_account/index.js +19 -0
  371. package/dist/purchase_account/module.d.ts +12276 -2247
  372. package/dist/purchase_account/module.js +241 -9
  373. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  374. package/dist/purchase_portal/.kosh/schema.d.ts +813 -3
  375. package/dist/purchase_portal/i18n/bn.d.ts +2 -0
  376. package/dist/purchase_portal/i18n/bn.js +5 -0
  377. package/dist/purchase_portal/index.js +2 -0
  378. package/dist/purchase_portal/module.d.ts +6849 -353
  379. package/dist/purchase_stock/.kosh/bindings.js +1 -1
  380. package/dist/purchase_stock/.kosh/schema.d.ts +910 -4
  381. package/dist/purchase_stock/i18n/bn.d.ts +2 -0
  382. package/dist/purchase_stock/i18n/bn.js +19 -0
  383. package/dist/purchase_stock/index.d.ts +1 -1
  384. package/dist/purchase_stock/index.js +29 -0
  385. package/dist/purchase_stock/module.d.ts +12410 -1864
  386. package/dist/purchase_stock/module.js +81 -9
  387. package/dist/purchase_stock/scorecard.d.ts +22 -0
  388. package/dist/purchase_stock/scorecard.js +77 -0
  389. package/dist/purchase_stock/web/Scorecard.d.ts +7 -0
  390. package/dist/purchase_stock/web/Scorecard.js +22 -0
  391. package/dist/purchase_stock/web/index.d.ts +11 -0
  392. package/dist/purchase_stock/web/index.js +16 -0
  393. package/dist/purchase_stock/web/messages.d.ts +2 -0
  394. package/dist/purchase_stock/web/messages.js +27 -0
  395. package/dist/purchase_stock_account/.kosh/bindings.js +1 -1
  396. package/dist/purchase_stock_account/.kosh/schema.d.ts +1286 -58
  397. package/dist/purchase_stock_account/i18n/bn.d.ts +2 -0
  398. package/dist/purchase_stock_account/i18n/bn.js +8 -0
  399. package/dist/purchase_stock_account/index.js +18 -0
  400. package/dist/purchase_stock_account/module.d.ts +7 -37995
  401. package/dist/purchase_stock_account/module.js +24 -3
  402. package/dist/recruitment/.kosh/bindings.js +1 -1
  403. package/dist/recruitment/.kosh/schema.d.ts +59 -1
  404. package/dist/recruitment/i18n/bn.d.ts +2 -0
  405. package/dist/recruitment/i18n/bn.js +93 -0
  406. package/dist/recruitment/index.js +64 -0
  407. package/dist/recruitment/module.d.ts +458 -8
  408. package/dist/recruitment/module.js +11 -3
  409. package/dist/reporting/documents.d.ts +5 -0
  410. package/dist/reporting/documents.js +11 -1
  411. package/dist/reporting/index.d.ts +1 -1
  412. package/dist/reporting/index.js +1 -1
  413. package/dist/reporting/web/CalendarView.d.ts +18 -5
  414. package/dist/reporting/web/CalendarView.js +163 -29
  415. package/dist/reporting/web/messages.js +18 -0
  416. package/dist/sale_account/.kosh/bindings.js +1 -1
  417. package/dist/sale_account/.kosh/schema.d.ts +642 -16
  418. package/dist/sale_account/i18n/bn.d.ts +2 -0
  419. package/dist/sale_account/i18n/bn.js +48 -0
  420. package/dist/sale_account/index.d.ts +1 -1
  421. package/dist/sale_account/index.js +102 -4
  422. package/dist/sale_account/module.d.ts +8254 -2212
  423. package/dist/sale_account/module.js +535 -46
  424. package/dist/sale_crm/.kosh/bindings.d.ts +22 -0
  425. package/dist/sale_crm/.kosh/bindings.js +15 -0
  426. package/dist/{mrp → sale_crm}/.kosh/schema.d.ts +389 -567
  427. package/dist/sale_crm/i18n/bn.d.ts +2 -0
  428. package/dist/sale_crm/i18n/bn.js +9 -0
  429. package/dist/sale_crm/index.d.ts +7 -0
  430. package/dist/sale_crm/index.js +104 -0
  431. package/dist/sale_crm/module.d.ts +5609 -0
  432. package/dist/sale_crm/module.js +73 -0
  433. package/dist/sale_portal/.kosh/bindings.js +1 -1
  434. package/dist/sale_portal/.kosh/schema.d.ts +291 -4
  435. package/dist/sale_portal/i18n/bn.d.ts +2 -0
  436. package/dist/sale_portal/i18n/bn.js +7 -0
  437. package/dist/sale_portal/index.js +10 -0
  438. package/dist/sale_portal/module.d.ts +2564 -294
  439. package/dist/sale_project/.kosh/bindings.js +1 -1
  440. package/dist/sale_project/.kosh/schema.d.ts +354 -5
  441. package/dist/sale_project/i18n/bn.d.ts +2 -0
  442. package/dist/sale_project/i18n/bn.js +12 -0
  443. package/dist/sale_project/index.js +2 -0
  444. package/dist/sale_project/module.d.ts +6249 -2402
  445. package/dist/sale_stock/.kosh/bindings.js +1 -1
  446. package/dist/sale_stock/.kosh/schema.d.ts +387 -5
  447. package/dist/sale_stock/i18n/bn.d.ts +2 -0
  448. package/dist/sale_stock/i18n/bn.js +15 -0
  449. package/dist/sale_stock/index.js +2 -0
  450. package/dist/sale_stock/module.d.ts +8057 -1759
  451. package/dist/sale_stock/module.js +20 -3
  452. package/dist/sales/.kosh/bindings.js +1 -1
  453. package/dist/sales/.kosh/schema.d.ts +291 -4
  454. package/dist/sales/i18n/bn.d.ts +2 -0
  455. package/dist/sales/i18n/bn.js +128 -0
  456. package/dist/sales/index.js +120 -5
  457. package/dist/sales/module.d.ts +3567 -633
  458. package/dist/sales/module.js +306 -11
  459. package/dist/server/api/duplicate.d.ts +14 -0
  460. package/dist/server/api/duplicate.js +75 -0
  461. package/dist/server/api/explain.d.ts +70 -0
  462. package/dist/server/api/explain.js +111 -0
  463. package/dist/server/api/metadata.d.ts +2 -0
  464. package/dist/server/api/metadata.js +9 -0
  465. package/dist/server/api/openapi.js +15 -0
  466. package/dist/server/api/rest.d.ts +1 -0
  467. package/dist/server/api/rest.js +76 -12
  468. package/dist/server/api/views.js +1 -1
  469. package/dist/server/apps.d.ts +16 -1
  470. package/dist/server/apps.js +164 -2
  471. package/dist/server/auth/base.js +2 -0
  472. package/dist/server/auth/service.d.ts +8 -0
  473. package/dist/server/auth/service.js +19 -0
  474. package/dist/server/events.d.ts +13 -0
  475. package/dist/server/events.js +22 -0
  476. package/dist/server/i18n.d.ts +27 -0
  477. package/dist/server/i18n.js +143 -0
  478. package/dist/server/index.d.ts +2 -0
  479. package/dist/server/index.js +2 -0
  480. package/dist/server/server.js +6 -0
  481. package/dist/settings/company.d.ts +3 -1
  482. package/dist/settings/company.js +26 -5
  483. package/dist/settings/routes.d.ts +10 -0
  484. package/dist/settings/routes.js +19 -3
  485. package/dist/settings/web/AppsPage.d.ts +3 -2
  486. package/dist/settings/web/AppsPage.js +26 -8
  487. package/dist/settings/web/CompaniesPage.js +91 -6
  488. package/dist/settings/web/messages.js +64 -0
  489. package/dist/sign/.kosh/bindings.js +1 -1
  490. package/dist/sign/.kosh/schema.d.ts +2 -1
  491. package/dist/sign/i18n/bn.d.ts +2 -0
  492. package/dist/sign/i18n/bn.js +97 -0
  493. package/dist/sign/index.d.ts +15 -0
  494. package/dist/sign/index.js +129 -1
  495. package/dist/sign/module.d.ts +40 -0
  496. package/dist/sign/module.js +11 -2
  497. package/dist/stock/.kosh/bindings.js +1 -1
  498. package/dist/stock/.kosh/schema.d.ts +298 -2
  499. package/dist/stock/i18n/bn.d.ts +2 -0
  500. package/dist/stock/i18n/bn.js +311 -0
  501. package/dist/stock/index.d.ts +3 -1
  502. package/dist/stock/index.js +442 -3
  503. package/dist/stock/ledger.d.ts +78 -0
  504. package/dist/stock/ledger.js +582 -0
  505. package/dist/stock/module.d.ts +5280 -2044
  506. package/dist/stock/module.js +222 -23
  507. package/dist/stock/replenish.js +16 -1
  508. package/dist/stock/returns.d.ts +157 -0
  509. package/dist/stock/returns.js +163 -0
  510. package/dist/stock/web/Ledger.d.ts +9 -0
  511. package/dist/stock/web/Ledger.js +108 -0
  512. package/dist/stock/web/Operations.d.ts +8 -0
  513. package/dist/stock/web/Operations.js +33 -0
  514. package/dist/stock/web/ReturnButton.d.ts +7 -0
  515. package/dist/stock/web/ReturnButton.js +62 -0
  516. package/dist/stock/web/index.d.ts +3 -0
  517. package/dist/stock/web/index.js +9 -0
  518. package/dist/stock/web/messages.js +154 -0
  519. package/dist/stock_account/.kosh/bindings.js +1 -1
  520. package/dist/stock_account/.kosh/schema.d.ts +682 -9
  521. package/dist/stock_account/i18n/bn.d.ts +2 -0
  522. package/dist/stock_account/i18n/bn.js +73 -0
  523. package/dist/stock_account/index.d.ts +1 -0
  524. package/dist/stock_account/index.js +131 -3
  525. package/dist/stock_account/landed.d.ts +429 -0
  526. package/dist/stock_account/landed.js +335 -0
  527. package/dist/stock_account/module.d.ts +11247 -3363
  528. package/dist/stock_account/module.js +135 -6
  529. package/dist/stock_account/web/LandedPreview.d.ts +7 -0
  530. package/dist/stock_account/web/LandedPreview.js +23 -0
  531. package/dist/stock_account/web/index.d.ts +11 -0
  532. package/dist/stock_account/web/index.js +16 -0
  533. package/dist/stock_account/web/messages.d.ts +2 -0
  534. package/dist/stock_account/web/messages.js +27 -0
  535. package/dist/todo/i18n/bn.d.ts +2 -0
  536. package/dist/todo/i18n/bn.js +66 -0
  537. package/dist/todo/index.js +59 -0
  538. package/dist/todo/module.d.ts +5 -0
  539. package/dist/todo/module.js +5 -3
  540. package/dist/trade_finance/.kosh/bindings.js +1 -1
  541. package/dist/trade_finance/.kosh/schema.d.ts +2 -1
  542. package/dist/trade_finance/i18n/bn.d.ts +2 -0
  543. package/dist/trade_finance/i18n/bn.js +162 -0
  544. package/dist/trade_finance/index.js +93 -0
  545. package/dist/trade_finance/module.d.ts +26 -0
  546. package/dist/trade_finance/module.js +27 -8
  547. package/dist/trade_finance_account/.kosh/bindings.js +1 -1
  548. package/dist/trade_finance_account/.kosh/schema.d.ts +530 -8
  549. package/dist/trade_finance_account/i18n/bn.d.ts +2 -0
  550. package/dist/trade_finance_account/i18n/bn.js +27 -0
  551. package/dist/trade_finance_account/index.js +2 -0
  552. package/dist/trade_finance_account/module.d.ts +4906 -1432
  553. package/dist/trade_finance_account/module.js +1 -0
  554. package/dist/trade_finance_purchase/.kosh/bindings.js +1 -1
  555. package/dist/trade_finance_purchase/.kosh/schema.d.ts +813 -3
  556. package/dist/trade_finance_purchase/i18n/bn.d.ts +2 -0
  557. package/dist/trade_finance_purchase/i18n/bn.js +6 -0
  558. package/dist/trade_finance_purchase/index.js +2 -0
  559. package/dist/trade_finance_purchase/module.d.ts +6909 -413
  560. package/dist/trade_finance_sale/.kosh/bindings.js +1 -1
  561. package/dist/trade_finance_sale/.kosh/schema.d.ts +291 -4
  562. package/dist/trade_finance_sale/i18n/bn.d.ts +2 -0
  563. package/dist/trade_finance_sale/i18n/bn.js +6 -0
  564. package/dist/trade_finance_sale/index.js +2 -0
  565. package/dist/trade_finance_sale/module.d.ts +2601 -331
  566. package/dist/ui/api.d.ts +2 -0
  567. package/dist/ui/app.d.ts +9 -0
  568. package/dist/ui/app.js +24 -4
  569. package/dist/ui/components/AppIcon.js +2 -2
  570. package/dist/ui/components/Explain.d.ts +69 -0
  571. package/dist/ui/components/Explain.js +62 -0
  572. package/dist/ui/context.d.ts +8 -1
  573. package/dist/ui/context.js +34 -1
  574. package/dist/ui/i18n/messages.d.ts +36 -0
  575. package/dist/ui/i18n/messages.js +72 -0
  576. package/dist/ui/index.d.ts +2 -1
  577. package/dist/ui/index.js +1 -0
  578. package/dist/ui/registry.d.ts +14 -0
  579. package/dist/ui/registry.js +10 -0
  580. package/dist/ui/views/FormView.d.ts +6 -0
  581. package/dist/ui/views/FormView.js +47 -10
  582. package/dist/ui/views/ListView.d.ts +8 -0
  583. package/dist/ui/views/ListView.js +10 -3
  584. package/dist/ui/views/StatsRow.js +2 -1
  585. package/dist/views/extend.js +12 -0
  586. package/dist/views/types.d.ts +13 -2
  587. package/dist/views/validate.js +8 -1
  588. package/dist/website/.kosh/bindings.js +1 -1
  589. package/dist/website/.kosh/schema.d.ts +2 -1
  590. package/dist/website/i18n/bn.d.ts +2 -0
  591. package/dist/website/i18n/bn.js +113 -0
  592. package/dist/website/index.js +36 -0
  593. package/dist/website/module.d.ts +20 -0
  594. package/dist/website/module.js +29 -5
  595. package/dist/website_crm/.kosh/bindings.js +1 -1
  596. package/dist/website_crm/.kosh/schema.d.ts +2 -1
  597. package/dist/website_crm/i18n/bn.d.ts +2 -0
  598. package/dist/website_crm/i18n/bn.js +5 -0
  599. package/dist/website_crm/index.js +2 -0
  600. package/dist/website_crm/module.d.ts +40 -0
  601. package/dist/website_sale/.kosh/bindings.js +1 -1
  602. package/dist/website_sale/.kosh/schema.d.ts +642 -17
  603. package/dist/website_sale/i18n/bn.d.ts +2 -0
  604. package/dist/website_sale/i18n/bn.js +132 -0
  605. package/dist/website_sale/index.js +83 -1
  606. package/dist/website_sale/module.d.ts +18705 -5550
  607. package/dist/website_sale/module.js +32 -10
  608. package/dist/website_sale/shop.js +22 -9
  609. package/dist/website_sale_stock/.kosh/bindings.js +1 -1
  610. package/dist/website_sale_stock/.kosh/schema.d.ts +737 -18
  611. package/dist/website_sale_stock/i18n/bn.d.ts +2 -0
  612. package/dist/website_sale_stock/i18n/bn.js +4 -0
  613. package/dist/website_sale_stock/index.js +2 -0
  614. package/dist/website_sale_stock/module.d.ts +10 -24997
  615. package/dist/website_sale_stock/module.js +7 -3
  616. package/package.json +36 -8
  617. package/dist/mrp/index.d.ts +0 -3
  618. package/dist/mrp/index.js +0 -393
  619. package/dist/mrp/module.js +0 -757
  620. package/dist/mrp_account/index.d.ts +0 -3
  621. package/dist/mrp_account/index.js +0 -22
  622. /package/dist/{mrp → approvals_purchase}/.kosh/bindings.d.ts +0 -0
  623. /package/dist/{mrp_account → indent}/.kosh/bindings.d.ts +0 -0
@@ -262,7 +262,10 @@ export const GstEinvoice = defineModel('l10n_in.einvoice', {
262
262
  fields: {
263
263
  move: f.many2one('account.move', { required: true, ondelete: 'cascade' }),
264
264
  /** E-invoicing (RFC 0016 step 5, part 4): the IRP's answer, written only by the registration. */
265
- einvoiceStatus: f.selection(EINVOICE_STATES, { label: 'E-invoice' }),
265
+ einvoiceStatus: f.selection(EINVOICE_STATES, {
266
+ label: 'E-invoice',
267
+ help: 'Whether the invoice was registered at the Invoice Registration Portal and got its IRN, failed, or was cancelled there.',
268
+ }),
266
269
  irn: f.char({ size: 64, label: 'IRN' }),
267
270
  irnAckNo: f.char({ size: 20, label: 'Acknowledgement number' }),
268
271
  irnAckDate: f.datetime({ label: 'Acknowledged at' }),
@@ -274,9 +277,15 @@ export const GstEinvoice = defineModel('l10n_in.einvoice', {
274
277
  ewbNo: f.char({ size: 12, label: 'E-way bill' }),
275
278
  ewbDate: f.datetime({ label: 'E-way bill generated at' }),
276
279
  ewbValidUntil: f.datetime({ label: 'E-way bill valid until' }),
277
- ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, { label: 'E-way bill status' }),
280
+ ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
281
+ label: 'E-way bill status',
282
+ help: 'Whether the e-way bill for moving the goods was generated, failed or was cancelled.',
283
+ }),
278
284
  ewbError: f.text({ label: 'E-way bill error' }),
279
- ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, { label: 'Transport mode' }),
285
+ ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
286
+ label: 'Transport mode',
287
+ help: 'How the goods travel under the e-way bill: by road, rail, air or ship.',
288
+ }),
280
289
  ewbVehicleNo: f.char({ size: 15, label: 'Vehicle number' }),
281
290
  ewbTransporterId: f.char({ size: 15, label: 'Transporter ID' }),
282
291
  ewbDistanceKm: f.integer({ label: 'Distance (km)' }),
@@ -332,6 +341,7 @@ export const MoveGst = extendModel('account.move', {
332
341
  /** E-invoicing (RFC 0016 step 5, part 4): the IRP's answer (its record's). */
333
342
  einvoiceStatus: f.selection(EINVOICE_STATES, {
334
343
  label: 'E-invoice',
344
+ help: 'Whether the invoice was registered at the Invoice Registration Portal and got its IRN, failed, or was cancelled there.',
335
345
  store: true,
336
346
  ...fromEinvoice,
337
347
  }),
@@ -346,9 +356,19 @@ export const MoveGst = extendModel('account.move', {
346
356
  ewbNo: f.char({ size: 12, label: 'E-way bill', store: true, ...fromEinvoice }),
347
357
  ewbDate: f.datetime({ label: 'E-way bill generated at', store: true, ...fromEinvoice }),
348
358
  ewbValidUntil: f.datetime({ label: 'E-way bill valid until', store: true, ...fromEinvoice }),
349
- ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, { label: 'E-way bill status', store: true, ...fromEinvoice }),
359
+ ewbStatus: f.selection({ generated: 'Generated', failed: 'Not generated: see the error', cancelled: 'Cancelled' }, {
360
+ label: 'E-way bill status',
361
+ help: 'Whether the e-way bill for moving the goods was generated, failed or was cancelled.',
362
+ store: true,
363
+ ...fromEinvoice,
364
+ }),
350
365
  ewbError: f.text({ label: 'E-way bill error', store: true, ...fromEinvoice }),
351
- ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, { label: 'Transport mode', store: true, ...fromEinvoice }),
366
+ ewbMode: f.selection({ road: 'Road', rail: 'Rail', air: 'Air', ship: 'Ship' }, {
367
+ label: 'Transport mode',
368
+ help: 'How the goods travel under the e-way bill: by road, rail, air or ship.',
369
+ store: true,
370
+ ...fromEinvoice,
371
+ }),
352
372
  ewbVehicleNo: f.char({ size: 15, label: 'Vehicle number', store: true, ...fromEinvoice }),
353
373
  ewbTransporterId: f.char({ size: 15, label: 'Transporter ID', store: true, ...fromEinvoice }),
354
374
  ewbDistanceKm: f.integer({ label: 'Distance (km)', store: true, ...fromEinvoice }),
@@ -1,4 +1,4 @@
1
- import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  /**
3
3
  * The company's GST settings (RFC 0016 step 5, part 4), on the GST returns page: GSTIN, PAN, the address and PIN code
4
4
  * the IRP needs, and e-invoicing on or off. Managers change them; the server checks the GSTIN against the company's
@@ -27,7 +27,7 @@ export function GstSettings({ api }) {
27
27
  });
28
28
  const current = settings.data;
29
29
  if (current === undefined)
30
- return _jsx(_Fragment, {});
30
+ return _jsx("div", {});
31
31
  const value = (key) => String(edits[key] ?? current[key] ?? '');
32
32
  const einvoice = Boolean(edits.einvoiceEnabled ?? current.einvoiceEnabled);
33
33
  return (_jsxs("section", { className: "grid max-w-3xl gap-3 rounded-lg border p-4", "aria-labelledby": `${id}-title`, children: [_jsx("h2", { id: `${id}-title`, className: "font-medium", children: t('settings.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: current.provider === null
@@ -236,9 +236,7 @@ export async function processInbound(context, logId, mail) {
236
236
  message: null,
237
237
  });
238
238
  const recipientEmail = await context.shutro.bootstrap({ reason: 'inbound email' }, async (su) => {
239
- const [user] = await rows(su, 'res.users', { id: target.uid, active: { in: [true, false] } }, [
240
- 'email',
241
- ]);
239
+ const [user] = await rows(su.withFlags({ activeTest: false }), 'res.users', { id: target.uid }, ['email']);
242
240
  return typeof user?.['email'] === 'string' ? user['email'].toLowerCase() : '';
243
241
  });
244
242
  if (sender !== '' && sender === recipientEmail) {
@@ -377,7 +375,7 @@ async function recordBounce(context, mail) {
377
375
  ]);
378
376
  if (n === undefined || typeof n['actor'] !== 'number' || n['actor'] === n['user'])
379
377
  continue;
380
- const [recipient] = await rows(su, 'res.users', { id: n['user'], active: { in: [true, false] } }, ['name', 'email']);
378
+ const [recipient] = await rows(su.withFlags({ activeTest: false }), 'res.users', { id: n['user'] }, ['name', 'email']);
381
379
  const [record] = (await ref(su, String(n['resModel']))
382
380
  .browse([n['resId']])
383
381
  .load(['displayName'])).read(['displayName']);
@@ -6,6 +6,8 @@
6
6
  */
7
7
  import { messagingShutro } from '../../messaging/index.js';
8
8
  import { orm } from '../../server/orm.js';
9
+ import { storageShutro } from '../../storage/index.js';
10
+ import { SEND_MODELS } from '../send.js';
9
11
  const { defineGroup, defineModel, defineModule, f } = orm;
10
12
  export const INBOUND_STATES = [
11
13
  'received',
@@ -53,8 +55,8 @@ const InboundMessage = defineModel('mail.inbound_message', {
53
55
  });
54
56
  export const mailShutro = defineModule({
55
57
  name: 'mail',
56
- version: '0.1.0',
57
- depends: [messagingShutro],
58
+ version: '0.2.0',
59
+ depends: [messagingShutro, storageShutro],
58
60
  groups: [
59
61
  defineGroup({
60
62
  code: 'mail.manager',
@@ -62,5 +64,5 @@ export const mailShutro = defineModule({
62
64
  implies: ['base.user', 'messaging.user'],
63
65
  }),
64
66
  ],
65
- models: [InboundMessage],
67
+ models: [InboundMessage, ...SEND_MODELS],
66
68
  });
@@ -1,5 +1,6 @@
1
1
  import { defineModule } from '../modules-sdk/index.js';
2
2
  import { type ImapConfig } from './inbound/index.js';
3
+ export { type BatchResult, type Composition, installMailTemplates, type SendEngine, sendablesOf, } from './send.js';
3
4
  import { type InboundConfig } from './inbound/token.js';
4
5
  export * from './inbound/index.js';
5
6
  /** One outbound message. */
@@ -10,6 +11,14 @@ export interface OutboundMail {
10
11
  readonly text: string;
11
12
  readonly html: string;
12
13
  readonly replyTo?: string;
14
+ /** Copies (RFC 0029 §3.3). */
15
+ readonly cc?: readonly string[];
16
+ /** Files sent with it: a document's PDF. */
17
+ readonly attachments?: readonly {
18
+ readonly filename: string;
19
+ readonly content: Uint8Array;
20
+ readonly contentType: string;
21
+ }[];
13
22
  }
14
23
  /** Sends messages; the provider's id of each, when it gives one. */
15
24
  export interface Mailer {
@@ -68,8 +77,10 @@ export interface MailOptions {
68
77
  readonly webhookSecret?: string | undefined;
69
78
  /** The mailbox to poll; default `IMAP_URL`. Without one, no poller runs. */
70
79
  readonly imap?: ImapConfig | undefined;
71
- /** Start the poller (default: unless `KOSH_SCHEDULES=off`). */
80
+ /** Start the poller and the sender (default: unless `KOSH_SCHEDULES=off`). */
72
81
  readonly workers?: boolean | undefined;
82
+ /** The mailer documents are sent with (RFC 0029 §3.3); default: `SMTP_URL`. `null`: none. */
83
+ readonly mailer?: Mailer | null | undefined;
73
84
  }
74
85
  /** The mail module with explicit settings. */
75
86
  export declare function mailModule(options?: MailOptions): ReturnType<typeof defineModule>;
@@ -9,11 +9,14 @@
9
9
  */
10
10
  import { chatterContext, messaging } from '../messaging/index.js';
11
11
  import { defineModule } from '../modules-sdk/index.js';
12
- import { base } from '../server/index.js';
12
+ import { base, HttpProblem } from '../server/index.js';
13
13
  import { storage, storageOf } from '../storage/index.js';
14
+ import { form, list } from '../views/index.js';
14
15
  import nodemailer from 'nodemailer';
15
16
  import { imapConfigFromEnv, registerInboundRoutes, startPoller, } from './inbound/index.js';
16
17
  import { mailShutro } from './inbound/models.js';
18
+ import { installMailTemplates, sendEngine } from './send.js';
19
+ export { installMailTemplates, sendablesOf, } from './send.js';
17
20
  import { inboundConfigFromEnv } from './inbound/token.js';
18
21
  export * from './inbound/index.js';
19
22
  /** The SMTP mailer: `url` is `smtp://user:pass@host:port` (or `smtps://` for implicit TLS). */
@@ -30,6 +33,16 @@ export function createSmtpMailer(options) {
30
33
  text: mail.text,
31
34
  html: mail.html,
32
35
  ...(mail.replyTo === undefined ? {} : { replyTo: mail.replyTo }),
36
+ ...(mail.cc === undefined || mail.cc.length === 0 ? {} : { cc: [...mail.cc] }),
37
+ ...(mail.attachments === undefined
38
+ ? {}
39
+ : {
40
+ attachments: mail.attachments.map((a) => ({
41
+ filename: a.filename,
42
+ content: Buffer.from(a.content),
43
+ contentType: a.contentType,
44
+ })),
45
+ }),
33
46
  });
34
47
  return { id: typeof info.messageId === 'string' ? info.messageId : null };
35
48
  },
@@ -126,19 +139,79 @@ export function mailModule(options = {}) {
126
139
  icon: 'mail',
127
140
  sequence: 950,
128
141
  category: 'Administration',
129
- summary: 'Inbound email: replies posted on records, and the ones that matched no one',
142
+ summary: 'Documents sent with their PDF, email templates, and replies posted on records or quarantined',
130
143
  },
131
144
  accessLevels: {
132
145
  manager: { label: 'Email manager (the inbound log)', groups: ['mail.manager'] },
133
146
  },
134
147
  actions: {
135
148
  'mail.action_inbound': { type: 'client', page: 'mail.Inbound', label: 'Inbound email' },
149
+ 'mail.action_templates': {
150
+ model: 'mail.template',
151
+ label: 'Email templates',
152
+ views: ['list', 'form'],
153
+ },
154
+ 'mail.action_outgoing': { model: 'mail.outgoing', label: 'Sent', views: ['list', 'form'] },
136
155
  },
137
156
  menus: [
138
157
  { id: 'mail.root', label: 'Email', app: 'mail' },
139
158
  { id: 'mail.inbound', parent: 'mail.root', label: 'Inbound', action: 'mail.action_inbound' },
159
+ {
160
+ id: 'mail.outgoing',
161
+ parent: 'mail.root',
162
+ label: 'Sent',
163
+ action: 'mail.action_outgoing',
164
+ sequence: 2,
165
+ },
166
+ {
167
+ id: 'mail.templates',
168
+ parent: 'mail.root',
169
+ label: 'Email templates',
170
+ action: 'mail.action_templates',
171
+ sequence: 3,
172
+ },
140
173
  ],
174
+ views: {
175
+ 'mail.template.list': list('mail.template', {
176
+ columns: ['name', 'targetModel', 'subject', 'document'],
177
+ }),
178
+ 'mail.template.form': form('mail.template', (k) => ({
179
+ header: { buttons: [] },
180
+ sheet: [
181
+ k.group('main', ['name', 'targetModel', 'subject', 'body', 'document'], {
182
+ columns: 1,
183
+ description: 'Placeholders like {{name}} or {{partner.name}} are filled from the document; each language keeps its own text.',
184
+ }),
185
+ ],
186
+ })),
187
+ 'mail.outgoing.list': list('mail.outgoing', {
188
+ columns: ['createdAt', 'to', 'subject', 'resModel', 'author', 'state'],
189
+ }),
190
+ 'mail.outgoing.form': form('mail.outgoing', (k) => ({
191
+ header: { buttons: [], statusbar: 'state' },
192
+ sheet: [
193
+ k.group('main', ['to', 'cc', 'subject', 'resModel', 'resId', 'author', 'sentAt']),
194
+ k.group('content', ['text', 'attachments', 'error', 'providerId'], { columns: 1 }),
195
+ ],
196
+ })),
197
+ },
198
+ search: {
199
+ 'mail.template': {
200
+ fields: ['name', 'targetModel', 'subject'],
201
+ },
202
+ 'mail.outgoing': {
203
+ fields: ['to', 'subject'],
204
+ filters: {
205
+ failed: { label: 'Failed', domain: { state: 'failed' }, group: 'state' },
206
+ queued: { label: 'Queued', domain: { state: 'queued' }, group: 'state' },
207
+ },
208
+ groupBy: ['state', 'resModel'],
209
+ },
210
+ },
141
211
  privateModels: ['mail.inbound_message'],
212
+ hooks: {
213
+ defaults: async (env, modules) => `${await installMailTemplates(env, modules)} email template(s) installed`,
214
+ },
142
215
  routes: (context) => {
143
216
  const inbound = {
144
217
  shutro: context.shutro,
@@ -152,9 +225,73 @@ export function mailModule(options = {}) {
152
225
  registerInboundRoutes(context, inbound, {
153
226
  webhookSecret: options.webhookSecret ?? process.env['MAIL_INBOUND_WEBHOOK_SECRET'],
154
227
  });
228
+ // Sending documents (RFC 0029 §3.3).
229
+ const outbound = options.mailer === undefined ? mailerFromEnv() : (options.mailer ?? undefined);
230
+ const engine = sendEngine(context, () => outbound);
231
+ const target = (params) => {
232
+ const p = params;
233
+ const id = Number(p.id);
234
+ if (typeof p.model !== 'string' || !Number.isSafeInteger(id) || id <= 0)
235
+ throw new HttpProblem(400, 'invalid-path', 'Invalid record', 'A model and a record id.');
236
+ return { model: p.model, id };
237
+ };
238
+ context.app.get('/api/v1/mail/sendable', async () => ({
239
+ models: [...engine.sendables.keys()],
240
+ mailer: outbound !== undefined,
241
+ }));
242
+ context.app.get('/api/v1/mail/compose/:model/:id', async (request) => {
243
+ const { model, id } = target(request.params);
244
+ return request.env((env) => engine.compose(env, model, id));
245
+ });
246
+ context.app.post('/api/v1/mail/send/:model/:id', async (request) => {
247
+ const { model, id } = target(request.params);
248
+ return request.env((env) => engine.send(env, model, id, (request.body ?? {})), { write: true });
249
+ });
250
+ context.app.post('/api/v1/mail/send-many/:model', async (request) => {
251
+ const model = request.params.model;
252
+ const ids = request.body?.ids;
253
+ if (typeof model !== 'string' ||
254
+ !Array.isArray(ids) ||
255
+ !ids.every((i) => Number.isSafeInteger(i) && i > 0))
256
+ throw new HttpProblem(400, 'invalid-body', 'Invalid batch', '{ ids: [record ids] }.');
257
+ return request.env((env) => engine.sendMany(env, model, ids), {
258
+ write: true,
259
+ });
260
+ });
155
261
  // Background work is off in the CLI (kosh init, migrate), like the schedules.
156
262
  if (!(options.workers ?? process.env['KOSH_SCHEDULES'] !== 'off'))
157
263
  return;
264
+ // Documents sent by themselves (`autoSend`): as the user whose change emitted the event.
265
+ for (const [model, spec] of engine.sendables) {
266
+ if (spec.autoSend === undefined)
267
+ continue;
268
+ const worker = context.shutro.subscribe(`mail.auto.${model}`, spec.autoSend.topic, async (event, env) => {
269
+ const id = Number(event.payload?.id);
270
+ if (!Number.isSafeInteger(id))
271
+ return;
272
+ try {
273
+ await engine.autoSend(env, model, id);
274
+ }
275
+ catch (error) {
276
+ // A document that cannot be sent (no template, no storage) is logged, never retried forever.
277
+ context.app.log.warn({ err: error, model, id }, 'automatic email not sent');
278
+ }
279
+ }, { pollMs: 2000 });
280
+ worker.start();
281
+ context.app.addHook('onClose', async () => {
282
+ await worker.stop();
283
+ });
284
+ }
285
+ const sender = context.shutro.subscribe('mail.send', 'mail.outgoing.queued', async (event, env) => {
286
+ const id = Number(event.payload?.outgoing);
287
+ if (!Number.isSafeInteger(id))
288
+ return;
289
+ await env.asSuperuser({ reason: 'email sent from a record' }, (su) => engine.deliver(su, id));
290
+ }, { pollMs: 2000 });
291
+ sender.start();
292
+ context.app.addHook('onClose', async () => {
293
+ await sender.stop();
294
+ });
158
295
  const imap = options.imap ?? imapConfigFromEnv();
159
296
  if (imap === undefined)
160
297
  return;
@@ -0,0 +1,56 @@
1
+ import type { KoshModule, SendableSpec } from '../modules-sdk/index.js';
2
+ import { type ModuleContext } from '../server/index.js';
3
+ import { type Env } from '../server/orm.js';
4
+ import { type Mailer } from './index.js';
5
+ /** The models of sending documents, added to the mail module's. */
6
+ export declare const SEND_MODELS: readonly unknown[];
7
+ /** The sendable documents of the loaded modules, by model. */
8
+ export declare function sendablesOf(modules: readonly KoshModule[]): Map<string, SendableSpec>;
9
+ /** Installs the manifests' email templates that do not exist yet (by `module.key`). */
10
+ export declare function installMailTemplates(env: Env, modules: readonly KoshModule[]): Promise<number>;
11
+ /** What the Send dialog shows, filled in the partner's language. */
12
+ export interface Composition {
13
+ readonly to: readonly {
14
+ readonly name: string;
15
+ readonly email: string | null;
16
+ }[];
17
+ readonly subject: string;
18
+ readonly body: string;
19
+ /** The PDF that goes with it, or none. */
20
+ readonly attachment: string | null;
21
+ readonly lang: string;
22
+ /** Emails sent from this record so far, and the last one's date. */
23
+ readonly sent: number;
24
+ readonly lastSentAt: string | null;
25
+ }
26
+ /** The send engine of one server. */
27
+ export interface SendEngine {
28
+ readonly sendables: ReadonlyMap<string, SendableSpec>;
29
+ compose(env: Env, model: string, id: number): Promise<Composition>;
30
+ send(env: Env, model: string, id: number, input: {
31
+ to?: unknown;
32
+ cc?: unknown;
33
+ subject?: unknown;
34
+ body?: unknown;
35
+ attach?: unknown;
36
+ }): Promise<{
37
+ outgoing: number;
38
+ message: number;
39
+ attachment: number | null;
40
+ }>;
41
+ deliver(su: Env, outgoing: number): Promise<void>;
42
+ /** Sends each record as its template says, to its partner; the ones that cannot be sent are said why. */
43
+ sendMany(env: Env, model: string, ids: readonly number[]): Promise<BatchResult>;
44
+ /** Sends a record by itself (an `autoSend` event) when its partner asked for it; whether it was sent. */
45
+ autoSend(env: Env, model: string, id: number): Promise<boolean>;
46
+ }
47
+ /** What a batch send did. */
48
+ export interface BatchResult {
49
+ readonly sent: number;
50
+ readonly skipped: readonly {
51
+ readonly id: number;
52
+ readonly reason: string;
53
+ }[];
54
+ }
55
+ /** The send engine of one server: the sendable documents, the models' metadata, the mailer. */
56
+ export declare function sendEngine(context: ModuleContext, mailer: () => Mailer | undefined): SendEngine;