import React, { useState } from 'react' import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from '@/components/ui/dialog' import { Button } from '@/components/ui/button' import { Avatar } from '@/components/ui/avatar' import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card' import { Ic } from '@/icons' import type { FactorItem } from '../types' import { BillingStatusBadge } from './BillingStatusBadge' import { BillingServiceBadge } from './BillingServiceBadge' interface Props { factor: FactorItem | null open: boolean onClose: () => void onApprove: (factorId: number) => Promise onOpenRejectDialog: (factor: FactorItem) => void onOpenReceiptLightbox: (factor: FactorItem) => void onClearReceipt?: (factorId: number) => Promise isUpdating?: boolean } export function BillingDetailModal({ factor, open, onClose, onApprove, onOpenRejectDialog, onOpenReceiptLightbox, onClearReceipt, isUpdating, }: Props) { const [copiedCard, setCopiedCard] = useState(false) if (!factor) return null const handleCopyCard = (cardNumber: string) => { navigator.clipboard.writeText(cardNumber) setCopiedCard(true) setTimeout(() => setCopiedCard(false), 2000) } const detail = factor.detail_service const user = factor.user_info return ( !val && onClose()}> {/* هدر مودال */}
صورت‌حساب شماره #{factor.id} ثبت شده در: {new Date(factor.created_at).toLocaleString('fa-IR')}
{/* کارت وضعیت انقضا یا هشدار رد */} {factor.status === 'rejected' && factor.rejected_description && (

دلیل رد صورت‌حساب:

{factor.rejected_description}

)} {factor.status === 'expired' && (

دلیل انقضا:

{factor.rejected_description || 'انقضای مهلت پرداخت (سپری شدن ۷۲ ساعت)'}

)} {factor.expiration_date && (
مهلت پرداخت (تاریخ انقضا): {factor.expiration_date}
)} {/* اطلاعات خریدار و اطلاعات مالی در ۲ ستون */}
{/* کارت مشخصات خریدار */} اطلاعات مشتری

{user?.fullname || 'نام ثبت نشده'}

{user?.email || '—'}

شماره تماس: {user?.phone_number || '—'}
شناسه کاربری: {user?.id ?? '—'}
{/* کارت مشخصات مالی فاکتور */} مشخصات مالی و واریز
مبلغ کل فاکتور: {Number(factor.amount).toLocaleString()} $
{factor.card_number && (
شماره کارت مقصد: {factor.card_number}
)}
شناسه سفارش مرجع: {factor.order_id || factor.object_id}
{factor.description && (
توضیحات: {factor.description}
)}
{/* جزئیات سرویس چندشکلی (Polymorphic Details) */} ریز اقلام و مشخصات سرویس ({factor.service.toUpperCase()}) {/* ۱. تور */} {factor.service === 'tour' && (
عنوان تور: {detail?.tour || '—'}
{detail?.passenger_data ? (

اسامی و رده سنی مسافران:

{/* بزرگسالان */} {(detail.passenger_data.adults?.count ?? 0) > 0 && (
بزرگسال ({detail.passenger_data.adults?.count} نفر): {detail.passenger_data.adults?.names.join('، ')}
)} {/* کودکان */} {(detail.passenger_data.children?.count ?? 0) > 0 && (
کودک ({detail.passenger_data.children?.count} نفر): {detail.passenger_data.children?.names.join('، ')}
)} {/* نوزادان */} {(detail.passenger_data.infants?.count ?? 0) > 0 && (
نوزاد ({detail.passenger_data.infants?.count} نفر): {detail.passenger_data.infants?.names.join('، ')}
)}
) : (

اطلاعات مسافران ثبت نشده است.

)}
)} {/* ۲. سیم‌کارت */} {factor.service === 'simcard' && (
{detail?.items?.map((item, idx) => (
{item.simcard_title || `سیم‌کارت کد ${item.simcard_id}`} (تعداد: {item.quantity})
{Number(item.cost).toLocaleString()} $
))}
{detail?.total_cost && (
هزینه کل اقلام: {detail.total_cost} $
)}
)} {/* ۳. فروشگاه */} {factor.service === 'shop' && (
{detail?.items?.map((item, idx) => (
محصول {item.product_slug || `#${item.product_id}`} ({item.quantity} عدد × {item.price} $)
{Number(item.cost).toLocaleString()} $
))}
{detail?.total_cost && (
جمع اقلام سبد خرید: {detail.total_cost} $
)}
)} {/* ۴. صرافی / تسریف */} {factor.service === 'tasrif' && (
تبدیل ارز: از {detail?.from_currency} به {detail?.to_currency}
مبلغ درخواستی: {detail?.amount}
مبلغ نهایی معادل: {detail?.total_price} $
)} {/* ۵. سفر اختصاصی (Custom Trip) */} {factor.service === 'custom_trip' && (
{detail?.destinations && detail.destinations.length > 0 && (
مسیر سفر:
{detail.destinations.map((d, i) => ( {d} ))}
)} {detail?.detail && (
خلاصه برنامه سفر:

{typeof detail.detail === 'string' ? detail.detail : JSON.stringify(detail.detail)}

)}
)}
{/* تصویر فیش واریزی */} فیش واریزی و رسید بانکی {factor.transaction_receipt && onClearReceipt && ( )} {factor.transaction_receipt ? (
onOpenReceiptLightbox(factor)} className="relative cursor-pointer group overflow-hidden rounded-lg border border-border/40 size-32 shrink-0 bg-black/5" > فیش پرداختی

فیش بانکی توسط مشتری آپلود شده است.

جهت بررسی صحت اطلاعات و انطباق با واریز حساب، می‌توانید تصویر فیش را در سایز کامل باز کرده و سپس وضعیت صورت‌حساب را تایید یا رد نمایید.

) : (

هنوز تصویر فیش واریزی توسط مشتری در سامانه بارگذاری نشده است.

)}
{/* فوتر مودال و دکمه‌های عملیاتی ادمین */}
{factor.status !== 'approved' && ( )} {factor.status !== 'rejected' && ( )}
) }