Knocks/BackEnd/Knoks.Operate/Stored Procedures/TRN_Account_SetBalance.sql

140 lines
3.9 KiB
Transact-SQL

CREATE PROCEDURE [dbo].[TRN_Account_SetBalance]
@UserId bigint
,@AccountId bigint
,@AccountTransactionTypeId tinyint -- FreeTokenCredit = 1, Deposit = 2, Withdraw = 3
,@Amount decimal(22,8)
,@AmountUSD decimal(18,2)
,@ExternalReferenceId varchar(66) = NULL
,@OperatorId int
,@Comment nvarchar(1000)
,@WalletAddress varchar(42)
,@PendingId bigint
,@IsUserTransactionDonor bit = 0
,@KnokId bigint = NULL
,@TransId bigint OUTPUT
AS
SET NOCOUNT ON
DECLARE @CurrentBalance Decimal(22,8),
@CurrentBonusBalance Decimal(22,8),
@TranStarted bit,
@RC int,
@ErrorMessage nvarchar(1000)
BEGIN TRY
SET @RC = 0
SET @TranStarted = 0
IF @AccountTransactionTypeId NOT IN (1,2,3,4,5,8,9)
BEGIN
SET @RC = 2
SET @ErrorMessage = 'AccountTransaction Type is illegal. @AccountTransactionTypeId = ' + Cast(@AccountTransactionTypeId AS Varchar(20))
RAISERROR (@ErrorMessage,16,1)
END
IF not exists(SELECT 1 FROM Accounts WITH (NOLOCK) WHERE [UserId] = @UserId and AccountId=@AccountId)
BEGIN
SET @RC = 3
SET @ErrorMessage = 'User not found for this Account (UserId is NULL value). @AccountId = ' + Cast(@AccountId AS Varchar(20))
RAISERROR (@ErrorMessage,16,1);
END
--TODO: review it. Sometimes there is possible to have same transactions (for example when Platform user receives or returns payments for some knok)
--IF @KnokId is not null AND @IsUserTransactionDonor = 0 AND exists(SELECT 1 FROM AccountTransactions WITH (NOLOCK) WHERE [UserId] = @UserId and AccountId=@AccountId and KnokId = @KnokId and AccountTransactionTypeId = @AccountTransactionTypeId)
--BEGIN
-- SET @RC = 4
-- SET @ErrorMessage = 'AccountTransaction already exists. @KnokId = ' + Cast(@KnokId AS Varchar(20)) + 'AccountTransactionTypeId = ' + Cast(@AccountTransactionTypeId AS Varchar(20))
-- RAISERROR (@ErrorMessage,16,1);
--END
--IF @ExternalReferenceId Is Null
--BEGIN
-- SET @RC = 4
-- SET @ErrorMessage = 'External Reference cannot be null'
-- RAISERROR (@ErrorMessage,16,1);
--END
If @ErrorMessage IS NOT NULL AND EXISTS(SELECT 1 FROM AccountTransactions WHERE [ExternalReferenceId] = @ExternalReferenceId)
BEGIN
SET @RC = 5
SET @ErrorMessage = 'External Reference already registered'
RAISERROR (@ErrorMessage,16,1);
END
IF( @@TRANCOUNT = 0 )
BEGIN
BEGIN TRANSACTION
SET @TranStarted = 1
END
ELSE
SET @TranStarted = 0
SELECT @CurrentBalance = IsNull(CurrentBalance,0) ,
@CurrentBonusBalance = IsNull(CurrentBonusBalance,0 )
FROM Accounts WITH (ROWLOCK)
WHERE AccountId = @AccountId
IF @IsUserTransactionDonor = 1 OR @AccountTransactionTypeId in (3) --Withdraw
BEGIN
IF (@CurrentBalance - CAST(IsNull(@Amount,0) AS DECIMAL(22,8)) ) < 0
BEGIN
SET @RC = 6
SET @ErrorMessage = 'Current Balance Cannot be Negative : ' + Cast((@CurrentBalance - @Amount) AS Varchar(20))
RAISERROR (@ErrorMessage,16,1);
END
SET @Amount = -@Amount
SET @AmountUSD = -@AmountUSD
END
SET @CurrentBalance = @CurrentBalance + @Amount
set @CurrentBonusBalance = @CurrentBonusBalance + @Amount
EXECUTE @RC = [dbo].[TRN_AccountTransactions_Add]
@UserId
,@AccountId
,@AccountTransactionTypeId
,@Amount
,@AmountUSD
,@CurrentBalance
,@CurrentBonusBalance
,@ExternalReferenceId
,@OperatorId
,@Comment
,@WalletAddress
,@PendingId
,@KnokId
,@TransId OUTPUT
SELECT @TransId AS TransId,
@CurrentBalance AS CurrentBalance,
@CurrentBonusBalance AS CurrentBonusBalance
IF( @TranStarted = 1 )
COMMIT TRANSACTION
RETURN 0
END TRY
BEGIN CATCH
IF( @TranStarted = 1 )
ROLLBACK TRANSACTION
EXEC [USP_LogError]
EXEC [USP_RethrowError]
IF @RC = 0
SET @RC = 1
RETURN @RC
END CATCH