remove confirm statusstatus

This commit is contained in:
2025-12-22 22:25:20 +03:30
parent d358561734
commit ce2987d67b
3 changed files with 39 additions and 44 deletions
@@ -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',
@@ -28,8 +28,7 @@ export class OrderListeners {
const statusMap: Record<OrderStatus, string> = {
[OrderStatus.PENDING_PAYMENT]: 'در انتظار پرداخت',
[OrderStatus.PAID]: 'پرداخت شده',
[OrderStatus.CONFIRMED]: 'تایید شده',
[OrderStatus.PREPARING]: 'در حال آماده‌سازی',
[OrderStatus.PREPARING]: 'در حال آماده‌سازی',
[OrderStatus.DELIVERED_TO_RECEPTIONIST]: 'تحویل به پذیرش',
[OrderStatus.DELIVERED_TO_WAITER]: 'تحویل به گارسون',
[OrderStatus.SHIPPED]: 'ارسال شده',
+38 -41
View File
@@ -40,9 +40,8 @@ export class OrdersService {
private readonly logger = new Logger(OrdersService.name);
private static readonly STATUS_TRANSITIONS: Record<OrderStatus, readonly OrderStatus[]> = {
[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<Order> {
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,