shutro-erp 0.3.4 → 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/dist/account_asset/.kosh/bindings.d.ts +22 -0
  2. package/dist/account_asset/.kosh/bindings.js +15 -0
  3. package/dist/account_asset/.kosh/schema.d.ts +1755 -0
  4. package/dist/account_asset/board.d.ts +61 -0
  5. package/dist/account_asset/board.js +86 -0
  6. package/dist/account_asset/books.d.ts +42 -0
  7. package/dist/account_asset/books.js +398 -0
  8. package/dist/account_asset/demo.d.ts +7 -0
  9. package/dist/account_asset/demo.js +72 -0
  10. package/dist/account_asset/index.d.ts +9 -0
  11. package/dist/account_asset/index.js +335 -0
  12. package/dist/account_asset/module.d.ts +7622 -0
  13. package/dist/account_asset/module.js +230 -0
  14. package/dist/account_budget/.kosh/bindings.d.ts +22 -0
  15. package/dist/account_budget/.kosh/bindings.js +15 -0
  16. package/dist/account_budget/.kosh/schema.d.ts +1767 -0
  17. package/dist/account_budget/budget.d.ts +5 -0
  18. package/dist/account_budget/budget.js +142 -0
  19. package/dist/account_budget/demo.d.ts +6 -0
  20. package/dist/account_budget/demo.js +30 -0
  21. package/dist/account_budget/index.d.ts +4 -0
  22. package/dist/account_budget/index.js +223 -0
  23. package/dist/account_budget/module.d.ts +13863 -0
  24. package/dist/account_budget/module.js +167 -0
  25. package/dist/account_portal/.kosh/bindings.js +1 -1
  26. package/dist/account_portal/.kosh/schema.d.ts +176 -6
  27. package/dist/account_portal/module.d.ts +505 -6
  28. package/dist/accounting/.kosh/bindings.js +1 -1
  29. package/dist/accounting/.kosh/schema.d.ts +176 -6
  30. package/dist/accounting/index.d.ts +1 -1
  31. package/dist/accounting/index.js +344 -4
  32. package/dist/accounting/module.d.ts +513 -5
  33. package/dist/accounting/module.js +55 -3
  34. package/dist/approvals/.kosh/bindings.d.ts +22 -0
  35. package/dist/approvals/.kosh/bindings.js +15 -0
  36. package/dist/approvals/.kosh/schema.d.ts +611 -0
  37. package/dist/approvals/index.d.ts +18 -0
  38. package/dist/approvals/index.js +302 -0
  39. package/dist/approvals/mails.d.ts +25 -0
  40. package/dist/approvals/mails.js +82 -0
  41. package/dist/approvals/module.d.ts +1 -0
  42. package/dist/approvals/module.js +12 -0
  43. package/dist/approvals/web/History.d.ts +4 -0
  44. package/dist/approvals/web/History.js +13 -0
  45. package/dist/approvals/web/Inbox.d.ts +9 -0
  46. package/dist/approvals/web/Inbox.js +114 -0
  47. package/dist/approvals/web/Mine.d.ts +7 -0
  48. package/dist/approvals/web/Mine.js +27 -0
  49. package/dist/approvals/web/index.d.ts +13 -0
  50. package/dist/approvals/web/index.js +22 -0
  51. package/dist/approvals/web/messages.d.ts +2 -0
  52. package/dist/approvals/web/messages.js +119 -0
  53. package/dist/approvals/web/shared.d.ts +59 -0
  54. package/dist/approvals/web/shared.js +46 -0
  55. package/dist/attendance/.kosh/bindings.d.ts +22 -0
  56. package/dist/attendance/.kosh/bindings.js +15 -0
  57. package/dist/attendance/.kosh/schema.d.ts +1048 -0
  58. package/dist/attendance/days.d.ts +96 -0
  59. package/dist/attendance/days.js +430 -0
  60. package/dist/attendance/demo.d.ts +7 -0
  61. package/dist/attendance/demo.js +58 -0
  62. package/dist/attendance/index.d.ts +4 -0
  63. package/dist/attendance/index.js +513 -0
  64. package/dist/attendance/module.d.ts +3969 -0
  65. package/dist/attendance/module.js +412 -0
  66. package/dist/attendance/routes.d.ts +16 -0
  67. package/dist/attendance/routes.js +266 -0
  68. package/dist/attendance/web/Check.d.ts +8 -0
  69. package/dist/attendance/web/Check.js +40 -0
  70. package/dist/attendance/web/Kiosk.d.ts +8 -0
  71. package/dist/attendance/web/Kiosk.js +62 -0
  72. package/dist/attendance/web/PinButton.d.ts +7 -0
  73. package/dist/attendance/web/PinButton.js +29 -0
  74. package/dist/attendance/web/index.d.ts +13 -0
  75. package/dist/attendance/web/index.js +22 -0
  76. package/dist/attendance/web/messages.d.ts +2 -0
  77. package/dist/attendance/web/messages.js +61 -0
  78. package/dist/calendar/.kosh/bindings.d.ts +22 -0
  79. package/dist/calendar/.kosh/bindings.js +15 -0
  80. package/dist/calendar/.kosh/schema.d.ts +795 -0
  81. package/dist/calendar/demo.d.ts +6 -0
  82. package/dist/calendar/demo.js +24 -0
  83. package/dist/calendar/index.d.ts +3 -0
  84. package/dist/calendar/index.js +291 -0
  85. package/dist/calendar/module.d.ts +1705 -0
  86. package/dist/calendar/module.js +180 -0
  87. package/dist/cli/init.js +80 -0
  88. package/dist/cli/templates.d.ts +1 -1
  89. package/dist/cli/templates.js +226 -0
  90. package/dist/contacts/.kosh/bindings.js +1 -1
  91. package/dist/contacts/.kosh/schema.d.ts +78 -3
  92. package/dist/contacts/demo.js +30 -1
  93. package/dist/contacts/index.d.ts +1 -1
  94. package/dist/contacts/index.js +155 -9
  95. package/dist/contacts/module.d.ts +338 -2
  96. package/dist/contacts/module.js +93 -5
  97. package/dist/crm/.kosh/bindings.d.ts +22 -0
  98. package/dist/crm/.kosh/bindings.js +15 -0
  99. package/dist/crm/.kosh/schema.d.ts +800 -0
  100. package/dist/crm/demo.d.ts +6 -0
  101. package/dist/crm/demo.js +45 -0
  102. package/dist/crm/index.d.ts +3 -0
  103. package/dist/crm/index.js +361 -0
  104. package/dist/crm/module.d.ts +1845 -0
  105. package/dist/crm/module.js +208 -0
  106. package/dist/documents/.kosh/bindings.d.ts +22 -0
  107. package/dist/documents/.kosh/bindings.js +15 -0
  108. package/dist/documents/.kosh/schema.d.ts +862 -0
  109. package/dist/documents/demo.d.ts +6 -0
  110. package/dist/documents/demo.js +22 -0
  111. package/dist/documents/documents.d.ts +98 -0
  112. package/dist/documents/documents.js +318 -0
  113. package/dist/documents/index.d.ts +30 -0
  114. package/dist/documents/index.js +442 -0
  115. package/dist/documents/module.d.ts +2781 -0
  116. package/dist/documents/module.js +214 -0
  117. package/dist/documents/web/Versions.d.ts +7 -0
  118. package/dist/documents/web/Versions.js +45 -0
  119. package/dist/documents/web/index.d.ts +11 -0
  120. package/dist/documents/web/index.js +16 -0
  121. package/dist/documents/web/messages.d.ts +2 -0
  122. package/dist/documents/web/messages.js +21 -0
  123. package/dist/event/.kosh/bindings.d.ts +22 -0
  124. package/dist/event/.kosh/bindings.js +15 -0
  125. package/dist/event/.kosh/schema.d.ts +843 -0
  126. package/dist/event/demo.d.ts +6 -0
  127. package/dist/event/demo.js +65 -0
  128. package/dist/event/index.d.ts +14 -0
  129. package/dist/event/index.js +333 -0
  130. package/dist/event/mails.d.ts +15 -0
  131. package/dist/event/mails.js +112 -0
  132. package/dist/event/module.d.ts +2800 -0
  133. package/dist/event/module.js +323 -0
  134. package/dist/event/web/CheckInBox.d.ts +9 -0
  135. package/dist/event/web/CheckInBox.js +87 -0
  136. package/dist/event/web/index.d.ts +11 -0
  137. package/dist/event/web/index.js +16 -0
  138. package/dist/event/web/messages.d.ts +2 -0
  139. package/dist/event/web/messages.js +23 -0
  140. package/dist/event_account/.kosh/bindings.d.ts +22 -0
  141. package/dist/event_account/.kosh/bindings.js +15 -0
  142. package/dist/event_account/.kosh/schema.d.ts +1758 -0
  143. package/dist/event_account/index.d.ts +3 -0
  144. package/dist/event_account/index.js +28 -0
  145. package/dist/event_account/module.d.ts +7114 -0
  146. package/dist/event_account/module.js +90 -0
  147. package/dist/expense/.kosh/bindings.d.ts +22 -0
  148. package/dist/expense/.kosh/bindings.js +15 -0
  149. package/dist/expense/.kosh/schema.d.ts +1299 -0
  150. package/dist/expense/demo.d.ts +7 -0
  151. package/dist/expense/demo.js +69 -0
  152. package/dist/expense/index.d.ts +3 -0
  153. package/dist/expense/index.js +495 -0
  154. package/dist/expense/module.d.ts +4747 -0
  155. package/dist/expense/module.js +647 -0
  156. package/dist/expense_account/.kosh/bindings.d.ts +22 -0
  157. package/dist/expense_account/.kosh/bindings.js +15 -0
  158. package/dist/expense_account/.kosh/schema.d.ts +1936 -0
  159. package/dist/expense_account/index.d.ts +3 -0
  160. package/dist/expense_account/index.js +74 -0
  161. package/dist/expense_account/module.d.ts +9153 -0
  162. package/dist/expense_account/module.js +318 -0
  163. package/dist/helpdesk/.kosh/bindings.d.ts +22 -0
  164. package/dist/helpdesk/.kosh/bindings.js +15 -0
  165. package/dist/helpdesk/.kosh/schema.d.ts +885 -0
  166. package/dist/helpdesk/demo.d.ts +7 -0
  167. package/dist/helpdesk/demo.js +65 -0
  168. package/dist/helpdesk/hours.d.ts +17 -0
  169. package/dist/helpdesk/hours.js +94 -0
  170. package/dist/helpdesk/index.d.ts +10 -0
  171. package/dist/helpdesk/index.js +461 -0
  172. package/dist/helpdesk/module.d.ts +2940 -0
  173. package/dist/helpdesk/module.js +326 -0
  174. package/dist/helpdesk/routes.d.ts +12 -0
  175. package/dist/helpdesk/routes.js +132 -0
  176. package/dist/helpdesk/sla.d.ts +37 -0
  177. package/dist/helpdesk/sla.js +226 -0
  178. package/dist/hr/.kosh/bindings.d.ts +22 -0
  179. package/dist/hr/.kosh/bindings.js +15 -0
  180. package/dist/hr/.kosh/schema.d.ts +878 -0
  181. package/dist/hr/demo.d.ts +6 -0
  182. package/dist/hr/demo.js +60 -0
  183. package/dist/hr/index.d.ts +3 -0
  184. package/dist/hr/index.js +483 -0
  185. package/dist/hr/module.d.ts +2611 -0
  186. package/dist/hr/module.js +350 -0
  187. package/dist/l10n_bd/.kosh/bindings.js +1 -1
  188. package/dist/l10n_bd/.kosh/schema.d.ts +176 -6
  189. package/dist/l10n_bd/module.d.ts +505 -6
  190. package/dist/l10n_bd_payroll/.kosh/bindings.d.ts +22 -0
  191. package/dist/l10n_bd_payroll/.kosh/bindings.js +15 -0
  192. package/dist/l10n_bd_payroll/.kosh/schema.d.ts +2312 -0
  193. package/dist/l10n_bd_payroll/data.d.ts +47 -0
  194. package/dist/l10n_bd_payroll/data.js +347 -0
  195. package/dist/l10n_bd_payroll/index.d.ts +4 -0
  196. package/dist/l10n_bd_payroll/index.js +24 -0
  197. package/dist/l10n_bd_payroll/module.d.ts +12932 -0
  198. package/dist/l10n_bd_payroll/module.js +86 -0
  199. package/dist/l10n_in/.kosh/bindings.js +1 -1
  200. package/dist/l10n_in/.kosh/schema.d.ts +176 -6
  201. package/dist/l10n_in/module.d.ts +527 -7
  202. package/dist/mail/inbound/handle.js +6 -1
  203. package/dist/maintenance/.kosh/bindings.d.ts +22 -0
  204. package/dist/maintenance/.kosh/bindings.js +15 -0
  205. package/dist/maintenance/.kosh/schema.d.ts +911 -0
  206. package/dist/maintenance/demo.d.ts +6 -0
  207. package/dist/maintenance/demo.js +60 -0
  208. package/dist/maintenance/index.d.ts +3 -0
  209. package/dist/maintenance/index.js +422 -0
  210. package/dist/maintenance/module.d.ts +3545 -0
  211. package/dist/maintenance/module.js +446 -0
  212. package/dist/maintenance_stock/.kosh/bindings.d.ts +22 -0
  213. package/dist/maintenance_stock/.kosh/bindings.js +15 -0
  214. package/dist/maintenance_stock/.kosh/schema.d.ts +1446 -0
  215. package/dist/maintenance_stock/index.d.ts +9 -0
  216. package/dist/maintenance_stock/index.js +52 -0
  217. package/dist/maintenance_stock/module.d.ts +7675 -0
  218. package/dist/maintenance_stock/module.js +192 -0
  219. package/dist/modules-sdk/index.d.ts +1 -1
  220. package/dist/modules-sdk/manifest.d.ts +109 -2
  221. package/dist/modules-sdk/manifest.js +35 -1
  222. package/dist/mrp/.kosh/bindings.d.ts +22 -0
  223. package/dist/mrp/.kosh/bindings.js +15 -0
  224. package/dist/mrp/.kosh/schema.d.ts +1453 -0
  225. package/dist/mrp/demo.d.ts +7 -0
  226. package/dist/mrp/demo.js +42 -0
  227. package/dist/mrp/index.d.ts +3 -0
  228. package/dist/mrp/index.js +393 -0
  229. package/dist/mrp/module.d.ts +9335 -0
  230. package/dist/mrp/module.js +757 -0
  231. package/dist/mrp_account/.kosh/bindings.d.ts +22 -0
  232. package/dist/mrp_account/.kosh/bindings.js +15 -0
  233. package/dist/mrp_account/.kosh/schema.d.ts +2299 -0
  234. package/dist/mrp_account/index.d.ts +3 -0
  235. package/dist/mrp_account/index.js +22 -0
  236. package/dist/mrp_account/module.d.ts +23151 -0
  237. package/dist/mrp_account/module.js +123 -0
  238. package/dist/payment/.kosh/bindings.js +1 -1
  239. package/dist/payment/.kosh/schema.d.ts +178 -7
  240. package/dist/payment/index.d.ts +41 -0
  241. package/dist/payment/index.js +131 -74
  242. package/dist/payment/module.d.ts +569 -12
  243. package/dist/payment/module.js +19 -3
  244. package/dist/payment/settle.js +10 -1
  245. package/dist/payroll/.kosh/bindings.d.ts +22 -0
  246. package/dist/payroll/.kosh/bindings.js +15 -0
  247. package/dist/payroll/.kosh/schema.d.ts +1390 -0
  248. package/dist/payroll/compute.d.ts +35 -0
  249. package/dist/payroll/compute.js +398 -0
  250. package/dist/payroll/demo.d.ts +55 -0
  251. package/dist/payroll/demo.js +121 -0
  252. package/dist/payroll/formula.d.ts +62 -0
  253. package/dist/payroll/formula.js +320 -0
  254. package/dist/payroll/index.d.ts +230 -0
  255. package/dist/payroll/index.js +713 -0
  256. package/dist/payroll/module.d.ts +9390 -0
  257. package/dist/payroll/module.js +606 -0
  258. package/dist/payroll/routes.d.ts +10 -0
  259. package/dist/payroll/routes.js +112 -0
  260. package/dist/payroll_account/.kosh/bindings.d.ts +22 -0
  261. package/dist/payroll_account/.kosh/bindings.js +15 -0
  262. package/dist/payroll_account/.kosh/schema.d.ts +2308 -0
  263. package/dist/payroll_account/index.d.ts +3 -0
  264. package/dist/payroll_account/index.js +40 -0
  265. package/dist/payroll_account/module.d.ts +12396 -0
  266. package/dist/payroll_account/module.js +256 -0
  267. package/dist/permissions/approvals.d.ts +131 -9
  268. package/dist/permissions/approvals.js +662 -57
  269. package/dist/permissions/index.d.ts +1 -1
  270. package/dist/permissions/index.js +2 -2
  271. package/dist/permissions/models.js +191 -12
  272. package/dist/permissions/routes.d.ts +6 -1
  273. package/dist/permissions/routes.js +37 -4
  274. package/dist/permissions/web/ApprovalPanel.d.ts +5 -4
  275. package/dist/permissions/web/ApprovalPanel.js +39 -13
  276. package/dist/permissions/web/index.d.ts +6 -4
  277. package/dist/permissions/web/index.js +13 -4
  278. package/dist/permissions/web/messages.d.ts +2 -0
  279. package/dist/permissions/web/messages.js +43 -0
  280. package/dist/portal/.kosh/bindings.js +1 -1
  281. package/dist/portal/.kosh/schema.d.ts +78 -3
  282. package/dist/portal/index.js +1 -1
  283. package/dist/portal/module.d.ts +166 -2
  284. package/dist/pos/.kosh/bindings.d.ts +22 -0
  285. package/dist/pos/.kosh/bindings.js +15 -0
  286. package/dist/pos/.kosh/schema.d.ts +1809 -0
  287. package/dist/pos/accounting.d.ts +10 -0
  288. package/dist/pos/accounting.js +149 -0
  289. package/dist/pos/demo.d.ts +6 -0
  290. package/dist/pos/demo.js +90 -0
  291. package/dist/pos/index.d.ts +9 -0
  292. package/dist/pos/index.js +353 -0
  293. package/dist/pos/module.d.ts +9783 -0
  294. package/dist/pos/module.js +423 -0
  295. package/dist/pos/routes.d.ts +39 -0
  296. package/dist/pos/routes.js +368 -0
  297. package/dist/pos/web/Register.d.ts +9 -0
  298. package/dist/pos/web/Register.js +252 -0
  299. package/dist/pos/web/index.d.ts +11 -0
  300. package/dist/pos/web/index.js +16 -0
  301. package/dist/pos/web/messages.d.ts +2 -0
  302. package/dist/pos/web/messages.js +87 -0
  303. package/dist/pos_stock/.kosh/bindings.d.ts +22 -0
  304. package/dist/pos_stock/.kosh/bindings.js +15 -0
  305. package/dist/pos_stock/.kosh/schema.d.ts +2208 -0
  306. package/dist/pos_stock/index.d.ts +9 -0
  307. package/dist/pos_stock/index.js +35 -0
  308. package/dist/pos_stock/module.d.ts +12803 -0
  309. package/dist/pos_stock/module.js +115 -0
  310. package/dist/product/.kosh/bindings.js +1 -1
  311. package/dist/product/.kosh/schema.d.ts +52 -1
  312. package/dist/product/index.js +94 -4
  313. package/dist/product/module.d.ts +45 -1
  314. package/dist/product/module.js +11 -3
  315. package/dist/project/.kosh/bindings.js +1 -1
  316. package/dist/project/.kosh/schema.d.ts +725 -3
  317. package/dist/project/index.d.ts +3 -1
  318. package/dist/project/index.js +1045 -18
  319. package/dist/project/module.d.ts +10168 -458
  320. package/dist/project/module.js +1578 -14
  321. package/dist/project/routes.d.ts +44 -0
  322. package/dist/project/routes.js +314 -0
  323. package/dist/project/schedule.d.ts +72 -0
  324. package/dist/project/schedule.js +192 -0
  325. package/dist/project/web/Refresh.d.ts +8 -0
  326. package/dist/project/web/Refresh.js +29 -0
  327. package/dist/project/web/Schedule.d.ts +9 -0
  328. package/dist/project/web/Schedule.js +93 -0
  329. package/dist/project/web/Structure.d.ts +8 -0
  330. package/dist/project/web/Structure.js +86 -0
  331. package/dist/project/web/Workload.d.ts +8 -0
  332. package/dist/project/web/Workload.js +43 -0
  333. package/dist/project/web/index.d.ts +14 -0
  334. package/dist/project/web/index.js +25 -0
  335. package/dist/project/web/messages.d.ts +2 -0
  336. package/dist/project/web/messages.js +85 -0
  337. package/dist/project_account/.kosh/bindings.d.ts +22 -0
  338. package/dist/project_account/.kosh/bindings.js +15 -0
  339. package/dist/project_account/.kosh/schema.d.ts +2241 -0
  340. package/dist/project_account/index.d.ts +3 -0
  341. package/dist/project_account/index.js +27 -0
  342. package/dist/project_account/module.d.ts +11539 -0
  343. package/dist/project_account/module.js +76 -0
  344. package/dist/project_portal/.kosh/bindings.js +1 -1
  345. package/dist/project_portal/.kosh/schema.d.ts +725 -3
  346. package/dist/project_portal/module.d.ts +5137 -119
  347. package/dist/project_purchase/.kosh/bindings.d.ts +22 -0
  348. package/dist/project_purchase/.kosh/bindings.js +15 -0
  349. package/dist/project_purchase/.kosh/schema.d.ts +2320 -0
  350. package/dist/project_purchase/index.d.ts +9 -0
  351. package/dist/project_purchase/index.js +22 -0
  352. package/dist/project_purchase/module.d.ts +25147 -0
  353. package/dist/project_purchase/module.js +56 -0
  354. package/dist/purchase/.kosh/bindings.js +1 -1
  355. package/dist/purchase/.kosh/schema.d.ts +150 -6
  356. package/dist/purchase/index.js +163 -3
  357. package/dist/purchase/module.d.ts +228 -5
  358. package/dist/purchase/module.js +30 -3
  359. package/dist/purchase_account/.kosh/bindings.js +1 -1
  360. package/dist/purchase_account/.kosh/schema.d.ts +180 -8
  361. package/dist/purchase_account/index.js +27 -1
  362. package/dist/purchase_account/module.d.ts +591 -30
  363. package/dist/purchase_account/module.js +13 -2
  364. package/dist/purchase_portal/.kosh/bindings.js +1 -1
  365. package/dist/purchase_portal/.kosh/schema.d.ts +150 -6
  366. package/dist/purchase_portal/module.d.ts +372 -6
  367. package/dist/purchase_stock/.kosh/bindings.d.ts +22 -0
  368. package/dist/purchase_stock/.kosh/bindings.js +15 -0
  369. package/dist/purchase_stock/.kosh/schema.d.ts +1479 -0
  370. package/dist/purchase_stock/index.d.ts +7 -0
  371. package/dist/purchase_stock/index.js +98 -0
  372. package/dist/purchase_stock/module.d.ts +7535 -0
  373. package/dist/purchase_stock/module.js +380 -0
  374. package/dist/purchase_stock_account/.kosh/bindings.d.ts +22 -0
  375. package/dist/purchase_stock_account/.kosh/bindings.js +15 -0
  376. package/dist/purchase_stock_account/.kosh/schema.d.ts +2155 -0
  377. package/dist/purchase_stock_account/index.d.ts +3 -0
  378. package/dist/purchase_stock_account/index.js +24 -0
  379. package/dist/purchase_stock_account/module.d.ts +38015 -0
  380. package/dist/purchase_stock_account/module.js +168 -0
  381. package/dist/recruitment/.kosh/bindings.d.ts +22 -0
  382. package/dist/recruitment/.kosh/bindings.js +15 -0
  383. package/dist/recruitment/.kosh/schema.d.ts +991 -0
  384. package/dist/recruitment/demo.d.ts +6 -0
  385. package/dist/recruitment/demo.js +45 -0
  386. package/dist/recruitment/index.d.ts +3 -0
  387. package/dist/recruitment/index.js +385 -0
  388. package/dist/recruitment/module.d.ts +3249 -0
  389. package/dist/recruitment/module.js +194 -0
  390. package/dist/recruitment/web/HireButton.d.ts +9 -0
  391. package/dist/recruitment/web/HireButton.js +32 -0
  392. package/dist/recruitment/web/index.d.ts +11 -0
  393. package/dist/recruitment/web/index.js +16 -0
  394. package/dist/recruitment/web/messages.d.ts +2 -0
  395. package/dist/recruitment/web/messages.js +19 -0
  396. package/dist/reporting/documents.d.ts +5 -0
  397. package/dist/reporting/documents.js +28 -1
  398. package/dist/reporting/index.d.ts +1 -1
  399. package/dist/reporting/index.js +4 -2
  400. package/dist/reporting/models.js +9 -0
  401. package/dist/reporting/overviews.d.ts +16 -0
  402. package/dist/reporting/overviews.js +56 -0
  403. package/dist/reporting/routes-documents.js +1 -1
  404. package/dist/reporting/routes.js +138 -80
  405. package/dist/reporting/web/DashboardView.d.ts +11 -0
  406. package/dist/reporting/web/DashboardView.js +2 -2
  407. package/dist/reporting/web/DesignerView.js +5 -0
  408. package/dist/reporting/web/Overview.d.ts +9 -0
  409. package/dist/reporting/web/Overview.js +53 -0
  410. package/dist/reporting/web/index.d.ts +1 -0
  411. package/dist/reporting/web/index.js +4 -1
  412. package/dist/reporting/web/messages.js +9 -0
  413. package/dist/sale_account/.kosh/bindings.js +1 -1
  414. package/dist/sale_account/.kosh/schema.d.ts +181 -6
  415. package/dist/sale_account/index.js +22 -1
  416. package/dist/sale_account/module.d.ts +639 -38
  417. package/dist/sale_portal/.kosh/bindings.js +1 -1
  418. package/dist/sale_portal/.kosh/schema.d.ts +59 -3
  419. package/dist/sale_portal/module.d.ts +435 -5
  420. package/dist/sale_project/.kosh/bindings.js +1 -1
  421. package/dist/sale_project/.kosh/schema.d.ts +732 -3
  422. package/dist/sale_project/module.d.ts +5349 -208
  423. package/dist/sale_project/module.js +17 -1
  424. package/dist/sale_stock/.kosh/bindings.d.ts +22 -0
  425. package/dist/sale_stock/.kosh/bindings.js +15 -0
  426. package/dist/sale_stock/.kosh/schema.d.ts +1303 -0
  427. package/dist/sale_stock/index.d.ts +7 -0
  428. package/dist/sale_stock/index.js +84 -0
  429. package/dist/sale_stock/module.d.ts +7514 -0
  430. package/dist/sale_stock/module.js +146 -0
  431. package/dist/sales/.kosh/bindings.js +1 -1
  432. package/dist/sales/.kosh/schema.d.ts +59 -3
  433. package/dist/sales/index.js +195 -4
  434. package/dist/sales/module.d.ts +356 -3
  435. package/dist/sales/module.js +78 -3
  436. package/dist/server/api/metadata.d.ts +5 -0
  437. package/dist/server/api/metadata.js +5 -0
  438. package/dist/server/api/rest.js +64 -1
  439. package/dist/server/api/views.js +1 -0
  440. package/dist/server/app-settings.d.ts +7 -0
  441. package/dist/server/app-settings.js +10 -0
  442. package/dist/server/auth/base.js +9 -0
  443. package/dist/server/index.d.ts +1 -0
  444. package/dist/server/index.js +1 -0
  445. package/dist/settings/app-settings.d.ts +2 -0
  446. package/dist/settings/app-settings.js +518 -0
  447. package/dist/settings/index.d.ts +1 -0
  448. package/dist/settings/index.js +15 -0
  449. package/dist/settings/people.js +29 -5
  450. package/dist/settings/web/AppSettingsPage.d.ts +11 -0
  451. package/dist/settings/web/AppSettingsPage.js +210 -0
  452. package/dist/settings/web/OverviewPage.js +16 -3
  453. package/dist/settings/web/PeoplePage.js +20 -6
  454. package/dist/settings/web/index.d.ts +1 -0
  455. package/dist/settings/web/index.js +3 -0
  456. package/dist/settings/web/messages.js +118 -2
  457. package/dist/sign/.kosh/bindings.d.ts +22 -0
  458. package/dist/sign/.kosh/bindings.js +15 -0
  459. package/dist/sign/.kosh/schema.d.ts +990 -0
  460. package/dist/sign/index.d.ts +14 -0
  461. package/dist/sign/index.js +350 -0
  462. package/dist/sign/module.d.ts +4478 -0
  463. package/dist/sign/module.js +158 -0
  464. package/dist/sign/sign.d.ts +82 -0
  465. package/dist/sign/sign.js +474 -0
  466. package/dist/stock/.kosh/bindings.d.ts +22 -0
  467. package/dist/stock/.kosh/bindings.js +15 -0
  468. package/dist/stock/.kosh/schema.d.ts +1222 -0
  469. package/dist/stock/demo.d.ts +8 -0
  470. package/dist/stock/demo.js +82 -0
  471. package/dist/stock/index.d.ts +4 -0
  472. package/dist/stock/index.js +903 -0
  473. package/dist/stock/module.d.ts +7856 -0
  474. package/dist/stock/module.js +1880 -0
  475. package/dist/stock/replenish.d.ts +38 -0
  476. package/dist/stock/replenish.js +176 -0
  477. package/dist/stock/web/Replenishment.d.ts +8 -0
  478. package/dist/stock/web/Replenishment.js +84 -0
  479. package/dist/stock/web/ScanBox.d.ts +8 -0
  480. package/dist/stock/web/ScanBox.js +90 -0
  481. package/dist/stock/web/index.d.ts +13 -0
  482. package/dist/stock/web/index.js +20 -0
  483. package/dist/stock/web/messages.d.ts +2 -0
  484. package/dist/stock/web/messages.js +77 -0
  485. package/dist/stock_account/.kosh/bindings.d.ts +22 -0
  486. package/dist/stock_account/.kosh/bindings.js +15 -0
  487. package/dist/stock_account/.kosh/schema.d.ts +2068 -0
  488. package/dist/stock_account/index.d.ts +3 -0
  489. package/dist/stock_account/index.js +140 -0
  490. package/dist/stock_account/module.d.ts +11523 -0
  491. package/dist/stock_account/module.js +339 -0
  492. package/dist/storage/attachments.d.ts +5 -0
  493. package/dist/storage/attachments.js +12 -1
  494. package/dist/storage/models.js +3 -0
  495. package/dist/storage/routes.js +13 -2
  496. package/dist/todo/.kosh/bindings.d.ts +22 -0
  497. package/dist/todo/.kosh/bindings.js +15 -0
  498. package/dist/todo/.kosh/schema.d.ts +732 -0
  499. package/dist/todo/demo.d.ts +6 -0
  500. package/dist/todo/demo.js +35 -0
  501. package/dist/todo/index.d.ts +3 -0
  502. package/dist/todo/index.js +187 -0
  503. package/dist/todo/module.d.ts +1180 -0
  504. package/dist/todo/module.js +130 -0
  505. package/dist/trade_finance/.kosh/bindings.d.ts +22 -0
  506. package/dist/trade_finance/.kosh/bindings.js +15 -0
  507. package/dist/trade_finance/.kosh/schema.d.ts +884 -0
  508. package/dist/trade_finance/demo.d.ts +6 -0
  509. package/dist/trade_finance/demo.js +63 -0
  510. package/dist/trade_finance/index.d.ts +3 -0
  511. package/dist/trade_finance/index.js +415 -0
  512. package/dist/trade_finance/module.d.ts +3779 -0
  513. package/dist/trade_finance/module.js +507 -0
  514. package/dist/trade_finance_account/.kosh/bindings.d.ts +22 -0
  515. package/dist/trade_finance_account/.kosh/bindings.js +15 -0
  516. package/dist/trade_finance_account/.kosh/schema.d.ts +1830 -0
  517. package/dist/trade_finance_account/index.d.ts +3 -0
  518. package/dist/trade_finance_account/index.js +93 -0
  519. package/dist/trade_finance_account/module.d.ts +8074 -0
  520. package/dist/trade_finance_account/module.js +245 -0
  521. package/dist/trade_finance_purchase/.kosh/bindings.d.ts +22 -0
  522. package/dist/trade_finance_purchase/.kosh/bindings.js +15 -0
  523. package/dist/trade_finance_purchase/.kosh/schema.d.ts +1246 -0
  524. package/dist/trade_finance_purchase/index.d.ts +8 -0
  525. package/dist/trade_finance_purchase/index.js +50 -0
  526. package/dist/trade_finance_purchase/module.d.ts +4257 -0
  527. package/dist/trade_finance_purchase/module.js +44 -0
  528. package/dist/trade_finance_sale/.kosh/bindings.d.ts +22 -0
  529. package/dist/trade_finance_sale/.kosh/bindings.js +15 -0
  530. package/dist/trade_finance_sale/.kosh/schema.d.ts +1072 -0
  531. package/dist/trade_finance_sale/index.d.ts +8 -0
  532. package/dist/trade_finance_sale/index.js +50 -0
  533. package/dist/trade_finance_sale/module.d.ts +4281 -0
  534. package/dist/trade_finance_sale/module.js +44 -0
  535. package/dist/ui/api.d.ts +2 -1
  536. package/dist/ui/api.js +2 -1
  537. package/dist/ui/app.js +26 -13
  538. package/dist/ui/components/AppIcon.js +30 -1
  539. package/dist/ui/components/primitives.d.ts +2 -0
  540. package/dist/ui/components/primitives.js +7 -1
  541. package/dist/ui/i18n/messages.d.ts +27 -0
  542. package/dist/ui/i18n/messages.js +46 -0
  543. package/dist/ui/index.d.ts +1 -0
  544. package/dist/ui/index.js +1 -0
  545. package/dist/ui/offline/queue.d.ts +5 -1
  546. package/dist/ui/offline/queue.js +2 -0
  547. package/dist/ui/registry.d.ts +5 -0
  548. package/dist/ui/shell/Home.js +55 -4
  549. package/dist/ui/views/FormView.js +102 -19
  550. package/dist/ui/views/KanbanView.d.ts +2 -0
  551. package/dist/ui/views/KanbanView.js +40 -3
  552. package/dist/ui/views/ListView.js +110 -11
  553. package/dist/ui/views/StatsRow.d.ts +14 -0
  554. package/dist/ui/views/StatsRow.js +88 -0
  555. package/dist/ui/views/widgets.d.ts +2 -1
  556. package/dist/ui/views/widgets.js +200 -1
  557. package/dist/views/builders.d.ts +19 -2
  558. package/dist/views/builders.js +21 -1
  559. package/dist/views/condition.d.ts +6 -0
  560. package/dist/views/condition.js +20 -0
  561. package/dist/views/documents.d.ts +8 -0
  562. package/dist/views/extend.d.ts +2 -2
  563. package/dist/views/extend.js +11 -1
  564. package/dist/views/index.d.ts +2 -2
  565. package/dist/views/index.js +2 -2
  566. package/dist/views/types.d.ts +52 -5
  567. package/dist/views/validate.js +39 -1
  568. package/dist/website/.kosh/bindings.d.ts +22 -0
  569. package/dist/website/.kosh/bindings.js +15 -0
  570. package/dist/website/.kosh/schema.d.ts +881 -0
  571. package/dist/website/demo.d.ts +6 -0
  572. package/dist/website/demo.js +115 -0
  573. package/dist/website/index.d.ts +9 -0
  574. package/dist/website/index.js +251 -0
  575. package/dist/website/module.d.ts +2987 -0
  576. package/dist/website/module.js +282 -0
  577. package/dist/website/render.d.ts +45 -0
  578. package/dist/website/render.js +102 -0
  579. package/dist/website/routes.d.ts +12 -0
  580. package/dist/website/routes.js +246 -0
  581. package/dist/website/web/PagePreview.d.ts +7 -0
  582. package/dist/website/web/PagePreview.js +33 -0
  583. package/dist/website/web/index.d.ts +11 -0
  584. package/dist/website/web/index.js +16 -0
  585. package/dist/website/web/messages.d.ts +2 -0
  586. package/dist/website/web/messages.js +15 -0
  587. package/dist/website_crm/.kosh/bindings.d.ts +22 -0
  588. package/dist/website_crm/.kosh/bindings.js +15 -0
  589. package/dist/website_crm/.kosh/schema.d.ts +967 -0
  590. package/dist/website_crm/index.d.ts +3 -0
  591. package/dist/website_crm/index.js +39 -0
  592. package/dist/website_crm/module.d.ts +2956 -0
  593. package/dist/website_crm/module.js +44 -0
  594. package/dist/website_sale/.kosh/bindings.d.ts +22 -0
  595. package/dist/website_sale/.kosh/bindings.js +15 -0
  596. package/dist/website_sale/.kosh/schema.d.ts +2284 -0
  597. package/dist/website_sale/couriers.d.ts +50 -0
  598. package/dist/website_sale/couriers.js +59 -0
  599. package/dist/website_sale/demo.d.ts +7 -0
  600. package/dist/website_sale/demo.js +90 -0
  601. package/dist/website_sale/growth.d.ts +31 -0
  602. package/dist/website_sale/growth.js +163 -0
  603. package/dist/website_sale/index.d.ts +49 -0
  604. package/dist/website_sale/index.js +538 -0
  605. package/dist/website_sale/module.d.ts +22027 -0
  606. package/dist/website_sale/module.js +397 -0
  607. package/dist/website_sale/shipments.d.ts +16 -0
  608. package/dist/website_sale/shipments.js +113 -0
  609. package/dist/website_sale/shop.d.ts +81 -0
  610. package/dist/website_sale/shop.js +649 -0
  611. package/dist/website_sale_stock/.kosh/bindings.d.ts +22 -0
  612. package/dist/website_sale_stock/.kosh/bindings.js +15 -0
  613. package/dist/website_sale_stock/.kosh/schema.d.ts +2681 -0
  614. package/dist/website_sale_stock/index.d.ts +9 -0
  615. package/dist/website_sale_stock/index.js +20 -0
  616. package/dist/website_sale_stock/module.d.ts +24998 -0
  617. package/dist/website_sale_stock/module.js +28 -0
  618. package/package.json +200 -2
