Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions apps/order/src/app/order/dto/admin-order-counts.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ApiProperty } from "@nestjs/swagger";
import { IsInt } from "class-validator";

export class AdminOrderCountsDto {
@ApiProperty({ description: "Total number of orders" })
@IsInt()
total!: number;

@ApiProperty({ description: "Number of pending orders" })
@IsInt()
pending!: number;

@ApiProperty({
description: "Number of orders in production (Confirmed + Shipped)",
})
@IsInt()
inProduction!: number;

@ApiProperty({ description: "Number of completed (delivered) orders" })
@IsInt()
completed!: number;
}
94 changes: 94 additions & 0 deletions apps/order/src/app/order/dto/admin-order-detail.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { OrderStatus, PaymentStatus } from "@projectx/models";

class OrderItemDetailDto {
@ApiProperty()
id!: number;

@ApiProperty()
productId!: number;

@ApiProperty()
productName!: string;

@ApiProperty()
quantity!: number;

@ApiProperty()
price!: number;

@ApiProperty()
total!: number;
}

class CustomerInfoDto {
@ApiProperty()
email!: string;

@ApiPropertyOptional()
firstName?: string;

@ApiPropertyOptional()
lastName?: string;
}

class PaymentInfoDto {
@ApiProperty({ enum: PaymentStatus })
status!: PaymentStatus;

@ApiProperty()
amount!: number;

@ApiProperty()
provider!: string;

@ApiPropertyOptional()
transactionId?: string;

@ApiPropertyOptional()
paymentMethod?: string;

@ApiPropertyOptional()
billingAddress?: string;
}

export class AdminOrderDetailDto {
@ApiProperty()
id!: number;

@ApiProperty()
referenceId!: string;

@ApiProperty({ enum: OrderStatus })
status!: OrderStatus;

@ApiProperty()
totalPrice!: number;

@ApiProperty()
subtotal!: number;

@ApiProperty()
shippingCost!: number;

@ApiProperty()
taxAmount!: number;

@ApiProperty()
createdAt!: Date;

@ApiProperty()
updatedAt!: Date;

@ApiPropertyOptional()
shippingAddress?: string;

@ApiProperty({ type: [OrderItemDetailDto] })
items!: OrderItemDetailDto[];

@ApiProperty({ type: CustomerInfoDto })
customer!: CustomerInfoDto;

@ApiPropertyOptional({ type: PaymentInfoDto })
payment?: PaymentInfoDto;
}
107 changes: 107 additions & 0 deletions apps/order/src/app/order/dto/admin-order-list.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
import { ApiProperty, ApiPropertyOptional } from "@nestjs/swagger";
import { Transform } from "class-transformer";
import { IsInt, IsNumber, IsOptional, IsString, Min } from "class-validator";

export class AdminOrderListItemDto {
@ApiProperty({ description: "Order ID" })
@IsInt()
id!: number;

@ApiProperty({ description: "Order reference ID" })
@IsString()
referenceId!: string;

@ApiProperty({ description: "Customer name" })
@IsString()
customerName!: string;

@ApiProperty({ description: "Customer email" })
@IsString()
customerEmail!: string;

@ApiProperty({ description: "Order type (e.g., Standard, Express)" })
@IsString()
type!: string;

@ApiProperty({
description: "Order status",
enum: [
"Pending",
"Confirmed",
"Shipped",
"Delivered",
"Cancelled",
"Failed",
],
})
@IsString()
status!: string;

@ApiProperty({ description: "Total order amount" })
@IsNumber()
amount!: number;

@ApiProperty({ description: "Order creation date" })
date!: Date;
}

export class AdminOrderListResponseDto {
@ApiProperty({ description: "List of orders", type: [AdminOrderListItemDto] })
orders!: AdminOrderListItemDto[];

@ApiProperty({ description: "Total number of orders" })
@IsInt()
total!: number;

@ApiProperty({ description: "Current page number" })
@IsInt()
page!: number;

@ApiProperty({ description: "Number of items per page" })
@IsInt()
limit!: number;
}

export class AdminOrderListQueryDto {
@ApiPropertyOptional({
description: "Filter by order status",
enum: [
"all",
"Pending",
"Confirmed",
"Shipped",
"Delivered",
"Cancelled",
"Failed",
],
default: "all",
})
@IsOptional()
@IsString()
status?: string;

@ApiPropertyOptional({
description: "Search by customer name, email, or order reference",
})
@IsOptional()
@IsString()
search?: string;

@ApiPropertyOptional({ description: "Page number", default: 1, minimum: 1 })
@IsOptional()
@Transform(({ value }) => (value ? Number.parseInt(value, 10) : undefined))
@IsInt()
@Min(1)
page?: number;

@ApiPropertyOptional({
description: "Number of items per page",
default: 10,
minimum: 1,
})
@IsOptional()
@Transform(({ value }) => (value ? Number.parseInt(value, 10) : undefined))
@IsInt()
@Min(1)
limit?: number;
}
42 changes: 42 additions & 0 deletions apps/order/src/app/order/dto/admin-stats.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
import { ApiProperty } from "@nestjs/swagger";
import { IsNumber, IsOptional } from "class-validator";

export class AdminStatsDto {
@ApiProperty({ description: "Total revenue from all orders" })
@IsNumber()
totalRevenue!: number;

@ApiProperty({ description: "Average order value" })
@IsNumber()
averageOrderValue!: number;

@ApiProperty({ description: "Number of pending orders" })
@IsNumber()
pendingOrders!: number;

@ApiProperty({ description: "Percentage of pending orders" })
@IsNumber()
pendingPercentage!: number;

@ApiProperty({ description: "Number of completed orders" })
@IsNumber()
completedOrders!: number;

@ApiProperty({ description: "Total number of unique customers" })
@IsNumber()
totalCustomers!: number;

@ApiProperty({
description: "Conversion rate (completed orders / total orders)",
})
@IsNumber()
conversionRate!: number;

@ApiProperty({
description: "Average delivery time in hours",
required: false,
})
@IsNumber()
@IsOptional()
avgDeliveryTime?: number;
}
5 changes: 5 additions & 0 deletions apps/order/src/app/order/dto/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export * from "./admin-order-counts.dto";
export * from "./admin-order-detail.dto";
export * from "./admin-order-list.dto";
export * from "./admin-stats.dto";
export * from "./update-order-status.dto";
15 changes: 15 additions & 0 deletions apps/order/src/app/order/dto/update-order-status.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { ApiProperty } from "@nestjs/swagger";
import { OrderStatus } from "@projectx/models";
import { IsEnum } from "class-validator";

export class UpdateOrderStatusDto {
@ApiProperty({
enum: OrderStatus,
description: "New order status",
example: OrderStatus.Confirmed,
})
@IsEnum(OrderStatus, {
message: `Status must be one of: ${Object.values(OrderStatus).join(", ")}`,
})
status!: OrderStatus;
}
Loading