CREATE OR ALTER PROCEDURE SpTransactionTsk
@TransactionInfo NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON
BEGIN TRY
BEGIN TRANSACTION
-- FIRSTLY CREATE A TEMPORARY TABLE FOR THE INPUTS
CREATE TABLE #Customer(TempCustomerId INT IDENTITY PRIMARY KEY, CustomerId INT);
CREATE TABLE #Room(TempRoomdId INT IDENTITY PRIMARY KEY, RoomId INT);
CREATE TABLE #Transaction(TempTransactionId INT IDENTITY PRIMARY KEY, TransactionId INT);
CREATE TABLE #ServiceTransaction(TempServiceTransactonId INT IDENTITY PRIMARY KEY, ServiceTransactionId INT);
CREATE TABLE #BookingTransaction(BookingTransactonId INT IDENTITY PRIMARY KEY, BookingTransactionId INT);
-- DELARE VARIABLES TO STORE VALUES
DECLARE @CustomerIds VARCHAR = ISNULL(JSON_VALUE(@TransactionInfo, '$.CustomerId'), '');
DECLARE @RoomIds VARCHAR(50) = ISNULL(JSON_VALUE(@TransactionInfo, '$.RoomIds'), '');
DECLARE @ServiceIds VARCHAR(50) = ISNULL(JSON_VALUE(@TransactionInfo, '$.ServiceIds'), '');
DECLARE @CurrentDate SMALLDATETIME = GETDATE();
-- CHECK IF CUSTOMER ID IS PRESENT
IF @CustomerIds = ''
BEGIN
PRINT 'No Customer Specified'
ROLLBACK TRANSACTION
RETURN
END
ELSE
BEGIN
INSERT INTO #Customer (CustomerId)
SELECT CAST(VALUE AS INT) AS ServiceId FROM STRING_SPLIT(@CustomerIds, ',')
END
DECLARE @NewTransactionId INT;
EXEC SpTransactionIns @Amount = 100.00, @PaidAmount = 50.00, @DueAmount = 50.00, @TransactionDate = @CurrentDate,
@STATUS = 'Pending', @TransactionType = 'Payment', @BranchId = 1, @CustomerId = 10,
@UpdatedDate = @CurrentDate, @PersonUser = 1,
@TransactionId = @NewTransactionId OUTPUT;
INSERT INTO #Transaction(TransactionId) VALUES (@NewTransactionId)
-- CHECK IF ROOM ID ARE PRESENT
IF @RoomIds = ''
BEGIN
PRINT 'No Room Specified'
ROLLBACK TRANSACTION
RETURN
END
ELSE
BEGIN
INSERT INTO #Room(RoomId) SELECT CAST(VALUE AS INT) AS RoomId FROM STRING_SPLIT(@RoomIds, ',');
DECLARE @TotalRooms INT = (SELECT COUNT(RoomId) FROM #Room)
DECLARE @CurrentRoomId INT;
DECLARE @Counter INT = 1;
WHILE @Counter <= @TotalRooms
BEGIN
SELECT @CurrentRoomId = RoomId FROM #Room WHERE TempRoomdId = @Counter;
IF @CurrentRoomId NOT IN (SELECT RoomId FROM Room)
BEGIN
SELECT 'SORRY THE ROOM DOESN''T EXIST' AS InvalidRoomId
ROLLBACK TRANSACTION
RETURN
END
ELSE
BEGIN
DECLARE @NewRoomStatus VARCHAR(50);
EXEC SpRoomStatusCheck @CurrentRoomId, @RoomStatus = @NewRoomStatus OUTPUT;
IF @NewRoomStatus = 'occupied'
BEGIN
PRINT 'The room is already booked';
ROLLBACK TRANSACTION
RETURN;
END
ELSE
BEGIN
DECLARE @NewBookingTransactionId INT;
EXEC SpBookingTransactionIns
@Transacti,
@RoomId = @CurrentRoomId,
@SubTotal = 99.99,
@CheckIn = @CurrentDate,
@CheckOut = NULL,
@CreatedDate = @CurrentDate,
@UpdatedDate = NULL,
@Pers
@BookingTransacti OUTPUT;
INSERT INTO #BookingTransaction VALUES (@NewBookingTransactionId)
EXEC SpRoomStatusUpd @CurrentRoomId;
END
END
SET @Counter = @Counter + 1;
END
END
-- FOR SERVICE TRANSACTION
IF @ServiceIds = ''
BEGIN
PRINT 'No ServiceIds Specified'
END
ELSE
BEGIN
INSERT INTO #ServiceTransaction(ServiceTransactionId) SELECT CAST(VALUE AS INT) AS Service FROM STRING_SPLIT(@ServiceIds, ',');
DECLARE @TotalService INT = (SELECT COUNT(ServiceTransactionId) FROM #ServiceTransaction)
DECLARE @CurrentServiceId INT;
DECLARE @ServiceCounter INT = 1;
WHILE @ServiceCounter <= @TotalService
BEGIN
SELECT @CurrentServiceId = ServiceTransactionId FROM #ServiceTransaction WHERE TempServiceTransact
IF @CurrentServiceId NOT IN (SELECT ServiceId FROM Service)
BEGIN
SELECT 'SORRY THE SERVICE DOESN''T EXIST' AS InvalidServiceId
ROLLBACK TRANSACTION
RETURN
END
ELSE
BEGIN
DECLARE @ServiceTransactionId INT;
EXEC SpServiceTransactionIns @ServiceId = @CurrentServiceId,
@Transacti,
@SubTotal = 0,
@CreatedDate = @CurrentDate,
@UpdatedDate = @CurrentDate,
@Pers
@ServiceTransacti OUTPUT;
INSERT INTO #ServiceTransaction(ServiceTransactionId) VALUES (@ServiceTransactionId)
END
END
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT ERROR_MESSAGE()
ROLLBACK TRANSACTION
END CATCH
SELECT * FROM [TRANSACTION] WHERE TransactionId IN (SELECT TransactionId FROM #Transaction);
SELECT * FROM BookingTransaction WHERE BookingTransactionId IN (SELECT BookingTransactionId FROM #BookingTransaction);
SELECT * FROM ServiceTransaction WHERE ServiceTransactionId IN (SELECT ServiceTransactionId FROM #ServiceTransaction);
END;