# Booking Service

> Đặt lịch hẹn và quản lý "tồn kho thời gian" cho doanh nghiệp dịch vụ.

## Tổng Quan

Booking Service quản lý cuộc hẹn cho các doanh nghiệp dịch vụ như spa, salon và phòng khám. Theo dõi lịch nhân viên, lịch tài nguyên, và quản lý slot thời gian.

### Tính Năng Chính

- **Lịch Nhân viên** - Giờ làm việc theo nhân viên
- **Quản lý Tài nguyên** - Phòng, giường, thiết bị
- **Đặt Lịch hẹn** - Tìm và đặt slot thời gian
- **Thuật toán Khả dụng** - Giao của lịch nhân viên + tài nguyên

## Bối Cảnh Kiến Trúc

```mermaid
graph LR
    ORDER["📝 Order Service"] --> BOOKING["📅 Booking Service"]
    POS["POS"] --> BOOKING
    BOOKING --> MERCHANT["🏪 Merchant Service"]
    
    style BOOKING fill:#9b59b6,stroke:#7d3c98,color:#fff
```

## Bắt Đầu Nhanh

```bash
cd services/booking-service-net
cp .env.example .env
dotnet run --project src/BookingService.API
```

## API Endpoints

### Lịch Nhân Viên

| Method | Endpoint | Mô tả |
|--------|----------|-------|
| `GET` | `/api/v1/staff/{id}/schedule` | Lấy lịch nhân viên |
| `PUT` | `/api/v1/staff/{id}/schedule` | Cập nhật lịch |
| `GET` | `/api/v1/staff/{id}/availability` | Lấy slot khả dụng |

### Tài Nguyên

| Method | Endpoint | Mô tả |
|--------|----------|-------|
| `GET` | `/api/v1/resources` | Danh sách tài nguyên theo shop |
| `POST` | `/api/v1/resources` | Tạo tài nguyên |
| `PUT` | `/api/v1/resources/{id}` | Cập nhật tài nguyên |
| `GET` | `/api/v1/resources/{id}/availability` | Lấy slot khả dụng |

### Cuộc Hẹn

| Method | Endpoint | Mô tả |
|--------|----------|-------|
| `GET` | `/api/v1/appointments` | Danh sách cuộc hẹn |
| `POST` | `/api/v1/appointments` | Tạo cuộc hẹn |
| `GET` | `/api/v1/appointments/{id}` | Chi tiết cuộc hẹn |
| `PATCH` | `/api/v1/appointments/{id}/status` | Cập nhật trạng thái |
| `DELETE` | `/api/v1/appointments/{id}` | Hủy cuộc hẹn |

### Tìm Slot

| Method | Endpoint | Mô tả |
|--------|----------|-------|
| `POST` | `/api/v1/slots/find` | Tìm slot khả dụng |

## Domain Model

### StaffSchedule

```csharp
public class StaffSchedule : Entity
{
    public Guid StaffId { get; private set; }
    public Guid ShopId { get; private set; }
    public DayOfWeek DayOfWeek { get; private set; }
    public TimeOnly StartTime { get; private set; }
    public TimeOnly EndTime { get; private set; }
}
```

### Resource

```csharp
public class Resource : Entity, IAggregateRoot
{
    public Guid ShopId { get; private set; }
    public string Name { get; private set; }
    public ResourceType Type { get; private set; } // Room, Bed, Equipment
    public int Capacity { get; private set; }
}
```

### Appointment

```csharp
public class Appointment : Entity, IAggregateRoot
{
    public Guid ShopId { get; private set; }
    public Guid? CustomerId { get; private set; }
    public Guid? StaffId { get; private set; }
    public Guid? ResourceId { get; private set; }
    public Guid ServiceId { get; private set; }
    public DateTime StartTime { get; private set; }
    public DateTime EndTime { get; private set; }
    public AppointmentStatus Status { get; private set; }
}
```

## Thuật Toán Tìm Slot

```
Slot Khả Dụng = Lịch Nhân Viên ∩ Lịch Tài Nguyên - Cuộc Hẹn Đã Đặt
```

```mermaid
sequenceDiagram
    participant Client
    participant Booking as Booking Service
    participant DB as Database
    
    Client->>Booking: Tìm Slot (Dịch vụ, Ngày, Nhân viên?)
    Booking->>DB: Lấy Lịch Nhân Viên
    Booking->>DB: Lấy Lịch Tài Nguyên
    Booking->>DB: Lấy Cuộc Hẹn Đã Đặt
    
    Booking->>Booking: Tính Giao Tập Hợp
    Booking->>Booking: Loại Bỏ Slot Đã Đặt
    
    Booking-->>Client: Danh Sách Slot Khả Dụng
```

## Services Liên Quan

- [Order Service](../../order-service-net/docs/vi/README.md) - Sử dụng ServiceStrategy
- [Merchant Service](../../merchant-service-net/docs/vi/README.md) - Cấu hình Shop
- [Catalog Service](../../catalog-service-net/docs/vi/README.md) - Sản phẩm dịch vụ

## License

Proprietary - GoodGo Platform
