From ce2987d67b211c235b46e337698ea38ee605d70e Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Mon, 22 Dec 2025 22:25:20 +0330 Subject: [PATCH] remove confirm statusstatus --- .../orders/interface/order.interface.ts | 1 - .../orders/listeners/order.listeners.ts | 3 +- .../orders/providers/orders.service.ts | 79 +++++++++---------- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/src/modules/orders/interface/order.interface.ts b/src/modules/orders/interface/order.interface.ts index 3fcebe0..d9d1a6c 100644 --- a/src/modules/orders/interface/order.interface.ts +++ b/src/modules/orders/interface/order.interface.ts @@ -21,7 +21,6 @@ export interface OrderCarAddress { export enum OrderStatus { PENDING_PAYMENT = 'pendingPayment', PAID = 'paid', - CONFIRMED = 'confirmed', PREPARING = 'preparing', DELIVERED_TO_WAITER = 'deliveredToWaiter', DELIVERED_TO_RECEPTIONIST = 'deliveredToReceptionist', diff --git a/src/modules/orders/listeners/order.listeners.ts b/src/modules/orders/listeners/order.listeners.ts index af79603..9801754 100644 --- a/src/modules/orders/listeners/order.listeners.ts +++ b/src/modules/orders/listeners/order.listeners.ts @@ -28,8 +28,7 @@ export class OrderListeners { const statusMap: Record = { [OrderStatus.PENDING_PAYMENT]: 'در انتظار پرداخت', [OrderStatus.PAID]: 'پرداخت شده', - [OrderStatus.CONFIRMED]: 'تایید شده', - [OrderStatus.PREPARING]: 'در حال آماده‌سازی', + [OrderStatus.PREPARING]: 'در حال آماده‌سازی', [OrderStatus.DELIVERED_TO_RECEPTIONIST]: 'تحویل به پذیرش', [OrderStatus.DELIVERED_TO_WAITER]: 'تحویل به گارسون', [OrderStatus.SHIPPED]: 'ارسال شده', diff --git a/src/modules/orders/providers/orders.service.ts b/src/modules/orders/providers/orders.service.ts index a5bc9a6..6a043ad 100644 --- a/src/modules/orders/providers/orders.service.ts +++ b/src/modules/orders/providers/orders.service.ts @@ -40,9 +40,8 @@ export class OrdersService { private readonly logger = new Logger(OrdersService.name); private static readonly STATUS_TRANSITIONS: Record = { - [OrderStatus.PENDING_PAYMENT]: [OrderStatus.PAID, OrderStatus.CANCELED, OrderStatus.CONFIRMED], - [OrderStatus.PAID]: [OrderStatus.CONFIRMED, OrderStatus.CANCELED], - [OrderStatus.CONFIRMED]: [OrderStatus.PREPARING, OrderStatus.CANCELED], + [OrderStatus.PENDING_PAYMENT]: [OrderStatus.PAID, OrderStatus.CANCELED, OrderStatus.PREPARING], + [OrderStatus.PAID]: [OrderStatus.PREPARING, OrderStatus.CANCELED], [OrderStatus.PREPARING]: [OrderStatus.DELIVERED_TO_RECEPTIONIST, OrderStatus.DELIVERED_TO_WAITER, OrderStatus.SHIPPED, OrderStatus.CANCELED], [OrderStatus.DELIVERED_TO_WAITER]: [OrderStatus.COMPLETED, OrderStatus.CANCELED], [OrderStatus.DELIVERED_TO_RECEPTIONIST]: [OrderStatus.COMPLETED, OrderStatus.CANCELED], @@ -230,34 +229,7 @@ export class OrdersService { return order; } - // async confirmOrder(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.CONFIRMED); - // } - // async prepareOrder(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.PREPARING); - // } - - // just admin can reject the order any time - // async rejectOrder(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.CANCELED, { skipTransitionValidation: true }); - // } - - // async readyForDelivery(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.READY); - // } - - // async cancelOrderAsUser(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.CANCELED); - // } - - // async markAsDelivered(orderId: string, restId: string) { - // return this.changeOrderStatus(orderId, restId, OrderStatus.COMPLETED); - // } - - // async updateStatus(orderId: string, restId: string, status: OrderStatus, ref: StatusTransitionRef) { - // return this.changeOrderStatus(orderId, restId, status, ref); - // } async changeOrderStatus( orderId: string, @@ -268,6 +240,9 @@ export class OrdersService { ): Promise { const order = await this.getOrderOrFail(orderId, restId); + // Store previous status before changing it + const previousStatus = order.status; + this.assertStatusTransitionAllowed(order, toStatus, ref); order.status = toStatus; @@ -281,7 +256,7 @@ export class OrdersService { order.user?.id || '', String(order?.orderNumber) || '', restId, - order.status, + previousStatus, toStatus, ref, ), @@ -295,17 +270,17 @@ export class OrdersService { throw new BadRequestException(OrderMessage.PAYMENT_METHOD_MISSING); } - if (!this.canTransition(order.status, to, paymentMethod, ref)) { + if (!this.canTransition(order.status, to, paymentMethod, ref, order.deliveryMethod.method)) { throw new BadRequestException(OrderMessage.INVALID_STATUS_TRANSITION); } } - private canTransition(from: OrderStatus, to: OrderStatus, paymentMethod: PaymentMethodEnum, ref: 'user' | 'admin') { + private canTransition(from: OrderStatus, to: OrderStatus, paymentMethod: PaymentMethodEnum, ref: 'user' | 'admin', deliveryMethod: DeliveryMethodEnum) { if (!OrdersService.STATUS_TRANSITIONS[from]?.includes(to)) return false; if (to === OrderStatus.CANCELED) { // only allow orders with status of PENDING_PAYMENT and PAID are allowed to be canceled by user - if (ref === 'user' && ![OrderStatus.PENDING_PAYMENT, OrderStatus.PAID, OrderStatus.CONFIRMED].includes(from)) { + if (ref === 'user' && ![OrderStatus.PENDING_PAYMENT, OrderStatus.PAID].includes(from)) { return false; } else if (ref === 'admin') { return true; @@ -315,17 +290,40 @@ export class OrdersService { // method of cash are allowed to move to CONFIRMED directly if ( from == OrderStatus.PENDING_PAYMENT && - to == OrderStatus.CONFIRMED && + to == OrderStatus.PREPARING && paymentMethod !== PaymentMethodEnum.Cash ) { return false; } - // if (paymentMethod === PaymentMethodEnum.Cash) { - // if ([OrderStatus.PENDING_PAYMENT, OrderStatus.PAID].includes(to)) return false; - // } + + /** + * Only allow orders with status of PREPARING to be shipped if the delivery method is DeliveryCourier + */ + if ( + from == OrderStatus.PREPARING && + to == OrderStatus.SHIPPED && + deliveryMethod !== DeliveryMethodEnum.DeliveryCourier + ) { + return false; + } + if ( + from == OrderStatus.PREPARING && + to == OrderStatus.DELIVERED_TO_WAITER && + deliveryMethod !== DeliveryMethodEnum.DineIn && + deliveryMethod !== DeliveryMethodEnum.DeliveryCar + ) { + return false; + } + if ( + from == OrderStatus.PREPARING && + to == OrderStatus.DELIVERED_TO_RECEPTIONIST && + deliveryMethod !== DeliveryMethodEnum.CustomerPickup + ) { + return false; + } if (paymentMethod === PaymentMethodEnum.Online) { - if (to === OrderStatus.CONFIRMED && from !== OrderStatus.PAID) return false; + if (to === OrderStatus.PREPARING && from !== OrderStatus.PAID) return false; } return true; @@ -335,7 +333,7 @@ export class OrdersService { const order = await this.em.findOne( Order, { id: orderId, restaurant: { id: restId } }, - { populate: ['paymentMethod'] }, + { populate: ['paymentMethod', 'deliveryMethod', 'user'] }, ); if (!order) throw new NotFoundException(OrderMessage.NOT_FOUND); return order; @@ -463,7 +461,6 @@ export class OrdersService { status: { $in: [ OrderStatus.PAID, - OrderStatus.CONFIRMED, OrderStatus.PREPARING, OrderStatus.DELIVERED_TO_WAITER, OrderStatus.DELIVERED_TO_RECEPTIONIST,