Báo Cáo Môn Học: Lập Trình Hướng Đối Tượng

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 83

BỘ GIÁO DỤC VÀ ĐÀO TẠO

TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT TP. HCM


___________________________________

BÁO CÁO MÔN HỌC


LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG

XÂY DỰNG ỨNG DỤNG QUẢN LÝ NHÀ HÀNG

NHÓM SINH VIÊN THỰC HIỆN:

STT HỌ VÀ TÊN MSSV

1 Hồ Kim Trí 22110252

2 Dương Đình Vũ 22110269

GVHD: Trần Đắc Tốt

MÃ HP: OOPR230279_07CLC

Tp. HCM 12/2023


ĐIỂM SỐ

TIÊU CHÍ NỘI DUNG TRÌNH BÀY TỔNG

ĐIỂM

NHẬN XÉT

...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................
...........................................................................................................................................

Ký tên

Gvc.Ts Trần Đắc Tốt


LỜI CẢM ƠN

Chúng em xin gửi lời cảm ơn chân thành đến thầy và toàn thể Hội đồng giảng
dạy đã truyền đạt kiến thức quý báu về môn học "Lập trình hướng đối tượng".
Những buổi học đã mang đến cho chúng em một sự hiểu biết sâu sắc về cách
tiếp cận và xây dựng các chương trình theo phương pháp này.

Chúng em xin bày tỏ lòng biết ơn đặc biệt đến thầy đã dành thời gian và công
sức để giảng dạy và hỗ trợ chúng em trong quá trình nắm bắt và ứng dụng lập
trình hướng đối tượng. Nhờ sự chỉ dẫn tận tâm của thầy/cô, chúng em đã có cơ
hội áp dụng các khái niệm, nguyên tắc và kỹ thuật lập trình hướng đối tượng
vào thực tế.

Dù trong quá trình học tập, chúng em có thể gặp khó khăn và mắc phải những
sai sót, nhưng chúng em rất biết ơn vì đã có sự kiên nhẫn và nhẹ nhàng của
thầy trong việc giải đáp và chỉ dẫn. Những phản hồi và góp ý từ thầy đã giúp
chúng em hoàn thiện kỹ năng lập trình hướng đối tượng.

Cuối cùng, chúng em xin gửi lời cảm ơn sâu sắc đến Ban giám hiệu và trường
Đại học đã tạo điều kiện và cung cấp một môi trường học tập tốt, giúp chúng
em phát triển khả năng lập trình và chuẩn bị tốt cho tương lai nghề nghiệp.

Kính chúc thầy và toàn thể Hội đồng giảng dạy sức khỏe, hạnh phúc và thành
công trong công việc giảng dạy. Lời cảm ơn chân thành này sẽ luôn ở trong
lòng chúng em và mang ý nghĩa đặc biệt trong cuộc sống và sự nghiệp của
chúng em.

Chúng em xin chân thành cảm ơn!


MỤC LỤC

Phần 1: Giới thiệu và phân tích chương trình..................................................1

1.1. Mục tiêu của ứng dụng.............................................................................1

1.2. Phạm vi và đối tượng sử dụng..................................................................1

1.3. Mô tả chức năng.......................................................................................1

Phần 2: Thiết kế chương trình...........................................................................3

2.1. Thiết kế cơ sở dữ liệu XML......................................................................3

2.2. Thiết kế class............................................................................................3

2.2.1. các class đối tượng...............................................................................3

a. Lớp Food................................................................................................3

b. Lớp Account...........................................................................................3

c. Lớp Bill..................................................................................................4

d. Lớp BillInfo............................................................................................4

e. Lớp Category..........................................................................................5

f. Lớp Staff.................................................................................................5

g. Lớp Table...............................................................................................7

2.2.2. Các class xử lí......................................................................................7

a. Lớp ControlAccount:..............................................................................7

b. Lớp Controlbill:......................................................................................8

c. Lớp ControlBillInfo:............................................................................10

d. Lớp ControlCategory:..........................................................................11

e. Lớp Controlfood:..................................................................................13

f. Lớp ControlStaff:..................................................................................15
g. Lớp ControlTable:................................................................................18

2.3. Thiết kế giao diện người dung..................................................................20

2.3.1. Mô hình giao diện..............................................................................20

3.2.2. Sơ đồ trang và luồng điều hướng.......................................................35

Phần 3: Các chức năng chính của ứng dụng...................................................39

3.1. Chức năng đăng nhập...............................................................................39

3.2. Chức năng quản lí bàn và hoá đơn...........................................................41

3.3. Quản lí hoá đơn và doanh thu...................................................................50

3.4. Quản lí dữ liệu món ăn.............................................................................52

3.5. Quản lí dữ liệu danh mục..........................................................................56

3.6. Quản lí bàn ăn...........................................................................................60

3.7. Quản lí nhân viên......................................................................................64

3.8. Cập nhật tài khoản....................................................................................72

Phần 4 kết luận..................................................................................................75

4.1. kết luận.....................................................................................................75

4.2 định hướng phát triển.................................................................................76


Phần 1: Giới thiệu và phân tích chương trình

1.1. Mục tiêu của ứng dụng

Mục tiêu của ứng dụng là xây dựng một hệ thống quản lý nhà hàng hiệu
quả, tuân thủ nguyên tắc của Lập trình Hướng đối tượng (OOP), với mong
muốn tối ưu hóa năng suất và cung cấp công cụ hỗ trợ tối ưu hoá hoạt động
kinh doanh. Ứng dụng được thiết kế để đáp ứng nhu cầu tổ chức công việc,
tăng cường hiệu suất làm việc và đảm bảo sự hài lòng của khách hàng.

Chúng tôi sử dụng các khái niệm OOP, như lớp, đối tượng, kế thừa, và
đa hình để biểu diễn thông tin liên quan đến tài khoản nhân viên, bàn ăn, món
ăn, doanh thu, và các dữ liệu thống kê. Điều này giúp tạo ra một cấu trúc dữ
liệu có tổ chức, dễ quản lý và mở rộng.

Hệ thống cung cấp khả năng theo dõi doanh thu, quản lý đơn hàng, và
tổng hợp thông tin kinh doanh, mang lại cái nhìn tổng quan cho nhà quản lý.
Việc này giúp họ đưa ra quyết định thông minh và tối ưu hóa chiến lược kinh
doanh của mình.

Tổng thể, ứng dụng được xây dựng với triết lý OOP nhằm tăng cường
tính linh hoạt, tái sử dụng mã nguồn, và dễ bảo trì, tạo nên một công cụ quản
lý nhà hàng đa chiều, từ nhân viên đến quản lý, nhằm đáp ứng đa dạng và đòi
hỏi cao trong môi trường kinh doanh thực tế.

1.2. Phạm vi và đối tượng sử dụng

Phạm vi và đối tượng mà ứng dụng nhắm đến là nhà hàng và chủ yếu là
các nhân viên trong nội bộ nhà hàng.

1.3. Mô tả chức năng

Ứng dụng có những chức năng sau:

1
- Đăng nhập bằng tài khoản.
- Thay đổi thông tin đăng nhập của tài khoản như mật khẩu,..
- Hiển thị tình trạng của các bàn ăn (trống hoặc đang có người), tổng tiền
của bàn ăn và thao tác thêm món ăn, số lượng món ăn, giảm giá và thanh
toán.
- Hiển thị doanh thu tổng và tra cứu doanh thu theo ngày.
- Hiển thị danh sách món ăn và các thao tác thêm, xóa, sửa, tìm kiếm dựa
theo tên món ăn.
- Hiển thị danh sách danh mục món ăn và các thao tác thêm, xóa, sửa.
- Hiển thị danh sách bàn ăn và các thao tác thêm, xóa, sửa.
- Điểm danh.
- Hiển thị danh sách nhân sự và các thao tác thêm, xóa, sửa, tìm kiếm dựa
theo tên nhân sự.

2
Phần 2: Thiết kế chương trình

2.1. Thiết kế cơ sở dữ liệu XML

2.2. Thiết kế class

2.2.1. các class đối tượng


a. Lớp Food

Thuộc tính:

1. ID (int): Định danh duy nhất cho mỗi chức ăn.


