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.
- package/README.md +32 -0
- package/dist/components/layout/app-header.d.ts +1 -0
- package/dist/components/layout/app-header.js +1 -0
- package/dist/components/layout/app-sidebar.d.ts +9 -0
- package/dist/components/layout/app-sidebar.js +1 -0
- package/dist/components/layout/brand-logo.d.ts +2 -0
- package/dist/components/layout/brand-logo.js +1 -0
- package/dist/components/layout/user-menu.d.ts +6 -0
- package/dist/components/layout/user-menu.js +1 -0
- package/dist/components/ui/action-form.d.ts +10 -0
- package/dist/components/ui/action-form.js +1 -0
- package/dist/components/ui/alert-dialog.d.ts +14 -0
- package/dist/components/ui/alert-dialog.js +1 -0
- package/dist/components/ui/alert.d.ts +12 -0
- package/dist/components/ui/alert.js +1 -0
- package/dist/components/ui/avatar.d.ts +12 -0
- package/dist/components/ui/avatar.js +1 -0
- package/dist/components/ui/badge.d.ts +2 -0
- package/dist/components/ui/badge.js +1 -0
- package/dist/components/ui/button.d.ts +12 -0
- package/dist/components/ui/button.js +1 -0
- package/dist/components/ui/card.d.ts +2 -0
- package/dist/components/ui/card.js +1 -0
- package/dist/components/ui/checkbox.d.ts +5 -0
- package/dist/components/ui/checkbox.js +1 -0
- package/dist/components/ui/combobox.d.ts +18 -0
- package/dist/components/ui/combobox.js +1 -0
- package/dist/components/ui/copy-button.d.ts +8 -0
- package/dist/components/ui/copy-button.js +1 -0
- package/dist/components/ui/country-select.d.ts +12 -0
- package/dist/components/ui/country-select.js +1 -0
- package/dist/components/ui/data-table.d.ts +11 -0
- package/dist/components/ui/data-table.js +1 -0
- package/dist/components/ui/date-range-picker.d.ts +25 -0
- package/dist/components/ui/date-range-picker.js +1 -0
- package/dist/components/ui/dialog.d.ts +19 -0
- package/dist/components/ui/dialog.js +1 -0
- package/dist/components/ui/drawer.d.ts +24 -0
- package/dist/components/ui/drawer.js +1 -0
- package/dist/components/ui/dropdown-menu.d.ts +17 -0
- package/dist/components/ui/dropdown-menu.js +1 -0
- package/dist/components/ui/field.d.ts +7 -0
- package/dist/components/ui/field.js +1 -0
- package/dist/components/ui/fieldset.d.ts +4 -0
- package/dist/components/ui/fieldset.js +1 -0
- package/dist/components/ui/form-field.d.ts +17 -0
- package/dist/components/ui/form-field.js +1 -0
- package/dist/components/ui/form.d.ts +3 -0
- package/dist/components/ui/form.js +1 -0
- package/dist/components/ui/icon-tile.d.ts +5 -0
- package/dist/components/ui/icon-tile.js +1 -0
- package/dist/components/ui/identity.d.ts +6 -0
- package/dist/components/ui/identity.js +1 -0
- package/dist/components/ui/input.d.ts +4 -0
- package/dist/components/ui/input.js +1 -0
- package/dist/components/ui/number-input.d.ts +19 -0
- package/dist/components/ui/number-input.js +1 -0
- package/dist/components/ui/otp-field.d.ts +6 -0
- package/dist/components/ui/otp-field.js +1 -0
- package/dist/components/ui/page-toolbar.d.ts +9 -0
- package/dist/components/ui/page-toolbar.js +1 -0
- package/dist/components/ui/password-input.d.ts +7 -0
- package/dist/components/ui/password-input.js +1 -0
- package/dist/components/ui/radio-group.d.ts +5 -0
- package/dist/components/ui/radio-group.js +1 -0
- package/dist/components/ui/search-input.d.ts +4 -0
- package/dist/components/ui/search-input.js +1 -0
- package/dist/components/ui/section-card.d.ts +7 -0
- package/dist/components/ui/section-card.js +1 -0
- package/dist/components/ui/select-field.d.ts +19 -0
- package/dist/components/ui/select-field.js +1 -0
- package/dist/components/ui/select.d.ts +17 -0
- package/dist/components/ui/select.js +1 -0
- package/dist/components/ui/sidebar.d.ts +27 -0
- package/dist/components/ui/sidebar.js +1 -0
- package/dist/components/ui/slider.d.ts +10 -0
- package/dist/components/ui/slider.js +1 -0
- package/dist/components/ui/sort-button.d.ts +5 -0
- package/dist/components/ui/sort-button.js +1 -0
- package/dist/components/ui/spinner.d.ts +4 -0
- package/dist/components/ui/spinner.js +1 -0
- package/dist/components/ui/status-badge.d.ts +11 -0
- package/dist/components/ui/status-badge.js +1 -0
- package/dist/components/ui/switch-field.d.ts +18 -0
- package/dist/components/ui/switch-field.js +1 -0
- package/dist/components/ui/switch.d.ts +3 -0
- package/dist/components/ui/switch.js +1 -0
- package/dist/components/ui/table-pagination.d.ts +9 -0
- package/dist/components/ui/table-pagination.js +1 -0
- package/dist/components/ui/table.d.ts +18 -0
- package/dist/components/ui/table.js +1 -0
- package/dist/components/ui/tabs.d.ts +8 -0
- package/dist/components/ui/tabs.js +1 -0
- package/dist/components/ui/tag-input.d.ts +9 -0
- package/dist/components/ui/tag-input.js +1 -0
- package/dist/components/ui/text-link.d.ts +10 -0
- package/dist/components/ui/text-link.js +1 -0
- package/dist/components/ui/textarea.d.ts +2 -0
- package/dist/components/ui/textarea.js +1 -0
- package/dist/components/ui/toast.d.ts +1 -0
- package/dist/components/ui/toast.js +1 -0
- package/dist/components/ui/tree.d.ts +32 -0
- package/dist/components/ui/tree.js +1 -0
- package/dist/db/client.d.ts +8 -0
- package/dist/db/client.js +1 -0
- package/dist/db/index.d.ts +3 -0
- package/dist/db/index.js +1 -0
- package/dist/db/logger.d.ts +2 -0
- package/dist/db/logger.js +1 -0
- package/dist/db/migrations/20260628182304_wonderful_groot/migration.sql +289 -0
- package/dist/db/migrations/20260628182304_wonderful_groot/snapshot.json +3750 -0
- package/dist/db/migrations/20260630082829_wet_robin_chapel/migration.sql +2 -0
- package/dist/db/migrations/20260630082829_wet_robin_chapel/snapshot.json +3791 -0
- package/dist/db/migrations/20260702132335_wooden_iron_monger/migration.sql +48 -0
- package/dist/db/migrations/20260702132335_wooden_iron_monger/snapshot.json +4407 -0
- package/dist/db/migrations/20260702142948_vengeful_rhino/migration.sql +1 -0
- package/dist/db/migrations/20260702142948_vengeful_rhino/snapshot.json +4420 -0
- package/dist/db/migrations/20260702185813_curved_pyro/migration.sql +16 -0
- package/dist/db/migrations/20260702185813_curved_pyro/snapshot.json +4646 -0
- package/dist/db/migrations/20260702192041_shiny_franklin_storm/migration.sql +16 -0
- package/dist/db/migrations/20260702192041_shiny_franklin_storm/snapshot.json +4872 -0
- package/dist/db/migrations/20260704101548_bizarre_namorita/migration.sql +1 -0
- package/dist/db/migrations/20260704101548_bizarre_namorita/snapshot.json +4885 -0
- package/dist/db/migrations/20260704105911_sleepy_juggernaut/migration.sql +1 -0
- package/dist/db/migrations/20260704105911_sleepy_juggernaut/snapshot.json +4898 -0
- package/dist/db/migrations/20260704115959_lean_sandman/migration.sql +1 -0
- package/dist/db/migrations/20260704115959_lean_sandman/snapshot.json +4885 -0
- package/dist/db/migrations/20260707231532_daffy_captain_stacy/migration.sql +10 -0
- package/dist/db/migrations/20260707231532_daffy_captain_stacy/snapshot.json +4919 -0
- package/dist/db/migrations/20260708190355_spooky_jimmy_woo/migration.sql +3 -0
- package/dist/db/migrations/20260708190355_spooky_jimmy_woo/snapshot.json +4970 -0
- package/dist/db/migrations/20260711145212_drop_legacy_earning_status/migration.sql +7 -0
- package/dist/db/migrations/20260711145212_drop_legacy_earning_status/snapshot.json +4968 -0
- package/dist/db/migrations/20260712161249_dashboard_stat_indexes/migration.sql +3 -0
- package/dist/db/migrations/20260712161249_dashboard_stat_indexes/snapshot.json +5038 -0
- package/dist/db/migrations/20260713013911_add_payout_paid_at/migration.sql +2 -0
- package/dist/db/migrations/20260713013911_add_payout_paid_at/snapshot.json +5072 -0
- package/dist/db/schema/analytics-outbox.d.ts +145 -0
- package/dist/db/schema/analytics-outbox.js +1 -0
- package/dist/db/schema/audit-logs.d.ts +204 -0
- package/dist/db/schema/audit-logs.js +1 -0
- package/dist/db/schema/campaigns.d.ts +180 -0
- package/dist/db/schema/campaigns.js +1 -0
- package/dist/db/schema/casinos.d.ts +129 -0
- package/dist/db/schema/casinos.js +1 -0
- package/dist/db/schema/commission-rule-groups.d.ts +84 -0
- package/dist/db/schema/commission-rule-groups.js +1 -0
- package/dist/db/schema/commission-rules.d.ts +145 -0
- package/dist/db/schema/commission-rules.js +1 -0
- package/dist/db/schema/commissions.d.ts +242 -0
- package/dist/db/schema/commissions.js +1 -0
- package/dist/db/schema/conversions.d.ts +302 -0
- package/dist/db/schema/conversions.js +1 -0
- package/dist/db/schema/deals.d.ts +180 -0
- package/dist/db/schema/deals.js +1 -0
- package/dist/db/schema/earnings.d.ts +262 -0
- package/dist/db/schema/earnings.js +1 -0
- package/dist/db/schema/groups.d.ts +214 -0
- package/dist/db/schema/groups.js +1 -0
- package/dist/db/schema/index.d.ts +18 -0
- package/dist/db/schema/index.js +1 -0
- package/dist/db/schema/payouts.d.ts +182 -0
- package/dist/db/schema/payouts.js +1 -0
- package/dist/db/schema/platform-settings.d.ts +84 -0
- package/dist/db/schema/platform-settings.js +1 -0
- package/dist/db/schema/player-activity.d.ts +159 -0
- package/dist/db/schema/player-activity.js +1 -0
- package/dist/db/schema/revshare-carryover.d.ts +129 -0
- package/dist/db/schema/revshare-carryover.js +1 -0
- package/dist/db/schema/sessions.d.ts +213 -0
- package/dist/db/schema/sessions.js +1 -0
- package/dist/db/schema/table.d.ts +1 -0
- package/dist/db/schema/table.js +1 -0
- package/dist/db/schema/users.d.ts +609 -0
- package/dist/db/schema/users.js +1 -0
- package/dist/db/schema/verification-tokens.d.ts +106 -0
- package/dist/db/schema/verification-tokens.js +1 -0
- package/dist/db/types/branded.d.ts +3 -0
- package/dist/db/types/branded.js +0 -0
- package/dist/db/types/commission-rules.d.ts +70 -0
- package/dist/db/types/commission-rules.js +1 -0
- package/dist/db/types/index.d.ts +2 -0
- package/dist/db/types/index.js +1 -0
- package/dist/emails/admin/support-message.d.ts +39 -0
- package/dist/emails/admin/support-message.js +5 -0
- package/dist/emails/affiliate/activated.d.ts +33 -0
- package/dist/emails/affiliate/activated.js +1 -0
- package/dist/emails/affiliate/deal-notice.d.ts +35 -0
- package/dist/emails/affiliate/deal-notice.js +1 -0
- package/dist/emails/affiliate/invite.d.ts +35 -0
- package/dist/emails/affiliate/invite.js +1 -0
- package/dist/emails/affiliate/signup-verify.d.ts +35 -0
- package/dist/emails/affiliate/signup-verify.js +1 -0
- package/dist/emails/auth/password-reset.d.ts +37 -0
- package/dist/emails/auth/password-reset.js +1 -0
- package/dist/emails/layout.d.ts +10 -0
- package/dist/emails/layout.js +1 -0
- package/dist/emails/manager/affiliate-activated.d.ts +33 -0
- package/dist/emails/manager/affiliate-activated.js +1 -0
- package/dist/emails/manager/bulk-affiliates-activated.d.ts +33 -0
- package/dist/emails/manager/bulk-affiliates-activated.js +1 -0
- package/dist/emails/manager/invite.d.ts +35 -0
- package/dist/emails/manager/invite.js +1 -0
- package/dist/emails/manager/pending-approval.d.ts +33 -0
- package/dist/emails/manager/pending-approval.js +1 -0
- package/dist/emails/preview-env.d.ts +2 -0
- package/dist/emails/preview-env.js +1 -0
- package/dist/features/affiliates/actions.d.ts +60 -0
- package/dist/features/affiliates/actions.js +1 -0
- package/dist/features/affiliates/activation-email.d.ts +8 -0
- package/dist/features/affiliates/activation-email.js +1 -0
- package/dist/features/affiliates/bulk-approve.d.ts +2 -0
- package/dist/features/affiliates/bulk-approve.js +1 -0
- package/dist/features/affiliates/components/affiliate-actions-menu.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-actions-menu.js +1 -0
- package/dist/features/affiliates/components/affiliate-create-button.d.ts +1 -0
- package/dist/features/affiliates/components/affiliate-create-button.js +1 -0
- package/dist/features/affiliates/components/affiliate-detail-tabs.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-detail-tabs.js +1 -0
- package/dist/features/affiliates/components/affiliate-dialog.d.ts +11 -0
- package/dist/features/affiliates/components/affiliate-dialog.js +1 -0
- package/dist/features/affiliates/components/affiliate-profile-fields.d.ts +6 -0
- package/dist/features/affiliates/components/affiliate-profile-fields.js +1 -0
- package/dist/features/affiliates/components/affiliate-status-badge.d.ts +4 -0
- package/dist/features/affiliates/components/affiliate-status-badge.js +1 -0
- package/dist/features/affiliates/components/affiliate-status-tabs.d.ts +4 -0
- package/dist/features/affiliates/components/affiliate-status-tabs.js +1 -0
- package/dist/features/affiliates/components/affiliates-table.d.ts +10 -0
- package/dist/features/affiliates/components/affiliates-table.js +1 -0
- package/dist/features/affiliates/components/assign-parent-dialog.d.ts +5 -0
- package/dist/features/affiliates/components/assign-parent-dialog.js +1 -0
- package/dist/features/affiliates/components/detach-affiliate-confirm.d.ts +5 -0
- package/dist/features/affiliates/components/detach-affiliate-confirm.js +1 -0
- package/dist/features/affiliates/components/reject-affiliate-confirm.d.ts +5 -0
- package/dist/features/affiliates/components/reject-affiliate-confirm.js +1 -0
- package/dist/features/affiliates/components/sub-affiliate-invite-button.d.ts +3 -0
- package/dist/features/affiliates/components/sub-affiliate-invite-button.js +1 -0
- package/dist/features/affiliates/invite.d.ts +6 -0
- package/dist/features/affiliates/invite.js +1 -0
- package/dist/features/affiliates/list-params.d.ts +27 -0
- package/dist/features/affiliates/list-params.js +1 -0
- package/dist/features/affiliates/pending-notification.d.ts +18 -0
- package/dist/features/affiliates/pending-notification.js +1 -0
- package/dist/features/affiliates/sub-invite.d.ts +7 -0
- package/dist/features/affiliates/sub-invite.js +1 -0
- package/dist/features/audit/action-labels.d.ts +15 -0
- package/dist/features/audit/action-labels.js +1 -0
- package/dist/features/audit/components/audit-log-table.d.ts +5 -0
- package/dist/features/audit/components/audit-log-table.js +1 -0
- package/dist/features/audit/list-params.d.ts +2 -0
- package/dist/features/audit/list-params.js +1 -0
- package/dist/features/audit/read.d.ts +27 -0
- package/dist/features/audit/read.js +1 -0
- package/dist/features/auth/actions.d.ts +33 -0
- package/dist/features/auth/actions.js +1 -0
- package/dist/features/auth/authorization.d.ts +14 -0
- package/dist/features/auth/authorization.js +1 -0
- package/dist/features/auth/components/accept-invite-form.d.ts +3 -0
- package/dist/features/auth/components/accept-invite-form.js +1 -0
- package/dist/features/auth/components/forgot-password-form.d.ts +1 -0
- package/dist/features/auth/components/forgot-password-form.js +1 -0
- package/dist/features/auth/components/permissions-form.d.ts +5 -0
- package/dist/features/auth/components/permissions-form.js +1 -0
- package/dist/features/auth/components/reset-password-form.d.ts +3 -0
- package/dist/features/auth/components/reset-password-form.js +1 -0
- package/dist/features/auth/components/signin-form.d.ts +5 -0
- package/dist/features/auth/components/signin-form.js +1 -0
- package/dist/features/auth/components/signup-form.d.ts +1 -0
- package/dist/features/auth/components/signup-form.js +1 -0
- package/dist/features/auth/components/verify-email-form.d.ts +3 -0
- package/dist/features/auth/components/verify-email-form.js +1 -0
- package/dist/features/auth/password-reset.d.ts +6 -0
- package/dist/features/auth/password-reset.js +1 -0
- package/dist/features/auth/permissions.d.ts +49 -0
- package/dist/features/auth/permissions.js +1 -0
- package/dist/features/auth/require.d.ts +3 -0
- package/dist/features/auth/require.js +1 -0
- package/dist/features/auth/signup-email.d.ts +6 -0
- package/dist/features/auth/signup-email.js +1 -0
- package/dist/features/campaigns/actions.d.ts +53 -0
- package/dist/features/campaigns/actions.js +1 -0
- package/dist/features/campaigns/components/campaign-dialog.d.ts +7 -0
- package/dist/features/campaigns/components/campaign-dialog.js +1 -0
- package/dist/features/campaigns/components/campaign-row-actions.d.ts +8 -0
- package/dist/features/campaigns/components/campaign-row-actions.js +1 -0
- package/dist/features/campaigns/components/campaign-status-badge.d.ts +6 -0
- package/dist/features/campaigns/components/campaign-status-badge.js +1 -0
- package/dist/features/campaigns/components/campaign-status-tabs.d.ts +1 -0
- package/dist/features/campaigns/components/campaign-status-tabs.js +1 -0
- package/dist/features/campaigns/components/campaigns-table.d.ts +7 -0
- package/dist/features/campaigns/components/campaigns-table.js +1 -0
- package/dist/features/campaigns/components/create-campaign-button.d.ts +5 -0
- package/dist/features/campaigns/components/create-campaign-button.js +1 -0
- package/dist/features/campaigns/components/sub-id-builder.d.ts +4 -0
- package/dist/features/campaigns/components/sub-id-builder.js +1 -0
- package/dist/features/campaigns/components/tracking-link-box.d.ts +3 -0
- package/dist/features/campaigns/components/tracking-link-box.js +1 -0
- package/dist/features/campaigns/components/tracking-link-cell.d.ts +4 -0
- package/dist/features/campaigns/components/tracking-link-cell.js +1 -0
- package/dist/features/campaigns/components/tracking-link-dialog.d.ts +6 -0
- package/dist/features/campaigns/components/tracking-link-dialog.js +1 -0
- package/dist/features/campaigns/list-params.d.ts +14 -0
- package/dist/features/campaigns/list-params.js +1 -0
- package/dist/features/campaigns/tracking-url.d.ts +8 -0
- package/dist/features/campaigns/tracking-url.js +1 -0
- package/dist/features/casinos/actions.d.ts +39 -0
- package/dist/features/casinos/actions.js +1 -0
- package/dist/features/casinos/components/casino-create-button.d.ts +1 -0
- package/dist/features/casinos/components/casino-create-button.js +1 -0
- package/dist/features/casinos/components/casino-dialog.d.ts +11 -0
- package/dist/features/casinos/components/casino-dialog.js +1 -0
- package/dist/features/casinos/components/casino-form-fields.d.ts +7 -0
- package/dist/features/casinos/components/casino-form-fields.js +1 -0
- package/dist/features/casinos/components/casino-status-tabs.d.ts +1 -0
- package/dist/features/casinos/components/casino-status-tabs.js +1 -0
- package/dist/features/casinos/components/casinos-table.d.ts +6 -0
- package/dist/features/casinos/components/casinos-table.js +1 -0
- package/dist/features/casinos/components/delete-casino-confirm.d.ts +5 -0
- package/dist/features/casinos/components/delete-casino-confirm.js +1 -0
- package/dist/features/casinos/list-params.d.ts +14 -0
- package/dist/features/casinos/list-params.js +1 -0
- package/dist/features/commissions/actions.d.ts +76 -0
- package/dist/features/commissions/actions.js +1 -0
- package/dist/features/commissions/components/casino-bindings-field.d.ts +10 -0
- package/dist/features/commissions/components/casino-bindings-field.js +1 -0
- package/dist/features/commissions/components/commission-create-button.d.ts +1 -0
- package/dist/features/commissions/components/commission-create-button.js +1 -0
- package/dist/features/commissions/components/commission-detail-dialog.d.ts +5 -0
- package/dist/features/commissions/components/commission-detail-dialog.js +1 -0
- package/dist/features/commissions/components/commission-editor.d.ts +8 -0
- package/dist/features/commissions/components/commission-editor.js +1 -0
- package/dist/features/commissions/components/commission-read-view.d.ts +5 -0
- package/dist/features/commissions/components/commission-read-view.js +1 -0
- package/dist/features/commissions/components/commission-status-badge.d.ts +4 -0
- package/dist/features/commissions/components/commission-status-badge.js +1 -0
- package/dist/features/commissions/components/commission-status-tabs.d.ts +1 -0
- package/dist/features/commissions/components/commission-status-tabs.js +1 -0
- package/dist/features/commissions/components/commissions-table.d.ts +14 -0
- package/dist/features/commissions/components/commissions-table.js +1 -0
- package/dist/features/commissions/components/delete-commission-confirm.d.ts +5 -0
- package/dist/features/commissions/components/delete-commission-confirm.js +1 -0
- package/dist/features/commissions/components/duplicate-commission-dialog.d.ts +6 -0
- package/dist/features/commissions/components/duplicate-commission-dialog.js +1 -0
- package/dist/features/commissions/components/rule-editor/conditions-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/conditions-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/modifiers-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/modifiers-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/qualifiers-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/qualifiers-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/reducer.d.ts +102 -0
- package/dist/features/commissions/components/rule-editor/reducer.js +1 -0
- package/dist/features/commissions/components/rule-editor/rewards-block.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/rewards-block.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-card.d.ts +10 -0
- package/dist/features/commissions/components/rule-editor/rule-card.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-editor.d.ts +7 -0
- package/dist/features/commissions/components/rule-editor/rule-editor.js +1 -0
- package/dist/features/commissions/components/rule-editor/rule-group-card.d.ts +9 -0
- package/dist/features/commissions/components/rule-editor/rule-group-card.js +1 -0
- package/dist/features/commissions/components/rule-editor/state.d.ts +21 -0
- package/dist/features/commissions/components/rule-editor/state.js +1 -0
- package/dist/features/commissions/components/rule-groups-read-view.d.ts +4 -0
- package/dist/features/commissions/components/rule-groups-read-view.js +1 -0
- package/dist/features/commissions/list-params.d.ts +14 -0
- package/dist/features/commissions/list-params.js +1 -0
- package/dist/features/commissions/rule-validation.d.ts +173 -0
- package/dist/features/commissions/rule-validation.js +1 -0
- package/dist/features/dashboard/affiliate-queries.d.ts +14 -0
- package/dist/features/dashboard/affiliate-queries.js +1 -0
- package/dist/features/dashboard/clickhouse.d.ts +3 -0
- package/dist/features/dashboard/clickhouse.js +2 -0
- package/dist/features/dashboard/components/affiliate-charts.d.ts +5 -0
- package/dist/features/dashboard/components/affiliate-charts.js +1 -0
- package/dist/features/dashboard/components/affiliate-stats.d.ts +5 -0
- package/dist/features/dashboard/components/affiliate-stats.js +1 -0
- package/dist/features/dashboard/components/charts/funnel-chart.d.ts +11 -0
- package/dist/features/dashboard/components/charts/funnel-chart.js +1 -0
- package/dist/features/dashboard/components/charts/rank-bar-chart.d.ts +10 -0
- package/dist/features/dashboard/components/charts/rank-bar-chart.js +1 -0
- package/dist/features/dashboard/components/charts/time-series-chart.d.ts +12 -0
- package/dist/features/dashboard/components/charts/time-series-chart.js +1 -0
- package/dist/features/dashboard/components/charts-grid.d.ts +8 -0
- package/dist/features/dashboard/components/charts-grid.js +1 -0
- package/dist/features/dashboard/components/dashboard-charts.d.ts +4 -0
- package/dist/features/dashboard/components/dashboard-charts.js +1 -0
- package/dist/features/dashboard/components/dashboard-period-tabs.d.ts +1 -0
- package/dist/features/dashboard/components/dashboard-period-tabs.js +1 -0
- package/dist/features/dashboard/components/money-stat-card.d.ts +6 -0
- package/dist/features/dashboard/components/money-stat-card.js +1 -0
- package/dist/features/dashboard/components/stat-card.d.ts +6 -0
- package/dist/features/dashboard/components/stat-card.js +1 -0
- package/dist/features/dashboard/components/top-affiliates.d.ts +4 -0
- package/dist/features/dashboard/components/top-affiliates.js +1 -0
- package/dist/features/dashboard/list-params.d.ts +24 -0
- package/dist/features/dashboard/list-params.js +1 -0
- package/dist/features/dashboard/queries.d.ts +63 -0
- package/dist/features/dashboard/queries.js +1 -0
- package/dist/features/dashboard/series.d.ts +32 -0
- package/dist/features/dashboard/series.js +1 -0
- package/dist/features/deals/actions.d.ts +60 -0
- package/dist/features/deals/actions.js +1 -0
- package/dist/features/deals/components/affiliate-deals.d.ts +10 -0
- package/dist/features/deals/components/affiliate-deals.js +1 -0
- package/dist/features/deals/components/assign-deal-button.d.ts +9 -0
- package/dist/features/deals/components/assign-deal-button.js +1 -0
- package/dist/features/deals/components/deal-dialog.d.ts +19 -0
- package/dist/features/deals/components/deal-dialog.js +1 -0
- package/dist/features/deals/components/deal-row-actions.d.ts +6 -0
- package/dist/features/deals/components/deal-row-actions.js +1 -0
- package/dist/features/deals/components/deal-status-badge.d.ts +10 -0
- package/dist/features/deals/components/deal-status-badge.js +1 -0
- package/dist/features/deals/components/deal-status-tabs.d.ts +1 -0
- package/dist/features/deals/components/deal-status-tabs.js +1 -0
- package/dist/features/deals/components/delegate-deal-button.d.ts +8 -0
- package/dist/features/deals/components/delegate-deal-button.js +1 -0
- package/dist/features/deals/deal-assigned-email.d.ts +11 -0
- package/dist/features/deals/deal-assigned-email.js +1 -0
- package/dist/features/deals/deal-delegated-email.d.ts +13 -0
- package/dist/features/deals/deal-delegated-email.js +1 -0
- package/dist/features/deals/list-params.d.ts +14 -0
- package/dist/features/deals/list-params.js +1 -0
- package/dist/features/earnings/components/earnings-balances.d.ts +4 -0
- package/dist/features/earnings/components/earnings-balances.js +1 -0
- package/dist/features/earnings/components/earnings-ledger.d.ts +5 -0
- package/dist/features/earnings/components/earnings-ledger.js +1 -0
- package/dist/features/earnings/components/earnings-status-badge.d.ts +4 -0
- package/dist/features/earnings/components/earnings-status-badge.js +1 -0
- package/dist/features/earnings/components/earnings-status-tabs.d.ts +1 -0
- package/dist/features/earnings/components/earnings-status-tabs.js +1 -0
- package/dist/features/earnings/components/sub-affiliate-earnings.d.ts +4 -0
- package/dist/features/earnings/components/sub-affiliate-earnings.js +1 -0
- package/dist/features/earnings/list-params.d.ts +14 -0
- package/dist/features/earnings/list-params.js +1 -0
- package/dist/features/earnings/queries.d.ts +30 -0
- package/dist/features/earnings/queries.js +1 -0
- package/dist/features/groups/actions.d.ts +36 -0
- package/dist/features/groups/actions.js +1 -0
- package/dist/features/groups/components/delete-group-confirm.d.ts +5 -0
- package/dist/features/groups/components/delete-group-confirm.js +1 -0
- package/dist/features/groups/components/group-create-button.d.ts +1 -0
- package/dist/features/groups/components/group-create-button.js +1 -0
- package/dist/features/groups/components/group-dialog.d.ts +11 -0
- package/dist/features/groups/components/group-dialog.js +1 -0
- package/dist/features/groups/components/group-form-fields.d.ts +10 -0
- package/dist/features/groups/components/group-form-fields.js +1 -0
- package/dist/features/groups/components/group-status-tabs.d.ts +1 -0
- package/dist/features/groups/components/group-status-tabs.js +1 -0
- package/dist/features/groups/components/groups-table.d.ts +9 -0
- package/dist/features/groups/components/groups-table.js +1 -0
- package/dist/features/groups/list-params.d.ts +14 -0
- package/dist/features/groups/list-params.js +1 -0
- package/dist/features/managers/actions.d.ts +43 -0
- package/dist/features/managers/actions.js +1 -0
- package/dist/features/managers/components/manager-create-button.d.ts +1 -0
- package/dist/features/managers/components/manager-create-button.js +1 -0
- package/dist/features/managers/components/manager-dialog.d.ts +11 -0
- package/dist/features/managers/components/manager-dialog.js +1 -0
- package/dist/features/managers/components/manager-permissions-dialog.d.ts +7 -0
- package/dist/features/managers/components/manager-permissions-dialog.js +1 -0
- package/dist/features/managers/components/manager-profile-fields.d.ts +7 -0
- package/dist/features/managers/components/manager-profile-fields.js +1 -0
- package/dist/features/managers/components/manager-status-tabs.d.ts +1 -0
- package/dist/features/managers/components/manager-status-tabs.js +1 -0
- package/dist/features/managers/components/managers-table.d.ts +8 -0
- package/dist/features/managers/components/managers-table.js +1 -0
- package/dist/features/managers/invite.d.ts +6 -0
- package/dist/features/managers/invite.js +1 -0
- package/dist/features/managers/list-params.d.ts +14 -0
- package/dist/features/managers/list-params.js +1 -0
- package/dist/features/payouts/actions.d.ts +12 -0
- package/dist/features/payouts/actions.js +1 -0
- package/dist/features/payouts/balance.d.ts +2 -0
- package/dist/features/payouts/balance.js +1 -0
- package/dist/features/payouts/components/my-payouts-table.d.ts +5 -0
- package/dist/features/payouts/components/my-payouts-table.js +1 -0
- package/dist/features/payouts/components/payout-row-actions.d.ts +5 -0
- package/dist/features/payouts/components/payout-row-actions.js +1 -0
- package/dist/features/payouts/components/payout-status-badge.d.ts +4 -0
- package/dist/features/payouts/components/payout-status-badge.js +1 -0
- package/dist/features/payouts/components/payout-status-tabs.d.ts +1 -0
- package/dist/features/payouts/components/payout-status-tabs.js +1 -0
- package/dist/features/payouts/components/payouts-table.d.ts +6 -0
- package/dist/features/payouts/components/payouts-table.js +1 -0
- package/dist/features/payouts/components/request-payout-dialog.d.ts +4 -0
- package/dist/features/payouts/components/request-payout-dialog.js +1 -0
- package/dist/features/payouts/constants.d.ts +2 -0
- package/dist/features/payouts/constants.js +1 -0
- package/dist/features/payouts/list-params.d.ts +14 -0
- package/dist/features/payouts/list-params.js +1 -0
- package/dist/features/payouts/my-queries.d.ts +14 -0
- package/dist/features/payouts/my-queries.js +1 -0
- package/dist/features/payouts/queries.d.ts +14 -0
- package/dist/features/payouts/queries.js +1 -0
- package/dist/features/postbacks/actions.d.ts +27 -0
- package/dist/features/postbacks/actions.js +1 -0
- package/dist/features/postbacks/components/integration-dialog.d.ts +6 -0
- package/dist/features/postbacks/components/integration-dialog.js +1 -0
- package/dist/features/postbacks/components/postback-editor.d.ts +5 -0
- package/dist/features/postbacks/components/postback-editor.js +1 -0
- package/dist/features/postbacks/components/postbacks-table.d.ts +4 -0
- package/dist/features/postbacks/components/postbacks-table.js +1 -0
- package/dist/features/settings/actions.d.ts +2 -0
- package/dist/features/settings/actions.js +1 -0
- package/dist/features/settings/components/affiliate-approval-setting.d.ts +3 -0
- package/dist/features/settings/components/affiliate-approval-setting.js +1 -0
- package/dist/features/settings/components/manager-totp-setting.d.ts +3 -0
- package/dist/features/settings/components/manager-totp-setting.js +1 -0
- package/dist/features/support/actions.d.ts +12 -0
- package/dist/features/support/actions.js +1 -0
- package/dist/features/support/components/support-page.d.ts +4 -0
- package/dist/features/support/components/support-page.js +1 -0
- package/dist/features/support/email.d.ts +13 -0
- package/dist/features/support/email.js +1 -0
- package/dist/features/users/actions.d.ts +4 -0
- package/dist/features/users/actions.js +1 -0
- package/dist/features/users/components/password-section.d.ts +1 -0
- package/dist/features/users/components/password-section.js +1 -0
- package/dist/features/users/components/preferences-section.d.ts +4 -0
- package/dist/features/users/components/preferences-section.js +1 -0
- package/dist/features/users/components/settings-tabs.d.ts +1 -0
- package/dist/features/users/components/settings-tabs.js +1 -0
- package/dist/features/users/components/totp-section.d.ts +4 -0
- package/dist/features/users/components/totp-section.js +1 -0
- package/dist/features/users/list-params.d.ts +12 -0
- package/dist/features/users/list-params.js +1 -0
- package/dist/features/users/totp.d.ts +7 -0
- package/dist/features/users/totp.js +1 -0
- package/dist/i18n/config.d.ts +5 -0
- package/dist/i18n/config.js +1 -0
- package/dist/i18n/get-locale.d.ts +3 -0
- package/dist/i18n/get-locale.js +1 -0
- package/dist/i18n/locale.d.ts +2 -0
- package/dist/i18n/locale.js +1 -0
- package/dist/lib/actions/parse-form.d.ts +3 -0
- package/dist/lib/actions/parse-form.js +1 -0
- package/dist/lib/actions/state.d.ts +22 -0
- package/dist/lib/actions/state.js +0 -0
- package/dist/lib/audit/actions.d.ts +9 -0
- package/dist/lib/audit/actions.js +1 -0
- package/dist/lib/audit/record.d.ts +4 -0
- package/dist/lib/audit/record.js +1 -0
- package/dist/lib/auth/action.d.ts +45 -0
- package/dist/lib/auth/action.js +1 -0
- package/dist/lib/auth/config.d.ts +24 -0
- package/dist/lib/auth/config.js +1 -0
- package/dist/lib/auth/jwt.d.ts +17 -0
- package/dist/lib/auth/jwt.js +1 -0
- package/dist/lib/auth/password-options.d.ts +6 -0
- package/dist/lib/auth/password-options.js +1 -0
- package/dist/lib/auth/password.d.ts +3 -0
- package/dist/lib/auth/password.js +1 -0
- package/dist/lib/auth/session.d.ts +26 -0
- package/dist/lib/auth/session.js +1 -0
- package/dist/lib/auth/tokens.d.ts +43 -0
- package/dist/lib/auth/tokens.js +1 -0
- package/dist/lib/auth/totp-challenge.d.ts +4 -0
- package/dist/lib/auth/totp-challenge.js +1 -0
- package/dist/lib/auth/totp.d.ts +7 -0
- package/dist/lib/auth/totp.js +1 -0
- package/dist/lib/auth/verification-tokens.d.ts +19 -0
- package/dist/lib/auth/verification-tokens.js +1 -0
- package/dist/lib/cn.d.ts +2 -0
- package/dist/lib/cn.js +1 -0
- package/dist/lib/countries.d.ts +18 -0
- package/dist/lib/countries.js +1 -0
- package/dist/lib/currencies.d.ts +6 -0
- package/dist/lib/currencies.js +1 -0
- package/dist/lib/data/countries-by-continent.json +257 -0
- package/dist/lib/db/errors.d.ts +4 -0
- package/dist/lib/db/errors.js +1 -0
- package/dist/lib/email/client.d.ts +6 -0
- package/dist/lib/email/client.js +1 -0
- package/dist/lib/email/env.d.ts +12 -0
- package/dist/lib/email/env.js +1 -0
- package/dist/lib/email/format.d.ts +5 -0
- package/dist/lib/email/format.js +1 -0
- package/dist/lib/email/locale.d.ts +3 -0
- package/dist/lib/email/locale.js +1 -0
- package/dist/lib/email/send.d.ts +12 -0
- package/dist/lib/email/send.js +1 -0
- package/dist/lib/env.d.ts +20 -0
- package/dist/lib/env.js +1 -0
- package/dist/lib/errors/codes.d.ts +72 -0
- package/dist/lib/errors/codes.js +1 -0
- package/dist/lib/errors/server.d.ts +10 -0
- package/dist/lib/errors/server.js +1 -0
- package/dist/lib/format.d.ts +3 -0
- package/dist/lib/format.js +1 -0
- package/dist/lib/hooks/use-deferred-dialog.d.ts +11 -0
- package/dist/lib/hooks/use-deferred-dialog.js +1 -0
- package/dist/lib/hooks/use-form-reset.d.ts +2 -0
- package/dist/lib/hooks/use-form-reset.js +1 -0
- package/dist/lib/hooks/use-form-toast.d.ts +2 -0
- package/dist/lib/hooks/use-form-toast.js +1 -0
- package/dist/lib/i18n/format-datetime.d.ts +1 -0
- package/dist/lib/i18n/format-datetime.js +1 -0
- package/dist/lib/i18n/relative-time.d.ts +1 -0
- package/dist/lib/i18n/relative-time.js +1 -0
- package/dist/lib/list-params.d.ts +51 -0
- package/dist/lib/list-params.js +1 -0
- package/dist/lib/money.d.ts +2 -0
- package/dist/lib/money.js +1 -0
- package/dist/lib/platform-settings.d.ts +5 -0
- package/dist/lib/platform-settings.js +1 -0
- package/dist/lib/preferences/actions.d.ts +1 -0
- package/dist/lib/preferences/actions.js +1 -0
- package/dist/lib/preferences/index.d.ts +15 -0
- package/dist/lib/preferences/index.js +1 -0
- package/dist/lib/preferences/read.d.ts +2 -0
- package/dist/lib/preferences/read.js +1 -0
- package/dist/lib/slug.d.ts +1 -0
- package/dist/lib/slug.js +1 -0
- package/dist/lib/toast.d.ts +13 -0
- package/dist/lib/toast.js +1 -0
- package/dist/lib/tracking-cache.d.ts +2 -0
- package/dist/lib/tracking-cache.js +1 -0
- package/dist/lib/users.d.ts +12 -0
- package/dist/lib/users.js +1 -0
- package/dist/lib/validation/zod.d.ts +30 -0
- package/dist/lib/validation/zod.js +1 -0
- package/dist/messages/de/emails.json +136 -0
- package/dist/messages/de/index.json +1104 -0
- package/dist/messages/en/emails.json +136 -0
- package/dist/messages/en/index.json +1104 -0
- package/dist/theme/config.d.ts +8 -0
- package/dist/theme/config.js +1 -0
- package/dist/theme/get-theme.d.ts +3 -0
- package/dist/theme/get-theme.js +1 -0
- package/dist/theme/theme.d.ts +2 -0
- package/dist/theme/theme.js +1 -0
- 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,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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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;
|