140 lines
3.9 KiB
Transact-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 |