@temboplus/afloat 0.1.80 → 0.2.0-beta.1

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 (413) hide show
  1. package/README.md +246 -42
  2. package/dist/index.cjs.js +2 -0
  3. package/dist/index.cjs.js.map +1 -0
  4. package/dist/index.d.ts +10 -0
  5. package/dist/index.esm.js +2 -0
  6. package/dist/index.esm.js.map +1 -0
  7. package/dist/lib/api/base-repository.d.ts +177 -0
  8. package/dist/lib/api/index.d.ts +1 -0
  9. package/{esm/src/errors/api_error.d.ts → dist/lib/error/error.api.d.ts} +0 -1
  10. package/{script/npm/src/src/errors/permission_error.d.ts → dist/lib/error/error.permission.d.ts} +1 -2
  11. package/dist/lib/error/error.utils.d.ts +22 -0
  12. package/dist/lib/error/index.d.ts +3 -0
  13. package/dist/lib/query/index.d.ts +4 -0
  14. package/dist/lib/query/pagination/pagination.d.ts +73 -0
  15. package/dist/lib/query/pagination/pagination.schemas.d.ts +83 -0
  16. package/dist/lib/query/query.builder.d.ts +75 -0
  17. package/dist/lib/query/query.types.d.ts +36 -0
  18. package/{esm/src/features/auth/contract.d.ts → dist/modules/auth/auth.contract.d.ts} +16 -19
  19. package/dist/modules/auth/auth.repository.d.ts +83 -0
  20. package/dist/modules/auth/company-membership.model.d.ts +171 -0
  21. package/dist/modules/auth/index.d.ts +3 -0
  22. package/dist/modules/auth/user.model.d.ts +363 -0
  23. package/dist/modules/beneficiary/beneficiary-info.model.d.ts +178 -0
  24. package/dist/modules/beneficiary/beneficiary-input-handler.d.ts +16 -0
  25. package/dist/modules/beneficiary/beneficiary.api-contract.d.ts +203 -0
  26. package/dist/modules/beneficiary/beneficiary.dtos.d.ts +84 -0
  27. package/dist/modules/beneficiary/beneficiary.model.d.ts +441 -0
  28. package/dist/modules/beneficiary/beneficiary.repository.d.ts +116 -0
  29. package/dist/modules/beneficiary/index.d.ts +6 -0
  30. package/dist/modules/login/index.d.ts +4 -0
  31. package/dist/modules/login/login.api-contract.d.ts +51 -0
  32. package/dist/modules/login/login.dtos.d.ts +85 -0
  33. package/dist/modules/login/login.model.d.ts +168 -0
  34. package/dist/modules/login/login.repository.d.ts +58 -0
  35. package/{script/npm/src/src/models/permission.d.ts → dist/modules/login/permission.type.d.ts} +8 -9
  36. package/dist/modules/payout/index.d.ts +5 -0
  37. package/dist/modules/payout/payout-channel-handler.d.ts +82 -0
  38. package/{esm/src/features/payout/contract.d.ts → dist/modules/payout/payout.api-contract.d.ts} +350 -207
  39. package/dist/modules/payout/payout.dtos.d.ts +607 -0
  40. package/dist/modules/payout/payout.model.d.ts +383 -0
  41. package/dist/modules/payout/payout.query.d.ts +134 -0
  42. package/dist/modules/payout/payout.repository.d.ts +204 -0
  43. package/dist/modules/profile/index.d.ts +3 -0
  44. package/{script/npm/src/src/features/auth/profile/contract.d.ts → dist/modules/profile/profile.api-contract.d.ts} +8 -6
  45. package/dist/modules/profile/profile.dtos.d.ts +80 -0
  46. package/{script/npm/src/src/models/user/profile.d.ts → dist/modules/profile/profile.model.d.ts} +81 -52
  47. package/dist/modules/profile/profile.repository.d.ts +56 -0
  48. package/dist/modules/team-member/index.d.ts +4 -0
  49. package/dist/modules/team-member/role.model.d.ts +61 -0
  50. package/{esm/src/features/admin/contract.d.ts → dist/modules/team-member/team-member.contract.d.ts} +229 -154
  51. package/dist/modules/team-member/team-member.dtos.d.ts +261 -0
  52. package/dist/modules/team-member/team-member.model.d.ts +237 -0
  53. package/dist/modules/team-member/team-member.repository.d.ts +179 -0
  54. package/dist/modules/wallet/index.d.ts +6 -0
  55. package/dist/modules/wallet/narration.model.d.ts +225 -0
  56. package/dist/modules/wallet/statement-entry.model.d.ts +299 -0
  57. package/{script/npm/src/src/features/wallet/contract.d.ts → dist/modules/wallet/wallet.contract.d.ts} +17 -15
  58. package/dist/modules/wallet/wallet.dtos.d.ts +204 -0
  59. package/{esm/src/models/wallet/wallet.d.ts → dist/modules/wallet/wallet.model.d.ts} +34 -40
  60. package/dist/modules/wallet/wallet.query.d.ts +95 -0
  61. package/dist/modules/wallet/wallet.repository.d.ts +205 -0
  62. package/dist/modules/wallet/wallet.utils.d.ts +17 -0
  63. package/package.json +49 -23
  64. package/LICENSE +0 -7
  65. package/esm/mod.d.ts +0 -8
  66. package/esm/mod.d.ts.map +0 -1
  67. package/esm/mod.js +0 -7
  68. package/esm/package.json +0 -3
  69. package/esm/src/errors/api_error.d.ts.map +0 -1
  70. package/esm/src/errors/api_error.js +0 -90
  71. package/esm/src/errors/index.d.ts +0 -3
  72. package/esm/src/errors/index.d.ts.map +0 -1
  73. package/esm/src/errors/index.js +0 -2
  74. package/esm/src/errors/permission_error.d.ts +0 -48
  75. package/esm/src/errors/permission_error.d.ts.map +0 -1
  76. package/esm/src/errors/permission_error.js +0 -70
  77. package/esm/src/features/admin/contract.d.ts.map +0 -1
  78. package/esm/src/features/admin/contract.js +0 -210
  79. package/esm/src/features/admin/index.d.ts +0 -4
  80. package/esm/src/features/admin/index.d.ts.map +0 -1
  81. package/esm/src/features/admin/index.js +0 -3
  82. package/esm/src/features/admin/repository.d.ts +0 -114
  83. package/esm/src/features/admin/repository.d.ts.map +0 -1
  84. package/esm/src/features/admin/repository.js +0 -248
  85. package/esm/src/features/admin/schemas.d.ts +0 -146
  86. package/esm/src/features/admin/schemas.d.ts.map +0 -1
  87. package/esm/src/features/admin/schemas.js +0 -206
  88. package/esm/src/features/auth/access/contract.d.ts +0 -14
  89. package/esm/src/features/auth/access/contract.d.ts.map +0 -1
  90. package/esm/src/features/auth/access/contract.js +0 -14
  91. package/esm/src/features/auth/access/repository.d.ts +0 -11
  92. package/esm/src/features/auth/access/repository.d.ts.map +0 -1
  93. package/esm/src/features/auth/access/repository.js +0 -25
  94. package/esm/src/features/auth/contract.d.ts.map +0 -1
  95. package/esm/src/features/auth/contract.js +0 -43
  96. package/esm/src/features/auth/identity/contract.d.ts +0 -23
  97. package/esm/src/features/auth/identity/contract.d.ts.map +0 -1
  98. package/esm/src/features/auth/identity/contract.js +0 -17
  99. package/esm/src/features/auth/identity/repository.d.ts +0 -22
  100. package/esm/src/features/auth/identity/repository.d.ts.map +0 -1
  101. package/esm/src/features/auth/identity/repository.js +0 -30
  102. package/esm/src/features/auth/index.d.ts +0 -6
  103. package/esm/src/features/auth/index.d.ts.map +0 -1
  104. package/esm/src/features/auth/index.js +0 -5
  105. package/esm/src/features/auth/manager.d.ts +0 -105
  106. package/esm/src/features/auth/manager.d.ts.map +0 -1
  107. package/esm/src/features/auth/manager.js +0 -181
  108. package/esm/src/features/auth/profile/contract.d.ts +0 -37
  109. package/esm/src/features/auth/profile/contract.d.ts.map +0 -1
  110. package/esm/src/features/auth/profile/contract.js +0 -14
  111. package/esm/src/features/auth/profile/repository.d.ts +0 -11
  112. package/esm/src/features/auth/profile/repository.d.ts.map +0 -1
  113. package/esm/src/features/auth/profile/repository.js +0 -25
  114. package/esm/src/features/auth/repository.d.ts +0 -30
  115. package/esm/src/features/auth/repository.d.ts.map +0 -1
  116. package/esm/src/features/auth/repository.js +0 -69
  117. package/esm/src/features/auth/storage/client_store.d.ts +0 -30
  118. package/esm/src/features/auth/storage/client_store.d.ts.map +0 -1
  119. package/esm/src/features/auth/storage/client_store.js +0 -46
  120. package/esm/src/features/auth/storage/client_token_handler.d.ts +0 -32
  121. package/esm/src/features/auth/storage/client_token_handler.d.ts.map +0 -1
  122. package/esm/src/features/auth/storage/client_token_handler.js +0 -36
  123. package/esm/src/features/auth/storage/server_store.d.ts +0 -24
  124. package/esm/src/features/auth/storage/server_store.d.ts.map +0 -1
  125. package/esm/src/features/auth/storage/server_store.js +0 -34
  126. package/esm/src/features/auth/storage/server_token_handler.d.ts +0 -36
  127. package/esm/src/features/auth/storage/server_token_handler.d.ts.map +0 -1
  128. package/esm/src/features/auth/storage/server_token_handler.js +0 -115
  129. package/esm/src/features/auth/storage/types.d.ts +0 -42
  130. package/esm/src/features/auth/storage/types.d.ts.map +0 -1
  131. package/esm/src/features/auth/storage/types.js +0 -1
  132. package/esm/src/features/contact/contract.d.ts +0 -170
  133. package/esm/src/features/contact/contract.d.ts.map +0 -1
  134. package/esm/src/features/contact/contract.js +0 -49
  135. package/esm/src/features/contact/index.d.ts +0 -2
  136. package/esm/src/features/contact/index.d.ts.map +0 -1
  137. package/esm/src/features/contact/index.js +0 -1
  138. package/esm/src/features/contact/repository.d.ts +0 -58
  139. package/esm/src/features/contact/repository.d.ts.map +0 -1
  140. package/esm/src/features/contact/repository.js +0 -108
  141. package/esm/src/features/payout/contract.d.ts.map +0 -1
  142. package/esm/src/features/payout/contract.js +0 -75
  143. package/esm/src/features/payout/index.d.ts +0 -2
  144. package/esm/src/features/payout/index.d.ts.map +0 -1
  145. package/esm/src/features/payout/index.js +0 -1
  146. package/esm/src/features/payout/repository.d.ts +0 -67
  147. package/esm/src/features/payout/repository.d.ts.map +0 -1
  148. package/esm/src/features/payout/repository.js +0 -179
  149. package/esm/src/features/wallet/contract.d.ts +0 -137
  150. package/esm/src/features/wallet/contract.d.ts.map +0 -1
  151. package/esm/src/features/wallet/contract.js +0 -38
  152. package/esm/src/features/wallet/index.d.ts +0 -2
  153. package/esm/src/features/wallet/index.d.ts.map +0 -1
  154. package/esm/src/features/wallet/index.js +0 -1
  155. package/esm/src/features/wallet/repository.d.ts +0 -57
  156. package/esm/src/features/wallet/repository.d.ts.map +0 -1
  157. package/esm/src/features/wallet/repository.js +0 -93
  158. package/esm/src/models/contact/derivatives/contact.d.ts +0 -172
  159. package/esm/src/models/contact/derivatives/contact.d.ts.map +0 -1
  160. package/esm/src/models/contact/derivatives/contact.js +0 -266
  161. package/esm/src/models/contact/derivatives/contact_info.d.ts +0 -188
  162. package/esm/src/models/contact/derivatives/contact_info.d.ts.map +0 -1
  163. package/esm/src/models/contact/derivatives/contact_info.js +0 -255
  164. package/esm/src/models/contact/index.d.ts +0 -5
  165. package/esm/src/models/contact/index.d.ts.map +0 -1
  166. package/esm/src/models/contact/index.js +0 -4
  167. package/esm/src/models/contact/schemas.d.ts +0 -66
  168. package/esm/src/models/contact/schemas.d.ts.map +0 -1
  169. package/esm/src/models/contact/schemas.js +0 -64
  170. package/esm/src/models/contact/validation.d.ts +0 -37
  171. package/esm/src/models/contact/validation.d.ts.map +0 -1
  172. package/esm/src/models/contact/validation.js +0 -146
  173. package/esm/src/models/index.d.ts +0 -7
  174. package/esm/src/models/index.d.ts.map +0 -1
  175. package/esm/src/models/index.js +0 -6
  176. package/esm/src/models/payout/api.d.ts +0 -29
  177. package/esm/src/models/payout/api.d.ts.map +0 -1
  178. package/esm/src/models/payout/api.js +0 -1
  179. package/esm/src/models/payout/channel.d.ts +0 -58
  180. package/esm/src/models/payout/channel.d.ts.map +0 -1
  181. package/esm/src/models/payout/channel.js +0 -53
  182. package/esm/src/models/payout/derivatives/payout.d.ts +0 -158
  183. package/esm/src/models/payout/derivatives/payout.d.ts.map +0 -1
  184. package/esm/src/models/payout/derivatives/payout.js +0 -271
  185. package/esm/src/models/payout/index.d.ts +0 -7
  186. package/esm/src/models/payout/index.d.ts.map +0 -1
  187. package/esm/src/models/payout/index.js +0 -6
  188. package/esm/src/models/payout/narration.d.ts +0 -164
  189. package/esm/src/models/payout/narration.d.ts.map +0 -1
  190. package/esm/src/models/payout/narration.js +0 -308
  191. package/esm/src/models/payout/schemas.d.ts +0 -156
  192. package/esm/src/models/payout/schemas.d.ts.map +0 -1
  193. package/esm/src/models/payout/schemas.js +0 -105
  194. package/esm/src/models/payout/status.d.ts +0 -33
  195. package/esm/src/models/payout/status.d.ts.map +0 -1
  196. package/esm/src/models/payout/status.js +0 -34
  197. package/esm/src/models/permission.d.ts +0 -55
  198. package/esm/src/models/permission.d.ts.map +0 -1
  199. package/esm/src/models/permission.js +0 -50
  200. package/esm/src/models/role.d.ts +0 -21
  201. package/esm/src/models/role.d.ts.map +0 -1
  202. package/esm/src/models/role.js +0 -73
  203. package/esm/src/models/user/authenticated-user.d.ts +0 -77
  204. package/esm/src/models/user/authenticated-user.d.ts.map +0 -1
  205. package/esm/src/models/user/authenticated-user.js +0 -226
  206. package/esm/src/models/user/index.d.ts +0 -4
  207. package/esm/src/models/user/index.d.ts.map +0 -1
  208. package/esm/src/models/user/index.js +0 -3
  209. package/esm/src/models/user/managed-user.d.ts +0 -108
  210. package/esm/src/models/user/managed-user.d.ts.map +0 -1
  211. package/esm/src/models/user/managed-user.js +0 -255
  212. package/esm/src/models/user/profile.d.ts +0 -161
  213. package/esm/src/models/user/profile.d.ts.map +0 -1
  214. package/esm/src/models/user/profile.js +0 -334
  215. package/esm/src/models/wallet/index.d.ts +0 -4
  216. package/esm/src/models/wallet/index.d.ts.map +0 -1
  217. package/esm/src/models/wallet/index.js +0 -3
  218. package/esm/src/models/wallet/schemas.d.ts +0 -95
  219. package/esm/src/models/wallet/schemas.d.ts.map +0 -1
  220. package/esm/src/models/wallet/schemas.js +0 -35
  221. package/esm/src/models/wallet/statement_entry.d.ts +0 -160
  222. package/esm/src/models/wallet/statement_entry.d.ts.map +0 -1
  223. package/esm/src/models/wallet/statement_entry.js +0 -255
  224. package/esm/src/models/wallet/wallet.d.ts.map +0 -1
  225. package/esm/src/models/wallet/wallet.js +0 -279
  226. package/esm/src/shared/base_repository.d.ts +0 -80
  227. package/esm/src/shared/base_repository.d.ts.map +0 -1
  228. package/esm/src/shared/base_repository.js +0 -153
  229. package/esm/src/shared/common_responses.d.ts +0 -13
  230. package/esm/src/shared/common_responses.d.ts.map +0 -1
  231. package/esm/src/shared/common_responses.js +0 -10
  232. package/esm/src/shared/index.d.ts +0 -3
  233. package/esm/src/shared/index.d.ts.map +0 -1
  234. package/esm/src/shared/index.js +0 -2
  235. package/esm/src/shared/token_required_repository.d.ts +0 -78
  236. package/esm/src/shared/token_required_repository.d.ts.map +0 -1
  237. package/esm/src/shared/token_required_repository.js +0 -128
  238. package/script/mod.d.ts +0 -8
  239. package/script/mod.d.ts.map +0 -1
  240. package/script/mod.js +0 -23
  241. package/script/npm/src/mod.d.ts +0 -8
  242. package/script/npm/src/mod.d.ts.map +0 -1
  243. package/script/npm/src/mod.js +0 -23
  244. package/script/npm/src/src/errors/api_error.d.ts +0 -63
  245. package/script/npm/src/src/errors/api_error.d.ts.map +0 -1
  246. package/script/npm/src/src/errors/api_error.js +0 -94
  247. package/script/npm/src/src/errors/index.d.ts +0 -3
  248. package/script/npm/src/src/errors/index.d.ts.map +0 -1
  249. package/script/npm/src/src/errors/index.js +0 -18
  250. package/script/npm/src/src/errors/permission_error.d.ts.map +0 -1
  251. package/script/npm/src/src/errors/permission_error.js +0 -74
  252. package/script/npm/src/src/features/admin/contract.d.ts +0 -842
  253. package/script/npm/src/src/features/admin/contract.d.ts.map +0 -1
  254. package/script/npm/src/src/features/admin/contract.js +0 -213
  255. package/script/npm/src/src/features/admin/index.d.ts +0 -4
  256. package/script/npm/src/src/features/admin/index.d.ts.map +0 -1
  257. package/script/npm/src/src/features/admin/index.js +0 -19
  258. package/script/npm/src/src/features/admin/repository.d.ts +0 -114
  259. package/script/npm/src/src/features/admin/repository.d.ts.map +0 -1
  260. package/script/npm/src/src/features/admin/repository.js +0 -252
  261. package/script/npm/src/src/features/admin/schemas.d.ts +0 -146
  262. package/script/npm/src/src/features/admin/schemas.d.ts.map +0 -1
  263. package/script/npm/src/src/features/admin/schemas.js +0 -209
  264. package/script/npm/src/src/features/auth/access/contract.d.ts +0 -14
  265. package/script/npm/src/src/features/auth/access/contract.d.ts.map +0 -1
  266. package/script/npm/src/src/features/auth/access/contract.js +0 -17
  267. package/script/npm/src/src/features/auth/access/repository.d.ts +0 -11
  268. package/script/npm/src/src/features/auth/access/repository.d.ts.map +0 -1
  269. package/script/npm/src/src/features/auth/access/repository.js +0 -29
  270. package/script/npm/src/src/features/auth/contract.d.ts +0 -112
  271. package/script/npm/src/src/features/auth/contract.d.ts.map +0 -1
  272. package/script/npm/src/src/features/auth/contract.js +0 -46
  273. package/script/npm/src/src/features/auth/identity/contract.d.ts +0 -23
  274. package/script/npm/src/src/features/auth/identity/contract.d.ts.map +0 -1
  275. package/script/npm/src/src/features/auth/identity/contract.js +0 -20
  276. package/script/npm/src/src/features/auth/identity/repository.d.ts +0 -22
  277. package/script/npm/src/src/features/auth/identity/repository.d.ts.map +0 -1
  278. package/script/npm/src/src/features/auth/identity/repository.js +0 -34
  279. package/script/npm/src/src/features/auth/index.d.ts +0 -6
  280. package/script/npm/src/src/features/auth/index.d.ts.map +0 -1
  281. package/script/npm/src/src/features/auth/index.js +0 -21
  282. package/script/npm/src/src/features/auth/manager.d.ts +0 -105
  283. package/script/npm/src/src/features/auth/manager.d.ts.map +0 -1
  284. package/script/npm/src/src/features/auth/manager.js +0 -185
  285. package/script/npm/src/src/features/auth/profile/contract.d.ts.map +0 -1
  286. package/script/npm/src/src/features/auth/profile/contract.js +0 -17
  287. package/script/npm/src/src/features/auth/profile/repository.d.ts +0 -11
  288. package/script/npm/src/src/features/auth/profile/repository.d.ts.map +0 -1
  289. package/script/npm/src/src/features/auth/profile/repository.js +0 -29
  290. package/script/npm/src/src/features/auth/repository.d.ts +0 -30
  291. package/script/npm/src/src/features/auth/repository.d.ts.map +0 -1
  292. package/script/npm/src/src/features/auth/repository.js +0 -73
  293. package/script/npm/src/src/features/auth/storage/client_store.d.ts +0 -30
  294. package/script/npm/src/src/features/auth/storage/client_store.d.ts.map +0 -1
  295. package/script/npm/src/src/features/auth/storage/client_store.js +0 -51
  296. package/script/npm/src/src/features/auth/storage/client_token_handler.d.ts +0 -32
  297. package/script/npm/src/src/features/auth/storage/client_token_handler.d.ts.map +0 -1
  298. package/script/npm/src/src/features/auth/storage/client_token_handler.js +0 -40
  299. package/script/npm/src/src/features/auth/storage/server_store.d.ts +0 -24
  300. package/script/npm/src/src/features/auth/storage/server_store.d.ts.map +0 -1
  301. package/script/npm/src/src/features/auth/storage/server_store.js +0 -38
  302. package/script/npm/src/src/features/auth/storage/server_token_handler.d.ts +0 -36
  303. package/script/npm/src/src/features/auth/storage/server_token_handler.d.ts.map +0 -1
  304. package/script/npm/src/src/features/auth/storage/server_token_handler.js +0 -119
  305. package/script/npm/src/src/features/auth/storage/types.d.ts +0 -42
  306. package/script/npm/src/src/features/auth/storage/types.d.ts.map +0 -1
  307. package/script/npm/src/src/features/auth/storage/types.js +0 -2
  308. package/script/npm/src/src/features/contact/contract.d.ts +0 -170
  309. package/script/npm/src/src/features/contact/contract.d.ts.map +0 -1
  310. package/script/npm/src/src/features/contact/contract.js +0 -52
  311. package/script/npm/src/src/features/contact/index.d.ts +0 -2
  312. package/script/npm/src/src/features/contact/index.d.ts.map +0 -1
  313. package/script/npm/src/src/features/contact/index.js +0 -17
  314. package/script/npm/src/src/features/contact/repository.d.ts +0 -58
  315. package/script/npm/src/src/features/contact/repository.d.ts.map +0 -1
  316. package/script/npm/src/src/features/contact/repository.js +0 -112
  317. package/script/npm/src/src/features/payout/contract.d.ts +0 -623
  318. package/script/npm/src/src/features/payout/contract.d.ts.map +0 -1
  319. package/script/npm/src/src/features/payout/contract.js +0 -78
  320. package/script/npm/src/src/features/payout/index.d.ts +0 -2
  321. package/script/npm/src/src/features/payout/index.d.ts.map +0 -1
  322. package/script/npm/src/src/features/payout/index.js +0 -17
  323. package/script/npm/src/src/features/payout/repository.d.ts +0 -67
  324. package/script/npm/src/src/features/payout/repository.d.ts.map +0 -1
  325. package/script/npm/src/src/features/payout/repository.js +0 -183
  326. package/script/npm/src/src/features/wallet/contract.d.ts.map +0 -1
  327. package/script/npm/src/src/features/wallet/contract.js +0 -41
  328. package/script/npm/src/src/features/wallet/index.d.ts +0 -2
  329. package/script/npm/src/src/features/wallet/index.d.ts.map +0 -1
  330. package/script/npm/src/src/features/wallet/index.js +0 -17
  331. package/script/npm/src/src/features/wallet/repository.d.ts +0 -57
  332. package/script/npm/src/src/features/wallet/repository.d.ts.map +0 -1
  333. package/script/npm/src/src/features/wallet/repository.js +0 -97
  334. package/script/npm/src/src/models/contact/derivatives/contact.d.ts +0 -172
  335. package/script/npm/src/src/models/contact/derivatives/contact.d.ts.map +0 -1
  336. package/script/npm/src/src/models/contact/derivatives/contact.js +0 -270
  337. package/script/npm/src/src/models/contact/derivatives/contact_info.d.ts +0 -188
  338. package/script/npm/src/src/models/contact/derivatives/contact_info.d.ts.map +0 -1
  339. package/script/npm/src/src/models/contact/derivatives/contact_info.js +0 -260
  340. package/script/npm/src/src/models/contact/index.d.ts +0 -5
  341. package/script/npm/src/src/models/contact/index.d.ts.map +0 -1
  342. package/script/npm/src/src/models/contact/index.js +0 -20
  343. package/script/npm/src/src/models/contact/schemas.d.ts +0 -66
  344. package/script/npm/src/src/models/contact/schemas.d.ts.map +0 -1
  345. package/script/npm/src/src/models/contact/schemas.js +0 -67
  346. package/script/npm/src/src/models/contact/validation.d.ts +0 -37
  347. package/script/npm/src/src/models/contact/validation.d.ts.map +0 -1
  348. package/script/npm/src/src/models/contact/validation.js +0 -153
  349. package/script/npm/src/src/models/index.d.ts +0 -7
  350. package/script/npm/src/src/models/index.d.ts.map +0 -1
  351. package/script/npm/src/src/models/index.js +0 -22
  352. package/script/npm/src/src/models/payout/api.d.ts +0 -29
  353. package/script/npm/src/src/models/payout/api.d.ts.map +0 -1
  354. package/script/npm/src/src/models/payout/api.js +0 -2
  355. package/script/npm/src/src/models/payout/channel.d.ts +0 -58
  356. package/script/npm/src/src/models/payout/channel.d.ts.map +0 -1
  357. package/script/npm/src/src/models/payout/channel.js +0 -56
  358. package/script/npm/src/src/models/payout/derivatives/payout.d.ts +0 -158
  359. package/script/npm/src/src/models/payout/derivatives/payout.d.ts.map +0 -1
  360. package/script/npm/src/src/models/payout/derivatives/payout.js +0 -275
  361. package/script/npm/src/src/models/payout/index.d.ts +0 -7
  362. package/script/npm/src/src/models/payout/index.d.ts.map +0 -1
  363. package/script/npm/src/src/models/payout/index.js +0 -22
  364. package/script/npm/src/src/models/payout/narration.d.ts +0 -164
  365. package/script/npm/src/src/models/payout/narration.d.ts.map +0 -1
  366. package/script/npm/src/src/models/payout/narration.js +0 -312
  367. package/script/npm/src/src/models/payout/schemas.d.ts +0 -156
  368. package/script/npm/src/src/models/payout/schemas.d.ts.map +0 -1
  369. package/script/npm/src/src/models/payout/schemas.js +0 -108
  370. package/script/npm/src/src/models/payout/status.d.ts +0 -33
  371. package/script/npm/src/src/models/payout/status.d.ts.map +0 -1
  372. package/script/npm/src/src/models/payout/status.js +0 -37
  373. package/script/npm/src/src/models/permission.d.ts.map +0 -1
  374. package/script/npm/src/src/models/permission.js +0 -53
  375. package/script/npm/src/src/models/role.d.ts +0 -21
  376. package/script/npm/src/src/models/role.d.ts.map +0 -1
  377. package/script/npm/src/src/models/role.js +0 -77
  378. package/script/npm/src/src/models/user/authenticated-user.d.ts +0 -77
  379. package/script/npm/src/src/models/user/authenticated-user.d.ts.map +0 -1
  380. package/script/npm/src/src/models/user/authenticated-user.js +0 -230
  381. package/script/npm/src/src/models/user/index.d.ts +0 -4
  382. package/script/npm/src/src/models/user/index.d.ts.map +0 -1
  383. package/script/npm/src/src/models/user/index.js +0 -19
  384. package/script/npm/src/src/models/user/managed-user.d.ts +0 -108
  385. package/script/npm/src/src/models/user/managed-user.d.ts.map +0 -1
  386. package/script/npm/src/src/models/user/managed-user.js +0 -260
  387. package/script/npm/src/src/models/user/profile.d.ts.map +0 -1
  388. package/script/npm/src/src/models/user/profile.js +0 -338
  389. package/script/npm/src/src/models/wallet/index.d.ts +0 -4
  390. package/script/npm/src/src/models/wallet/index.d.ts.map +0 -1
  391. package/script/npm/src/src/models/wallet/index.js +0 -19
  392. package/script/npm/src/src/models/wallet/schemas.d.ts +0 -95
  393. package/script/npm/src/src/models/wallet/schemas.d.ts.map +0 -1
  394. package/script/npm/src/src/models/wallet/schemas.js +0 -38
  395. package/script/npm/src/src/models/wallet/statement_entry.d.ts +0 -160
  396. package/script/npm/src/src/models/wallet/statement_entry.d.ts.map +0 -1
  397. package/script/npm/src/src/models/wallet/statement_entry.js +0 -259
  398. package/script/npm/src/src/models/wallet/wallet.d.ts +0 -147
  399. package/script/npm/src/src/models/wallet/wallet.d.ts.map +0 -1
  400. package/script/npm/src/src/models/wallet/wallet.js +0 -283
  401. package/script/npm/src/src/shared/base_repository.d.ts +0 -80
  402. package/script/npm/src/src/shared/base_repository.d.ts.map +0 -1
  403. package/script/npm/src/src/shared/base_repository.js +0 -157
  404. package/script/npm/src/src/shared/common_responses.d.ts +0 -13
  405. package/script/npm/src/src/shared/common_responses.d.ts.map +0 -1
  406. package/script/npm/src/src/shared/common_responses.js +0 -13
  407. package/script/npm/src/src/shared/index.d.ts +0 -3
  408. package/script/npm/src/src/shared/index.d.ts.map +0 -1
  409. package/script/npm/src/src/shared/index.js +0 -18
  410. package/script/npm/src/src/shared/token_required_repository.d.ts +0 -78
  411. package/script/npm/src/src/shared/token_required_repository.d.ts.map +0 -1
  412. package/script/npm/src/src/shared/token_required_repository.js +0 -132
  413. package/script/package.json +0 -3