2. Name (string): Tên của chức ăn.
3. Category (string): Danh mục hoặc loại của chức ăn.
4. Price (int): Giá của chức ăn.
5. Stock (int): Số lượng tồn kho của chức ăn.
Phương thức:

3
Food(int id, string name, string category, int price, int stock):
Constructor để khởi tạo một đối tượng Food với các giá trị cụ thể cho
ID, tên, danh mục, giá và tồn kho.
b. Lớp Account

Thuộc Tính:

1. ID (Kiểu: string): Định danh duy nhất của tài khoản.


2. UserName (Kiểu: string): Tên đăng nhập của tài khoản.
3. Password (Kiểu: string): Mật khẩu của tài khoản.
4. Role (Kiểu: string): Quyền của tài khoản (ví dụ: admin, user, ...).

Phương Thức:

1. Account (): Hàm khởi tạo mặc định không tham số.
2. Account(string accountid, string username, string displayname,
string password, string role) (Constructor có tham số): Khởi tạo
một đối tượng Account với các thông tin được cung cấp.
c. Lớp Bill

Thuộc Tính:

1. ID (Kiểu: int): Định danh duy nhất của hóa đơn.


2. DateCheckIn (Kiểu: DateTime): Ngày và giờ khi hóa đơn được
tạo.
3. IDTable (Kiểu: int): Định danh của bàn liên kết với hóa đơn.
4. Status (Kiểu: int): Trạng thái của hóa đơn (ví dụ: đã thanh toán,
chưa thanh toán).
5. Cost (Kiểu: decimal): Tổng giá trị của hóa đơn.

Phương Thức:

1. Bill(): Hàm khởi tạo mặc định không tham số.

4
2. Bill(int id, DateTime dateCheckin, int idtable, int status, decimal
cost) (Constructor có tham số): Khởi tạo một đối tượng Bill với
các thông tin được cung cấp.
d. Lớp BillInfo

Thuộc Tính:

1. ID (Kiểu: int): Định danh duy nhất của thông tin chi tiết hóa đơn.
2. IDBill (Kiểu: int): Định danh của hóa đơn liên kết với thông tin
chi tiết.
3. IDfood (Kiểu: int): Định danh của món ăn liên kết với thông tin
chi tiết.
4. Quantity (Kiểu: int): Số lượng của món ăn trong hóa đơn.

Phương Thức:

1. BillInfo(): Hàm khởi tạo mặc định không tham số.


2. BillInfo(int id, int idBill, int idfood, int quantity) (Constructor có
tham số): Khởi tạo một đối tượng BillInfo với các thông tin được
cung cấp.
e. Lớp Category

Thuộc Tính:

1. ID (Kiểu: int): Định danh duy nhất của loại danh mục.
2. Name (Kiểu: string): Tên của danh mục.

Phương Thức:

Category(int id, string name) (Constructor có tham số): Khởi tạo


một đối tượng Category với các thông tin được cung cấp.
f. Lớp Staff

Interface Bonus:

5
Thuộc tính: bonus (kiểu double)

Lớp trừu tượng "Staff":


Thuộc tính:

1. ID (Kiểu: int): Định danh duy nhất của nhân viên.


2. GioiTinh (Kiểu: string): Giới tính của nhân viên.
3. Name (Kiểu: string): Tên của nhân viên.
4. Birth (Kiểu: DateTime): Ngày sinh của nhân viên.
5. ChucVu (Kiểu: string): Chức vụ của nhân viên.
6. LuongNgay (Kiểu: int): Lương theo ngày của nhân viên.
7. NgayLam (Kiểu: int): Số ngày làm việc của nhân viên.
8. Luong (Kiểu: string): Lương của nhân viên (được tính toán trong
mỗi lớp con).
daDiemDanh (kiểu bool): Đã điểm danh hay chưa.
diemDanhDates (kiểu List<DateTime>): Danh sách các ngày điểm
danh.
h (kiểu DateTime): Thời điểm hiện tại.

Phương thức:
Check(): Kiểm tra xem nhân viên đã điểm danh trong ngày hiện
tại hay chưa.
SaveAttendance(): Lưu thông tin điểm danh vào tập tin.
DiemDanh(): Điểm danh nhân viên và cập nhật thông tin.

Lớp "Administrator" (kế thừa từ lớp "Staff" và implement interface


"Bonus"):
Thuộc tính:
bonus (kiểu double): Tiền thưởng.
Phương thức:

6
LuongCuoi(): Tính toán và trả về lương cuối cùng của
Administrator.

Lớp "Chef" (kế thừa từ lớp "Staff" và implement interface "Bonus"):


Thuộc tính:
bonus (kiểu double): Tiền thưởng.
Phương thức:
LuongCuoi(): Tính toán và trả về lương cuối cùng của Chef.

Lớp "Server" (kế thừa từ lớp "Staff"):


Thuộc tính:
calam (kiểu int): Ca làm việc.
Phương thức:
LuongCuoi(): Tính toán và trả về lương cuối cùng của Server.

Lớp "Cashier" (kế thừa từ lớp "Staff"):


Phương thức:
LuongCuoi(): Tính toán và trả về lương cuối cùng của Cashier.
g. Lớp Table

Thuộc Tính:

1. ID (Kiểu: int): Định danh duy nhất của bàn.


2. Type (Kiểu: string): Loại bàn (ví dụ: "Bàn ăn", "Bàn họp").
3. Seats (Kiểu: int): Số lượng ghế ngồi của bàn.
4. Status (Kiểu: int): Trạng thái của bàn (ví dụ: bàn trống, bàn đang
sử dụng).

Phương Thức:

1. Table(): Hàm khởi tạo mặc định không tham số.


2. Table(int id, string type, int seats, int status): Hàm khởi tạo với
tham số để thiết lập giá trị ban đầu của các thuộc tính.

7
2.2.2. Các class xử lí
a. Lớp ControlAccount:

Thuộc Tính:
1. loggedInUsername: Một chuỗi static để lưu trữ tên người dùng
đăng nhập.
2. acccouts: Một danh sách các đối tượng Account, đại diện cho các
tài khoản trong hệ thống.
3. Acccouts: Thuộc tính public để truy cập danh sách các tài khoản.

Phương Thức:
1. add(Account acccout): Thêm một tài khoản vào danh sách.
2. remove(Account acccout): Xóa một tài khoản khỏi danh sách.
3. Login(string username): Đăng nhập bằng tên người dùng.
4. GetLoggedInUsername(): Phương thức static để truy cập tên
người dùng đã đăng nhập.
5. find(string dieukien): Tìm kiếm các tài khoản theo điều kiện cho
trước.
6. readcate(): Đọc danh sách tài khoản từ file XML.
7. Authenticate(string username, string password): Xác thực tài
khoản người dùng.
8. UpdateAccount(string username, string displayname, string
password, string newpass, string reenterPass): Cập nhật thông tin
tài khoản.
9. AddAccount(int id, string username, string password, string role):
Thêm một tài khoản mới.
10.RemoveAccount(int id): Xóa một tài khoản.
11.AddAccountToXml(Account newAccount): Thêm một tài khoản
vào file XML.
12.SaveAccountsToXml(): Lưu danh sách tài khoản vào file XML.

8
13.RemoveAccountInXml(int id): Xóa một tài khoản khỏi file XML.
b. Lớp Controlbill:

Thuộc Tính:

billList (Kiểu: List<Bill>): Danh sách các hóa đơn trong hệ


thống.

Phương Thức:

1. add(Bill bill): Thêm một hóa đơn vào danh sách.


2. remove(Bill bill): Xóa một hóa đơn khỏi danh sách.
3. update(Bill bill): Phương thức dự kiến cho việc cập nhật thông tin
của hóa đơn, nhưng chưa được triển khai.
4. find(int dieukien): List<Bill>: Tìm kiếm các hóa đơn theo điều
kiện.
5. readbill(): Đọc danh sách hóa đơn từ file XML và thêm vào danh
sách billList.
6. GetUncheckBillbyTableid(int tableid): int: Lấy ID của hóa đơn
chưa thanh toán của một bàn.
7. insertbill(int id, int idTable): Thêm một hóa đơn mới vào danh
sách.
8. GetNextBillID(): int: Lấy ID cho hóa đơn mới, dựa trên số lượng
hóa đơn hiện tại.
9. SaveToXML(): Lưu danh sách hóa đơn vào file XML.
10.Checkout(int id, decimal t): Thanh toán hóa đơn với ID được chỉ
định và cập nhật trạng thái và chi phí.
11.IsTableOccupied(int tableID): bool: Kiểm tra xem bàn có đang
được sử dụng hay không.

