refactor: simplify order status model — remove DELIVERY_FEE_ADJUSTMENT and PAYMENT_VERIFICATION
- Add deliveryFeeLocked field to Order model - Remove DELIVERY_FEE_ADJUSTMENT and PAYMENT_VERIFICATION statuses (11→8) - 3 order paths: delivery+online (locked→unlocked→paid), pickup+online (unlocked→paid), pickup+on_pickup (direct to in_progress) - Update checkout to use PENDING_PAYMENT + deliveryFeeLocked - Update payment flow to stay in PENDING_PAYMENT until admin confirms - Update admin UI to use deliveryFeeLocked instead of status check - Update client payment UI with new deliveryFeeLocked logic
This commit is contained in:
@@ -30,6 +30,7 @@ export type AdminOrderDetailResponse = {
|
||||
paymentMethod?: 'online' | 'on_pickup'
|
||||
itemsSubtotalCents: number
|
||||
deliveryFeeCents: number
|
||||
deliveryFeeLocked: boolean
|
||||
totalCents: number
|
||||
currency: string
|
||||
addressSnapshotJson: string | null
|
||||
|
||||
@@ -24,6 +24,7 @@ export type OrderDetailResponse = {
|
||||
paymentMethod?: OrderPaymentMethod
|
||||
itemsSubtotalCents: number
|
||||
deliveryFeeCents: number
|
||||
deliveryFeeLocked: boolean
|
||||
totalCents: number
|
||||
currency: string
|
||||
addressSnapshotJson: string | null
|
||||
|
||||
@@ -7,6 +7,7 @@ import { PaymentDialog } from './PaymentDialog'
|
||||
|
||||
type Props = {
|
||||
status: string
|
||||
deliveryFeeLocked: boolean
|
||||
paymentMethod: string | null
|
||||
totalCents: number
|
||||
isPayPending: boolean
|
||||
@@ -14,7 +15,14 @@ type Props = {
|
||||
onPay: (params: { detail: string; receiptFile: File | null }) => void
|
||||
}
|
||||
|
||||
export function OrderPaymentSection({ status, paymentMethod, isPayPending, payError, onPay }: Props) {
|
||||
export function OrderPaymentSection({
|
||||
status,
|
||||
deliveryFeeLocked,
|
||||
paymentMethod,
|
||||
isPayPending,
|
||||
payError,
|
||||
onPay,
|
||||
}: Props) {
|
||||
const payOnPickup = (paymentMethod ?? 'online') === 'on_pickup'
|
||||
const [payModalOpen, setPayModalOpen] = useState(false)
|
||||
|
||||
@@ -36,29 +44,23 @@ export function OrderPaymentSection({ status, paymentMethod, isPayPending, payEr
|
||||
<Typography variant="h6" gutterBottom>
|
||||
Оплата
|
||||
</Typography>
|
||||
{status === 'DELIVERY_FEE_ADJUSTMENT' && (
|
||||
{status === 'PENDING_PAYMENT' && deliveryFeeLocked === false && (
|
||||
<Typography color="text.secondary" variant="body2" sx={{ mb: 1 }}>
|
||||
Точную стоимость доставки уточняет администратор. Оплата станет доступна после перехода заказа в статус «
|
||||
{orderStatusLabelRu('PENDING_PAYMENT')}».
|
||||
Точную стоимость доставки уточняет администратор. Оплата станет доступна после утверждения стоимости.
|
||||
</Typography>
|
||||
)}
|
||||
{status === 'PENDING_PAYMENT' && (
|
||||
{status === 'PENDING_PAYMENT' && deliveryFeeLocked === true && (
|
||||
<>
|
||||
<Typography color="text.secondary" variant="body2" sx={{ mb: 1 }}>
|
||||
После перевода подтвердите оплату — откроется форма для комментария и фото чека. Заказ получит статус «
|
||||
{orderStatusLabelRu('PAYMENT_VERIFICATION')}».
|
||||
{orderStatusLabelRu('PAID')}».
|
||||
</Typography>
|
||||
<Button variant="contained" onClick={() => setPayModalOpen(true)}>
|
||||
Оплатить
|
||||
</Button>
|
||||
</>
|
||||
)}
|
||||
{status === 'PAYMENT_VERIFICATION' && (
|
||||
<Typography color="info.main" variant="body2">
|
||||
Оплата отправлена на проверку. Мы проверим поступление и обновим статус.
|
||||
</Typography>
|
||||
)}
|
||||
{!['DELIVERY_FEE_ADJUSTMENT', 'PENDING_PAYMENT', 'PAYMENT_VERIFICATION'].includes(status) && (
|
||||
{status !== 'PENDING_PAYMENT' && (
|
||||
<Typography color="text.secondary" variant="body2">
|
||||
На этом этапе действий по оплате в этом блоке не требуется.
|
||||
</Typography>
|
||||
|
||||
@@ -318,14 +318,14 @@ export function AdminOrdersPage() {
|
||||
</Box>
|
||||
)}
|
||||
|
||||
{detail.status === 'DELIVERY_FEE_ADJUSTMENT' && (
|
||||
{detail.status === 'PENDING_PAYMENT' && detail.deliveryFeeLocked === false && (
|
||||
<Alert severity="info">
|
||||
Укажите итоговую стоимость доставки (₽). После сохранения заказ получит статус «
|
||||
{orderStatusLabelRu('PENDING_PAYMENT')}», и клиент сможет оплатить с учётом этой суммы.
|
||||
Укажите итоговую стоимость доставки (₽). После сохранения клиент сможет оплатить заказ с учётом этой
|
||||
суммы.
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
{detail.status === 'DELIVERY_FEE_ADJUSTMENT' && (
|
||||
{detail.status === 'PENDING_PAYMENT' && detail.deliveryFeeLocked === false && (
|
||||
<DeliveryFeeAdjustmentForm
|
||||
key={detail.id}
|
||||
orderId={detail.id}
|
||||
|
||||
@@ -207,6 +207,7 @@ export function OrderDetailPage() {
|
||||
|
||||
<OrderPaymentSection
|
||||
status={order.status}
|
||||
deliveryFeeLocked={order.deliveryFeeLocked}
|
||||
paymentMethod={order.paymentMethod ?? null}
|
||||
totalCents={order.totalCents}
|
||||
isPayPending={payMut.isPending}
|
||||
|
||||
@@ -8,11 +8,7 @@ export function getAdminNextOrderStatuses(status: string, deliveryType: 'deliver
|
||||
switch (status) {
|
||||
case 'DRAFT':
|
||||
return ['PENDING_PAYMENT', 'CANCELLED']
|
||||
case 'DELIVERY_FEE_ADJUSTMENT':
|
||||
return ['CANCELLED']
|
||||
case 'PENDING_PAYMENT':
|
||||
return ['CANCELLED']
|
||||
case 'PAYMENT_VERIFICATION':
|
||||
return ['PAID', 'CANCELLED']
|
||||
case 'PAID':
|
||||
return ['IN_PROGRESS', 'CANCELLED']
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
export function orderStatusLabelRu(code: string): string {
|
||||
const map: Record<string, string> = {
|
||||
DRAFT: 'Черновик',
|
||||
DELIVERY_FEE_ADJUSTMENT: 'Корректировка стоимости доставки',
|
||||
PENDING_PAYMENT: 'Ожидает оплаты',
|
||||
PAYMENT_VERIFICATION: 'Проверка оплаты',
|
||||
PAID: 'Оплачен',
|
||||
IN_PROGRESS: 'В работе',
|
||||
SHIPPED: 'Отправлен',
|
||||
|
||||
Reference in New Issue
Block a user