# Tài liệu Thiết kế Dữ liệu: Hệ thống Quản lý Mặt bằng Bưu cục

## 1. Mô tả tổng quan (Overview)
Hệ thống thực thể này được thiết kế chuyên biệt cho nghiệp vụ quản lý và tìm kiếm mặt bằng mở bưu cục vận tải. Thay vì gộp chung dữ liệu vào một bảng khổng lồ, cấu trúc được chuẩn hóa (Normalize) thành các domain nhỏ hơn để đảm bảo hiệu suất truy vấn và khả năng mở rộng. 

Đặc biệt, hệ thống đã tính đến các yếu tố then chốt trong vận hành logistics như:
* **Không gian vận tải:** Đánh giá độ rộng lòng đường, vỉa hè và khả năng tiếp cận của các dòng xe tải nhẹ (như xe Kia K200 1.9 tấn) khi lùi hoặc quay đầu lấy hàng.
* **Phân tách Tài chính & Vật lý:** Thông tin giá cả, hợp đồng được tách riêng (`PremiseFinancial`) khỏi thông số vật lý (`Premise`), giúp dễ dàng phân quyền cho kế toán và nhân viên phát triển mạng lưới.
* **Tận dụng hệ thống Core:** Tái sử dụng các thực thể dùng chung sẵn có của hệ thống (như `User`, `Location`, `Media`) thông qua các khóa ngoại.

## 2. Hướng dẫn tích hợp (Integration Guide)
Để đưa cấu trúc này vào dự án C# Entity Framework Core của bạn, hãy thực hiện theo các bước sau:

1. **Khai báo Thực thể:** Copy danh sách `Enums` và `Classes` bên dưới vào thư mục `Entities` hoặc `Models` trong dự án.
2. **Đăng ký DbSet:** Mở file `ApplicationDbContext.cs` (hoặc tên tương ứng) và thêm các `DbSet`:
   ```csharp
   public DbSet<Premise> Premises { get; set; }
   public DbSet<PremiseFinancial> PremiseFinancials { get; set; }
   public DbSet<Contact> Contacts { get; set; }
   public DbSet<Evaluation> Evaluations { get; set; }
   public DbSet<PremiseMedia> PremiseMedias { get; set; }

   // ==========================================
// A. ENUMS (Định nghĩa các kiểu dữ liệu phân loại)
// ==========================================
public enum PremiseType 
{ 
    RawBuilding,        // Nhà thô
    FinishedHouse,      // Nhà hoàn thiện
    TinWarehouse,       // Kho tôn
    ConcreteWarehouse   // Kho bê tông
}

public enum LocationType 
{ 
    StreetFront,        // Mặt phố
    Alley,              // Mặt ngõ/hẻm
    IndustrialZone      // Khu công nghiệp
}

public enum ContactRole 
{ 
    Landlord,           // Chủ nhà
    Broker,             // Môi giới
    AuthorizedPerson    // Người được ủy quyền
}

public enum EvaluationRole 
{ 
    Surveyor,           // Nhân viên khảo sát
    Manager             // Quản lý phê duyệt
}

public enum MediaType 
{ 
    FrontageImage,      // Ảnh mặt tiền
    InsideImage,        // Ảnh bên trong
    StreetImage,        // Ảnh đường/vỉa hè
    Video,              // Video toàn cảnh
    LegalDocument       // Giấy tờ pháp lý (Sổ đỏ, HĐ...)
}

// ==========================================
// B. ENTITIES (Thực thể cơ sở dữ liệu)
// ==========================================

/// <summary>
/// Thực thể trung tâm: Thông tin cơ bản và thông số vật lý của mặt bằng bưu cục
/// </summary>
public class Premise
{
    public int Id { get; set; }
    
    // --- Liên kết với hệ thống có sẵn ---
    public int LocationId { get; set; } 
    public virtual Location Location { get; set; } // Liên kết Phường/Xã

    public int CreatedByUserId { get; set; }
    public virtual User CreatedByUser { get; set; } // Liên kết Người tạo/khảo sát

    // --- Định vị chi tiết ---
    public string DetailedAddress { get; set; }
    public double? Latitude { get; set; }
    public double? Longitude { get; set; }

    // --- Thông số vật lý ---
    public double FrontageWidth { get; set; } // Mặt tiền (m)
    public double FloorArea { get; set; } // Diện tích sàn (m2)
    public int NumberOfFloors { get; set; } // Số tầng
    public PremiseType Type { get; set; } 
    public LocationType LocationType { get; set; } 

    // --- Giao thông & Vận tải ---
    public double SidewalkWidth { get; set; } // Vỉa hè (m)
    public double StreetWidth { get; set; } // Lòng đường (m)
    public int NumberOfLanes { get; set; } // Số làn xe
    public bool IsTwoWayStreet { get; set; } // Đường 2 chiều?
    public bool HasTimeRestriction { get; set; } // Nằm trong khu vực cấm giờ/cấm tải?
    public bool CanAccommodateLightTrucks { get; set; } // Phù hợp xe tải lùi/quay đầu?
    
    // --- Môi trường ---
    public string NeighborhoodNote { get; set; } // Ghi chú khu dân cư, hàng xóm

    // --- Navigation Properties ---
    public virtual PremiseFinancial Financial { get; set; } 
    public virtual ICollection<Contact> Contacts { get; set; } 
    public virtual ICollection<Evaluation> Evaluations { get; set; } 
    public virtual ICollection<PremiseMedia> PremiseMedias { get; set; } 
}

/// <summary>
/// Thông tin tài chính, hợp đồng và pháp lý
/// </summary>
public class PremiseFinancial
{
    public int Id { get; set; }
    
    public int PremiseId { get; set; }
    public virtual Premise Premise { get; set; }

    public decimal AskingRent { get; set; } // Giá chào thuê/tháng
    public decimal NegotiatedRent { get; set; } // Giá chốt/tháng
    public int DepositMonths { get; set; } // Số tháng cọc
    public int PaymentPeriodMonths { get; set; } // Kỳ thanh toán (1, 3, 6 tháng)
    public int FreeFitOutDays { get; set; } // Số ngày setup tối đa (miễn phí)
    public DateTime? AvailableFromDate { get; set; } // Thời gian có thể nhận mặt bằng
    public bool CanProvideVatInvoice { get; set; } // Xuất được hóa đơn VAT?
}

/// <summary>
/// Thông tin liên hệ (Chủ nhà, môi giới)
/// </summary>
public class Contact
{
    public int Id { get; set; }
    
    public int PremiseId { get; set; }
    public virtual Premise Premise { get; set; }

    public string FullName { get; set; }
    public string PhoneNumber { get; set; }
    public ContactRole Role { get; set; } 
}

/// <summary>
/// Đánh giá, chấm điểm mặt bằng
/// </summary>
public class Evaluation
{
    public int Id { get; set; }
    
    public int PremiseId { get; set; }
    public virtual Premise Premise { get; set; }

    public int EvaluatorUserId { get; set; }
    public virtual User EvaluatorUser { get; set; } // Nối với bảng User có sẵn

    public EvaluationRole Role { get; set; } 
    public int Score { get; set; } // Thang điểm 100
    public string Comments { get; set; } // Nhận xét chi tiết
    public bool IsFinalApproval { get; set; } // Đánh dấu quyết định duyệt cuối cùng
}

/// <summary>
/// Bảng trung gian nối Mặt bằng với hệ thống Media có sẵn
/// </summary>
public class PremiseMedia
{
    public int PremiseId { get; set; }
    public virtual Premise Premise { get; set; }

    public int MediaId { get; set; }
    public virtual Media Media { get; set; } // Nối với bảng Media có sẵn

    public MediaType Type { get; set; } 
}