Ghi Chú:

9
- Lớp Controlbill có nhiệm vụ quản lý hóa đơn trong hệ thống, thực
hiện các thao tác như thêm, xóa, đọc, và thanh toán hóa đơn.
- Phương thức GetUncheckBillbyTableid được sử dụng để kiểm tra
xem một bàn có đang sử dụng hay không.
- Phương thức insertbill được sử dụng để tạo một hóa đơn mới và
thêm vào danh sách.
- Phương thức Checkout được sử dụng để thanh toán một hóa đơn, cập
nhật trạng thái và chi phí.
- Phương thức SaveToXML được sử dụng để lưu danh sách hóa đơn
vào file XML.
- Danh sách hóa đơn được lưu và quản lý trong biến billList.
c. Lớp ControlBillInfo:

Thuộc Tính:

billin4 (Kiểu: List<BillInfo>): Danh sách các thông tin chi tiết
hóa đơn trong hệ thống.

Phương Thức:

1. add(BillInfo bill): Thêm một thông tin chi tiết hóa đơn vào danh
sách.
2. remove(BillInfo bill): Xóa một thông tin chi tiết hóa đơn khỏi
danh sách.
3. update(BillInfo bill): Phương thức dự kiến cho việc cập nhật
thông tin của thông tin chi tiết hóa đơn, nhưng chưa được triển
khai.
4. find(int dieukien): List<BillInfo>: Tìm kiếm các thông tin chi tiết
hóa đơn theo điều kiện.

10
5. readbill(): Đọc danh sách thông tin chi tiết hóa đơn từ file XML
và thêm vào danh sách billin4.
6. MergeDuplicateBillInfo(): Hợp nhất các thông tin chi tiết hóa đơn
trùng lặp (cùng IDBill và IDfood) để giảm số lượng dữ liệu trùng.
7. insertbillinfo(int idBill, int idFood, int quantity): Thêm một thông
tin chi tiết hóa đơn mới vào danh sách.
8. GetNextBillInfoID(): int: Lấy ID cho thông tin chi tiết hóa đơn
mới, dựa trên số lượng thông tin chi tiết hiện tại.
9. SaveBillInfoToXML(): Lưu danh sách thông tin chi tiết hóa đơn
vào file XML.

Ghi Chú:

- Lớp ControlBillinfo có nhiệm vụ quản lý thông tin chi tiết hóa đơn
trong hệ thống, thực hiện các thao tác như thêm, xóa, đọc, và hợp
nhất thông tin chi tiết hóa đơn.
- Phương thức MergeDuplicateBillInfo được sử dụng để hợp nhất các
thông tin chi tiết hóa đơn trùng lặp.
- Phương thức insertbillinfo được sử dụng để thêm một thông tin chi
tiết hóa đơn mới và lưu vào danh sách.
- Phương thức GetNextBillInfoID được sử dụng để lấy ID cho thông
tin chi tiết hóa đơn mới.
- Phương thức SaveBillInfoToXML được sử dụng để lưu danh sách
thông tin chi tiết hóa đơn vào file XML.
- Danh sách thông tin chi tiết hóa đơn được lưu và quản lý trong biến
billin4.
d. Lớp ControlCategory:

Thuộc Tính:

11
categories (Kiểu: List<Category>): Danh sách các danh mục
(Category) trong hệ thống.

Phương Thức:

1. add(Category category): Thêm một danh mục mới vào danh sách.
2. remove(Category category): Xóa một danh mục khỏi danh sách.
3. update(Category category): Cập nhật thông tin của một danh mục
trong danh sách và lưu thay đổi vào tệp XML.
4. savechange(Category category): Ghi thông tin của một danh mục
vào tệp Category.xml.
5. UpdateCategory(int id, string name): bool: Cập nhật thông tin của
một danh mục dựa trên ID và kiểm tra xem cập nhật thành công
hay không.
6. DeleteCategory(int id): bool: Xóa một danh mục khỏi danh sách
và lưu thay đổi vào tệp XML.
7. WriteCategory(): Ghi danh sách danh mục vào tệp Category.xml.
8. CheckCategoryID(int categoryid): bool: Kiểm tra xem một ID
danh mục đã tồn tại chưa.
9. CheckCategoryName(string categoryname): bool: Kiểm tra xem
một tên danh mục đã tồn tại chưa.
10.find(string dieukien): List<Category>: Tìm kiếm các danh mục
theo điều kiện.
11.readcate(): Đọc danh sách danh mục từ file XML và thêm vào
danh sách categories.

Ghi Chú:

- Lớp ControlCategory quản lý các thao tác liên quan đến danh mục trong
hệ thống.

12
- Phương thức update cập nhật thông tin của một danh mục và lưu thay
đổi vào tệp XML Category.xml.
- Phương thức savechange ghi thông tin của một danh mục vào tệp XML
Category.xml.
- Phương thức UpdateCategory cập nhật thông tin của một danh mục dựa
trên ID và kiểm tra xem cập nhật thành công hay không.
- Phương thức DeleteCategory xóa một danh mục khỏi danh sách và lưu
thay đổi vào tệp XML Category.xml.
- Phương thức WriteCategory ghi danh sách danh mục vào tệp XML
Category.xml.
- Các phương thức CheckCategoryID và CheckCategoryName kiểm tra
xem một ID hoặc tên danh mục đã tồn tại chưa.
- Danh sách danh mục được quản lý trong biến categories.
e. Lớp Controlfood:

Thuộc Tính:

foods (Kiểu: List<Food>): Danh sách các món ăn (Food) trong hệ


thống.

Phương Thức:

1. add(Food food): Thêm một món ăn mới vào danh sách.


2. remove(Food food): Xóa một món ăn khỏi danh sách.
3. find(int dieukien): List<Food>: Tìm kiếm món ăn dựa trên điều
kiện.
4. readfood(): Đọc danh sách món ăn từ file XML và thêm vào danh
sách foods.
5. savechange(Food food): Ghi thông tin của một món ăn vào tệp
XML Food.xml.

13
6. DeleteFood(int foodID): bool: Xóa một món ăn khỏi danh sách và
lưu thay đổi vào tệp XML.
7. GetFoodsByCategoryID(string categoryID): List<Food>: Lấy
danh sách món ăn theo ID danh mục.
8. WriteFood(): Ghi danh sách món ăn vào tệp XML Food.xml.
9. UpdateFood(int foodId, string name, string category, int price, int
stock): bool: Cập nhật thông tin của một món ăn và kiểm tra xem
cập nhật thành công hay không.
10.CheckFoodStock(int foodID, int quantity): bool: Kiểm tra xem có
đủ số lượng thức ăn hay không.
11.DecreaseFoodStock(int foodID, int quantity): bool: Giảm số
lượng thức ăn và lưu thay đổi vào tệp XML.
12.GetFoodById(int foodID): Food: Lấy thông tin thức ăn dựa trên
ID.
13.CheckFoodID(int foodID): bool: Kiểm tra xem một ID thức ăn đã
tồn tại chưa.
14.CheckFoodName(string foodname): bool: Kiểm tra xem một tên
thức ăn đã tồn tại chưa.
15.SearchFoodByName(string keyword): List<Food>: Tìm kiếm
món ăn theo tên gần đúng.

Ghi Chú:

- Lớp ControlFood quản lý các thao tác liên quan đến món ăn trong hệ
thống.
- Phương thức savechange ghi thông tin của một món ăn vào tệp XML
Food.xml.
- Phương thức DeleteFood xóa một món ăn khỏi danh sách và lưu thay
đổi vào tệp XML Food.xml.

14
- Phương thức GetFoodsByCategoryID lấy danh sách món ăn dựa trên ID
danh mục.
- Phương thức WriteFood ghi danh sách món ăn vào tệp XML Food.xml.
- Phương thức UpdateFood cập nhật thông tin của một món ăn và kiểm
tra xem cập nhật thành công hay không.
- Phương thức CheckFoodStock kiểm tra xem có đủ số lượng thức ăn hay
không.
- Phương thức DecreaseFoodStock giảm số lượng thức ăn và lưu thay đổi
vào tệp XML.
- Phương thức GetFoodById lấy thông tin thức ăn dựa trên ID.
- Các phương thức CheckFoodID và CheckFoodName kiểm tra xem một
ID hoặc tên thức ăn đã tồn tại chưa.
- Phương thức SearchFoodByName tìm kiếm món ăn theo tên gần đúng.
f. Lớp ControlStaff:
Thuộc tính:

