import apiClient from './client' // ============== Types ============== export type PromoCodeType = 'balance' | 'subscription_days' | 'trial_subscription' | 'promo_group' export interface PromoCode { id: number code: string type: PromoCodeType balance_bonus_kopeks: number balance_bonus_rubles: number subscription_days: number max_uses: number current_uses: number uses_left: number is_active: boolean is_valid: boolean first_purchase_only: boolean valid_from: string valid_until: string | null promo_group_id: number | null created_by: number | null created_at: string updated_at: string } export interface PromoCodeRecentUse { id: number user_id: number user_username: string | null user_full_name: string | null user_telegram_id: number | null used_at: string } export interface PromoCodeDetail extends PromoCode { total_uses: number today_uses: number recent_uses: PromoCodeRecentUse[] } export interface PromoCodeListResponse { items: PromoCode[] total: number limit: number offset: number } export interface PromoCodeCreateRequest { code: string type: PromoCodeType balance_bonus_kopeks?: number subscription_days?: number max_uses?: number valid_from?: string valid_until?: string | null is_active?: boolean first_purchase_only?: boolean promo_group_id?: number | null } export interface PromoCodeUpdateRequest { code?: string type?: PromoCodeType balance_bonus_kopeks?: number subscription_days?: number max_uses?: number valid_from?: string valid_until?: string | null is_active?: boolean first_purchase_only?: boolean promo_group_id?: number | null } // ============== PromoGroup Types ============== export interface PromoGroup { id: number name: string server_discount_percent: number traffic_discount_percent: number device_discount_percent: number period_discounts: Record auto_assign_total_spent_kopeks: number | null apply_discounts_to_addons: boolean is_default: boolean members_count: number created_at: string | null updated_at: string | null } export interface PromoGroupListResponse { items: PromoGroup[] total: number limit: number offset: number } export interface PromoGroupCreateRequest { name: string server_discount_percent?: number traffic_discount_percent?: number device_discount_percent?: number period_discounts?: Record auto_assign_total_spent_kopeks?: number | null apply_discounts_to_addons?: boolean is_default?: boolean } export interface PromoGroupUpdateRequest { name?: string server_discount_percent?: number traffic_discount_percent?: number device_discount_percent?: number period_discounts?: Record auto_assign_total_spent_kopeks?: number | null apply_discounts_to_addons?: boolean is_default?: boolean } // ============== API ============== export const promocodesApi = { // Promocodes getPromocodes: async (params?: { limit?: number offset?: number is_active?: boolean }): Promise => { const response = await apiClient.get('/cabinet/admin/promocodes', { params }) return response.data }, getPromocode: async (id: number): Promise => { const response = await apiClient.get(`/cabinet/admin/promocodes/${id}`) return response.data }, createPromocode: async (data: PromoCodeCreateRequest): Promise => { const response = await apiClient.post('/cabinet/admin/promocodes', data) return response.data }, updatePromocode: async (id: number, data: PromoCodeUpdateRequest): Promise => { const response = await apiClient.patch(`/cabinet/admin/promocodes/${id}`, data) return response.data }, deletePromocode: async (id: number): Promise => { await apiClient.delete(`/cabinet/admin/promocodes/${id}`) }, // Promo Groups getPromoGroups: async (params?: { limit?: number offset?: number }): Promise => { const response = await apiClient.get('/cabinet/admin/promo-groups', { params }) return response.data }, getPromoGroup: async (id: number): Promise => { const response = await apiClient.get(`/cabinet/admin/promo-groups/${id}`) return response.data }, createPromoGroup: async (data: PromoGroupCreateRequest): Promise => { const response = await apiClient.post('/cabinet/admin/promo-groups', data) return response.data }, updatePromoGroup: async (id: number, data: PromoGroupUpdateRequest): Promise => { const response = await apiClient.patch(`/cabinet/admin/promo-groups/${id}`, data) return response.data }, deletePromoGroup: async (id: number): Promise => { await apiClient.delete(`/cabinet/admin/promo-groups/${id}`) }, }