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
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Accounting › Reconcile bank (RFC 0029 §3.1): statements imported (CSV with its columns, OFX, CAMT.053), then the
3
+ * open lines one by one — the documents each may pay, proposed by the server with why, matched in one click; a line
4
+ * that pays nothing written off to an account. J / K move between lines. Reconciliation rules (§3.2) run on import
5
+ * or with Run rules; recently matched lines can be undone. The server proposes, matches and refuses.
6
+ */
7
+ import { type PageProps } from '../../ui/index.js';
8
+ import { type ReactElement } from 'react';
9
+ export declare function BankReconcilePage({ api, label }: PageProps): ReactElement;
@@ -0,0 +1,138 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Accounting › Reconcile bank (RFC 0029 §3.1): statements imported (CSV with its columns, OFX, CAMT.053), then the
4
+ * open lines one by one — the documents each may pay, proposed by the server with why, matched in one click; a line
5
+ * that pays nothing written off to an account. J / K move between lines. Reconciliation rules (§3.2) run on import
6
+ * or with Run rules; recently matched lines can be undone. The server proposes, matches and refuses.
7
+ */
8
+ import { Alert, Button, Checkbox, Input, Label, Select, useKosh } from '../../ui/index.js';
9
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
10
+ import { useEffect, useId, useState } from 'react';
11
+ import { useTranslation } from 'react-i18next';
12
+ export function BankReconcilePage({ api, label }) {
13
+ const { t } = useTranslation('accounting');
14
+ const { format } = useKosh();
15
+ const id = useId();
16
+ const queryClient = useQueryClient();
17
+ const [current, setCurrent] = useState(0);
18
+ const [chosen, setChosen] = useState(new Set());
19
+ const [account, setAccount] = useState(null);
20
+ const [message, setMessage] = useState(null);
21
+ // Import
22
+ const [journal, setJournal] = useState(null);
23
+ const [fileFormat, setFileFormat] = useState('csv');
24
+ const [columns, setColumns] = useState({ date: 'Date', label: 'Details', amount: 'Amount' });
25
+ const journals = useQuery({
26
+ queryKey: ['accounting', 'journals', 'bank'],
27
+ queryFn: () => api.list('account.journal', {
28
+ filter: { type: { in: ['bank', 'cash'] } },
29
+ fields: ['id', 'code', 'name'],
30
+ limit: 50,
31
+ }),
32
+ });
33
+ const accounts = useQuery({
34
+ queryKey: ['accounting', 'accounts', 'all'],
35
+ queryFn: () => api.list('account.account', {
36
+ fields: ['id', 'code', 'name'],
37
+ order: ['code asc'],
38
+ limit: 500,
39
+ }),
40
+ });
41
+ const lines = useQuery({
42
+ queryKey: ['accounting', 'statement-lines', 'open'],
43
+ queryFn: () => api.list('account.bank.statement.line', {
44
+ filter: { state: 'open' },
45
+ fields: ['id', 'date', 'label', 'reference', 'amount'],
46
+ order: ['date asc', 'id asc'],
47
+ limit: 200,
48
+ }),
49
+ });
50
+ const recent = useQuery({
51
+ queryKey: ['accounting', 'statement-lines', 'matched'],
52
+ queryFn: () => api.list('account.bank.statement.line', {
53
+ filter: { state: 'matched' },
54
+ fields: ['id', 'date', 'label', 'reference', 'amount'],
55
+ order: ['updatedAt desc', 'id desc'],
56
+ limit: 10,
57
+ }),
58
+ });
59
+ const open = (lines.data?.items ?? []);
60
+ const line = open[Math.min(current, Math.max(0, open.length - 1))];
61
+ const proposals = useQuery({
62
+ queryKey: ['accounting', 'proposals', line?.id],
63
+ queryFn: () => api.call('GET', `/api/v1/accounting/statement-lines/${line?.id}/proposals`),
64
+ enabled: line !== undefined,
65
+ });
66
+ // A new line: the best proposal chosen, the rest not.
67
+ useEffect(() => {
68
+ const best = proposals.data?.proposals[0];
69
+ setChosen(new Set(best === undefined ? [] : [best.move]));
70
+ }, [proposals.data]);
71
+ // J / K: the next and the previous line.
72
+ useEffect(() => {
73
+ const onKey = (e) => {
74
+ if (e.target?.closest('input, textarea, select'))
75
+ return;
76
+ if (e.key === 'j')
77
+ setCurrent((c) => Math.min(c + 1, Math.max(0, open.length - 1)));
78
+ if (e.key === 'k')
79
+ setCurrent((c) => Math.max(c - 1, 0));
80
+ };
81
+ window.addEventListener('keydown', onKey);
82
+ return () => window.removeEventListener('keydown', onKey);
83
+ }, [open.length]);
84
+ const done = async (text) => {
85
+ setMessage(text);
86
+ await queryClient.invalidateQueries({ queryKey: ['accounting'] });
87
+ };
88
+ const match = useMutation({
89
+ mutationFn: () => api.call('POST', `/api/v1/accounting/statement-lines/${line?.id}/match`, {
90
+ moves: [...chosen],
91
+ }),
92
+ onSuccess: () => done(t('bank.matched')),
93
+ });
94
+ const writeOff = useMutation({
95
+ mutationFn: () => api.call('POST', `/api/v1/accounting/statement-lines/${line?.id}/write-off`, {
96
+ account: Number(account),
97
+ }),
98
+ onSuccess: () => done(t('bank.writtenOff')),
99
+ });
100
+ const undo = useMutation({
101
+ mutationFn: (lineId) => api.call('POST', `/api/v1/accounting/statement-lines/${lineId}/undo`),
102
+ onSuccess: () => done(t('bank.undone')),
103
+ });
104
+ const runRules = useMutation({
105
+ mutationFn: () => api.call('POST', '/api/v1/accounting/reconcile-rules/run'),
106
+ onSuccess: (r) => done(t('bank.rulesRun', { count: r.results.filter((x) => x.outcome !== 'suggest').length })),
107
+ });
108
+ const importFile = useMutation({
109
+ mutationFn: async (file) => api.call('POST', '/api/v1/accounting/statements/import', {
110
+ journal: Number(journal),
111
+ format: fileFormat,
112
+ content: await file.text(),
113
+ ...(fileFormat === 'csv' ? { mapping: columns } : {}),
114
+ }),
115
+ onSuccess: (r) => done(t('bank.imported', { created: r.created, skipped: r.skipped }) +
116
+ (r.applied > 0 ? ` ${t('bank.rulesRun', { count: r.applied })}` : '')),
117
+ });
118
+ const error = match.error ?? writeOff.error ?? importFile.error ?? undo.error ?? runRules.error;
119
+ const matched = (recent.data?.items ?? []);
120
+ return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-4", children: [_jsx("h1", { id: `${id}-title`, className: "text-lg font-semibold", children: label ?? t('bank.title') }), _jsxs("details", { className: "rounded-md border p-3", children: [_jsx("summary", { className: "cursor-pointer font-medium", children: t('bank.import') }), _jsxs("div", { className: "mt-3 grid gap-3 sm:grid-cols-2", children: [_jsx(Select, { id: `${id}-journal`, label: t('bank.journal'), value: journal, options: (journals.data?.items ?? []).map((j) => ({ value: String(j.id), label: `${j.code} ${j.name}` })), onChange: setJournal }), _jsx(Select, { id: `${id}-format`, label: t('bank.format'), value: fileFormat, options: [
121
+ { value: 'csv', label: 'CSV' },
122
+ { value: 'ofx', label: 'OFX' },
123
+ { value: 'camt', label: 'CAMT.053' },
124
+ ], onChange: setFileFormat }), fileFormat === 'csv'
125
+ ? ['date', 'label', 'amount'].map((key) => (_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-${key}`, children: t(`bank.column.${key}`) }), _jsx(Input, { id: `${id}-${key}`, value: columns[key], onChange: (e) => setColumns({ ...columns, [key]: e.target.value }) })] }, key)))
126
+ : null, _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-file`, children: t('bank.file') }), _jsx("input", { id: `${id}-file`, type: "file", disabled: journal === null || importFile.isPending, onChange: (e) => {
127
+ const file = e.target.files?.[0];
128
+ if (file !== undefined)
129
+ importFile.mutate(file);
130
+ } })] })] })] }), _jsx("div", { children: _jsx(Button, { busy: runRules.isPending, onClick: () => runRules.mutate(), children: t('bank.runRules') }) }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), error === null ? null : _jsx(Alert, { children: error.message }), line === undefined ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bank.nothingOpen') })) : (_jsxs("div", { className: "grid gap-4 lg:grid-cols-[18rem_1fr]", children: [_jsx("ol", { "aria-label": t('bank.lines'), className: "grid content-start gap-1", children: open.map((l, i) => (_jsx("li", { children: _jsxs("button", { type: "button", "aria-current": l.id === line.id, className: `w-full rounded-md px-2 py-1 text-start text-sm ${l.id === line.id ? 'bg-muted font-medium' : 'hover:bg-muted'}`, onClick: () => setCurrent(i), children: [_jsx("span", { className: "block truncate", children: l.label }), _jsxs("span", { className: "text-xs text-muted-foreground tabular-nums", children: [format.date(l.date), " \u00B7 ", l.amount] })] }) }, l.id))) }), _jsxs("div", { className: "grid content-start gap-3", children: [_jsxs("div", { className: "rounded-md border p-3", children: [_jsx("p", { className: "font-medium", children: line.label }), _jsxs("p", { className: "text-sm text-muted-foreground tabular-nums", children: [format.date(line.date), " \u00B7 ", line.reference ?? '', " \u00B7 ", line.amount] })] }), _jsxs("fieldset", { className: "grid gap-2", children: [_jsx("legend", { className: "font-medium", children: t('bank.proposals') }), (proposals.data?.proposals ?? []).length === 0 ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('bank.noProposal') })) : ((proposals.data?.proposals ?? []).map((p) => (_jsxs("div", { className: "flex items-start gap-2 rounded-md border p-2 text-sm", children: [_jsx(Checkbox, { id: `${id}-proposal-${p.move}`, checked: chosen.has(p.move), onCheckedChange: (on) => {
131
+ const next = new Set(chosen);
132
+ if (on === true)
133
+ next.add(p.move);
134
+ else
135
+ next.delete(p.move);
136
+ setChosen(next);
137
+ } }), _jsxs("label", { htmlFor: `${id}-proposal-${p.move}`, className: "grid gap-0.5", children: [_jsxs("span", { className: "font-medium", children: [p.name, " \u00B7 ", p.partner ?? '', " \u00B7", ' ', _jsx("span", { className: "tabular-nums", children: p.residual })] }), _jsx("span", { className: "text-xs text-muted-foreground", children: t('bank.because', { reasons: p.reasons.join(', ') }) })] })] }, p.move)))), _jsx("div", { children: _jsx(Button, { variant: "primary", disabled: chosen.size === 0, busy: match.isPending, onClick: () => match.mutate(), children: t('bank.match') }) })] }), _jsxs("fieldset", { className: "grid gap-2 sm:grid-cols-[1fr_auto] sm:items-end", children: [_jsx("legend", { className: "font-medium", children: t('bank.writeOff') }), _jsx(Select, { id: `${id}-account`, label: t('bank.account'), value: account, options: (accounts.data?.items ?? []).map((a) => ({ value: String(a.id), label: `${a.code} ${a.name}` })), onChange: setAccount }), _jsx(Button, { disabled: account === null, busy: writeOff.isPending, onClick: () => writeOff.mutate(), children: t('bank.writeOffConfirm') })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: t('bank.keys') })] })] })), matched.length === 0 ? null : (_jsxs("section", { "aria-labelledby": `${id}-recent`, className: "grid gap-1", children: [_jsx("h2", { id: `${id}-recent`, className: "font-medium", children: t('bank.recent') }), _jsx("ul", { className: "grid gap-1", children: matched.map((l) => (_jsxs("li", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsxs("span", { className: "truncate", children: [format.date(l.date), " \u00B7 ", l.label, " \u00B7", ' ', _jsx("span", { className: "tabular-nums", children: l.amount })] }), _jsx(Button, { size: "sm", variant: "ghost", busy: undo.isPending && undo.variables === l.id, onClick: () => undo.mutate(l.id), children: t('bank.undo') })] }, l.id))) })] }))] }));
138
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Accounting › Follow-ups (RFC 0029 §3.4): every customer with overdue invoices — how much, how late, the level
3
+ * reached and the last one sent, a pause with its promise. Send now sends the reminder of the level reached; Pause
4
+ * holds reminders until a date. The server decides what is due, sends and refuses.
5
+ */
6
+ import { type PageProps } from '../../ui/index.js';
7
+ import { type ReactElement } from 'react';
8
+ export declare function FollowupsPage({ api, label }: PageProps): ReactElement;
@@ -0,0 +1,54 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * Accounting › Follow-ups (RFC 0029 §3.4): every customer with overdue invoices — how much, how late, the level
4
+ * reached and the last one sent, a pause with its promise. Send now sends the reminder of the level reached; Pause
5
+ * holds reminders until a date. The server decides what is due, sends and refuses.
6
+ */
7
+ import { Alert, Button, Input, Label, useKosh } from '../../ui/index.js';
8
+ import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
9
+ import { useId, useState } from 'react';
10
+ import { useTranslation } from 'react-i18next';
11
+ export function FollowupsPage({ api, label }) {
12
+ const { t } = useTranslation('accounting');
13
+ const { format } = useKosh();
14
+ const id = useId();
15
+ const queryClient = useQueryClient();
16
+ const [message, setMessage] = useState(null);
17
+ const [pausing, setPausing] = useState(null);
18
+ const [until, setUntil] = useState('');
19
+ const [note, setNote] = useState('');
20
+ const rows = useQuery({
21
+ queryKey: ['accounting', 'followups'],
22
+ queryFn: () => api.call('GET', '/api/v1/accounting/followups'),
23
+ });
24
+ const done = async (text) => {
25
+ setMessage(text);
26
+ await queryClient.invalidateQueries({ queryKey: ['accounting', 'followups'] });
27
+ };
28
+ const send = useMutation({
29
+ mutationFn: (partner) => api.call('POST', `/api/v1/accounting/followups/${partner}/send`),
30
+ onSuccess: (r) => done(t('followups.sent', { level: r.level, channels: r.channels.join(', ') })),
31
+ });
32
+ const pause = useMutation({
33
+ mutationFn: (input) => api.call('POST', `/api/v1/accounting/followups/${input.partner}/pause`, {
34
+ until: input.until,
35
+ note,
36
+ }),
37
+ onSuccess: (_r, input) => {
38
+ setPausing(null);
39
+ return done(input.until === null ? t('followups.resumed') : t('followups.paused'));
40
+ },
41
+ });
42
+ const error = send.error ?? pause.error;
43
+ const list = rows.data?.rows ?? [];
44
+ return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-4", children: [_jsx("h1", { id: `${id}-title`, className: "text-lg font-semibold", children: label ?? t('followups.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('followups.intro') }), message === null ? null : _jsx(Alert, { tone: "info", children: message }), error === null ? null : _jsx(Alert, { children: error.message }), list.length === 0 && !rows.isPending ? (_jsx("p", { className: "text-sm text-muted-foreground", children: t('followups.nobody') })) : (_jsx("div", { className: "overflow-x-auto", children: _jsxs("table", { className: "w-full text-sm", children: [_jsx("thead", { className: "text-start text-muted-foreground", children: _jsxs("tr", { children: [_jsx("th", { className: "py-1 text-start font-medium", children: t('followups.customer') }), _jsx("th", { className: "py-1 text-end font-medium", children: t('followups.overdue') }), _jsx("th", { className: "py-1 text-end font-medium", children: t('followups.late') }), _jsx("th", { className: "py-1 text-start font-medium", children: t('followups.level') }), _jsx("th", { className: "py-1 text-start font-medium", children: t('followups.lastSent') }), _jsx("th", { className: "py-1", children: _jsx("span", { className: "sr-only", children: t('followups.actions') }) })] }) }), _jsx("tbody", { children: list.map((r) => (_jsxs("tr", { className: "border-t align-top", children: [_jsxs("td", { className: "py-2", children: [_jsx("span", { className: "font-medium", children: r.name }), _jsx("span", { className: "block text-xs text-muted-foreground", children: r.invoices.map((i) => i.name).join(', ') }), r.pausedUntil === null ? null : (_jsx("span", { className: "block text-xs text-muted-foreground", children: t('followups.pausedUntil', {
45
+ date: format.date(r.pausedUntil),
46
+ note: r.pauseNote ?? '',
47
+ }) }))] }), _jsx("td", { className: "py-2 text-end tabular-nums", children: r.amount }), _jsx("td", { className: "py-2 text-end tabular-nums", children: t('followups.days', { count: r.days }) }), _jsx("td", { className: "py-2", children: r.due?.name ?? t('followups.none') }), _jsx("td", { className: "py-2", children: r.sent === null
48
+ ? t('followups.never')
49
+ : `${r.sent.name}${r.sentAt === null ? '' : ` · ${format.date(r.sentAt)}`}` }), _jsxs("td", { className: "py-2", children: [_jsxs("div", { className: "flex flex-wrap justify-end gap-2", children: [_jsx(Button, { size: "sm", disabled: r.due === null, busy: send.isPending && send.variables === r.partner, onClick: () => send.mutate(r.partner), children: t('followups.sendNow') }), r.pausedUntil === null ? (_jsx(Button, { size: "sm", variant: "ghost", onClick: () => {
50
+ setPausing(r.partner);
51
+ setUntil('');
52
+ setNote('');
53
+ }, children: t('followups.pause') })) : (_jsx(Button, { size: "sm", variant: "ghost", busy: pause.isPending, onClick: () => pause.mutate({ partner: r.partner, until: null }), children: t('followups.resume') }))] }), pausing !== r.partner ? null : (_jsxs("div", { className: "mt-2 grid gap-2 sm:grid-cols-[auto_1fr_auto] sm:items-end", children: [_jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-until`, children: t('followups.until') }), _jsx(Input, { id: `${id}-until`, type: "date", value: until, onChange: (e) => setUntil(e.target.value) })] }), _jsxs("div", { className: "grid gap-1", children: [_jsx(Label, { htmlFor: `${id}-note`, children: t('followups.promise') }), _jsx(Input, { id: `${id}-note`, value: note, onChange: (e) => setNote(e.target.value) })] }), _jsx(Button, { size: "sm", variant: "primary", disabled: until === '', busy: pause.isPending, onClick: () => pause.mutate({ partner: r.partner, until }), children: t('followups.confirmPause') })] }))] })] }, r.partner))) })] }) }))] }));
54
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * On a draft invoice or bill (RFC 0029 §3.5): what posting will do — the fiscal position and why it applies, each
3
+ * line's taxes after the mapping and its account with where it came from (the line, the product, its category, the
4
+ * journal), and the receivable or payable account. The server decides; this only shows it.
5
+ */
6
+ import type { NodeComponentProps } from '../../ui/index.js';
7
+ import type { ReactElement } from 'react';
8
+ export declare function PostingPreview({ record, api, version }: NodeComponentProps): ReactElement | null;
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useQuery } from '@tanstack/react-query';
3
+ import { useId } from 'react';
4
+ import { useTranslation } from 'react-i18next';
5
+ export function PostingPreview({ record, api, version }) {
6
+ const { t } = useTranslation('accounting');
7
+ const id = useId();
8
+ const draft = record !== null && record['state'] === 'draft' && record['kind'] !== 'entry';
9
+ const preview = useQuery({
10
+ queryKey: ['accounting', 'preview', record?.id, version],
11
+ queryFn: () => api.call('GET', `/api/v1/accounting/moves/${record?.id}/preview`),
12
+ enabled: draft,
13
+ });
14
+ const p = preview.data;
15
+ if (!draft || p === undefined || p.lines.length === 0)
16
+ return null;
17
+ const source = (s) => t(`preview.source.${s}`, { defaultValue: s });
18
+ return (_jsxs("section", { "aria-labelledby": `${id}-title`, className: "grid gap-2 rounded-md border p-3 text-sm", children: [_jsx("h3", { id: `${id}-title`, className: "font-medium", children: t('preview.title') }), _jsx("p", { className: "text-muted-foreground", children: p.position === null
19
+ ? t('preview.noPosition')
20
+ : t('preview.position', { name: p.position.name, why: p.why }) }), _jsx("ul", { className: "grid gap-1", children: p.lines.map((l) => (_jsxs("li", { children: [_jsx("span", { className: "font-medium", children: l.name }), ' · ', l.taxesBefore.join(', ') === l.taxesAfter.join(', ')
21
+ ? l.taxesAfter.join(', ') || t('preview.noTax')
22
+ : `${l.taxesBefore.join(', ') || t('preview.noTax')} → ${l.taxesAfter.join(', ') || t('preview.noTax')}`, ' · ', l.account ?? t('preview.noAccount'), ' ', _jsxs("span", { className: "text-muted-foreground", children: ["(", source(l.source), l.mapped ? `, ${t('preview.mapped')}` : '', ")"] })] }, l.id))) }), _jsxs("p", { className: "text-muted-foreground", children: [t('preview.counterpart', {
23
+ account: p.counterpart.account ?? t('preview.noAccount'),
24
+ source: source(p.counterpart.source),
25
+ }), p.counterpart.mapped ? `, ${t('preview.mapped')}` : ''] })] }));
26
+ }
@@ -7,6 +7,9 @@ import { type Registry } from '../../ui/index.js';
7
7
  import type { i18n } from 'i18next';
8
8
  import { messages } from './messages.js';
9
9
  export { AgingPage } from './AgingPage.js';
10
+ export { BankReconcilePage } from './BankReconcilePage.js';
11
+ export { FollowupsPage } from './FollowupsPage.js';
12
+ export { PostingPreview } from './PostingPreview.js';
10
13
  export { ReconcilePage } from './ReconcilePage.js';
11
14
  export { RegisterPayment } from './RegisterPayment.js';
12
15
  export { SettingsPage } from './SettingsPage.js';
@@ -5,11 +5,17 @@
5
5
  */
6
6
  import { addMessages } from '../../ui/index.js';
7
7
  import { AgingPage } from './AgingPage.js';
8
+ import { BankReconcilePage } from './BankReconcilePage.js';
9
+ import { FollowupsPage } from './FollowupsPage.js';
8
10
  import { messages } from './messages.js';
11
+ import { PostingPreview } from './PostingPreview.js';
9
12
  import { ReconcilePage } from './ReconcilePage.js';
10
13
  import { RegisterPayment } from './RegisterPayment.js';
11
14
  import { SettingsPage } from './SettingsPage.js';
12
15
  export { AgingPage } from './AgingPage.js';
16
+ export { BankReconcilePage } from './BankReconcilePage.js';
17
+ export { FollowupsPage } from './FollowupsPage.js';
18
+ export { PostingPreview } from './PostingPreview.js';
13
19
  export { ReconcilePage } from './ReconcilePage.js';
14
20
  export { RegisterPayment } from './RegisterPayment.js';
15
21
  export { SettingsPage } from './SettingsPage.js';
@@ -18,7 +24,10 @@ export function registerAccountingWeb(registry, i18n) {
18
24
  registry.registerPage('accounting.Settings', SettingsPage);
19
25
  registry.registerPage('accounting.Reconcile', ReconcilePage);
20
26
  registry.registerPage('accounting.Aging', AgingPage);
27
+ registry.registerPage('accounting.BankReconcile', BankReconcilePage);
28
+ registry.registerPage('accounting.Followups', FollowupsPage);
21
29
  registry.registerComponent('accounting.RegisterPayment', RegisterPayment);
30
+ registry.registerComponent('accounting.PostingPreview', PostingPreview);
22
31
  if (i18n !== undefined)
23
32
  addMessages(i18n, 'accounting', messages);
24
33
  return registry;
@@ -1,6 +1,76 @@
1
1
  /** Messages of the accounting screens (namespace `accounting`), in English and Bangla. */
2
2
  export const messages = {
3
3
  en: {
4
+ preview: {
5
+ title: 'When confirmed',
6
+ noPosition: 'No fiscal position: taxes and accounts as they are.',
7
+ position: 'Fiscal position {{name}}: {{why}}.',
8
+ noTax: 'no tax',
9
+ noAccount: 'no account',
10
+ mapped: 'mapped by the fiscal position',
11
+ counterpart: 'Owed on {{account}} ({{source}})',
12
+ source: {
13
+ line: 'set on the line',
14
+ app: 'from the order',
15
+ product: 'the product’s',
16
+ category: 'the category’s',
17
+ journal: 'the journal’s',
18
+ partner: 'the partner’s',
19
+ company: 'the company’s',
20
+ none: 'none',
21
+ },
22
+ },
23
+ followups: {
24
+ title: 'Follow-ups',
25
+ intro: 'Customers with invoices past their due date. Each day they get one reminder for the highest level reached; Send now sends it at once, Pause holds reminders until a promised date.',
26
+ nobody: 'Nobody is late.',
27
+ customer: 'Customer',
28
+ overdue: 'Overdue',
29
+ late: 'Late',
30
+ level: 'Level reached',
31
+ lastSent: 'Last sent',
32
+ actions: 'Actions',
33
+ days_one: '{{count}} day',
34
+ days_other: '{{count}} days',
35
+ none: 'Not yet',
36
+ never: 'Never',
37
+ sendNow: 'Send now',
38
+ pause: 'Pause',
39
+ resume: 'Resume',
40
+ until: 'Until',
41
+ promise: 'Promise',
42
+ confirmPause: 'Pause',
43
+ pausedUntil: 'Paused until {{date}} {{note}}',
44
+ sent: 'Reminder "{{level}}" sent by {{channels}}.',
45
+ paused: 'Paused.',
46
+ resumed: 'Reminders resumed.',
47
+ },
48
+ bank: {
49
+ title: 'Reconcile bank',
50
+ import: 'Import a statement',
51
+ journal: 'Journal',
52
+ format: 'Format',
53
+ file: 'File',
54
+ column: { date: 'Date column', label: 'Label column', amount: 'Amount column' },
55
+ imported: '{{created}} lines imported, {{skipped}} already there.',
56
+ nothingOpen: 'Every statement line is matched.',
57
+ lines: 'Open lines',
58
+ proposals: 'What it may pay',
59
+ noProposal: 'No open document looks like it: write it off, or leave it for later.',
60
+ because: 'Because of {{reasons}}.',
61
+ match: 'Match',
62
+ matched: 'Matched: the payment is posted and reconciled.',
63
+ writeOff: 'Or write it off',
64
+ account: 'Account',
65
+ writeOffConfirm: 'Write off',
66
+ writtenOff: 'Written off.',
67
+ keys: 'J / K: the next and the previous line.',
68
+ runRules: 'Run rules',
69
+ rulesRun: 'Rules matched or wrote off {{count}} lines.',
70
+ recent: 'Recently matched',
71
+ undo: 'Undo',
72
+ undone: 'Undone: the line is open again.',
73
+ },
4
74
  settings: {
5
75
  title: 'Accounting settings',
6
76
  chart: 'Chart of accounts',
@@ -63,6 +133,76 @@ export const messages = {
63
133
  },
64
134
  },
65
135
  bn: {
136
+ preview: {
137
+ title: 'নিশ্চিত করলে',
138
+ noPosition: 'কোনো ফিসকাল পজিশন নেই: কর ও হিসাব যেমন আছে।',
139
+ position: 'ফিসকাল পজিশন {{name}}: {{why}}।',
140
+ noTax: 'কর নেই',
141
+ noAccount: 'হিসাব নেই',
142
+ mapped: 'ফিসকাল পজিশনে বদলানো',
143
+ counterpart: 'পাওনা {{account}}-এ ({{source}})',
144
+ source: {
145
+ line: 'লাইনে দেওয়া',
146
+ app: 'অর্ডার থেকে',
147
+ product: 'পণ্যের',
148
+ category: 'শ্রেণির',
149
+ journal: 'জার্নালের',
150
+ partner: 'পার্টনারের',
151
+ company: 'প্রতিষ্ঠানের',
152
+ none: 'কিছু নেই',
153
+ },
154
+ },
155
+ followups: {
156
+ title: 'তাগাদা',
157
+ intro: 'যেসব গ্রাহকের ইনভয়েস নির্ধারিত তারিখ পেরিয়েছে। প্রতিদিন তারা পৌঁছানো সর্বোচ্চ স্তরের একটি অনুস্মারক পান; এখনই পাঠান সঙ্গে সঙ্গে পাঠায়, বিরতি প্রতিশ্রুত তারিখ পর্যন্ত অনুস্মারক থামায়।',
158
+ nobody: 'কেউ দেরি করেননি।',
159
+ customer: 'গ্রাহক',
160
+ overdue: 'বকেয়া',
161
+ late: 'দেরি',
162
+ level: 'পৌঁছানো স্তর',
163
+ lastSent: 'শেষ পাঠানো',
164
+ actions: 'কাজ',
165
+ days_one: '{{count}} দিন',
166
+ days_other: '{{count}} দিন',
167
+ none: 'এখনো নয়',
168
+ never: 'কখনো নয়',
169
+ sendNow: 'এখনই পাঠান',
170
+ pause: 'বিরতি',
171
+ resume: 'আবার চালু করুন',
172
+ until: 'পর্যন্ত',
173
+ promise: 'প্রতিশ্রুতি',
174
+ confirmPause: 'বিরতি দিন',
175
+ pausedUntil: '{{date}} পর্যন্ত বিরতি {{note}}',
176
+ sent: '"{{level}}" অনুস্মারক {{channels}} দিয়ে পাঠানো হয়েছে।',
177
+ paused: 'বিরতি দেওয়া হয়েছে।',
178
+ resumed: 'অনুস্মারক আবার চালু।',
179
+ },
180
+ bank: {
181
+ title: 'ব্যাংক মিলান',
182
+ import: 'স্টেটমেন্ট আমদানি',
183
+ journal: 'জার্নাল',
184
+ format: 'ফরম্যাট',
185
+ file: 'ফাইল',
186
+ column: { date: 'তারিখের কলাম', label: 'বিবরণের কলাম', amount: 'অঙ্কের কলাম' },
187
+ imported: '{{created}}টি লাইন আমদানি হয়েছে, {{skipped}}টি আগেই ছিল।',
188
+ nothingOpen: 'স্টেটমেন্টের প্রতিটি লাইন মিলেছে।',
189
+ lines: 'খোলা লাইন',
190
+ proposals: 'যা পরিশোধ হতে পারে',
191
+ noProposal: 'কোনো খোলা নথি এর মতো নয়: খরচ হিসেবে লিখুন, বা পরে দেখুন।',
192
+ because: 'কারণ: {{reasons}}।',
193
+ match: 'মেলান',
194
+ matched: 'মিলেছে: পেমেন্ট পোস্ট ও মিলান হয়েছে।',
195
+ writeOff: 'অথবা খরচ হিসেবে লিখুন',
196
+ account: 'হিসাব',
197
+ writeOffConfirm: 'খরচ হিসেবে লিখুন',
198
+ runRules: 'নিয়ম চালান',
199
+ rulesRun: 'নিয়মগুলো {{count}}টি লাইন মিলিয়েছে বা খরচ লিখেছে।',
200
+ recent: 'সম্প্রতি মেলানো',
201
+ undo: 'ফিরিয়ে নিন',
202
+ undone: 'ফিরিয়ে নেওয়া হয়েছে: লাইনটি আবার খোলা।',
203
+ writtenOff: 'খরচ হিসেবে লেখা হয়েছে।',
204
+ keys: 'J / K: পরের ও আগের লাইন।',
205
+ },
66
206
  settings: {
67
207
  title: 'হিসাবরক্ষণ সেটিংস',
68
208
  chart: 'হিসাবের ছক',
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: f4cc209cf945d73d
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 727ae347ccaee3be
2
2
  // Bindings of module `approvals`: import the definition API from here to get types scoped to what it can see.
3
3
  export { defineModel, defineModule, extendModel, f, replace } from '../../server/orm.js';
4
4
  import { definitions } from '../../server/orm.js';