remove confirm statusstatus
This commit is contained in:
@@ -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]: 'ارسال شده',
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user