Professional Documents
Culture Documents
SQL
SQL
---------
);
---------
--------------
-- Kiểm tra số điện thoại của Tenant đã tồn tại (trong trường hợp INSERT hoặc UPDATE)
IF EXISTS (SELECT 1 FROM TENANT t INNER JOIN inserted i ON t.PhoneNumber = i.PhoneNumber WHERE i.ID_t IS NULL)
BEGIN
RAISERROR(N'Số điện thoại của Tenant đã tồn tại.', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
SELECT @ID_l = ID_l, @UserName = 'Landlord_' + ID_l, @Password = 'password' + ID_l -- Mặc định password là 'password'
FROM inserted
-- Kiểm tra số điện thoại của Landlord đã tồn tại (trong trường hợp INSERT hoặc UPDATE)
IF EXISTS (SELECT 1 FROM LANDLORD l INNER JOIN inserted i ON l.PhoneNumber = i.PhoneNumber WHERE i.ID_l IS NULL)
BEGIN
RAISERROR(N'Số điện thoại của Landlord đã tồn tại.', 16, 1)
ROLLBACK TRANSACTION
RETURN
END
BEGIN TRY
-- Cập nhật thông tin của phòng
UPDATE ROOM
SET Area = @Area,
Interior = @Interior,
State = @State,
ElectricityPrice = @ElectricityPrice,
WaterPrice = @WaterPrice,
PriceperMonth = @NewPriceperMonth,
ID_l = @ID_l
WHERE RoomNumber = @RoomNumber;
-- hàm tính Tiền dựa vào giá tiền hằng tháng và số tháng
GO
CREATE FUNCTION dbo.CalculatePrice (@PriceperMonth MONEY, @Month INT)
RETURNS MONEY
AS
BEGIN
DECLARE @Price MONEY
SET @Price = @Month * @PriceperMonth
RETURN @Price
END;
-- Tính giá cho hợp đồng bằng cách sử dụng hàm CalculatePrice (= tiền hằng tháng * số tháng thuê)
-- Tiền phòng hằng tháng (PriceperMonth) được tính dựa trên thông tin của ROOM đó
-- Thời gian thuê (số tháng thuê) được tính dựa trên ngày bắt đầu&ngày kết thúc từ bảng RENT
SELECT @Price = dbo.CalculatePrice(r.PriceperMonth, dbo.CalculateMonth(re.DayStart, re.DayEnd))
FROM ROOM r
INNER JOIN RENT re ON r.RoomNumber = re.RoomNumber
WHERE re.ID_t = @ID_t
--Cập nhật trạng thái của Phòng thành đã có người thuê (State -> 1)
UPDATE ROOM
SET State = 1
WHERE RoomNumber = @RoomNumber
END;
--proc delêt contract
GO
CREATE PROCEDURE DeleteContract
@Code NVARCHAR(10)
AS
BEGIN
BEGIN TRY
DELETE FROM CONTRACT
WHERE Code = @Code;
GO
CREATE TRIGGER DeleteRentOnContractDelete
ON CONTRACT
AFTER DELETE
AS
BEGIN
DECLARE @DeletedContracts TABLE (Code NVARCHAR(10))
-- Xóa các bản ghi trong bảng RENT tương ứng với các hợp đồng bị xóa
DELETE FROM RENT
WHERE CONCAT(ID_t, RoomNumber) IN (SELECT Code FROM @DeletedContracts)
BEGIN TRY
-- Chèn thông tin thuê công ty môi giới vào bảng HIRED
INSERT INTO HIRED (ID_l, TaxCode, DayStart, DayEnd)
VALUES (@ID_l, @TaxCode, @DayStart, @DayEnd);
PRINT 'Thông tin thuê công ty môi giới đã được thêm thành công.'
END TRY
BEGIN CATCH
PRINT 'Lỗi: ' + ERROR_MESSAGE();
END CATCH
END;
-- Tính giá thuê dựa trên thông tin từ bảng BROKERAGECOMPANY, sử dụng hàm CalculatePrice (= tiền hằng tháng * số tháng
thuê)
-- Tiền Chủ thuê Công ty hằng tháng (PriceperMonth) được tính dựa trên Giá tiền Hằng thánng Công ty đó quy định
(BROKERAGECOMPANY.PriceperMonth)
-- Thời gian thuê (số tháng thuê) được tính dựa trên ngày bắt đầu&ngày kết thúc khi nhập HIRED
SELECT @Price = dbo.CalculatePrice(c.PriceperMonth, dbo.CalculateMonth(i.DayStart, i.DayEnd))
FROM BROKERAGECOMPANY c, inserted i
UPDATE BROKERAGECOMPANY
SET Wallet = Wallet + (@Price)
BEGIN TRY
-- Chèn thông tin thuê phòng vào bảng RENT
INSERT INTO RENT (ID_t, RoomNumber, TaxCode, DayStart, DayEnd)
VALUES (@ID_t, @RoomNumber, @TaxCode, @DayStart, @DayEnd);
--trigger RENT, Code = "Roomnumber" + "Id_t", và check state của room phải = 0,
--kiểm tra Balance trong Tenant nếu đủ tiền thuê trọ thì được thuê (rent) --> Tạo Contract
--kiểm tra nếu Tenant có thuê Company thì WALLET_LANDLORD trừ tiền BonusPrice (Company)
GO
--DROP TRIGGER TriggerInsertRent
GO
CREATE TRIGGER TriggerInsertRent
ON RENT
AFTER INSERT, UPDATE
AS
BEGIN
DECLARE @ID_t NVARCHAR(10), @RoomNumber NVARCHAR(10), @Price MONEY, @TaxCode NVARCHAR(10), @DayStart DATE
-- Kiểm tra trạng thái của phòng, trống thì được thuê (State = 0)
IF (SELECT State FROM ROOM WHERE RoomNumber = @RoomNumber) = 1
BEGIN
-- Nếu trạng thái của phòng là 0 (đã có người thuê, State = 0), phát sinh lỗi và thông báo
RAISERROR(N'Phòng đã được thuê. Vui lòng tìm phòng khác !', 16, 1);
ROLLBACK TRANSACTION;
RETURN; -- Kết thúc trigger
END
-- Kiểm tra xem ROOM có được thuê bởi một Company có TaxCode trùng khớp với TaxCode trong Rent không
IF @TaxCode IS NOT NULL
BEGIN
IF NOT EXISTS (
SELECT 1
FROM ROOM r
INNER JOIN HIRED h ON r.ID_l = h.ID_l
WHERE r.RoomNumber = @RoomNumber AND h.TaxCode = @TaxCode
)
BEGIN
-- Nếu không trùng, phát sinh lỗi và hủy bỏ giao dịch
RAISERROR(N'Phòng không thuộc sở hữu của Công ty môi giới này!', 16, 1);
ROLLBACK TRANSACTION;
RETURN;
END
END
-- Tính giá thuê dựa trên thông tin từ bảng ROOM, sử dụng hàm CalculatePrice (= tiền hằng tháng * số tháng thuê)
-- Tiền phòng hằng tháng (PriceperMonth) được tính dựa trên thông tin của ROOM đó
-- Thời gian thuê (số tháng thuê) được tính dựa trên ngày bắt đầu&ngày kết thúc khi nhập RENT
SELECT @Price = dbo.CalculatePrice(r.PriceperMonth, dbo.CalculateMonth(i.DayStart, i.DayEnd))
FROM ROOM r, inserted i
WHERE (r.RoomNumber = @RoomNumber)
UPDATE TENANT
SET ID_l = r.ID_l
FROM ROOM r
WHERE @ID_t = ID_t AND @RoomNumber = RoomNumber
UPDATE BROKERAGECOMPANY
SET Wallet = Wallet + BonusPrice
WHERE TaxCode = @TaxCode
END
ELSE
BEGIN
--Nếu không trùng, phát sinh lỗi và hủy bỏ giao dịch
ROLLBACK TRANSACTION;
RETURN;
END
END
END;
-- Tính giá trị mới cho thuộc tính Price dựa trên các thuộc tính khác
SELECT @Price = ROOM.PriceperMonth + @ElectricNumber * ROOM.ElectricityPrice + @WaterNumber * ROOM.WaterPrice
FROM ROOM
INNER JOIN BILL ON ROOM.RoomNumber = BILL.RoomNumber
WHERE BILL.Code = @Code
-- Kiểm tra nếu ngày của BILL nằm trong 10 ngày sau khi bắt đầu hợp đồng
IF (@Day >= @DayStartContract)
BEGIN
-- Tính giá 1 tháng BILL
SELECT @Price = PriceperMonth + @ElectricNumber * ElectricityPrice + @WaterNumber * WaterPrice
FROM ROOM
WHERE RoomNumber = @RoomNumber
GO
--EXEC
EXEC InsertWalletLandlord 'WL1', 1000000000;
GO
EXEC InsertTenant 'TN1', 'John Doe', '1234567890', 'Engineer', '1990-01-01', 50000000;
GO
EXEC InsertLandlord 'LL1', 'Alice Smith', '9876543210', '1970-01-01', 'WL1';
GO
EXEC InsertRoom 'R1', 40, 2, 0, 5000, 5000, 'LL1';
GO
EXEC InsertCompany 'C1', 'Company1', 'VVN', 100000000, 1000000, 500000;
GO
-- Chủ thuê Công Ty môi giới 3 tháng
EXEC InsertHired 'LL1', 'C1', '2024-04-01', '2024-06-13';
GO
--Người thuê thuê phòng 2 tháng
EXEC InsertRent 'TN1', 'R1', '2024-04-01', '2024-06-01', 'C1' ;
GO
--Bill lần 1
EXEC InsertBill 'B1_1', 5, 5, '2024-04-06', 'LL1', 'R1', 'TN1';
--Bill lần 2
EXEC InsertBill 'B1_2', 5, 5, '2024-04-06', 'LL1', 'R1', 'TN1';
--EXEC2
GO
EXEC InsertTenant 'TN2', 'Tom', '2234567890', 'Engineer', '1990-01-01', 50000000;
GO
EXEC InsertLandlord 'LL2', 'Alice Smith', '9876543210', '1970-01-01', 'WL1';
GO
EXEC InsertRoom 'R2', 50, 5, 0, 5000, 5000, 'LL2';
GO
EXEC InsertCompany 'C2', 'Company2', 'VVN', 100000000, 1000000, 500000;
GO
-- Chủ thuê Công Ty môi giới 2 tháng
EXEC InsertHired 'LL2', 'C2', '2024-07-01', '2024-09-01';
GO
--Người thuê thuê phòng 3 tháng
EXEC InsertRent 'TN2', 'R2', '2024-07-01', '2024-10-01' ;
GO
--Bill lần 1
EXEC InsertBill 'B2_1', 11, 11, '2024-07-06', 'LL2', 'R2', 'TN2';