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
@@ -4,38 +4,123 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
4
4
  * in it; switching to one; and, for administrators, a new company — its apps' defaults (journals, sequences, taxes…)
5
5
  * are installed with it, and the administrators can switch to it at once.
6
6
  */
7
- import { Alert, ApiError, Avatar, Badge, Button, Dialog, Input, imageUrl, Label, Select, useKosh, } from '../../ui/index.js';
7
+ import { Alert, ApiError, Avatar, Badge, Button, Checkbox, Dialog, Input, imageUrl, Label, Select, Textarea, useKosh, } from '../../ui/index.js';
8
8
  import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
9
- import { Building2, Plus } from 'lucide-react';
9
+ import { Building2, CheckCircle2, Info, Plus } from 'lucide-react';
10
10
  import { useEffect, useId, useState } from 'react';
11
11
  import { useTranslation } from 'react-i18next';
12
12
  const message = (error) => (error instanceof ApiError ? error.message : String(error));
13
- function NewCompanyDialog({ api, currencies, open, onOpenChange, }) {
13
+ /** The details of a new company, grouped as people expect them; anything else an app adds goes under "More". */
14
+ const ADDRESS = ['street', 'street2', 'city', 'state', 'zip', 'country', 'countryCode'];
15
+ const CONTACT = ['email', 'phone', 'mobile', 'website'];
16
+ const REGISTRATION = /tax|vat|bin|tin|gst|pan|registration|trade|licen|fiscal|year/i;
17
+ function DetailInput({ id, field, value, onChange, }) {
18
+ if (field.kind === 'boolean')
19
+ return (_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Checkbox, { id: id, checked: value === true, onCheckedChange: (c) => onChange(c === true), "aria-describedby": field.help === null ? undefined : `${id}-help` }), _jsx(Label, { htmlFor: id, children: field.label })] }));
20
+ if (field.kind === 'selection' && field.options !== null)
21
+ return (_jsx(Select, { id: id, label: field.label, value: typeof value === 'string' ? value : null, options: field.options, onChange: onChange }));
22
+ if (field.kind === 'text')
23
+ return (_jsx(Textarea, { id: id, rows: 2, value: typeof value === 'string' ? value : '', onChange: (e) => onChange(e.target.value), "aria-describedby": field.help === null ? undefined : `${id}-help` }));
24
+ return (_jsx(Input, { id: id, type: field.kind === 'integer'
25
+ ? 'number'
26
+ : field.key === 'email'
27
+ ? 'email'
28
+ : field.key === 'website'
29
+ ? 'url'
30
+ : field.key.toLowerCase().includes('phone') || field.key === 'mobile'
31
+ ? 'tel'
32
+ : 'text', value: typeof value === 'string' || typeof value === 'number' ? String(value) : '', onChange: (e) => onChange(field.kind === 'integer'
33
+ ? e.target.value === ''
34
+ ? null
35
+ : Number(e.target.value)
36
+ : e.target.value), "aria-describedby": field.help === null ? undefined : `${id}-help` }));
37
+ }
38
+ function NewCompanyDialog({ api, currencies, fields, open, onOpenChange, }) {
14
39
  const { t } = useTranslation('settings');
40
+ const { switchCompany } = useKosh();
15
41
  const id = useId();
16
42
  const queryClient = useQueryClient();
17
43
  const [name, setName] = useState('');
18
44
  const [currency, setCurrency] = useState(null);
45
+ const [grouping, setGrouping] = useState('international');
46
+ const [accent, setAccent] = useState('');
47
+ const [details, setDetails] = useState({});
19
48
  const create = useMutation({
20
49
  mutationFn: () => api.call('POST', '/api/v1/settings/companies', {
21
50
  name,
22
51
  currency: Number(currency),
52
+ numberGrouping: grouping,
53
+ ...(accent === '' ? {} : { accentColor: accent }),
54
+ details: Object.fromEntries(Object.entries(details).filter(([, v]) => v !== '' && v !== null && v !== undefined)),
23
55
  }),
24
56
  onSuccess: () => {
25
57
  void queryClient.invalidateQueries({ queryKey: ['settings', 'companies'] });
26
58
  // The switcher lists the user's companies from their details.
27
59
  void queryClient.invalidateQueries({ queryKey: ['me'] });
28
- onOpenChange(false);
29
60
  },
30
61
  });
31
62
  useEffect(() => {
32
63
  if (!open) {
33
64
  setName('');
34
65
  setCurrency(null);
66
+ setGrouping('international');
67
+ setAccent('');
68
+ setDetails({});
35
69
  create.reset();
36
70
  }
37
71
  }, [open, create.reset]);
38
- return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, title: t('companies.newTitle'), description: t('companies.newHint'), footer: _jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => onOpenChange(false), children: t('profile.cancel') }), _jsx(Button, { variant: "primary", busy: create.isPending, disabled: name.trim() === '' || currency === null, onClick: () => create.mutate(), children: t('companies.create') })] }), children: _jsxs("div", { className: "grid gap-4", children: [_jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { htmlFor: `${id}-name`, children: t('company.name') }), _jsx(Input, { id: `${id}-name`, value: name, onChange: (e) => setName(e.target.value) })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { htmlFor: `${id}-currency`, children: t('companies.currency') }), _jsx(Select, { id: `${id}-currency`, label: t('companies.currency'), value: currency, placeholder: t('companies.chooseCurrency'), options: currencies.map((c) => ({ value: String(c.id), label: c.name })), onChange: setCurrency })] }), create.error === null ? null : _jsx(Alert, { tone: "danger", children: message(create.error) })] }) }));
72
+ // The lakh and crore grouping suits taka and rupees: suggested when one is chosen (still the person's choice).
73
+ const chooseCurrency = (value) => {
74
+ setCurrency(value);
75
+ const code = currencies.find((c) => String(c.id) === value)?.name ?? '';
76
+ setGrouping(['BDT', 'INR', 'NPR', 'PKR', 'LKR'].includes(code) ? 'lakh' : 'international');
77
+ };
78
+ const set = (key) => (value) => setDetails((d) => ({ ...d, [key]: value }));
79
+ const groups = [
80
+ {
81
+ key: 'address',
82
+ title: t('companies.address'),
83
+ hint: t('companies.addressHint'),
84
+ fields: ADDRESS.flatMap((k) => fields.filter((f) => f.key === k)),
85
+ },
86
+ {
87
+ key: 'contact',
88
+ title: t('companies.contact'),
89
+ hint: t('companies.contactHint'),
90
+ fields: CONTACT.flatMap((k) => fields.filter((f) => f.key === k)),
91
+ },
92
+ {
93
+ key: 'registration',
94
+ title: t('companies.registration'),
95
+ hint: t('companies.registrationHint'),
96
+ fields: fields.filter((f) => !ADDRESS.includes(f.key) &&
97
+ !CONTACT.includes(f.key) &&
98
+ REGISTRATION.test(`${f.key} ${f.label}`)),
99
+ },
100
+ {
101
+ key: 'more',
102
+ title: t('companies.more'),
103
+ hint: t('companies.moreHint'),
104
+ fields: fields.filter((f) => !ADDRESS.includes(f.key) &&
105
+ !CONTACT.includes(f.key) &&
106
+ !REGISTRATION.test(`${f.key} ${f.label}`)),
107
+ },
108
+ ].filter((g) => g.fields.length > 0);
109
+ const done = create.data;
110
+ const field = (f) => {
111
+ const fid = `${id}-${f.key}`;
112
+ return (_jsxs("div", { className: f.kind === 'text' ? 'grid gap-1.5 sm:col-span-2' : 'grid gap-1.5', children: [f.kind === 'boolean' ? null : _jsx(Label, { htmlFor: fid, children: f.label }), _jsx(DetailInput, { id: fid, field: f, value: details[f.key], onChange: set(f.key) }), f.help === null ? null : (_jsx("p", { id: `${fid}-help`, className: "text-xs text-muted-foreground", children: f.help }))] }, f.key));
113
+ };
114
+ return (_jsx(Dialog, { open: open, onOpenChange: onOpenChange, wide: true, title: done === undefined
115
+ ? t('companies.newTitle')
116
+ : t('companies.readyTitle', { name: done.name }), description: done === undefined ? t('companies.newHint') : t('companies.readyHint'), footer: done === undefined ? (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => onOpenChange(false), children: t('profile.cancel') }), _jsx(Button, { variant: "primary", busy: create.isPending, disabled: name.trim() === '' || currency === null, onClick: () => create.mutate(), children: t('companies.create') })] })) : (_jsxs(_Fragment, { children: [_jsx(Button, { onClick: () => onOpenChange(false), children: t('companies.close') }), switchCompany === undefined ? null : (_jsx(Button, { variant: "primary", onClick: () => switchCompany(done.id), children: t('companies.switchNow') }))] })), children: done !== undefined ? (_jsxs("div", { className: "grid gap-3", children: [_jsxs("p", { className: "flex items-center gap-2 text-sm font-medium text-success", children: [_jsx(CheckCircle2, { className: "size-4", "aria-hidden": true }), t('companies.created', { name: done.name })] }), done.defaults.length === 0 ? null : (_jsxs("section", { "aria-label": t('companies.setUp'), className: "rounded-md border p-3", children: [_jsx("h3", { className: "mb-2 text-sm font-semibold", children: t('companies.setUp') }), _jsx("ul", { className: "grid gap-1 text-sm", children: done.defaults.map((d) => (_jsxs("li", { className: "flex gap-2", children: [_jsx("span", { className: "min-w-28 font-medium", children: d.module }), _jsx("span", { className: "text-muted-foreground", children: d.summary })] }, d.module))) })] })), _jsx("p", { className: "text-sm text-muted-foreground", children: t('companies.nextSteps') })] })) : (_jsxs("form", { className: "grid gap-6", onSubmit: (e) => {
117
+ e.preventDefault();
118
+ if (name.trim() !== '' && currency !== null)
119
+ create.mutate();
120
+ }, children: [_jsxs("fieldset", { className: "grid gap-4", children: [_jsx("legend", { className: "mb-1 text-sm font-semibold", children: t('companies.identity') }), _jsx("p", { className: "-mt-2 text-xs text-muted-foreground", children: t('companies.identityHint') }), _jsxs("div", { className: "grid gap-4 sm:grid-cols-2", children: [_jsxs("div", { className: "grid gap-1.5 sm:col-span-2", children: [_jsxs(Label, { htmlFor: `${id}-name`, children: [t('company.name'), ' ', _jsx("span", { "aria-hidden": true, className: "text-danger", children: "*" })] }), _jsx(Input, { id: `${id}-name`, required: true, "aria-required": true, autoFocus: true, value: name, placeholder: t('companies.namePlaceholder'), onChange: (e) => setName(e.target.value) })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsxs(Label, { htmlFor: `${id}-currency`, children: [t('companies.currency'), ' ', _jsx("span", { "aria-hidden": true, className: "text-danger", children: "*" })] }), _jsx(Select, { id: `${id}-currency`, label: t('companies.currency'), value: currency, placeholder: t('companies.chooseCurrency'), options: currencies.map((c) => ({ value: String(c.id), label: c.name })), onChange: chooseCurrency }), _jsx("p", { className: "text-xs text-muted-foreground", children: t('companies.currencyHint') })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { htmlFor: `${id}-grouping`, children: t('company.grouping') }), _jsx(Select, { id: `${id}-grouping`, label: t('company.grouping'), value: grouping, options: [
121
+ { value: 'international', label: t('company.international') },
122
+ { value: 'lakh', label: t('company.lakh') },
123
+ ], onChange: (v) => setGrouping(v === 'lakh' ? 'lakh' : 'international') })] }), _jsxs("div", { className: "grid gap-1.5", children: [_jsx(Label, { htmlFor: `${id}-accent`, children: t('company.brand') }), _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("input", { type: "color", "aria-label": t('company.picker'), className: "h-9 w-12 cursor-pointer rounded border bg-surface", value: accent === '' ? '#4f46e5' : accent, onChange: (e) => setAccent(e.target.value) }), _jsx(Input, { id: `${id}-accent`, value: accent, placeholder: "#4f46e5", onChange: (e) => setAccent(e.target.value.trim()) })] }), _jsx("p", { className: "text-xs text-muted-foreground", children: t('companies.brandHint') })] })] })] }), groups.map((g) => (_jsxs("fieldset", { className: "grid gap-4 border-t pt-4", children: [_jsx("legend", { className: "mb-1 text-sm font-semibold", children: g.title }), _jsx("p", { className: "-mt-2 text-xs text-muted-foreground", children: g.hint }), _jsx("div", { className: "grid gap-4 sm:grid-cols-2", children: g.fields.map(field) })] }, g.key))), _jsxs("div", { className: "flex items-start gap-2 rounded-md bg-muted/60 p-3 text-xs text-muted-foreground", children: [_jsx(Info, { className: "mt-0.5 size-4 shrink-0", "aria-hidden": true }), _jsx("p", { children: t('companies.whatHappens') })] }), create.error === null ? null : _jsx(Alert, { tone: "danger", children: message(create.error) }), _jsx("button", { type: "submit", hidden: true, "aria-hidden": true, tabIndex: -1 })] })) }));
39
124
  }
