Phân quyền cho các đối tượng sử dụng - Nhân viên lễ tân : nhập các thông tin của khách hàng khi tiếp đón khách, cácthông tin giao dịch với khách hàng, thanh toán cho khách hàng khi họ tr
Trang 1I Mô tả các chức năng của hệ thống.
1 Phân quyền cho các đối tượng sử dụng
- Nhân viên lễ tân : nhập các thông tin của khách hàng khi tiếp đón khách, cácthông tin giao dịch với khách hàng, thanh toán cho khách hàng khi họ trả phòng
- Nhân viên phục vụ : nhập các thông tin sử dụng dịch vụ của khách hàng, cậpnhật sự thay đổi giá sử dụng dịch vụ
- Nhân viên quản lý phòng : cập nhật trang thiết bị của từng phòng, phân hạngphòng, giá thuê của từng loại phòng, thông tin về thay đổi của phòng thuê
- Nhân viên quản trị hệ thống : cập nhật thêm danh sách nhân viên mới và cấpquyền sử dụng cho những người có nhiệm vụ
- Giám đốc khách sạn : xem các thông tin tổng hợp về công việc kinh doanh củakhách sạn
2 Chức năng của hệ thống
- Quản lý danh sách phòng, các tiện nghi trong phòng, số giường và trạng tháicủa phòng
- Quản lý các yêu cầu đặt phòng, thuê phòng của các khách hàng
- Quản lý các thông tin về khách hàng, ghi nhận các khách hàng đặc biệt và cóchính sách ưu tiên đối với các khách hàng quen
- Theo dõi và thống kê việc sử dụng dịch vụ của khách hàng (điện thoại, ănuống, giặt là…)
- Cho phép in các hóa đơn thanh toán khi khách hàng trả phòng
- Hệ thống có thể in ra các báo cáo thống kê tình hình kinh doanh của kháchsạn
II Thiết kế CSDL
1 Cấu trúc các bảng.
a) [QuanLyPhong].[GIAPHONG]
Column Name Description Datatype Length Allow Null
b) [QuanLyPhong].[PHONG]
Column Name Description Datatype Length Allow Null
Trang 2SoPhong Số phòng Khóa chính MA:varchar 10
LoaiPhong Loại phòng Khóa ngoại của
GIAPHONG.GiaPhong
Varchar 20
c) [LeTan].[KHACHHANG]
Column Name Description Datatype Length Allow Null
MaKH Mã khách hàng Khóa chính MA:varchar 10
d) [QuanTri].[NHANVIEN]
Column Name Description Datatype Length Allow Null
Trang 3MaNV Mã nhân viên Khóa chính MA:varchar 10
CapTren Cập trên trực tiếp quản lý
Khóa ngoại của NHANVIEN.MaNV
SoPhong Số phòng Khóa chính Khóa
ngoại của PHONG.SoPhong
MA:varchar 10
NgayMuon Ngày mượn phòng Datetime
f) [LeTan].[HOADON]
Column Name Description Datatype Length Allow Null
MaHD Mã hóa đơn Khóa chính MA:varchar 10
MaKH Mã khách hàng Khóa ngoại
Trang 4MaHD Mã hóa đơn Khóa chính
Khóa ngoại của HOADON.MaHD
MA:varchar 10
SoPhong Số phòng Khóa chính Khóa
ngoại của PHONG.SoPhong
MA:varchar 10
ThoiGian(ngay) Thời gian ở Int
h) [PhucVu].[DICHVU]
Column Name Description Datatype Length Allow Null
MaDV Mã dich vụ Khóa chính MA:varchar 10
i) [LeTan].[DATPHONG]
Column Name Description Datatype Length Allow Null
Phong Phòng cần đặt Khóa ngoại
của PHONG.SoPhong
TEN:varchar 50
NgayDat Ngày đặt phòng Datetime
NgayMuon Ngày mượn phòng Datetime
j) [PhucVu].[SUDUNGDV]
Trang 5Column Name Description Datatype Length Allow Null
2 Sơ đồ quan hệ giữa các bảng.
III Mô tả các thủ tục, hàm và trigger.
+ Nhập MaDH, SoPhong, ThoiGian, Gia
+ Tính TinhTien = ThoiGian * Gia
+ Chèn dữ liệu vào bảng [LeTan].[CTHD]
b) Thủ tục nhập MUONTRAPHONG
Trang 6- Tên : LeTan.proc_MUON
- Kết quả thực hiện : Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG]
- Các bước thực hiện :
+ Nhập MaKH, SoPhong
+ Lấy NgayMuon = ngày hệ thống
+ Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
+ Nhập vao MaKH, MaDV, SL
+ Kiểm tra khách hàng có trong bảng KHACHHANG hay không
Nếu có :
+ Lấy giá của dịch vụ từ bảng DICHVU+ Tính tiền = Gia*SL
+ Chèn dữ liệu vào bảng [PhucVu].[SUDUNGDV]
Ngược lại : Thông báo khách hàng không tồn tại
e) Thủ tục in hóa đơn thanh toán
- Tên : LeTan.proc_INHD
- Kết quả thực hiện : In hóa đơn cho khách hàng
- Các bước thực hiện :
+ Nhập MaKH
Trang 7+ Kiểm tra khách hàng đã được lập hóa đơn chưa
Nếu có :
+ Lấy tên khách hàng từ bảng KHACHHANG+ Tính tổng tiền thuê phòng của khách hàng từ bảng HOADON vàCTHD
+Tính tiền sử dụng dịch vụ của khách hàng đó+ Tính tổng tiền phải trả = tiền thuê phòng + tiền sử dụng dịch vụNgược lại : thông báo khách hàng không tồn tại
+ Nhập mã nhân viên cần tìm kiếm
+ Tạo một bảng tạm có cấu trúc giống với bảng gốc ([QuanTri].[NHANVIEN])+ Chèn thông tin các nhân viên có cấp trên là mã nhân viên nhập vào
+ Tìm kiếm các nhân viên có cấp trên là mã nhân viên vừa chèn vào
+ Thông báo không thể tạo login
b) Trigger khi chèn dữ liệu vào bảng [LeTan].[DATPHONG]
- Tên : tg_DATPHONG
- Kết quả thực hiện :
+ Nhập thông tin vào bảng [LeTan].[DATPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG]
- Các bước thực hiện :
Trang 8+ Lấy các giá trị HoTen,Tuoi, GioiTinh, DiaChi, NgheNghiep, SDT, CMND,SoPhong từ dữ liệu nhập vào.
+ Kiểm tra TrangThai của phòng ứng với giá trị SoPhong nhập vào trongbảng [QuanLyPhong].[PHONG] có còn trống không
Nếu có :
+ Chèn dữ liệu vào bảng [LeTan].[DATPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG] là ‘Da Dat’
Ngược lại :
+ Thông báo phòng đã có người ở
c) Trigger khi chèn dữ liệu vào bảng [LeTan] [MUONTRAPHONG]
- Tên : tg_MUON
- Kết quả thực hiện :
+ Nhập thông tin vào bảng [LeTan].[MUONTRAPHONG]
+ Cập nhật TrangThai của phòng trong bảng [QuanLyPhong].[PHONG]+ Xóa dữ liệu trong bảng [LeTan].[DATPHONG]
- Các bước thực hiện :
+ Lấy các giá trị MaKH, SoPhong, NgayMuon từ dữ liệu nhập vào
+ Nếu phòng còn trống thì :
Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
Cập nhật trạng thái của phòng = full+ Nếu khách hàng đã đặt phòng trước thì :
Chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
Cập nhật trạng thái của phòng = fullXóa dữ liệu trong bảng [LeTan].[DATPHONG]
d) Trigger khi thực hiện trả phòng.
- Tên : tg_TRA
- Kết quả thực hiện :
+ Cập nhật NgayTra trong bảng [LeTan].[MUONTRAPHONG]
+ Cập nhật lại TrangThai cua phong = Trong
+ Chèn dữ liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD]
- Các bước thực hiện :
Trang 9+ Nếu NgayTra có sự thay đổi từ NULL sang NOT NULL :
Cập nhật NgayTra bảng [LeTan].[MUONTRAPHONG] = ngày hệ thốngCập nhật lại TrangThai cua phong = Trong
Chèn dữ liệu vào bảng [LeTan].[HOADON], [LeTan].[CTHD]
+ Lấy các giá trị NgaySinh, NgayLam từ dữ liệu nhập vào
+ Tính tuổi của nhân viên đến thời điểm làm việc Nếu tuổi < 18 thì thông báongười này chưa đủ tuổi làm việc
IV Mô tả các View
1 VIEW tìm phòng trống
- Tên : QuanLyPhong.v_TimPhongTrong
- Kết quả thực hiện : Hiển thị danh sách các phòng còn trống
2 VIEW thống kê hóa đơn
1 loginQuanTri ANY PERMISSION
2 loginLeTan CONNECT SQL, VIEW ANY DATABASE
3 loginPhucVu CONNECT SQL, VIEW ANY DATABASE
4 loginQuanLyPhong CONNECT SQL, VIEW ANY DATABASE
5 loginKhachHang CONNECT SQL, VIEW ANY DATABASE
6 loginGD CONNECT SQL, VIEW ANY DATABASE
2 Tạo các user
Trang 10STT Tên user Quyền
1 userQuanTri - Cập nhật bảng [QuanTri].[NHANVIEN]- Cấp quyền cho người sử dụng
1 db_QuanTri - Cập nhật bảng [QuanTri].[NHANVIEN]- Cấp quyền cho người sử dụng
2 db_NV - Có quyền SELECT trên các schema QuanTri, LeTan,PhucVu, QuanLyPhong
Trang 11- db_QuanTri
Trang 13- db_NV
Trang 15- db_KH
Trang 17b) Cấp phát quyền cho user
- userLeTan
Trang 18- userKhachHang
- userGD
Trang 195 Cấp phát quyền cho role và user sử dụng các câu lệnh T-SQL
a) Cấp phát quyền cho role
- db_QuanTri
grant insert , update , delete on SCHEMA :: quantri to db_QuanTri deny insert , update , delete on SCHEMA :: quanlyphong to db_QuanTri deny insert , update , delete on SCHEMA :: letan to db_QuanTri deny insert , update , delete on SCHEMA :: phucvu to db_QuanTri
- db_NV
grant select on SCHEMA :: phucvu to db_NV
grant select on SCHEMA :: letan to db_NV
grant select on SCHEMA :: quanlyphong to db_NV
grant select on SCHEMA :: quantri to db_NV
- db_KH
grant select on quanlyphong phong to db_KH
grant select on quanlyphong giaphong to db_KH
grant select on phucvu dichvu to db_KH
grant select,insert on letan datphong to db_KH
b) Cấp phát quyền cho user
grant select on letan v_ThongKe to userGD
VI Mã nguồn một số thủ tục, hàm, trigger.
DECLARE @Tien money
SET @Tien = ( @ThoiGian * @Gia )
INSERT INTO [LeTan] [CTHD]
values ( @mahd , @SoPhong , @ThoiGian , @Gia , @Tien )
Trang 20if exists ( select * from [LeTan] [MUONTRAPHONG]
where SoPhong = @phong and NgayTra is null)
BEGIN
UPDATE [LeTan] [MUONTRAPHONG] SET NgayTra = getdate ()
WHERE SoPhong = @phong
declare @tien money
declare @gia money
select @gia = GiaDV from phucvu dichvu where MaDV = @madv set @tien = @gia * @sl
insert into phucvu sudungdv values ( @makh , @madv , @sl , @tien ) END
else
BEGIN
print 'KHACH HANG K TON TAI!!!!!!!'
END
e) Thủ tục in hóa đơn thanh toán
CREATE PROC LeTan proc_INHD ( @makh MA )
WITH EXECUTE AS CALLER
Trang 21print ' =================='
declare @ten TEN
select @ten = HoTen from letan khachhang where MaKH = @makh
print 'Ho ten khach hang : ' + @ten
declare @mahd int
select @mahd = MaHD from letan hoadon where MaKh = @makh
declare @tienphong money
select @tienphong = SUM ( ThanhTien ) from letan CTHD
where MaHD = @mahd
print 'Tien phong : ' + cast ( @tienphong as
varchar ( 20 ))+ ' VND'
declare @tiendv money
select @tiendv = SUM ( ThanhTien ) from phucvu sudungdv
where MaKH = @makh
print 'Tien su dung dich vu : ' + cast ( @tiendv as varchar ( 20 ))
declare @tong money
set @tong = @tienphong + @tiendv
print 'Tong tien phai tra : ' + cast ( @tong as varchar ( 20 ))+ ' VND'
END
else
print 'KHACH HANG K TON TAI'
2 Hàm
Hàm tìm kiếm, thống kê trên dữ liệu có quan hệ đa cấp
CREATE FUNCTION fn_TimKiem ( @MaNV MA )
RETURNS
@Temple TABLE ( MaNV MA PRIMARY KEY ,
HoTen TEN not null,
NgaySinh datetime ,
DiaChi varchar ( 100 ),
NgayLam datetime not null,
ChucVu varchar ( 20 ) not null,
CapTren MA )
AS
BEGIN
DECLARE @RowsAdded int
DECLARE @reports TABLE ( MaNV MA PRIMARY KEY ,
HoTen TEN not null,
NgaySinh datetime ,
DiaChi varchar ( 100 ),
NgayLam datetime not null,
ChucVu varchar ( 20 ) not null,
CapTren MA ,
processed tinyint default 0 )
INSERT @reports SELECT MaNV , HoTen , NgaySinh , DiaChi ,
NgayLam , ChucVu , CapTren , 0
FROM [QuanTri] [NHANVIEN] WHERE MaNV = @MaNV
Trang 22SET @RowsAdded = @@rowcount
a) Trigger cấm không cho tạo LOGIN
CREATE TRIGGER tg_TaoLogin ON ALL SERVER
FOR CREATE_LOGIN
AS
Rollback
Begin Tran Save_to_data_log
INSERT INTO [DoAn.QLKS] [dbo] [TaoLogin] ( [LogDate] , [UserName] ) VALUES ( GetDate (), SYSTEM_USER )
Commit tran Save_to_data_log
RAISERROR ( 'Co loi: KHONG THE TAO MOI LOGIN!!!!' , 16 , 1 )
b) Trigger khi chèn dữ liệu vào bảng [LeTan].[DATPHONG]
CREATE TRIGGER tg_DATPHONG ON [LeTan] [DATPHONG]
INSTEAD OF INSERT
AS
declare @ten TEN
declare @tuoi int
declare @gioitinh varchar ( 3 )
declare @diachi varchar ( 100 )
declare @nghe varchar ( 100 )
declare @sdt varchar ( 11 )
declare @cmnd varchar ( 9 )
declare @phong MA
select @ten = HoTen , @tuoi = Tuoi , @gioitinh = GioiTinh ,
@diachi = DiaChi , @nghe = NgheNghiep , @sdt = SDT , @cmnd = CMND ,
@phong = Phong from inserted
if exists ( select * from [QuanLyPhong] [PHONG] where
SoPhong = @phong and TrangThai = 'Trong' )
BEGIN
Trang 23insert into [LeTan] [DATPHONG]
values ( @ten , @tuoi , @gioitinh , @diachi , @nghe , @sdt , @cmnd , @phong ,
update [QuanLyPhong] [PHONG] set TrangThai = 'Da Dat'
where SoPhong = @phong
c) Trigger khi chèn dữ liệu vào bảng [LeTan].[MUONTRAPHONG]
CREATE TRIGGER tg_MUON ON [LeTan] [MUONTRAPHONG]
select @cmnd = CMND from [LeTan] [KHACHHANG] where MaKH = @ma
if exists ( select * from [QuanLyPhong] [PHONG]
where SoPhong = @phong and TrangThai = 'Trong' )
BEGIN
insert into [LeTan] [MUONTRAPHONG]
values ( @ma , @phong , getdate (),null)
update [QuanLyPhong] [PHONG] set TrangThai = 'full'
where SoPhong = @phong
END
else if exists ( select * from [LeTan] [DATPHONG]
where CMND = @cmnd )
BEGIN
insert into [LeTan] [MUONTRAPHONG]
values ( @ma , @phong , getdate (),null)
update [QuanLyPhong] [PHONG] set TrangThai = 'full'
where SoPhong = @phong
delete from [LeTan] [DATPHONG]
where CMND = @cmnd and Phong = @phong
d) Trigger khi thực hiện trả phòng
CREATE TRIGGER tg_TRA ON [LeTan] [MUONTRAPHONG]
Trang 24INSTEAD OF UPDATE
AS
declare @ma MA
declare @phong MA
declare @ngaymuon datetime
declare @ngaytra datetime
select @ma = MaKH , @phong = SoPhong , @ngaymuon = NgayMuon from inserted
if exists ( select * from deleted where NgayTra is null) AND
exists ( select * from inserted where NgayTra is not null)
BEGIN
update [LeTan] [MUONTRAPHONG] set NgayTra = getdate ()
where SoPhong = @phong
update [QuanLyPhong] [PHONG] set TrangThai = default
where SoPhong = @phong
declare @mahd int
declare @thoigian int
declare @gia money
declare @loaiphong varchar ( 20 )
select @ngaytra = NgayTra from letan muontraphong
where SoPhong = @phong
if not exists ( select MaKH from letan HOADON where MaKH = @ma ) BEGIN
insert into [LeTan] [HOADON] values ( @ma , getdate ())
select @mahd = MaHD from letan hoadon where MaKH = @ma select @loaiphong = LoaiPhong from [QuanLyPhong] [PHONG] where SoPhong = @phong
select @gia = Gia from [QuanLyPhong] [GIAPHONG]
where LoaiPhong = @loaiphong
select @thoigian = DATEDIFF ( day , @ngaymuon , @ngaytra )
select @gia = Gia from [QuanLyPhong] [GIAPHONG]
where LoaiPhong = @loaiphong
select @thoigian = DATEDIFF ( day , @ngaymuon , @ngaytra )
if ( @thoigian > 0 )
BEGIN
exec proc_NhapCTHD @mahd , @phong , @thoigian , @gia END
Trang 25else BEGIN
set @thoigian = @thoigian + 1 exec proc_NhapCTHD @mahd , @phong , @thoigian , @gia END
END
END
else
BEGIN
update [LeTan] [MUONTRAPHONG]
set MaKH = @ma , SoPhong = @phong , NgayMuon = @ngaymuon
where SoPhong = @phong
END
e) Trigger nhập bảng [QuanTri].[NHANVIEN]
CREATE TRIGGER tg_NV ON [QuanTri] [NHANVIEN]
FOR INSERT , UPDATE
AS
declare @ns datetime
declare @ngaylam datetime
declare @tuoi int
select @ns = NgaySinh , @ngaylam = NgayLam from inserted
select @tuoi = DATEDIFF ( year , @ns , @ngaylam )
Đăng nhập với userQuanTri
execute as user = 'userQuanTri'
Nhân viên quản trị cập nhật thêm danh sách nhân viên mới
insert quantri nhanvien values ( 'NV4' , 'Nguyen Van
update quantri nhanvien set HoTen = 'Tran Trung B' where MaNV
delete from quantri nhanvien where MaNV = 'NV4'
Nhân viên quản tri cấp quyền cho người sử dụng
grant select on phucvu DICHVU to userKhachHang
Đăng nhập với userLeTan
revert
execute as user = 'userLeTan'
Nhân viên lễ tân nhập các thông tin về khách hàng khi khách hàng có nhu cầu thuê phòng
Trang 26insert letan khachhang values ( 'KH4' , 'Nguyen Van
update letan khachhang set HoTen = 'Tran Trung B' where MaKH
delete from letan khachhang where MaKH = 'KH4'
Nhân viên lễ tân tiếp nhận yêu cầu thuê phòng và trả phòng của khách hàng
execute as user = 'userPhucVu'
Nhân viên phục vu cập nhật thông tin về các dịch vụ và việc sử dụng các dịch vụ của khách hàng
insert into phucvu dichvu values ( 'DT' , 'Dien
update phucvu dichvu set GiaDV = 1800 where MaDV = 'DT'
delete from phucvu dichvu where MaDV = 'DT'
exec proc_DV 'KH1' , 'DT' , 5
Đăng nhập với userQuanLyPhong
revert
execute as user = 'userQuanLyPhong'
Nhân viên quản lý phòng cập nhật thông tin về phòng và giá phòng
insert into quanlyphong phong values ( '0910' , 30 , 'N5' , 2 , 'Loai
update quanlyphong phong set LoaiPhong = 'Loai 2' where
SoPhong = '0910'
delete from quanlyphong phong where SoPhong = '0910'
insert into quanlyphong giaphong values ( 'Loai 1' , 100000 ) update quanlyphong giaphong set Gia = 120000 where
LoaiPhong = 'Loai 1'
delete from quanlyphong giaphong where LoaiPhong = 'Loai 1'
select * from QuanLyPhong v_timphongtrong
Đăng nhập với userGD
revert
execute as user = 'userGD'
Giám đốc được quyền xem tất cả các hoạt động của khách sạn
select * from quantri nhanvien
select * from letan khachhang
select * from letan datphong
select * from letan muontraphong
select * from letan hoadon