1. Bonus:
Kiểu: double
Mô tả: Đại diện cho tiền thưởng cho nhân viên.
2. Staffs:
Kiểu: List<Staff>
Mô tả: Đại diện cho một danh sách các nhân viên.
3. Administrators:
Kiểu: List<Administrator>
Mô tả: Đại diện cho một danh sách các quản trị viên.
4. Chefs:
Kiểu: List<Chef>
Mô tả: Đại diện cho một danh sách các đầu bếp.
5. Cashiers:

15
Kiểu: List<Cashier>
Mô tả: Đại diện cho một danh sách các thu ngân.
6. Servers:
Kiểu: List<Server>
Mô tả: Đại diện cho một danh sách các phục vụ.
Phương thức:
thuongchef:
Tham số: Không
Mô tả: Tính toán và gán tiền thưởng cho đầu bếp dựa trên một
điều kiện.
thuongadmin:
Tham số: Không
Mô tả: Tính toán và gán tiền thưởng cho quản trị viên dựa trên
một điều kiện.
tinhbonus:
Tham số: Không
Kiểu trả về: double
Mô tả: Tính toán tiền thưởng dựa trên chi phí các hóa đơn trong
tháng hiện tại.
add:
Tham số: Staff, Administrator, Chef, Cashier, Server
Mô tả: Thêm một thành viên nhân viên, quản trị viên, đầu bếp,
thu ngân hoặc phục vụ vào danh sách tương ứng của họ.
remove:
Tham số: Staff
Mô tả: Loại bỏ một nhân viên khỏi danh sách.
update:
Tham số: Staff

16
Mô tả: Phương thức đánh dấu vị trí cập nhật cho nhân viên (thực
hiện chưa được).
readStaff:
Tham số: Không
Mô tả: Đọc thông tin nhân viên từ tệp XML.
DeleteStaff:
Tham số: Staff
Mô tả: Xóa một nhân viên và loại bỏ dữ liệu XML tương ứng.
AddStaff:
Tham số: Staff
Mô tả: Thêm một nhân viên mới và cập nhật tệp XML.
CheckStaffID:

Tham số: int staffid


Kiểu trả về: bool
Mô tả: Kiểm tra xem một ID nhân viên có tồn tại hay không.
UpdateNgayLam:
Tham số: int id, int newNgayLam
Kiểu trả về: bool
Mô tả: Cập nhật số ngày làm việc cho một nhân viên.
UpdateStaff:
Tham số: int id, string name, DateTime birth, string chucvu,
string gioitinh, int luongngay, int ngaylam
Kiểu trả về: bool
Mô tả: Cập nhật thông tin nhân viên trong tệp XML.
SearchStafByName:
Tham số: string keyword
Kiểu trả về: List<Staff>
Mô tả: Tìm kiếm nhân viên theo tên.

17
TinhLuongStaff:
Tham số: int id, string name, DateTime birth, string chucvu,
string gioitinh, int luongngay, int ngaylam
Kiểu trả về: bool
Mô tả: Phương thức đánh dấu vị trí tính lương cho nhân viên
(thực hiện chưa được).

Ghi Chú:
- Lớp ControlStaff quản lý các thao tác liên quan đến nhân viên trong hệ
thống, bao gồm cả các chức vụ như Quản trị viên, Đầu bếp, Thu ngân và
Phục vụ.
- Phương thức readStaff đọc thông tin nhân viên từ file XML và tạo các
đối tượng tương ứng với từng chức vụ, sau đó thêm vào danh sách
chung và danh sách riêng của từng chức vụ.
- Phương thức DeleteStaff xóa một nhân viên khỏi danh sách và cập nhật
file XML. Nó được thực hiện bằng cách xóa phần tử XML tương ứng
với nhân viên đó trong file XML.
- Phương thức AddStaff thêm thông tin của một nhân viên mới vào file
XML.
- Phương thức CheckStaffID kiểm tra xem một ID nhân viên đã tồn tại
chưa.
- Phương thức UpdateStaff cập nhật thông tin của một nhân viên và kiểm
tra xem cập nhật thành công hay không.
- Phương thức SearchStafByName tìm kiếm nhân viên theo tên gần đúng.
g. Lớp ControlTable:

Thuộc Tính:

tables (Kiểu: List<Table>): Danh sách các bàn trong hệ thống.

18
Phương Thức:

1. add(Table table): Thêm một bàn mới vào danh sách.


2. remove(Table table): Xóa một bàn khỏi danh sách.
3. update(Table table): Cập nhật thông tin của một bàn trong danh sách
(chưa được hiện thực).
4. find(string dieukien): List<Table>: Tìm kiếm bàn theo điều kiện (ID
hoặc loại).
5. UpdateTableStatus(int tableID, int status): Cập nhật trạng thái của
một bàn dựa trên ID.
6. CheckTableID(int tableid): bool: Kiểm tra xem một ID bàn đã tồn tại
chưa.
7. UpdateTable(int Id, string Type, int Seats, int Status): bool: Cập nhật
thông tin của một bàn và kiểm tra xem cập nhật thành công hay
không.
8. SaveChange(Table table): Ghi thông tin của một bàn vào file XML.
9. DeleteTable(int tableID): bool: Xóa một bàn khỏi danh sách và cập
nhật file XML.
10.WriteTables(): Ghi danh sách các bàn vào file XML.
11.readTable(): Đọc danh sách các bàn từ file XML.

Ghi Chú:

- Lớp ControlTable quản lý các thao tác liên quan đến bàn trong hệ thống.
- Phương thức UpdateTableStatus cập nhật trạng thái của một bàn dựa trên
ID, sau đó lưu lại thông tin cập nhật.
- Phương thức CheckTableID kiểm tra xem một ID bàn đã tồn tại chưa.
- Phương thức UpdateTable cập nhật thông tin của một bàn và kiểm tra xem
cập nhật thành công hay không.
- Phương thức SaveChange thêm thông tin của một bàn mới vào file XML.

19
- Phương thức DeleteTable xóa một bàn khỏi danh sách và cập nhật file
XML. Nó được thực hiện bằng cách xóa phần tử XML tương ứng với bàn
đó trong file XML.
- Phương thức WriteTables ghi danh sách các bàn vào file XML.
- Phương thức readTable đọc danh sách các bàn từ file XML.

2.3. Thiết kế giao diện người dung

2.3.1. Mô hình giao diện

- Màn Hình Đăng Nhập (Form1):

Trường nhập Username:

Trường nhập Password:

20
Nút Đăng Nhập (button1):

Nút Thoát (button3).

Màn Hình Quản Lý (manager):

Bảng hiển thị thông tin bàn ăn được chọn (listView1):

21
Nút chuyển đến màn hình quản lý Admin (adminToolStripMenuItem).

Nút chuyển chọn màn hình sửa thông tin tài khoản hoặc đăng xuất tài khoản
(thôngTinTàiKhoảnToolStripMenuItem).

Nút chuyển đến màn hình sửa thông tin tài khoản
(thôngTinCáNhânToolStripMenuItem).

Nút đăng xuất tài khoản (đăngXuấtToolStripMenuItem).

Hộp thoại chọn danh mục món ăn (comboBox2):

22
Hộp thoại chọn món ăn (comboBox1):

Hộp thoại nhập số lượng (Foodcount):

Hộp thoại hiển thị tổng tiền của hóa đơn (textBox1):

Hộp thoại nhập số tiền giảm giá (numericDiscount):

Nút Thêm (addfoodButton):

Nút Thanh Toán (buttonthanhtoan):

Danh sách bàn và trạng thái (flowLayouttable).

23
Mỗi bàn có nút để chọn và hiển thị hóa đơn.

Màn Hình Thay Đổi Thông Tin Cá Nhân (account)

24
Hộp thoại hiển thị Tên Đăng Nhập (textBox1):

Hộp thoại nhập mật khẩu cũ(textBox3):

