moonhead 1.0.0

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 (631) hide show
  1. package/README.md +32 -0
  2. package/dist/components/layout/app-header.d.ts +1 -0
  3. package/dist/components/layout/app-header.js +1 -0
  4. package/dist/components/layout/app-sidebar.d.ts +9 -0
  5. package/dist/components/layout/app-sidebar.js +1 -0
  6. package/dist/components/layout/brand-logo.d.ts +2 -0
  7. package/dist/components/layout/brand-logo.js +1 -0
  8. package/dist/components/layout/user-menu.d.ts +6 -0
  9. package/dist/components/layout/user-menu.js +1 -0
  10. package/dist/components/ui/action-form.d.ts +10 -0
  11. package/dist/components/ui/action-form.js +1 -0
  12. package/dist/components/ui/alert-dialog.d.ts +14 -0
  13. package/dist/components/ui/alert-dialog.js +1 -0
  14. package/dist/components/ui/alert.d.ts +12 -0
  15. package/dist/components/ui/alert.js +1 -0
  16. package/dist/components/ui/avatar.d.ts +12 -0
  17. package/dist/components/ui/avatar.js +1 -0
  18. package/dist/components/ui/badge.d.ts +2 -0
  19. package/dist/components/ui/badge.js +1 -0
  20. package/dist/components/ui/button.d.ts +12 -0
  21. package/dist/components/ui/button.js +1 -0
  22. package/dist/components/ui/card.d.ts +2 -0
  23. package/dist/components/ui/card.js +1 -0
  24. package/dist/components/ui/checkbox.d.ts +5 -0
  25. package/dist/components/ui/checkbox.js +1 -0
  26. package/dist/components/ui/combobox.d.ts +18 -0
  27. package/dist/components/ui/combobox.js +1 -0
  28. package/dist/components/ui/copy-button.d.ts +8 -0
  29. package/dist/components/ui/copy-button.js +1 -0
  30. package/dist/components/ui/country-select.d.ts +12 -0
  31. package/dist/components/ui/country-select.js +1 -0
  32. package/dist/components/ui/data-table.d.ts +11 -0
  33. package/dist/components/ui/data-table.js +1 -0
  34. package/dist/components/ui/date-range-picker.d.ts +25 -0
  35. package/dist/components/ui/date-range-picker.js +1 -0
  36. package/dist/components/ui/dialog.d.ts +19 -0
  37. package/dist/components/ui/dialog.js +1 -0
  38. package/dist/components/ui/drawer.d.ts +24 -0
  39. package/dist/components/ui/drawer.js +1 -0
  40. package/dist/components/ui/dropdown-menu.d.ts +17 -0
  41. package/dist/components/ui/dropdown-menu.js +1 -0
  42. package/dist/components/ui/field.d.ts +7 -0
  43. package/dist/components/ui/field.js +1 -0
  44. package/dist/components/ui/fieldset.d.ts +4 -0
  45. package/dist/components/ui/fieldset.js +1 -0
  46. package/dist/components/ui/form-field.d.ts +17 -0
  47. package/dist/components/ui/form-field.js +1 -0
  48. package/dist/components/ui/form.d.ts +3 -0
  49. package/dist/components/ui/form.js +1 -0
  50. package/dist/components/ui/icon-tile.d.ts +5 -0
  51. package/dist/components/ui/icon-tile.js +1 -0
  52. package/dist/components/ui/identity.d.ts +6 -0
  53. package/dist/components/ui/identity.js +1 -0
  54. package/dist/components/ui/input.d.ts +4 -0
  55. package/dist/components/ui/input.js +1 -0
  56. package/dist/components/ui/number-input.d.ts +19 -0
  57. package/dist/components/ui/number-input.js +1 -0
  58. package/dist/components/ui/otp-field.d.ts +6 -0
  59. package/dist/components/ui/otp-field.js +1 -0
  60. package/dist/components/ui/page-toolbar.d.ts +9 -0
  61. package/dist/components/ui/page-toolbar.js +1 -0
  62. package/dist/components/ui/password-input.d.ts +7 -0
  63. package/dist/components/ui/password-input.js +1 -0
  64. package/dist/components/ui/radio-group.d.ts +5 -0
  65. package/dist/components/ui/radio-group.js +1 -0
  66. package/dist/components/ui/search-input.d.ts +4 -0
  67. package/dist/components/ui/search-input.js +1 -0
  68. package/dist/components/ui/section-card.d.ts +7 -0
  69. package/dist/components/ui/section-card.js +1 -0
  70. package/dist/components/ui/select-field.d.ts +19 -0
  71. package/dist/components/ui/select-field.js +1 -0
  72. package/dist/components/ui/select.d.ts +17 -0
  73. package/dist/components/ui/select.js +1 -0
  74. package/dist/components/ui/sidebar.d.ts +27 -0
  75. package/dist/components/ui/sidebar.js +1 -0
  76. package/dist/components/ui/slider.d.ts +10 -0
  77. package/dist/components/ui/slider.js +1 -0
  78. package/dist/components/ui/sort-button.d.ts +5 -0
  79. package/dist/components/ui/sort-button.js +1 -0
  80. package/dist/components/ui/spinner.d.ts +4 -0
  81. package/dist/components/ui/spinner.js +1 -0
  82. package/dist/components/ui/status-badge.d.ts +11 -0
  83. package/dist/components/ui/status-badge.js +1 -0
  84. package/dist/components/ui/switch-field.d.ts +18 -0
  85. package/dist/components/ui/switch-field.js +1 -0
  86. package/dist/components/ui/switch.d.ts +3 -0
  87. package/dist/components/ui/switch.js +1 -0
  88. package/dist/components/ui/table-pagination.d.ts +9 -0
  89. package/dist/components/ui/table-pagination.js +1 -0
  90. package/dist/components/ui/table.d.ts +18 -0
  91. package/dist/components/ui/table.js +1 -0
  92. package/dist/components/ui/tabs.d.ts +8 -0
  93. package/dist/components/ui/tabs.js +1 -0
  94. package/dist/components/ui/tag-input.d.ts +9 -0
  95. package/dist/components/ui/tag-input.js +1 -0
  96. package/dist/components/ui/text-link.d.ts +10 -0
  97. package/dist/components/ui/text-link.js +1 -0
  98. package/dist/components/ui/textarea.d.ts +2 -0
  99. package/dist/components/ui/textarea.js +1 -0
  100. package/dist/components/ui/toast.d.ts +1 -0
  101. package/dist/components/ui/toast.js +1 -0
  102. package/dist/components/ui/tree.d.ts +32 -0
  103. package/dist/components/ui/tree.js +1 -0
  104. package/dist/db/client.d.ts +8 -0
  105. package/dist/db/client.js +1 -0
  106. package/dist/db/index.d.ts +3 -0
  107. package/dist/db/index.js +1 -0
  108. package/dist/db/logger.d.ts +2 -0
  109. package/dist/db/logger.js +1 -0
  110. package/dist/db/migrations/20260628182304_wonderful_groot/migration.sql +289 -0
  111. package/dist/db/migrations/20260628182304_wonderful_groot/snapshot.json +3750 -0
  112. package/dist/db/migrations/20260630082829_wet_robin_chapel/migration.sql +2 -0
  113. package/dist/db/migrations/20260630082829_wet_robin_chapel/snapshot.json +3791 -0
  114. package/dist/db/migrations/20260702132335_wooden_iron_monger/migration.sql +48 -0
  115. package/dist/db/migrations/20260702132335_wooden_iron_monger/snapshot.json +4407 -0
  116. package/dist/db/migrations/20260702142948_vengeful_rhino/migration.sql +1 -0
  117. package/dist/db/migrations/20260702142948_vengeful_rhino/snapshot.json +4420 -0
  118. package/dist/db/migrations/20260702185813_curved_pyro/migration.sql +16 -0
  119. package/dist/db/migrations/20260702185813_curved_pyro/snapshot.json +4646 -0
  120. package/dist/db/migrations/20260702192041_shiny_franklin_storm/migration.sql +16 -0
  121. package/dist/db/migrations/20260702192041_shiny_franklin_storm/snapshot.json +4872 -0
  122. package/dist/db/migrations/20260704101548_bizarre_namorita/migration.sql +1 -0
  123. package/dist/db/migrations/20260704101548_bizarre_namorita/snapshot.json +4885 -0
  124. package/dist/db/migrations/20260704105911_sleepy_juggernaut/migration.sql +1 -0
  125. package/dist/db/migrations/20260704105911_sleepy_juggernaut/snapshot.json +4898 -0
  126. package/dist/db/migrations/20260704115959_lean_sandman/migration.sql +1 -0
  127. package/dist/db/migrations/20260704115959_lean_sandman/snapshot.json +4885 -0
  128. package/dist/db/migrations/20260707231532_daffy_captain_stacy/migration.sql +10 -0
  129. package/dist/db/migrations/20260707231532_daffy_captain_stacy/snapshot.json +4919 -0
  130. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/migration.sql +3 -0
  131. package/dist/db/migrations/20260708190355_spooky_jimmy_woo/snapshot.json +4970 -0
  132. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/migration.sql +7 -0
  133. package/dist/db/migrations/20260711145212_drop_legacy_earning_status/snapshot.json +4968 -0
  134. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/migration.sql +3 -0
  135. package/dist/db/migrations/20260712161249_dashboard_stat_indexes/snapshot.json +5038 -0
  136. package/dist/db/migrations/20260713013911_add_payout_paid_at/migration.sql +2 -0
  137. package/dist/db/migrations/20260713013911_add_payout_paid_at/snapshot.json +5072 -0
  138. package/dist/db/schema/analytics-outbox.d.ts +145 -0
  139. package/dist/db/schema/analytics-outbox.js +1 -0
  140. package/dist/db/schema/audit-logs.d.ts +204 -0
  141. package/dist/db/schema/audit-logs.js +1 -0
  142. package/dist/db/schema/campaigns.d.ts +180 -0
  143. package/dist/db/schema/campaigns.js +1 -0
  144. package/dist/db/schema/casinos.d.ts +129 -0
  145. package/dist/db/schema/casinos.js +1 -0
  146. package/dist/db/schema/commission-rule-groups.d.ts +84 -0
  147. package/dist/db/schema/commission-rule-groups.js +1 -0
  148. package/dist/db/schema/commission-rules.d.ts +145 -0
  149. package/dist/db/schema/commission-rules.js +1 -0
  150. package/dist/db/schema/commissions.d.ts +242 -0
  151. package/dist/db/schema/commissions.js +1 -0
  152. package/dist/db/schema/conversions.d.ts +302 -0
  153. package/dist/db/schema/conversions.js +1 -0
  154. package/dist/db/schema/deals.d.ts +180 -0
  155. package/dist/db/schema/deals.js +1 -0
  156. package/dist/db/schema/earnings.d.ts +262 -0
  157. package/dist/db/schema/earnings.js +1 -0
  158. package/dist/db/schema/groups.d.ts +214 -0
  159. package/dist/db/schema/groups.js +1 -0
  160. package/dist/db/schema/index.d.ts +18 -0
  161. package/dist/db/schema/index.js +1 -0
  162. package/dist/db/schema/payouts.d.ts +182 -0
  163. package/dist/db/schema/payouts.js +1 -0
  164. package/dist/db/schema/platform-settings.d.ts +84 -0
  165. package/dist/db/schema/platform-settings.js +1 -0
  166. package/dist/db/schema/player-activity.d.ts +159 -0
  167. package/dist/db/schema/player-activity.js +1 -0
  168. package/dist/db/schema/revshare-carryover.d.ts +129 -0
  169. package/dist/db/schema/revshare-carryover.js +1 -0
  170. package/dist/db/schema/sessions.d.ts +213 -0
  171. package/dist/db/schema/sessions.js +1 -0
  172. package/dist/db/schema/table.d.ts +1 -0
  173. package/dist/db/schema/table.js +1 -0
  174. package/dist/db/schema/users.d.ts +609 -0
  175. package/dist/db/schema/users.js +1 -0
  176. package/dist/db/schema/verification-tokens.d.ts +106 -0
  177. package/dist/db/schema/verification-tokens.js +1 -0
  178. package/dist/db/types/branded.d.ts +3 -0
  179. package/dist/db/types/branded.js +0 -0
  180. package/dist/db/types/commission-rules.d.ts +70 -0
  181. package/dist/db/types/commission-rules.js +1 -0
  182. package/dist/db/types/index.d.ts +2 -0
  183. package/dist/db/types/index.js +1 -0
  184. package/dist/emails/admin/support-message.d.ts +39 -0
  185. package/dist/emails/admin/support-message.js +5 -0
  186. package/dist/emails/affiliate/activated.d.ts +33 -0
  187. package/dist/emails/affiliate/activated.js +1 -0
  188. package/dist/emails/affiliate/deal-notice.d.ts +35 -0
  189. package/dist/emails/affiliate/deal-notice.js +1 -0
  190. package/dist/emails/affiliate/invite.d.ts +35 -0
  191. package/dist/emails/affiliate/invite.js +1 -0
  192. package/dist/emails/affiliate/signup-verify.d.ts +35 -0
  193. package/dist/emails/affiliate/signup-verify.js +1 -0
  194. package/dist/emails/auth/password-reset.d.ts +37 -0
  195. package/dist/emails/auth/password-reset.js +1 -0
  196. package/dist/emails/layout.d.ts +10 -0
  197. package/dist/emails/layout.js +1 -0
  198. package/dist/emails/manager/affiliate-activated.d.ts +33 -0
  199. package/dist/emails/manager/affiliate-activated.js +1 -0
  200. package/dist/emails/manager/bulk-affiliates-activated.d.ts +33 -0
  201. package/dist/emails/manager/bulk-affiliates-activated.js +1 -0
  202. package/dist/emails/manager/invite.d.ts +35 -0
  203. package/dist/emails/manager/invite.js +1 -0
  204. package/dist/emails/manager/pending-approval.d.ts +33 -0
  205. package/dist/emails/manager/pending-approval.js +1 -0
  206. package/dist/emails/preview-env.d.ts +2 -0
  207. package/dist/emails/preview-env.js +1 -0
  208. package/dist/features/affiliates/actions.d.ts +60 -0
  209. package/dist/features/affiliates/actions.js +1 -0
  210. package/dist/features/affiliates/activation-email.d.ts +8 -0
  211. package/dist/features/affiliates/activation-email.js +1 -0
  212. package/dist/features/affiliates/bulk-approve.d.ts +2 -0
  213. package/dist/features/affiliates/bulk-approve.js +1 -0
  214. package/dist/features/affiliates/components/affiliate-actions-menu.d.ts +6 -0
  215. package/dist/features/affiliates/components/affiliate-actions-menu.js +1 -0
  216. package/dist/features/affiliates/components/affiliate-create-button.d.ts +1 -0
  217. package/dist/features/affiliates/components/affiliate-create-button.js +1 -0
  218. package/dist/features/affiliates/components/affiliate-detail-tabs.d.ts +6 -0
  219. package/dist/features/affiliates/components/affiliate-detail-tabs.js +1 -0
  220. package/dist/features/affiliates/components/affiliate-dialog.d.ts +11 -0
  221. package/dist/features/affiliates/components/affiliate-dialog.js +1 -0
  222. package/dist/features/affiliates/components/affiliate-profile-fields.d.ts +6 -0
  223. package/dist/features/affiliates/components/affiliate-profile-fields.js +1 -0
  224. package/dist/features/affiliates/components/affiliate-status-badge.d.ts +4 -0
  225. package/dist/features/affiliates/components/affiliate-status-badge.js +1 -0
  226. package/dist/features/affiliates/components/affiliate-status-tabs.d.ts +4 -0
  227. package/dist/features/affiliates/components/affiliate-status-tabs.js +1 -0
  228. package/dist/features/affiliates/components/affiliates-table.d.ts +10 -0
  229. package/dist/features/affiliates/components/affiliates-table.js +1 -0
  230. package/dist/features/affiliates/components/assign-parent-dialog.d.ts +5 -0
  231. package/dist/features/affiliates/components/assign-parent-dialog.js +1 -0
  232. package/dist/features/affiliates/components/detach-affiliate-confirm.d.ts +5 -0
  233. package/dist/features/affiliates/components/detach-affiliate-confirm.js +1 -0
  234. package/dist/features/affiliates/components/reject-affiliate-confirm.d.ts +5 -0
  235. package/dist/features/affiliates/components/reject-affiliate-confirm.js +1 -0
  236. package/dist/features/affiliates/components/sub-affiliate-invite-button.d.ts +3 -0
  237. package/dist/features/affiliates/components/sub-affiliate-invite-button.js +1 -0
  238. package/dist/features/affiliates/invite.d.ts +6 -0
  239. package/dist/features/affiliates/invite.js +1 -0
  240. package/dist/features/affiliates/list-params.d.ts +27 -0
  241. package/dist/features/affiliates/list-params.js +1 -0
  242. package/dist/features/affiliates/pending-notification.d.ts +18 -0
  243. package/dist/features/affiliates/pending-notification.js +1 -0
  244. package/dist/features/affiliates/sub-invite.d.ts +7 -0
  245. package/dist/features/affiliates/sub-invite.js +1 -0
  246. package/dist/features/audit/action-labels.d.ts +15 -0
  247. package/dist/features/audit/action-labels.js +1 -0
  248. package/dist/features/audit/components/audit-log-table.d.ts +5 -0
  249. package/dist/features/audit/components/audit-log-table.js +1 -0
  250. package/dist/features/audit/list-params.d.ts +2 -0
  251. package/dist/features/audit/list-params.js +1 -0
  252. package/dist/features/audit/read.d.ts +27 -0
  253. package/dist/features/audit/read.js +1 -0
  254. package/dist/features/auth/actions.d.ts +33 -0
  255. package/dist/features/auth/actions.js +1 -0
  256. package/dist/features/auth/authorization.d.ts +14 -0
  257. package/dist/features/auth/authorization.js +1 -0
  258. package/dist/features/auth/components/accept-invite-form.d.ts +3 -0
  259. package/dist/features/auth/components/accept-invite-form.js +1 -0
  260. package/dist/features/auth/components/forgot-password-form.d.ts +1 -0
  261. package/dist/features/auth/components/forgot-password-form.js +1 -0
  262. package/dist/features/auth/components/permissions-form.d.ts +5 -0
  263. package/dist/features/auth/components/permissions-form.js +1 -0
  264. package/dist/features/auth/components/reset-password-form.d.ts +3 -0
  265. package/dist/features/auth/components/reset-password-form.js +1 -0
  266. package/dist/features/auth/components/signin-form.d.ts +5 -0
  267. package/dist/features/auth/components/signin-form.js +1 -0
  268. package/dist/features/auth/components/signup-form.d.ts +1 -0
  269. package/dist/features/auth/components/signup-form.js +1 -0
  270. package/dist/features/auth/components/verify-email-form.d.ts +3 -0
  271. package/dist/features/auth/components/verify-email-form.js +1 -0
  272. package/dist/features/auth/password-reset.d.ts +6 -0
  273. package/dist/features/auth/password-reset.js +1 -0
  274. package/dist/features/auth/permissions.d.ts +49 -0
  275. package/dist/features/auth/permissions.js +1 -0
  276. package/dist/features/auth/require.d.ts +3 -0
  277. package/dist/features/auth/require.js +1 -0
  278. package/dist/features/auth/signup-email.d.ts +6 -0
  279. package/dist/features/auth/signup-email.js +1 -0
  280. package/dist/features/campaigns/actions.d.ts +53 -0
  281. package/dist/features/campaigns/actions.js +1 -0
  282. package/dist/features/campaigns/components/campaign-dialog.d.ts +7 -0
  283. package/dist/features/campaigns/components/campaign-dialog.js +1 -0
  284. package/dist/features/campaigns/components/campaign-row-actions.d.ts +8 -0
  285. package/dist/features/campaigns/components/campaign-row-actions.js +1 -0
  286. package/dist/features/campaigns/components/campaign-status-badge.d.ts +6 -0
  287. package/dist/features/campaigns/components/campaign-status-badge.js +1 -0
  288. package/dist/features/campaigns/components/campaign-status-tabs.d.ts +1 -0
  289. package/dist/features/campaigns/components/campaign-status-tabs.js +1 -0
  290. package/dist/features/campaigns/components/campaigns-table.d.ts +7 -0
  291. package/dist/features/campaigns/components/campaigns-table.js +1 -0
  292. package/dist/features/campaigns/components/create-campaign-button.d.ts +5 -0
  293. package/dist/features/campaigns/components/create-campaign-button.js +1 -0
  294. package/dist/features/campaigns/components/sub-id-builder.d.ts +4 -0
  295. package/dist/features/campaigns/components/sub-id-builder.js +1 -0
  296. package/dist/features/campaigns/components/tracking-link-box.d.ts +3 -0
  297. package/dist/features/campaigns/components/tracking-link-box.js +1 -0
  298. package/dist/features/campaigns/components/tracking-link-cell.d.ts +4 -0
  299. package/dist/features/campaigns/components/tracking-link-cell.js +1 -0
  300. package/dist/features/campaigns/components/tracking-link-dialog.d.ts +6 -0
  301. package/dist/features/campaigns/components/tracking-link-dialog.js +1 -0
  302. package/dist/features/campaigns/list-params.d.ts +14 -0
  303. package/dist/features/campaigns/list-params.js +1 -0
  304. package/dist/features/campaigns/tracking-url.d.ts +8 -0
  305. package/dist/features/campaigns/tracking-url.js +1 -0
  306. package/dist/features/casinos/actions.d.ts +39 -0
  307. package/dist/features/casinos/actions.js +1 -0
  308. package/dist/features/casinos/components/casino-create-button.d.ts +1 -0
  309. package/dist/features/casinos/components/casino-create-button.js +1 -0
  310. package/dist/features/casinos/components/casino-dialog.d.ts +11 -0
  311. package/dist/features/casinos/components/casino-dialog.js +1 -0
  312. package/dist/features/casinos/components/casino-form-fields.d.ts +7 -0
  313. package/dist/features/casinos/components/casino-form-fields.js +1 -0
  314. package/dist/features/casinos/components/casino-status-tabs.d.ts +1 -0
  315. package/dist/features/casinos/components/casino-status-tabs.js +1 -0
  316. package/dist/features/casinos/components/casinos-table.d.ts +6 -0
  317. package/dist/features/casinos/components/casinos-table.js +1 -0
  318. package/dist/features/casinos/components/delete-casino-confirm.d.ts +5 -0
  319. package/dist/features/casinos/components/delete-casino-confirm.js +1 -0
  320. package/dist/features/casinos/list-params.d.ts +14 -0
  321. package/dist/features/casinos/list-params.js +1 -0
  322. package/dist/features/commissions/actions.d.ts +76 -0
  323. package/dist/features/commissions/actions.js +1 -0
  324. package/dist/features/commissions/components/casino-bindings-field.d.ts +10 -0
  325. package/dist/features/commissions/components/casino-bindings-field.js +1 -0
  326. package/dist/features/commissions/components/commission-create-button.d.ts +1 -0
  327. package/dist/features/commissions/components/commission-create-button.js +1 -0
  328. package/dist/features/commissions/components/commission-detail-dialog.d.ts +5 -0
  329. package/dist/features/commissions/components/commission-detail-dialog.js +1 -0
  330. package/dist/features/commissions/components/commission-editor.d.ts +8 -0
  331. package/dist/features/commissions/components/commission-editor.js +1 -0
  332. package/dist/features/commissions/components/commission-read-view.d.ts +5 -0
  333. package/dist/features/commissions/components/commission-read-view.js +1 -0
  334. package/dist/features/commissions/components/commission-status-badge.d.ts +4 -0
  335. package/dist/features/commissions/components/commission-status-badge.js +1 -0
  336. package/dist/features/commissions/components/commission-status-tabs.d.ts +1 -0
  337. package/dist/features/commissions/components/commission-status-tabs.js +1 -0
  338. package/dist/features/commissions/components/commissions-table.d.ts +14 -0
  339. package/dist/features/commissions/components/commissions-table.js +1 -0
  340. package/dist/features/commissions/components/delete-commission-confirm.d.ts +5 -0
  341. package/dist/features/commissions/components/delete-commission-confirm.js +1 -0
  342. package/dist/features/commissions/components/duplicate-commission-dialog.d.ts +6 -0
  343. package/dist/features/commissions/components/duplicate-commission-dialog.js +1 -0
  344. package/dist/features/commissions/components/rule-editor/conditions-block.d.ts +9 -0
  345. package/dist/features/commissions/components/rule-editor/conditions-block.js +1 -0
  346. package/dist/features/commissions/components/rule-editor/modifiers-block.d.ts +9 -0
  347. package/dist/features/commissions/components/rule-editor/modifiers-block.js +1 -0
  348. package/dist/features/commissions/components/rule-editor/qualifiers-block.d.ts +9 -0
  349. package/dist/features/commissions/components/rule-editor/qualifiers-block.js +1 -0
  350. package/dist/features/commissions/components/rule-editor/reducer.d.ts +102 -0
  351. package/dist/features/commissions/components/rule-editor/reducer.js +1 -0
  352. package/dist/features/commissions/components/rule-editor/rewards-block.d.ts +9 -0
  353. package/dist/features/commissions/components/rule-editor/rewards-block.js +1 -0
  354. package/dist/features/commissions/components/rule-editor/rule-card.d.ts +10 -0
  355. package/dist/features/commissions/components/rule-editor/rule-card.js +1 -0
  356. package/dist/features/commissions/components/rule-editor/rule-editor.d.ts +7 -0
  357. package/dist/features/commissions/components/rule-editor/rule-editor.js +1 -0
  358. package/dist/features/commissions/components/rule-editor/rule-group-card.d.ts +9 -0
  359. package/dist/features/commissions/components/rule-editor/rule-group-card.js +1 -0
  360. package/dist/features/commissions/components/rule-editor/state.d.ts +21 -0
  361. package/dist/features/commissions/components/rule-editor/state.js +1 -0
  362. package/dist/features/commissions/components/rule-groups-read-view.d.ts +4 -0
  363. package/dist/features/commissions/components/rule-groups-read-view.js +1 -0
  364. package/dist/features/commissions/list-params.d.ts +14 -0
  365. package/dist/features/commissions/list-params.js +1 -0
  366. package/dist/features/commissions/rule-validation.d.ts +173 -0
  367. package/dist/features/commissions/rule-validation.js +1 -0
  368. package/dist/features/dashboard/affiliate-queries.d.ts +14 -0
  369. package/dist/features/dashboard/affiliate-queries.js +1 -0
  370. package/dist/features/dashboard/clickhouse.d.ts +3 -0
  371. package/dist/features/dashboard/clickhouse.js +2 -0
  372. package/dist/features/dashboard/components/affiliate-charts.d.ts +5 -0
  373. package/dist/features/dashboard/components/affiliate-charts.js +1 -0
  374. package/dist/features/dashboard/components/affiliate-stats.d.ts +5 -0
  375. package/dist/features/dashboard/components/affiliate-stats.js +1 -0
  376. package/dist/features/dashboard/components/charts/funnel-chart.d.ts +11 -0
  377. package/dist/features/dashboard/components/charts/funnel-chart.js +1 -0
  378. package/dist/features/dashboard/components/charts/rank-bar-chart.d.ts +10 -0
  379. package/dist/features/dashboard/components/charts/rank-bar-chart.js +1 -0
  380. package/dist/features/dashboard/components/charts/time-series-chart.d.ts +12 -0
  381. package/dist/features/dashboard/components/charts/time-series-chart.js +1 -0
  382. package/dist/features/dashboard/components/charts-grid.d.ts +8 -0
  383. package/dist/features/dashboard/components/charts-grid.js +1 -0
  384. package/dist/features/dashboard/components/dashboard-charts.d.ts +4 -0
  385. package/dist/features/dashboard/components/dashboard-charts.js +1 -0
  386. package/dist/features/dashboard/components/dashboard-period-tabs.d.ts +1 -0
  387. package/dist/features/dashboard/components/dashboard-period-tabs.js +1 -0
  388. package/dist/features/dashboard/components/money-stat-card.d.ts +6 -0
  389. package/dist/features/dashboard/components/money-stat-card.js +1 -0
  390. package/dist/features/dashboard/components/stat-card.d.ts +6 -0
  391. package/dist/features/dashboard/components/stat-card.js +1 -0
  392. package/dist/features/dashboard/components/top-affiliates.d.ts +4 -0
  393. package/dist/features/dashboard/components/top-affiliates.js +1 -0
  394. package/dist/features/dashboard/list-params.d.ts +24 -0
  395. package/dist/features/dashboard/list-params.js +1 -0
  396. package/dist/features/dashboard/queries.d.ts +63 -0
  397. package/dist/features/dashboard/queries.js +1 -0
  398. package/dist/features/dashboard/series.d.ts +32 -0
  399. package/dist/features/dashboard/series.js +1 -0
  400. package/dist/features/deals/actions.d.ts +60 -0
  401. package/dist/features/deals/actions.js +1 -0
  402. package/dist/features/deals/components/affiliate-deals.d.ts +10 -0
  403. package/dist/features/deals/components/affiliate-deals.js +1 -0
  404. package/dist/features/deals/components/assign-deal-button.d.ts +9 -0
  405. package/dist/features/deals/components/assign-deal-button.js +1 -0
  406. package/dist/features/deals/components/deal-dialog.d.ts +19 -0
  407. package/dist/features/deals/components/deal-dialog.js +1 -0
  408. package/dist/features/deals/components/deal-row-actions.d.ts +6 -0
  409. package/dist/features/deals/components/deal-row-actions.js +1 -0
  410. package/dist/features/deals/components/deal-status-badge.d.ts +10 -0
  411. package/dist/features/deals/components/deal-status-badge.js +1 -0
  412. package/dist/features/deals/components/deal-status-tabs.d.ts +1 -0
  413. package/dist/features/deals/components/deal-status-tabs.js +1 -0
  414. package/dist/features/deals/components/delegate-deal-button.d.ts +8 -0
  415. package/dist/features/deals/components/delegate-deal-button.js +1 -0
  416. package/dist/features/deals/deal-assigned-email.d.ts +11 -0
  417. package/dist/features/deals/deal-assigned-email.js +1 -0
  418. package/dist/features/deals/deal-delegated-email.d.ts +13 -0
  419. package/dist/features/deals/deal-delegated-email.js +1 -0
  420. package/dist/features/deals/list-params.d.ts +14 -0
  421. package/dist/features/deals/list-params.js +1 -0
  422. package/dist/features/earnings/components/earnings-balances.d.ts +4 -0
  423. package/dist/features/earnings/components/earnings-balances.js +1 -0
  424. package/dist/features/earnings/components/earnings-ledger.d.ts +5 -0
  425. package/dist/features/earnings/components/earnings-ledger.js +1 -0
  426. package/dist/features/earnings/components/earnings-status-badge.d.ts +4 -0
  427. package/dist/features/earnings/components/earnings-status-badge.js +1 -0
  428. package/dist/features/earnings/components/earnings-status-tabs.d.ts +1 -0
  429. package/dist/features/earnings/components/earnings-status-tabs.js +1 -0
  430. package/dist/features/earnings/components/sub-affiliate-earnings.d.ts +4 -0
  431. package/dist/features/earnings/components/sub-affiliate-earnings.js +1 -0
  432. package/dist/features/earnings/list-params.d.ts +14 -0
  433. package/dist/features/earnings/list-params.js +1 -0
  434. package/dist/features/earnings/queries.d.ts +30 -0
  435. package/dist/features/earnings/queries.js +1 -0
  436. package/dist/features/groups/actions.d.ts +36 -0
  437. package/dist/features/groups/actions.js +1 -0
  438. package/dist/features/groups/components/delete-group-confirm.d.ts +5 -0
  439. package/dist/features/groups/components/delete-group-confirm.js +1 -0
  440. package/dist/features/groups/components/group-create-button.d.ts +1 -0
  441. package/dist/features/groups/components/group-create-button.js +1 -0
  442. package/dist/features/groups/components/group-dialog.d.ts +11 -0
  443. package/dist/features/groups/components/group-dialog.js +1 -0
  444. package/dist/features/groups/components/group-form-fields.d.ts +10 -0
  445. package/dist/features/groups/components/group-form-fields.js +1 -0
  446. package/dist/features/groups/components/group-status-tabs.d.ts +1 -0
  447. package/dist/features/groups/components/group-status-tabs.js +1 -0
  448. package/dist/features/groups/components/groups-table.d.ts +9 -0
  449. package/dist/features/groups/components/groups-table.js +1 -0
  450. package/dist/features/groups/list-params.d.ts +14 -0
  451. package/dist/features/groups/list-params.js +1 -0
  452. package/dist/features/managers/actions.d.ts +43 -0
  453. package/dist/features/managers/actions.js +1 -0
  454. package/dist/features/managers/components/manager-create-button.d.ts +1 -0
  455. package/dist/features/managers/components/manager-create-button.js +1 -0
  456. package/dist/features/managers/components/manager-dialog.d.ts +11 -0
  457. package/dist/features/managers/components/manager-dialog.js +1 -0
  458. package/dist/features/managers/components/manager-permissions-dialog.d.ts +7 -0
  459. package/dist/features/managers/components/manager-permissions-dialog.js +1 -0
  460. package/dist/features/managers/components/manager-profile-fields.d.ts +7 -0
  461. package/dist/features/managers/components/manager-profile-fields.js +1 -0
  462. package/dist/features/managers/components/manager-status-tabs.d.ts +1 -0
  463. package/dist/features/managers/components/manager-status-tabs.js +1 -0
  464. package/dist/features/managers/components/managers-table.d.ts +8 -0
  465. package/dist/features/managers/components/managers-table.js +1 -0
  466. package/dist/features/managers/invite.d.ts +6 -0
  467. package/dist/features/managers/invite.js +1 -0
  468. package/dist/features/managers/list-params.d.ts +14 -0
  469. package/dist/features/managers/list-params.js +1 -0
  470. package/dist/features/payouts/actions.d.ts +12 -0
  471. package/dist/features/payouts/actions.js +1 -0
  472. package/dist/features/payouts/balance.d.ts +2 -0
  473. package/dist/features/payouts/balance.js +1 -0
  474. package/dist/features/payouts/components/my-payouts-table.d.ts +5 -0
  475. package/dist/features/payouts/components/my-payouts-table.js +1 -0
  476. package/dist/features/payouts/components/payout-row-actions.d.ts +5 -0
  477. package/dist/features/payouts/components/payout-row-actions.js +1 -0
  478. package/dist/features/payouts/components/payout-status-badge.d.ts +4 -0
  479. package/dist/features/payouts/components/payout-status-badge.js +1 -0
  480. package/dist/features/payouts/components/payout-status-tabs.d.ts +1 -0
  481. package/dist/features/payouts/components/payout-status-tabs.js +1 -0
  482. package/dist/features/payouts/components/payouts-table.d.ts +6 -0
  483. package/dist/features/payouts/components/payouts-table.js +1 -0
  484. package/dist/features/payouts/components/request-payout-dialog.d.ts +4 -0
  485. package/dist/features/payouts/components/request-payout-dialog.js +1 -0
  486. package/dist/features/payouts/constants.d.ts +2 -0
  487. package/dist/features/payouts/constants.js +1 -0
  488. package/dist/features/payouts/list-params.d.ts +14 -0
  489. package/dist/features/payouts/list-params.js +1 -0
  490. package/dist/features/payouts/my-queries.d.ts +14 -0
  491. package/dist/features/payouts/my-queries.js +1 -0
  492. package/dist/features/payouts/queries.d.ts +14 -0
  493. package/dist/features/payouts/queries.js +1 -0
  494. package/dist/features/postbacks/actions.d.ts +27 -0
  495. package/dist/features/postbacks/actions.js +1 -0
  496. package/dist/features/postbacks/components/integration-dialog.d.ts +6 -0
  497. package/dist/features/postbacks/components/integration-dialog.js +1 -0
  498. package/dist/features/postbacks/components/postback-editor.d.ts +5 -0
  499. package/dist/features/postbacks/components/postback-editor.js +1 -0
  500. package/dist/features/postbacks/components/postbacks-table.d.ts +4 -0
  501. package/dist/features/postbacks/components/postbacks-table.js +1 -0
  502. package/dist/features/settings/actions.d.ts +2 -0
  503. package/dist/features/settings/actions.js +1 -0
  504. package/dist/features/settings/components/affiliate-approval-setting.d.ts +3 -0
  505. package/dist/features/settings/components/affiliate-approval-setting.js +1 -0
  506. package/dist/features/settings/components/manager-totp-setting.d.ts +3 -0
  507. package/dist/features/settings/components/manager-totp-setting.js +1 -0
  508. package/dist/features/support/actions.d.ts +12 -0
  509. package/dist/features/support/actions.js +1 -0
  510. package/dist/features/support/components/support-page.d.ts +4 -0
  511. package/dist/features/support/components/support-page.js +1 -0
  512. package/dist/features/support/email.d.ts +13 -0
  513. package/dist/features/support/email.js +1 -0
  514. package/dist/features/users/actions.d.ts +4 -0
  515. package/dist/features/users/actions.js +1 -0
  516. package/dist/features/users/components/password-section.d.ts +1 -0
  517. package/dist/features/users/components/password-section.js +1 -0
  518. package/dist/features/users/components/preferences-section.d.ts +4 -0
  519. package/dist/features/users/components/preferences-section.js +1 -0
  520. package/dist/features/users/components/settings-tabs.d.ts +1 -0
  521. package/dist/features/users/components/settings-tabs.js +1 -0
  522. package/dist/features/users/components/totp-section.d.ts +4 -0
  523. package/dist/features/users/components/totp-section.js +1 -0
  524. package/dist/features/users/list-params.d.ts +12 -0
  525. package/dist/features/users/list-params.js +1 -0
  526. package/dist/features/users/totp.d.ts +7 -0
  527. package/dist/features/users/totp.js +1 -0
  528. package/dist/i18n/config.d.ts +5 -0
  529. package/dist/i18n/config.js +1 -0
  530. package/dist/i18n/get-locale.d.ts +3 -0
  531. package/dist/i18n/get-locale.js +1 -0
  532. package/dist/i18n/locale.d.ts +2 -0
  533. package/dist/i18n/locale.js +1 -0
  534. package/dist/lib/actions/parse-form.d.ts +3 -0
  535. package/dist/lib/actions/parse-form.js +1 -0
  536. package/dist/lib/actions/state.d.ts +22 -0
  537. package/dist/lib/actions/state.js +0 -0
  538. package/dist/lib/audit/actions.d.ts +9 -0
  539. package/dist/lib/audit/actions.js +1 -0
  540. package/dist/lib/audit/record.d.ts +4 -0
  541. package/dist/lib/audit/record.js +1 -0
  542. package/dist/lib/auth/action.d.ts +45 -0
  543. package/dist/lib/auth/action.js +1 -0
  544. package/dist/lib/auth/config.d.ts +24 -0
  545. package/dist/lib/auth/config.js +1 -0
  546. package/dist/lib/auth/jwt.d.ts +17 -0
  547. package/dist/lib/auth/jwt.js +1 -0
  548. package/dist/lib/auth/password-options.d.ts +6 -0
  549. package/dist/lib/auth/password-options.js +1 -0
  550. package/dist/lib/auth/password.d.ts +3 -0
  551. package/dist/lib/auth/password.js +1 -0
  552. package/dist/lib/auth/session.d.ts +26 -0
  553. package/dist/lib/auth/session.js +1 -0
  554. package/dist/lib/auth/tokens.d.ts +43 -0
  555. package/dist/lib/auth/tokens.js +1 -0
  556. package/dist/lib/auth/totp-challenge.d.ts +4 -0
  557. package/dist/lib/auth/totp-challenge.js +1 -0
  558. package/dist/lib/auth/totp.d.ts +7 -0
  559. package/dist/lib/auth/totp.js +1 -0
  560. package/dist/lib/auth/verification-tokens.d.ts +19 -0
  561. package/dist/lib/auth/verification-tokens.js +1 -0
  562. package/dist/lib/cn.d.ts +2 -0
  563. package/dist/lib/cn.js +1 -0
  564. package/dist/lib/countries.d.ts +18 -0
  565. package/dist/lib/countries.js +1 -0
  566. package/dist/lib/currencies.d.ts +6 -0
  567. package/dist/lib/currencies.js +1 -0
  568. package/dist/lib/data/countries-by-continent.json +257 -0
  569. package/dist/lib/db/errors.d.ts +4 -0
  570. package/dist/lib/db/errors.js +1 -0
  571. package/dist/lib/email/client.d.ts +6 -0
  572. package/dist/lib/email/client.js +1 -0
  573. package/dist/lib/email/env.d.ts +12 -0
  574. package/dist/lib/email/env.js +1 -0
  575. package/dist/lib/email/format.d.ts +5 -0
  576. package/dist/lib/email/format.js +1 -0
  577. package/dist/lib/email/locale.d.ts +3 -0
  578. package/dist/lib/email/locale.js +1 -0
  579. package/dist/lib/email/send.d.ts +12 -0
  580. package/dist/lib/email/send.js +1 -0
  581. package/dist/lib/env.d.ts +20 -0
  582. package/dist/lib/env.js +1 -0
  583. package/dist/lib/errors/codes.d.ts +72 -0
  584. package/dist/lib/errors/codes.js +1 -0
  585. package/dist/lib/errors/server.d.ts +10 -0
  586. package/dist/lib/errors/server.js +1 -0
  587. package/dist/lib/format.d.ts +3 -0
  588. package/dist/lib/format.js +1 -0
  589. package/dist/lib/hooks/use-deferred-dialog.d.ts +11 -0
  590. package/dist/lib/hooks/use-deferred-dialog.js +1 -0
  591. package/dist/lib/hooks/use-form-reset.d.ts +2 -0
  592. package/dist/lib/hooks/use-form-reset.js +1 -0
  593. package/dist/lib/hooks/use-form-toast.d.ts +2 -0
  594. package/dist/lib/hooks/use-form-toast.js +1 -0
  595. package/dist/lib/i18n/format-datetime.d.ts +1 -0
  596. package/dist/lib/i18n/format-datetime.js +1 -0
  597. package/dist/lib/i18n/relative-time.d.ts +1 -0
  598. package/dist/lib/i18n/relative-time.js +1 -0
  599. package/dist/lib/list-params.d.ts +51 -0
  600. package/dist/lib/list-params.js +1 -0
  601. package/dist/lib/money.d.ts +2 -0
  602. package/dist/lib/money.js +1 -0
  603. package/dist/lib/platform-settings.d.ts +5 -0
  604. package/dist/lib/platform-settings.js +1 -0
  605. package/dist/lib/preferences/actions.d.ts +1 -0
  606. package/dist/lib/preferences/actions.js +1 -0
  607. package/dist/lib/preferences/index.d.ts +15 -0
  608. package/dist/lib/preferences/index.js +1 -0
  609. package/dist/lib/preferences/read.d.ts +2 -0
  610. package/dist/lib/preferences/read.js +1 -0
  611. package/dist/lib/slug.d.ts +1 -0
  612. package/dist/lib/slug.js +1 -0
  613. package/dist/lib/toast.d.ts +13 -0
  614. package/dist/lib/toast.js +1 -0
  615. package/dist/lib/tracking-cache.d.ts +2 -0
  616. package/dist/lib/tracking-cache.js +1 -0
  617. package/dist/lib/users.d.ts +12 -0
  618. package/dist/lib/users.js +1 -0
  619. package/dist/lib/validation/zod.d.ts +30 -0
  620. package/dist/lib/validation/zod.js +1 -0
  621. package/dist/messages/de/emails.json +136 -0
  622. package/dist/messages/de/index.json +1104 -0
  623. package/dist/messages/en/emails.json +136 -0
  624. package/dist/messages/en/index.json +1104 -0
  625. package/dist/theme/config.d.ts +8 -0
  626. package/dist/theme/config.js +1 -0
  627. package/dist/theme/get-theme.d.ts +3 -0
  628. package/dist/theme/get-theme.js +1 -0
  629. package/dist/theme/theme.d.ts +2 -0
  630. package/dist/theme/theme.js +1 -0
  631. package/package.json +131 -0
