diff --git a/src/composables/useCartPage.ts b/src/composables/useCartPage.ts index 193c37f..af80055 100644 --- a/src/composables/useCartPage.ts +++ b/src/composables/useCartPage.ts @@ -40,6 +40,12 @@ export function useCartPage() { submitting.value = true submitError.value = '' try { + // همگام‌سازی سبد با سرور قبل از ثبت تا productId/companyId کهنه نباشد + await cartStore.hydrate() + if (!cartStore.activeCart?.items.length) { + submitError.value = 'سبد خرید خالی است یا با سرور همگام نشد.' + return + } const order = await orderStore.submitOrder(cartStore.activeCart) await cartStore.hydrate() router.replace(`/orders/${order.id}/success`) diff --git a/src/stores/order.ts b/src/stores/order.ts index 643a2cc..7e28c56 100644 --- a/src/stores/order.ts +++ b/src/stores/order.ts @@ -119,10 +119,6 @@ export const useOrderStore = defineStore('order', () => { * روش تسویه را انتخاب می‌کند. */ async function submitOrder(cart: Cart): Promise { - const companyId = cart.companyId || cart.items[0]?.companyId || '' - if (!companyId) { - throw new Error('شرکت سبد مشخص نیست.') - } if (!cart.items.length) { throw new Error('سبد خرید خالی است.') } @@ -130,15 +126,28 @@ 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 companyIds = [ + ...new Set(cart.items.map((item) => item.companyId).filter(Boolean)), + ] + if (!companyIds.length) { + throw new Error('شرکت سبد مشخص نیست. سبد را خالی کنید و دوباره اضافه کنید.') + } + if (companyIds.length > 1) { + throw new Error( + 'سبد شامل چند شرکت است. فعلاً فقط اقلام یک شرکت را نگه دارید و ثبت کنید.', + ) + } + + const companyId = companyIds[0]! + const itemsForOrder = cart.items.filter((item) => item.companyId === companyId) const body = { companyId, notes: cart.notes, items: itemsForOrder.map((item) => ({ productId: item.productId, - meterage: item.meterage, + meterage: Number(item.meterage), notes: item.notes, })), }