Hộp thoại nhập mật khẩu mới (textBox4):

Hộp thoại nhập xác nhận mật khẩu mới (textBox5):

25
Nút Cập nhật (update):

Nút thoát khỏi cửa sổ (exit):

Màn Hình Quản Lý Admin (admim):

Quản lý doanh thu:

Chọn ngày bắt đầu tra cứu(dateTimePicker1):

Chọn ngày kết thúc tra cứu(dateTimePicker2):

26
Nút Tra Cứu(ButtonFind):

Bảng Hiển Thị Thông Tin Doanh Thu(dataGridViewBill):

27
Quản lý món ăn:

Nút Thêm(Thêm):

Nút Sửa(Sửa):

Nút Xóa(Xóa):

Trường hiển thị và nhập ID món ăn(numIDfood):

28
Trường hiển thị và nhập tên món ăn(textNamefood):

Trường hiển thị và nhập danh mục món ăn(textfoodcre):

Trường hiển thị và nhập giá tiền món ăn(numPrice):

Trường hiển thị và nhập số lượng món ăn(numstock):

Trường nhập thông tin để tìm kiếm(textsearchfood):

Nút Tìm (Tìm):

Bảng hiển thị thông tin món ăn (dataGridViewFood):

29
Quản lý danh mục món ăn:

Nút Thêm(buttonThêmCate):

Nút Sửa(buttonsửacate):

30
Nút Xóa(buttonxoácate):

Trường hiển thị và nhập ID danh mục(textBoxidcategory):

Trường hiển thị và nhập Tên danh mục(textBoxnamecategory):

Bảng hiển thị thông tin danh mục món ăn (dataGridViewcategory):

Quản lý bàn ăn:

31
Nút Thêm(addTable):

Nút Sửa(fixtable):

Nút Xóa(deleTable):

Trường hiển thị và nhập ID bàn (numIDfood):

32
Trường hiển thị và nhập loại bàn (textNamefood):

Trường hiển thị và nhập số ghế của bàn (textfoodcre):

Trường hiển thị và nhập trạng thái của bàn (numPrice):

33
Bảng hiển thị thông tin bàn ăn(dataGridView1):

Quản Lý nhân sự:

Nút Thêm(addAccount):

34
Nút Sửa(Deleaccount):

Nút Xóa(editAccount):

Trường hiển thị và nhập ID nhân sự (textBoxID):

Trường hiển thị và nhập tên nhân sự (textBoxName):

Trường hiển thị và nhập chức vụ của nhân sự(Chucvutext):

Trường hiển thị và nhập giới tính của nhân sự (textGT):

Trường hiển thị và nhập lương một ngày làm của nhân sự (numericLuongNgay):

Trường hiển thị và nhập số lượng ngày đi làm của nhân sự (numericNgayLam):

35
Trường hiển thị và nhập thông tin ngày sinh của nhân sự(Ngaysinh):

Trường nhập Username để thêm đối với quản lý và thu ngân(textBoxUsername):

Trường nhập Password để thêm đối với quản lý và thu ngân(textBoxPassword):

Trường nhập thông tin để tìm kiếm(textBoxFindstaff):

Nút Điểm danh(buttondiemdanh):

Trường hiển thị tổng lương(textBoxLuong)

Nút tính lương (Lương):

Nút Tìm (Findstaff):

36
Bảng hiển thị thông tin nhân sự (dataGridView4):

3.2.2. Sơ đồ trang và luồng điều hướng

Luồng Đăng Nhập:

Nếu đăng nhập thành công, chuyển đến màn hình quản lý (manager).

Nếu đăng nhập thất bại, hiển thị thông báo và giữ lại trên màn hình đăng nhập.

37
Luồng Quản Lý:

Chọn bàn để xem và thêm món.

Thêm món vào bàn trống sẽ cập nhập trạng thái bàn.

Thanh toán hóa đơn để cập nhật trạng thái bàn.

Chuyển đến màn hình quản lý Admin khi bấm vào admin nếu có quyền

Nếu không có quyền admin sẽ từ chối truy cập và hiển thị thông báo.

38
Chuyển đến màn hình đăng nhập và thoát tài khoản khi bấm Đăng xuất trong
Thông Tin Cá Nhân.

Chuyển đến màn hình đăng nhập và thoát tài khoản khi bấm Thông Tin Cá Nhân
trong Thông Tin Cá Nhân.

39
Luồng Quản Lý Admin:

Chuyển đến các trang Doanh Thu, Món ăn, Doanh Mục, Bàn ăn, Nhân sự khi
bấm vào các nút tương ứng.

Nếu các bước thêm sửa xóa không hợp lệ sẽ hiển thị thông báo lỗi.

40
Phần 3: Các chức năng chính của ứng dụng

3.1. Chức năng đăng nhập

-Form1.cs

private void button1_Click(object sender, EventArgs e)


{
string username = textUsername.Text;
string password = textPassword.Text;
string hashedPassword;
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

byte[] hashedBytes = sha256.ComputeHash(passwordBytes);

hashedPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();
}

ControlAcc accountController = new ControlAcc();


accountController.readcate();
if (accountController.Authenticate(username, hashedPassword))
{
Account l = new Account();
l = accountController.Acccouts.FirstOrDefault(u => u.UserName ==
username && u.Password == hashedPassword);
accountController.Login(username);
manager h = new manager(l);

41
this.Hide();
h.ShowDialog();

this.Show();
}
else MessageBox.Show("Đăng nhập thất bại. Tên đăng nhập hoặc mật khẩu
không đúng!");
}

Khi người dung nhập tên tài khoản và mật khẩu vào ô tương ứng trên cửa
sổ đăng nhập và nhấn nút đăng nhập nếu đúng tài khoản và mật khẩu thì sẽ
chuyển đến cửa sổ manager còn trong trường hợp sai mật khẩu hoặc tài khoản
thì sẽ hiện lên cửa sổ thông báo đăng nhập thất bại.

Trong này chúng em sử dụng hàm Authenticate để kiểm tra tài khoản và
mật khẩu có đúng trong dữ liệu đã có hay không và trả về kiểu dữ liệu là bool.

Controlaccount.cs

public bool Authenticate(string username, string password)

Account user = Acccouts.FirstOrDefault(u => u.UserName == username &&


u.Password == password);

return user != null;

Ngoài ra hàm khởi tạo của manager được truyền vào 1 Account để định
danh tài khoản đăng nhập, chỉ có Account admin mới có thể truy cập vào cửa sổ
admin.

42
3.2. Chức năng quản lí bàn và hoá đơn.

- Trình bày danh sách các bàn ăn dưới dạng cái nút bấm (button)

-manager.cs

void DisplayTables()

flowLayouttable.Controls.Clear();

ControlTable table = new ControlTable();

table.readTable();

foreach (var tableInfo in table.Tables)

Button tableButton = new Button

Text = $"Bàn: {tableInfo.ID}\n {tableInfo.Type}\nChỗ:


{tableInfo.Seats}\nTrạng Thái: {(tableInfo.Status == 0 ? "Trống" : "Có
người")}",

Tag = tableInfo,

Width = 120,

Height = 80,

Margin = new Padding(5),

TextAlign = ContentAlignment.MiddleCenter

43
};

switch (tableInfo.Status)

case (1):

tableButton.BackColor = Color.Aquamarine;

break;

default:

tableButton.BackColor = Color.LightPink; break;

tableButton.Click += TableButton_Click;

flowLayouttable.Controls.Add(tableButton);

- Truyền vào tên các danh mục thức ăn cho combobox.

-manager.cs

void loadcategory(List<Category> cateList)

comboBox2.DataSource = null;

44
comboBox2.DataSource =cateList;

comboBox2.DisplayMember = "Name";

- Hiển thị hoá đơn tương ứng với bàn được chọn.

-manager.cs

void showbill(int idtable)

ControlBillinfo h = new ControlBillinfo();

h.readbill();

Controlbill m = new Controlbill();

m.readbill();

int uncheckBillID = m.GetUncheckBillbyTableid(idtable);

List<BillInfo> billInfos = h.Billin4.Where(billInfo => billInfo.IDBill ==


uncheckBillID).ToList();

listView1.Items.Clear();

decimal totalCost = 0;

foreach (var billInfo in billInfos)

Food food = FindFoodById(billInfo.IDfood);

45
if (food != null)

ListViewItem item = new ListViewItem(billInfo.IDBill.ToString()); //

item.SubItems.Add(billInfo.IDfood.ToString());

item.SubItems.Add(food.Name); // Display food name

item.SubItems.Add(billInfo.Quantity.ToString());

item.SubItems.Add((billInfo.Quantity * food.Price).ToString("C")); //

decimal itemCost = billInfo.Quantity * food.Price;

listView1.Items.Add(item);

totalCost += itemCost;

textBox1.Text =
(totalCost-totalCost*numericDiscount.Value/100).ToString() ;

- Tìm thức ăn theo id thức ăn và trả về.

-manager.cs

Food FindFoodById(int foodId)

controlfood h = new controlfood();

46
h.readfood();

return h.Foods.FirstOrDefault(food => food.ID.ToString() ==


foodId.ToString());

void TableButton_Click(object sender, EventArgs e)

int idtable= ((sender as Button).Tag as Table).ID;

listView1.Tag = new Table { ID = idtable };

showbill(idtable);

- Nút thanh toán thức ăn.

-manager.cs

private void buttonthanhtoan_Click(object sender, EventArgs e)

Controlbill h = new Controlbill();

ControlBillinfo m = new ControlBillinfo();

h.readbill();

m.readbill();

Table table = listView1.Tag as Table;

47
int idbill = h.GetUncheckBillbyTableid(table.ID);

if(idbill!=0)

if (MessageBox.Show("Bạn có muốn thanh toán bàn " + table.ID, "Thông


báo", MessageBoxButtons.OKCancel) ==
System.Windows.Forms.DialogResult.OK)

decimal t = decimal.Parse(textBox1.Text);

h.Checkout(idbill,t);

showbill(table.ID);

UpdateTableStatus(table.ID);

- Truyền vào danh sách thức ăn tương ứng với danh mục thức ăn.

-manager.cs

void loadfoodlistbyNamecategory(string name)

controlfood h = new controlfood();

48
h.readfood();

List<Food> foodsByCategory = h.GetFoodsByCategoryID(name);

comboBox1.DataSource = null;

comboBox1.DataSource = foodsByCategory;

comboBox1.DisplayMember = "Name";

- Cập nhật lại trạng thái của bàn ăn.

-manager.cs

private void UpdateTableStatus(int tableID)

Controlbill controlBill = new Controlbill();

controlBill.readbill();

bool isTableOccupied = controlBill.IsTableOccupied(tableID);

ControlTable controlTable = new ControlTable();

controlTable.readTable();

controlTable.UpdateTableStatus(tableID, isTableOccupied ? 1 : 0);

DisplayTables();

49
- Nút thanh toán hoá đơn của bàn.

-manager.cs

private void addfoodButton_Click(object sender, EventArgs e)

Controlbill h = new Controlbill();

ControlBillinfo m = new ControlBillinfo();

controlfood foodControl = new controlfood();

foodControl.readfood();

h.readbill();

m.readbill();

Table table = listView1.Tag as Table;

if(table==null)

table = new Table { ID = 1 };

int idbill = h.GetUncheckBillbyTableid(table.ID);

int idfood = (comboBox1.SelectedItem as Food).ID;

int count = (int)Foodcount.Value;

if (foodControl.CheckFoodStock(idfood, count))

if (idbill == 0)

50
{

int i = h.GetNextBillID();

h.insertbill(i, table.ID);

m.insertbillinfo(i, idfood, count);

foodControl.DecreaseFoodStock(idfood, count);

else

m.insertbillinfo(idbill, idfood, count);

m.MergeDuplicateBillInfo();

foodControl.DecreaseFoodStock(idfood, count);

showbill(table.ID);

UpdateTableStatus(table.ID);

else

MessageBox.Show("Số lượng thức ăn không đủ. Vui lòng kiểm tra lại!");

51
}

3.3. Quản lí hoá đơn và doanh thu.

- Hiển thị danh sách hoá đơn trong datagridview.

-admim.cs

void LoadFilteredBillsToDataGridView(List<Bill> filteredBills)

DataGridViewColumn banColumn = new DataGridViewTextBoxColumn();

banColumn.DataPropertyName = "IDTable";

banColumn.HeaderText = "Bàn";

dataGridViewBill.Columns.Add(banColumn);

dataGridViewBill.DataSource = null;

dataGridViewBill.Rows.Clear();

dataGridViewBill.DataSource = filteredBills;

- Lọc danh sách hoá đơn theo ngày.

admim.cs

private void ButtonFind_Click(object sender, EventArgs e)

DateTime fromDate = dateTimePicker1.Value;

DateTime toDate = dateTimePicker2.Value;

52
List<Bill> filteredBills = Crtbill.BillList

.Where(bill => bill.Status == 1 && bill.DateCheckIn.Date >=


fromDate.Date && bill.DateCheckIn.Date <= toDate.Date).ToList();

LoadFilteredBillsToDataGridView(filteredBills);

private void dateTimePicker1_ValueChanged(object sender, EventArgs e)

ButtonFind_Click(sender, e);

private void dateTimePicker2_ValueChanged(object sender, EventArgs e)

ButtonFind_Click(sender, e);

- Lọc ra danh sách bill đã thanh toán.

-admim.cs

List<Bill> GetBillsWithStatus1()

Crtbill.readbill();

return Crtbill.BillList.Where(bill => bill.Status == 1).ToList();

53
3.4. Quản lí dữ liệu món ăn.

- Truyển dữ liệu thức ăn vào datagridview.

-admim.cs

void loadFood(List<Food> foodList)

dataGridViewFood.DataSource = null;

dataGridViewFood.DataSource = foodList;

- Thêm thức ăn.

-admim.cs

private void Thêm_Click(object sender, EventArgs e)


{
try
{
int ID = int.Parse(numIDfood.Text);
string Name = textNamefood.Text;
string category = textfoodcre.Text;
int Price = Convert.ToInt32(numPrice.Value + "");
int stock = Convert.ToInt32(numstock.Value + "");
foodadj = new Food(ID, Name, category, Price, stock);
if (crtfood.CheckFoodID(ID)&&crtfood.CheckFoodName(ID,Name)&&
category!=""&&Name!="")
{

54
crtfood.add(foodadj);
loadFood(crtfood.Foods);
crtfood.savechange(foodadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc nhập lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}

- Xoá thức ăn.

-admim.cs

private void Xoá_Click_1(object sender, EventArgs e)

int id = Convert.ToInt32(numIDfood.Text);

if (crtfood.DeleteFood(id))

MessageBox.Show("Xóa món thành công");

loadFood(crtfood.Foods);

if (deleteFood != null)

55
deleteFood(this, new EventArgs());

else

MessageBox.Show("Có lỗi khi xóa thức ăn");

- Sửa thông tin thức ăn.

-admim.cs

private void Sửa_Click(object sender, EventArgs e)


{
try
{
int ID = int.Parse(numIDfood.Text);
string Name = textNamefood.Text;
string category = textfoodcre.Text;
int Price = Convert.ToInt32(numPrice.Value + "");
int stock = Convert.ToInt32(numstock.Value + "");
foodadj = new Food(ID, Name, category, Price, stock);
if (crtfood.UpdateFood(ID, Name, category, Price, stock) && category !=
"" && Name != "")
{
MessageBox.Show("Sửa món thành công");
dataGridViewFood.Refresh();

56
loadFood(crtfood.Foods);

if (updatefood != null)
updatefood(this, new EventArgs());
}
else
{
MessageBox.Show("Có lỗi khi sửa thức ăn");
}

}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}

- Hiển thị thông tin thức ăn khi bấm vào.

-admim.cs

private void dataGridViewFood_CellClick(object sender,


DataGridViewCellEventArgs e)

int i = dataGridViewFood.CurrentCell.RowIndex;

foodadj = crtfood.Foods[i];

hienthifood(foodadj);

57
void hienthifood(Food food)

numIDfood.Text = food.ID.ToString();

textNamefood.Text = food.Name;

textfoodcre.Text = food.Category;

numPrice.Value = food.Price;

numstock.Value = food.Stock;

- Tìm thức ăn.

-admim.cs

private void Tìm_Click(object sender, EventArgs e)

string keyword = textsearchfood.Text.Trim();

List<Food> searchResult = crtfood.SearchFoodByName(keyword);

loadFood(searchResult);

3.5. Quản lí dữ liệu danh mục.

- Truyền dữ liệu các danh mục vào datagridview.

-admim.cs

58
void loadCategory(List<Category> categoryList)

dataGridViewcategory.DataSource = null;

dataGridViewcategory.DataSource = categoryList;

- Hiển thị danh mục lên các textbox.

-admim.cs

void hienthicategory(Category category)

textBoxidcategory.Text = category.ID.ToString();

textBoxnamecategory.Text = category.Name;

Thêm danh mục.

-admim.cs

private void buttonThêmCate_Click(object sender, EventArgs e)


{
try
{
int ID = int.Parse(textBoxidcategory.Text);
string Name = textBoxnamecategory.Text;
categoryadj = new Category(ID, Name);

59
if (crtcategory.CheckCategoryID(ID) &&
crtcategory.CheckCategoryName(Name) && Name!="")
{
crtcategory.add(categoryadj);
loadCategory(crtcategory.Categories);
crtcategory.savechange(categoryadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}

- Xoá danh mục.

-admim.cs

private void buttonxoácate_Click(object sender, EventArgs e)

int id = Convert.ToInt32(textBoxidcategory.Text);

if (crtcategory.DeleteCategory(id))

MessageBox.Show("Xóa danh mục thành công");

60
loadCategory(crtcategory.Categories);

if (deletecategory != null)

deletecategory(this, new EventArgs());

else

MessageBox.Show("Có lỗi khi xóa danh mục");

- Sửa danh mục.

-admim.cs

private void button3_Click(object sender, EventArgs e)

try

int ID = int.Parse(textBoxidcategory.Text);

string Name = textBoxnamecategory.Text;

categoryadj = new Category(ID, Name);

if (crtcategory.UpdateCategory(ID, Name))

61
{

MessageBox.Show("Sửa danh mục thành công");

loadCategory(crtcategory.Categories);

if (updatecategory != null)

updatecategory(this, new EventArgs());

else

MessageBox.Show("Có lỗi khi sửa danh mục");

catch (Exception ex)

MessageBox.Show($"Error: {ex.Message}");

3.6. Quản lí bàn ăn.

- Truyển dữ liệu bàn ăn vào datagridview.

-admim.cs

void loadTable(List<Table> tableList)

62
{

dataGridView1.DataSource = null; // Clear the data source

dataGridView1.DataSource = tableList;

- Hiển thị các thông tin của bàn lên textbox.

void hienthitable(Table table)

textBox4.Text = table.ID.ToString();

textBox3.Text = table.Type;

numericUpDown1.Value = table.Seats;

numericUpDown2.Value = table.Status;

- Thêm bàn ăn.

-admim.cs

private void addTable_Click(object sender, EventArgs e)


{
try
{
int ID = int.Parse(textBox4.Text);
string Type = textBox3.Text;

63
int Seats = Convert.ToInt32(numericUpDown1.Value + "");
int Status = Convert.ToInt32(numericUpDown2.Value + "");
tableadj = new Table(ID, Type, Seats, Status);
if (crttable.CheckTableID(ID) && Type!="")
{
crttable.add(tableadj);
loadTable(crttable.Tables);
crttable.SaveChange(tableadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}

- Xoá bàn ăn.

-admim.cs

private void deleTable_Click(object sender, EventArgs e)

int id = Convert.ToInt32(textBox4.Text);

if (crttable.DeleteTable(id))

MessageBox.Show("Xóa bàn thành công");

64
loadTable(crttable.Tables);

if (deleteTable != null)

deleteTable(this, new EventArgs());

else

MessageBox.Show("Có lỗi khi xóa bàn");

- Sửa bàn ăn.

-admim.cs

private void fixtable_Click(object sender, EventArgs e)


{
try
{
int ID = int.Parse(textBox4.Text);
string Type = textBox3.Text;
int Seats = Convert.ToInt32(numericUpDown1.Value + "");
int Status = Convert.ToInt32(numericUpDown2.Value + "");
tableadj = new Table(ID, Type, Seats, Status);
if (crttable.UpdateTable(ID, Type, Seats, Status) && Type!="")
{

65
MessageBox.Show("Sửa thông tin bàn thành công");
loadTable(crttable.Tables);
if (updateTable != null)
updateTable(this, new EventArgs());
}
else
{
MessageBox.Show("Có lỗi khi sửa thông tin bàn");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}

3.7. Quản lí nhân viên.

- Thêm nhân viên.

-admim.cs

private void addAccount_Click(object sender, EventArgs e)


{
try
{
int id = Convert.ToInt32(textBoxID.Text);
string name = textBoxName.Text;
DateTime birth = Ngaysinh.Value;
string chucvu = Chucvutext.Text;
string gioitinh = textGT.Text;

66
int luongngay = Convert.ToInt32(numericLuongNgay.Value);
int ngaylam = Convert.ToInt32(numericNgayLam.Value);
string username = textBoxUsername.Text;
string password = textBoxPassword.Text;
int t = ngaylam * luongngay;
if (chucvu == "Administrator")
{
staffadj = new Administrator(id, name, birth, chucvu, gioitinh,
luongngay, ngaylam);
}
else if (chucvu == "Chef")
{
staffadj = new Chef(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Server")
{
staffadj = new Server(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Cashier")
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);

67
}
if (crtstaff.CheckStaffID(id) && name != "" && chucvu != "" && gioitinh
!= "" && password != "" && username != "" && password.Length >= 8 &&
(staffadj is Administrator || staffadj is Cashier))
{
AddAccountInfo();
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
MessageBox.Show("Thêm Thành Công");
}
else if (crtstaff.CheckStaffID(id) && name != "" && chucvu != "" &&
gioitinh != "" && (staffadj is Chef || staffadj is Server))
{
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
MessageBox.Show("Thêm Thành Công");
}
else MessageBox.Show("Trùng lặp hoặc lỗi");
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}
}

68
- Sửa nhân viên.

-admim.cs

private void editAccount_Click(object sender, EventArgs e)


{
int selectedIndex = dataGridView4.CurrentCell.RowIndex;
Staff selectedStaff = crtstaff.Staffs[selectedIndex];
try
{
int id = Convert.ToInt32(textBoxID.Text);
string name = textBoxName.Text;
DateTime birth = Ngaysinh.Value;
string chucvu = Chucvutext.Text;
string gioitinh = textGT.Text;
int luongngay = Convert.ToInt32(numericLuongNgay.Value);
int ngaylam = Convert.ToInt32(numericNgayLam.Value);
if (chucvu == "Administrator")
{
staffadj = new Administrator(id, name, birth, chucvu, gioitinh,
luongngay, ngaylam);
}
else if (chucvu == "Chef")
{
staffadj = new Chef(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Server")
{

69
staffadj = new Server(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else if (chucvu == "Cashier")
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
else
{
staffadj = new Cashier(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam);
}
if (/*crtstaff.UpdateStaff(id, name, birth, chucvu, gioitinh, luongngay,
ngaylam) &&*/ name != "" && chucvu != "" && gioitinh != "")
{
MessageBox.Show("Sửa nhân viên thành công");
crtstaff.Staffs.RemoveAt(selectedIndex);
loadStaff(crtstaff.Staffs);
crtstaff.DeleteStaff(selectedStaff);
crtstaff.add(staffadj);
crtstaff.Staffs.Sort((x, y) => x.ID.CompareTo(y.ID));
loadStaff(crtstaff.Staffs);
crtstaff.AddStaff(staffadj);
if (updatestaff != null)
updatestaff(this, new EventArgs());
}
else
{

70
MessageBox.Show("Có lỗi khi sửa nhân viên");
}
}
catch (Exception ex)
{
MessageBox.Show($"Error: {ex.Message}");
}

- Xoá nhân viên.

-admim.cs

private void Deleaccount_Click_1(object sender, EventArgs e)


{
int selectedIndex = dataGridView4.CurrentCell.RowIndex;

if (selectedIndex >= 0 && selectedIndex < crtstaff.Staffs.Count)


{
Staff selectedStaff = crtstaff.Staffs[selectedIndex];
DialogResult result = MessageBox.Show("Bạn có chắc chắn muốn
xóa nhân sự này?", "Xác nhận xóa", MessageBoxButtons.YesNo);
if (result == DialogResult.Yes)
{
RemoveAccountInfo();
crtstaff.Staffs.RemoveAt(selectedIndex);
loadStaff(crtstaff.Staffs);
crtstaff.DeleteStaff(selectedStaff);
MessageBox.Show("Xóa nhân sự thành công");
}
}

71
else
{
MessageBox.Show("Vui lòng chọn một nhân sự để xóa");
}
}

- Truyền dữ liệu nhân viên vào datagridview.

-admim.cs

private void loadStaff(List<Staff> staffList)

dataGridView4.DataSource = null;

dataGridView4.DataSource = staffList;

- Hiển thị thông tin nhân viên lên các textbox.

-admim.cs

private void hienthistaff(Staff staff)

textBoxID.Text = staff.ID.ToString();

textBoxName.Text = staff.Name;

Chucvutext.Text = staff.ChucVu;

textGT.Text = staff.GioiTinh;

numericLuongNgay.Value = staff.LuongNgay;

72
numericNgayLam.Value = staff.NgayLam;

Ngaysinh.Value = staff.Birth;

- Tìm nhân viên.

-admim.cs

private void Findstaff_Click(object sender, EventArgs e)


{
string keyword = textBoxFindstaff.Text.Trim();
string role = comboBox1.SelectedItem != null ?
comboBox1.SelectedItem.ToString() : null;
if (role == null)
{
List<Staff> searchResult = crtstaff.SearchStafByName(keyword);
loadStaff(searchResult);
}
else
{
List<Staff> searchResult = crtstaff.SearchStafByName(keyword)
.Where(staff => staff.Role == role)
.ToList();
loadStaff(searchResult);
}
}
- Điểm danh nhân viên.

-admim.cs

private void buttondiemdanh_Click(object sender, EventArgs e)

73
{
crtstaff.readStaff();
int selectedIndex = dataGridView4.CurrentCell.RowIndex;
Staff selectedStaff = crtstaff.Staffs[selectedIndex];
h.diemdanhNV(selectedStaff);
crtstaff.UpdateNgayLam(selectedStaff.ID,selectedStaff.NgayLam);
crtstaff.readStaff();
}

3.8. Cập nhật tài khoản.

- Cập nhật tài khoản của người đăng nhập.

-account.cs

void UpdateAccountInfo()
{
string username = textBox1.Text;
string password = textBox3.Text;
string newpass = textBox4.Text;
string reenterPass = textBox5.Text;
string hashedPassword;
string hashedNewPassword;
string hashedReenterPassword;
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
byte[] hashedBytes = sha256.ComputeHash(passwordBytes);
hashedPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();
}

74
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(newpass);

byte[] hashedBytes = sha256.ComputeHash(passwordBytes);

hashedNewPassword = BitConverter.ToString(hashedBytes).Replace("-",
"").ToLower();

}
using (SHA256 sha256 = SHA256.Create())
{
byte[] passwordBytes = Encoding.UTF8.GetBytes(reenterPass);
byte[] hashedBytes = sha256.ComputeHash(passwordBytes);
hashedReenterPassword =
BitConverter.ToString(hashedBytes).Replace("-", "").ToLower();
}
if (!newpass.Equals(reenterPass) || newpass.Length < 8)
{
MessageBox.Show("Vui lòng nhập lại mật khẩu đúng với mật khẩu mới!
và mật khẩu mới phải có ít nhất 8 kí tự");
}
else
{
ControlAcc accountControl = new ControlAcc();
// Đọc danh sách tài khoản từ file XML
accountControl.readcate();
if (accountControl.UpdateAccount(username, displayname,
hashedPassword, hashedNewPassword, hashedReenterPassword))

75
{
MessageBox.Show("Cập nhật thành công");
// Phát sự kiện cập nhật tài khoản
if (updateAccount != null)
updateAccount(this, new
AccountEvent(accountControl.Acccouts.Find(acc => acc.UserName ==
username)));
}
else
{
MessageBox.Show("Vui lòng điền đúng mật khẩu");
}
}

private void update_Click_1(object sender, EventArgs e)

UpdateAccountInfo();

76
Phần 4 kết luận

4.1. kết luận

Trong quá trình triển khai đồ án xây dựng ứng dụng quản lý nhà hàng,
chúng em đã tích lũy được nhiều kiến thức quan trọng và phát triển kỹ năng đa
dạng. Việc làm việc với lập trình hướng đối tượng giúp chúng em hiểu rõ về
cách thiết kế và tương tác giữa các đối tượng, trong khi quản lý dữ liệu XML
đưa ra cái nhìn chi tiết về việc lưu trữ thông tin về thực đơn và món ăn, tuy rằng
việc truy xuất dữ liệu vẫn còn gặp một chút khó khan.

Không chỉ giới hạn ở mức cơ bản, đồ án còn đặt ra những thách thức về
thiết kế cơ sở dữ liệu và quản lý chức năng của ứng dụng. Việc xây dựng mô
hình dữ liệu và bảng cơ sở dữ liệu giúp chúng em nắm bắt cách tổ chức thông
tin một cách hiệu quả, trong khi quản lý các chức năng quan trọng như quản lý
thực đơn, hóa đơn và bàn ăn đã tăng cường kỹ năng quản lý và phát triển phần
mềm của chúng em.

Đồng thời, quá trình thiết kế giao diện người dùng không chỉ tập trung
vào khả năng tương tác mà còn chú trọng vào việc làm cho giao diện trở nên
trực quan và dễ sử dụng. Điều này bao gồm việc thiết kế mô hình giao diện và
xây dựng sơ đồ trang và luồng điều hướng.

Ngoài những kỹ năng kỹ thuật, quá trình làm việc nhóm còn giúp chúng
em học cách hợp tác, chia sẻ ý tưởng và giải quyết vấn đề cùng nhau. Đồng thời,
việc tương tác với người dùng cuối cùng giúp chúng em điều chỉnh ứng dụng
dựa trên phản hồi thực tế, tạo ra một sản phẩm phản ánh chính xác nhu cầu của
người sử dụng.

Tổng cộng, đồ án không chỉ là một dự án lập trình mà còn là một hành
trình học tập và phát triển nhiều kỹ năng khác nhau, từ quản lý dự án đến tương
tác với người dùng và thiết kế giao diện người dùng. Chúng em tin rằng ứng

77
dụng quản lý nhà hàng sẽ mang lại giá trị cho cả nhóm phát triển và người sử
dụng cuối cùng.

4.2 định hướng phát triển

Đối với định hướng phát triển của ứng dụng quản lý nhà hàng, chúng em
đặt ra một số hướng cụ thể để nâng cao tính linh hoạt và sức mạnh của ứng
dụng:

- Tích hợp Thanh Toán Trực Tuyến: Phát triển tính năng thanh toán trực
tuyến để tối ưu hóa quá trình thanh toán và cải thiện trải nghiệm người
dùng.
- Phân Quyền và Đăng Nhập Nhân Viên: Xây dựng hệ thống quản lý người
dùng với các mức độ quyền khác nhau cho nhân viên, quản lý và quản trị
viên.
- Thống Kê và Báo Cáo: Mở rộng khả năng thống kê và báo cáo để cung
cấp thông tin chi tiết về doanh thu, mức độ sử dụng bàn, và món ăn phổ
biến.
- Tích Hợp Hệ Thống Đặt Bàn Online: Tạo tính năng đặt bàn trực tuyến để
khách hàng có thể dễ dàng đặt chỗ qua ứng dụng di động hoặc trang web.
- Tối Ưu Hóa Giao Diện Người Dùng di động: Phát triển ứng dụng di động
hoàn chỉnh hoặc tối ưu hóa giao diện để đảm bảo trải nghiệm người dùng
mượt mà trên các thiết bị di động.
- Bảo Mật và Tuân Thủ Pháp Luật: Tăng cường bảo mật hệ thống và đảm
bảo tuân thủ các quy định pháp luật liên quan đến quản lý thông tin cá
nhân và thanh toán trực tuyến.

- Những hướng phát triển này sẽ giúp ứng dụng không chỉ đáp ứng nhu cầu
hiện tại mà còn mở rộng khả năng và tính năng để đáp ứng những thách
thức và cơ hội trong tương lai.

78

You might also like