@@ -0,0 +1,173 @@
1
+ import { type ConditionNode } from "../../db/types/index.js";
2
+ import { z } from "zod";
3
+ export declare const RuleInputSchema: z.ZodObject<{
4
+ qualifiers: z.ZodArray<z.ZodObject<{
5
+ id: z.ZodString;
6
+ type: z.ZodEnum<{
7
+ first_deposit: "first_deposit";
8
+ deposits_sum: "deposits_sum";
9
+ deposits_count: "deposits_count";
10
+ casino_wager: "casino_wager";
11
+ }>;
12
+ value: z.ZodNumber;
13
+ }, z.core.$strip>>;
14
+ conditions: z.ZodObject<{
15
+ id: z.ZodString;
16
+ type: z.ZodEnum<{
17
+ AND: "AND";
18
+ OR: "OR";
19
+ }>;
20
+ children: z.ZodArray<z.ZodType<ConditionNode, unknown, z.core.$ZodTypeInternals<ConditionNode, unknown>>>;
21
+ }, z.core.$strip>;
22
+ modifiers: z.ZodDefault<z.ZodObject<{
23
+ omit_duplicates: z.ZodOptional<z.ZodBoolean>;
24
+ omit_self_exclusions: z.ZodOptional<z.ZodBoolean>;
25
+ omit_disabled_players: z.ZodOptional<z.ZodBoolean>;
26
+ omit_unverified_players: z.ZodOptional<z.ZodBoolean>;
27
+ omit_cross_brand_duplicates: z.ZodOptional<z.ZodBoolean>;
28
+ }, z.core.$strip>>;
29
+ rewards: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
30
+ id: z.ZodString;
31
+ type: z.ZodLiteral<"fixed">;
32
+ event: z.ZodEnum<{
33
+ registration: "registration";
34
+ ftd: "ftd";
35
+ deposit: "deposit";
36
+ }>;
37
+ value: z.ZodNumber;
38
+ }, z.core.$strip>, z.ZodObject<{
39
+ id: z.ZodString;
40
+ type: z.ZodLiteral<"percentage">;
41
+ metric: z.ZodEnum<{
42
+ deposits_sum: "deposits_sum";
43
+ casino_wager: "casino_wager";
44
+ casino_ngr: "casino_ngr";
45
+ }>;
46
+ value: z.ZodNumber;
47
+ tiers: z.ZodOptional<z.ZodArray<z.ZodObject<{
48
+ id: z.ZodString;
49
+ min: z.ZodNumber;
50
+ rate: z.ZodNumber;
51
+ }, z.core.$strip>>>;
52
+ }, z.core.$strip>], "type">>;
53
+ }, z.core.$strip>;
54
+ export declare const RuleGroupInputSchema: z.ZodObject<{
55
+ priority: z.ZodOptional<z.ZodNumber>;
56
+ rules: z.ZodArray<z.ZodObject<{
57
+ qualifiers: z.ZodArray<z.ZodObject<{
58
+ id: z.ZodString;
59
+ type: z.ZodEnum<{
60
+ first_deposit: "first_deposit";
61
+ deposits_sum: "deposits_sum";
62
+ deposits_count: "deposits_count";
63
+ casino_wager: "casino_wager";
64
+ }>;
65
+ value: z.ZodNumber;
66
+ }, z.core.$strip>>;
67
+ conditions: z.ZodObject<{
68
+ id: z.ZodString;
69
+ type: z.ZodEnum<{
70
+ AND: "AND";
71
+ OR: "OR";
72
+ }>;
73
+ children: z.ZodArray<z.ZodType<ConditionNode, unknown, z.core.$ZodTypeInternals<ConditionNode, unknown>>>;
74
+ }, z.core.$strip>;
75
+ modifiers: z.ZodDefault<z.ZodObject<{
76
+ omit_duplicates: z.ZodOptional<z.ZodBoolean>;
77
+ omit_self_exclusions: z.ZodOptional<z.ZodBoolean>;
78
+ omit_disabled_players: z.ZodOptional<z.ZodBoolean>;
79
+ omit_unverified_players: z.ZodOptional<z.ZodBoolean>;
80
+ omit_cross_brand_duplicates: z.ZodOptional<z.ZodBoolean>;
81
+ }, z.core.$strip>>;
82
+ rewards: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
83
+ id: z.ZodString;
84
+ type: z.ZodLiteral<"fixed">;
85
+ event: z.ZodEnum<{
86
+ registration: "registration";
87
+ ftd: "ftd";
88
+ deposit: "deposit";
89
+ }>;
90
+ value: z.ZodNumber;
91
+ }, z.core.$strip>, z.ZodObject<{
92
+ id: z.ZodString;
93
+ type: z.ZodLiteral<"percentage">;
94
+ metric: z.ZodEnum<{
95
+ deposits_sum: "deposits_sum";
96
+ casino_wager: "casino_wager";
97
+ casino_ngr: "casino_ngr";
98
+ }>;
99
+ value: z.ZodNumber;
100
+ tiers: z.ZodOptional<z.ZodArray<z.ZodObject<{
101
+ id: z.ZodString;
102
+ min: z.ZodNumber;
103
+ rate: z.ZodNumber;
104
+ }, z.core.$strip>>>;
105
+ }, z.core.$strip>], "type">>;
106
+ }, z.core.$strip>>;
107
+ }, z.core.$strip>;
108
+ export declare const RuleGroupsInputSchema: z.ZodArray<z.ZodObject<{
109
+ priority: z.ZodOptional<z.ZodNumber>;
110
+ rules: z.ZodArray<z.ZodObject<{
111
+ qualifiers: z.ZodArray<z.ZodObject<{
112
+ id: z.ZodString;
113
+ type: z.ZodEnum<{
114
+ first_deposit: "first_deposit";
115
+ deposits_sum: "deposits_sum";
116
+ deposits_count: "deposits_count";
117
+ casino_wager: "casino_wager";
118
+ }>;
119
+ value: z.ZodNumber;
120
+ }, z.core.$strip>>;
121
+ conditions: z.ZodObject<{
122
+ id: z.ZodString;
123
+ type: z.ZodEnum<{
124
+ AND: "AND";
125
+ OR: "OR";
126
+ }>;
127
+ children: z.ZodArray<z.ZodType<ConditionNode, unknown, z.core.$ZodTypeInternals<ConditionNode, unknown>>>;
128
+ }, z.core.$strip>;
129
+ modifiers: z.ZodDefault<z.ZodObject<{
130
+ omit_duplicates: z.ZodOptional<z.ZodBoolean>;
131
+ omit_self_exclusions: z.ZodOptional<z.ZodBoolean>;
132
+ omit_disabled_players: z.ZodOptional<z.ZodBoolean>;
133
+ omit_unverified_players: z.ZodOptional<z.ZodBoolean>;
134
+ omit_cross_brand_duplicates: z.ZodOptional<z.ZodBoolean>;
135
+ }, z.core.$strip>>;
136
+ rewards: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
137
+ id: z.ZodString;
138
+ type: z.ZodLiteral<"fixed">;
139
+ event: z.ZodEnum<{
140
+ registration: "registration";
141
+ ftd: "ftd";
142
+ deposit: "deposit";
143
+ }>;
144
+ value: z.ZodNumber;
145
+ }, z.core.$strip>, z.ZodObject<{
146
+ id: z.ZodString;
147
+ type: z.ZodLiteral<"percentage">;
148
+ metric: z.ZodEnum<{
149
+ deposits_sum: "deposits_sum";
150
+ casino_wager: "casino_wager";
151
+ casino_ngr: "casino_ngr";
152
+ }>;
153
+ value: z.ZodNumber;
154
+ tiers: z.ZodOptional<z.ZodArray<z.ZodObject<{
155
+ id: z.ZodString;
156
+ min: z.ZodNumber;
157
+ rate: z.ZodNumber;
158
+ }, z.core.$strip>>>;
159
+ }, z.core.$strip>], "type">>;
160
+ }, z.core.$strip>>;
161
+ }, z.core.$strip>>;
162
+ export type RuleInput = z.infer<typeof RuleInputSchema>;
163
+ export type RuleGroupInput = z.infer<typeof RuleGroupInputSchema>;
164
+ /**
165
+ * A draft may hold half-filled conditions (an empty `country IN ()` list, an
166
+ * unset `product = ""`) so it can be saved mid-edit. Before publishing, every
167
+ * condition must carry a value the engine can actually match against. Returns
168
+ * true when any rule still contains an incomplete condition value — used to
169
+ * block publish (see `updateCommissionAction`).
170
+ */
171
+ export declare function ruleGroupsHaveIncompleteConditions(groups: RuleGroupInput[]): boolean;
172
+ export declare function ruleGroupsHaveNoReward(groups: RuleGroupInput[]): boolean;
173
+ export declare function ruleGroupsHavePercentPerPlayerGate(groups: RuleGroupInput[]): boolean;
@@ -0,0 +1 @@
1
+ import{CONDITION_FIELD_KEYS as d,CONDITION_FIELD_SPECS as u,CONDITION_GROUP_TYPES as m,MODIFIER_KEYS as y,OPERATORS as f,QUALIFIER_TYPES as I,REWARD_EVENT_TRIGGERS as R,REWARD_METRICS as b}from"../../db/types/index.js";import{z as e}from"zod";import{V as a}from"../../lib/validation/zod.js";const i=e.string().min(1).max(64),E=e.object({id:i,type:e.enum(I),value:e.number().min(0)}),S=e.object({id:i,type:e.literal("FIELD"),field:e.enum(d),op:e.enum(f),value:e.unknown()}).superRefine((o,r)=>{const t=u[o.field];t.operators.includes(o.op)||r.addIssue({code:"custom",path:["op"],message:a.fieldRequired});const{value:n}=o;(t.valueType==="country"?o.op==="IN"?Array.isArray(n)&&n.every(l=>typeof l=="string"):typeof n=="string":t.valueType==="number"?typeof n=="number"&&Number.isFinite(n):typeof n=="string"&&(n===""||(t.options??[]).includes(n)))||r.addIssue({code:"custom",path:["value"],message:a.fieldRequired})}),s=e.object({id:i,type:e.enum(m),get children(){return e.array(h)}}),h=e.union([S,s]),N=e.object(Object.fromEntries(y.map(o=>[o,e.boolean().optional()]))).default({}),C=e.object({id:i,type:e.literal("fixed"),event:e.enum(R),value:e.number().min(0)}),_=e.object({id:i,type:e.literal("percentage"),metric:e.enum(b),value:e.number().min(0).max(100),tiers:e.array(e.object({id:i,min:e.number().min(0),rate:e.number().min(0).max(100)})).optional()}),v=e.discriminatedUnion("type",[C,_]),F=e.object({qualifiers:e.array(E),conditions:s,modifiers:N,rewards:e.array(v)}),O=e.object({priority:e.number().int().min(0).optional(),rules:e.array(F)}),w=e.array(O);function L(o){return o.some(r=>r.rules.some(t=>p(t.conditions)))}function P(o){return o.type==="fixed"?o.value>0:o.value>0||(o.tiers??[]).some(r=>r.rate>0)}function Y(o){return!o.some(r=>r.rules.some(t=>t.rewards.some(P)))}function p(o){return o.type==="FIELD"?!T(o):o.children.some(p)}function T(o){const r=u[o.field],{value:t}=o;switch(r.valueType){case"country":return o.op==="IN"?Array.isArray(t)&&t.length>0&&t.every(n=>typeof n=="string"):typeof t=="string"&&t!=="";case"number":return typeof t=="number"&&Number.isFinite(t);case"enum":return typeof t=="string"&&(r.options??[]).includes(t)}}const g=new Set(["country","product","since_registration_days"]),G=new Set(["first_deposit","deposits_count"]);function c(o){return o.type==="FIELD"?g.has(o.field):o.children.some(c)}function z(o){return o.some(r=>r.rules.some(t=>t.rewards.some(n=>n.type==="percentage")&&(c(t.conditions)||t.qualifiers.some(n=>G.has(n.type)))))}export{O as RuleGroupInputSchema,w as RuleGroupsInputSchema,F as RuleInputSchema,L as ruleGroupsHaveIncompleteConditions,Y as ruleGroupsHaveNoReward,z as ruleGroupsHavePercentPerPlayerGate};
@@ -0,0 +1,14 @@
1
+ import "server-only";
2
+ import { type ConversionStats, type Delta, type MoneyByCurrency } from "./queries.js";
3
+ import { type MoneySeries, type PerformanceSeries } from "./series.js";
4
+ export declare const getAffiliateConversionStats: (affiliateId: string, startDate: string, endDate: string) => Promise<ConversionStats>;
5
+ export declare const getAffiliateEarnings: (affiliateId: string, startDate: string, endDate: string) => Promise<MoneyByCurrency[]>;
6
+ export declare const getAffiliateClickStats: (affiliateId: string, startDate: string, endDate: string) => Promise<Delta | null>;
7
+ export declare const getAffiliatePerformanceSeries: (affiliateId: string, startDate: string, endDate: string) => Promise<PerformanceSeries>;
8
+ export declare const getAffiliateEarningsSeries: (affiliateId: string, startDate: string, endDate: string) => Promise<MoneySeries>;
9
+ export type TopCampaign = {
10
+ campaignId: string;
11
+ name: string;
12
+ ftds: number;
13
+ };
14
+ export declare const getAffiliateTopCampaigns: (affiliateId: string, startDate: string, endDate: string) => Promise<TopCampaign[]>;
@@ -0,0 +1 @@
1
+ import"server-only";import{db as S}from"../../db/index.js";import{CONVERSION_EVENT as A,campaigns as E,conversions as e,EARNING_STATUS as P,earningsLedger as t}from"../../db/schema/index.js";import{and as c,count as R,desc as D,eq as d,gte as l,inArray as O,lt as u,ne as x,sum as U}from"drizzle-orm";import{unstable_cache as g}from"next/cache";import{clickHouseRows as L,clickHouseScalar as _}from"./clickhouse.js";import{countRows as p,windowBounds as v}from"./queries.js";import{assembleMoney as F,assemblePerformance as q,eachDay as b}from"./series.js";const y=60,z=g(async(i,r,n)=>{const{start:s,end:o,prevStart:m}=v(r,n),a=d(e.affiliateId,i),f=c(a,l(e.receivedAt,s),u(e.receivedAt,o)),C=c(a,l(e.receivedAt,m),u(e.receivedAt,s)),w=d(e.event,A.ftd),I=d(e.event,A.registration),[h,N,T,k,M,B]=await Promise.all([p(e,f),p(e,C),p(e,c(w,f)),p(e,c(w,C)),p(e,c(I,f)),p(e,c(I,C))]);return{conversions:{current:h,previous:N},ftd:{current:T,previous:k},registrations:{current:M,previous:B}}},["dashboard:affiliate-conversion-stats"],{revalidate:y}),X=g(async(i,r,n)=>{const{start:s,end:o}=v(r,n);return(await S.select({currency:t.currency,amount:U(t.amount)}).from(t).where(c(d(t.userId,i),l(t.earnedAt,s),u(t.earnedAt,o),d(t.status,P.confirmed))).groupBy(t.currency)).map(a=>({currency:a.currency,amount:a.amount??"0"}))},["dashboard:affiliate-earnings"],{revalidate:y}),Z=g(async(i,r,n)=>{const{prevStart:s}=v(r,n),o=s.toISOString().slice(0,10),m="SELECT uniqMerge(click_count) FROM clicks_daily WHERE date >= {s:Date} AND date < {e:Date} AND affiliate_id = {a:UUID}",[a,f]=await Promise.all([_(m,{s:r,e:n,a:i}),_(m,{s:o,e:r,a:i})]);return a===null?null:{current:a,previous:f??0}},["dashboard:affiliate-click-stats"],{revalidate:y}),H="SELECT toString(date), toString(uniqMerge(click_count)) FROM clicks_daily WHERE date >= {s:Date} AND date < {e:Date} AND affiliate_id = {a:UUID} GROUP BY date ORDER BY date",$=g(async(i,r,n)=>{const{start:s,end:o}=v(r,n),m=b(r,n),[a,f]=await Promise.all([L(H,{s:r,e:n,a:i}),S.select({receivedAt:e.receivedAt,event:e.event}).from(e).where(c(d(e.affiliateId,i),l(e.receivedAt,s),u(e.receivedAt,o),O(e.event,[A.registration,A.ftd])))]);return q(m,a,f)},["dashboard:affiliate-performance-series"],{revalidate:y}),ee=g(async(i,r,n)=>{const{start:s,end:o}=v(r,n),m=b(r,n),a=await S.select({earnedAt:t.earnedAt,amount:t.amount,currency:t.currency}).from(t).where(c(d(t.userId,i),l(t.earnedAt,s),u(t.earnedAt,o),x(t.status,P.reversed)));return F(m,a)},["dashboard:affiliate-earnings-series"],{revalidate:y}),re=g(async(i,r,n)=>{const{start:s,end:o}=v(r,n);return S.select({campaignId:e.campaignId,name:E.name,ftds:R()}).from(e).innerJoin(E,d(E.id,e.campaignId)).where(c(d(e.affiliateId,i),d(e.event,A.ftd),l(e.receivedAt,s),u(e.receivedAt,o))).groupBy(e.campaignId,E.name).orderBy(D(R())).limit(5)},["dashboard:affiliate-top-campaigns"],{revalidate:y});export{Z as getAffiliateClickStats,z as getAffiliateConversionStats,X as getAffiliateEarnings,ee as getAffiliateEarningsSeries,$ as getAffiliatePerformanceSeries,re as getAffiliateTopCampaigns};
@@ -0,0 +1,3 @@
1
+ import "server-only";
2
+ export declare function clickHouseScalar(query: string, params: Record<string, string>): Promise<number | null>;
3
+ export declare function clickHouseRows(query: string, params: Record<string, string>): Promise<string[][] | null>;
@@ -0,0 +1,2 @@
1
+ import"server-only";import{env as r}from"../../lib/env.js";const l=2e3;function m(){if(r.CLICKHOUSE_USER)return`Basic ${btoa(`${r.CLICKHOUSE_USER}:${r.CLICKHOUSE_PASSWORD??""}`)}`}async function o(e,i){if(!r.CLICKHOUSE_URL)return null;try{const t=new URL("/",r.CLICKHOUSE_URL);t.searchParams.set("database",r.CLICKHOUSE_DATABASE),t.searchParams.set("query",e);for(const[u,c]of Object.entries(i))t.searchParams.set(`param_${u}`,c);const n=new Headers,s=m();s&&n.set("authorization",s);const a=await fetch(t,{headers:n,cache:"no-store",signal:AbortSignal.timeout(l)});return a.ok?await a.text():null}catch{return null}}async function g(e,i){const t=await o(e,i);if(t===null)return null;const n=Number(t.trim());return Number.isFinite(n)?n:null}async function C(e,i){const t=await o(e,i);if(t===null)return null;const n=t.trim();return n===""?[]:n.split(`
2
+ `).map(s=>s.split(" "))}export{C as clickHouseRows,g as clickHouseScalar};
@@ -0,0 +1,5 @@
1
+ export declare function AffiliateCharts({ affiliateId, startDate, endDate, }: {
2
+ affiliateId: string;
3
+ startDate: string;
4
+ endDate: string;
5
+ }): Promise<import("react").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as p}from"react/jsx-runtime";import{getAffiliateEarningsSeries as o,getAffiliatePerformanceSeries as s,getAffiliateTopCampaigns as f}from"../affiliate-queries.js";import{ChartsGrid as g}from"./charts-grid.js";async function C({affiliateId:i,startDate:r,endDate:e}){const[n,t,a]=await Promise.all([s(i,r,e),o(i,r,e),f(i,r,e)]);return p(g,{perf:n,money:t,moneyTitleKey:"chartEarningsTitle",topCampaigns:a})}export{C as AffiliateCharts};
@@ -0,0 +1,5 @@
1
+ export declare function AffiliateStats({ affiliateId, startDate, endDate, }: {
2
+ affiliateId: string;
3
+ startDate: string;
4
+ endDate: string;
5
+ }): Promise<import("react").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as t,jsxs as o}from"react/jsx-runtime";import{getTranslations as c}from"next-intl/server";import{getAffiliateClickStats as m,getAffiliateConversionStats as d,getAffiliateEarnings as p}from"../affiliate-queries.js";import{MoneyStatCard as u}from"./money-stat-card.js";import{StatCard as a}from"./stat-card.js";import{SubAffiliateEarnings as v}from"../../earnings/components/sub-affiliate-earnings.js";import{getMySubAffiliateEarnings as b}from"../../earnings/queries.js";async function h({affiliateId:r,startDate:s,endDate:l}){const[i,e,f,g,n]=await Promise.all([c("Dashboard"),d(r,s,l),p(r,s,l),b(r),m(r,s,l)]);return o("div",{className:"flex flex-col gap-6",children:[o("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-5",children:[n&&t(a,{label:i("kpiClicks"),value:n.current,delta:n}),t(a,{label:i("kpiConversions"),value:e.conversions.current,delta:e.conversions}),t(a,{label:i("kpiFtd"),value:e.ftd.current,delta:e.ftd}),t(a,{label:i("kpiRegistrations"),value:e.registrations.current,delta:e.registrations}),t(u,{label:i("kpiEarnings"),entries:f,emptyLabel:i("noData")})]}),g.length>0&&o("section",{className:"flex flex-col gap-3",children:[t("h3",{className:"text-lg font-semibold text-foreground",children:i("affiliateSubEarningsTitle")}),t(v,{rows:g})]})]})}export{h as AffiliateStats};
@@ -0,0 +1,11 @@
1
+ export type FunnelStage = {
2
+ label: string;
3
+ value: number;
4
+ display: string;
5
+ rate: string | null;
6
+ };
7
+ export declare function FunnelChart({ title, stages, emptyLabel, }: {
8
+ title: string;
9
+ stages: FunnelStage[];
10
+ emptyLabel: string;
11
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as a,jsxs as l}from"react/jsx-runtime";import{Card as d}from"../../../../components/ui/card.js";function o({title:s,stages:t,emptyLabel:n}){const r=Math.max(1,...t.map(e=>e.value)),m=t.some(e=>e.value>0);return l(d,{className:"flex flex-col gap-4",children:[a("span",{className:"text-sm font-medium text-foreground",children:s}),m?a("div",{className:"flex flex-col gap-3",children:t.map(e=>l("div",{className:"flex flex-col gap-1",children:[l("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[a("span",{className:"text-muted-foreground",children:e.label}),l("span",{className:"tabular-nums text-foreground",children:[e.display,e.rate?a("span",{className:"ml-2 text-muted-foreground",children:e.rate}):null]})]}),a("div",{className:"h-2.5 w-full overflow-hidden rounded-full bg-muted",children:a("div",{className:"h-full rounded-full bg-primary",style:{width:`${Math.max(2,e.value/r*100)}%`}})})]},e.label))}):a("p",{className:"py-10 text-center text-sm text-muted-foreground",children:n})]})}export{o as FunnelChart};
@@ -0,0 +1,10 @@
1
+ export type RankItem = {
2
+ label: string;
3
+ value: number;
4
+ display: string;
5
+ };
6
+ export declare function RankBarChart({ title, items, emptyLabel, }: {
7
+ title: string;
8
+ items: RankItem[];
9
+ emptyLabel: string;
10
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ import{jsx as e,jsxs as t}from"react/jsx-runtime";import{Card as d}from"../../../../components/ui/card.js";function p({title:s,items:l,emptyLabel:n}){const r=Math.max(1,...l.map(a=>a.value));return t(d,{className:"flex flex-col gap-4",children:[e("span",{className:"text-sm font-medium text-foreground",children:s}),l.length>0?e("div",{className:"flex flex-col gap-3",children:l.map(a=>t("div",{className:"flex flex-col gap-1",children:[t("div",{className:"flex items-baseline justify-between gap-2 text-xs",children:[e("span",{className:"truncate text-foreground",children:a.label}),e("span",{className:"tabular-nums text-muted-foreground",children:a.display})]}),e("div",{className:"h-2.5 w-full overflow-hidden rounded-full bg-muted",children:e("div",{className:"h-full rounded-full bg-primary",style:{width:`${Math.max(2,a.value/r*100)}%`}})})]},a.label))}):e("p",{className:"py-10 text-center text-sm text-muted-foreground",children:n})]})}export{p as RankBarChart};
@@ -0,0 +1,12 @@
1
+ export type ChartSeries = {
2
+ label: string;
3
+ colorClass: string;
4
+ values: number[];
5
+ displayValues: string[];
6
+ };
7
+ export declare function TimeSeriesChart({ title, labels, series, emptyLabel, }: {
8
+ title: string;
9
+ labels: string[];
10
+ series: ChartSeries[];
11
+ emptyLabel: string;
12
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{Fragment as D,jsx as t,jsxs as o}from"react/jsx-runtime";import{useState as S}from"react";import{Card as V}from"../../../../components/ui/card.js";const v=720,C=170,g=6,i=10,_=8;function A({title:b,labels:c,series:r,emptyLabel:w}){const[n,y]=S(null),a=c.length,$=Math.max(1,...r.flatMap(e=>e.values)),m=v-g*2,u=C-i-_,d=i+u,l=e=>g+(a<=1?m/2:e/(a-1)*m),h=e=>i+u-e/$*u,M=r.some(e=>e.values.some(s=>s>0)),N=Math.min(5,a),P=Array.from({length:N},(e,s)=>Math.round(s/Math.max(1,N-1)*(a-1))),k=e=>{const s=e.currentTarget.getBoundingClientRect();if(s.width===0||a===0)return;const x=(e.clientX-s.left)/s.width*v,f=Math.round((x-g)/m*(a-1));y(Math.max(0,Math.min(a-1,f)))},p=n===null||a<=1?.5:n/(a-1),E=p<.15?"translate-x-0":p>.85?"-translate-x-full":"-translate-x-1/2";return o(V,{className:"flex flex-col gap-3",children:[o("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[t("span",{className:"text-sm font-medium text-foreground",children:b}),t("div",{className:"flex flex-wrap gap-3",children:r.map(e=>o("span",{className:"flex items-center gap-1.5 text-xs text-muted-foreground",children:[t("span",{className:`size-2 rounded-full bg-current ${e.colorClass}`}),e.label]},e.label))})]}),M?o(D,{children:[o("div",{className:"relative",children:[o("svg",{viewBox:`0 0 ${v} ${C}`,className:"w-full touch-none",role:"img","aria-label":b,onPointerMove:k,onPointerDown:k,onPointerLeave:()=>y(null),children:[n!==null&&t("line",{x1:l(n),y1:i,x2:l(n),y2:d,className:"stroke-border",strokeWidth:1,vectorEffect:"non-scaling-stroke"}),r.map(e=>{const s=e.values.map((f,W)=>`${l(W)},${h(f)}`).join(" "),x=`${l(0)},${d} ${s} ${l(a-1)},${d}`;return o("g",{className:e.colorClass,children:[t("polygon",{points:x,fill:"currentColor",fillOpacity:.1}),t("polyline",{points:s,fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinejoin:"round",strokeLinecap:"round",vectorEffect:"non-scaling-stroke"}),n!==null&&t("circle",{cx:l(n),cy:h(e.values[n]),r:3.5,fill:"currentColor",className:"stroke-card",strokeWidth:1.5})]},e.label)})]}),n!==null&&t("div",{className:`pointer-events-none absolute top-0 z-10 ${E}`,style:{left:`${p*100}%`},children:o("div",{className:"min-w-max rounded-md border border-border bg-popover px-2.5 py-1.5 text-xs shadow-md",children:[t("div",{className:"mb-1 font-medium text-popover-foreground",children:c[n]}),t("div",{className:"flex flex-col gap-0.5",children:r.map(e=>o("div",{className:"flex items-center justify-between gap-3",children:[o("span",{className:"flex items-center gap-1.5 text-muted-foreground",children:[t("span",{className:`size-1.5 rounded-full bg-current ${e.colorClass}`}),e.label]}),t("span",{className:"tabular-nums text-popover-foreground",children:e.displayValues[n]})]},e.label))})]})})]}),t("div",{className:"flex justify-between text-xs text-muted-foreground",children:P.map(e=>t("span",{children:c[e]},e))})]}):t("p",{className:"py-10 text-center text-sm text-muted-foreground",children:w})]})}export{A as TimeSeriesChart};
@@ -0,0 +1,8 @@
1
+ import type { TopCampaign } from "../affiliate-queries.js";
2
+ import type { MoneySeries, PerformanceSeries } from "../series.js";
3
+ export declare function ChartsGrid({ perf, money, moneyTitleKey, topCampaigns, }: {
4
+ perf: PerformanceSeries;
5
+ money: MoneySeries;
6
+ moneyTitleKey: "chartEarningsTitle" | "chartRevenueTitle";
7
+ topCampaigns?: TopCampaign[];
8
+ }): Promise<import("react").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as r,jsxs as d}from"react/jsx-runtime";import{getFormatter as f,getTranslations as C}from"next-intl/server";import{FunnelChart as T}from"./charts/funnel-chart.js";import{RankBarChart as v}from"./charts/rank-bar-chart.js";import{TimeSeriesChart as u}from"./charts/time-series-chart.js";import{formatMoney as h}from"../../../lib/format.js";async function S({perf:e,money:o,moneyTitleKey:g,topCampaigns:n}){const[a,i]=await Promise.all([C("Dashboard"),f()]),s=t=>i.number(t),y=t=>i.dateTime(new Date(`${t}T00:00:00.000Z`),{day:"2-digit",month:"2-digit",timeZone:"UTC"}),m=(t,p,k)=>p>0?`${i.number(t/p,{style:"percent",maximumFractionDigits:1})} ${a("funnelRateOf",{label:k})}`:null,l=o.currency,b=t=>l?h(i,t,l):s(t),c=e.series.map(t=>y(t.date));return d("div",{className:"flex flex-col gap-4",children:[r(u,{title:a("chartPerformanceTitle"),labels:c,series:[{label:a("kpiClicks"),colorClass:"text-primary",values:e.series.map(t=>t.clicks),displayValues:e.series.map(t=>s(t.clicks))},{label:a("kpiRegistrations"),colorClass:"text-warning",values:e.series.map(t=>t.registrations),displayValues:e.series.map(t=>s(t.registrations))},{label:a("kpiFtd"),colorClass:"text-success",values:e.series.map(t=>t.ftds),displayValues:e.series.map(t=>s(t.ftds))}],emptyLabel:a("noData")}),d("div",{className:"grid gap-4 lg:grid-cols-2",children:[r(T,{title:a("chartFunnelTitle"),stages:[{label:a("kpiClicks"),value:e.totals.clicks,display:s(e.totals.clicks),rate:null},{label:a("kpiRegistrations"),value:e.totals.registrations,display:s(e.totals.registrations),rate:m(e.totals.registrations,e.totals.clicks,a("kpiClicks"))},{label:a("kpiFtd"),value:e.totals.ftds,display:s(e.totals.ftds),rate:m(e.totals.ftds,e.totals.registrations,a("kpiRegistrations"))}],emptyLabel:a("noData")}),r(u,{title:`${a(g)}${l?` \xB7 ${l}`:""}`,labels:c,series:[{label:a("kpiEarnings"),colorClass:"text-primary",values:o.series.map(t=>t.amount),displayValues:o.series.map(t=>b(t.amount))}],emptyLabel:a("noData")})]}),n&&r(v,{title:a("chartTopCampaignsTitle"),items:n.map(t=>({label:t.name,value:t.ftds,display:s(t.ftds)})),emptyLabel:a("noData")})]})}export{S as ChartsGrid};
@@ -0,0 +1,4 @@
1
+ export declare function DashboardCharts({ startDate, endDate, }: {
2
+ startDate: string;
3
+ endDate: string;
4
+ }): Promise<import("react").JSX.Element>;
@@ -0,0 +1 @@
1
+ import{jsx as s}from"react/jsx-runtime";import{ChartsGrid as n}from"./charts-grid.js";import{getGlobalPerformanceSeries as a,getGlobalRevenueSeries as i}from"../queries.js";async function f({startDate:e,endDate:r}){const[o,t]=await Promise.all([a(e,r),i(e,r)]);return s(n,{perf:o,money:t,moneyTitleKey:"chartRevenueTitle"})}export{f as DashboardCharts};
@@ -0,0 +1 @@
1
+ export declare function DashboardPeriodTabs(): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as f}from"react/jsx-runtime";import{useTranslations as c}from"next-intl";import{useQueryStates as b}from"nuqs";import{useMemo as g,useTransition as T}from"react";import{DateRangePicker as h}from"../../../components/ui/date-range-picker.js";import{Tabs as y,TabsIndicator as S,TabsList as w,TabsTab as P}from"../../../components/ui/tabs.js";import{DASHBOARD_PERIODS as O,dashboardParsers as R}from"../list-params.js";function u(e){const o=e.getFullYear(),n=String(e.getMonth()+1).padStart(2,"0"),s=String(e.getDate()).padStart(2,"0");return`${o}-${n}-${s}`}function C(){const e=c("Dashboard"),[o,n]=T(),[{period:s,from:l,to:d},r]=b(R,{shallow:!1,clearOnDefault:!0,startTransition:n}),{today:D,minDate:p}=g(()=>{const a=new Date;return{today:u(a),minDate:u(new Date(a.getFullYear()-3,a.getMonth(),a.getDate()))}},[]),m=l!==null&&d!==null;return f("div",{className:"flex flex-wrap items-center gap-3","data-pending":o?"":void 0,children:[t(y,{value:m?"":s,onValueChange:a=>r({period:a,from:null,to:null}),children:f(w,{children:[O.map(a=>t(P,{value:a,children:e("periodDays",{days:a})},a)),t(S,{})]})}),t(h,{className:"w-full sm:w-64",startName:"dashboard-from",endName:"dashboard-to",defaultStart:l??void 0,defaultEnd:d??void 0,minDate:p,maxDate:D,allowOpenEnded:!1,onChange:(a,i)=>{a&&i?r({from:a,to:i,period:null}):!a&&!i&&r({from:null,to:null})}},m?"custom":"preset")]})}export{C as DashboardPeriodTabs};
@@ -0,0 +1,6 @@
1
+ import type { MoneyByCurrency } from "../queries.js";
2
+ export declare function MoneyStatCard({ label, entries, emptyLabel, }: {
3
+ label: string;
4
+ entries: MoneyByCurrency[];
5
+ emptyLabel: string;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as e,jsxs as p}from"react/jsx-runtime";import{useFormatter as s}from"next-intl";import{Card as m}from"../../../components/ui/card.js";import{formatMoney as l}from"../../../lib/format.js";function i({label:a,entries:r,emptyLabel:o}){const n=s();return p(m,{className:"flex flex-col gap-2",children:[e("span",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:a}),r.length===0?e("span",{className:"text-sm text-muted-foreground",children:o}):e("div",{className:"flex flex-col gap-0.5",children:r.map(t=>e("span",{className:"text-lg font-semibold tabular-nums text-foreground",children:l(n,t.amount,t.currency)},t.currency))})]})}export{i as MoneyStatCard};
@@ -0,0 +1,6 @@
1
+ import type { Delta } from "../queries.js";
2
+ export declare function StatCard({ label, value, delta, }: {
3
+ label: string;
4
+ value: number;
5
+ delta?: Delta;
6
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as n,jsxs as s}from"react/jsx-runtime";import{useFormatter as m}from"next-intl";import{Card as l}from"../../../components/ui/card.js";import{cn as o}from"../../../lib/cn.js";function i(e){return e.previous===0?null:(e.current-e.previous)/e.previous}function x({label:e,value:u,delta:r}){const a=m(),t=r?i(r):null;return s(l,{className:"flex flex-col gap-2",children:[n("span",{className:"text-xs font-medium uppercase tracking-wide text-muted-foreground",children:e}),n("span",{className:"text-2xl font-semibold tabular-nums text-foreground",children:a.number(u)}),t!==null&&s("span",{className:o("text-xs tabular-nums",t>=0?"text-emerald-600 dark:text-emerald-400":"text-destructive"),children:[t>=0?"\u2191":"\u2193"," ",a.number(Math.abs(t),{style:"percent",maximumFractionDigits:0})]})]})}export{x as StatCard};
@@ -0,0 +1,4 @@
1
+ import type { TopAffiliate } from "../queries.js";
2
+ export declare function TopAffiliates({ rows }: {
3
+ rows: TopAffiliate[];
4
+ }): import("react").JSX.Element;
@@ -0,0 +1 @@
1
+ "use client";import{jsx as t,jsxs as d}from"react/jsx-runtime";import{IconTrophy as r}from"@tabler/icons-react";import{useFormatter as l,useTranslations as s}from"next-intl";import{useMemo as m}from"react";import{DataTable as n}from"../../../components/ui/data-table.js";import{TextLink as p}from"../../../components/ui/text-link.js";function h({rows:o}){const a=s("Dashboard"),i=l(),f=m(()=>[{id:"name",header:()=>a("topAffiliateColumnName"),cell:({row:e})=>t(p,{href:`/affiliates/${e.original.affiliateId}`,tone:"plain",children:e.original.name})},{id:"ftds",header:()=>a("topAffiliateColumnFtds"),cell:({row:e})=>t("span",{className:"tabular-nums text-foreground",children:i.number(e.original.ftds)}),meta:{className:"text-right"}}],[a,i]);return t(n,{data:o,columns:f,getRowId:e=>e.affiliateId,empty:d("div",{className:"flex flex-col items-center gap-3 py-4",children:[t("div",{className:"flex size-10 items-center justify-center rounded-full bg-muted text-muted-foreground",children:t(r,{size:18,"aria-hidden":!0})}),t("span",{children:a("topAffiliatesEmpty")})]})})}export{h as TopAffiliates};
@@ -0,0 +1,24 @@
1
+ export declare const DASHBOARD_PERIODS: readonly ["7", "30", "90"];
2
+ export type DashboardPeriod = (typeof DASHBOARD_PERIODS)[number];
3
+ export declare const periodParser: Omit<import("nuqs/server").SingleParserBuilder<"7" | "30" | "90">, "parseServerSide"> & {
4
+ readonly defaultValue: NonNullable<"7" | "30" | "90">;
5
+ parseServerSide(value: string | string[] | undefined): NonNullable<"7" | "30" | "90">;
6
+ };
7
+ export declare const fromParser: import("nuqs/server").SingleParserBuilder<string>;
8
+ export declare const toParser: import("nuqs/server").SingleParserBuilder<string>;
9
+ export declare const dashboardParsers: {
10
+ period: Omit<import("nuqs/server").SingleParserBuilder<"7" | "30" | "90">, "parseServerSide"> & {
11
+ readonly defaultValue: NonNullable<"7" | "30" | "90">;
12
+ parseServerSide(value: string | string[] | undefined): NonNullable<"7" | "30" | "90">;
13
+ };
14
+ from: import("nuqs/server").SingleParserBuilder<string>;
15
+ to: import("nuqs/server").SingleParserBuilder<string>;
16
+ };
17
+ export declare const loadDashboardParams: import("nuqs/server").LoaderFunction<{
18
+ period: Omit<import("nuqs/server").SingleParserBuilder<"7" | "30" | "90">, "parseServerSide"> & {
19
+ readonly defaultValue: NonNullable<"7" | "30" | "90">;
20
+ parseServerSide(value: string | string[] | undefined): NonNullable<"7" | "30" | "90">;
21
+ };
22
+ from: import("nuqs/server").SingleParserBuilder<string>;
23
+ to: import("nuqs/server").SingleParserBuilder<string>;
24
+ }>;
@@ -0,0 +1 @@
1
+ import{createLoader as o,parseAsString as r,parseAsStringLiteral as t}from"nuqs/server";const e=["7","30","90"],s=t(e).withDefault("30"),a=r,p=r,n={period:s,from:a,to:p},D=o(n);export{e as DASHBOARD_PERIODS,n as dashboardParsers,a as fromParser,D as loadDashboardParams,s as periodParser,p as toParser};
@@ -0,0 +1,63 @@
1
+ import "server-only";
2
+ import { type SQL } from "drizzle-orm";
3
+ import type { PgTable } from "drizzle-orm/pg-core";
4
+ import { type MoneySeries, type PerformanceSeries } from "./series.js";
5
+ export declare function countRows(table: PgTable, where: SQL | undefined): Promise<number>;
6
+ export type Delta = {
7
+ current: number;
8
+ previous: number;
9
+ };
10
+ export type MoneyByCurrency = {
11
+ currency: string;
12
+ amount: string;
13
+ };
14
+ export type ConversionStats = {
15
+ conversions: Delta;
16
+ ftd: Delta;
17
+ registrations: Delta;
18
+ };
19
+ export type RevenueStats = {
20
+ earnings: MoneyByCurrency[];
21
+ ngr: MoneyByCurrency[];
22
+ };
23
+ export type PayoutStats = {
24
+ open: {
25
+ currency: string;
26
+ count: number;
27
+ amount: string;
28
+ }[];
29
+ paidInPeriod: MoneyByCurrency[];
30
+ };
31
+ export type AffiliateStats = {
32
+ newSignups: Delta;
33
+ active: number;
34
+ pendingApproval: number;
35
+ blocked: number;
36
+ };
37
+ export type TopAffiliate = {
38
+ affiliateId: string;
39
+ name: string;
40
+ ftds: number;
41
+ };
42
+ /**
43
+ * Resolves the effective dashboard window as an inclusive-start / exclusive-end
44
+ * pair of `YYYY-MM-DD` calendar days. A valid custom `from`/`to` range wins,
45
+ * otherwise the `period` preset (last N days including today) applies.
46
+ */
47
+ export declare function resolveDashboardWindow(period: string, from: string | null, to: string | null): {
48
+ startDate: string;
49
+ endDate: string;
50
+ };
51
+ export declare function windowBounds(startDate: string, endDate: string): {
52
+ start: Date;
53
+ end: Date;
54
+ prevStart: Date;
55
+ };
56
+ export declare const getClickStats: (startDate: string, endDate: string) => Promise<Delta | null>;
57
+ export declare const getGlobalPerformanceSeries: (startDate: string, endDate: string) => Promise<PerformanceSeries>;
58
+ export declare const getGlobalRevenueSeries: (startDate: string, endDate: string) => Promise<MoneySeries>;
59
+ export declare const getConversionStats: (startDate: string, endDate: string) => Promise<ConversionStats>;
60
+ export declare const getRevenueStats: (startDate: string, endDate: string) => Promise<RevenueStats>;
61
+ export declare const getPayoutStats: (startDate: string, endDate: string) => Promise<PayoutStats>;
62
+ export declare const getAffiliateStats: (startDate: string, endDate: string) => Promise<AffiliateStats>;
63
+ export declare const getTopAffiliates: (startDate: string, endDate: string) => Promise<TopAffiliate[]>;
@@ -0,0 +1 @@
1
+ import"server-only";import{db as y}from"../../db/index.js";import{CONVERSION_EVENT as D,conversions as a,displayName as H,EARNING_STATUS as B,earningsLedger as l,PAYOUT_REQUEST_STATUS as T,payoutRequests as p,playerActivity as R,USER_ROLE as V,USER_STATUS as h,users as o}from"../../db/schema/index.js";import{and as u,count as E,desc as F,eq as v,gte as f,inArray as N,isNotNull as O,isNull as W,lt as g,ne as $,sum as I}from"drizzle-orm";import{unstable_cache as S}from"next/cache";import{clickHouseRows as z,clickHouseScalar as k}from"./clickhouse.js";import{assembleMoney as K,assemblePerformance as Z,eachDay as L}from"./series.js";const A=60;async function m(e,t){const[r]=await y.select({value:E()}).from(e).where(t);return r?.value??0}function x(e){return new Date(`${e}T00:00:00.000Z`)}function M(e){return!!e&&/^\d{4}-\d{2}-\d{2}$/.test(e)&&!Number.isNaN(Date.parse(`${e}T00:00:00.000Z`))}function _(e,t){const r=x(e);return r.setUTCDate(r.getUTCDate()+t),r.toISOString().slice(0,10)}function j(){return new Date(Date.now()).toISOString().slice(0,10)}function ie(e,t,r){if(M(t)&&M(r)){const[n,s]=t<=r?[t,r]:[r,t];return{startDate:n,endDate:_(s,1)}}const i=Number(e)||30,c=_(j(),1);return{startDate:_(c,-i),endDate:c}}function w(e,t){const r=x(e),i=x(t);return{start:r,end:i,prevStart:new Date(2*r.getTime()-i.getTime())}}const U="SELECT uniqMerge(click_count) FROM clicks_daily WHERE date >= {s:Date} AND date < {e:Date}",oe=S(async(e,t)=>{const{prevStart:r}=w(e,t),i=r.toISOString().slice(0,10),[c,n]=await Promise.all([k(U,{s:e,e:t}),k(U,{s:i,e})]);return c===null?null:{current:c,previous:n??0}},["dashboard:click-stats"],{revalidate:A}),J="SELECT toString(date), toString(uniqMerge(click_count)) FROM clicks_daily WHERE date >= {s:Date} AND date < {e:Date} GROUP BY date ORDER BY date",ce=S(async(e,t)=>{const{start:r,end:i}=w(e,t),c=L(e,t),[n,s]=await Promise.all([z(J,{s:e,e:t}),y.select({receivedAt:a.receivedAt,event:a.event}).from(a).where(u(f(a.receivedAt,r),g(a.receivedAt,i),N(a.event,[D.registration,D.ftd])))]);return Z(c,n,s)},["dashboard:global-performance-series"],{revalidate:A}),ue=S(async(e,t)=>{const{start:r,end:i}=w(e,t),c=L(e,t),n=await y.select({earnedAt:l.earnedAt,amount:l.amount,currency:l.currency}).from(l).where(u(f(l.earnedAt,r),g(l.earnedAt,i),$(l.status,B.reversed)));return K(c,n)},["dashboard:global-revenue-series"],{revalidate:A}),de=S(async(e,t)=>{const{start:r,end:i,prevStart:c}=w(e,t),n=u(f(a.receivedAt,r),g(a.receivedAt,i)),s=u(f(a.receivedAt,c),g(a.receivedAt,r)),P=v(a.event,D.ftd),b=v(a.event,D.registration),[d,C,Y,q,G,Q]=await Promise.all([m(a,n),m(a,s),m(a,u(P,n)),m(a,u(P,s)),m(a,u(b,n)),m(a,u(b,s))]);return{conversions:{current:d,previous:C},ftd:{current:Y,previous:q},registrations:{current:G,previous:Q}}},["dashboard:conversion-stats"],{revalidate:A}),le=S(async(e,t)=>{const{start:r,end:i}=w(e,t),[c,n]=await Promise.all([y.select({currency:l.currency,amount:I(l.amount)}).from(l).where(u(f(l.earnedAt,r),g(l.earnedAt,i),v(l.status,B.confirmed))).groupBy(l.currency),y.select({currency:R.currency,amount:I(R.ngr)}).from(R).where(u(f(R.date,e),g(R.date,t))).groupBy(R.currency)]);return{earnings:c.map(s=>({currency:s.currency,amount:s.amount??"0"})),ngr:n.map(s=>({currency:s.currency,amount:s.amount??"0"}))}},["dashboard:revenue-stats"],{revalidate:A}),pe=S(async(e,t)=>{const{start:r,end:i}=w(e,t),[c,n]=await Promise.all([y.select({currency:p.currency,count:E(),amount:I(p.amount)}).from(p).where(N(p.status,[T.requested,T.approved])).groupBy(p.currency),y.select({currency:p.currency,amount:I(p.amount)}).from(p).where(u(v(p.status,T.paid),f(p.paidAt,r),g(p.paidAt,i))).groupBy(p.currency)]);return{open:c.map(s=>({currency:s.currency,count:s.count,amount:s.amount??"0"})),paidInPeriod:n.map(s=>({currency:s.currency,amount:s.amount??"0"}))}},["dashboard:payout-stats"],{revalidate:A}),me=S(async(e,t)=>{const{start:r,end:i,prevStart:c}=w(e,t),n=v(o.role,V.affiliate),[s,P,b,d,C]=await Promise.all([m(o,u(n,f(o.createdAt,r),g(o.createdAt,i))),m(o,u(n,f(o.createdAt,c),g(o.createdAt,r))),m(o,u(n,v(o.status,h.active),O(o.approvedAt))),m(o,u(n,v(o.status,h.active),W(o.approvedAt))),m(o,u(n,v(o.status,h.blocked)))]);return{newSignups:{current:s,previous:P},active:b,pendingApproval:d,blocked:C}},["dashboard:affiliate-stats"],{revalidate:A}),fe=S(async(e,t)=>{const{start:r,end:i}=w(e,t),n=(await y.select({affiliateId:a.affiliateId,ftds:E()}).from(a).where(u(v(a.event,D.ftd),f(a.receivedAt,r),g(a.receivedAt,i),O(a.affiliateId))).groupBy(a.affiliateId).orderBy(F(E())).limit(5)).filter(d=>d.affiliateId!==null);if(n.length===0)return[];const s=[...new Set(n.map(d=>d.affiliateId))],P=await y.select({id:o.id,firstName:o.firstName,lastName:o.lastName}).from(o).where(N(o.id,s)),b=new Map(P.map(d=>[d.id,H(d)]));return n.map(d=>({affiliateId:d.affiliateId,name:b.get(d.affiliateId)??d.affiliateId,ftds:d.ftds}))},["dashboard:top-affiliates"],{revalidate:A});export{m as countRows,me as getAffiliateStats,oe as getClickStats,de as getConversionStats,ce as getGlobalPerformanceSeries,ue as getGlobalRevenueSeries,pe as getPayoutStats,le as getRevenueStats,fe as getTopAffiliates,ie as resolveDashboardWindow,w as windowBounds};
@@ -0,0 +1,32 @@
1
+ export type SeriesPoint = {
2
+ date: string;
3
+ clicks: number;
4
+ registrations: number;
5
+ ftds: number;
6
+ };
7
+ export type PerformanceSeries = {
8
+ series: SeriesPoint[];
9
+ totals: {
10
+ clicks: number;
11
+ registrations: number;
12
+ ftds: number;
13
+ };
14
+ };
15
+ export type MoneyPoint = {
16
+ date: string;
17
+ amount: number;
18
+ };
19
+ export type MoneySeries = {
20
+ series: MoneyPoint[];
21
+ currency: string | null;
22
+ };
23
+ export declare function eachDay(startDate: string, endDate: string): string[];
24
+ export declare function assemblePerformance(days: string[], clickRows: string[][] | null, convRows: {
25
+ receivedAt: Date;
26
+ event: string;
27
+ }[]): PerformanceSeries;
28
+ export declare function assembleMoney(days: string[], rows: {
29
+ earnedAt: Date;
30
+ amount: string | null;
31
+ currency: string;
32
+ }[]): MoneySeries;
@@ -0,0 +1 @@
1
+ import{CONVERSION_EVENT as g}from"../../db/schema/index.js";const f=864e5;function m(a,o){const i=[],s=new Date(`${o}T00:00:00.000Z`).getTime();let r=new Date(`${a}T00:00:00.000Z`).getTime();for(;r<s;)i.push(new Date(r).toISOString().slice(0,10)),r+=f;return i}function y(a,o,i){const s=new Map;if(o)for(const[e,n]of o)s.set(e,Number(n)||0);const r=new Map,c=new Map;for(const e of i){const n=e.receivedAt.toISOString().slice(0,10);e.event===g.ftd?c.set(n,(c.get(n)??0)+1):e.event===g.registration&&r.set(n,(r.get(n)??0)+1)}const u=a.map(e=>({date:e,clicks:s.get(e)??0,registrations:r.get(e)??0,ftds:c.get(e)??0})),t=u.reduce((e,n)=>({clicks:e.clicks+n.clicks,registrations:e.registrations+n.registrations,ftds:e.ftds+n.ftds}),{clicks:0,registrations:0,ftds:0});return{series:u,totals:t}}function b(a,o){const i=new Map;for(const t of o)i.set(t.currency,(i.get(t.currency)??0)+(Number(t.amount)||0));let s=null,r=-1/0;for(const[t,e]of i)e>r&&(r=e,s=t);const c=new Map;if(s)for(const t of o){if(t.currency!==s)continue;const e=Number(t.amount)||0,n=t.earnedAt.toISOString().slice(0,10);c.set(n,(c.get(n)??0)+e)}return{series:a.map(t=>({date:t,amount:c.get(t)??0})),currency:s}}export{b as assembleMoney,y as assemblePerformance,m as eachDay};
@@ -0,0 +1,60 @@
1
+ import { COMMISSION_STATUS, type Deal } from "../../db/schema/index.js";
2
+ import type { DealSortKey, DealStatusFilter } from "./list-params.js";
3
+ import type { FormState } from "../../lib/actions/state.js";
4
+ import { type ListParams, type ListResult } from "../../lib/list-params.js";
5
+ export type DealFormState = FormState<{
6
+ id: string;
7
+ }>;
8
+ export type DealUpdateState = FormState<void>;
9
+ export type DealEditData = {
10
+ commissionTitle: string | null;
11
+ startsAt: string;
12
+ endsAt: string | null;
13
+ };
14
+ export type DealWithCommission = Deal & {
15
+ commission: {
16
+ id: string;
17
+ title: string | null;
18
+ status: (typeof COMMISSION_STATUS)[keyof typeof COMMISSION_STATUS];
19
+ strategy: string | null;
20
+ currency: string | null;
21
+ allowSubAffiliates: boolean;
22
+ subAffiliateMaxPercent: string | null;
23
+ };
24
+ };
25
+ export declare const getDealEditData: (dealId: string) => Promise<DealEditData | null>;
26
+ export declare const listPublishedCommissions: () => Promise<{
27
+ id: string;
28
+ title: string | null;
29
+ }[]>;
30
+ export declare function listDealsForAffiliate(affiliateId: string, params: ListParams<DealSortKey> & {
31
+ status: DealStatusFilter;
32
+ }): Promise<ListResult<DealWithCommission>>;
33
+ export declare const assignDealAction: (args_0: string, args_1: FormState<{
34
+ id: string;
35
+ }>, args_2: FormData) => Promise<FormState<{
36
+ id: string;
37
+ }>>;
38
+ export type DelegateDealState = FormState<{
39
+ id: string;
40
+ }>;
41
+ export declare const delegateDealToSubAffiliateAction: (args_0: string, args_1: FormState<{
42
+ id: string;
43
+ }>, args_2: FormData) => Promise<FormState<{
44
+ id: string;
45
+ }>>;
46
+ export declare const delegateDealForAffiliateAction: (args_0: string, args_1: FormState<{
47
+ id: string;
48
+ }>, args_2: FormData) => Promise<FormState<{
49
+ id: string;
50
+ }>>;
51
+ export type SubAffiliateOption = {
52
+ id: string;
53
+ firstName: string;
54
+ lastName: string;
55
+ email: string;
56
+ };
57
+ export declare function listSubAffiliateOptions(parentAffiliateId: string): Promise<SubAffiliateOption[]>;
58
+ export declare const updateDealAction: (args_0: string, args_1: FormState<void>, args_2: FormData) => Promise<FormState<void>>;
59
+ export declare const deactivateDealAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
60
+ export declare const reactivateDealAction: (args_0: string) => Promise<import("../../lib/actions/state.js").ActionResult<void>>;
@@ -0,0 +1 @@
1
+ "use server";import{db as m}from"../../db/index.js";import{COMMISSION_STATUS as M,commissions as s,DEAL_STATUS as p,deals as e,displayName as Y,USER_ROLE as T,users as n}from"../../db/schema/index.js";import{and as v,asc as O,count as z,desc as V,eq as r,inArray as G}from"drizzle-orm";import{revalidatePath as I}from"next/cache";import{z as A}from"zod";import{requireSession as R}from"../auth/authorization.js";import{hasPermission as U}from"../auth/permissions.js";import{sendDealAssignedEmail as H}from"./deal-assigned-email.js";import{sendDealDelegatedEmail as X}from"./deal-delegated-email.js";import{parseForm as x}from"../../lib/actions/parse-form.js";import{authAction as $,authFormAction as P,authQuery as B}from"../../lib/auth/action.js";import{isUniqueViolation as Z}from"../../lib/db/errors.js";import{appError as d}from"../../lib/errors/codes.js";import{success as D}from"../../lib/errors/server.js";import{paginate as tt}from"../../lib/list-params.js";const et=t=>t===""||t===void 0?null:t,C=A.string().trim().min(1).refine(t=>!Number.isNaN(Date.parse(t)),{message:"invalid_format"});function it(){const t=new Date;return new Date(t.getFullYear(),t.getMonth(),t.getDate())}const Q={startsAt:C.transform(t=>new Date(t)).refine(t=>t.getTime()>=it().getTime(),{message:"deal_start_in_past"}),endsAt:A.preprocess(et,C.nullable().transform(t=>t?new Date(t):null))},k=t=>t.endsAt===null||t.endsAt.getTime()>t.startsAt.getTime(),q={path:["endsAt"],message:"deal_invalid_date_range"},at=A.object({commissionId:A.uuid(),...Q}).refine(k,q),st=A.object(Q).refine(k,q);function K(t){const i=t.getFullYear(),a=String(t.getMonth()+1).padStart(2,"0"),l=String(t.getDate()).padStart(2,"0");return`${i}-${a}-${l}`}const _t=B("deals:manage",async(t,i)=>{const[a]=await m.select({startsAt:e.startsAt,endsAt:e.endsAt,commissionTitle:s.title}).from(e).innerJoin(s,r(s.id,e.commissionId)).where(r(e.id,i)).limit(1);return a?{commissionTitle:a.commissionTitle,startsAt:K(a.startsAt),endsAt:a.endsAt?K(a.endsAt):null}:null}),bt=B("deals:manage",async t=>m.select({id:s.id,title:s.title}).from(s).where(r(s.status,M.published)).orderBy(s.title));function rt(t,i){const a=e[t];return[i==="asc"?O(a):V(a),O(e.id)]}function nt(t){switch(t){case"all":return;case"active":return r(e.status,p.active);case"deactivated":return r(e.status,p.deactivated)}}async function Nt(t,i){const{user:a,carrier:l}=await R();if(!U(l,"deals:read")&&t!==a.id)throw d("forbidden",{toast:!0});const o=nt(i.status),g=v(r(e.affiliateId,t),o),[u,f]=rt(i.sort,i.dir);return tt(i,{count:async()=>{const[S]=await m.select({total:z()}).from(e).where(g);return S?.total??0},fetch:async({offset:S,limit:_})=>(await m.select({deal:e,commission:{id:s.id,title:s.title,status:s.status,strategy:s.strategy,currency:s.currency,allowSubAffiliates:s.allowSubAffiliates,subAffiliateMaxPercent:s.subAffiliateMaxPercent}}).from(e).innerJoin(s,r(s.id,e.commissionId)).where(g).orderBy(u,f).limit(_).offset(S)).map(b=>({...b.deal,commission:b.commission}))})}async function ot(t){const[i]=await m.select({email:n.email,firstName:n.firstName,role:n.role}).from(n).where(r(n.id,t)).limit(1);if(!i||i.role!==T.affiliate)throw d("user_not_found",{toast:!0});return{email:i.email,firstName:i.firstName}}const Tt=P({permission:"deals:manage"},async({user:t,audit:i},a,l)=>{const o=await x(l,at),[g,[u]]=await Promise.all([ot(a),m.select({id:s.id,status:s.status,title:s.title}).from(s).where(r(s.id,o.commissionId)).limit(1)]);if(!u)throw d("commission_not_found",{toast:!0});if(u.status!==M.published)throw d("deal_commission_not_published",{toast:!0});const[f]=await m.insert(e).values({affiliateId:a,commissionId:o.commissionId,startsAt:o.startsAt,endsAt:o.endsAt,assignedById:t.id}).returning({id:e.id});if(!f)throw d("deal_not_found",{toast:!0});await i({action:"deal.create",subjectId:a,target:{type:"deal",id:f.id},metadata:{commissionId:o.commissionId}}),I(`/affiliates/${a}`);try{return await H({userId:a,email:g.email,firstName:g.firstName,commissionTitle:u.title,startsAt:o.startsAt,endsAt:o.endsAt}),D({id:f.id},"Toasts.dealAssigned")}catch{return D({id:f.id},"Toasts.dealAssignedEmailFailed")}}),J=A.object({subAffiliateId:A.uuid(),share:A.coerce.number().positive().max(100)});async function W(t,i,a,l,o,g){const{created:u,parentAffiliateId:f,commissionId:S,actual:_,startsAt:E,endsAt:b}=await m.transaction(async h=>{const[c]=await h.select({id:e.id,affiliateId:e.affiliateId,commissionId:e.commissionId,status:e.status,startsAt:e.startsAt,endsAt:e.endsAt,parentDealId:e.parentDealId}).from(e).where(r(e.id,t)).for("update");if(!c||c.parentDealId!==null)throw d("deal_not_found",{toast:!0});if(g&&c.affiliateId!==g)throw d("forbidden",{toast:!0});if(c.status!==p.active)throw d("deal_not_active",{toast:!0});const[w]=await h.select({allow:s.allowSubAffiliates,maxPercent:s.subAffiliateMaxPercent}).from(s).where(r(s.id,c.commissionId)).limit(1);if(!w?.allow)throw d("sub_affiliates_not_allowed",{toast:!0});const N=w.maxPercent?Number(w.maxPercent):0,y=Math.round(a/100*N*100)/100;if(y<=0)throw d("invalid_input",{field:"share"});const[F]=await h.select({role:n.role,parentAffiliateId:n.parentAffiliateId}).from(n).where(r(n.id,i)).for("update");if(!F||F.role!==T.affiliate||F.parentAffiliateId!==c.affiliateId)throw d("user_not_found",{field:"subAffiliateId"});const[j]=await h.insert(e).values({affiliateId:i,commissionId:c.commissionId,parentDealId:c.id,subAffiliatePercent:y.toFixed(2),startsAt:c.startsAt,endsAt:c.endsAt,assignedById:l}).returning({id:e.id}).catch(L=>{if(Z(L))return[];throw L});if(!j)throw d("invalid_input",{field:"subAffiliateId"});return{created:j,parentAffiliateId:c.affiliateId,commissionId:c.commissionId,actual:y,startsAt:c.startsAt,endsAt:c.endsAt}});await o({action:"deal.delegate",subjectId:i,target:{type:"deal",id:u.id},metadata:{commissionId:S,percent:_,parentDealId:t,parentAffiliateId:f}}),I("/deals"),I(`/affiliates/${f}`);try{const[h,[c]]=await Promise.all([m.select({id:n.id,email:n.email,firstName:n.firstName,lastName:n.lastName}).from(n).where(G(n.id,[i,f])),m.select({title:s.title}).from(s).where(r(s.id,S)).limit(1)]),w=h.find(y=>y.id===i),N=h.find(y=>y.id===f);return w&&N&&await X({userId:w.id,email:w.email,firstName:w.firstName,parentName:Y(N),commissionTitle:c?.title??null,percent:_,startsAt:E,endsAt:b}),D({id:u.id},"Toasts.dealDelegated")}catch{return D({id:u.id},"Toasts.dealDelegatedEmailFailed")}}const vt=P({},async({user:t,audit:i},a,l)=>{if(t.role!==T.affiliate)throw d("forbidden",{toast:!0});const o=await x(l,J);return W(a,o.subAffiliateId,o.share,t.id,i,t.id)}),xt=P({permission:"deals:manage"},async({user:t,audit:i},a,l)=>{const o=await x(l,J);return W(a,o.subAffiliateId,o.share,t.id,i)});async function Pt(t){const{user:i,carrier:a}=await R();if(!U(a,"affiliates:read")&&i.id!==t)throw d("forbidden",{toast:!0});return m.select({id:n.id,firstName:n.firstName,lastName:n.lastName,email:n.email}).from(n).where(v(r(n.parentAffiliateId,t),r(n.role,T.affiliate))).orderBy(n.firstName)}const Ft=P({permission:"deals:manage"},async({audit:t},i,a)=>{const l=await x(a,st),[o]=await m.select({affiliateId:e.affiliateId,commissionStatus:s.status}).from(e).innerJoin(s,r(s.id,e.commissionId)).where(r(e.id,i)).limit(1);if(!o)throw d("deal_not_found",{toast:!0});if(o.commissionStatus!==M.published)throw d("deal_commission_not_published",{toast:!0});return await m.update(e).set({startsAt:l.startsAt,endsAt:l.endsAt}).where(r(e.id,i)),await t({action:"deal.update",subjectId:o.affiliateId,target:{type:"deal",id:i}}),I(`/affiliates/${o.affiliateId}`),D("Toasts.dealUpdated")}),Mt=$({permission:"deals:manage"},async({audit:t},i)=>{const[a]=await m.update(e).set({status:p.deactivated}).where(v(r(e.id,i),r(e.status,p.active))).returning({id:e.id,affiliateId:e.affiliateId});if(!a){const[l]=await m.select({id:e.id}).from(e).where(r(e.id,i)).limit(1);throw l?d("deal_not_active",{toast:!0}):d("deal_not_found",{toast:!0})}return await t({action:"deal.deactivate",subjectId:a.affiliateId,target:{type:"deal",id:a.id},metadata:{status:p.deactivated}}),I(`/affiliates/${a.affiliateId}`),D("Toasts.dealDeactivated")}),Et=$({permission:"deals:manage"},async({audit:t},i)=>{const[a]=await m.update(e).set({status:p.active}).where(v(r(e.id,i),r(e.status,p.deactivated))).returning({id:e.id,affiliateId:e.affiliateId});if(!a){const[l]=await m.select({id:e.id}).from(e).where(r(e.id,i)).limit(1);throw l?d("deal_not_deactivated",{toast:!0}):d("deal_not_found",{toast:!0})}return await t({action:"deal.reactivate",subjectId:a.affiliateId,target:{type:"deal",id:a.id},metadata:{status:p.active}}),I(`/affiliates/${a.affiliateId}`),D("Toasts.dealReactivated")});export{Tt as assignDealAction,Mt as deactivateDealAction,xt as delegateDealForAffiliateAction,vt as delegateDealToSubAffiliateAction,_t as getDealEditData,Nt as listDealsForAffiliate,bt as listPublishedCommissions,Pt as listSubAffiliateOptions,Et as reactivateDealAction,Ft as updateDealAction};
@@ -0,0 +1,10 @@
1
+ import type { DealWithCommission, SubAffiliateOption } from "../actions.js";
2
+ import { type DelegateMode } from "./delegate-deal-button.js";
3
+ import { type ListResult } from "../../../lib/list-params.js";
4
+ export declare function AffiliateDeals({ result, canManage, canDelegate, delegateMode, subAffiliateOptions, }: {
5
+ result: ListResult<DealWithCommission>;
6
+ canManage: boolean;
7
+ canDelegate?: boolean;
8
+ delegateMode?: DelegateMode;
9
+ subAffiliateOptions?: ReadonlyArray<SubAffiliateOption>;
10
+ }): import("react").JSX.Element;