diff --git a/src/pages/orders/Details.tsx b/src/pages/orders/Details.tsx index 4a6f793..b36e671 100644 --- a/src/pages/orders/Details.tsx +++ b/src/pages/orders/Details.tsx @@ -4,6 +4,7 @@ import { useVerifyPayment, useChangeOrderStatus, useRefundPayment, + useAddPayment, useUpdateOrderFees, useAddOrderItem, useUpdateOrderItemQuantity, @@ -23,6 +24,7 @@ import OrderActions from './components/OrderActions' import UpdateOrderFeesModal from './components/UpdateOrderFeesModal' import AddOrderItemModal from './components/AddOrderItemModal' import RefundPaymentModal from './components/RefundPaymentModal' +import AddPaymentModal from './components/AddPaymentModal' import { toast } from 'react-toastify' import { extractErrorMessage } from '@/config/func' import { printOrderReceipt } from './print/orderReceiptPrint' @@ -34,6 +36,7 @@ const OrderDetails: FC = () => { const { mutate: verifyPayment, isPending: isVerifyingPayment } = useVerifyPayment() const { mutate: changeOrderStatus, isPending: isChangingStatus } = useChangeOrderStatus() const { mutate: refundPayment, isPending: isRefunding } = useRefundPayment() + const { mutate: addPayment, isPending: isAddingPayment } = useAddPayment() const { mutate: updateOrderFees, isPending: isUpdatingFees } = useUpdateOrderFees() const { mutate: addOrderItem, isPending: isAddingItem } = useAddOrderItem() const { mutate: updateOrderItemQuantity, isPending: isUpdatingItemQuantity } = useUpdateOrderItemQuantity() @@ -41,6 +44,7 @@ const OrderDetails: FC = () => { const [showCancelModal, setShowCancelModal] = useState(false) const [refundModal, setRefundModal] = useState<{ defaultAmount: number; maxAmount: number } | null>(null) + const [showAddPaymentModal, setShowAddPaymentModal] = useState(false) const [showEditFeesModal, setShowEditFeesModal] = useState(false) const [showAddItemModal, setShowAddItemModal] = useState(false) const [itemIdToRemove, setItemIdToRemove] = useState(null) @@ -87,6 +91,7 @@ const OrderDetails: FC = () => { const isPendingPayment = order.status === OrderStatus.NEW const canEditFees = !isCanceled && !isCompleted const canEditItems = !isCanceled && !isCompleted + const canAddPayment = !isCanceled && Number(order.balance ?? 0) > 0 const isUpdatingItem = isAddingItem || isUpdatingItemQuantity || isRemovingItem const canCompleteOrder = [ OrderStatus.DELIVERED_TO_WAITER, @@ -219,6 +224,27 @@ const OrderDetails: FC = () => { ) } + const handleAddPayment = (amount: number, description: string) => { + addPayment( + { + orderId: order.id, + params: { + amount, + ...(description ? { description } : {}), + }, + }, + { + onSuccess: () => { + toast.success('پرداخت با موفقیت ثبت شد') + setShowAddPaymentModal(false) + }, + onError: (error) => { + toast.error(extractErrorMessage(error)) + }, + } + ) + } + const handlePrintOrder = () => { printOrderReceipt(order) } @@ -281,15 +307,15 @@ const OrderDetails: FC = () => { } return ( -
+

سفارش {formatFaNumber(order.orderNumber)}

-
-
+
+
{ isVerifyingPayment={isVerifyingPayment} verifyingPaymentId={verifyingPaymentId} onVerifyPayment={handleVerifyPayment} + canAddPayment={canAddPayment} + onAddPayment={() => setShowAddPaymentModal(true)} />
-
+
{ onSubmit={handleRefund} /> + setShowAddPaymentModal(false)} + defaultAmount={Number(order.balance ?? 0)} + isLoading={isAddingPayment} + onSubmit={handleAddPayment} + /> + setItemIdToRemove(null)} diff --git a/src/pages/orders/components/AddPaymentModal.tsx b/src/pages/orders/components/AddPaymentModal.tsx new file mode 100644 index 0000000..48eced6 --- /dev/null +++ b/src/pages/orders/components/AddPaymentModal.tsx @@ -0,0 +1,102 @@ +import { type FC, useEffect, useState } from 'react' +import DefaulModal from '@/components/DefaulModal' +import Button from '@/components/Button' +import Input from '@/components/Input' +import Textarea from '@/components/Textarea' +import Select from '@/components/Select' +import { PaymentMethodEnum } from '@/pages/paymentMethods/enum/Enum' + +interface AddPaymentModalProps { + isOpen: boolean + onClose: () => void + defaultAmount: number + isLoading?: boolean + onSubmit: (amount: number, description: string) => void +} + +const AddPaymentModal: FC = ({ + isOpen, + onClose, + defaultAmount, + isLoading, + onSubmit, +}) => { + const [amount, setAmount] = useState(String(defaultAmount)) + const [description, setDescription] = useState('') + const [error, setError] = useState('') + + useEffect(() => { + if (!isOpen) return + setAmount(String(Math.max(0, defaultAmount))) + setDescription('') + setError('') + }, [isOpen, defaultAmount]) + + const handleSubmit = () => { + const parsed = Number(amount) + if (!parsed || parsed <= 0) { + setError('مبلغ پرداخت باید بیشتر از صفر باشد') + return + } + onSubmit(parsed, description.trim()) + } + + return ( + +
+ { + setAmount(e.target.value) + setError('') + }} + /> + +