package/README.md CHANGED
@@ -1,8 +1,6 @@
1
1
  # @temboplus/afloat
2
2
 
3
- **A foundational library for Temboplus-Afloat projects.**
4
-
5
- This JavaScript/TypeScript package provides a central hub for shared utilities, logic, and data access mechanisms within the Temboplus-Afloat ecosystem.
3
+ A foundational JavaScript/TypeScript library for TemboPlus-Afloat projects, providing abstracted server communication, shared utilities, and standardized data models for consistent development.
6
4
 
7
5
  ## Key Features
8
6
 
@@ -22,7 +20,7 @@ This JavaScript/TypeScript package provides a central hub for shared utilities,
22
20
 
23
21
  * **Cross-Environment Compatibility**
24
22
  * Works seamlessly in both client-side and server-side environments
25
- * Supports both synchronous and asynchronous initialization patterns
23
+ * Different patterns for client-side authentication management vs server-side token handling
26
24
 
27
25
  ## Usage
28
26
 
@@ -30,7 +28,7 @@ This JavaScript/TypeScript package provides a central hub for shared utilities,
30
28
 
31
29
  #### Client-Side Usage
32
30
 
33
- In client-side applications, authentication is initialized synchronously:
31
+ In client-side applications, use the `AfloatAuth` singleton for authentication management:
34
32
 
35
33
  ```typescript
36
34
  import { AfloatAuth } from "@temboplus/afloat";
@@ -39,42 +37,67 @@ import { AfloatAuth } from "@temboplus/afloat";
39
37
  const auth = AfloatAuth.instance;
40
38
 
41
39
  // Check if user is authenticated
42
- console.log("User authenticated:", !!auth.currentUser);
40
+ console.log("User authenticated:", auth.isAuthenticated);
43
41
 
44
42
  // Access current user
45
43
  const user = auth.currentUser;
46
44
  if (user) {
47
45
  console.log(`Logged in as: ${user.email}`);
48
46
  }
47
+
48
+ // Login a user
49
+ try {
50
+ const user = await auth.logIn("user@example.com", "password123");
51
+ console.log("Login successful!");
52
+ } catch (error) {
53
+ console.error("Login failed:", error.message);
54
+ }
55
+
56
+ // Check permissions
57
+ if (auth.checkPermission(Permission.ViewBalance)) {
58
+ console.log("User can view balance");
59
+ }
60
+
61
+ // React hook for reactive user state
62
+ function UserProfile() {
63
+ const user = auth.useCurrentUser();
64
+
65
+ if (!user) {
66
+ return <LoginForm />;
67
+ }
68
+
69
+ return <div>Hello, {user.name}!</div>;
70
+ }
49
71
  ```
50
72
 
51
73
  #### Server-Side Usage
52
74
 
53
- In server-side environments, authentication requires asynchronous initialization:
75
+ In server-side environments, **do not use `AfloatAuth`**. Instead, extract the authentication token from requests and pass it directly to repositories:
54
76
 
55
77
  ```typescript
56
- import { AfloatAuth } from "@temboplus/afloat";
78
+ import { WalletRepository } from "@temboplus/afloat";
57
79
 
58
- // In a server route handler or similar context
80
+ // In a server route handler or API endpoint
59
81
  async function handleRequest(req, res) {
60
82
  try {
61
- // Extract token from request
83
+ // Extract token from request headers
62
84
  const token = req.headers.authorization?.replace('Bearer ', '');
63
85
 
64
86
  if (!token) {
65
87
  return res.status(401).json({ error: 'Unauthorized' });
66
88
  }
67
89
 
68
- // Initialize server-side auth
69
- const auth = await AfloatAuth.initializeServer(token);
90
+ // Create repository with explicit token
91
+ const walletRepo = new WalletRepository({ token });
70
92
 
71
- // Now you can use auth for permission checks
72
- const isAdmin = auth.checkPermission(Permissions.Payout.View);
93
+ // Use repository methods directly
94
+ const balance = await walletRepo.getBalance({ wallet });
95
+ const wallets = await walletRepo.getWallets();
73
96
 
74
- // Continue with your handler logic...
97
+ return res.json({ balance, wallets });
75
98
  } catch (error) {
76
- console.error('Authentication error:', error);
77
- return res.status(500).json({ error: 'Authentication failed' });
99
+ console.error('Server request error:', error);
100
+ return res.status(500).json({ error: 'Internal server error' });
78
101
  }
79
102
  }
80
103
  ```
@@ -86,54 +109,235 @@ Repositories provide a consistent interface for data operations across environme
86
109
  #### Client-Side Repository Usage
87
110
 
88
111
  ```typescript
89
- import { WalletRepo } from "@temboplus/afloat";
112
+ import { WalletRepository } from "@temboplus/afloat";
113
+
114
+ // Option 1: Let repository use service locator (default behavior)
115
+ const walletRepo = new WalletRepository();
90
116
 
91
- // Create repository - auth is automatically handled
92
- const walletRepo = new WalletRepo();
117
+ // Option 2: Explicitly pass token from auth manager
118
+ const auth = AfloatAuth.instance;
119
+ const walletRepo = new WalletRepository({ token: auth.getUserToken() });
93
120
 
94
121
  // Use repository methods
95
122
  async function displayBalance() {
96
123
  try {
97
- const balance = await walletRepo.getBalance();
98
- console.log(`Current balance: ${balance}`);
124
+ const balance = await walletRepo.getBalance({ wallet });
125
+ console.log(`Current balance: ${balance.value} ${balance.currency}`);
99
126
  } catch (error) {
100
127
  console.error('Error fetching balance:', error);
101
128
  }
102
129
  }
130
+
131
+ // Get all wallets
132
+ const wallets = await walletRepo.getWallets();
133
+
134
+ // Get wallet statement
135
+ const entries = await walletRepo.getStatement({
136
+ wallet,
137
+ range: {
138
+ startDate: new Date('2024-01-01'),
139
+ endDate: new Date('2024-01-31')
140
+ }
141
+ });
103
142
  ```
104
143
 
105
144
  #### Server-Side Repository Usage
106
145
 
107
146
  ```typescript
108
- import { AfloatAuth, WalletRepo } from "@temboplus/afloat";
147
+ import { WalletRepository } from "@temboplus/afloat";
109
148
 
110
- async function processServerRequest(token) {
111
- // Initialize auth for this request
112
- const auth = await AfloatAuth.initializeServer(token);
113
-
114
- // Create repository with explicit auth instance
115
- const walletRepo = new WalletRepo({ auth });
149
+ async function processServerRequest(token: string) {
150
+ // Create repository with explicit token (no auth manager needed)
151
+ const walletRepo = new WalletRepository({ token });
116
152
 
117
- // Use repository methods
118
- const balance = await walletRepo.getBalance();
153
+ // Use repository methods directly
154
+ const balance = await walletRepo.getBalance({ wallet });
119
155
  const wallets = await walletRepo.getWallets();
120
156
 
121
157
  return { balance, wallets };
122
158
  }
159
+
160
+ // In Express.js middleware
161
+ app.use('/api/wallet', async (req, res, next) => {
162
+ const token = extractTokenFromRequest(req);
163
+
164
+ if (!token) {
165
+ return res.status(401).json({ error: 'No token provided' });
166
+ }
167
+
168
+ req.walletRepo = new WalletRepository({ token });
169
+ next();
170
+ });
123
171
  ```
124
172
 
173
+ ## Architecture Overview
174
+
175
+ ### Client-Side Pattern
176
+ - **Authentication Management**: Use `AfloatAuth.instance` singleton
177
+ - **Repository Creation**: Can use service locator or explicit token passing
178
+ - **State Management**: Reactive updates through React hooks
179
+ - **Permission Checking**: Built into the auth manager
180
+
181
+ ### Server-Side Pattern
182
+ - **No Auth Manager**: Extract tokens directly from requests
183
+ - **Repository Creation**: Always pass token explicitly
184
+ - **Stateless**: Each request creates fresh repository instances
185
+ - **Permission Checking**: Handle at route/middleware level
186
+
125
187
  ## Best Practices
126
188
 
