import { useMemo, useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { PencilIcon, CheckIcon, XMarkIcon } from '@heroicons/react/24/outline'; import { toast } from 'sonner'; import { api } from '../lib/api'; import { formatRial, formatYear, rialToToman, tomanToRial } from '../lib/utils'; import Modal from './ui/Modal'; import PriceInput from './ui/PriceInput'; import SearchableSelect from './ui/SearchableSelect'; import type { ServiceItem } from '../types'; interface TariffRow { uuid: string; year: number; price_rials: number; is_active: boolean; } interface TariffResponse { current_year: number; default_price_rials: number; data: TariffRow[]; } export default function ServiceTariffModal({ item, onClose }: { item: ServiceItem | null; onClose: () => void }) { const qc = useQueryClient(); const [year, setYear] = useState(''); const [price, setPrice] = useState(0); const [editYear, setEditYear] = useState(null); const [editPrice, setEditPrice] = useState(0); const { data, isLoading } = useQuery<{ data: TariffResponse }>({ queryKey: ['service-tariffs', item?.uuid], queryFn: () => api.get(`/api/v1/service-items/${item!.uuid}/tariffs`), enabled: !!item, }); const resp = (data as any)?.data as TariffResponse | undefined; const tariffs = useMemo(() => [...(resp?.data ?? [])].sort((a, b) => b.year - a.year), [resp]); const currentYear = resp?.current_year; // سال‌های قابل انتخاب: ۵ سال گذشته تا ۲ سال آینده، منهای سال‌های ثبت‌شده. const yearOptions = useMemo(() => { if (!currentYear) return []; const used = new Set(tariffs.map((t) => t.year)); const opts: { value: number; label: string }[] = []; for (let y = currentYear + 2; y >= currentYear - 5; y--) { if (used.has(y)) continue; opts.push({ value: y, label: y === currentYear ? `${formatYear(y)} (سال جاری)` : formatYear(y) }); } return opts; }, [currentYear, tariffs]); const addMut = useMutation({ mutationFn: () => api.put(`/api/v1/service-items/${item!.uuid}/tariffs/${Number(year)}`, { price_rials: tomanToRial(price) }), onSuccess: () => { toast.success('تعرفه ذخیره شد'); setYear(''); setPrice(0); qc.invalidateQueries({ queryKey: ['service-tariffs', item?.uuid] }); qc.invalidateQueries({ queryKey: ['service-items'] }); }, onError: (e: Error) => toast.error(e.message), }); const editMut = useMutation({ mutationFn: (vars: { year: number; price: number }) => api.put(`/api/v1/service-items/${item!.uuid}/tariffs/${vars.year}`, { price_rials: tomanToRial(vars.price) }), onSuccess: () => { toast.success('تعرفه ویرایش شد'); setEditYear(null); qc.invalidateQueries({ queryKey: ['service-tariffs', item?.uuid] }); qc.invalidateQueries({ queryKey: ['service-items'] }); }, onError: (e: Error) => toast.error(e.message), }); const startEdit = (t: TariffRow) => { setEditYear(t.year); setEditPrice(rialToToman(t.price_rials)); }; return (
{resp && (
قیمت پایه‌ی سرویس همان تعرفه‌ی سال جاری ({currentYear ? formatYear(currentYear) : '—'}) است و همه‌جا از همین استفاده می‌شود. تعرفه‌ی سال‌های دیگر فقط برای صورتحساب همان سال به‌کار می‌رود.
)} {/* افزودن تعرفه‌ی جدید */}
افزودن تعرفه‌ی سال
setYear(v != null && v !== '' ? Number(v) : '')} placeholder="انتخاب سال" noOptionsMessage="سالی باقی نمانده" height={40} />
{/* فهرست تعرفه‌ها */} {isLoading ? (
در حال بارگذاری...
) : tariffs.length === 0 ? (
هنوز تعرفه‌ای ثبت نشده است.
) : (
{tariffs.map((t) => { const isCurrent = t.year === currentYear; const isEditing = editYear === t.year; return (
سال {formatYear(t.year)} {isCurrent && جاری} {isEditing ? ( <>
) : ( <> {formatRial(t.price_rials)} )}
); })}
)}
); }