40
125
  export function CompaniesPage({ api }) {
41
126
  const { t } = useTranslation('settings');
@@ -48,5 +133,5 @@ export function CompaniesPage({ api }) {
48
133
  if (list.error !== null)
49
134
  return _jsx(Alert, { tone: "danger", children: message(list.error) });
50
135
  const data = list.data;
51
- return (_jsxs("div", { className: "mx-auto grid max-w-3xl gap-6", children: [_jsxs("header", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: t('companies.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('companies.intro') })] }), data?.canCreate === true ? (_jsxs(Button, { variant: "primary", onClick: () => setCreating(true), children: [_jsx(Plus, { className: "size-4", "aria-hidden": true }), t('companies.new')] })) : null] }), data === undefined ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "\u2026" })) : (_jsx("ul", { className: "divide-y rounded-lg border bg-surface", children: data.companies.map((c) => (_jsxs("li", { className: "flex flex-wrap items-center gap-3 px-4 py-3", children: [c.logo === null ? (_jsx("span", { "aria-hidden": true, className: "grid size-9 shrink-0 place-items-center rounded-md bg-muted text-muted-foreground", children: _jsx(Building2, { className: "size-4" }) })) : (_jsx(Avatar, { name: c.name, src: imageUrl('company', c.id, c.logo), shape: "square", className: "size-9 border" })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "flex items-center gap-2 font-medium", children: [_jsx("span", { className: "truncate", children: c.name }), c.current ? _jsx(Badge, { tone: "info", children: t('companies.current') }) : null] }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [c.currency, " \u00B7 ", t('companies.people', { count: c.people })] })] }), c.current || !c.member || switchCompany === undefined ? null : (_jsx(Button, { size: "sm", "aria-label": t('companies.switchTo', { name: c.name }), onClick: () => switchCompany(c.id), children: t('companies.switch') }))] }, c.id))) })), data === undefined ? null : (_jsx(NewCompanyDialog, { api: api, currencies: data.currencies, open: creating, onOpenChange: setCreating }))] }));
136
+ return (_jsxs("div", { className: "mx-auto grid max-w-3xl gap-6", children: [_jsxs("header", { className: "flex flex-wrap items-start justify-between gap-3", children: [_jsxs("div", { children: [_jsx("h1", { className: "text-xl font-semibold", children: t('companies.title') }), _jsx("p", { className: "text-sm text-muted-foreground", children: t('companies.intro') })] }), data?.canCreate === true ? (_jsxs(Button, { variant: "primary", onClick: () => setCreating(true), children: [_jsx(Plus, { className: "size-4", "aria-hidden": true }), t('companies.new')] })) : null] }), data === undefined ? (_jsx("p", { className: "text-sm text-muted-foreground", children: "\u2026" })) : (_jsx("ul", { className: "divide-y rounded-lg border bg-surface", children: data.companies.map((c) => (_jsxs("li", { className: "flex flex-wrap items-center gap-3 px-4 py-3", children: [c.logo === null ? (_jsx("span", { "aria-hidden": true, className: "grid size-9 shrink-0 place-items-center rounded-md bg-muted text-muted-foreground", children: _jsx(Building2, { className: "size-4" }) })) : (_jsx(Avatar, { name: c.name, src: imageUrl('company', c.id, c.logo), shape: "square", className: "size-9 border" })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: "flex items-center gap-2 font-medium", children: [_jsx("span", { className: "truncate", children: c.name }), c.current ? _jsx(Badge, { tone: "info", children: t('companies.current') }) : null] }), _jsxs("p", { className: "text-sm text-muted-foreground", children: [c.currency, " \u00B7 ", t('companies.people', { count: c.people })] })] }), c.current || !c.member || switchCompany === undefined ? null : (_jsx(Button, { size: "sm", "aria-label": t('companies.switchTo', { name: c.name }), onClick: () => switchCompany(c.id), children: t('companies.switch') }))] }, c.id))) })), data === undefined ? null : (_jsx(NewCompanyDialog, { api: api, currencies: data.currencies, fields: data.fields ?? [], open: creating, onOpenChange: setCreating }))] }));
52
137
  }
@@ -357,6 +357,27 @@ export const messages = {
357
357
  people_other: '{{count}} people',
358
358
  switch: 'Switch',
359
359
  switchTo: 'Switch to {{name}}',
360
+ identity: 'Identity',
361
+ identityHint: 'How the company is named and counts its money. The currency cannot be changed once it has entries.',
362
+ namePlaceholder: 'e.g. Padma Traders Ltd.',
363
+ currencyHint: 'Its books, prices and reports are in this currency.',
364
+ brandHint: 'The accent of the back-office for everyone working in this company. Empty: the default.',
365
+ address: 'Address',
366
+ addressHint: 'Printed on its invoices, orders and letters, and shown in the customer portal.',
367
+ contact: 'Contact',
368
+ contactHint: 'How customers and vendors reach it; on its documents and emails.',
369
+ registration: 'Registration and tax',
370
+ registrationHint: 'Its identifiers with the authorities, on tax invoices and returns. Fill them in now or later in Settings › Company.',
371
+ more: 'More',
372
+ moreHint: 'What the installed apps ask of a company. Everything here can be changed later in Settings › Company.',
373
+ whatHappens: 'Creating it sets up what each installed app needs — journals, taxes, sequences, defaults — and gives administrators access at once. Give others access in People.',
374
+ readyTitle: '{{name}} is ready',
375
+ readyHint: 'Its apps are set up. Switch to it to start working in it.',
376
+ created: '{{name}} was created.',
377
+ setUp: 'Set up for it',
378
+ nextSteps: 'Next: invite its people in People, then check its App settings.',
379
+ switchNow: 'Switch to it now',
380
+ close: 'Close',
360
381
  },
361
382
  apiKeys: {
362
383
  title: 'API keys',
@@ -410,6 +431,17 @@ export const messages = {
410
431
  enable: 'Enable',
411
432
  disable: 'Disable',
412
433
  upgrade: 'Upgrade',
434
+ uninstall: 'Uninstall',
435
+ doneUninstalled: 'removed {{name}} with its data',
436
+ planTitleUninstall: 'Uninstall {{name}} and remove its data?',
437
+ planUninstall: 'Removed with its data',
438
+ planDrops: 'What is deleted',
439
+ planDropWhat: 'Table or column',
440
+ planDropRows: 'Rows',
441
+ planRemovesData: 'This deletes the app’s data for good. A snapshot is kept for 30 days. To keep the data, disable the app instead.',
442
+ typeName: 'Type {{name}} to confirm',
443
+ authCode: 'Code from your authenticator app',
444
+ confirmUninstall: 'Remove the data',
413
445
  installedVersion: 'installed {{version}}',
414
446
  planTitleUpgrade: 'Upgrade {{name}}?',
415
447
  planUpgrade: 'Will be upgraded',
@@ -796,6 +828,27 @@ export const messages = {
796
828
  people_other: '{{count}} জন',
797
829
  switch: 'যান',
798
830
  switchTo: '{{name}}-এ যান',
831
+ identity: 'পরিচিতি',
832
+ identityHint: 'প্রতিষ্ঠানের নাম ও তার হিসাবের মুদ্রা। লেনদেন হয়ে গেলে মুদ্রা আর বদলানো যায় না।',
833
+ namePlaceholder: 'যেমন: পদ্মা ট্রেডার্স লিমিটেড',
834
+ currencyHint: 'এর হিসাবের খাতা, মূল্য ও প্রতিবেদন এই মুদ্রায় হবে।',
835
+ brandHint: 'এই প্রতিষ্ঠানে যাঁরা কাজ করেন, তাঁদের সবার জন্য ব্যাক-অফিসের রং। খালি রাখলে ডিফল্ট রং।',
836
+ address: 'ঠিকানা',
837
+ addressHint: 'এর চালান, অর্ডার ও চিঠিতে ছাপা হয় এবং গ্রাহক পোর্টালে দেখা যায়।',
838
+ contact: 'যোগাযোগ',
839
+ contactHint: 'গ্রাহক ও সরবরাহকারীরা যেভাবে যোগাযোগ করবেন; এর নথি ও ইমেইলে থাকে।',
840
+ registration: 'নিবন্ধন ও কর',
841
+ registrationHint: 'কর্তৃপক্ষের কাছে এর শনাক্তকরণ নম্বর, কর চালান ও রিটার্নে থাকে। এখন বা পরে সেটিংস › প্রতিষ্ঠান থেকে পূরণ করুন।',
842
+ more: 'আরও',
843
+ moreHint: 'ইনস্টল করা অ্যাপগুলো প্রতিষ্ঠানের কাছে যা জানতে চায়। এখানকার সবকিছু পরে সেটিংস › প্রতিষ্ঠান থেকে বদলানো যায়।',
844
+ whatHappens: 'তৈরি করলে প্রতিটি ইনস্টল করা অ্যাপের যা দরকার — জার্নাল, কর, ক্রম, ডিফল্ট — সব প্রস্তুত হয় এবং অ্যাডমিনিস্ট্রেটররা সাথে সাথে প্রবেশাধিকার পান। অন্যদের প্রবেশাধিকার দিন জনবল অংশে।',
845
+ readyTitle: '{{name}} প্রস্তুত',
846
+ readyHint: 'এর অ্যাপগুলো প্রস্তুত। কাজ শুরু করতে এতে যান।',
847
+ created: '{{name}} তৈরি হয়েছে।',
848
+ setUp: 'এর জন্য যা প্রস্তুত হলো',
849
+ nextSteps: 'এরপর: জনবল অংশে এর লোকজনকে আমন্ত্রণ জানান, তারপর এর অ্যাপ সেটিংস দেখে নিন।',
850
+ switchNow: 'এখনই এতে যান',
851
+ close: 'বন্ধ করুন',
799
852
  },
800
853
  apiKeys: {
801
854
  title: 'এপিআই কী',
@@ -849,6 +902,17 @@ export const messages = {
849
902
  enable: 'সক্রিয় করুন',
850
903
  disable: 'নিষ্ক্রিয় করুন',
851
904
  upgrade: 'আপগ্রেড করুন',
905
+ uninstall: 'আনইনস্টল',
906
+ doneUninstalled: '{{name}} তার ডেটাসহ মুছে ফেলা হয়েছে',
907
+ planTitleUninstall: '{{name}} আনইনস্টল করে এর ডেটা মুছবেন?',
908
+ planUninstall: 'ডেটাসহ মুছে ফেলা হবে',
909
+ planDrops: 'যা মুছে যাবে',
910
+ planDropWhat: 'টেবিল বা কলাম',
911
+ planDropRows: 'সারি',
912
+ planRemovesData: 'এতে অ্যাপের ডেটা চিরতরে মুছে যায়। একটি স্ন্যাপশট ৩০ দিন রাখা হয়। ডেটা রাখতে চাইলে বরং অ্যাপটি নিষ্ক্রিয় করুন।',
913
+ typeName: 'নিশ্চিত করতে {{name}} লিখুন',
914
+ authCode: 'অথেনটিকেটর অ্যাপের কোড',
915
+ confirmUninstall: 'ডেটা মুছে ফেলুন',
852
916
  installedVersion: 'ইনস্টল করা {{version}}',
853
917
  planTitleUpgrade: '{{name}} আপগ্রেড করবেন?',
854
918
  planUpgrade: 'যা আপগ্রেড হবে',
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: d701965c73f7d521
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 8ba09e2d214cd58d
2
2
  // Bindings of module `sign`: 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';
@@ -1,4 +1,4 @@
1
- // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: d701965c73f7d521
1
+ // GENERATED by `pnpm generate:models` (Shutro’s generator). Do not edit. definitions-hash: 8ba09e2d214cd58d
2
2
  // Schema view of module `sign` (RFC 0002 §7.7): the models it owns or depends on, with the extensions it can see.
3
3
  import type { F } from '../../server/orm.js';
4
4
 
@@ -770,6 +770,7 @@ export interface ResPartner {
770
770
  readonly parent: F.Many2one<'res.partner'>;
771
771
  readonly contacts: F.One2many<'res.partner', { readonly required: true }>;
772
772
  readonly email: F.Char;
773
+ readonly lang: F.Selection<'en' | 'bn'>;
773
774
  readonly phone: F.Char;
774
775
  readonly mobile: F.Char;
775
776
  readonly website: F.Char;
@@ -0,0 +1,2 @@
1
+ /** Bangla for the module's labels, keyed by their English text (RFC 0023 §3.1; `pnpm i18n:extract`). */
2
+ export declare const bn: Readonly<Record<string, string>>;
@@ -0,0 +1,97 @@
1
+ /** Bangla for the module's labels, keyed by their English text (RFC 0023 §3.1; `pnpm i18n:extract`). */
2
+ export const bn = {
3
+ 'A field is on a page, inside it.': 'ফিল্ড একটি পাতার উপর, তার ভিতরে থাকে।',
4
+ 'A request is out for signature once sent, and signed when the last signer is done, which seals the PDF.': 'পাঠানোর পর অনুরোধটি স্বাক্ষরের জন্য পাঠানো অবস্থায় থাকে, আর শেষ স্বাক্ষরকারী স্বাক্ষর করলে এটি স্বাক্ষরিত হয় এবং PDF সিল করা হয়।',
5
+ 'A signer has an email address.': 'স্বাক্ষরকারীর একটি ইমেইল ঠিকানা থাকতে হবে।',
6
+ Active: 'সক্রিয়',
7
+ Asked: 'অনুরোধ করা হয়েছে',
8
+ 'Asked at': 'অনুরোধের সময়',
9
+ Browser: 'ব্রাউজার',
10
+ Cancel: 'বাতিল করুন',
11
+ 'Cancel this request? Its links stop working.': 'এই অনুরোধ বাতিল করবেন? এর লিংকগুলো আর কাজ করবে না।',
12
+ Cancelled: 'বাতিল',
13
+ Checkbox: 'চেকবক্স',
14
+ 'Code (hash)': 'কোড (হ্যাশ)',
15
+ 'Code Attempts': 'কোডের চেষ্টা',
16
+ 'Code expires': 'কোডের মেয়াদ শেষ',
17
+ Company: 'প্রতিষ্ঠান',
18
+ Completed: 'সম্পন্ন',
19
+ 'Completed at': 'সম্পন্নের সময়',
20
+ 'Created At': 'তৈরির সময়',
21
+ 'Created By': 'তৈরি করেছেন',
22
+ 'Date signed': 'স্বাক্ষরের তারিখ',
23
+ Description: 'বিবরণ',
24
+ 'Display Name': 'প্রদর্শিত নাম',
25
+ Document: 'নথি',
26
+ Draft: 'খসড়া',
27
+ 'Each signer gets a link of their own and confirms with a code sent to their email; in order, the next is asked once the one before has signed.': 'প্রত্যেক স্বাক্ষরকারী নিজস্ব লিংক পান এবং ইমেইলে পাঠানো কোড দিয়ে নিশ্চিত করেন; ক্রমানুসারে হলে আগের জন স্বাক্ষর করার পর পরের জনকে অনুরোধ করা হয়।',
28
+ Email: 'ইমেইল',
29
+ Fields: 'ফিল্ড',
30
+ 'For (model)': 'যার জন্য (মডেল)',
31
+ 'For (record)': 'যার জন্য (রেকর্ড)',
32
+ 'Hash after': 'পরের হ্যাশ',
33
+ 'Hash before': 'আগের হ্যাশ',
34
+ Height: 'উচ্চতা',
35
+ ID: 'আইডি',
36
+ 'In order': 'ক্রমানুসারে',
37
+ Initials: 'আদ্যক্ষর',
38
+ 'IP address': 'আইপি ঠিকানা',
39
+ Kind: 'ধরন',
40
+ Label: 'লেবেল',
41
+ 'Link (hash)': 'লিংক (হ্যাশ)',
42
+ 'Manager (templates)': 'ব্যবস্থাপক (টেমপ্লেট)',
43
+ Message: 'বার্তা',
44
+ Name: 'নাম',
45
+ 'Out for signature': 'স্বাক্ষরের জন্য পাঠানো',
46
+ Overview: 'সারসংক্ষেপ',
47
+ Page: 'পাতা',
48
+ 'Page {{page}} of {{pages}}': 'পৃষ্ঠা {{page}} / {{pages}}',
49
+ Pages: 'পাতা',
50
+ Partner: 'অংশীদার',
51
+ PDF: 'PDF',
52
+ Productivity: 'উৎপাদনশীলতা',
53
+ Refused: 'নামঞ্জুর',
54
+ 'Refused because': 'নামঞ্জুরের কারণ',
55
+ Request: 'অনুরোধ',
56
+ Requests: 'অনুরোধ',
57
+ 'Requests by state': 'অবস্থা অনুযায়ী অনুরোধ',
58
+ 'Requests by template': 'টেমপ্লেট অনুযায়ী অনুরোধ',
59
+ Required: 'আবশ্যক',
60
+ Role: 'ভূমিকা',
61
+ 'Send for signature': 'স্বাক্ষরের জন্য পাঠান',
62
+ Sent: 'পাঠানো',
63
+ Sequence: 'ক্রম',
64
+ Sign: 'স্বাক্ষর',
65
+ 'Sign manager': 'স্বাক্ষর ব্যবস্থাপক',
66
+ 'Sign user': 'স্বাক্ষর ব্যবহারকারী',
67
+ Signature: 'স্বাক্ষর',
68
+ 'Signature request': 'স্বাক্ষরের অনুরোধ',
69
+ 'Signatures in order or all at once, one-time codes, a sealed PDF with its certificate': 'ক্রমানুসারে বা একসাথে স্বাক্ষর, এককালীন কোড, সনদসহ সিলমোহরকৃত PDF',
70
+ Signed: 'স্বাক্ষরিত',
71
+ 'Signed at': 'স্বাক্ষরের সময়',
72
+ 'Signed by everyone': 'সবাই স্বাক্ষর করেছেন',
73
+ 'Signed PDF': 'স্বাক্ষরিত PDF',
74
+ Signer: 'স্বাক্ষরকারী',
75
+ Signers: 'স্বাক্ষরকারীরা',
76
+ 'Signers in order': 'ক্রমানুসারে স্বাক্ষরকারী',
77
+ 'Signing field': 'স্বাক্ষরের ফিল্ড',
78
+ 'Signing request': 'স্বাক্ষরের অনুরোধ',
79
+ 'Signing template': 'স্বাক্ষরের টেমপ্লেট',
80
+ State: 'অবস্থা',
81
+ Status: 'অবস্থা',
82
+ Template: 'টেমপ্লেট',
83
+ Templates: 'টেমপ্লেট',
84
+ Text: 'লেখা',
85
+ 'Updated At': 'হালনাগাদের সময়',
86
+ 'Updated By': 'হালনাগাদ করেছেন',
87
+ 'Upload the PDF, then place each field: its page, and where it starts and how big it is as fractions of the page.': 'PDF আপলোড করুন, তারপর প্রতিটি ফিল্ড বসান: তার পাতা, আর পাতার ভগ্নাংশ হিসেবে কোথা থেকে শুরু ও কত বড়।',
88
+ 'User (send requests)': 'ব্যবহারকারী (অনুরোধ পাঠান)',
89
+ Values: 'মান',
90
+ Waiting: 'অপেক্ষমাণ',
91
+ 'Waiting for the signers before them, asked once their link is sent, then signed or refused.': 'আগের স্বাক্ষরকারীদের জন্য অপেক্ষমাণ, লিংক পাঠানো হলে অনুরোধ করা হয়েছে, তারপর স্বাক্ষরিত বা নামঞ্জুর।',
92
+ 'What the signer fills in here: a signature, initials, the date signed, a text or a checkbox.': 'স্বাক্ষরকারী এখানে কী পূরণ করবেন: স্বাক্ষর, আদ্যক্ষর, স্বাক্ষরের তারিখ, লেখা বা চেকবক্স।',
93
+ 'Why it was refused': 'কেন নামঞ্জুর করা হয়েছে',
94
+ Width: 'প্রস্থ',
95
+ X: 'X',
96
+ Y: 'Y',
97
+ };
@@ -1,3 +1,18 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * `shutro-erp/sign` (RFC 0024 §2.8): the **Sign** app. Templates (a PDF with fields per signer's role), requests from a
4
+ * template — from any record — with signers in order or all at once, each by email link and a one-time code, signing
5
+ * in the browser (a phone too), and the PDF sealed with the signatures and a certificate page, stored in Documents
6
+ * and on the record. pdf-lib (MIT, no native code) stamps and seals.
7
+ *
8
+ * - `POST /api/v1/sign/templates/:id/pdf` the raw body is the template's PDF (managers)
9
+ * - `POST /api/v1/sign/requests` `{ template, model?, id?, ordered?, signers: [{ role, name, email }] }`
10
+ * - `GET /api/v1/public/sign/:token` the signing page
11
+ * - `GET /api/v1/public/sign/:token/pdf` the PDF to sign
12
+ * - `POST /api/v1/public/sign/:token/code` a one-time code by email
13
+ * - `POST /api/v1/public/sign/:token/sign` `{ code, values: { <field id>: text | true | PNG data URL } }`
14
+ * - `POST /api/v1/public/sign/:token/refuse` `{ code, reason }`
15
+ */
1
16
  import { type Mailer } from '../mail/index.js';
2
17
  import { defineModule } from '../modules-sdk/index.js';
3
18
  export { SignRequest, SignSigner, SignTemplate, SignTemplateField, signShutro } from './module.js';
@@ -19,6 +19,7 @@ import { documents } from '../documents/index.js';
19
19
  import { mailerFromEnv } from '../mail/index.js';
20
20
  import { messaging } from '../messaging/index.js';
21
21
  import { defineModule } from '../modules-sdk/index.js';
22
+ import { reporting } from '../reporting/index.js';
22
23
  import { HttpProblem } from '../server/index.js';
23
24
  import { storageOf } from '../storage/index.js';
24
25
  import { action, form, list, search } from '../views/index.js';
@@ -218,7 +219,7 @@ export function signModule(options = {}) {
218
219
  return defineModule({
219
220
  shutro: signShutro,
220
221
  kosh: '^0.1.0',
221
- depends: [contacts, messaging, documents],
222
+ depends: [contacts, messaging, documents, reporting],
222
223
  app: {
223
224
  code: 'sign',
224
225
  label: 'Sign',
@@ -227,6 +228,133 @@ export function signModule(options = {}) {
227
228
  category: 'Productivity',
228
229
  summary: 'Signatures in order or all at once, one-time codes, a sealed PDF with its certificate',
229
230
  },
231
+ documents: [
232
+ {
233
+ key: 'signature_request',
234
+ name: 'Signature request',
235
+ model: 'sign.request',
236
+ layout: {
237
+ paper: 'A4',
238
+ header: '{{company.name}}',
239
+ footer: 'Page {{page}} of {{pages}}',
240
+ blocks: [
241
+ { kind: 'heading', id: 'title', text: '{{name}}', level: 1 },
242
+ {
243
+ kind: 'fields',
244
+ id: 'request',
245
+ items: [
246
+ { label: 'Template', bind: 'template.name' },
247
+ { label: 'In order', bind: 'ordered' },
248
+ { label: 'Completed', bind: 'completedAt' },
249
+ { label: 'Status', bind: 'state' },
250
+ { label: 'Refused because', bind: 'refusal' },
251
+ ],
252
+ },
253
+ { kind: 'text', id: 'message', text: '{{message}}' },
254
+ {
255
+ kind: 'table',
256
+ id: 'signers',
257
+ bind: 'signers',
258
+ columns: [
259
+ { label: 'Role', bind: 'role' },
260
+ { label: 'Name', bind: 'name' },
261
+ { label: 'Email', bind: 'email' },
262
+ { label: 'Sent', bind: 'sentAt' },
263
+ { label: 'Signed', bind: 'signedAt' },
264
+ { label: 'Status', bind: 'state' },
265
+ ],
266
+ },
267
+ ],
268
+ },
269
+ },
270
+ ],
271
+ importTemplates: [
272
+ {
273
+ key: 'sign_template',
274
+ model: 'sign.template',
275
+ label: 'Signing template',
276
+ columns: [
277
+ { header: 'Name', field: 'name' },
278
+ { header: 'Pages', field: 'pages' },
279
+ { header: 'Description', field: 'description' },
280
+ ],
281
+ },
282
+ ],
283
+ standard: {
284
+ waive: [
285
+ {
286
+ rule: 'A1',
287
+ reason: 'Demo signature requests need a template made from an uploaded PDF, which the demo cannot ship; the app is tried with a document of your own.',
288
+ },
289
+ {
290
+ rule: 'I1',
291
+ model: 'sign.request',
292
+ reason: 'Sent from a template to its signers; a file cannot sign.',
293
+ },
294
+ ],
295
+ },
296
+ // Bangla for the labels it serves (RFC 0023 §3.1; `pnpm i18n:extract`).
297
+ i18n: { bn: () => import('./i18n/bn.js') },
298
+ overview: {
299
+ cards: [
300
+ {
301
+ id: 'out',
302
+ title: 'Out for signature',
303
+ kind: 'kpi',
304
+ model: 'sign.request',
305
+ measure: 'count',
306
+ filter: { state: 'sent' },
307
+ w: 3,
308
+ },
309
+ {
310
+ id: 'signed',
311
+ title: 'Signed',
312
+ kind: 'kpi',
313
+ model: 'sign.request',
314
+ measure: 'count',
315
+ filter: { state: 'signed' },
316
+ comparison: { field: 'completedAt', mode: 'previous' },
317
+ w: 3,
318
+ },
319
+ {
320
+ id: 'refused',
321
+ title: 'Refused',
322
+ kind: 'kpi',
323
+ model: 'sign.request',
324
+ measure: 'count',
325
+ filter: { state: 'refused' },
326
+ w: 3,
327
+ },
328
+ {
329
+ id: 'templates',
330
+ title: 'Templates',
331
+ kind: 'kpi',
332
+ model: 'sign.template',
333
+ measure: 'count',
334
+ w: 3,
335
+ },
336
+ {
337
+ id: 'by_state',
338
+ title: 'Requests by state',
339
+ kind: 'chart',
340
+ model: 'sign.request',
341
+ measure: 'count',
342
+ groupBy: 'state',
343
+ chart: 'pie',
344
+ w: 6,
345
+ },
346
+ {
347
+ id: 'by_template',
348
+ title: 'Requests by template',
349
+ kind: 'chart',
350
+ model: 'sign.request',
351
+ measure: 'count',
352
+ groupBy: 'template',
353
+ chart: 'bar',
354
+ w: 6,
355
+ },
356
+ ],
357
+ },
230
358
  accessLevels: {
231
359
  user: { label: 'User (send requests)', groups: ['sign.user'] },
232
360
  manager: { label: 'Manager (templates)', groups: ['sign.manager'], implies: ['user'] },
@@ -2440,6 +2440,16 @@ export declare const signShutro: import("../server/orm.js").Module<readonly [imp
2440
2440
  readonly hasDefault: false;
2441
2441
  readonly readonly: false;
2442
2442
  }, string>;
2443
+ readonly lang: import("../server/orm.js").SelectionField<"bn" | "en", {
2444
+ readonly required: false;
2445
+ readonly computed: false;
2446
+ readonly inverse: false;
2447
+ readonly sequence: false;
2448
+ readonly computeName: undefined;
2449
+ readonly store: true;
2450
+ readonly hasDefault: false;
2451
+ readonly readonly: false;
2452
+ }>;
2443
2453
  readonly phone: import("../server/orm.js").CharField<{
2444
2454
  readonly required: false;
2445
2455
  readonly computed: false;
@@ -2661,6 +2671,16 @@ export declare const signShutro: import("../server/orm.js").Module<readonly [imp
2661
2671
  readonly hasDefault: false;
2662
2672
  readonly readonly: false;
2663
2673
  }, string>;
2674
+ readonly lang: import("../server/orm.js").SelectionField<"bn" | "en", {
2675
+ readonly required: false;
2676
+ readonly computed: false;
2677
+ readonly inverse: false;
2678
+ readonly sequence: false;
2679
+ readonly computeName: undefined;
2680
+ readonly store: true;
2681
+ readonly hasDefault: false;
2682
+ readonly readonly: false;
2683
+ }>;
2664
2684
  readonly phone: import("../server/orm.js").CharField<{
2665
2685
  readonly required: false;
2666
2686
  readonly computed: false;
@@ -4103,6 +4123,16 @@ export declare const signShutro: import("../server/orm.js").Module<readonly [imp
4103
4123
  readonly hasDefault: false;
4104
4124
  readonly readonly: false;
4105
4125
  }, string>;
4126
+ readonly lang: import("../server/orm.js").SelectionField<"bn" | "en", {
4127
+ readonly required: false;
4128
+ readonly computed: false;
4129
+ readonly inverse: false;
4130
+ readonly sequence: false;
4131
+ readonly computeName: undefined;
4132
+ readonly store: true;
4133
+ readonly hasDefault: false;
4134
+ readonly readonly: false;
4135
+ }>;
4106
4136
  readonly phone: import("../server/orm.js").CharField<{
4107
4137
  readonly required: false;
4108
4138
  readonly computed: false;
@@ -4324,6 +4354,16 @@ export declare const signShutro: import("../server/orm.js").Module<readonly [imp
4324
4354
  readonly hasDefault: false;
4325
4355
  readonly readonly: false;
4326
4356
  }, string>;
4357
+ readonly lang: import("../server/orm.js").SelectionField<"bn" | "en", {
4358
+ readonly required: false;
4359
+ readonly computed: false;
4360
+ readonly inverse: false;
4361
+ readonly sequence: false;
4362
+ readonly computeName: undefined;
4363
+ readonly store: true;
4364
+ readonly hasDefault: false;
4365
+ readonly readonly: false;
4366
+ }>;
4327
4367
  readonly phone: import("../server/orm.js").CharField<{
4328
4368
  readonly required: false;
4329
4369
  readonly computed: false;