table number

This commit is contained in:
2025-12-07 12:13:09 +03:30
parent 71a9cc5ef8
commit 6659a085f9
6 changed files with 68 additions and 0 deletions
@@ -7,6 +7,7 @@ import { SetAddressDto } from '../dto/set-address.dto';
import { SetPaymentMethodDto } from '../dto/set-payment-method.dto';
import { SetDeliveryMethodDto } from '../dto/set-delivery-method.dto';
import { SetDescriptionDto } from '../dto/set-description.dto';
import { SetTableNumberDto } from '../dto/set-table-number.dto';
import { ApiTags, ApiOperation, ApiResponse, ApiBearerAuth, ApiBody, ApiParam } from '@nestjs/swagger';
import { AuthGuard } from '../../auth/guards/auth.guard';
import { UserId } from 'src/common/decorators/user-id.decorator';
@@ -132,4 +133,15 @@ export class CartController {
) {
return this.cartService.setDescription(userId, restaurantId, setDescriptionDto);
}
@Patch('table-number')
@ApiOperation({ summary: 'Set table number for cart (required when delivery method is DineIn)' })
@ApiBody({ type: SetTableNumberDto })
setTableNumber(
@UserId() userId: string,
@RestId() restaurantId: string,
@Body() setTableNumberDto: SetTableNumberDto,
) {
return this.cartService.setTableNumber(userId, restaurantId, setTableNumberDto);
}
}
@@ -0,0 +1,10 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { IsNotEmpty, IsString, ValidateIf } from 'class-validator';
export class SetTableNumberDto {
@ApiPropertyOptional({ description: 'Table number', example: '5' })
@ValidateIf((o, value) => value !== null && value !== undefined)
@IsString()
tableNumber?: string;
}
@@ -20,6 +20,7 @@ export interface Cart {
paymentMethodId?: string;
deliveryMethodId?: string;
description?: string;
tableNumber?: string;
deliveryFee: number;
subTotal: number;
@@ -11,10 +11,12 @@ import { SetAddressDto } from '../dto/set-address.dto';
import { SetPaymentMethodDto } from '../dto/set-payment-method.dto';
import { SetDeliveryMethodDto } from '../dto/set-delivery-method.dto';
import { SetDescriptionDto } from '../dto/set-description.dto';
import { SetTableNumberDto } from '../dto/set-table-number.dto';
import { UserAddress } from '../../users/entities/user-address.entity';
import { User } from '../../users/entities/user.entity';
import { PaymentMethod } from '../../payments/entities/payment-method.entity';
import { Delivery } from '../../delivery/entities/delivery.entity';
import { DeliveryMethodEnum } from '../../delivery/interface/delivery';
import { Cart, CartItem } from '../interfaces/cart.interface';
import { CouponService } from 'src/modules/coupons/providers/coupon.service';
import { OrderCouponDetail } from 'src/modules/orders/interface/order-status';
@@ -608,6 +610,38 @@ export class CartService {
return cart;
}
/**
* Set table number for cart
*/
async setTableNumber(
userId: string,
restaurantId: string,
setTableNumberDto: SetTableNumberDto,
): Promise<Cart> {
const cart = await this.findOneOrFail(userId, restaurantId);
// If delivery method is set, validate that table number is required for DineIn
if (cart.deliveryMethodId) {
const deliveryMethod = await this.em.findOne(Delivery, {
id: cart.deliveryMethodId,
restaurant: { id: restaurantId },
});
if (deliveryMethod && deliveryMethod.method === DeliveryMethodEnum.DineIn) {
if (!setTableNumberDto.tableNumber || setTableNumberDto.tableNumber.trim() === '') {
throw new BadRequestException('Table number is required when delivery method is DineIn');
}
}
}
cart.tableNumber = setTableNumberDto.tableNumber;
cart.updatedAt = new Date().toISOString();
await this.saveCart(cart);
return cart;
}
/**
* Recalculate cart totals (including coupon discount and tax)
*/
@@ -77,6 +77,9 @@ export class Order extends BaseEntity {
@Property({ type: 'text', nullable: true })
description?: string;
@Property({ nullable: true })
tableNumber?: string;
@Enum(() => OrderStatus)
status!: OrderStatus;
+8
View File
@@ -68,6 +68,7 @@ export class OrdersService {
total: cart.total || 0,
totalItems: cart.totalItems || 0,
description: cart.description,
tableNumber: cart.tableNumber,
status: OrderStatus.Pending,
paymentStatus: PaymentStatusEnum.Pending,
});
@@ -163,6 +164,13 @@ export class OrdersService {
);
}
// Validate table number is required for DineIn
if (delivery.method === DeliveryMethodEnum.DineIn) {
if (!cart.tableNumber || cart.tableNumber.trim() === '') {
throw new BadRequestException('Table number is required when delivery method is DineIn');
}
}
if (delivery.method === DeliveryMethodEnum.DeliveryCourier && !cart.addressId) {
throw new BadRequestException('Address is required. Please set a delivery address before creating an order.');
}