order
This commit is contained in:
@@ -17,13 +17,12 @@ export enum PermissionEnum {
|
|||||||
VIEW_All_INVOICED_ORDERS = 'view_all_invoiced_orders',
|
VIEW_All_INVOICED_ORDERS = 'view_all_invoiced_orders',
|
||||||
VIEW_MY_ASSIGNED_INVOICED_REQUESTS = 'view_my_assigned_invoiced_requests',
|
VIEW_MY_ASSIGNED_INVOICED_REQUESTS = 'view_my_assigned_invoiced_requests',
|
||||||
|
|
||||||
VIEW_All_ORDERS = 'view_all_orders',
|
VIEW_ORDERS = 'view_orders',
|
||||||
|
VIEW_MY_ORDERS = 'view_my_orders',
|
||||||
CREATE_ORDER = 'create_order',
|
CREATE_ORDER = 'create_order',
|
||||||
UPDATE_ORDER = 'update_order',
|
UPDATE_ORDER = 'update_order',
|
||||||
ASSIGN_DESIGNER = 'assign_designer',
|
ASSIGN_DESIGNER = 'assign_designer',
|
||||||
CREATE_ORDER_PRINT = 'create_order_print',
|
DELETE_ORDER = 'delete_order',
|
||||||
CHANGE_ORDER_STATUS = 'change_order_status',
|
|
||||||
REMOVE_ORDER = 'remove_order',
|
|
||||||
|
|
||||||
// User & Admin Management
|
// User & Admin Management
|
||||||
MANAGE_ADMINS = 'manage_admins',
|
MANAGE_ADMINS = 'manage_admins',
|
||||||
@@ -52,10 +51,9 @@ export const PermissionTitles: Record<PermissionEnum, string> = {
|
|||||||
|
|
||||||
[PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید',
|
[PermissionEnum.CREATE_ORDER]: 'ایجاد سفارش جدید',
|
||||||
[PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ',
|
[PermissionEnum.UPDATE_ORDER]: 'ویرایش سفارش ',
|
||||||
[PermissionEnum.VIEW_All_ORDERS]: "مشاهده همه سفارش ها",
|
[PermissionEnum.VIEW_ORDERS]: "مشاهده همه سفارش ها",
|
||||||
|
[PermissionEnum.VIEW_MY_ORDERS]: "مشاهده سفارش های من",
|
||||||
[PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش",
|
[PermissionEnum.ASSIGN_DESIGNER]: "اضافه کردن طراح به سفارش",
|
||||||
[PermissionEnum.CHANGE_ORDER_STATUS]: "تغییر وضعیت سفارش",
|
|
||||||
[PermissionEnum.REMOVE_ORDER]: "حذف سفارش",
|
|
||||||
|
|
||||||
[PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران',
|
[PermissionEnum.MANAGE_ADMINS]: 'مدیریت مدیران',
|
||||||
[PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران',
|
[PermissionEnum.MANAGE_USERS]: 'مدیریت کاربران',
|
||||||
@@ -67,11 +65,11 @@ export const PermissionTitles: Record<PermissionEnum, string> = {
|
|||||||
[PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها",
|
[PermissionEnum.VIEW_REQUESTS]: "مشاهده همه درخواست سفارش ها",
|
||||||
[PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده",
|
[PermissionEnum.VIEW_All_INVOICED_ORDERS]: "مشاهده همه سفارشات پیش فاکتور شده",
|
||||||
[PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من",
|
[PermissionEnum.VIEW_MY_ASSIGNED_INVOICED_REQUESTS]: "مشاهده همه پیش فاکتور های من",
|
||||||
[PermissionEnum.CREATE_ORDER_PRINT]: "ایجاد سفارش چاپ",
|
|
||||||
[PermissionEnum.DELETE_REQUEST]: "",
|
[PermissionEnum.DELETE_REQUEST]: "",
|
||||||
[PermissionEnum.UPDATE_REQUEST]: "",
|
[PermissionEnum.UPDATE_REQUEST]: "",
|
||||||
[PermissionEnum.VIEW_INVOICES]: "",
|
[PermissionEnum.VIEW_INVOICES]: "",
|
||||||
[PermissionEnum.CREATE_INVOICE]: "",
|
[PermissionEnum.CREATE_INVOICE]: "",
|
||||||
[PermissionEnum.UPDATE_INVOICE]: "",
|
[PermissionEnum.UPDATE_INVOICE]: "",
|
||||||
[PermissionEnum.DELETE_INVOICE]: ""
|
[PermissionEnum.DELETE_INVOICE]: "",
|
||||||
|
[PermissionEnum.DELETE_ORDER]: ""
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -4,14 +4,13 @@ import { OrderService } from '../providers/order.service';
|
|||||||
import { AuthGuard } from '../../auth/guards/auth.guard';
|
import { AuthGuard } from '../../auth/guards/auth.guard';
|
||||||
import { UserId } from '../../../common/decorators/user-id.decorator';
|
import { UserId } from '../../../common/decorators/user-id.decorator';
|
||||||
import { FindOrdersDto } from '../dto/find-orders.dto';
|
import { FindOrdersDto } from '../dto/find-orders.dto';
|
||||||
import {
|
import { CreateOrderAsAdminDto } from '../dto/create-order.dto';
|
||||||
CreateOrderAsAdminDto,
|
|
||||||
} from '../dto/create-order.dto';
|
|
||||||
import { UpdateOrderAsAdminDto } from '../dto/update-order.dto';
|
import { UpdateOrderAsAdminDto } from '../dto/update-order.dto';
|
||||||
import { AdminId } from 'src/common/decorators/admin-id.decorator';
|
import { AdminId } from 'src/common/decorators/admin-id.decorator';
|
||||||
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
|
import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard';
|
||||||
import { Permissions } from 'src/common/decorators/permissions.decorator';
|
import { Permissions } from 'src/common/decorators/permissions.decorator';
|
||||||
import { PermissionEnum } from 'src/common/enums/permission.enum';
|
import { PermissionEnum } from 'src/common/enums/permission.enum';
|
||||||
|
import { AssignDesignerDto } from '../dto/assign-designer.dto';
|
||||||
|
|
||||||
@ApiTags('orders')
|
@ApiTags('orders')
|
||||||
@ApiBearerAuth()
|
@ApiBearerAuth()
|
||||||
@@ -21,19 +20,19 @@ export class OrderController {
|
|||||||
|
|
||||||
// ================== Public ===================
|
// ================== Public ===================
|
||||||
|
|
||||||
// @Get('public/orders')
|
@Get('public/orders')
|
||||||
// @UseGuards(AuthGuard)
|
@UseGuards(AuthGuard)
|
||||||
// @ApiOperation({ summary: 'Get all orders with pagination and filters' })
|
@ApiOperation({ summary: 'Get all orders with pagination and filters' })
|
||||||
// findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) {
|
findAll(@Query() dto: FindOrdersDto, @UserId() userId: string) {
|
||||||
// return this.orderService.findOrdersAsUser(userId, dto);
|
return this.orderService.findOrdersAsUser(userId, dto);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// @Get('public/orders/:id')
|
@Get('public/orders/:id')
|
||||||
// @UseGuards(AuthGuard)
|
@UseGuards(AuthGuard)
|
||||||
// @ApiOperation({ summary: 'order detail' })
|
@ApiOperation({ summary: 'order detail' })
|
||||||
// orderDetail(@Param('id') orderId: string, @UserId() userId: string) {
|
orderDetail(@Param('id') orderId: string, @UserId() userId: string) {
|
||||||
// return this.orderService.getOrderAsUser(userId, orderId);
|
return this.orderService.getOrderAsUser(userId, orderId);
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
|
||||||
/*========================== Admin Routes =====================*/
|
/*========================== Admin Routes =====================*/
|
||||||
@@ -62,55 +61,24 @@ export class OrderController {
|
|||||||
return this.orderService.updateOrderAsAdmin(id, dto);
|
return this.orderService.updateOrderAsAdmin(id, dto);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Delete('admin/orders/:orderId')
|
@Delete('admin/orders/:orderId')
|
||||||
// @UseGuards(AdminAuthGuard)
|
@UseGuards(AdminAuthGuard)
|
||||||
// @Permissions(PermissionEnum.REMOVE_ORDER)
|
@Permissions(PermissionEnum.DELETE_ORDER)
|
||||||
// @ApiOperation({ summary: 'Hard Delete Order ' })
|
@ApiOperation({ summary: 'Soft Delete Order ' })
|
||||||
// hardDelete(@Param('orderId') orderId: string) {
|
softDeleteOrder(@Param('orderId') orderId: string) {
|
||||||
// return this.orderService.hardDeleteOrder(orderId);
|
return this.orderService.softDeleteOrder(orderId);
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // =============== Order Item ================
|
|
||||||
|
|
||||||
|
|
||||||
// @Post('admin/orders/:orderId/item/:itemId/designer')
|
|
||||||
// @UseGuards(AdminAuthGuard)
|
|
||||||
// @Permissions(PermissionEnum.ASSIGN_DESIGNER)
|
|
||||||
// @ApiOperation({ summary: 'Assign Order Designer ' })
|
|
||||||
// assignDesigner(@Param('orderId') orderId: string, @Param('itemId') itemId: string,
|
|
||||||
// @Body() body: AssignDesignerDto) {
|
|
||||||
// return this.orderService.assignDesigner(orderId, itemId, body.designerId);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// @Delete('admin/orders/:id/items/:itemId')
|
@Post('admin/orders/:orderId/designer')
|
||||||
// @UseGuards(AdminAuthGuard)
|
@UseGuards(AdminAuthGuard)
|
||||||
// @Permissions(PermissionEnum.UPDATE_ORDER)
|
@Permissions(PermissionEnum.ASSIGN_DESIGNER)
|
||||||
// @ApiOperation({ summary: 'Remove order Item ' })
|
@ApiOperation({ summary: 'Assign Order Designer ' })
|
||||||
// removeOrderItemAdAdmin(
|
assignDesigner(@Param('orderId') orderId: string, @Body() body: AssignDesignerDto) {
|
||||||
// @Param('id') orderId: string,
|
return this.orderService.assignDesigner(orderId, body.designerId);
|
||||||
// @Param('itemId') itemId: string,
|
}
|
||||||
// ) {
|
|
||||||
// return this.orderService.removeOrderItemAsAdmin(orderId, itemId);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// @Post('admin/orders/:id/item')
|
|
||||||
// @UseGuards(AdminAuthGuard)
|
|
||||||
// @Permissions(PermissionEnum.UPDATE_ORDER)
|
|
||||||
// @ApiOperation({ summary: 'add item to order ' })
|
|
||||||
// addOrderItemAsAdmin(@Param('id') orderId: string, @Body() body: CreateOrderItemDtoAsAdmin) {
|
|
||||||
// return this.orderService.addOrderItemAsAdmin(orderId, body);
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// @Patch('admin/orders/:id/item/:itemId')
|
|
||||||
// @UseGuards(AdminAuthGuard)
|
|
||||||
// @Permissions(PermissionEnum.UPDATE_ORDER)
|
|
||||||
// @ApiOperation({ summary: 'Update order item' })
|
|
||||||
// updateOrderItemAsAdmin(@Param('id') orderId: string, @Param('itemId') itemId: string,
|
|
||||||
// @Body() body: UpdateOrderItemDtoAsAdmin) {
|
|
||||||
// return this.orderService.updateOrderItemAsAdmin(orderId, itemId, body);
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import {
|
|||||||
import { Type, Transform } from 'class-transformer';
|
import { Type, Transform } from 'class-transformer';
|
||||||
import { ApiPropertyOptional } from '@nestjs/swagger';
|
import { ApiPropertyOptional } from '@nestjs/swagger';
|
||||||
import { OrderStatusEnum } from '../interface/order.interface';
|
import { OrderStatusEnum } from '../interface/order.interface';
|
||||||
import { PaymentStatusEnum } from '../../payment/interface/payment';
|
|
||||||
|
|
||||||
const sortOrderOptions = ['asc', 'desc'] as const;
|
const sortOrderOptions = ['asc', 'desc'] as const;
|
||||||
type SortOrder = (typeof sortOrderOptions)[number];
|
type SortOrder = (typeof sortOrderOptions)[number];
|
||||||
@@ -45,11 +44,6 @@ export class FindOrdersDto {
|
|||||||
@IsEnum(OrderStatusEnum, { each: true })
|
@IsEnum(OrderStatusEnum, { each: true })
|
||||||
statuses?: OrderStatusEnum[];
|
statuses?: OrderStatusEnum[];
|
||||||
|
|
||||||
// @ApiPropertyOptional({ enum: PaymentStatusEnum })
|
|
||||||
// @IsOptional()
|
|
||||||
// @IsEnum(PaymentStatusEnum)
|
|
||||||
// paymentStatus?: PaymentStatusEnum;
|
|
||||||
|
|
||||||
@ApiPropertyOptional()
|
@ApiPropertyOptional()
|
||||||
@IsOptional()
|
@IsOptional()
|
||||||
@IsString()
|
@IsString()
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import { User } from 'src/modules/user/entities/user.entity';
|
|||||||
import { OrderType } from '../entities/order-type.entity';
|
import { OrderType } from '../entities/order-type.entity';
|
||||||
import { Product } from 'src/modules/product/entities/product.entity';
|
import { Product } from 'src/modules/product/entities/product.entity';
|
||||||
import { InvoiceItem } from 'src/modules/invoice/entities/invoice-item.entity';
|
import { InvoiceItem } from 'src/modules/invoice/entities/invoice-item.entity';
|
||||||
|
import { PaginatedResult } from 'src/common/interfaces/pagination.interface';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class OrderService {
|
export class OrderService {
|
||||||
@@ -50,12 +51,12 @@ export class OrderService {
|
|||||||
let user: User | null = null
|
let user: User | null = null
|
||||||
|
|
||||||
if (dto.invoiceItemId) {
|
if (dto.invoiceItemId) {
|
||||||
invoiceItem = await this.em.findOne(InvoiceItem, { id: dto.invoiceItemId },{populate:['invoice','invoice.user']});
|
invoiceItem = await this.em.findOne(InvoiceItem, { id: dto.invoiceItemId }, { populate: ['invoice', 'invoice.user'] });
|
||||||
if (!invoiceItem) {
|
if (!invoiceItem) {
|
||||||
throw new NotFoundException(`Invoice item with ID ${dto.invoiceItemId} not found.`);
|
throw new NotFoundException(`Invoice item with ID ${dto.invoiceItemId} not found.`);
|
||||||
}
|
}
|
||||||
|
|
||||||
user=invoiceItem.invoice.user
|
user = invoiceItem.invoice.user
|
||||||
}
|
}
|
||||||
if (!invoiceItem) {
|
if (!invoiceItem) {
|
||||||
|
|
||||||
@@ -70,10 +71,10 @@ export class OrderService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!user){
|
if (!user) {
|
||||||
throw new NotFoundException(`User not found`);
|
throw new NotFoundException(`User not found`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const creator = await this.adminService.findOrFail(adminId);
|
const creator = await this.adminService.findOrFail(adminId);
|
||||||
|
|
||||||
const type = await this.em.findOne(OrderType, { id: dto.typeId });
|
const type = await this.em.findOne(OrderType, { id: dto.typeId });
|
||||||
@@ -104,6 +105,25 @@ export class OrderService {
|
|||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async findOrdersAsUser(userId: string, dto: FindOrdersDto): Promise<PaginatedResult<Order>> {
|
||||||
|
return this.orderRepository.findAllPaginated({
|
||||||
|
userId,
|
||||||
|
...dto
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
async findOrdersAsAdmin(dto: FindOrdersDto): Promise<PaginatedResult<Order>> {
|
||||||
|
return this.orderRepository.findAllPaginated(dto)
|
||||||
|
}
|
||||||
|
|
||||||
|
async getOrderAsUser(userId: string, orderId: string): Promise<Order> {
|
||||||
|
const order = await this.findOrderOrFail(orderId)
|
||||||
|
if (order.user.id !== userId) {
|
||||||
|
throw new BadRequestException("this order doesnt belongs to you")
|
||||||
|
}
|
||||||
|
return order
|
||||||
|
}
|
||||||
|
|
||||||
async findOrderOrFail(id: string): Promise<Order> {
|
async findOrderOrFail(id: string): Promise<Order> {
|
||||||
const order = await this.em.findOne(Order, { id }, { populate: ['user', 'type', 'product', 'creator'] });
|
const order = await this.em.findOne(Order, { id }, { populate: ['user', 'type', 'product', 'creator'] });
|
||||||
if (!order) {
|
if (!order) {
|
||||||
@@ -111,7 +131,7 @@ export class OrderService {
|
|||||||
}
|
}
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
// user should not be change able
|
|
||||||
async updateOrderAsAdmin(id: string, dto: UpdateOrderAsAdminDto): Promise<Order> {
|
async updateOrderAsAdmin(id: string, dto: UpdateOrderAsAdminDto): Promise<Order> {
|
||||||
const order = await this.findOrderOrFail(id);
|
const order = await this.findOrderOrFail(id);
|
||||||
|
|
||||||
@@ -150,4 +170,19 @@ export class OrderService {
|
|||||||
await this.em.flush();
|
await this.em.flush();
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async softDeleteOrder(orderId: string): Promise<void> {
|
||||||
|
const order = await this.findOrderOrFail(orderId);
|
||||||
|
order.deletedAt = new Date();
|
||||||
|
await this.em.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
async assignDesigner(orderId: string, designerId: string) {
|
||||||
|
const order = await this.findOrderOrFail(orderId)
|
||||||
|
const designer = await this.adminService.findOrFail(designerId)
|
||||||
|
|
||||||
|
order.designer = designer
|
||||||
|
await this.em.flush()
|
||||||
|
return order
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { FindOrdersDto } from '../dto/find-orders.dto';
|
|||||||
|
|
||||||
class FindOrdersOpts extends FindOrdersDto {
|
class FindOrdersOpts extends FindOrdersDto {
|
||||||
userId?: string;
|
userId?: string;
|
||||||
isInvoiced?: boolean;
|
|
||||||
designerId?: string
|
designerId?: string
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -30,7 +29,6 @@ export class OrderRepository extends EntityRepository<Order> {
|
|||||||
userId,
|
userId,
|
||||||
from,
|
from,
|
||||||
to,
|
to,
|
||||||
isInvoiced,
|
|
||||||
designerId
|
designerId
|
||||||
} = opts;
|
} = opts;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user