@@ -0,0 +1,50 @@
1
+ /** Where a parcel is, in the Shop's words. */
2
+ export type ParcelStatus = 'booked' | 'picked' | 'in_transit' | 'delivered' | 'returned' | 'cancelled';
3
+ export interface Parcel {
4
+ /** The shipment's reference on our side (`SHP/2026/00007`). */
5
+ readonly reference: string;
6
+ readonly recipient: {
7
+ readonly name: string;
8
+ readonly phone: string;
9
+ readonly address: string;
10
+ readonly city: string;
11
+ };
12
+ /** The cash the courier collects on delivery (`0.00`: paid already), in the company's currency. */
13
+ readonly cod: string;
14
+ readonly weightKg: string;
15
+ readonly note: string;
16
+ }
17
+ export interface Booked {
18
+ /** The courier's consignment id. */
19
+ readonly trackingRef: string;
20
+ readonly labelUrl?: string;
21
+ }
22
+ export interface Tracking {
23
+ readonly status: ParcelStatus;
24
+ /** What the courier says happened, oldest first. */
25
+ readonly events: readonly {
26
+ readonly at: string;
27
+ readonly status: ParcelStatus;
28
+ readonly note: string;
29
+ }[];
30
+ /** Delivered with the cash collected. */
31
+ readonly codCollected: boolean;
32
+ }
33
+ export interface CourierAdapter {
34
+ readonly code: string;
35
+ /** Whether this server has the courier's credentials. */
36
+ configured(): boolean;
37
+ book(parcel: Parcel): Promise<Booked>;
38
+ track(trackingRef: string): Promise<Tracking>;
39
+ cancel(trackingRef: string): Promise<void>;
40
+ }
41
+ /** The test courier: parcels in memory, moved along by `advance`. */
42
+ export interface FakeCourier extends CourierAdapter {
43
+ /** Moves a parcel to `status` (delivered collects its cash). */
44
+ advance(trackingRef: string, status: ParcelStatus, note?: string): void;
45
+ }
46
+ export declare function fakeCourier(): FakeCourier;
47
+ /** The test courier every server has (the demo's and the tests'). */
48
+ export declare const testCourier: FakeCourier;
49
+ export declare function setCouriers(next: ReadonlyMap<string, CourierAdapter>): void;
50
+ export declare function courierOf(code: string): CourierAdapter | null;
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Couriers (RFC 0024 §2.7): what the Shop asks of a courier — book a parcel (with the cash to collect on delivery),
3
+ * say where it is, cancel it — behind one adapter per courier, so Pathao, Steadfast or RedX can be switched without
4
+ * changing the Shop. Credentials are never in records: an adapter reads them from the environment. The test courier
5
+ * moves no parcel: tests (and the demo) move it along with `advance`.
6
+ */
7
+ import { randomBytes } from 'node:crypto';
8
+ export function fakeCourier() {
9
+ const parcels = new Map();
10
+ const step = (p, status, note) => {
11
+ p.status = status;
12
+ p.events.push({ at: new Date().toISOString(), status, note });
13
+ };
14
+ const known = (ref) => {
15
+ const p = parcels.get(ref);
16
+ if (p === undefined)
17
+ throw new Error(`The test courier has no parcel ${ref}.`);
18
+ return p;
19
+ };
20
+ return {
21
+ code: 'fake',
22
+ configured: () => true,
23
+ book: async (parcel) => {
24
+ const trackingRef = `FAKE-${randomBytes(5).toString('hex').toUpperCase()}`;
25
+ parcels.set(trackingRef, {
26
+ parcel,
27
+ status: 'booked',
28
+ events: [{ at: new Date().toISOString(), status: 'booked', note: 'Booked' }],
29
+ });
30
+ return { trackingRef, labelUrl: `https://courier.test/labels/${trackingRef}.pdf` };
31
+ },
32
+ track: async (ref) => {
33
+ const p = known(ref);
34
+ return {
35
+ status: p.status,
36
+ events: p.events.map((e) => ({ ...e })),
37
+ codCollected: p.status === 'delivered' && Number(p.parcel.cod) > 0,
38
+ };
39
+ },
40
+ cancel: async (ref) => {
41
+ const p = known(ref);
42
+ if (p.status !== 'booked')
43
+ throw new Error('The courier has picked the parcel up already.');
44
+ step(p, 'cancelled', 'Cancelled');
45
+ },
46
+ advance: (ref, status, note) => step(known(ref), status, note ?? status),
47
+ };
48
+ }
49
+ /** The test courier every server has (the demo's and the tests'). */
50
+ export const testCourier = fakeCourier();
51
+ /** The couriers of the running server, by code (Pathao, Steadfast and RedX come with their sandbox credentials). */
52
+ let couriers = new Map([['fake', testCourier]]);
53
+ export function setCouriers(next) {
54
+ couriers = next;
55
+ }
56
+ export function courierOf(code) {
57
+ const c = couriers.get(code);
58
+ return c?.configured() ? c : null;
59
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * The Shop's demo data (RFC 0024 §2.7): Padma Traders' site sells — cement, LED panels and copper cable published with
3
+ * their weight and a Bangla description, related to one another; two delivery methods (by zone, Dhaka or outside,
4
+ * free from 10 000; and a courier by weight); and an order placed on the shop with cash on delivery.
5
+ */
6
+ import type { DemoContext } from '../modules-sdk/index.js';
7
+ export declare function shopDemo(ctx: DemoContext): Promise<string>;
@@ -0,0 +1,90 @@
1
+ /**
2
+ * The Shop's demo data (RFC 0024 §2.7): Padma Traders' site sells — cement, LED panels and copper cable published with
3
+ * their weight and a Bangla description, related to one another; two delivery methods (by zone, Dhaka or outside,
4
+ * free from 10 000; and a courier by weight); and an order placed on the shop with cash on delivery.
5
+ */
6
+ import { idByName } from '../modules-sdk/index.js';
7
+ import { orm } from '../server/orm.js';
8
+ import { checkout, newCart, setLine } from './shop.js';
9
+ const DINA = {
10
+ login: 'dina',
11
+ name: 'Dina Rahman',
12
+ groups: ['website_sale.manager', 'product.manager'],
13
+ };
14
+ export async function shopDemo(ctx) {
15
+ const placed = await ctx.as(DINA, async (raw) => {
16
+ const env = raw;
17
+ const [site] = await (await env.model('website.site').search({ where: { key: 'padma' }, limit: 1 })).load({});
18
+ if (site === undefined)
19
+ return null;
20
+ await env.model('website.site').browse([site.id]).write({ shop: true, codLimit: '50000' });
21
+ const products = [
22
+ ['Cement bag 50 kg', '50', 'পোর্টল্যান্ড কম্পোজিট সিমেন্ট, ৫০ কেজির বস্তা।'],
23
+ ['LED panel 40 W', '2.5', '৪০ ওয়াটের এলইডি প্যানেল, অফিস ও দোকানের জন্য।'],
24
+ ['Copper cable 2.5 mm²', '0.03', 'তামার তার, ২.৫ বর্গমিলিমিটার, মিটার হিসেবে।'],
25
+ ];
26
+ const ids = [];
27
+ for (const [name, weight, bangla] of products) {
28
+ const id = (await idByName(env, 'product.product', name));
29
+ if (id === undefined)
30
+ continue;
31
+ ids.push(id);
32
+ await env
33
+ .model('product.product')
34
+ .browse([id])
35
+ .write({
36
+ published: true,
37
+ weight,
38
+ websiteDescription: { en_US: `${name}, delivered across Bangladesh.`, bn_BD: bangla },
39
+ });
40
+ }
41
+ for (const id of ids)
42
+ await env
43
+ .model('product.product')
44
+ .browse([id])
45
+ .write({ related: { set: ids.filter((o) => o !== id) } });
46
+ const carriers = await env.model('delivery.carrier').create([
47
+ {
48
+ name: 'Home delivery',
49
+ kind: 'zone',
50
+ zoneCities: 'Dhaka',
51
+ priceInside: '60',
52
+ priceOutside: '120',
53
+ freeOver: '10000',
54
+ cod: true,
55
+ courier: 'fake',
56
+ sequence: 1,
57
+ },
58
+ {
59
+ name: 'Courier by weight',
60
+ kind: 'weight',
61
+ price: '80',
62
+ pricePerKg: '20',
63
+ cod: false,
64
+ sequence: 2,
65
+ },
66
+ ]);
67
+ await env.flush();
68
+ // An order placed with cash on delivery, as a visitor would (the shop works as the system).
69
+ return env.asSuperuser({ reason: 'demo shop order' }, async (su) => {
70
+ const shop = { id: site.id, key: site.key, company: site.company.id };
71
+ const cart = await newCart(su, shop);
72
+ const cement = ids[0];
73
+ if (cement === undefined)
74
+ return null;
75
+ await setLine(su, cart.id, cement, orm.toDecimal(4));
76
+ return checkout(su, shop, cart.id, {
77
+ name: 'Rina Akter',
78
+ email: 'rina@example.com',
79
+ phone: '01700000000',
80
+ street: 'House 12, Road 5, Dhanmondi',
81
+ city: 'Dhaka',
82
+ carrier: carriers.ids[0],
83
+ payment: 'cod',
84
+ });
85
+ });
86
+ });
87
+ return placed === null
88
+ ? 'Shop: no site to sell on.'
89
+ : `Shop: 3 products published, 2 delivery methods, order ${placed.order} placed with cash on delivery.`;
90
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Bringing visitors back and to the shop (RFC 0024 §2.7): carts left with an email get one reminder with a code that
3
+ * restores them (the cart's own token is never sent); the site's sitemap lists its published pages and products for
4
+ * search engines; product pictures are served without a sign-in, only of products on the shop.
5
+ */
6
+ import { type Mailer } from '../mail/index.js';
7
+ import type { Env } from './.kosh/bindings.js';
8
+ import type { Site } from './shop.js';
9
+ export declare function setShopMailer(mailer: Mailer | undefined): void;
10
+ /** The email a visitor leaves on their cart, for one reminder if they leave it. */
11
+ export declare function setContact(env: Env, id: number, email: string): Promise<void>;
12
+ /**
13
+ * Reminds the carts of the company's shops left longer than their site says, with an email and goods, once each: a
14
+ * new recovery code (only its hash is kept) in a link to the site's `/cart/recover`. Sent after the commit; returns
15
+ * how many were reminded.
16
+ */
17
+ export declare function remindAbandoned(env: Env, now?: Date): Promise<number>;
18
+ /** A reminder's code restores its cart: a new token for it (the old one stops working); null when unknown. */
19
+ export declare function recoverCart(env: Env, site: Site, code: string): Promise<string | null>;
20
+ /**
21
+ * The site's sitemap: its published pages (the default language at their path, the other at `/<lang><path>`) and the
22
+ * products on its shop (at `/shop/p/<id>`), each with when it last changed. Null without the site's domain.
23
+ */
24
+ export declare function sitemap(env: Env, site: Site): Promise<string | null>;
25
+ /** The picture of a product on the shop (`width`: its thumbnail of that width, when one was made). */
26
+ export declare function productImage(env: Env, product: number, width?: number): Promise<{
27
+ key: string;
28
+ mime: string;
29
+ size: number;
30
+ name: string;
31
+ } | null>;
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Bringing visitors back and to the shop (RFC 0024 §2.7): carts left with an email get one reminder with a code that
3
+ * restores them (the cart's own token is never sent); the site's sitemap lists its published pages and products for
4
+ * search engines; product pictures are served without a sign-in, only of products on the shop.
5
+ */
6
+ import { layout } from '../mail/index.js';
7
+ import { HttpProblem } from '../server/index.js';
8
+ import { orm } from '../server/orm.js';
9
+ import { hashToken, newCartToken } from './module.js';
10
+ const EMAIL = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
11
+ const escapeXml = (s) => s.replace(/[<>&'"]/g, (c) => ({ '<': '&lt;', '>': '&gt;', '&': '&amp;', "'": '&apos;', '"': '&quot;' })[c] ?? c);
12
+ /** The shop's mailer (from the environment, or the tests'): set by the module. */
13
+ let shopMailer;
14
+ export function setShopMailer(mailer) {
15
+ shopMailer = mailer;
16
+ }
17
+ /** The email a visitor leaves on their cart, for one reminder if they leave it. */
18
+ export async function setContact(env, id, email) {
19
+ const clean = email.trim().slice(0, 200);
20
+ if (!EMAIL.test(clean))
21
+ throw new HttpProblem(422, 'invalid-input', 'Invalid email', 'An email address.');
22
+ await env
23
+ .model('sale.order')
24
+ .browse([id])
25
+ .write({ contactEmail: clean });
26
+ await env.flush();
27
+ }
28
+ /**
29
+ * Reminds the carts of the company's shops left longer than their site says, with an email and goods, once each: a
30
+ * new recovery code (only its hash is kept) in a link to the site's `/cart/recover`. Sent after the commit; returns
31
+ * how many were reminded.
32
+ */
33
+ export async function remindAbandoned(env, now = new Date()) {
34
+ const sites = await (await env
35
+ .model('website.site')
36
+ .search({ where: { shop: true, abandonedHours: { gt: 0 } } })).load({});
37
+ let reminded = 0;
38
+ for (const site of sites) {
39
+ if (site.domain === null || site.domain === '')
40
+ continue;
41
+ const before = new Date(now.getTime() - site.abandonedHours * 3_600_000);
42
+ const carts = await (await env.model('sale.order').search({
43
+ where: {
44
+ website: site.id,
45
+ state: 'draft',
46
+ placedAt: { isNull: true },
47
+ contactEmail: { isNull: false },
48
+ remindedAt: { isNull: true },
49
+ updatedAt: { lt: before },
50
+ },
51
+ limit: 200,
52
+ })).load({ lines: true, currency: true });
53
+ for (const cart of carts) {
54
+ const goods = [...cart.lines].filter((l) => !l.isDelivery && !l.isDiscount);
55
+ if (goods.length === 0 || cart.contactEmail === null)
56
+ continue;
57
+ const code = newCartToken();
58
+ await env
59
+ .model('sale.order')
60
+ .browse([cart.id])
61
+ .write({ recoveryToken: hashToken(code), remindedAt: now });
62
+ const bangla = site.lang === 'bn';
63
+ const url = `https://${site.domain}/cart/recover?code=${encodeURIComponent(code)}`;
64
+ const mail = layout({
65
+ title: bangla ? 'আপনার কার্ট অপেক্ষা করছে' : 'Your cart is waiting',
66
+ paragraphs: [
67
+ bangla
68
+ ? `${site.name}-এ আপনার কার্টে রাখা পণ্যগুলো:`
69
+ : `What you left in your cart at ${site.name}:`,
70
+ ...goods.map((l) => `${l.quantity.toString()} × ${l.name}`),
71
+ ],
72
+ action: { label: bangla ? 'কার্টে ফিরে যান' : 'Back to your cart', url },
73
+ lang: bangla ? 'bn' : 'en',
74
+ });
75
+ const to = cart.contactEmail;
76
+ const subject = bangla ? 'আপনার কার্ট অপেক্ষা করছে' : `Your cart at ${site.name} is waiting`;
77
+ const mailer = shopMailer;
78
+ if (mailer !== undefined)
79
+ env.afterCommit(async () => {
80
+ await mailer
81
+ .send({ to, subject, html: mail.html, text: mail.text })
82
+ .catch(() => undefined);
83
+ });
84
+ reminded += 1;
85
+ }
86
+ }
87
+ await env.flush();
88
+ return reminded;
89
+ }
90
+ /** A reminder's code restores its cart: a new token for it (the old one stops working); null when unknown. */
91
+ export async function recoverCart(env, site, code) {
92
+ if (code === '' || code.length > 100)
93
+ return null;
94
+ const [id] = (await env.model('sale.order').search({
95
+ where: {
96
+ website: site.id,
97
+ recoveryToken: hashToken(code),
98
+ state: 'draft',
99
+ placedAt: { isNull: true },
100
+ },
101
+ limit: 1,
102
+ })).ids;
103
+ if (id === undefined)
104
+ return null;
105
+ const token = newCartToken();
106
+ await env
107
+ .model('sale.order')
108
+ .browse([id])
109
+ .write({ cartToken: hashToken(token), recoveryToken: null });
110
+ await env.flush();
111
+ return token;
112
+ }
113
+ /**
114
+ * The site's sitemap: its published pages (the default language at their path, the other at `/<lang><path>`) and the
115
+ * products on its shop (at `/shop/p/<id>`), each with when it last changed. Null without the site's domain.
116
+ */
117
+ export async function sitemap(env, site) {
118
+ const [s] = await env
119
+ .model('website.site')
120
+ .browse([site.id])
121
+ .load({});
122
+ if (s === undefined || s.domain === null || s.domain === '')
123
+ return null;
124
+ const base = `https://${s.domain.replace(/^https?:\/\//, '').replace(/\/$/, '')}`;
125
+ const day = (v) => v instanceof Date ? v.toISOString().slice(0, 10) : String(v ?? '').slice(0, 10);
126
+ const pages = await (await env
127
+ .model('website.page')
128
+ .search({ where: { site: site.id, state: 'published' }, order: ['path asc'] })).load({});
129
+ const products = await (await env.model('product.product').search({
130
+ where: { published: true, saleOk: true },
131
+ order: ['shopSequence asc', 'id asc'],
132
+ limit: 5000,
133
+ })).load({});
134
+ const urls = [
135
+ ...[...pages].map((p) => ({
136
+ loc: `${base}${p.lang === s.lang ? '' : `/${p.lang}`}${p.path === '/' && p.lang !== s.lang ? '' : p.path}`,
137
+ lastmod: day(p.updatedAt),
138
+ })),
139
+ ...[...products].map((p) => ({ loc: `${base}/shop/p/${p.id}`, lastmod: day(p.updatedAt) })),
140
+ ];
141
+ return `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls
142
+ .map((u) => ` <url><loc>${escapeXml(u.loc)}</loc><lastmod>${u.lastmod}</lastmod></url>`)
143
+ .join('\n')}\n</urlset>\n`;
144
+ }
145
+ /** The picture of a product on the shop (`width`: its thumbnail of that width, when one was made). */
146
+ export async function productImage(env, product, width) {
147
+ const [p] = await (await env.model('product.product').search({
148
+ where: { id: orm.asId(product, 'product.product'), published: true, saleOk: true },
149
+ limit: 1,
150
+ })).load({});
151
+ if (p === undefined || p.image === null)
152
+ return null;
153
+ const attachments = env.model('storage.attachment');
154
+ let id = p.image.id;
155
+ if (width !== undefined) {
156
+ const variant = await attachments.search({ where: { variantOf: id, width }, limit: 1 });
157
+ id = variant.ids[0] ?? id;
158
+ }
159
+ const [a] = [...(await attachments.browse([id]).load(['key', 'mime', 'size', 'name']))];
160
+ if (a === undefined || !a.mime.startsWith('image/'))
161
+ return null;
162
+ return { key: a.key, mime: a.mime, size: a.size, name: a.name };
163
+ }
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @packageDocumentation
3
+ * `shutro-erp/website_sale` (RFC 0024 §2.7): the **Shop** on a Sites site. Products published with a description in English
4
+ * and Bangla; delivery methods with fees (fixed, by weight, by zone — Dhaka or outside — free above an amount); a
5
+ * public API for a storefront (the Next.js site, or any other): the catalogue, a cart held by a secret token, the
6
+ * delivery methods with their fee, and checkout with cash on delivery or an online payment (RFC 0017 providers),
7
+ * which confirms, invoices and pays the order once the provider confirms. No sign-in; rate limited per address as
8
+ * every public route is; prices always the server's. The cart's token travels in the `x-cart-token` header.
9
+ *
10
+ * - `GET /api/v1/public/shop/:site/products?q=&category=&min=&max=&sort=price|-price|name|new&page=&lang=`
11
+ * - `GET /api/v1/public/shop/:site/products/:id?lang=` a product's page with related products
12
+ * - `GET /api/v1/public/shop/:site/categories?lang=`
13
+ * - `POST /api/v1/public/shop/:site/cart` a new cart → `{ token }`
14
+ * - `GET /api/v1/public/shop/:site/cart` the cart (lines, fee, taxes, total)
15
+ * - `PUT /api/v1/public/shop/:site/cart/lines` `{ product, quantity }` (0 removes)
16
+ * - `GET /api/v1/public/shop/:site/carriers?city=` the delivery methods with their fee for the cart
17
+ * - `GET /api/v1/public/shop/:site/payments` the online payment providers offered
18
+ * - `POST /api/v1/public/shop/:site/checkout` `{ name, email, phone, street, city, carrier,
19
+ * payment: 'cod' | provider id, note?, returnUrl? }`
20
+ * - `GET /api/v1/public/shop/:site/order` the placed order of the token: its state, payment
21
+ * and shipments
22
+ * - `PUT /api/v1/public/shop/:site/cart/coupon` `{ code }` (empty takes it off)
23
+ * - `PUT /api/v1/public/shop/:site/cart/contact` `{ email }`: one reminder if the cart is left
24
+ * - `POST /api/v1/public/shop/:site/cart/recover` `{ code }` from the reminder → `{ token }`
25
+ * - `GET /api/v1/public/shop/:site/products/:id/image?w=256` a published product's picture
26
+ * - `GET /api/v1/public/shop/:site/sitemap.xml` the site's pages and products for search engines
27
+ */
28
+ import { type Mailer } from '../mail/index.js';
29
+ import { defineModule } from '../modules-sdk/index.js';
30
+ import { type ModuleContext } from '../server/index.js';
31
+ import { type Worker } from '../server/orm.js';
32
+ import { type CourierAdapter } from './couriers.js';
33
+ export { type Booked, type CourierAdapter, courierOf, type FakeCourier, fakeCourier, type Parcel, type ParcelStatus, setCouriers, type Tracking, testCourier, } from './couriers.js';
34
+ export { recoverCart, remindAbandoned, setContact, sitemap } from './growth.js';
35
+ export { COURIERS, DeliveryCarrier, DeliveryShipment, DeliveryShipmentEvent, feeOf, hashToken, LineShop, OrderShop, ProductShop, ShopCoupon, SiteShop, TransactionOrder, websiteSaleShutro, } from './module.js';
36
+ export { draftShipments, refreshShipments, trackingOf } from './shipments.js';
37
+ export { type CheckoutInput, checkout, setDelivery, setLine } from './shop.js';
38
+ /** The subscriber that makes the draft shipments of confirmed shop orders; tests `drain()` it, the server starts it. */
39
+ export declare function shipmentWorker(context: Pick<ModuleContext, 'shutro'>): Worker;
40
+ export interface ShopOptions {
41
+ /** The couriers by code (tests; default: the test courier). */
42
+ readonly couriers?: ReadonlyMap<string, CourierAdapter>;
43
+ /** Who sends the reminders; default: SMTP from the environment (`SMTP_URL`), none without it. */
44
+ readonly mailer?: Mailer | undefined;
45
+ }
46
+ /** The Shop with explicit options (tests, installations wiring their couriers). */
47
+ export declare function websiteSaleModule(options?: ShopOptions): ReturnType<typeof defineModule>;
48
+ /** The Shop (the test courier; Pathao, Steadfast and RedX adapters come with their sandbox credentials). */
49
+ export declare const websiteSale: ReturnType<typeof defineModule>;