From ffd08859dd7b3185cf8d6b8196f3c595d0d7c052 Mon Sep 17 00:00:00 2001 From: safavimohadeseh78 Date: Sun, 15 Nov 2026 11:25:05 +0330 Subject: [PATCH] feat: show preorder payment method during pricing Admins need the customer's cash or check term before they set the price. Co-authored-by: Cursor --- src/types/index.ts | 1 + src/utils/settlement.ts | 13 ++++++++++++- src/views/orders/OrderPricingView.vue | 14 ++++++++++++++ src/views/orders/components/DesktopOrdersPage.vue | 5 ++++- src/views/orders/components/OrderDetailContent.vue | 5 ++++- 5 files changed, 35 insertions(+), 3 deletions(-) diff --git a/src/types/index.ts b/src/types/index.ts index 82be9e1..4854525 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -107,6 +107,7 @@ export interface Order { companyName: string companyId: string settlementMethod: SettlementMethod | null + checkTermMonths?: number | null totalAmount: number | null meterage: number status: OrderStatus diff --git a/src/utils/settlement.ts b/src/utils/settlement.ts index 6eab81b..c30d220 100644 --- a/src/utils/settlement.ts +++ b/src/utils/settlement.ts @@ -11,10 +11,21 @@ const CASH_PHASE_RAW_STATUSES = new Set([ export function settlementMethodLabel(method?: string | null): string { if (!method) return 'انتخاب‌نشده' if (method === 'check') return 'چکی' - if (method === 'cash_check') return 'نقدی-چکی' + if (method === 'cash_check') return 'نصف نقد، نصف چکی' return 'نقدی' } +export function settlementPlanLabel( + method?: string | null, + checkTermMonths?: number | null, +): string { + const base = settlementMethodLabel(method) + if ((method === 'check' || method === 'cash_check') && checkTermMonths) { + return `${base} · چک ${checkTermMonths} ماهه` + } + return base +} + export function orderShowsCashActions( order: { settlementMethod?: SettlementMethod | null; rawStatus?: string }, ): boolean { diff --git a/src/views/orders/OrderPricingView.vue b/src/views/orders/OrderPricingView.vue index 6d6f733..ec33ba6 100644 --- a/src/views/orders/OrderPricingView.vue +++ b/src/views/orders/OrderPricingView.vue @@ -13,6 +13,7 @@ import { confirm } from '@/composables/useConfirm' import { useToast } from '@/composables/useToast' import AdminCurrencyInput from '@/components/ui/AdminCurrencyInput.vue' import { PRE_INVOICE_RAW_STATUSES } from '@/utils/orderStatus' +import { settlementPlanLabel } from '@/utils/settlement' import type { OrderItem, Product, RawOrderStatus } from '@/types' const route = useRoute() @@ -184,6 +185,10 @@ async function savePricing() { toast.error('سفارش باید حداقل یک قلم داشته باشد.') return } + if (!order.value.settlementMethod && !order.value.settlementType) { + toast.error('مشتری هنوز روش پرداخت را مشخص نکرده است.') + return + } saving.value = true try { @@ -285,6 +290,15 @@ async function sendInvoice() { {{ displayOrder.orderNumber }}

{{ displayOrder.customerName }}

+

+ روش پرداخت: + {{ + settlementPlanLabel( + displayOrder.settlementMethod ?? displayOrder.settlementType, + displayOrder.checkTermMonths, + ) + }} +

diff --git a/src/views/orders/components/DesktopOrdersPage.vue b/src/views/orders/components/DesktopOrdersPage.vue index 8dc8368..6104a42 100644 --- a/src/views/orders/components/DesktopOrdersPage.vue +++ b/src/views/orders/components/DesktopOrdersPage.vue @@ -211,7 +211,10 @@ function runMenuAction(action: 'detail' | 'pricing' | 'checks' | 'cash' | 'final > {{ order.orderNumber }} {{ order.customerName }} - {{ settlementLabel(order.settlementMethod) }} + + {{ settlementLabel(order.settlementMethod) }} + + {{ order.totalAmount ? formatCurrency(order.totalAmount) : '—' }} {{ formatMeterage(order.meterage) }} diff --git a/src/views/orders/components/OrderDetailContent.vue b/src/views/orders/components/OrderDetailContent.vue index 3914cce..3385442 100644 --- a/src/views/orders/components/OrderDetailContent.vue +++ b/src/views/orders/components/OrderDetailContent.vue @@ -209,7 +209,10 @@ function onCashReceiptAction() {
روش تسویه - {{ settlementLabel(order.settlementMethod) }} + + {{ settlementLabel(order.settlementMethod) }} + +
متراژ کل