From b3d60bd384918b20ee50a09e5b4ffc73f72c1136 Mon Sep 17 00:00:00 2001 From: hamid zarghami Date: Tue, 4 Nov 2025 16:37:09 +0330 Subject: [PATCH] compelete return --- src/pages/orders/ReturnDetails.tsx | 128 +++++++++++++++++- src/pages/orders/Returns.tsx | 50 ++++--- .../orders/components/ReturnItemsModal.tsx | 2 + src/pages/orders/hooks/useOrderData.ts | 8 ++ src/pages/orders/service/OrderService.ts | 16 ++- src/pages/orders/types/ReturnTypes.ts | 6 + 6 files changed, 186 insertions(+), 24 deletions(-) diff --git a/src/pages/orders/ReturnDetails.tsx b/src/pages/orders/ReturnDetails.tsx index b35cc6b..6bcced8 100644 --- a/src/pages/orders/ReturnDetails.tsx +++ b/src/pages/orders/ReturnDetails.tsx @@ -1,16 +1,21 @@ import { type FC, useState } from 'react' import { useParams, useNavigate } from 'react-router-dom' -import { useGetReturnDetails, useApproveReturn, useRejectReturn } from './hooks/useOrderData' +import { useGetReturnDetails, useApproveReturn, useRejectReturn, useCompleteReturn } from './hooks/useOrderData' import PageTitle from '@/components/PageTitle' import PageLoading from '@/components/PageLoading' import { formatPrice } from '@/helpers/func' import StatusWithText from '@/components/StatusWithText' -import { Calendar, Money3, Box, Location, CloseCircle, TickCircle, Shop } from 'iconsax-react' +import { Calendar, Money3, Box, Location, CloseCircle, TickCircle, Shop, DocumentUpload } from 'iconsax-react' import Button from '@/components/Button' import { useQueryClient } from '@tanstack/react-query' import ModalConfrim from '@/components/ModalConfrim' import { toast } from 'react-toastify' import { extractErrorMessage } from '@/helpers/utils' +import DefaulModal from '@/components/DefaulModal' +import Textarea from '@/components/Textarea' +import DatePicker from '@/components/DatePicker' +import UploadBox from '@/components/UploadBox' +import { useUploadSingle } from '@/pages/uploader/hooks/useUploaderData' const ReturnDetails: FC = () => { const { id } = useParams() @@ -19,9 +24,16 @@ const ReturnDetails: FC = () => { const { data, isLoading, error } = useGetReturnDetails(id!) const approveReturn = useApproveReturn() const rejectReturn = useRejectReturn() + const completeReturn = useCompleteReturn() + const uploadSingle = useUploadSingle() const [showApproveModal, setShowApproveModal] = useState(false) const [showRejectModal, setShowRejectModal] = useState(false) + const [showCompleteModal, setShowCompleteModal] = useState(false) + const [refundDate, setRefundDate] = useState('') + const [refundComment, setRefundComment] = useState('') + const [refundReceiptFile, setRefundReceiptFile] = useState([]) + const [isUploading, setIsUploading] = useState(false) const handleApprove = async () => { try { @@ -49,6 +61,42 @@ const ReturnDetails: FC = () => { }) } + const handleCompleteReturn = async () => { + try { + setIsUploading(true) + let receiptUrl = '' + + // آپلود فایل رسید (اگر انتخاب شده باشد) + if (refundReceiptFile.length > 0) { + const uploadResponse = await uploadSingle.mutateAsync(refundReceiptFile[0]) + receiptUrl = uploadResponse?.results?.url?.url || '' + } + + // ارسال درخواست تکمیل مرجوعی + await completeReturn.mutateAsync({ + id: id!, + params: { + refundDate, + refundComment, + refundReceipt: receiptUrl + } + }) + + queryClient.invalidateQueries({ queryKey: ['return-details', id] }) + queryClient.invalidateQueries({ queryKey: ['order-returns'] }) + setShowCompleteModal(false) + setRefundDate('') + setRefundComment('') + setRefundReceiptFile([]) + toast.success('مرجوعی با موفقیت تکمیل شد') + navigate('/orders/returns') + } catch (error) { + toast.error(extractErrorMessage(error)) + } finally { + setIsUploading(false) + } + } + if (isLoading) { return } @@ -80,6 +128,8 @@ const ReturnDetails: FC = () => { switch (status) { case 'Approved': return 'success' + case 'Completed': + return 'success' case 'Rejected': return 'error' case 'Pending': @@ -93,6 +143,8 @@ const ReturnDetails: FC = () => { switch (status) { case 'Approved': return 'تایید شده' + case 'Completed': + return 'تکمیل شده' case 'Rejected': return 'رد شده' case 'Pending': @@ -144,6 +196,21 @@ const ReturnDetails: FC = () => { )} + {/* دکمه تکمیل مرجوعی */} + {data?.results?.returnOrder?.status === 'Approved' && ( +
+ +
+ )} + {/* کارت‌های اطلاعاتی */}
{/* اطلاعات فروشگاه */} @@ -324,6 +391,63 @@ const ReturnDetails: FC = () => { label="آیا از رد این مرجوعی اطمینان دارید؟" isLoading={rejectReturn.isPending} /> + + {/* مودال تکمیل مرجوعی */} + { + setShowCompleteModal(false) + setRefundDate('') + setRefundComment('') + setRefundReceiptFile([]) + }} + isHeader={true} + title_header="تکمیل مرجوعی" + > +
+ setRefundDate(date)} + defaulValue={refundDate} + /> + +