diff --git a/src/modules/orders/entities/order.entity.ts b/src/modules/orders/entities/order.entity.ts index 7328d20..53f1fc3 100644 --- a/src/modules/orders/entities/order.entity.ts +++ b/src/modules/orders/entities/order.entity.ts @@ -1,4 +1,15 @@ -import { Entity, ManyToOne, OneToMany, Property, Collection, Cascade, Enum } from '@mikro-orm/core'; +import { + Entity, + ManyToOne, + OneToMany, + Property, + Collection, + Cascade, + Enum, + BeforeCreate, + Unique, + type EventArgs, +} from '@mikro-orm/core'; import { BaseEntity } from '../../../common/entities/base.entity'; import { PaymentStatusEnum } from '../../payments/interface/payment'; import { OrderStatus } from '../interface/order-status'; @@ -10,6 +21,7 @@ import { OrderItem } from './order-item.entity'; import { Delivery } from '../../delivery/entities/delivery.entity'; @Entity({ tableName: 'orders' }) +@Unique({ properties: ['restaurant', 'orderNumber'] }) export class Order extends BaseEntity { @ManyToOne(() => User) user!: User; @@ -32,6 +44,9 @@ export class Order extends BaseEntity { @ManyToOne(() => PaymentMethod, { nullable: true }) paymentMethod?: PaymentMethod; + @Property({ type: 'int', nullable: true }) + orderNumber?: number; + @Property({ type: 'decimal', precision: 10, scale: 0, default: 0 }) couponDiscount: number = 0; @@ -61,4 +76,32 @@ export class Order extends BaseEntity { @Enum(() => PaymentStatusEnum) paymentStatus!: PaymentStatusEnum; + + @BeforeCreate() + async generateOrderNumber(args: EventArgs) { + const em = args.em; + const order = args.entity; + + // Ensure restaurant is loaded + if (!order.restaurant) { + throw new Error('Restaurant must be set before creating order'); + } + + // Get the restaurant ID (handle both entity and ID cases) + const restaurantId = typeof order.restaurant === 'string' ? order.restaurant : order.restaurant.id; + + // Query for max orderNumber for this restaurant + // Using findOne with orderBy to get the highest order number + const maxOrder = await em.findOne( + Order, + { restaurant: restaurantId }, + { + orderBy: { orderNumber: 'DESC' }, + fields: ['orderNumber'], + }, + ); + + // Set the next order number (1 if no orders exist, otherwise max + 1) + order.orderNumber = maxOrder?.orderNumber ? maxOrder.orderNumber + 1 : 1; + } }