127
- 1. **Client-Side Applications**
128
- - Initialize `AfloatAuth.instance` early in your application lifecycle
129
- - Create repositories without explicit auth parameters
130
- - Handle permission errors appropriately in your UI
189
+ ### Client-Side Applications
190
+
191
+ 1. **Initialize Early**: Set up `AfloatAuth.instance` early in your application lifecycle
192
+ 2. **Use React Hooks**: Leverage `auth.useCurrentUser()` for reactive UI updates
193
+ 3. **Handle Permissions**: Check permissions before attempting restricted operations
194
+ 4. **Error Handling**: Implement proper error handling for authentication failures
195
+
196
+ ```typescript
197
+ // Good: Initialize auth early
198
+ const auth = AfloatAuth.instance;
199
+
200
+ // Good: Use reactive hooks in components
201
+ function Dashboard() {
202
+ const user = auth.useCurrentUser();
203
+
204
+ if (!user) return <LoginPrompt />;
205
+
206
+ return <UserDashboard user={user} />;
207
+ }
208
+
209
+ // Good: Check permissions before operations
210
+ if (auth.checkPermission(Permission.ViewBalance)) {
211
+ const repo = new WalletRepository();
212
+ const balance = await repo.getBalance({ wallet });
213
+ }
214
+ ```
215
+
216
+ ### Server-Side Applications
217
+
218
+ 1. **Token Extraction**: Always extract and validate tokens from requests
219
+ 2. **Explicit Dependencies**: Pass tokens explicitly to repositories
220
+ 3. **Error Handling**: Implement proper middleware for authentication errors
221
+ 4. **Stateless Design**: Create fresh repository instances per request
222
+
223
+ ```typescript
224
+ // Good: Extract token from request
225
+ const token = req.headers.authorization?.replace('Bearer ', '');
226
+
227
+ // Good: Explicit token passing
228
+ const repo = new WalletRepository({ token });
229
+
230
+ // Good: Middleware pattern
231
+ const authMiddleware = (req, res, next) => {
232
+ const token = extractToken(req);
233
+
234
+ if (!token) {
235
+ return res.status(401).json({ error: 'Unauthorized' });
236
+ }
237
+
238
+ req.authToken = token;
239
+ next();
240
+ };
241
+
242
+ // Good: Use in route handlers
243
+ app.get('/api/balance', authMiddleware, async (req, res) => {
244
+ const repo = new WalletRepository({ token: req.authToken });
245
+ const balance = await repo.getBalance({ wallet });
246
+ res.json({ balance });
247
+ });
248
+ ```
249
+
250
+ ### Testing
251
+
252
+ 1. **Client-Side**: Mock the `AfloatAuth` singleton or use dependency injection
253
+ 2. **Server-Side**: Mock repositories with test tokens
254
+ 3. **Integration**: Test both authentication flows and repository operations
255
+
256
+ ```typescript
257
+ // Client-side testing
258
+ const mockAuth = {
259
+ currentUser: testUser,
260
+ getUserToken: () => 'test-token',
261
+ checkPermission: () => true
262
+ };
263
+
264
+ // Server-side testing
265
+ const testRepo = new WalletRepository({ token: 'test-token' });
266
+ ```
267
+
268
+ ## Troubleshooting
269
+
270
+ ### Common Issues
271
+
272
+ #### `"Cannot find package 'react'" in Node.js`
273
+
274
+ This error occurs when using Zustand v5. Ensure you're using Zustand v4:
275
+ ```bash
276
+ npm install zustand@^4.5.7
277
+ ```
278
+
279
+ Remove any existing v5 installation:
280
+ ```bash
281
+ npm uninstall zustand@5.x.x
282
+ ```
283
+
284
+ #### Authentication Errors in Server Environment
285
+
286
+ **Problem**: Trying to use `AfloatAuth.instance` in server-side code
287
+ **Solution**: Extract tokens from requests and pass directly to repositories
288
+
289
+ ```typescript
290
+ // ❌ Don't do this in server code
291
+ const auth = AfloatAuth.instance; // This is client-side only!
292
+
293
+ // ✅ Do this instead
294
+ const token = req.headers.authorization?.replace('Bearer ', '');
295
+ const repo = new WalletRepository({ token });
296
+ ```
297
+
298
+ #### Repository Token Issues
299
+
300
+ **Problem**: Repository calls failing with authentication errors
301
+ **Solution**: Ensure tokens are properly extracted and passed
302
+
303
+ ```typescript
304
+ // ❌ Missing token
305
+ const repo = new WalletRepository(); // May fail in server context
306
+
307
+ // ✅ Explicit token
308
+ const repo = new WalletRepository({ token: extractedToken });
309
+ ```
310
+
311
+ ### Debug Information
312
+
313
+ Use the auth manager's debug utilities for troubleshooting:
314
+
315
+ ```typescript
316
+ // Client-side debugging
317
+ const debugInfo = AfloatAuth.instance.getDebugInfo();
318
+ console.log('Auth Debug Info:', debugInfo);
319
+ ```
320
+
321
+ ## API Reference
322
+
323
+ ### AfloatAuth (Client-Side Only)
324
+
325
+ - `AfloatAuth.instance` - Singleton instance for client-side usage
326
+ - `currentUser` - Get current authenticated user
327
+ - `isAuthenticated` - Check authentication status
328
+ - `getUserToken()` - Get current auth token
329
+ - `useCurrentUser()` - React hook for reactive user state
330
+ - `checkPermission(perm)` - Check user permissions
331
+ - `logIn(email, password)` - Authenticate user
332
+ - `logOut()` - Clear authentication state
333
+ - `resetPassword(current, new)` - Update user password
334
+
335
+ ### Repository Pattern
131
336
 
132
- 2. **Server-Side Applications**
133
- - Always use `await AfloatAuth.initializeServer(token)` for each request
134
- - Pass the auth instance explicitly to repositories
135
- - Implement proper error handling for authentication failures
337
+ All repositories accept optional configuration:
338
+ - `token` - Authentication token for API calls
339
+ - `root` - Custom API root URL
136
340
 
