From b788fe069e70c7ee510eaae70742bbf6f5c5829b Mon Sep 17 00:00:00 2001 From: adonis Date: Sat, 8 Aug 2026 14:55:34 +0330 Subject: [PATCH] Fix checkout order submit payload and cash settlement UX. Drop non-whitelisted fields that caused 400 on POST /orders, prevent double submit on checks, and only show cash success after create succeeds. Co-authored-by: Cursor --- src/stores/order.ts | 48 ++++++++++++++++++----- src/views/checkout/CashSettlementView.vue | 12 ++++-- src/views/checkout/CheckListView.vue | 19 ++++++++- 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/src/stores/order.ts b/src/stores/order.ts index fa171e2..1817853 100644 --- a/src/stores/order.ts +++ b/src/stores/order.ts @@ -115,21 +115,36 @@ export const useOrderStore = defineStore('order', () => { throw new Error('سبد خرید با سرور همگام نیست. لطفاً دوباره محصولات را به سبد اضافه کنید.') } + const companyItems = cart.items.filter((item) => item.companyId === companyId) + const itemsForOrder = companyItems.length ? companyItems : cart.items + const body = { companyId, settlementType, - settlementMethod: settlementType, checkMode: settlementType === 'check' ? (checkMode ?? 'full') : undefined, notes: cart.notes, - items: cart.items.map((item) => ({ + items: itemsForOrder.map((item) => ({ productId: item.productId, meterage: item.meterage, - requestedMeterage: item.meterage, notes: item.notes, })), checks: settlementType === 'check' && checks - ? checks.map(({ id: _id, ...rest }) => rest) + ? checks.map((c) => ({ + amount: c.amount, + dueDate: c.dueDate, + sayadId: c.sayadId, + checkNumber: c.checkNumber, + ownerNationalId: c.ownerNationalId, + ownerFirstName: c.ownerFirstName, + ownerLastName: c.ownerLastName, + bankName: c.bankName, + branchName: c.branchName, + frontImage: c.frontImage, + backImage: c.backImage, + notes: c.notes, + mode: c.mode, + })) : undefined, } @@ -154,7 +169,7 @@ export const useOrderStore = defineStore('order', () => { receipt: Omit, ) { try { - const order = await apiRequest(`/orders/${orderId}/cash-receipt`, { + await apiRequest(`/orders/${orderId}/cash-receipt`, { method: 'POST', body: { amount: receipt.amount, @@ -166,9 +181,10 @@ export const useOrderStore = defineStore('order', () => { notes: receipt.notes, }, }) - const idx = orders.value.findIndex((o) => o.id === orderId) - if (idx >= 0) orders.value[idx] = order - else orders.value.unshift(order) + const order = await fetchOrder(orderId) + if (!order) { + throw new Error('رسید ثبت شد ولی دریافت سفارش ناموفق بود.') + } return order } catch (e) { throw new Error(e instanceof ApiError ? e.message : 'ثبت رسید ناموفق بود.') @@ -180,7 +196,21 @@ export const useOrderStore = defineStore('order', () => { const order = await apiRequest(`/orders/${orderId}/checks`, { method: 'PATCH', body: { - checks: checks.map(({ id: _id, ...rest }) => rest), + checks: checks.map((c) => ({ + amount: c.amount, + dueDate: c.dueDate, + sayadId: c.sayadId, + checkNumber: c.checkNumber, + ownerNationalId: c.ownerNationalId, + ownerFirstName: c.ownerFirstName, + ownerLastName: c.ownerLastName, + bankName: c.bankName, + branchName: c.branchName, + frontImage: c.frontImage, + backImage: c.backImage, + notes: c.notes, + mode: c.mode, + })), }, }) const idx = orders.value.findIndex((o) => o.id === orderId) diff --git a/src/views/checkout/CashSettlementView.vue b/src/views/checkout/CashSettlementView.vue index 6c97faf..b9d6279 100644 --- a/src/views/checkout/CashSettlementView.vue +++ b/src/views/checkout/CashSettlementView.vue @@ -105,8 +105,8 @@ async function registerReceipt() {
-
- +
+

{{ createdOrder ? 'فاکتور شما ثبت شد.' : 'آماده ثبت فاکتور نقدی' }}

@@ -154,8 +154,8 @@ async function registerReceipt() {

{{ expiryMessage }}

-
- +
+

{{ createdOrder ? 'فاکتور شما ثبت شد.' : 'آماده ثبت فاکتور نقدی' }}

@@ -228,6 +228,10 @@ async function registerReceipt() { margin: 0; font-size: 1rem; font-weight: 700; + color: var(--color-text); +} + +.cash-page__success--done .cash-page__success-title { color: var(--color-success); } diff --git a/src/views/checkout/CheckListView.vue b/src/views/checkout/CheckListView.vue index 8868115..1c6c08e 100644 --- a/src/views/checkout/CheckListView.vue +++ b/src/views/checkout/CheckListView.vue @@ -19,6 +19,7 @@ const cartStore = useCartStore() const orderStore = useOrderStore() const authStore = useAuthStore() const formError = ref('') +const submitting = ref(false) const isCheckout = computed(() => route.name === 'check-list') @@ -90,7 +91,9 @@ function toggleMenu(id: string) { async function submitOrder() { if (!authStore.user || !cartStore.activeCart || checks.value.length === 0) return + if (submitting.value) return formError.value = '' + submitting.value = true try { const order = await orderStore.submitOrder( @@ -104,6 +107,8 @@ async function submitOrder() { router.replace(`/orders/${order.id}/success`) } catch (e) { formError.value = e instanceof Error ? e.message : 'ثبت سفارش ناموفق بود.' + } finally { + submitting.value = false } } @@ -194,7 +199,12 @@ async function submitOrder() {
@@ -269,7 +279,12 @@ async function submitOrder() { {{ toPersianDigits(String(rass.rassDays)) }} روز
- + ارسال برای بررسی