diff --git a/backend/src/infrastructure/data_access/repositories/models/order-model.interface.ts b/backend/src/infrastructure/data_access/repositories/models/order-model.interface.ts index ed47258a..d8a60704 100644 --- a/backend/src/infrastructure/data_access/repositories/models/order-model.interface.ts +++ b/backend/src/infrastructure/data_access/repositories/models/order-model.interface.ts @@ -13,4 +13,5 @@ export interface IOrderDataModel { readonly orderManagerId?: Types.ObjectId; readonly cartItems?: CartItemDataModel[]; readonly orderStatusId: Types.ObjectId; + readonly summary: string; } diff --git a/backend/src/infrastructure/data_access/repositories/schemas/order.schema.ts b/backend/src/infrastructure/data_access/repositories/schemas/order.schema.ts index 81f72708..3b763bde 100644 --- a/backend/src/infrastructure/data_access/repositories/schemas/order.schema.ts +++ b/backend/src/infrastructure/data_access/repositories/schemas/order.schema.ts @@ -16,6 +16,9 @@ export class OrderDataModel extends BaseDocument implements IOrderDataModel { @Prop({ type: String, required: true }) type: dinningType; + @Prop({ type: String, required: true }) + summary: string; + @Prop({ type: mongoose.Schema.Types.ObjectId }) @Type(() => SingleClientDataModel) singleclientId: Types.ObjectId; diff --git a/backend/src/order/dto/create-order.dto.ts b/backend/src/order/dto/create-order.dto.ts index a8853053..430d525b 100644 --- a/backend/src/order/dto/create-order.dto.ts +++ b/backend/src/order/dto/create-order.dto.ts @@ -19,6 +19,10 @@ export class CreateOrderDTO { @IsNotEmpty() total: number; + @IsString() + @IsNotEmpty() + summary: string; + @IsOptional() @IsArray() cartItems: CreateCartItemsDTO[]; diff --git a/backend/src/order/order-entity.interface.ts b/backend/src/order/order-entity.interface.ts index 236e04c0..19dadb78 100644 --- a/backend/src/order/order-entity.interface.ts +++ b/backend/src/order/order-entity.interface.ts @@ -17,6 +17,7 @@ export interface IOrder { orderManagerId?: Types.ObjectId; audit: Audit; cartItems?: CartItem[]; + summary: string; } //tableNumber diff --git a/backend/src/order/order-mock-data.ts b/backend/src/order/order-mock-data.ts index 2cf75525..b1594842 100644 --- a/backend/src/order/order-mock-data.ts +++ b/backend/src/order/order-mock-data.ts @@ -18,6 +18,7 @@ export const orderMockData: IOrder = { total: 1, audit: Audit.create(auditMockData).getValue(), cartItems: [cartItemMock], + summary: '', }; export const orderMock: CreateOrderDTO = { @@ -26,4 +27,5 @@ export const orderMock: CreateOrderDTO = { singleClientId: id.toString(), total: 1, cartItems: [createItem], + summary: '', }; diff --git a/backend/src/order/order.mapper.ts b/backend/src/order/order.mapper.ts index a122d848..ec05520c 100644 --- a/backend/src/order/order.mapper.ts +++ b/backend/src/order/order.mapper.ts @@ -14,8 +14,19 @@ export class OrderMapper implements IMapper { private readonly orderStatusMapper: OrderStatusMapper, ) {} toPersistence(entity: Order): OrderDataModel { - const { id, state, type, singleclientId, total, discount, orderManagerId, audit, cartItems, orderStatusId } = - entity; + const { + id, + state, + type, + singleclientId, + total, + discount, + orderManagerId, + audit, + cartItems, + orderStatusId, + summary, + } = entity; const { auditCreatedBy, auditCreatedDateTime, @@ -34,6 +45,7 @@ export class OrderMapper implements IMapper { discount, cartItems: cartItems?.length ? cartItems.map((cartItem) => this.cartItemMapper.toPersistence(cartItem)) : [], orderManagerId, + summary, auditCreatedBy, auditCreatedDateTime, auditModifiedBy, @@ -45,7 +57,8 @@ export class OrderMapper implements IMapper { } toDomain(model: OrderDataModel): Order { - const { state, type, singleclientId, total, discount, orderManagerId, _id, cartItems, orderStatusId } = model; + const { state, type, singleclientId, total, discount, orderManagerId, _id, cartItems, orderStatusId, summary } = + model; const entity: Order = Order.create( { state: state ? this.orderStatusMapper.toDomain(state) : undefined, @@ -55,6 +68,7 @@ export class OrderMapper implements IMapper { total, discount, orderManagerId, + summary, audit: this.auditMapper.toDomain(model), cartItems: cartItems?.length ? cartItems.map((cartItem) => this.cartItemMapper.toDomain(cartItem)) : [], }, diff --git a/backend/src/order/order.service.ts b/backend/src/order/order.service.ts index ef97ec79..baeac02b 100644 --- a/backend/src/order/order.service.ts +++ b/backend/src/order/order.service.ts @@ -48,7 +48,7 @@ export class OrderService implements IOrderService { async createOrder(orderSummary: CreateOrderDTO): Promise> { await this.singleclientService.validateContext(); - const { state, type, singleClientId, total, cartItems } = orderSummary; + const { state, type, singleClientId, total, cartItems, summary } = orderSummary; const orderDuplicate = await this.orderRepository.getDuplicateOrder(type, singleClientId, cartItems); if (orderDuplicate) { throwApplicationError(HttpStatus.NOT_FOUND, 'Duplicate order detected. Please confirm.'); @@ -74,6 +74,7 @@ export class OrderService implements IOrderService { type, total, singleclientId: singleclientObjId, + summary, audit, }); const orderModel: OrderDataModel = this.orderMapper.toPersistence(order); diff --git a/backend/src/order/order.ts b/backend/src/order/order.ts index c0965014..ae21dbf5 100644 --- a/backend/src/order/order.ts +++ b/backend/src/order/order.ts @@ -16,6 +16,7 @@ export class Order extends Entity implements IOrder { _orderManagerId: Types.ObjectId; _audit: Audit; _cartItems: CartItem[] | undefined; + _summary: string; constructor( id: Types.ObjectId, @@ -30,6 +31,7 @@ export class Order extends Entity implements IOrder { audit, cartItems, orderStatusId, + summary, }: IOrder, ) { super(id); @@ -43,6 +45,7 @@ export class Order extends Entity implements IOrder { this._audit = audit; this._cartItems = cartItems; this._orderStatusId = orderStatusId; + this._summary = summary; } get state(): OrderStatus { @@ -53,6 +56,10 @@ export class Order extends Entity implements IOrder { this._state = state; } + get summary(): string { + return this._summary; + } + get type(): dinningType { return this._type; } diff --git a/frontend/src/apis/orderApi.ts b/frontend/src/apis/orderApi.ts index 73611089..65c5806a 100644 --- a/frontend/src/apis/orderApi.ts +++ b/frontend/src/apis/orderApi.ts @@ -20,6 +20,7 @@ export const OrderApi = () => { singleClientId: "63d78441a6fda119c09b1930", total: calculateOrderTotalPrice(orderSummary) + serviceCharge, cartItems: cartItemsMapper(orderSummary), + summary: JSON.stringify(orderSummary), }; } return order; diff --git a/frontend/src/contexts/shoppingCartContext.tsx b/frontend/src/contexts/shoppingCartContext.tsx index f82751e5..79bd9a41 100644 --- a/frontend/src/contexts/shoppingCartContext.tsx +++ b/frontend/src/contexts/shoppingCartContext.tsx @@ -325,11 +325,12 @@ export const ShoppingCartProvider = ({ children }: shoppingCartProviderProps) => }; const addMenuToCart = (menu: IMenuData, instructions?: string) => { + //State.totalPrice is not correct if (!state.menus.length) { state.menus = menuToMenuStateMapper(menu); state.quantity = 1; } - let { menus, quantity, orderSummary } = state; + let { menus, quantity, orderSummary, totalPrice } = state; if (instructions?.length) { menus[0].note = instructions; } diff --git a/frontend/src/dto/order.ts b/frontend/src/dto/order.ts index e01ca347..ca414875 100644 --- a/frontend/src/dto/order.ts +++ b/frontend/src/dto/order.ts @@ -6,4 +6,5 @@ export interface ICreateOrderDTO { singleClientId: string; total: number; cartItems: IcartItems[]; + summary: string; }