137
- 3. **Testing**
138
- - Use the `AuthContext` to inject mock auth instances during testing
139
- - Reset `AuthContext.current` after each test to prevent test pollution
341
+ Example repositories:
342
+ - `WalletRepository` - Wallet operations and balance management
343
+ - `AuthRepository` - Authentication operations
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("zod"),t=require("uuid"),r=require("@temboplus/frontend-core");function o(e){return e&&e.__esModule?e:{default:e}}var a=o(e);class n extends Error{statusCode;error;details;constructor(e){super(e.message),this.name="ApiError",this.statusCode=e.statusCode,this.error&&(this.error=e.error),e.details&&(this.details=e.details)}static is(e){return n.schema.safeParse(e).success}static unknown(e){return new n({message:e??"An unknown error occurred",statusCode:502})}static get schema(){return e.z.object({message:e.z.string(),statusCode:e.z.number().int(),error:e.z.string().optional(),details:e.z.object({}).optional()})}}const s={Profile:{ViewCurrent:"profile.getCurrent",Update:"profile.update"},Contact:{View:"contact.findById",List:"contact.findAll",Create:"contact.create",Update:"contact.update",Delete:"contact.delete"},Payment:{View:"payment.findById",List:"payment.findAll",Create:"payment.create"},Payout:{View:"payout.findById",List:"payout.findAll",Create:"payout.create",Approve:"payout.approve"},Transfer:{View:"transfer.findById",List:"transfer.findAll",Create:"transfer.create",Approve:"transfer.approve"},Wallet:{ViewBalance:"wallet.getBalance",ViewStatement:"wallet.getStatement"},Role:{ViewRoles:"role.findAll",ViewRole:"role.findById"},TeamManagement:{ViewMembers:"login.findAll",ViewMember:"login.findById",CreateMember:"login.create",UpdateMember:"login.update",ArchiveMember:"login.archive",UnArchiveMember:"login.unarchive",ResetPassword:"login.resetPassword"}};class i extends Error{requiredPermissions;constructor(e){super(e.message??`Missing required permissions: ${e.requiredPermissions.join(", ")}`),this.name="PermissionError",this.requiredPermissions=e.requiredPermissions}static is(t){const r=e.z.union([e.z.enum(Object.values(s.Profile)),e.z.enum(Object.values(s.Contact)),e.z.enum(Object.values(s.Payment)),e.z.enum(Object.values(s.Payout)),e.z.enum(Object.values(s.Transfer)),e.z.enum(Object.values(s.Wallet))]);return e.z.object({name:e.z.literal("PermissionError").nullish(),message:e.z.string(),requiredPermissions:e.z.array(r)}).safeParse(t).success}}const c=e=>"function"==typeof(null==e?void 0:e.passthrough);e.z.object({name:e.z.literal("ZodError"),issues:e.z.array(e.z.object({path:e.z.array(e.z.union([e.z.string(),e.z.number()])),message:e.z.string().optional(),code:e.z.nativeEnum(e.z.ZodIssueCode)}).catchall(e.z.any()))});const u=Symbol("ContractNoBody"),d=e=>"method"in e&&"path"in e,l=(e,t)=>Object.fromEntries(Object.entries(e).map(([e,r])=>{var o,a,n,s,i;return d(r)?[e,{...r,path:(null==t?void 0:t.pathPrefix)?t.pathPrefix+r.path:r.path,headers:(s=null==t?void 0:t.baseHeaders,i=r.headers,c(s)?c(i)?s.merge(i):s:c(i)?i:Object.assign({},s,i)),strictStatusCodes:null!==(o=r.strictStatusCodes)&&void 0!==o?o:null==t?void 0:t.strictStatusCodes,validateResponseOnClient:null!==(a=r.validateResponseOnClient)&&void 0!==a?a:null==t?void 0:t.validateResponseOnClient,responses:{...null==t?void 0:t.commonResponses,...r.responses},metadata:(null==t?void 0:t.metadata)?{...null==t?void 0:t.metadata,...null!==(n=r.metadata)&&void 0!==n?n:{}}:r.metadata}]:[e,l(r,t)]})),m=Symbol("ContractPlainType"),p=()=>({router:(e,t)=>l(e,t),query:e=>e,mutation:e=>e,responses:e=>e,response:()=>m,body:()=>m,type:()=>m,otherResponse:({contentType:e,body:t})=>({contentType:e,body:t}),noBody:()=>u}),h=e=>e?Object.entries(e).filter(([,e])=>void 0!==e).map(([e,t])=>{let r;return r="string"==typeof t&&!["true","false","null"].includes(t.trim())&&isNaN(Number(t))?t:JSON.stringify(t),`${encodeURIComponent(e)}=${encodeURIComponent(r)}`}).join("&"):"",f=e=>e?Object.keys(e).flatMap(t=>y(t,e[t])).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join("&"):"",y=(e,t)=>Array.isArray(t)?t.flatMap((t,r)=>y(`${e}[${r}]`,t)):t instanceof Date?[[`${e}`,t.toISOString()]]:null===t?[[`${e}`,""]]:void 0===t?[]:"object"==typeof t?Object.keys(t).flatMap(r=>y(`${e}[${r}]`,t[r])):[[`${e}`,`${t}`]];class g extends Error{constructor(e,t){super(`Server returned unexpected response. Expected one of: ${t.join(",")} got: ${e.status}`),this.response=e}}const N=async({route:e,path:t,method:r,headers:o,body:a,validateResponse:n,fetchOptions:s})=>{const i=await fetch(t,{...s,method:r,headers:o,body:a}),c=i.headers.get("content-type");if((null==c?void 0:c.includes("application/"))&&(null==c?void 0:c.includes("json"))){const t={status:i.status,body:await i.json(),headers:i.headers},r=e.responses[t.status];return(null!=n?n:e.validateResponseOnClient)&&"function"==typeof(null==(u=r)?void 0:u.safeParse)?{...t,body:r.parse(t.body)}:t}var u;return(null==c?void 0:c.includes("text/"))?{status:i.status,body:await i.text(),headers:i.headers}:{status:i.status,body:await i.blob(),headers:i.headers}},b=e=>{const t=new FormData,r=(e,r)=>{r instanceof File?t.append(e,r):t.append(e,JSON.stringify(r))};return Object.entries(e).forEach(([e,t])=>{if(Array.isArray(t))for(const o of t)r(e,o);else r(e,t)}),t},w=e=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e.toLowerCase(),t])),v=(e,t,r,o,a)=>{const n=(({path:e,params:t})=>{const r=t;return e.replace(/\/?:([^/?]+)\??/g,(e,t)=>r[t]?`${e.startsWith("/")?"/":""}${r[t]}`:"")})({path:o.path,params:r}),s=((e,t=!1)=>{const r=t?h(e):f(e);return(null==r?void 0:r.length)>0?"?"+r:""})(e,a);return`${t}${n}${s}`},S=(e,t)=>{const r=Object.keys(e.responses);return async o=>{const a=((e,t,r)=>{const{query:o,params:a,body:n,headers:s,extraHeaders:i,overrideClientOptions:c,fetchOptions:u,cache:d,next:l,...m}=r||{},p={...t,...c};return{path:v(o,p.baseUrl,a,e,!!p.jsonQuery),clientArgs:p,route:e,body:n,query:o,extraInputArgs:m,fetchOptions:{...d&&{cache:d},...l&&{next:l},...u},headers:{...i,...s}}})(e,t,o),n=await(e=>{const{path:t,clientArgs:r,route:o,body:a,query:n,extraInputArgs:s,headers:i,fetchOptions:c}=e,u=r.api||N,d=r.baseHeaders&&Object.fromEntries(Object.entries(r.baseHeaders).map(([t,r])=>"function"==typeof r?[t,r(e)]:[t,r])),l={...d&&w(d),...w(i)};Object.keys(l).forEach(e=>{void 0===l[e]&&delete l[e]});let m={route:o,path:t,method:o.method,headers:l,body:void 0,rawBody:a,rawQuery:n,contentType:void 0,validateResponse:r.validateResponse,fetchOptions:{...r.credentials&&{credentials:r.credentials},...c},...(null==c?void 0:c.signal)&&{signal:c.signal},...(null==c?void 0:c.cache)&&{cache:c.cache},...c&&"next"in c&&!!(null==c?void 0:c.next)&&{next:c.next}};return"GET"!==o.method&&("contentType"in o&&"multipart/form-data"===o.contentType?m={...m,contentType:"multipart/form-data",body:a instanceof FormData?a:b(a)}:"contentType"in o&&"application/x-www-form-urlencoded"===o.contentType?m={...m,contentType:"application/x-www-form-urlencoded",headers:{"content-type":"application/x-www-form-urlencoded",...m.headers},body:"string"==typeof a?a:new URLSearchParams(a)}:null!=a&&(m={...m,contentType:"application/json",headers:{"content-type":"application/json",...m.headers},body:JSON.stringify(a)})),u({...m,...s})})(a);if(!t.throwOnUnknownStatus)return n;if(r.includes(n.status.toString()))return n;throw new g(n,r)}},O=(e,t)=>Object.fromEntries(Object.entries(e).map(([e,r])=>d(r)?[e,S(r,t)]:[e,O(r,t)]));let A;class C{contract;endpoint;root;token;constructor(e,t,r){this.contract=t,this.endpoint=e,this.root=r?.root,this.token=r?.token}getToken(){if(this.token&&this.token.trim().length>0)return this.token;if(A){const e=A();if(e&&e.trim().length>0)return e}return""}get client(){const e={baseUrl:this.root?`${this.root}/${this.endpoint}`:`https://api.afloat.money/v1/${this.endpoint}`,baseHeaders:{token:this.getToken(),"x-request-id":t.v4()}};return O(this.contract,e)}setToken(e){this.token=e}getCurrentToken(){return this.token}handleResponse(e,t){if(e.status===t)return e.body;if(400===e.status){const t=a.default.object({statusCode:a.default.number(),message:a.default.string(),error:a.default.string(),details:a.default.record(a.default.string()).optional()}).safeParse(e.body);if(t.success)throw new n(t.data);throw new n({message:"Bad request",statusCode:400,error:"BAD_REQUEST"})}if(401===e.status)throw new n({message:"You are not authenticated to perform this action. Please login again",statusCode:401,error:"UNAUTHORIZED"});if(403===e.status)throw new n({message:"You are not authorized to perform this action.",statusCode:403,error:"FORBIDDEN"});if(404===e.status)throw new n({message:"The requested resource was not found.",statusCode:404,error:"NOT_FOUND"});throw new n({message:"We encountered an error trying to process your request. Please try again later",statusCode:520,error:"UNKNOWN_ERROR"})}}var P,I;exports.FilterOperator=void 0,(P=exports.FilterOperator||(exports.FilterOperator={})).EQUALS="eq",P.NOT_EQUALS="neq",P.LESS_THAN="lt",P.LESS_THAN_OR_EQUAL="lte",P.GREATER_THAN="gt",P.GREATER_THAN_OR_EQUAL="gte",P.LIKE="like",P.LIKE_LOWER="likeLower",P.IS_NULL="isNull",P.IS_NOT_NULL="isNotNull",P.IN="in",exports.SortDirection=void 0,(I=exports.SortDirection||(exports.SortDirection={})).ASC="asc",I.DESC="desc";const z=Symbol("query-builder-type");class _{options={filters:[],sort:[],includes:[],groupBy:[],join:[],count:"*",page:1,limit:8};constructor(e={}){this.options={filters:e.filters||[],sort:e.sort||[],includes:e.includes||[],groupBy:e.groupBy||[],join:e.join||[],page:e.page,limit:e.limit}}[z]="query-builder";static is(e){return null!==e&&"object"==typeof e&&z in e&&"query-builder"===e[z]}addFilter(e){return this.options.filters=[...this.options.filters||[],e],this}where(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.EQUALS,value:t})}whereNot(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.NOT_EQUALS,value:t})}whereLike(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LIKE,value:t})}whereLikeLower(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LIKE_LOWER,value:t})}whereContains(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LIKE_LOWER,value:`%${t}%`})}whereStartsWith(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LIKE_LOWER,value:`${t}%`})}whereEndsWith(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LIKE_LOWER,value:`%${t}`})}whereIn(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.IN,value:t})}whereNull(e){return this.addFilter({field:e,operator:exports.FilterOperator.IS_NULL})}whereNotNull(e){return this.addFilter({field:e,operator:exports.FilterOperator.IS_NOT_NULL})}whereGreaterThan(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.GREATER_THAN,value:t})}whereGreaterThanOrEqual(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.GREATER_THAN_OR_EQUAL,value:t})}whereLessThan(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LESS_THAN,value:t})}whereLessThanOrEqual(e,t){return this.addFilter({field:e,operator:exports.FilterOperator.LESS_THAN_OR_EQUAL,value:t})}whereBetween(e,t,r){return this.whereGreaterThanOrEqual(e,t).whereLessThanOrEqual(e,r)}whereDateBetween(e,t){if(e){const t=e instanceof Date?e.toISOString():e;this.whereGreaterThanOrEqual("createdAt",t)}if(t){const e=t instanceof Date?t.toISOString():t;this.whereLessThanOrEqual("createdAt",e)}return this}addSort(e){return this.options.sort=[...this.options.sort||[],e],this}orderBy(e,t=exports.SortDirection.ASC){return this.addSort({field:e,direction:t})}orderByAsc(e){return this.orderBy(e,exports.SortDirection.ASC)}orderByDesc(e){return this.orderBy(e,exports.SortDirection.DESC)}paginate(e,t){return this.options.page=e,this.options.limit=t,this}with(e){const t=Array.isArray(e)?e:[e];return this.options.includes=[...this.options.includes||[],...t],this}join(e){const t=Array.isArray(e)?e:[e];return this.options.join=[...this.options.join||[],...t],this}groupBy(e){const t=Array.isArray(e)?e:[e];return this.options.groupBy=[...this.options.groupBy||[],...t],this}count(e="*"){return this.options.count=e,this}countAs(e,t){return this.options.count=`${e} as ${t}`,this}build(){const e={};if(void 0!==this.options.page&&void 0!==this.options.limit){const t=(this.options.page-1)*this.options.limit,r=t+this.options.limit-1;e.rangeStart=t,e.rangeEnd=r}if(this.options.filters&&this.options.filters.length>0)for(const t of this.options.filters)switch(t.operator){case exports.FilterOperator.IS_NULL:e[`${t.field}:isNull`]=1;break;case exports.FilterOperator.IS_NOT_NULL:e[`${t.field}:notNull`]=1;break;case exports.FilterOperator.IN:e[`${t.field}:in`]=Array.isArray(t.value)?t.value.join(","):t.value;break;case exports.FilterOperator.LIKE:e[`${t.field}:like`]=t.value;break;case exports.FilterOperator.LIKE_LOWER:e[`${t.field}:likeLower`]=t.value;break;case exports.FilterOperator.GREATER_THAN_OR_EQUAL:e[`${t.field}:gte`]=t.value;break;case exports.FilterOperator.LESS_THAN_OR_EQUAL:e[`${t.field}:lte`]=t.value;break;default:e[`${t.field}:${t.operator}`]=t.value}if(this.options.sort&&this.options.sort.length>0){const t=[],r=[];for(const e of this.options.sort)e.direction===exports.SortDirection.ASC?t.push(e.field):r.push(e.field);t.length>0&&(e.orderBy=t.join(",")),r.length>0&&(e.orderByDesc=r.join(","))}return this.options.includes&&this.options.includes.length>0&&(1===this.options.includes.length?e.eager=this.options.includes[0]:e.eager=`[${this.options.includes.join(",")}]`),this.options.join&&this.options.join.length>0&&(e.join=this.options.join.join(",")),this.options.groupBy&&this.options.groupBy.length>0&&(e.groupBy=this.options.groupBy.join(",")),this.options.count&&(e.count=this.options.count),e}clone(){return new(0,this.constructor)({...this.options,filters:this.options.filters?[...this.options.filters]:[],sort:this.options.sort?[...this.options.sort]:[],includes:this.options.includes?[...this.options.includes]:[],groupBy:this.options.groupBy?[...this.options.groupBy]:[],join:this.options.join?[...this.options.join]:[]})}static create(e){return new _(e)}}const E=e.z.object({page:e.z.coerce.number().int().min(1).default(1),limit:e.z.coerce.number().int().min(1).max(100).default(10)}),x=e.z.object({page:e.z.number().int().min(1),limit:e.z.number().int().min(1),total:e.z.number().int().min(0),totalPages:e.z.number().int().min(0),hasNext:e.z.boolean(),hasPrev:e.z.boolean()});class R{page;limit;total;constructor(e,t,r){if(this.page=e,this.limit=t,this.total=r,e<1)throw new Error("Page must be >= 1");if(t<1)throw new Error("Limit must be >= 1");if(r<0)throw new Error("Total must be >= 0")}get totalPages(){return Math.ceil(this.total/this.limit)}get hasNext(){return this.page<this.totalPages}get hasPrev(){return this.page>1}get offset(){return(this.page-1)*this.limit}get isFirstPage(){return 1===this.page}get isLastPage(){return this.page===this.totalPages}nextPage(){return this.hasNext?new R(this.page+1,this.limit,this.total):null}prevPage(){return this.hasPrev?new R(this.page-1,this.limit,this.total):null}toJSON(){return{page:this.page,limit:this.limit,total:this.total,totalPages:this.totalPages,hasNext:this.hasNext,hasPrev:this.hasPrev}}}const D={profileDTOSchema:e.z.object({id:e.z.string(),firstName:e.z.string().nullish(),lastName:e.z.string().nullish(),displayName:e.z.string(),phone:e.z.string().nullish(),accountNo:e.z.string().min(1),email:e.z.string().email().nullish(),autoApprove:e.z.boolean().nullish()})},T=e.z.object({id:e.z.string(),firstName:e.z.string().nullable().optional(),lastName:e.z.string().nullable().optional(),displayName:e.z.string(),phone:e.z.string().nullable().optional(),accountNo:e.z.string(),email:e.z.string().nullable().optional(),autoApprove:e.z.boolean().nullable().optional(),version:e.z.string().optional().default("1.0")});class B{_id;_firstName;_lastName;_displayName;_phone;_accountNo;_email;_autoApprove;static get schema(){return D.profileDTOSchema}constructor(e){this._id=e.id,this._firstName=e.firstName,this._lastName=e.lastName,this._displayName=e.displayName,this._phone=e.phone,this._accountNo=e.accountNo,this._email=e.email,this._autoApprove=e.autoApprove}static create(e){return new B({id:e.id,firstName:e.firstName,lastName:e.lastName,displayName:e.displayName,phone:e.phone,accountNo:e.accountNo,email:e.email,autoApprove:e.autoApprove})}get id(){return this._id}get firstName(){return this._firstName}get lastName(){return this._lastName}get displayName(){return this._displayName}get phone(){return this._phone}get accountNo(){return this._accountNo}get email(){return this._email}get autoApprove(){return this._autoApprove}getName(){if(this._displayName&&""!==this._displayName.trim())return this._displayName;return`${this._firstName??""} ${this._lastName??""}`.trim()}validate(){try{return B.schema.safeParse(this.toJSON()).success}catch(e){return console.error("Profile validation error:",e),!1}}static from(e){try{return e?"object"!=typeof e?void console.error("Data is not an object"):e.id&&e.accountNo&&e.displayName?B.create({id:e.id,firstName:e.firstName,lastName:e.lastName,displayName:e.displayName,phone:e.phone,accountNo:e.accountNo,email:e.email,autoApprove:e.autoApprove}):void console.error("Missing required profile fields"):void console.error("Data is null or undefined")}catch(e){return void console.error("Error creating profile from object:",e)}}static is(e){if(!e||"object"!=typeof e)return!1;const t=e;if("string"!=typeof t._id||"string"!=typeof t._displayName||"string"!=typeof t._accountNo)return!1;if(null!==t._firstName&&void 0!==t._firstName&&"string"!=typeof t._firstName)return!1;if(null!==t._lastName&&void 0!==t._lastName&&"string"!=typeof t._lastName)return!1;if(null!==t._email&&void 0!==t._email&&"string"!=typeof t._email)return!1;const r=t._phone;if(null!=r&&"string"!=typeof r)return!1;const o=t._autoApprove;return null==o||"boolean"==typeof o}toJSON(){return{id:this._id,firstName:this._firstName,lastName:this._lastName,displayName:this._displayName,phone:this._phone,accountNo:this._accountNo,email:this._email,autoApprove:this._autoApprove,version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=T.safeParse(t);if(!r.success)return void console.error("Invalid ProfileJSON:",r.error.flatten());const o=r.data;return B.from(o)}catch(e){return void console.error("Error parsing ProfileJSON:",e)}}static isProfileJSON(e){return T.safeParse(e).success}}const M={loginDTO:a.default.object({id:a.default.string().min(1,"ID is required"),profileId:a.default.string().min(1,"Profile ID is required"),name:a.default.string().min(1,"Name is required"),identity:a.default.string().email("Identity must be a valid email address"),type:a.default.string().min(1,"Type is required"),roleId:a.default.string().min(1,"Role ID is required"),isActive:a.default.boolean(),isArchived:a.default.boolean(),resetPassword:a.default.boolean(),createdAt:a.default.string().datetime("Invalid creation timestamp"),updatedAt:a.default.string().datetime("Invalid update timestamp"),access:a.default.array(a.default.string())})},J=e.z.object({id:e.z.string(),profileId:e.z.string(),name:e.z.string(),identity:e.z.string(),type:e.z.string(),roleId:e.z.string(),isActive:e.z.boolean(),isArchived:e.z.boolean(),resetPassword:e.z.boolean(),createdAt:e.z.string(),updatedAt:e.z.string(),access:e.z.array(e.z.string()),version:e.z.string().optional().default("1.0")});class j{_id;_profileId;_name;_identity;_type;_roleId;_isActive;_isArchived;_resetPassword;_createdAt;_updatedAt;_access;constructor(e,t,r,o,a,n,s,i,c,u,d,l){this._id=e,this._profileId=t,this._name=r,this._identity=o,this._type=a,this._roleId=n,this._isActive=s,this._isArchived=i,this._resetPassword=c,this._createdAt=u,this._updatedAt=d,this._access=l}static from(e){const t=M.loginDTO.parse(e);return new j(t.id,t.profileId,t.name,t.identity,t.type,t.roleId,t.isActive,t.isArchived,t.resetPassword,new Date(t.createdAt),new Date(t.updatedAt),t.access)}get id(){return this._id}get profileId(){return this._profileId}get name(){return this._name}get identity(){return this._identity}get type(){return this._type}get roleId(){return this._roleId}get isActive(){return this._isActive}get isArchived(){return this._isArchived}get resetPassword(){return this._resetPassword}get createdAt(){return this._createdAt}get updatedAt(){return this._updatedAt}get access(){return this._access}toJSON(){return{id:this._id,profileId:this._profileId,name:this._name,identity:this._identity,type:this._type,roleId:this._roleId,isActive:this._isActive,isArchived:this._isArchived,resetPassword:this._resetPassword,createdAt:this._createdAt.toISOString(),updatedAt:this._updatedAt.toISOString(),access:[...this._access],version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=J.safeParse(t);if(!r.success)return void console.error("Invalid LogInJSON:",r.error.flatten());const o=r.data;return j.from({id:o.id,profileId:o.profileId,name:o.name,identity:o.identity,type:o.type,roleId:o.roleId,isActive:o.isActive,isArchived:o.isArchived,resetPassword:o.resetPassword,createdAt:o.createdAt,updatedAt:o.updatedAt,access:o.access})}catch(e){return void console.error("Error parsing LogInJSON:",e)}}static isLogInJSON(e){return J.safeParse(e).success}}const F=a.default.object({id:a.default.string(),name:a.default.string(),description:a.default.string().optional(),access:a.default.array(a.default.string()),createdAt:a.default.string(),updatedAt:a.default.string(),version:a.default.string().optional().default("1.0")});class k{id;name;description;permissions;createdAt;updatedAt;constructor(e){this.id=e.id,this.name=e.name,this.description=e.description,this.permissions=new Set(e.access),this.createdAt=new Date(e.createdAt),this.updatedAt=new Date(e.updatedAt)}hasPermission(e){return this.permissions.has(e)}static from(e){try{if(!e?.id||!e?.name||!Array.isArray(e?.access))return;return new k(e)}catch(e){return void console.error("Error creating Role:",e)}}toJSON(){return{id:this.id,name:this.name,description:this.description,access:Array.from(this.permissions),createdAt:this.createdAt.toISOString(),updatedAt:this.updatedAt.toISOString(),version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=F.safeParse(t);if(!r.success)return void console.error("Invalid RoleJSON:",r.error.flatten());const o=r.data;return k.from({id:o.id,name:o.name,description:o.description,access:o.access,createdAt:o.createdAt,updatedAt:o.updatedAt})}catch(e){return void console.error("Error parsing RoleJSON:",e)}}static isRoleJSON(e){return F.safeParse(e).success}}const U=a.default.object({companyProfile:T,role:F.optional(),version:a.default.string().optional().default("1.0")});class ${_companyProfile;_role;constructor(e){this._companyProfile=e.companyProfile,this._role=e.role}static from(e){try{return B.is(e.companyProfile)?new $(e):void console.error("Invalid company profile")}catch(e){return void console.error("Error creating CompanyMembership:",e)}}get companyProfile(){return this._companyProfile}get role(){return this._role}toJSON(){return{companyProfile:this._companyProfile.toJSON(),role:this._role?.toJSON(),version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=U.safeParse(t);if(!r.success)return void console.error("Invalid CompanyMembershipJSON:",r.error.flatten());const o=r.data,a=B.fromJSON(o.companyProfile),n=o.role?k.fromJSON(o.role):void 0;return a?$.from({companyProfile:a,role:n}):void console.error("Failed to reconstruct Profile from CompanyMembershipJSON")}catch(e){return void console.error("Error parsing CompanyMembershipJSON:",e)}}static isCompanyMembershipJSON(e){return U.safeParse(e).success}}const L=a.default.object({logIn:J,companyProfile:T,role:F.optional(),token:a.default.string().min(1),version:a.default.string().optional().default("1.0")});class q{_logIn;_membership;_token;_permissionMap;constructor(e){this._logIn=e.logIn,this._membership=e.membership,this._token=e.token,this._permissionMap={},this._logIn.access.forEach(e=>{this._permissionMap[e]=!0})}static from(e){try{if(!e.logIn||!e.companyProfile||!e.token)return void console.error("Missing required User fields");if("string"!=typeof e.token||""===e.token.trim())return void console.error("Invalid token");const t=$.from({companyProfile:e.companyProfile,role:e.role});return t?new q({logIn:e.logIn,membership:t,token:e.token}):void console.error("Failed to create CompanyMembership")}catch(e){return void console.error("Error creating User:",e)}}get logIn(){return this._logIn}get membership(){return this._membership}get token(){return this._token}get id(){return this._logIn.id}get name(){return this._logIn.name}get identity(){return this._logIn.identity}get roleId(){return this._logIn.roleId}get resetPassword(){return this._logIn.resetPassword}get profile(){return this._membership.companyProfile}get role(){return this._membership.role}get access(){return this._logIn.access}can(e){return this._permissionMap[e]??!1}canAny(e){return e.some(e=>this.can(e))}canAll(e){return e.every(e=>this.can(e))}canManageTeam(){return this.can(s.TeamManagement.ViewMembers)}canViewRoles(){return this.can(s.Role.ViewRole)}toJSON(){return{logIn:this._logIn.toJSON(),companyProfile:this._membership.companyProfile.toJSON(),role:this._membership.role?.toJSON(),token:this._token,version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=L.safeParse(t);if(!r.success)return void console.error("Invalid UserJSON:",r.error.flatten());const o=r.data,a=j.fromJSON(o.logIn),n=B.fromJSON(o.companyProfile),s=o.role?k.fromJSON(o.role):void 0;if(!a||!n)return void console.error("Failed to reconstruct nested objects from UserJSON");if(!o.token||""===o.token.trim())return void console.error("Invalid token in UserJSON");const i=$.from({companyProfile:n,role:s});return i?new q({logIn:a,membership:i,token:o.token}):void console.error("Failed to create CompanyMembership from UserJSON")}catch(e){return void console.error("Error parsing UserJSON:",e)}}static isUserJSON(e){return L.safeParse(e).success}}const V=p().router({logIn:{method:"POST",path:"/login",body:e.z.object({type:e.z.string().default("password"),identity:e.z.string().email(),password:e.z.string()}),responses:{201:e.z.object({profile:D.profileDTOSchema,token:e.z.string(),access:e.z.array(e.z.string()),resetPassword:e.z.boolean()}),400:e.z.object({})}},access:{method:"GET",path:"/access",responses:{200:e.z.string().array()}},resetPassword:{method:"PUT",path:"/password",body:e.z.object({currentPassword:e.z.string(),newPassword:e.z.string()}),responses:{}}}),W=p().router({getUserCredentials:{method:"GET",path:"/me",responses:{200:M.loginDTO}}});class G extends C{constructor(e){super("login",W,e)}async getIdentity(){const e=await this.client.getUserCredentials();if(200===e.status)return e.body;throw new Error(`Failed to get user identity. Status: ${e.status}`)}}const H=e.z.string().min(8,"Password must be at least 8 characters long").max(128,"Password must not exceed 128 characters").regex(/[A-Z]/,"Password must contain at least one uppercase letter").regex(/[a-z]/,"Password must contain at least one lowercase letter").regex(/[0-9]/,"Password must contain at least one number").regex(/[!@#$%^&*()_+\-=\[\]{}|;:,.<>?]/,"Password must contain at least one special character (!@#$%^&*()_+-=[]{}|;:,.<>?)").refine(e=>![/(.)\1{2,}/,/123456|654321|abcdef|qwerty|password|admin|user/i,/^[0-9]+$/,/^[a-zA-Z]+$/].some(t=>t.test(e)),"Password contains weak patterns. Avoid repeated characters, common words, or simple sequences").refine(e=>!/(?:abc|bcd|cde|def|efg|fgh|ghi|hij|ijk|jkl|klm|lmn|mno|nop|opq|pqr|qrs|rst|stu|tuv|uvw|vwx|wxy|xyz|012|123|234|345|456|567|678|789)/i.test(e),"Password should not contain sequential characters").refine(e=>!/(?:qwer|wert|erty|rtyu|tyui|yuio|uiop|asdf|sdfg|dfgh|fghj|ghjk|hjkl|zxcv|xcvb|cvbn|vbnm)/i.test(e),"Password should not contain keyboard patterns"),Q=e.z.object({id:e.z.string().min(1),name:e.z.string().min(1,"Role name is required"),description:e.z.string().optional(),access:e.z.array(e.z.string()),createdAt:e.z.string().datetime("Invalid creation timestamp"),updatedAt:e.z.string().datetime("Invalid update timestamp")}),K=e.z.object({id:e.z.string().min(1),name:e.z.string().min(1,"Team member name is required"),identity:e.z.string().email("Invalid email address"),type:e.z.string().min(1,"Team member type is required"),profileId:e.z.string().min(1,"Profile ID is required"),roleId:e.z.string().min(1,"Role ID is required"),resetPassword:e.z.boolean(),isActive:e.z.boolean(),isArchived:e.z.boolean(),role:Q.optional(),createdAt:e.z.string().datetime("Invalid creation timestamp"),updatedAt:e.z.string().datetime("Invalid update timestamp")}),Y={role:Q,teamMember:K,teamMemberQueryParams:e.z.object({id:e.z.string().min(1).optional(),name:e.z.string().min(1).optional(),identity:e.z.string().email("Invalid email address").optional(),type:e.z.string().min(1).optional(),profileId:e.z.string().min(1).optional(),roleId:e.z.string().min(1).optional(),resetPassword:e.z.number().optional(),isActive:e.z.number().optional(),isArchived:e.z.number().optional(),createdAt:e.z.string().datetime("Invalid creation timestamp").optional(),updatedAt:e.z.string().datetime("Invalid update timestamp").optional(),eager:e.z.string().optional()}),createTeamMemberRequest:e.z.object({name:e.z.string().min(1,"Team member name is required"),identity:e.z.string().email("Valid email address is required"),password:H.optional(),roleId:e.z.string().optional(),resetPassword:e.z.boolean().optional()}),updateTeamMemberRequest:e.z.object({name:e.z.string().min(1,"Team member name cannot be empty").optional(),roleId:e.z.string().min(1,"Role ID cannot be empty").optional(),password:H.optional(),resetPassword:e.z.boolean().optional(),isActive:e.z.boolean().optional()}),resetPasswordRequest:e.z.object({newPassword:H.optional(),sendNotification:e.z.boolean().optional()}),createTeamMemberResponse:e.z.object({id:e.z.string(),name:e.z.string(),identity:e.z.string(),type:e.z.string(),profileId:e.z.string(),resetPassword:e.z.boolean(),roleId:e.z.string(),isActive:e.z.boolean(),isArchived:e.z.boolean(),createdAt:e.z.string().datetime(),updatedAt:e.z.string().datetime()}),password:H},Z=p().router({getTeamMembers:{method:"GET",path:"/login",query:Y.teamMemberQueryParams,responses:{200:e.z.array(Y.teamMember),401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()})},summary:"List all team members",description:"Retrieve a list of all team member accounts in the system"},getTeamMember:{method:"GET",path:"/login/:id",pathParams:e.z.object({id:e.z.string()}),query:Y.teamMemberQueryParams,responses:{200:Y.teamMember,401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Get team member details",description:"Retrieve detailed information about a specific team member"},createTeamMember:{method:"POST",path:"/login",body:Y.createTeamMemberRequest,responses:{201:Y.createTeamMemberResponse,400:e.z.object({message:e.z.string().optional(),errors:e.z.array(e.z.string()).optional()}),401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),409:e.z.object({message:e.z.string().optional()})},summary:"Create new team member",description:"Create a new team member account with specified role and permissions"},updateTeamMember:{method:"PATCH",path:"/login/:id",pathParams:e.z.object({id:e.z.string()}),body:Y.updateTeamMemberRequest,responses:{200:Y.teamMember,400:e.z.object({message:e.z.string().optional(),errors:e.z.array(e.z.string()).optional()}),401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Update team member",description:"Update team member information, role, status, or force password reset"},archiveTeamMember:{method:"POST",path:"/login/:id/archive",pathParams:e.z.object({id:e.z.string()}),body:e.z.object({}),responses:{200:Y.teamMember,401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Archive team member",description:"Archive (soft delete) a team member account"},unArchiveTeamMember:{method:"POST",path:"/login/:id/unarchive",pathParams:e.z.object({id:e.z.string()}),body:e.z.object({}),responses:{200:Y.teamMember,401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Unarchive team member",description:"Unarchive a previously archived team member account"},resetPassword:{method:"POST",path:"/login/:id/reset-password",pathParams:e.z.object({id:e.z.string()}),body:Y.resetPasswordRequest,responses:{200:e.z.object({success:e.z.boolean()}),400:e.z.object({message:e.z.string().optional()}),401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Reset team member password",description:"Reset a team member's password and optionally send notification"},getRoles:{method:"GET",path:"/role",responses:{200:e.z.array(Y.role),401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()})},summary:"List all roles",description:"Retrieve a list of all available roles in the system"},getRole:{method:"GET",path:"/role/:id",pathParams:e.z.object({id:e.z.string()}),responses:{200:Y.role,401:e.z.object({message:e.z.string().optional()}),403:e.z.object({message:e.z.string().optional()}),404:e.z.object({message:e.z.string().optional()})},summary:"Get role details",description:"Retrieve detailed information about a specific role"}}),X=a.default.object({id:a.default.string(),name:a.default.string(),identity:a.default.string(),type:a.default.string(),profileId:a.default.string(),roleId:a.default.string(),resetPassword:a.default.boolean(),isActive:a.default.boolean(),isArchived:a.default.boolean(),role:F.optional(),createdAt:a.default.string(),updatedAt:a.default.string(),version:a.default.string().optional().default("1.0")});class ee{id;name;identity;type;profileId;roleId;resetPassword;isActive;isArchived;role;createdAt;updatedAt;permissions;constructor(e){if(this.id=e.id,this.name=e.name,this.identity=e.identity,this.type=e.type,this.profileId=e.profileId,this.roleId=e.roleId,this.resetPassword=e.resetPassword,this.isActive=e.isActive,this.isArchived=e.isArchived,this.createdAt=new Date(e.createdAt),this.updatedAt=new Date(e.updatedAt),this.permissions=new Set(e.role?.access??[]),e.role)try{this.role=new k(e.role)}catch(e){}}static from(e){try{return e?.id&&e?.name&&e?.identity&&e?.roleId?new ee(e):void console.error("Missing required TeamMember fields:",e)}catch(e){return void console.error("Error creating TeamMember:",e)}}static fromJson(e){try{const t=JSON.parse(e);return ee.from(t)}catch(e){return void console.error("Error parsing TeamMember JSON:",e)}}static createMany(e){return e.map(e=>ee.from(e)).filter(Boolean)}can(e){return this.permissions.has(e)}canAny(e){return e.some(e=>this.permissions.has(e))}canAll(e){return e.every(e=>this.permissions.has(e))}isAccountActive(){return this.isActive}isAccountArchived(){return this.isArchived}needsPasswordReset(){return this.resetPassword}getAccountStatus(){return this.isArchived?{status:"archived",label:"Archived",color:"default",description:"Account has been archived and is no longer accessible"}:this.isActive?this.resetPassword?{status:"password_reset_required",label:"Password Reset Required",color:"warning",description:"User must reset their password on next login"}:{status:"active",label:"Active",color:"success",description:"Account is active and ready to use"}:{status:"inactive",label:"Inactive",color:"error",description:"Account has been deactivated by an administrator"}}getRoleName(){return this.role?.name??""}getCreatedDate(){return this.createdAt.toLocaleDateString()}getLastUpdateInfo(){const e=(new Date).getTime()-this.updatedAt.getTime(),t=Math.floor(e/864e5);return 0===t?"Today":1===t?"Yesterday":t<7?`${t} days ago`:t<30?`${Math.floor(t/7)} weeks ago`:this.updatedAt.toLocaleDateString()}toJSON(){return{id:this.id,name:this.name,identity:this.identity,type:this.type,profileId:this.profileId,roleId:this.roleId,resetPassword:this.resetPassword,isActive:this.isActive,isArchived:this.isArchived,role:this.role?.toJSON(),createdAt:this.createdAt.toISOString(),updatedAt:this.updatedAt.toISOString(),version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=X.safeParse(t);if(!r.success)return void console.error("Invalid TeamMemberJSON:",r.error.flatten());const o=r.data,a=o.role?{id:o.role.id,name:o.role.name,description:o.role.description,access:o.role.access,createdAt:o.role.createdAt,updatedAt:o.role.updatedAt}:void 0;return ee.from({id:o.id,name:o.name,identity:o.identity,type:o.type,profileId:o.profileId,roleId:o.roleId,resetPassword:o.resetPassword,isActive:o.isActive,isArchived:o.isArchived,role:a,createdAt:o.createdAt,updatedAt:o.updatedAt})}catch(e){return void console.error("Error parsing TeamMemberJSON:",e)}}static isTeamMemberJSON(e){return X.safeParse(e).success}static fromJSONArray(e){try{const t="string"==typeof e?JSON.parse(e):e;return Array.isArray(t)?t.map(e=>ee.fromJSON(e)).filter(e=>void 0!==e):(console.warn("fromJSONArray expects an array"),[])}catch(e){return console.error("Error parsing TeamMember JSON array:",e),[]}}static toJSONArray(e){return e.map(e=>e.toJSON())}}class te extends C{constructor(e){super("admin",Z,e)}async createTeamMember(e){const t=await this.client.createTeamMember({body:e});return this.handleResponse(t,201)}async updateTeamMember(e,t){const r=await this.client.updateTeamMember({params:{id:e},body:t}),o=this.handleResponse(r,200),a=ee.from(o);if(!a)throw new Error("Invalid team member data received from server");return a}async archiveTeamMember(e){const t=await this.client.archiveTeamMember({params:{id:e}}),r=this.handleResponse(t,200),o=ee.from(r);if(!o)throw new Error("Invalid team member data received from server");return o}async unArchiveTeamMember(e){const t=await this.client.unArchiveTeamMember({params:{id:e}}),r=this.handleResponse(t,200),o=ee.from(r);if(!o)throw new Error("Invalid team member data received from server");return o}async resetTeamMemberPassword(e,t={}){const r=await this.client.resetPassword({params:{id:e},body:t});return this.handleResponse(r,200)}async getAllTeamMembers(e={eager:"role"}){const t=await this.client.getTeamMembers({query:e}),r=this.handleResponse(t,200);return ee.createMany(r)}async getTeamMember(e,t={eager:"role"}){const r=await this.client.getTeamMember({params:{id:e},query:t}),o=this.handleResponse(r,200),a=ee.from(o);if(!a)throw new Error("Invalid team member data received from server");return a}async getAllRoles(){const e=await this.client.getRoles();return this.handleResponse(e,200).map(e=>{const t=k.from(e);if(!t)throw new Error("Invalid role data received from server");return t})}async getRole(e){const t=await this.client.getRole({params:{id:e}}),r=this.handleResponse(t,200),o=k.from(r);if(!o)throw new Error("Invalid role data received from server");return o}}var re;exports.BeneficiaryType=void 0,(re=exports.BeneficiaryType||(exports.BeneficiaryType={})).Bank="Bank",re.Mobile="Mobile";const oe=e.z.nativeEnum(exports.BeneficiaryType),ae=e.z.object({displayName:e.z.string().min(1,"Display name is required"),accountNo:e.z.string().min(1,"Account number is required"),channel:e.z.string().min(1,"Channel is required"),type:oe}),ne={beneficiaryDTO:e.z.object({id:e.z.string().min(1,"Beneficiary id is required"),profileId:e.z.string(),createdAt:e.z.string().datetime(),updatedAt:e.z.string().datetime()}).merge(ae),beneficiaryInputDTO:ae,beneficiaryType:oe},se=e.z.object({type:e.z.literal("Mobile"),name:e.z.string().min(1),phoneNumber:e.z.string().regex(/^\+[1-9]\d{6,14}$/),mnoId:e.z.string().min(1),version:e.z.string().optional().default("1.0")}),ie=e.z.object({type:e.z.literal("Bank"),accName:e.z.string().min(1),swiftCode:e.z.string().length(8),countryCode:e.z.string().length(2),accNo:e.z.string().min(1),version:e.z.string().optional().default("1.0")}),ce=e.z.discriminatedUnion("type",[se,ie]);class ue extends Error{context;constructor(e,t={}){super(e),this.context=t,this.name="BeneficiaryInfoError"}}class de{type;countryCode;constructor(e,t){this.type=e,this.countryCode=t}toJSONString(){return JSON.stringify(this.toJSON())}get isMobile(){return this.type===exports.BeneficiaryType.Mobile}get isBank(){return this.type===exports.BeneficiaryType.Bank}get displayName(){return this.accountName}}class le extends de{name;phoneNumber;mnoId;constructor(e,t,o){if(super(exports.BeneficiaryType.Mobile,t.countryCode),this.name=e,this.phoneNumber=t,!e?.trim())throw new ue("Name is required and cannot be empty",{operation:"constructor",countryCode:t.countryCode,phoneNumber:t.e164Format});if(!t?.validate())throw new ue("Invalid phone number",{operation:"constructor",countryCode:t.countryCode,phoneNumber:t.e164Format});if(r.MNOUtils.requiresExplicitMNO(t.countryCode)){if(!o)throw new ue(`MNO must be explicitly provided for phone numbers in ${t.countryCode} due to Mobile Number Portability`,{phoneNumber:t.e164Format,countryCode:t.countryCode,operation:"constructor"});if(!r.MNOUtils.isValidMNOForCountry(o,t.countryCode)){const e=r.MNOUtils.getCountryMNOs(t.countryCode).map(e=>e.id);throw new ue(`Invalid MNO ${o} for country ${t.countryCode}. Valid MNOs: ${e.join(", ")}`,{phoneNumber:t.e164Format,countryCode:t.countryCode,mnoId:o,operation:"constructor"})}this.mnoId=o}else{const e=r.MNOUtils.getMNOByPhoneNumber(t.e164Format,t.countryCode);if(!e?.id)throw new ue(`Failed to determine MNO for phone number ${t.e164Format}`,{phoneNumber:t.e164Format,countryCode:t.countryCode,operation:"constructor"});this.mnoId=e.id}}static from(e){try{return new le(e.name,e.phoneNumber,e.mnoId)}catch(e){return void console.error("Failed to create MobileBeneficiaryInfo:",e)}}static fromBeneficiaryDTO(e){if("Mobile"!==e.type)return;let t=e.accountNo;t.startsWith("+")||(t=`+${t}`);const o=r.PhoneNumber.from(t);if(!o)return void console.error(`Failed to parse phone number ${t}`);const a=o.countryCode;try{let t;if(r.MNOUtils.requiresExplicitMNO(a)){if(e.channel&&"string"==typeof e.channel){if(!r.MNOUtils.isValidMNOForCountry(e.channel,a))return void console.warn(`Invalid MNO ${e.channel} for country ${a}`);t=e.channel}}else if(t=r.MNOUtils.getMNOByPhoneNumber(o.e164Format,a)?.id,!t)return void console.warn(`Failed to auto-detect MNO for phone number ${o.e164Format}`);return le.from({name:e.displayName,phoneNumber:o,mnoId:t})}catch(e){return void console.error(`Failed to create MobileBeneficiaryInfo: ${e}`)}}static fromPayoutDTO(e){try{if(!r.CountryValidation.isISO2CountryCode(e.countryCode))return void console.error(`Invalid country code: ${e.countryCode}`);const t=r.PhoneNumber.from(e.msisdn,{defaultCountry:e.countryCode});if(!t)return void console.error(`Failed to parse phone number: ${e.msisdn}`);let o;if(r.MNOUtils.requiresExplicitMNO(t.countryCode)){if(e.channel&&"string"==typeof e.channel){if(!r.MNOUtils.isValidMNOForCountry(e.channel,t.countryCode))return void console.warn(`Invalid MNO ${e.channel} for country ${t.countryCode} in PayoutDTO`);o=e.channel}}else if(o=r.MNOUtils.getMNOByPhoneNumber(t.e164Format,t.countryCode)?.id,!o)return void console.warn(`Failed to auto-detect MNO for phone number ${t.e164Format}`);return le.from({name:e.payeeName,phoneNumber:t,mnoId:o})}catch(t){return void console.error("Failed to create MobileBeneficiaryInfo from PayoutDTO: ",e,t)}}static is(e){if(!e||"object"!=typeof e)return!1;const t=e;if("string"!=typeof t.name||!t.name.trim())return!1;let o;if("string"==typeof t.phoneNumber)o=r.PhoneNumber.from(t.phoneNumber);else if("object"==typeof t.phoneNumber){const e=t.phoneNumber;r.PhoneNumber.is(e)&&(o=r.PhoneNumber.from(e.e164Format))}if(!o)return!1;const a=t.mnoId;if("string"!=typeof a)return!1;if(!r.MNOUtils.isValidMNOForCountry(a,o.countryCode))return!1;if(r.MNOUtils.requiresExplicitMNO(o.countryCode))return!0;{const e=r.MNOUtils.getMNOByPhoneNumber(o.e164Format,o.countryCode);return e?.id===a}}validate(){try{return!!this.name?.trim()&&(!!this.phoneNumber?.validate()&&(!!r.MNOUtils.isValidMNOForCountry(this.mnoId,this.countryCode)&&(!!r.MNOUtils.requiresExplicitMNO(this.countryCode)||r.MNOUtils.validateMNOForPhoneNumber(this.phoneNumber.e164Format,this.mnoId,this.countryCode))))}catch{return!1}}getValidationDetails(){const e=[];if(this.name?.trim()||e.push("Name is required"),this.phoneNumber?.validate()||e.push("Phone number is invalid"),r.MNOUtils.isValidMNOForCountry(this.mnoId,this.countryCode)||e.push(`Invalid MNO ${this.mnoId} for country ${this.countryCode}`),!r.MNOUtils.requiresExplicitMNO(this.countryCode)){const t=r.MNOUtils.getMNOByPhoneNumber(this.phoneNumber.e164Format,this.countryCode);t?.id!==this.mnoId&&e.push("MNO doesn't match auto-detected value from phone number prefix")}return{isValid:0===e.length,errors:e,warnings:[]}}get accountName(){return this.name}get accountNumber(){return this.phoneNumber.getWithFormat(r.PhoneNumberFormat.E164)}get accountNameLabel(){return"Name"}get accountNumberLabel(){return"Phone Number"}get channelLabel(){return"Channel"}get channelId(){return this.mnoId}get channelName(){const e=r.MNOUtils.getMNOById(this.mnoId,this.countryCode);return e?.mobileMoneyService??e?.displayName??this.mnoId}toJSON(){return{type:"Mobile",name:this.name,phoneNumber:this.phoneNumber.e164Format,mnoId:this.mnoId,version:"1.0"}}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,o=se.safeParse(t);if(!o.success)return void console.error("Invalid MobileBeneficiaryInfoJSON:",o.error.flatten());const a=o.data,n=r.PhoneNumber.from(a.phoneNumber);if(!n?.validate())return void console.warn("Invalid phone number in JSON");if(!r.MNOUtils.isValidMNOForCountry(a.mnoId,n.countryCode))return void console.warn("Invalid MNO for country");if(!r.MNOUtils.requiresExplicitMNO(n.countryCode)){const e=r.MNOUtils.getMNOByPhoneNumber(n.e164Format,n.countryCode);if(e?.id!==a.mnoId)return void console.warn("MNO mismatch with auto-detected value")}return le.from({name:a.name,phoneNumber:n,mnoId:a.mnoId})}catch(e){return void console.error("Error parsing MobileBeneficiaryInfoJSON:",e)}}static fromJSONString(e){return le.fromJSON(e)}static isMobileBeneficiaryInfoJSON(e){return se.safeParse(e).success}}class me extends de{accName;bank;accNo;constructor(e,t,o){if(super(exports.BeneficiaryType.Bank,t.countryCode),this.accName=e,this.bank=t,this.accNo=o,!r.BankValidation.validateAccountName(e))throw new ue("Invalid account name",{operation:"constructor",countryCode:t.countryCode});if(!r.BankValidation.validateAccountNumber(o,t.countryCode))throw new ue("Invalid account number",{operation:"constructor",countryCode:t.countryCode})}static from(e){try{return new me(e.accName,e.bank,e.accNo)}catch(e){return void console.error("Failed to create BankBeneficiaryInfo:",e)}}static fromBeneficiaryDTO(e){if("Bank"!==e.type)return;const t=e.channel;if(!t||"string"!=typeof t)return void console.error("SWIFT code is required for bank beneficiaries");const o=r.BankValidation.getCountryFromSwiftCode(t);if(o)if(r.BankValidation.validateSwiftCode(t,o))try{const a=r.Bank.from(t,o);if(!a)throw new Error(`Bank with SWIFT code ${t} not found`);return me.from({accName:e.displayName,bank:a,accNo:e.accountNo})}catch(e){return void console.error(`Failed to create BankBeneficiaryInfo: ${e}`)}else console.error(`Invalid SWIFT code ${t} for country ${o}`);else console.error(`Could not identify country from SWIFT code: ${t}`)}static fromPayoutDTO(e){try{if(!r.CountryValidation.isISO2CountryCode(e.countryCode))return void console.error(`Invalid country code: ${e.countryCode}`);const t=e.msisdn.trim().split(":");if(2!==t.length)return void console.error("Invalid PayoutDTO format for bank - expected 'swiftcode:accountno'");const[o,a]=t;if(!r.BankValidation.validateSwiftCode(o,e.countryCode))return void console.error(`Invalid SWIFT code ${o} for country ${e.countryCode}`);const n=r.Bank.from(o,e.countryCode);return n?me.from({accName:e.payeeName,bank:n,accNo:a}):void console.error(`Bank with SWIFT code ${o} not found`)}catch(t){return void console.error("Failed to create BankBeneficiaryInfo from PayoutDTO: ",e,t)}}static is(e){if(!e||"object"!=typeof e)return!1;const t=e;if("string"!=typeof t.accName)return!1;if("string"!=typeof t.accNo)return!1;if(!t.bank||!r.Bank.is(t.bank))return!1;const o=t.accName,a=t.accNo,n=t.bank;return r.BankValidation.validateAccountName(o)&&r.BankValidation.validateAccountNumber(a,n.countryCode)}validate(){try{return r.BankValidation.validateAccountName(this.accName)&&r.BankValidation.validateAccountNumber(this.accNo,this.bank.countryCode)&&r.Bank.is(this.bank)}catch{return!1}}get accountName(){return this.accName}get accountNumber(){return this.accNo}get accountNameLabel(){return"Acc. Name"}get accountNumberLabel(){return"Bank Acc. No."}get channelLabel(){return"Bank"}get channelId(){return this.bank.swiftCode}get channelName(){return this.bank.shortName}toJSON(){return{type:"Bank",accName:this.accName,swiftCode:this.bank.swiftCode,countryCode:this.bank.countryCode,accNo:this.accNo,version:"1.0"}}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,o=ie.safeParse(t);if(!o.success)return void console.error("Invalid BankBeneficiaryInfoJSON:",o.error.flatten());const a=o.data;if(!r.CountryValidation.isISO2CountryCode(a.countryCode)||!r.BankValidation.validateSwiftCode(a.swiftCode,a.countryCode))return;const n=r.Bank.from(a.swiftCode,a.countryCode);if(!n)return;if(!r.BankValidation.validateAccountName(a.accName)||!r.BankValidation.validateAccountNumber(a.accNo,a.countryCode))return;return me.from({accName:a.accName,bank:n,accNo:a.accNo})}catch(e){return void console.error("Error parsing BankBeneficiaryInfoJSON:",e)}}static fromJSONString(e){return me.fromJSON(e)}static isBankBeneficiaryInfoJSON(e){return ie.safeParse(e).success}}const pe=e.z.object({data:ne.beneficiaryDTO,version:e.z.string().optional().default("1.0")});class he{data;constructor(e){this.data=ne.beneficiaryDTO.parse(e)}get id(){return this.data.id}get profileId(){return this.data.profileId}get displayName(){return this.data.displayName}get type(){return this.data.type}get createdAt(){return new Date(this.data.createdAt)}get updatedAt(){return new Date(this.data.updatedAt)}get info(){return this.data.type===exports.BeneficiaryType.Mobile?le.fromBeneficiaryDTO(this.data):this.data.type===exports.BeneficiaryType.Bank?me.fromBeneficiaryDTO(this.data):void 0}get accNo(){const e=this.info;return e?e.accountNumber:this.data.accountNo}get accName(){return this.data.displayName}get accNoLabel(){const e=this.info;return e instanceof le?"Phone Number":e instanceof me?"Bank Account Number":"Account Number"}get channelLabel(){const e=this.info;return e instanceof le?"Channel":e instanceof me?"Bank":"Channel"}get accNameLabel(){const e=this.info;return e instanceof le?"Full Name":e instanceof me?"Bank Account Name":"Display Name"}get channelName(){const e=this.info;return e instanceof le||e instanceof me?e.channelName:""}static from(e){try{return new he(e)}catch(e){return void console.error("Failed to create Beneficiary:",e)}}static create(e){return new he(e)}static createMany(e){return e.map(e=>new he(e))}static createSafe(e){try{return new he(e)}catch{return null}}static canConstruct(e){if(!e||"object"!=typeof e)return!1;const t=ne.beneficiaryDTO.safeParse(e);if(!t.success)return!1;return null!==he.createSafe(t.data)}static is(e){return!(!e||"object"!=typeof e)&&("data"in e&&he.canConstruct(e.data))}toJSON(){return{data:{...this.data},version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=pe.safeParse(t);if(!r.success)return void console.error("Invalid BeneficiaryJSON:",r.error.flatten());const o=r.data;return he.from(o.data)}catch(e){return void console.error("Error parsing BeneficiaryJSON:",e)}}static fromJSONString(e){return he.fromJSON(e)}static isBeneficiaryJSON(e){return pe.safeParse(e).success}}class fe{canHandle(e){return"Mobile"===e.type&&le.is(e)}createInput(e){if(le.is(e))return{type:exports.BeneficiaryType.Mobile,displayName:e.accountName,accountNo:e.accountNumber,channel:e.channelId};throw new Error("Expected Mobile Beneficiary Info")}}class ye{canHandle(e){return"Bank"===e.type&&me.is(e)}createInput(e){if(me.is(e))return{type:exports.BeneficiaryType.Bank,displayName:e.accountName,accountNo:e.accountNumber,channel:e.channelId};throw new Error("Expected Bank Beneficiary Info")}}class ge{handlers=[new fe,new ye];resolve(e){const t=this.handlers.find(t=>t.canHandle(e));if(!t)throw new Error("Please check your data and try again");return t.createInput(e)}}const Ne=p().router({createBeneficiary:{method:"POST",path:"/",body:ne.beneficiaryInputDTO,responses:{201:ne.beneficiaryDTO}},editBeneficiary:{method:"PATCH",path:"/:id",body:ne.beneficiaryInputDTO,responses:{200:ne.beneficiaryDTO}},getBeneficiaries:{method:"GET",path:"/",query:e.z.object({orderByDesc:e.z.string()}),responses:{200:e.z.array(ne.beneficiaryDTO)}},getByID:{method:"GET",path:"/:id",responses:{200:ne.beneficiaryDTO}},deleteBeneficiary:{method:"DELETE",path:"/:id",body:e.z.object({}),responses:{200:e.z.object({})}}});var be,we,ve;exports.PayoutChannel=void 0,(be=exports.PayoutChannel||(exports.PayoutChannel={})).MOBILE="Mobile",be.BANK="Bank",exports.PayoutStatus=void 0,(we=exports.PayoutStatus||(exports.PayoutStatus={})).CREATED="CREATED",we.PENDING="PENDING",we.PAID="PAID",we.FAILED="FAILED",we.REJECTED="REJECTED",we.REVERSED="REVERSED",we.QUEUED="QUEUED",exports.PayoutApprovalStatus=void 0,(ve=exports.PayoutApprovalStatus||(exports.PayoutApprovalStatus={})).PENDING="Pending",ve.APPROVED="Approved",ve.REJECTED="Rejected";const Se=e.z.object({id:e.z.string(),name:e.z.string(),identity:e.z.string()}),Oe=e.z.nativeEnum(exports.PayoutStatus),Ae=e.z.nativeEnum(exports.PayoutApprovalStatus),Ce=e.z.object({channel:e.z.string(),msisdn:e.z.string(),amount:e.z.coerce.number(),description:e.z.string(),notes:e.z.string().nullish()}),Pe=Ce.extend({payeeName:e.z.string()}),Ie=Ce.extend({id:e.z.string(),profileId:e.z.string(),payeeName:e.z.string(),countryCode:e.z.string().default("TZ").refine(e=>r.CountryValidation.isISO2CountryCode(e),{message:"Provided country code is not a valid ISO2 code."}),currencyCode:e.z.string().default("TZS").refine(e=>r.CurrencyValidation.isCurrencyCode(e),{message:"Provided currency code is not a valid currency code."}),channel:e.z.string(),status:Oe,statusMessage:e.z.string(),partnerReference:e.z.string().nullish(),createdAt:e.z.coerce.date(),updatedAt:e.z.coerce.date(),actionedAt:e.z.coerce.date().nullish(),approvalStatus:Ae.nullish(),createdBy:Se.nullish(),actionedBy:Se.nullish()}),ze=e.z.object({page:e.z.number().int().positive().default(1),limit:e.z.number().int().positive().max(100).default(10),sortBy:e.z.string().default("createdAt"),sortOrder:e.z.enum(["asc","desc"]).default("desc"),startDate:e.z.string().datetime().nullish(),endDate:e.z.string().datetime().nullish(),payeeName:e.z.string().nullish(),msisdn:e.z.string().nullish(),profileId:e.z.string().nullish(),id:e.z.string().nullish(),partnerReference:e.z.string().nullish(),channel:e.z.string().nullish(),currencyCode:e.z.string().nullish(),status:Oe.nullish(),approvalStatus:Ae.nullish(),minAmount:e.z.number().min(0).nullish(),maxAmount:e.z.number().min(0).nullish(),search:e.z.string().nullish()}),_e={PayoutDTO:Ie,PayoutInputDTO:Pe,PayoutStatus:Oe,PayoutApprovalStatus:Ae,PayoutAuthorizer:Se,PayoutFilters:ze,PayoutURLQueryParams:e.z.object({page:e.z.string().transform(e=>parseInt(e)||1).optional(),limit:e.z.string().transform(e=>parseInt(e)||20).optional(),sortBy:e.z.string().default("createdAt"),sortOrder:e.z.enum(["asc","desc"]).default("desc"),startDate:e.z.string().optional(),endDate:e.z.string().optional(),payeeName:e.z.string().optional(),msisdn:e.z.string().optional(),profileId:e.z.string().optional(),id:e.z.string().optional(),partnerReference:e.z.string().optional(),channel:e.z.string().optional(),status:e.z.string().refine(e=>Object.values(exports.PayoutStatus).includes(e)).transform(e=>e).optional(),approvalStatus:e.z.string().refine(e=>Object.values(exports.PayoutApprovalStatus).includes(e)).transform(e=>e).optional(),minAmount:e.z.string().transform(e=>parseFloat(e)).optional(),maxAmount:e.z.string().transform(e=>parseFloat(e)).optional(),search:e.z.string().optional()})},Ee=a.default.object({id:a.default.string(),profileId:a.default.string(),payeeName:a.default.string(),channel:a.default.string(),msisdn:a.default.string(),amount:a.default.number(),currencyCode:a.default.string(),countryCode:a.default.string(),description:a.default.string(),notes:a.default.string().nullish(),status:_e.PayoutStatus,statusMessage:a.default.string(),partnerReference:a.default.string().nullish(),createdAt:a.default.string(),updatedAt:a.default.string(),actionedAt:a.default.string().nullish(),approvalStatus:_e.PayoutApprovalStatus.nullish(),createdBy:_e.PayoutAuthorizer.nullish(),actionedBy:_e.PayoutAuthorizer.nullish(),version:a.default.string().optional().default("1.0")});class xe{data;constructor(e){this.data=_e.PayoutDTO.parse(e)}get id(){return this.data.id}get profileId(){return this.data.profileId}get payeeName(){return this.data.payeeName}get channel(){return this.data.channel}get msisdn(){return this.data.msisdn}get amount(){return r.Amount.from(this.data.amount,this.data.currencyCode)}get description(){return this.data.description}get notes(){return this.data.notes}get status(){return"Rejected"===this.data.approvalStatus?exports.PayoutStatus.REJECTED:"Approved"===this.data.approvalStatus?"FAILED"===this.data.status?exports.PayoutStatus.FAILED:exports.PayoutStatus.PAID:"Pending"===this.data.approvalStatus?exports.PayoutStatus.PENDING:this.data.status}get statusMessage(){return this.data.statusMessage}get partnerReference(){return this.data.partnerReference}get createdAt(){return this.data.createdAt}get updatedAt(){return this.data.updatedAt}get actionedAt(){return this.data.actionedAt}get approvalStatus(){return this.data.approvalStatus}get createdBy(){return this.data.createdBy}get actionedBy(){return this.data.actionedBy}get beneficiaryInfo(){return"TZ-BANK-B2C"===this.channel?me.fromPayoutDTO(this.data):le.fromPayoutDTO(this.data)}get contactInfo(){return this.beneficiaryInfo}static create(e){return new xe(e)}static createMany(e){return e.map(e=>new xe(e))}static createSafe(e){try{return new xe(e)}catch{return null}}static canConstruct(e){if(!e||"object"!=typeof e)return!1;const t=_e.PayoutDTO.safeParse(e);if(!t.success)return!1;return null!==xe.createSafe(t.data)}static is(e){return!(!e||"object"!=typeof e)&&("data"in e&&xe.canConstruct(e.data))}toJSON(){return{id:this.data.id,profileId:this.data.profileId,payeeName:this.data.payeeName,channel:this.data.channel,msisdn:this.data.msisdn,amount:this.data.amount,currencyCode:this.data.currencyCode,countryCode:this.data.countryCode,description:this.data.description,notes:this.data.notes,status:this.data.status,statusMessage:this.data.statusMessage,partnerReference:this.data.partnerReference,createdAt:this.data.createdAt.toISOString(),updatedAt:this.data.updatedAt.toISOString(),actionedAt:this.data.actionedAt?.toISOString()??null,approvalStatus:this.data.approvalStatus,createdBy:this.data.createdBy,actionedBy:this.data.actionedBy,version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,o=Ee.safeParse(t);if(!o.success)return void console.error("Invalid PayoutJSON:",o.error.flatten());const a=o.data,n=a.currencyCode;if(!r.CurrencyValidation.isCurrencyCode(n))return void console.error("Invalid currency code:",n);const s=a.countryCode;if(!r.CountryValidation.isISO2CountryCode(s))return void console.error("Invalid country code:",s);const i={id:a.id,profileId:a.profileId,payeeName:a.payeeName,channel:a.channel,msisdn:a.msisdn,amount:a.amount,currencyCode:n,countryCode:s,description:a.description,notes:a.notes,status:a.status,statusMessage:a.statusMessage,partnerReference:a.partnerReference,createdAt:new Date(a.createdAt),updatedAt:new Date(a.updatedAt),actionedAt:a.actionedAt?new Date(a.actionedAt):null,approvalStatus:a.approvalStatus,createdBy:a.createdBy,actionedBy:a.actionedBy};return xe.create(i)}catch(e){return void console.error("Error parsing PayoutJSON:",e)}}static isPayoutJSON(e){return Ee.safeParse(e).success}static fromJSONArray(e){try{const t="string"==typeof e?JSON.parse(e):e;return Array.isArray(t)?t.map(e=>xe.fromJSON(e)).filter(e=>void 0!==e):(console.warn("fromJSONArray expects an array"),[])}catch(e){return console.error("Error parsing Payout JSON array:",e),[]}}static toJSONArray(e){return e.map(e=>e.toJSON())}}const Re="MOBILE TRANSFER ",De="PAYOUT",Te="PAYOUT TO BANK",Be="TO_BANK",Me="PAYOUT TO MOBILE",Je="TO_MOMO",je=a.default.object({text:a.default.string(),version:a.default.string().optional().default("2.0")});class Fe{text;constructor(e){this.text=e}get mediumText(){return this.text.length>50?this.text.substring(0,47)+"...":this.text}get shortText(){return this.text.length>35?this.text.substring(0,32)+"...":this.text}static generateDefaultPayoutNarration(e){return le.is(e)?Fe.generateMobilePayoutNarrationV2(e):me.is(e)?Fe.generateBankPayoutNarrationV2(e):""}static generateMobilePayoutNarrationV2(e){const{phoneNumber:t,name:r}=e;return`${De.toUpperCase()} ${t.e164Format.trim()} ${r.trim()}`.toUpperCase()}static generateBankPayoutNarrationV2(e){const{bank:t,accName:r,accNo:o}=e;return`${De.toUpperCase()} ${t.swiftCode.trim()} ${o.trim()} ${r.trim()}`.toUpperCase()}getBeneficiaryDetails=()=>{const e=this.getBankBeneficiaryDetails(),t=this.getMobileBeneficiaryDetails();return e||(t||void 0)};getBankBeneficiaryDetails=()=>{let e=this.text.trim();e.startsWith(Re)&&(e=e.substring(16));try{if(e.startsWith(De)){const t=e.replace(De,"").trim().split(" ");if(t.length>=3){const e=t[0],o=t[1],a=t.slice(2).map(ke).join(" ");if(e.length>=8&&e.length<=11&&/^[A-Z0-9]+$/i.test(e)){const t=r.BankValidation.getCountryFromSwiftCode(e);if(t){if(r.BankValidation.validateSwiftCode(e,t)){const n=r.Bank.from(e,t);if(o&&a&&n)return new me(a,n,o)}}}}}if(e.startsWith(Be)){const t=e.split("=>")[1].trim(),o=JSON.parse(t),a=o.account_number,n=o.account_name,s=o.swift_code,i=r.BankValidation.getCountryFromSwiftCode(s);if(!i)return;if(!r.BankValidation.validateSwiftCode(s,i))return;const c=r.Bank.from(s,i);if(a&&n&&c)return new me(n,c,a)}if(e.startsWith(Te)){const t=e.replace(Te,"").trim().split(" "),o=r.BankService.getInstance().searchBanks("TZ",t[0]),a=o.length>0?o[0]:void 0,n=t[1],s=t.slice(2).map(ke).join(" ");if(s&&n&&a)return new me(s,a,n)}}catch(e){return}};getMobileBeneficiaryDetails=()=>{let e=this.text.trim();e.startsWith(Re)&&(e=e.substring(16));try{if(e.startsWith(De)){const t=e.replace(De,"").trim().split(" ");if(t.length>=2){const e=t[0],o=t.slice(1).map(ke).join(" ");if(e.startsWith("+")){const t=r.PhoneNumber.from(e);if(t&&o)return new le(o,t)}}}if(e.startsWith(Je)){const t=e.split("=>")[1].trim(),o=JSON.parse(t),a=r.TZMobileNumber.from(o.phone_number);let n=o.username;void 0===n&&(n="");let s=n.split(" ");if(s=s.filter(e=>e.trim().length>0),n=s.map(ke).join(" "),a&&n)return new le(n,a)}if(e.startsWith(Me)){const t=e.replace(Me,"").trim().split(" "),o=r.TZMobileNumber.from(t[0]),a=t.slice(1).map(ke).join(" ");if(o&&a)return new le(a,o)}}catch(e){return}};static is(e){if(!e||"object"!=typeof e)return!1;const t=e;try{return"string"==typeof t.text&&"function"==typeof t.getBeneficiaryDetails&&"function"==typeof t.toJson}catch(e){return!1}}toJSON(){return{text:this.text,version:"2.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=je.safeParse(t);if(!r.success)return void console.error("Invalid NarrationJSON:",r.error.flatten());const o=r.data;return new Fe(o.text)}catch(e){return void console.error("Error parsing NarrationJSON:",e)}}static isNarrationJSON(e){return je.safeParse(e).success}toJson(){return this.toJSON()}static fromJson(e){return Fe.fromJSON(e)}}function ke(e){if(0===e.length)return e;return e.charAt(0).toUpperCase()+e.slice(1).toLowerCase()}const Ue={SUPPORTED_COUNTRY_CODES:["TZ","KE"],ERROR_MESSAGES:{INVALID_PHONE_NUMBER:"Invalid phone number",INELIGIBLE_FOR_PAYOUT:"The provided phone number is not eligible for payout. Please make sure it is a valid mobile number.",MOBILE_NUMBER_MNO_MISMATCH:"There is a mismatch between the phone number provided and the MNO used.",UNSUPPORTED_COUNTRY_BANK:"Only Tanzanian Banks are supported for now",UNSUPPORTED_COUNTRY_MOBILE:"Only Tanzanian mobile numbers are supported for now",NO_HANDLER_FOUND:"Cannot create payout input!"}};class $e{static processNotes(e){if(!e)return;const t=e.trim();return t.length>0?t:void 0}}class Le{static forBank(e,t){if(!Ue.SUPPORTED_COUNTRY_CODES.includes(e.countryCode))throw new Error(Ue.ERROR_MESSAGES.UNSUPPORTED_COUNTRY_BANK);return`${t.countryCode}-BANK-B2C`}static forMobile(e,t,o){if(!r.PhoneNumber.is(e))throw new Error(Ue.ERROR_MESSAGES.INVALID_PHONE_NUMBER);if(!Ue.SUPPORTED_COUNTRY_CODES.includes(e.countryCode))throw new Error(Ue.ERROR_MESSAGES.UNSUPPORTED_COUNTRY_MOBILE);if(!r.PhoneNumberFactory.checkPayoutEligibility(e))throw new Error(Ue.ERROR_MESSAGES.INELIGIBLE_FOR_PAYOUT);const a=r.MNOUtils.getMNOById(t,e.countryCode);if(!a)throw new Error(Ue.ERROR_MESSAGES.MOBILE_NUMBER_MNO_MISMATCH);return a.id===r.TZMNOId.VODACOM?`${o.countryCode}-${r.TZMNOId.TIGO.toString().toUpperCase()}-B2C`:`${o.countryCode}-${a.id.toString().toUpperCase()}-B2C`}}class qe{canHandle(e,t,o){return e===exports.PayoutChannel.MOBILE&&le.is(t)&&o.countryCode===t.countryCode&&o.currencyCode===r.Country.from(t.countryCode)?.currencyCode}createInput(e,t){const o=e.receiver,a=$e.processNotes(e.notes),n=o.phoneNumber;return{channel:Le.forMobile(n,o.mnoId,t),msisdn:n.getWithFormat(r.PhoneNumberFormat.INTERNATIONAL_NUMERIC),description:a??Fe.generateDefaultPayoutNarration(o),payeeName:o.name,notes:a,amount:e.amount.numericValue}}}class Ve{canHandle(e,t,o){return e===exports.PayoutChannel.BANK&&me.is(t)&&o.countryCode===t.countryCode&&o.currencyCode===r.Country.from(t.countryCode)?.currencyCode}createInput(e,t){const r=e.receiver,o=$e.processNotes(e.notes);return{channel:Le.forBank(r,t),msisdn:`${r.bank.swiftCode}:${r.accNo}`,description:o??Fe.generateDefaultPayoutNarration(r),payeeName:r.accName,notes:o,amount:e.amount.numericValue}}}class We{handlers=[new qe,new Ve];getPayoutInput(e,t){const r=this.handlers.find(r=>r.canHandle(e.channel,e.receiver,t));if(!r)throw new Error(Ue.ERROR_MESSAGES.NO_HANDLER_FOUND);return r.createInput({receiver:e.receiver,amount:e.amount,notes:e.notes},t)}}const Ge={bank:Le.forBank,mobile:Le.forMobile},He=p().router({getPayouts:{method:"GET",path:"",query:e.z.object({}),responses:{200:e.z.object({results:e.z.array(_e.PayoutDTO),total:e.z.number()})}},getPayoutsByApprovalStatus:{method:"GET",path:"",query:e.z.object({rangeStart:e.z.number(),rangeEnd:e.z.number(),eager:e.z.string(),approvalStatus:_e.PayoutApprovalStatus,orderByDesc:e.z.string()}),responses:{200:e.z.object({results:e.z.array(_e.PayoutDTO),total:e.z.number()})}},postPayout:{method:"POST",path:"",body:_e.PayoutInputDTO,responses:{201:_e.PayoutDTO,400:n.schema}},approve:{method:"POST",path:"/:id/approve",body:e.z.object({action:e.z.enum(["Approve","Reject"]),notes:e.z.string().optional()}),responses:{201:_e.PayoutDTO,404:e.z.object({}),409:e.z.object({})}},getPayout:{method:"GET",path:"/:id/",responses:{200:_e.PayoutDTO,404:e.z.object({})}}});class Qe extends _{static create(){return new Qe}static fromFilters(e){return(new Qe).applyFilters(e)}static fromUrlParams(e){try{const t=_e.PayoutURLQueryParams.parse(e),r=_e.PayoutFilters.parse(t);return Qe.fromFilters(r)}catch(e){throw new Error("Invalid URL parameters. Please check your query string values.")}}static fromSearchParams(e){const t=Object.fromEntries(e.entries());return Qe.fromUrlParams(t)}static fromRequest(e){const{searchParams:t}=new URL(e.url);return Qe.fromSearchParams(t)}static from(e){try{return null==e?new Qe:_.is(e)?new Qe(e.options):e instanceof URLSearchParams?Qe.fromSearchParams(e):this.isStringRecord(e)?Qe.fromUrlParams(e):Qe.fromFilters(e)}catch(e){throw new Error("Invalid input! Could not create a PayoutQuery instance.")}}static isStringRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&!(e instanceof URLSearchParams)&&Object.values(e).every(e=>"string"==typeof e)}whereStatus(e){return this.where("status",e)}whereApprovalStatus(e){return this.where("approvalStatus",e)}whereChannel(e){return this.where("channel",e)}wherePending(){return this.whereApprovalStatus(exports.PayoutApprovalStatus.PENDING)}whereApproved(){return this.whereApprovalStatus(exports.PayoutApprovalStatus.APPROVED)}whereRejected(){return this.whereApprovalStatus(exports.PayoutApprovalStatus.REJECTED)}wherePaid(){return this.whereStatus(exports.PayoutStatus.PAID)}whereFailed(){return this.whereStatus(exports.PayoutStatus.FAILED)}whereAmountBetween(e,t){return e.currencyCode!==t.currencyCode||e.numericValue>t.numericValue?this:this.whereBetween("amount",e.numericValue,t.numericValue).whereCurrencyCode(e.currencyCode)}wherePayee(e){return this.whereContains("payeeName",e)}whereMsisdn(e){return this.whereContains("msisdn",e)}whereProfileId(e){return this.where("profileId",e)}wherePartnerReference(e){return this.whereContains("partnerReference",e)}whereSearch(e){return this.where("search",e)}whereCurrencyCode(e){return this.where("currencyCode",e)}applyFilters(e){if((e.page||e.limit)&&this.paginate(e.page||1,e.limit||20),e.sortBy&&e.sortOrder&&("asc"===e.sortOrder?this.orderByAsc(e.sortBy):this.orderByDesc(e.sortBy)),(e.startDate||e.endDate)&&this.whereDateBetween(e.startDate,e.endDate),e.status&&this.whereStatus(e.status),e.approvalStatus&&this.whereApprovalStatus(e.approvalStatus),e.channel&&this.whereChannel(e.channel),e.payeeName&&this.wherePayee(e.payeeName),e.msisdn&&this.whereMsisdn(e.msisdn),e.profileId&&this.whereProfileId(e.profileId),e.partnerReference&&this.wherePartnerReference(e.partnerReference),e.id&&this.where("id",e.id),void 0!==e.minAmount||void 0!==e.maxAmount){const t=void 0!==e.minAmount&&null!==e.minAmount,o=void 0!==e.maxAmount&&null!==e.maxAmount,{currencyCode:a}=e;if(!a||!r.CurrencyValidation.isCurrencyCode(a))return console.warn("Amount filter requires a valid currency code"),this;if(t&&o){if(e.minAmount>e.maxAmount)return console.warn(`Invalid amount range: min (${e.minAmount}) > max (${e.maxAmount})`),this;const t=r.Amount.from(e.minAmount,a),o=r.Amount.from(e.maxAmount,a);t&&o&&this.whereAmountBetween(t,o)}else t?this.whereGreaterThanOrEqual("amount",e.minAmount).whereCurrencyCode(a):o&&this.whereLessThanOrEqual("amount",e.maxAmount).whereCurrencyCode(a)}return e.search&&this.whereSearch(e.search),this}toFilters(){const e=this.extractFilterValues();return{page:this.options.page||1,limit:this.options.limit||20,sortBy:this.extractSortField()||"createdAt",sortOrder:this.extractSortOrder()||"desc",startDate:e.startDate,endDate:e.endDate,payeeName:e.payeeName,msisdn:e.msisdn,profileId:e.profileId,id:e.id,partnerReference:e.partnerReference,channel:e.channel,status:this.isValidStatus(e.status)?e.status:void 0,approvalStatus:this.isValidApprovalStatus(e.approvalStatus)?e.approvalStatus:void 0,minAmount:e.minAmount,maxAmount:e.maxAmount,search:e.search}}toUrlParams(){const e=this.toFilters(),t={};return Object.entries(e).forEach(([e,r])=>{null!=r&&(t[e]=String(r))}),t}toSearchParams(){return new URLSearchParams(this.toUrlParams())}toQueryString(){return this.toSearchParams().toString()}withPagination(e,t){const r=this.clone();return r.paginate(e,t||r.options.limit||20),r}withSorting(e,t="desc"){const r=this.clone();return"asc"===t?r.orderByAsc(e):r.orderByDesc(e),r}withDateRange(e,t){const r=this.clone();return r.whereDateBetween(e,t),r}withStatus(e){const t=this.clone();return e&&t.whereStatus(e),t}withApprovalStatus(e){const t=this.clone();return e&&t.whereApprovalStatus(e),t}withChannel(e){const t=this.clone();return e&&t.whereChannel(e),t}includeDefaultRelations(){return this.with("[createdBy,actionedBy]")}resetPage(){return this.withPagination(1)}hasFilters(){const e=this.toFilters();return!!(e.startDate||e.endDate||e.payeeName||e.msisdn||e.profileId||e.id||e.partnerReference||e.channel||e.status||e.approvalStatus||e.minAmount||e.maxAmount||e.search)}getActiveFilters(){const e=[],t=this.toFilters();return t.status&&e.push(`Status: ${t.status}`),t.approvalStatus&&e.push(`Approval: ${t.approvalStatus}`),t.channel&&e.push(`Channel: ${t.channel}`),t.startDate&&t.endDate?e.push(`Date: ${t.startDate} to ${t.endDate}`):t.startDate?e.push(`From: ${t.startDate}`):t.endDate&&e.push(`Until: ${t.endDate}`),t.minAmount&&t.maxAmount?e.push(`Amount: ${t.minAmount} - ${t.maxAmount}`):t.minAmount?e.push(`Min Amount: ${t.minAmount}`):t.maxAmount&&e.push(`Max Amount: ${t.maxAmount}`),t.search&&e.push(`Search: "${t.search}"`),t.payeeName&&e.push(`Payee: ${t.payeeName}`),t.msisdn&&e.push(`MSISDN: ${t.msisdn}`),t.profileId&&e.push(`Profile: ${t.profileId}`),t.partnerReference&&e.push(`Ref: ${t.partnerReference}`),e}extractFilterValues(){const e={};if(!this.options.filters)return e;for(const t of this.options.filters)switch(t.field){case"createdAt":"gte"===t.operator?e.startDate=t.value:"lte"===t.operator&&(e.endDate=t.value);break;case"amount":"gte"===t.operator?e.minAmount=t.value:"lte"===t.operator&&(e.maxAmount=t.value);break;case"payeeName":case"msisdn":case"partnerReference":"likeLower"===t.operator&&"string"==typeof t.value?e[t.field]=t.value.replace(/%/g,""):"eq"===t.operator&&(e[t.field]=t.value);break;default:"eq"===t.operator&&(e[t.field]=t.value)}return e}extractSortField(){if(this.options.sort&&0!==this.options.sort.length)return this.options.sort[0].field}extractSortOrder(){if(this.options.sort&&0!==this.options.sort.length)return this.options.sort[0].direction}isValidStatus(e){return Object.values(exports.PayoutStatus).includes(e)}isValidApprovalStatus(e){return Object.values(exports.PayoutApprovalStatus).includes(e)}}const Ke=e=>e.optional().transform(e=>e??void 0),Ye={walletDTO:e.z.object({id:e.z.string().min(1,{message:"Wallet ID is required."}),profileId:e.z.string().min(1,{message:"Profile ID is required."}),accountNo:e.z.string().min(1,{message:"Account number is required."}),accountName:e.z.string().min(1,{message:"Account name is required."}),channel:e.z.string().min(1,{message:"Channel is required."}),countryCode:e.z.string().default("TZ").refine(e=>r.CountryValidation.isISO2CountryCode(e),{message:"Provided country code is not a valid ISO2 code."}),currencyCode:e.z.string().default("TZS").refine(e=>r.CurrencyValidation.isCurrencyCode(e),{message:"Provided currency code is not a valid currency code."}),createdAt:e.z.string().datetime({message:"Creation timestamp must be a valid ISO 8601 datetime string."}),updatedAt:e.z.string().datetime({message:"Update timestamp must be a valid ISO 8601 datetime string."})}),walletQuery:e.z.object({id:e.z.string().optional(),profileId:e.z.string().optional(),accountNo:e.z.string().optional(),accountName:e.z.string().optional(),channel:e.z.string().optional(),countryCode:e.z.string().default("TZ").refine(e=>r.ISO2CountryCodesSet.has(e),{message:"Provided country code is not a valid ISO2 code."}).optional(),currencyCode:e.z.string().default("TZS").refine(e=>{const t=r.Currency.from(e);return void 0!==t&&r.CurrencyCodesSet.has(t.code)},{message:"Provided currency code is not a valid currency code."}).optional()}),statementEntry:e.z.object({accountNo:Ke(e.z.string()),debitOrCredit:e.z.string().min(1,"Transaction type is required"),tranRefNo:e.z.string().min(1,"Transaction reference is required"),narration:e.z.string().min(1,"Transaction description is required"),txnDate:e.z.coerce.date({errorMap:()=>({message:"Invalid transaction date format"})}),valueDate:e.z.coerce.date({errorMap:()=>({message:"Invalid value date format"})}),amountCredited:e.z.number().min(0,"Credited amount must be non-negative"),amountDebited:e.z.number().min(0,"Debited amount must be non-negative"),balance:e.z.number(),currencyCode:Ke(e.z.string().min(3,"Currency code must be at least 3 characters")).default("TZS")})},Ze=a.default.object({id:a.default.string(),profileId:a.default.string(),accountNo:a.default.string(),accountName:a.default.string(),channel:a.default.string(),countryCode:a.default.string(),currencyCode:a.default.string(),createdAt:a.default.string(),updatedAt:a.default.string(),version:a.default.string().optional().default("1.0")});class Xe{_id;_profileId;_accountNo;_accountName;_channel;_countryCode;_currencyCode;_createdAt;_updatedAt;static get schema(){return Ye.walletDTO}constructor(e){this._id=e.id,this._profileId=e.profileId,this._accountNo=e.accountNo,this._accountName=e.accountName,this._channel=e.channel,this._countryCode=e.countryCode,this._currencyCode=e.currencyCode,this._createdAt=e.createdAt,this._updatedAt=e.updatedAt}static create(e){const t=Xe.schema.safeParse(e);if(t.success)return new Xe(t.data);console.error("Wallet data validation failed:",t.error.flatten())}get id(){return this._id}get profileId(){return this._profileId}get accountNo(){return this._accountNo}get accountName(){return this._accountName}get channel(){return this._channel}get countryCode(){return this._countryCode}get currencyCode(){return this._currencyCode}get createdAt(){return this._createdAt}get updatedAt(){return this._updatedAt}get createdAtDate(){return new Date(this._createdAt)}get updatedAtDate(){return new Date(this._updatedAt)}validate(){const e=Xe.schema.safeParse(this.toJSON());return e.success||console.warn("Wallet instance validation failed:",e.error.flatten()),e.success}static from(e){if(e&&"object"==typeof e)return Xe.create({id:e.id,profileId:e.profileId,accountNo:e.accountNo,accountName:e.accountName,channel:e.channel,countryCode:e.countryCode,createdAt:e.createdAt,updatedAt:e.updatedAt,currencyCode:e.currencyCode});console.error("Invalid data provided to Wallet.from: Input must be an object.")}static is(e){if(!e||"object"!=typeof e)return!1;const t=e;return"string"==typeof t._id&&"string"==typeof t._profileId&&"string"==typeof t._accountNo&&"string"==typeof t._accountName&&"string"==typeof t._channel&&"string"==typeof t._countryCode&&r.CountryValidation.isISO2CountryCode(t._countryCode)&&"string"==typeof t._currencyCode&&r.CurrencyValidation.isCurrencyCode(t._currencyCode)&&"string"==typeof t._createdAt&&"string"==typeof t._updatedAt}toJSON(){return{id:this._id,profileId:this._profileId,accountNo:this._accountNo,accountName:this._accountName,channel:this._channel,countryCode:this._countryCode,currencyCode:this._currencyCode,createdAt:this._createdAt,updatedAt:this._updatedAt,version:"1.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,r=Ze.safeParse(t);if(!r.success)return void console.error("Invalid WalletJSON:",r.error.flatten());const o=r.data;return Xe.create(o)}catch(e){return void console.error("Error parsing WalletJSON:",e)}}static isWalletJSON(e){return Ze.safeParse(e).success}}const et=a.default.object({accountNo:a.default.string().optional(),debitOrCredit:a.default.string(),tranRefNo:a.default.string(),narration:je,txnDate:a.default.string(),valueDate:a.default.string(),amountCredited:r.AmountJSONSchema,amountDebited:r.AmountJSONSchema,balance:r.AmountJSONSchema,currencyCode:a.default.string(),version:a.default.string().optional().default("2.0")});class tt{_accountNo;_debitOrCredit;_tranRefNo;_narration;_txnDate;_valueDate;_amountCredited;_amountDebited;_balance;_currencyCode;static get schema(){return Ye.statementEntry}constructor(e,t){this._accountNo=e.accountNo,this._debitOrCredit=e.debitOrCredit,this._tranRefNo=e.tranRefNo,this._narration=t,this._txnDate=e.txnDate,this._valueDate=e.valueDate,this._currencyCode=e.currencyCode;const o=r.Currency.from(e.currencyCode);if(!o)throw new Error(`Currency not found for code: ${e.currencyCode}`);const a=r.Amount.from(e.amountCredited,o.code),n=r.Amount.from(e.amountDebited,o.code),s=r.Amount.from(e.balance,o.code);if(!a||!n||!s)throw new Error(`Failed to create Amount instances with currency code: ${e.currencyCode}`);this._amountCredited=a,this._amountDebited=n,this._balance=s}static create(e){const t="string"==typeof e.narration?new Fe(e.narration):e.narration,r={...e,narration:t.text},o=tt.schema.safeParse(r);if(o.success)try{const{narration:e,...r}=o.data;return new tt(r,t)}catch(e){return void console.error("Failed to create WalletStatementEntry:",e)}else console.error("WalletStatementEntry data validation failed:",o.error.flatten())}get accountNo(){return this._accountNo}get debitOrCredit(){return this._debitOrCredit}get tranRefNo(){return this._tranRefNo}get narration(){return this._narration}get txnDate(){return this._txnDate}get valueDate(){return this._valueDate}get amountCredited(){return this._amountCredited}get amountDebited(){return this._amountDebited}get balance(){return this._balance}get currencyCode(){return this._currencyCode}validate(){const e={accountNo:this._accountNo,debitOrCredit:this._debitOrCredit,tranRefNo:this._tranRefNo,narration:this._narration.text,txnDate:this._txnDate,valueDate:this._valueDate,amountCredited:this._amountCredited.numericValue,amountDebited:this._amountDebited.numericValue,balance:this._balance.numericValue,currencyCode:this._currencyCode},t=tt.schema.safeParse(e);return t.success||console.warn("WalletStatementEntry instance validation failed:",t.error.flatten()),t.success}static is(e){if(!e||"object"!=typeof e)return!1;const t=e;try{return("string"==typeof t._accountNo||void 0===t._accountNo)&&"string"==typeof t._debitOrCredit&&"string"==typeof t._tranRefNo&&Fe.is(t._narration)&&t._txnDate instanceof Date&&t._valueDate instanceof Date&&r.Amount.is(t._amountCredited)&&r.Amount.is(t._amountDebited)&&r.Amount.is(t._balance)&&"string"==typeof t._currencyCode}catch(e){return!1}}equals(e){return this._tranRefNo===e._tranRefNo}clone(){return tt.create({accountNo:this._accountNo,debitOrCredit:this._debitOrCredit,tranRefNo:this._tranRefNo,narration:this._narration,txnDate:this._txnDate,valueDate:this._valueDate,amountCredited:this._amountCredited.numericValue,amountDebited:this._amountDebited.numericValue,balance:this._balance.numericValue,currencyCode:this._currencyCode})}toString(){return`WalletStatementEntry(${this._tranRefNo}: ${this._debitOrCredit} ${this._amountCredited.isPositive()?this._amountCredited.label:this._amountDebited.label} on ${this._txnDate.toISOString().split("T")[0]}${this._narration})`}static from(e){if(e&&"object"==typeof e)try{let t,o,a,n,s=e.currencyCode||"TZS";if(e.amountCredited&&"object"==typeof e.amountCredited&&"value"in e.amountCredited){const n=r.Amount.fromJSON(e.amountCredited),i=r.Amount.fromJSON(e.amountDebited),c=r.Amount.fromJSON(e.balance);if(!n||!i||!c)return void console.error("Failed to deserialize Amount objects from JSON");t=n.numericValue,o=i.numericValue,a=c.numericValue,e.currencyCode||(s=n.currencyCode)}else if(t=Number(e.amountCredited),o=Number(e.amountDebited),a=Number(e.balance),!Number.isFinite(t)||!Number.isFinite(o)||!Number.isFinite(a))return void console.error("Invalid numeric values for amounts");if("string"==typeof e.narration)n=e.narration;else if(Fe.is(e.narration))n=e.narration;else{if(!Fe.isNarrationJSON(e.narration))return void console.error("Invalid narration data");{const t=Fe.fromJson(e.narration);if(!t)return void console.error("Failed to create Narration from NarrationJson");n=t}}return tt.create({accountNo:e.accountNo,debitOrCredit:e.debitOrCredit,tranRefNo:e.tranRefNo,narration:n,txnDate:e.txnDate,valueDate:e.valueDate,amountCredited:t,amountDebited:o,balance:a,currencyCode:s})}catch(e){return void console.error("Error in WalletStatementEntry.from:",e)}else console.error("Invalid data provided to WalletStatementEntry.from: not an object or null.")}toJSON(){return{accountNo:this._accountNo,debitOrCredit:this._debitOrCredit,tranRefNo:this._tranRefNo,narration:this._narration.toJSON(),txnDate:this._txnDate.toISOString(),valueDate:this._valueDate.toISOString(),amountCredited:this._amountCredited.toJSON(),amountDebited:this._amountDebited.toJSON(),balance:this._balance.toJSON(),currencyCode:this._currencyCode,version:"2.0"}}toJSONString(){return JSON.stringify(this.toJSON())}static fromJSON(e){try{const t="string"==typeof e?JSON.parse(e):e,o=et.safeParse(t);if(!o.success)return void console.error("Invalid WalletStatementEntryJSON:",o.error.flatten());const a=o.data,n=Fe.fromJSON(a.narration);if(!n)return void console.warn("Failed to deserialize narration");const s=r.Amount.fromJSON(a.amountCredited),i=r.Amount.fromJSON(a.amountDebited),c=r.Amount.fromJSON(a.balance);return s&&i&&c?s.currencyCode!==a.currencyCode||i.currencyCode!==a.currencyCode||c.currencyCode!==a.currencyCode?void console.warn("Currency code mismatch"):tt.create({accountNo:a.accountNo,debitOrCredit:a.debitOrCredit,tranRefNo:a.tranRefNo,narration:n,txnDate:a.txnDate,valueDate:a.valueDate,amountCredited:s.numericValue,amountDebited:i.numericValue,balance:c.numericValue,currencyCode:a.currencyCode}):void console.warn("Failed to deserialize Amount objects")}catch(e){return void console.error("Error parsing WalletStatementEntryJSON:",e)}}static isWalletStatementEntryJSON(e){return et.safeParse(e).success}static fromJSONArray(e){try{const t="string"==typeof e?JSON.parse(e):e;return Array.isArray(t)?t.map(e=>tt.fromJSON(e)).filter(e=>void 0!==e):(console.warn("fromJSONArray expects an array"),[])}catch(e){return console.error("Error parsing WalletStatementEntry JSON array:",e),[]}}static toJSONArray(e){return e.map(e=>e.toJSON())}toJson(){return this.toJSON()}static fromJson(e){return tt.fromJSON(e)}static fromJsonArray(e){return tt.fromJSONArray(e)}static toJsonArray(e){return tt.toJSONArray(e)}}const rt=p().router({getWallets:{method:"GET",path:"/",query:Ye.walletQuery,responses:{200:e.z.array(Xe.schema)}},getBalance:{method:"POST",path:"/balance",body:e.z.object({accountNo:e.z.string().optional()}),responses:{201:e.z.object({availableBalance:e.z.number()})}},getStatement:{method:"POST",path:"/statement",summary:"Get Wallet Statement",body:e.z.object({endDate:e.z.date(),startDate:e.z.date(),accountNo:e.z.string().optional()}),responses:{201:e.z.array(tt.schema)}}});class ot extends _{static create(){return new ot}static fromFilters(e){return(new ot).applyFilters(e)}static fromUrlParams(e){try{const t=Ye.walletQuery.parse(e);return ot.fromFilters(t)}catch(e){throw new Error("Invalid URL parameters. Please check your query string values.")}}static fromSearchParams(e){const t=Object.fromEntries(e.entries());return ot.fromUrlParams(t)}static fromRequest(e){const{searchParams:t}=new URL(e.url);return ot.fromSearchParams(t)}static from(e){try{return null==e?new ot:_.is(e)?new ot(e.options):e instanceof URLSearchParams?ot.fromSearchParams(e):this.isStringRecord(e)?ot.fromUrlParams(e):ot.fromFilters(e)}catch(e){throw new Error("Invalid input! Could not create a WalletQuery instance.")}}static isStringRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)&&!(e instanceof URLSearchParams)&&Object.values(e).every(e=>"string"==typeof e)}whereId(e){return this.where("id",e)}whereProfileId(e){return this.where("profileId",e)}whereAccountNo(e){return this.where("accountNo",e)}whereAccountName(e){return this.whereContains("accountName",e)}whereChannel(e){return this.where("channel",e)}whereCountryCode(e){return this.where("countryCode",e)}whereCurrencyCode(e){return this.where("currencyCode",e)}applyFilters(e){return e.id&&this.whereId(e.id),e.profileId&&this.whereProfileId(e.profileId),e.accountNo&&this.whereAccountNo(e.accountNo),e.accountName&&this.whereAccountName(e.accountName),e.channel&&this.whereChannel(e.channel),e.countryCode&&this.whereCountryCode(e.countryCode),e.currencyCode&&this.whereCurrencyCode(e.currencyCode),this}toFilters(){const e=this.extractFilterValues();return{id:e.id,profileId:e.profileId,accountNo:e.accountNo,accountName:e.accountName,channel:e.channel,countryCode:e.countryCode,currencyCode:e.currencyCode}}toUrlParams(){const e=this.toFilters(),t={};return Object.entries(e).forEach(([e,r])=>{null!=r&&(t[e]=String(r))}),t}toSearchParams(){return new URLSearchParams(this.toUrlParams())}toQueryString(){return this.toSearchParams().toString()}withId(e){const t=this.clone();return t.whereId(e),t}withProfileId(e){const t=this.clone();return t.whereProfileId(e),t}withAccountNo(e){const t=this.clone();return t.whereAccountNo(e),t}withCountryCode(e){const t=this.clone();return t.whereCountryCode(e),t}withCurrencyCode(e){const t=this.clone();return t.whereCurrencyCode(e),t}hasFilters(){const e=this.toFilters();return!!(e.id||e.profileId||e.accountNo||e.accountName||e.channel||e.countryCode||e.currencyCode)}getActiveFilters(){const e=[],t=this.toFilters();return t.id&&e.push(`ID: ${t.id}`),t.profileId&&e.push(`Profile: ${t.profileId}`),t.accountNo&&e.push(`Account: ${t.accountNo}`),t.accountName&&e.push(`Name: ${t.accountName}`),t.channel&&e.push(`Channel: ${t.channel}`),t.countryCode&&e.push(`Country: ${t.countryCode}`),t.currencyCode&&e.push(`Currency: ${t.currencyCode}`),e}extractFilterValues(){const e={};if(!this.options.filters)return e;for(const t of this.options.filters)"eq"===t.operator?e[t.field]=t.value:"likeLower"===t.operator&&"string"==typeof t.value&&(e[t.field]=t.value.replace(/%/g,""));return e}}const at={getUniqueCountries(e){const t=new Set;return e.forEach(e=>{e.countryCode&&t.add(e.countryCode)}),Array.from(t)},getWalletsByCountry:(e,t)=>e.filter(e=>e.countryCode===t)},nt=p().router({getCurrentProfile:{method:"GET",path:"/me",responses:{200:B.schema}}});exports.APIError=n,exports.AuthRepository=class extends C{constructor(e){super("auth",V,e)}async logIn(e,t){const r={type:"password",identity:e,password:t},o=await this.client.logIn({body:r});if(400===o.status)throw new n({message:"Invalid email or password",statusCode:400});if(201===o.status){const e=o.body.token,t=new G({token:e}),r=await t.getIdentity(),a=j.from(r);if(!a)throw new n({message:"Failed to construct login credentials",statusCode:502});const i=o.body.profile,c=B.from(i);if(!c)throw new n({message:"Failed to construct user profile",statusCode:502});let u;if(a.access.includes(s.Role.ViewRole))try{const t=new te({token:e});u=await t.getRole(a.roleId)}catch(e){console.warn("Failed to fetch role details:",e)}const d=q.from({logIn:a,companyProfile:c,role:u,token:e});if(!d)throw new n({message:"Failed to construct user session",statusCode:502});return d}throw new n({message:"An error occurred while trying to log in",statusCode:502})}async updatePassword(e,t){const r=await this.client.resetPassword({body:{currentPassword:e,newPassword:t}});if(200===r.status)return!0;if(400===r.status)throw new n({message:"Invalid current password",statusCode:400});throw new n({message:"An error occurred while trying to update password",statusCode:502})}async getAccessList(){const e=await this.client.access();if(200===e.status)return e.body;throw new Error(`Failed to get access list. Status: ${e.status}`)}},exports.BANK_NARR_PREFIX=Te,exports.BankBeneficiaryInfo=me,exports.BankBeneficiaryInfoJSONSchema=ie,exports.BaseRepository=C,exports.Beneficiary=he,exports.BeneficiaryDTOSchemas=ne,exports.BeneficiaryInfoJSONSchema=ce,exports.BeneficiaryJSONSchema=pe,exports.BeneficiaryRepository=class extends C{constructor(e){super("contact",Ne,e)}async create(e){const t=(new ge).resolve(e),r=await this.client.createBeneficiary({body:t}),o=this.handleResponse(r,201);return he.create(o)}async edit(e,t){const r=(new ge).resolve(t),o=await this.client.editBeneficiary({params:{id:e},body:r}),a=this.handleResponse(o,200);return he.create(a)}async remove(e){const t=await this.client.deleteBeneficiary({params:{id:e}});this.handleResponse(t,200)}async getAll(){const e=await this.client.getBeneficiaries({query:{orderByDesc:"createdAt"}}),t=this.handleResponse(e,200);return he.createMany(t)}async getByID(e){const t=await this.client.getByID({params:{id:e}}),r=this.handleResponse(t,200);return he.create(r)}},exports.CompanyMembership=$,exports.CompanyMembershipJSONSchema=U,exports.ECOBANK_PREFIX=Re,exports.IdentityRepository=G,exports.LEGACY_BANK_NARR_PREFIX=Be,exports.LEGACY_MOBILE_NARR_PREFIX=Je,exports.LogIn=j,exports.LogInJSONSchema=J,exports.LogInSchemas=M,exports.MOBILE_NARR_PREFIX=Me,exports.MobileBeneficiaryInfo=le,exports.MobileBeneficiaryInfoJSONSchema=se,exports.NARR_V2_PREFIX=De,exports.Narration=Fe,exports.NarrationJSONSchema=je,exports.Pagination=R,exports.PaginationParamsSchema=E,exports.PaginationSchema=x,exports.Payout=xe,exports.PayoutDTOSchemas=_e,exports.PayoutInputFactory=We,exports.PayoutJSONSchema=Ee,exports.PayoutQuery=Qe,exports.PayoutRepository=class extends C{constructor(e){super("payout",He,e)}async getPayouts(e){try{const t=Qe.from(e),r=t.build(),o=await this.client.getPayouts({query:r}),a=this.handleResponse(o,200),n=t.toFilters(),s=new R(n.page??1,n.limit??10,a.total);return{results:xe.createMany(a.results),pagination:s}}catch(e){throw new Error(`Failed to fetch payouts: ${e instanceof Error?e.message:"Unknown error"}`)}}async getAllPayouts(e){try{const t=Qe.from(e).build();delete t.page,delete t.limit;const r=await this.client.getPayouts({query:t}),o=this.handleResponse(r,200);return xe.createMany(o)}catch(e){throw new Error(`Failed to fetch all payouts: ${e instanceof Error?e.message:"Unknown error"}`)}}async getPayoutsFromRequest(e){const t=Qe.fromRequest(e);return this.getPayouts(t)}async pay(e){const{wallet:t,channel:o,receiver:a,amount:s,notes:i}=e,{min:c,max:u}=r.Amount.getTransactionLimits(s.currencyCode);if(s.lessThan(c)||s.greaterThan(u))throw new n({statusCode:400,message:`Please make sure the amount is between ${c.label} - ${u.label}`});const d=(new We).getPayoutInput({channel:o,receiver:a,amount:s,notes:i},t),l=await this.client.postPayout({body:d});if(201===l.status)return xe.create(l.body);if(400===l.status)throw new n(l.body);throw n.unknown()}async approve(e){const t=await this.client.approve({params:{id:e.id},body:{action:"Approve",notes:e.notes}});if(201===t.status)return xe.create(t.body);if(404===t.status)throw new n({message:"Payout not found",statusCode:404});if(409===t.status)throw new n({message:"Payout already approved",statusCode:409});throw n.unknown()}async reject(e){const t=await this.client.approve({params:{id:e.id},body:{action:"Reject",notes:e.notes}});if(201===t.status)return xe.create(t.body);if(404===t.status)throw new n({message:"Payout not found",statusCode:404});if(409===t.status)throw new n({message:"Payout already rejected",statusCode:409});throw n.unknown()}async getByID(e){const t=await this.client.getPayout({params:{id:e}});if(200===t.status)return xe.create(t.body);if(404===t.status)throw new n({message:"Payout not found",statusCode:404});throw n.unknown()}async count(e){const t=Qe.from(e).build(),r=await this.client.getPayouts({query:t});return this.handleResponse(r,200).total}async exists(e){return await this.count(e)>0}},exports.PermissionError=i,exports.Permissions=s,exports.Profile=B,exports.ProfileDTOSchemas=D,exports.ProfileJSONSchema=T,exports.ProfileRepository=class extends C{constructor(e){super("profile",nt,e)}async getCurrentProfile(){const e=await this.client.getCurrentProfile();if(200===e.status){const t=B.from(e.body);if(t)return t;throw new Error("Invalid profile data received from server")}throw new Error(`Failed to get current profile. Status: ${e.status}`)}},exports.QUERY_BUILDER_TYPE=z,exports.QueryBuilder=_,exports.Role=k,exports.RoleJSONSchema=F,exports.TeamManagementDTOSchemas=Y,exports.TeamMember=ee,exports.TeamMemberJSONSchema=X,exports.TeamMemberRepository=te,exports.User=q,exports.UserJSONSchema=L,exports.ValidatedBeneficiaryInputFactory=ge,exports.Wallet=Xe,exports.WalletDTOSchemas=Ye,exports.WalletJSONSchema=Ze,exports.WalletRepository=class extends C{constructor(e){super("wallet",rt,e)}async getBalance(e){if(!e.wallet&&!e.accountNo)throw new Error("Either wallet or accountNo must be provided");if(e.wallet){const t=await this.client.getBalance({body:{accountNo:e.wallet.accountNo}});if(201===t.status){const o=t.body.availableBalance,a=r.Amount.from(o,e.wallet.currencyCode);if(a)return a}}if(e.accountNo){const t=await this.getWallets({accountNo:e.accountNo});if(0===t.length)throw new Error(`No wallet found for accountNo: ${e.accountNo}`);const o=t[0],a=await this.client.getBalance({body:{accountNo:e.accountNo}});if(201===a.status){const e=a.body.availableBalance,t=r.Amount.from(e,o.currencyCode);if(t)return t}}throw new Error("Failed to fetch balance")}async getWallets(e){const t=ot.from(e).build(),r=await this.client.getWallets({query:t});if(200===r.status){const e=r.body;try{return e.map(e=>{const t=Xe.from(e);if(!t)throw new Error(`Invalid wallet data: ${JSON.stringify(e)}`);return t})}catch(e){throw console.error("[WalletRepository] Error processing wallet data:",e),new Error("Failed to process wallet data from API")}}throw new Error(`Failed to fetch wallets. Status: ${r.status}`)}async getByID(e){const t=ot.create().whereId(e),r=await this.getWallets(t);return r.length>0?r[0]:void 0}async getStatement(e){if(!e.wallet&&!e.accountNo)throw new Error("Either wallet or accountNo must be provided");const t=new Date,r=new Date(t.getFullYear(),t.getMonth(),1),o=new Date(t.getFullYear(),t.getMonth()+1,0),a=e.range??{startDate:r,endDate:o};let n,s;if(e.wallet)n=e.wallet,s=e.wallet.accountNo;else{if(!e.accountNo)throw new Error("Either wallet or accountNo must be provided");{const t=await this.getWallets({accountNo:e.accountNo});if(0===t.length)throw new Error(`No wallet found for accountNo: ${e.accountNo}`);n=t[0],s=e.accountNo}}const i={...a,accountNo:s},c=await this.client.getStatement({body:i});if(201===c.status){return c.body.map(e=>({...e,currencyCode:n.currencyCode})).reduce((e,t)=>{const r=tt.create(t);return r?e.push(r):console.warn("[WalletRepository] Skipping invalid statement entry:",t),e},[])}throw new Error(`Failed to fetch statement. Status: ${c.status}`)}async exists(e){return(await this.getWallets(e)).length>0}async count(e){return(await this.getWallets(e)).length}},exports.WalletStatementEntry=tt,exports.WalletStatementEntryJSONSchema=et,exports.WalletUtils=at,exports.contract=Ne,exports.createPaginatedResponse=function(e,t,r,o){return{results:e,pagination:new R(t,r,o)}},exports.createPaginatedResponseSchema=function(t){return e.z.object({results:e.z.array(t),pagination:x})},exports.createPayoutChannelCode=Ge,exports.emptyPaginatedResponse=function(e=1,t=10){return{results:[],pagination:new R(e,t,0)}},exports.isError=function(e){const t=e;return t&&"string"==typeof t.stack&&"string"==typeof t.message},exports.setGlobalTokenGetter=e=>{A=e};
2
+ //# sourceMappingURL=index.cjs.js.map