From 9aa3c4f7c1177422c34875dca51e91a4c2339825 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Wed, 8 Jul 2026 19:27:27 +0330 Subject: [PATCH] change order status --- src/common/enums/permission.enum.ts | 10 +++ src/modules/order/providers/order.service.ts | 79 +++++++++++++++++--- 2 files changed, 77 insertions(+), 12 deletions(-) diff --git a/src/common/enums/permission.enum.ts b/src/common/enums/permission.enum.ts index 306055b..8e7d2d6 100644 --- a/src/common/enums/permission.enum.ts +++ b/src/common/enums/permission.enum.ts @@ -17,6 +17,11 @@ export enum PermissionEnum { VIEW_ORDERS = 'view_orders', VIEW_ASSIGNED_ORDERS = 'view_assigned_orders', + CHANGE_ORDER_STATUS_FROM_ANY_TO_ANY = 'change_order_status_from_any_to_any', + CHANGE_ORDER_STATUS_TO_CANCELLED = 'change_order_status_to_cancelled', + CHANGE_ORDER_STATUS_IN_PROGRESS = 'change_order_status_in_progress', + CHANGE_ORDER_STATUS_FROM_IN_PROGRESS_TO_FINISHED = 'change_order_status_from_in_progress_to_finished', + CHANGE_ORDER_STATUS_FROM_FINISHED_TO_INVOICED = 'change_order_status_from_finished_to_invoiced', CREATE_ORDER = 'create_order', UPDATE_ORDER = 'update_order', ASSIGN_DESIGNER = 'assign_designer', @@ -62,6 +67,11 @@ export const PermissionTitles: Record = { [PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ', [PermissionEnum.VIEW_ORDERS]: "مشاهده همه سفارش ها", [PermissionEnum.VIEW_ASSIGNED_ORDERS]: "مشاهده سفارش های من", + [PermissionEnum.CHANGE_ORDER_STATUS_FROM_ANY_TO_ANY]: "تغییر وضعیت سفارش از هر وضعیت به هر وضعیت", + [PermissionEnum.CHANGE_ORDER_STATUS_TO_CANCELLED]: "تغییر وضعیت سفارش به لغو شده", + [PermissionEnum.CHANGE_ORDER_STATUS_IN_PROGRESS]: "تغییر وضعیت سفارش در حال انجام", + [PermissionEnum.CHANGE_ORDER_STATUS_FROM_IN_PROGRESS_TO_FINISHED]: "تغییر وضعیت سفارش از در حال انجام به پایان یافته", + [PermissionEnum.CHANGE_ORDER_STATUS_FROM_FINISHED_TO_INVOICED]: "تغییر وضعیت سفارش از پایان یافته به فاکتور شده", [PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش", [PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران', diff --git a/src/modules/order/providers/order.service.ts b/src/modules/order/providers/order.service.ts index 655556f..600b5ec 100644 --- a/src/modules/order/providers/order.service.ts +++ b/src/modules/order/providers/order.service.ts @@ -223,25 +223,80 @@ export class OrderService { async updateStatus(orderId: string, adminId: string, dto: UpdateStatusDto): Promise { + const statusPermissions = [ + PermissionEnum.CHANGE_ORDER_STATUS_FROM_ANY_TO_ANY, + PermissionEnum.CHANGE_ORDER_STATUS_TO_CANCELLED, + PermissionEnum.CHANGE_ORDER_STATUS_IN_PROGRESS, + PermissionEnum.CHANGE_ORDER_STATUS_FROM_IN_PROGRESS_TO_FINISHED, + PermissionEnum.CHANGE_ORDER_STATUS_FROM_FINISHED_TO_INVOICED, + ]; + const permissions = await this.adminService.ownedPermissions(adminId, - [PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS]) + [PermissionEnum.VIEW_ORDERS, PermissionEnum.VIEW_ASSIGNED_ORDERS, ...statusPermissions]); - if (permissions.includes(PermissionEnum.VIEW_ORDERS)) { - const order = await this.findOrderOrFail(orderId); - order.status = dto.status; - await this.em.flush(); - return order + const canViewAnyOrder = permissions.includes(PermissionEnum.VIEW_ORDERS); + const canViewAssignedOrder = permissions.includes(PermissionEnum.VIEW_ASSIGNED_ORDERS); + + if (!canViewAnyOrder && !canViewAssignedOrder) { + throw new ForbiddenException("You don't have permission to update order status"); } - if (permissions.includes(PermissionEnum.VIEW_ASSIGNED_ORDERS)) { - //TODO - const order = await this.findOrderOrFailAssignedOrder(orderId, adminId); - order.status = dto.status; + const order = canViewAnyOrder + ? await this.findOrderOrFail(orderId) + : await this.findOrderOrFailAssignedOrder(orderId, adminId); + + const fromStatus = order.status; + const toStatus = dto.status; + + if (permissions.includes(PermissionEnum.CHANGE_ORDER_STATUS_FROM_ANY_TO_ANY)) { + order.status = toStatus; await this.em.flush(); - return order + return order; } - throw new ForbiddenException("You don't have permission to update order status") + const inProgressStatuses = [ + OrderStatusEnum.DESIGN_INITIATED, + OrderStatusEnum.DESIGN_FINISHED, + OrderStatusEnum.DESIGN_REVISION, + OrderStatusEnum.READY_TO_PRINTING, + OrderStatusEnum.IN_PRINTING, + OrderStatusEnum.READY_FOR_DELIVERY, + OrderStatusEnum.DELIVERED, + OrderStatusEnum.AFTER_PRINT_COVER, + OrderStatusEnum.AFTER_PRINT_BOXING, + OrderStatusEnum.AFTER_PRINT_CARTONING, + ]; + + const canChangeToCancelled = + toStatus === OrderStatusEnum.CANCELED && + permissions.includes(PermissionEnum.CHANGE_ORDER_STATUS_TO_CANCELLED); + + const canChangeInProgress = + inProgressStatuses.includes(toStatus) && + permissions.includes(PermissionEnum.CHANGE_ORDER_STATUS_IN_PROGRESS); + + const canChangeFromInProgressToFinished = + inProgressStatuses.includes(fromStatus) && + toStatus === OrderStatusEnum.FINISHED && + permissions.includes(PermissionEnum.CHANGE_ORDER_STATUS_FROM_IN_PROGRESS_TO_FINISHED); + + const canChangeFromFinishedToInvoiced = + fromStatus === OrderStatusEnum.FINISHED && + toStatus === OrderStatusEnum.INVOICED && + permissions.includes(PermissionEnum.CHANGE_ORDER_STATUS_FROM_FINISHED_TO_INVOICED); + + if ( + !canChangeToCancelled && + !canChangeInProgress && + !canChangeFromInProgressToFinished && + !canChangeFromFinishedToInvoiced + ) { + throw new ForbiddenException("You don't have permission to change to this order status"); + } + + order.status = toStatus; + await this.em.flush(); + return order; } async assignDesigner(orderId: string, designerId: string) {