1.Mô tả bài toánKhách hàng muốn đặt phòng tại khách sạn, sẽ cần lựa chọn loại phòngphòng đơn, phòng đôi,giường lớn, giường nhỏ … và phương thức thuê phòng thuê theo giờ, thuê qua
Trang 1Khoa Công nghệ Thông tin
Bộ môn Công nghệ Phần mềm
Đề tài: Quản lý khách sạn
Nhóm thực hiện: 06 – lớp 63IT3
Giáo viên hướng dẫn: Nguyễn Đình Anh
Các thành viên:
1) Đỗ Mạnh Tuấn (Nhóm trưởng)
2) Đinh Kim Bảo Long
3) Hoàng Xuân Tiến
Trang 21.Mô tả bài toán
Khách hàng muốn đặt phòng tại khách sạn, sẽ cần lựa chọn loại phòng(phòng đơn, phòng đôi,giường lớn, giường nhỏ … ) và phương thức thuê phòng (thuê theo giờ, thuê qua ngày ,thuê qua đêm) lễ tân kiểm tra xem yêu cầu của khách hàng có đáp ứng được hay không, nếu không đáp ứng được sẽ thông báo lại cho khách, nếu đáp ứng được thì kiểm tra chứng minh thư, giữ lại chứng minh thư hoặc giữ tiền cọc và bắt đầu tính giờ vào, sau đó hỏi khách có cần đồ ăn đồ uống gì không và đưa khách chìa khóa phòng
Khi khách muốn trả phòng thì lễ tân gọi nhân viên buồng phòng lên kiểm tra lại phòng, tính xem khách có sử dụng đồ có phí của khách sạn không xong thông báo xuống Lễ tân kiểm tra thông tin về phòng khách thuê và tính tổng hóa đơn từ lúc khách bắt đầu nhận phòng, trả phòng và phí phát sinh Đưa khách hóa đơn, chứng minh thư và thanh toán
Trường hợp khách muốn cọc trước 1 phần tiền thì hệ thống sẽ lưu lại số tiền cọc trước của khách
Trường hợp khi kiểm tra phòng khách muốn trả mà thấy thiếu đồ hoặc hỏng đồ của khách sạn thì sẽ tính tiền thiệt hại và thêm vào phí phát sinh
Trong trường hợp khách muốn nợ tiền thì lễ tân sẽ ghi nhận tiền khách nợ và lưu vào hệ thống, hệ thống sẽ lưu lại thông tin khách nợ, số tiền nợ và thời gian nợ Trường hợp khách quá số giờ đã đặt thì hệ thống sẽ tính giờ phụ thu theo mức giá
có sẵn, nếu khách quá nhiều giờ thì hệ thống sẽ chuyển đổi phương thức thuê phòng của khách
Mỗi lần chuyển ca hệ thống sẽ tính tổng tiền ca trước và giao lại cho ca sau
Cuối mỗi ngày hệ thống sẽ đưa ra báo cáo của ngày đấy , cuối mỗi tháng hệ thống đưa ra báo cáo của tháng đấy
Trang 32.Phân tích dữ liệu và vẽ sơ đồ thực thể liên kết
a Lập bảng phân tích
Đặt + phòng
Chọn + loại phòng
Chọn + phương thức thuê
Kiểm tra + yêu cầu
Giữ + chứng minh thư
Giữ + tiền cọc
Tính + giờ vào
Hỏi + nhu cầu ăn uống
Đưa + chìa khóa
Trả + phòng
Gọi + buồng phòng
Kiểm tra + phòng
Thanh toán + hóa đơn
Cọc + tiền
Ghi nhận + tiền cọc
Nợ + tiền
Ghi nhận + tiền nợ
Tính + giờ phụ thu
Chuyển đổi + phương thức
thuê
Chuyển + ca
Tính + tiền ca
Khách Phòng Loại phòng Phương thức thuê phòng
Lê tân Chứng minh thư Tiền cọc
Đồ ăn uống Chìa khóa phòng Nhân viên buồng phòng
Hóa đơn Tiền nợ Thời gian ở
Giờ phụ thu Ca
Báo cáo Phí phát sinh
Tác nhân
Hồ sơ dữ liệu
Hồ sơ dữ liệu
Hồ sơ dữ liệu Tác nhân
Hồ sơ dữ liệu
Hồ sơ dữ liệu
Hồ sơ dữ liệu
= Tác nhân
Hồ sơ dữ liệu
Hồ sơ dữ liệu
Hồ sơ dữ liệu
Hồ sơ dữ liệu
=
Hồ sơ dữ liệu
Hồ sơ dữ liệu
Trang 41 2 3
Trang 5Loại phòng x
Dịch vụ
Ca làm
Sự cố phát sinh
Trang 6b.Vẽ sơ đồ thực thể liên kết
Trang 7c.Mô hình quan hệ(dạng 3NF)
Khách (số điện thoại, họ tên, địa chỉ, chứng minh thư)
Hóa đơn(mã hóa đơn,số lượng phòng, tổng tiền, số điện thoại,thời gian lập hóa đơn,phương thức thanh toán,tiền cọc,tiền nợ, mã nhân viên, tình trạng)
Phân quyền(ID, tên, ghi chú)
Nhân viên(mã nhân viên,họ tên nhân viên, chức vụ,ID)
Ca làm(mã ca, lương theo ca)
Phòng(mã phòng, mã loại phòng, trạng thái)
Loại phòng (mã loại phòng, tên loại phòng)
Phương thức thuê (mã phương thức thuê, tên phương thức thuê)
Dịch vu(mã dịch vụ, tên dịch vụ, đơn giá dịch vụ)
Sự cố phát sinh(mã sự cố, tên sự cố,phí phát sinh)
Bảng công(mã nhân viên, mã ca,ngày)
Chi tiết loại phòng (mã loại phòng, mã phương thức thuê,đơn giá)
Chi tiết hóa đơn(mã hóa đơn, mã phòng, thời gian ra dự kiến, thời gian ra, thời gian vào, mã phương thức thuê)
Chi tiết dịch vụ phòng(mã hóa đơn, mã phòng, mã dịch dịch vụ,số lượng dịch vụ) Chi tiết sự cố phát sinh(mã hóa đơn, mã phòng, mã sự cố, số lượng sự cố)
Trang 83.Mô tả các ràng buộc
Khách Tên trường Kiểu dữ
liệu Kích thước Ràng buộc Ghi chú
Hóa đơn Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Phương thức
Thời gian lập
Phân quyền Tên trường Kiểu dữ
liệu Kích thước Ràng buộc Giá trị mặc định Ghi chú
Trang 9key quyền
Nhân viên Tên trường Kiểu dữ liệu Kích thước Ràng buộc Giá trị
mặc đinh Ghi chú
PhanQuyenI
Ca làm Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Phòng Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Trang 10Loại phòng Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Phương thức thuê
liệu Kích thước Ràng buộc Ghi chú
Tên phương thức thuê nVarcha
Dịch vụ Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Đơn giá dịch vụ money
Sự cố phát sinh Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Phí phát sinh money
Bảng công Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Trang 11Ngày dateTime Not null
Chi tiết loại phòng Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Chi tiết hóa đơn Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Thời gian ra dự kiến Date time
Thời gian vào Date time
Chi tiết dịch vụ phòng Tên trường Kiểu dữ liệu Kích thước Ràng buộc Ghi chú
Số lượng dịch vụ tinyint
Chi tiết sự cố phát sinh Tên trường Kiểu dữ
liệu Kích thước Ràng buộc Ghi chú
Trang 12Mã phòng Char 5 Khóa chính
Số lượng sự cố tinyint
5 Các vấn đề nghiệp vụ của bài toán và cách xử lý
a Các nghiệp vụ
Quản lý thông tin(thêm, sửa, xóa) : phòng, khách, dịch vụ, ca làm, loại phòng,
phương thức thuê, sự cố
Chức năng đặt phòng: tạo hóa đơn(tạo mã hóa đơn(tự tăng), giờ vào, thông tin khách
hàng(sdt), thông tin nhân viên(MaNV)), chọn phòng , chọn phương thức thuê, ghi nhận tiền cọc
Chức năng cập nhật hóa đơn: thêm dịch vụ và số lượng sử dụng, cập nhật số lượng
dịch vụ , đổi phòng
Chức năng trả phòng: in hóa đơn(tính tổng tiền(tiền dịch vụ, tiền phòng, tiền phát
sinh),in hóa đơn, giờ ra), ghi nhận tiền nợ, chọn phương thức thanh toán
Chức năng báo cáo : báo cáo doanh thu (ca, ngày, tháng), thông kê lương nhân viên Chức năng đăng nhập: ghi nhận nhân viên, ca làm.
b Cách xử lý
Quản lý thông tin(thêm, sửa, xóa) : phòng, khách, dịch vụ, ca làm, loại phòng,
phương thức thuê, sự cố
- Thêm khách hàng
Create ProC Insert_Khachhang
@SoDT Char ( 10 ),
@Hoten nvarchar ( 50 ),
@CMT char ( 12 ),
@DiaChi nvarchar ( 50 )
As
Begin
Insert Into KhachHang ( SoDT , Hoten , CMT , DiaChi )
Values ( @SoDT , @Hoten , @CMT , @DiaChi )
Trang 13End ;
- Sửa thông tin khách hàng
Create ProC Update_Khachhang
@SoDT Char ( 10 ),
@Hoten nvarchar ( 50 ),
@CMT char ( 12 ),
@DiaChi nvarchar ( 50 )
As
Update KhachHang
Set
SoDT = @SoDT ,
Hoten = @Hoten ,
CMT = @CMT ,
DiaChi = @DiaChi
Where SoDT = @SoDT
End ;
- Xóa thông tin khách hàng
Create ProC Delete_Khachhang
@SoDT Char ( 10 )
As
Delete From KhachHang
Where SoDT = @SoDT
End ;
- Các table còn lại làm tương tự như table khách hàng
Chức năng đặt phòng: tạo hóa đơn(tạo mã hóa đơn, giờ vào, thông tin khách hàng,
thông tin nhân viên), chọn phòng , chọn phương thức thuê, ghi nhận tiền cọc
+ Sử dụng lệnh Insert Into để ghi nhận các dữ liệu vào bảng Hóa Đơn và Chi Tiết Hóa Đơn ví dụ như”
Insert Into HoaDon Values ( '0987654321' , '1' , '100000' , '0' , '0' , GETDATE (),0)
Insert Into HoaDon Values ( '0987654324' , '2' , '500000' , '0' , '0' , GETDATE (),0)
Insert Into HoaDon Values ( '0987654323' , '3' , '700000' , '0' , '0' , GETDATE (),0)
Insert Into CTHD Values ( '7' , 'P2003' , 'N' , '2021-10-06' , GETDATE (),null)
Insert Into CTHD Values ( '7' , 'P2001' , 'N' , '2021-10-05' , GETDATE (),null)
Insert Into CTHD Values ( '8' , 'P2005' , 'D' , '2021-10-04' , GETDATE (),null)
Insert Into CTHD Values ( '9' , 'P2007' , 'N' , '2021-10-06' , GETDATE (),null)
Trang 14+ Khi thêm Phòng vào Hóa Đơn (insert vào bảng CTHD) thì trạng thái của Phòng đó sẽ được cập nhật lại bằng trigger sau:
Create Trigger Thm_CTHD ON CTHD After Insert As
Begin
Update Phong Set TrangThai = 0
From Phong
Join inserted ON Phong MaPhong = inserted MaPhong
END
Chức năng cập nhật hóa đơn: thêm dịch vụ và số lượng sử dụng, cập nhật số lượng
dịch vụ, đổi phòng
- Phần thêm dịch vụ:
+ Sử dụng: lệnh INSERT INTO ChiTietDichVuPhong VALUES (…)
+ Nhưng câu lệnh INSERT này gặp vấn đề là có thể thêm dịch vụ vào 1 phòng không thuộc hóa đơn(Thêm phòng ở chức năng đặt phòng) Nên cần phải có 1 TRIGGER để ngăn chặn điều đó
+ Khi sử dụng lệnh INSERT này thì giá trị của số lượng dịch vụ đó sẽ được cộng thêm vào HoaDon.TongTien nên ta sử dụng trigger after insert
+ Tạo trigger là trg_insertCTDVP:
CREATE TRIGGER trg_insertCTDVP
ON dbo ChiTietDichVuPhong
For INSERT
AS
BEGIN
DECLARE @count INT 0
SELECT @count = Count (*) FROM inserted
WHERE EXISTS SELECT FROM CTHD
WHERE MaHD = inserted MaHD AND MaPhong =
inserted MaPhong )
IF ( @count = 0 )
BEGIN PRINT N'Không thêm được vì không có hóa đơn này hoặc phòng này trong hóa đơn'
ROLLBACK TRAN END
END
+ Tạo trigger trg_afterinsertCTDVP:
CREATE TRIGGER trg_afterinsertCTDVP
ON dbo ChiTietDichVuPhong
AFTER INSERT
AS
Trang 15UPDATE HoaDon
SET TongTien = TongTien +
( SELECT SoLuongDichVu
from inserted WHERE MaHD = inserted MaHD AND MaPhong =
inserted MaPhong )*
( SELECT DonGiaDichVu
FROM DichVu JOIN inserted on DichVu MaDichVu = inserted MaDichVu )
FROM HoaDon JOIN inserted on HoaDon MaHD = inserted MaHD
END
- Cập nhật số lượng dịch vụ: Cập nhật số lượng ở bảng CTDVP và cập nhật lại vào HoaDon.TongTien
+ Sử dụng: Stored procedure để ta có thể dễ dàng thực thi hơn Dùng trigger để cập nhật lại TongTien trong bảng HoaDon
+ Để thực thi gọi :
EXEC usp_updateCTDVP MaHD, MaPhong, MaDV, SoLuongThem
+ Tạo Stored Procedure là usp_apdateCTDVP:
CREATE PROC usp_updateCTDVP
@Mahd INT , @MaPhong CHAR ( ), @MaDV CHAR ( ), @so TINYINT
AS
BEGIN
UPDATE ChiTietDichVuPhong
SET SoLuongDichVu = @so
WHERE MaHD = @Mahd AND MaPhong = @MaPhong AND MaDichVu = @MaDV
END
+ Tạo trigger là trg_afterupdateCTDVP:
CREATE TRIGGER trg_afterupdateCTDVP
ON dbo ChiTietDichVuPhong
AFTER UPDATE
AS
BEGIN
UPDATE HoaDon
SET TongTien = TongTien +
( ( SELECT SoLuongDichVu FROM inserted
WHERE MaHD = inserted MaHD and MaPhong =
inserted MaPhong )-( SELECT SoLuongDichVu FROM deleted
WHERE MaHD = deleted MaHD and MaPhong = deleted MaPhong ) )
*
( SELECT DonGiaDichVu
FROM DichVu JOIN inserted on DichVu MaDichVu = inserted MaDichVu )
FROM HoaDon JOIN inserted on HoaDon MaHD = inserted MaHD
END
Trang 16- Trường hợp đổi phòng:
+ Cập nhật sự cố tại phòng đó vào bảng ChiTietSuCoPhatSinh nếu có bằng lệnh Insert Và cũng cần có 1 Trigger(trg_insertCTSCPS) để tránh lỗi Insert vào bảng như phần thêm dịch vụ tại bảng ChiTietDichVuPhong
+ Cập nhật lại HoaDon.TongTien
Trigger trg_insertCTSCPS:
CREATE TRIGGER trg_insertCTSCPS
ON dbo ChiTietSuCoPhatSinh
For INSERT
AS
BEGIN
DECLARE @count INT 0
SELECT @count = Count (*) FROM inserted
WHERE EXISTS SELECT FROM CTHD
WHERE MaHD = inserted MaHD AND MaPhong =
inserted MaPhong )
IF ( @count = 0 )
BEGIN PRINT N'Không thêm được vì không có hóa đơn này hoặc phòng này trong hóa đơn'
ROLLBACK TRAN END
END
Trigger trg_afterinsertCTSCPS
CREATE TRIGGER trg_afterinsertCTSCPS
ON dbo ChiTietSuCoPhatSinh
AFTER INSERT
AS
BEGIN
UPDATE HoaDon
SET TongTien = TongTien + ( SELECT SoLuongSuCo FROM inserted
WHERE MaHD = inserted MaHD and MaPhong = inserted MaPhong )* ( SELECT PhiPhatSinh FROM SuCoPhatSinh
join inserted on SuCoPhatSinh MaSuCo = inserted MaSuCo )
FROM HoaDon JOIN inserted on HoaDon MaHD = inserted MaHD
END
+ Tiếp theo ta cần phải thay đổi trạng thái từ 0 (đang thuê) của phòng đang dùng về -1 (dọn phòng, sửa chữa) Bằng cách execute usp_updateTTP(stored
procedure):
CREATE PROC usp_updateTTP
Trang 17@MaPhong CHAR ( ), @TrangThai int
AS
BEGIN
UPDATE Phong
SET TrangThai = @TrangThai
WHERE MaPhong = @MaPhong
END
+ Chọn lại phòng với MaHD hiện tại (với thời gian vào được set là thời gian
đổi phòng)
Chức năng trả phòng: tính tổng tiền(tiền dịch vụ + tiền phòng + tiền phát sinh), ghi
nhận giờ ra, ghi nhận tiền nợ, chọn phương thức thanh toán, in hóa đơn
+ Phần tính tổng tiền sẽ được tự động tính nhờ trigger(phần trên)
+ Ghi nhận giờ ra, tiền nợ, chọn phương thức thanh toán sẽ sử dụng lệnh update thông thường
+ Phần in hóa đơn:
Xuất tất cả thông tin của hóa đơn đó ra 1 bản biểu mẫu(làm sau) ,
tự động cập nhật lại trạng thái phòng về -1(trạng thái dọn-sửa chữa)
Sau khi in hóa đơn sẽ cập nhật lại tình trạng hóa đơn từ 0(chưa thanh toán) thành 1(đã thanh toán)
Chức năng báo cáo : báo cáo doanh thu (ca, ngày, tháng), thông kê lương nhân viên Chức năng đăng nhập(Login): ghi nhận nhân viên, ca làm và thêm thông tin nhân
viên
- Login
GO
if ( OBJECT_DEFINITION ( 'ft_login' ) is not null) drop function ft_login ;
GO
Trang 18CREATE FUNCTION ft_Login ( @taikhoan varchar ( 300 ), @matkhau varchar ( 300 )) RETURNS smallint
AS
BEGIN
if ( @taikhoan is null or @matkhau is null)
begin
return 1
end else begin
IF ( select MaNV from NhanVien where NhanVien TaiKhoan = @taikhoan and
NhanVien MatKhau = @matkhau ) is null
RETURN 3 ELSE BEGIN
RETURN ( select top ( ) MaNV from NhanVien where
NhanVien TaiKhoan = @taikhoan and NhanVien MatKhau = @matkhau order by MaNV )
end end return 1
end
- Thêm nhân viên:
GO
if ( OBJECT_DEFINITION ( 'ft_login' ) is not null) drop function ft_login ;
GO
CREATE FUNCTION ft_Login ( @taikhoan varchar ( 300 ), @matkhau varchar ( 300 )) RETURNS smallint
AS
BEGIN
if ( @taikhoan is null or @matkhau is null)
begin
return 1
end else begin
IF ( select MaNV from NhanVien where NhanVien TaiKhoan = @taikhoan and
NhanVien MatKhau = @matkhau ) is null
RETURN 3 ELSE BEGIN
RETURN ( select top ( ) MaNV from NhanVien where
NhanVien TaiKhoan = @taikhoan and NhanVien MatKhau = @matkhau order by MaNV )
end end return 1
end go
select from NhanVien
select dbo ft_Login ( 2 , 3 )
go
Trang 19create proc pr_login @taikhoan varchar ( 300 ), @matkhau varchar ( 300 )
as
begin
declare @manhanvien smallint
set @manhanvien = dbo ft_Login ( @taikhoan , @matkhau )
declare @thoigian int
set @thoigian = DATENAME ( hour , getdate ())
print @thoigian
declare @maca char
declare @ngay date
set @ngay = GETDATE ()
print @ngay
if ( @thoigian > 5 and @thoigian < 13 )
begin
set @maca = 'N'
insert into BangCong ( MaNV , MaCa , Ngay )
values ( @manhanvien , @maca , @ngay )
end
else
if ( @thoigian >= 13 and @thoigian < 21 )
begin
set @maca = 'C'
insert into BangCong ( MaNV , MaCa , Ngay )
values ( @manhanvien , @maca , @ngay )
end else
begin
set @maca = 'D'
insert into BangCong ( MaNV , MaCa , Ngay )
values ( @manhanvien , @maca , @ngay )
end
End
- Xóa tài khoản nhân viên:
go
CREATE PROCEDURE pr_delete_nhanvien @Result int output , @Cur_PhanQuyen_ID
smallint , @manhanvien smallint
as
begin
if ( @cur_phanquyen_id = 1 )
begin
begin try
delete from NhanVien where @manhanvien = MaNV
set @Result = 1 thanh cong
end try begin catch
set @Result =- 1 that bai