import React, { useState, useMemo } from 'react'; import { useCustomerDiscountUsageReport } from '../core/_hooks'; import { CustomerDiscountUsageFilters } from '../core/_models'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; import { LoadingSpinner } from '@/components/ui/LoadingSpinner'; import { Table } from '@/components/ui/Table'; import { TableColumn } from '@/types'; import { JalaliDateTimePicker } from '@/components/ui/JalaliDateTimePicker'; import { PageContainer, PageTitle } from '@/components/ui/Typography'; import { Pagination } from '@/components/ui/Pagination'; import { Filter, TrendingUp, Users, DollarSign, Hash, X } from 'lucide-react'; import { formatWithThousands, parseFormattedNumber, persianToEnglish } from '@/utils/numberUtils'; import { formatCurrency, formatDateTime } from '@/utils/formatters'; import { ReportSkeleton } from '@/components/common/ReportSkeleton'; const CustomerDiscountUsagePage = () => { const [filters, setFilters] = useState({ user_id: 0, limit: 50, offset: 0, }); const [tempFilters, setTempFilters] = useState({ user_id: 0, limit: 50, offset: 0, }); const [refetchKey, setRefetchKey] = useState(0); const filtersWithKey = useMemo(() => ({ ...filters, _refetchKey: refetchKey, }), [filters, refetchKey]); const { data, isLoading, error } = useCustomerDiscountUsageReport(filtersWithKey as CustomerDiscountUsageFilters & { _refetchKey?: number }); const handleTempFilterChange = (key: keyof CustomerDiscountUsageFilters, value: any) => { setTempFilters(prev => ({ ...prev, [key]: value, })); }; const handleDateRangeChange = (from: string | undefined, to: string | undefined) => { setTempFilters(prev => ({ ...prev, date_range: { from, to, }, })); }; const handleNumericFilterChange = (key: 'discount_id' | 'user_id', raw: string) => { const converted = persianToEnglish(raw).replace(/[^\d]/g, ''); const numeric = converted ? Number(converted) : undefined; if (key === 'user_id') { handleTempFilterChange('user_id', numeric || 0); } else { handleTempFilterChange(key, numeric); } }; const handleApplyFilters = () => { const newFilters = { ...tempFilters, offset: 0, }; setFilters(newFilters); setRefetchKey(prev => prev + 1); }; const handlePageChange = (page: number) => { setFilters(prev => ({ ...prev, offset: (page - 1) * prev.limit, })); }; const handleClearFilters = () => { const clearedFilters = { user_id: 0, limit: 50, offset: 0, }; setTempFilters(clearedFilters); setFilters(clearedFilters); }; const columns: TableColumn[] = [ { key: 'discount_code', label: 'کد تخفیف', align: 'right', }, { key: 'discount_name', label: 'نام کد تخفیف', align: 'right', }, { key: 'order_number', label: 'شماره سفارش', align: 'right', }, { key: 'amount', label: 'مبلغ تخفیف', align: 'right', }, { key: 'used_at', label: 'زمان استفاده', align: 'right', }, ]; const tableData = (data?.usages || []).map(usage => ({ discount_code: usage.discount_code, discount_name: usage.discount_name, order_number: usage.order_number || '-', amount: formatCurrency(usage.amount), used_at: formatDateTime(usage.used_at), })); const currentPage = Math.floor(filters.offset / filters.limit) + 1; const totalPages = data ? Math.ceil(data.total / filters.limit) : 1; return ( گزارش استفاده کاربر خاص از کدهای تخفیف {/* Filters */}

فیلترها

توجه: برای مشاهده گزارش، لطفاً شناسه کاربر را وارد کنید. این فیلد الزامی است.

handleNumericFilterChange('user_id', e.target.value)} placeholder="مثلاً 456" numeric required />
handleTempFilterChange('discount_code', e.target.value || undefined)} placeholder="مثلاً SUMMER2025" />
handleNumericFilterChange('discount_id', e.target.value)} placeholder="مثلاً 123" numeric />
handleDateRangeChange(value, tempFilters.date_range?.to)} placeholder="انتخاب تاریخ شروع" />
handleDateRangeChange(tempFilters.date_range?.from, value)} placeholder="انتخاب تاریخ پایان" />
{/* Summary Cards */} {data?.summary && (

کل استفاده‌ها

{formatWithThousands(data.summary.total_usages)}

مجموع تخفیف دریافتی

{formatCurrency(data.summary.total_discount_amount)}

کدهای متفاوت

{formatWithThousands(data.summary.unique_codes)}

میانگین تخفیف هر سفارش

{formatCurrency(data.summary.average_discount_per_order)}

)} {/* Table */} {isLoading ? ( ) : error ? (

خطا در دریافت داده‌ها

) : filters.user_id === 0 ? (

لطفاً شناسه کاربر را وارد کنید

) : ( <>
{data && data.total > 0 && totalPages > 1 && (
)} {data && data.total === 0 && (

داده‌ای یافت نشد

)} )} ); }; export default CustomerDiscountUsagePage;