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

156 lines
4.5 KiB
Transact-SQL

CREATE PROCEDURE [dbo].[KST_UpdateKnok]
@KnokId BIGINT,
@EntryPriceTouched BIT = NULL,
@ExitPriceTouched BIT = NULL,
@StopLossTouched BIT = NULL,
@KnokStatusId INT = NULL,
@HighRate DECIMAL(22, 8) = NULL,
@LowRate DECIMAL(22, 8) = NULL,
@KnokerWinRate decimal(22, 8),
@UserRefundRate decimal(22, 8),
@DistanceFromTarget decimal(22, 2) = NULL,
@CloseRate decimal(22, 8) = NULL
AS
DECLARE
@TranStarted bit,
@RC int,
@ErrorMessage nvarchar(1000),
@TransId bigint,
@FollowersCount int,
@KnokPrice decimal(22, 8),
@KnokPublishPrice decimal(22, 8),
@UserId bigint,
@AccountId bigint,
@TransferAmount decimal(22, 8),
@PlatformUserId bigint,
@PlatformAccountId bigint,
@Comment varchar(64)
BEGIN TRY
SET @RC = 0
SET @TranStarted = 0
BEGIN TRANSACTION
SET @TranStarted = 1
IF ISNULL(@KnokStatusId, 0) = 5 --KNOK is resolved
-- check for KnokerWinsToken
BEGIN
SELECT @KnokPrice = [Price],
@UserId = [CreatorUserId]
FROM Signals WITH (NOLOCK) WHERE KnokId = @KnokId
SELECT @KnokPublishPrice = [Amount], @AccountId = [AccountId]
FROM [AccountTransactions]
WHERE
[AccountTransactionTypeId] = 4 --PublishKnok
AND [KnokId] = @KnokId
AND [UserId] = @UserId
--user paid publish price so it is negative
SET @KnokPublishPrice = - @KnokPublishPrice;
SELECT @FollowersCount = COUNT([UserId]) FROM [UserKnoks] WHERE [KnokId] = @KnokId
SET @TransferAmount = @FollowersCount * @KnokPrice * @KnokerWinRate + @KnokPublishPrice
IF NOT @TransferAmount IS NULL
BEGIN
SELECT @PlatformUserId = [UserId] FROM Users WHERE [UserTypeId] = 2 --Platform
SET @PlatformAccountId = (SELECT TOP 1 [AccountId] FROM [Accounts] WHERE [UserId] = @PlatformUserId)
SET @Comment = NEWID()
--execute transaction
EXEC [dbo].[TRN_Account_TransferMoney]
@FromUserId = @PlatformUserId,
@FromAccountId = @PlatformAccountId,
@FromExternalReferenceId = NULL,
@FromWalletAddress = NULL,
@FromAccountTransactionTypeId = 5, --KnokerWinsToken
@ToUserId = @UserId,
@ToAccountId = @AccountId,
@ToExternalReferenceId = NULL,
@ToWalletAddress = NULL,
@ToAccountTransactionTypeId = 5, --KnokerWinsToken
@Amount = @TransferAmount,
@AmountUSD = NULL,
@OperatorId = NULL,
@Comment = @Comment,
@PendingId = NULL,
@KnokId = @KnokId
END
--Recalc DistanceFromTarget for User
SELECT @DistanceFromTarget = DistanceFromTarget FROM Signals WHERE KnokId = @KnokId AND ISNULL(@DistanceFromTarget, 0) = 0
IF ISNULL(@DistanceFromTarget, 0) <> 0
BEGIN
UPDATE Users SET DistanceFromTarget =
(SELECT ((SUM(ISNULL(DistanceFromTarget, 0))) + @DistanceFromTarget) / (COUNT(1) + 1)
FROM Signals k
WHERE KnokStatusId = 5 --Resolved
AND KnokId <> @KnokId AND CreatorUserId = UserId)
WHERE UserId = @UserId;
END
--Recalc SuccessRate
UPDATE Users SET SuccessRate =
(SELECT
ROUND((SELECT COUNT(1)
FROM Signals sk
WHERE sk.KnokStatusId = 5 --Resolved
AND sk.EntryPriceTouched = 1 AND sk.ExitPriceTouched = 1 AND sk.StopLossTouched = 0 AND sk.CreatorUserId = UserId) /
CAST(COUNT(1) AS DECIMAL(22,8)) * 100, 0)
FROM Signals k
WHERE k.CreatorUserId = UserId)
WHERE UserId = @UserId
--Recalc SuccessSequence
if ISNULL(@EntryPriceTouched, 0) = 1 AND ISNULL(@ExitPriceTouched, 0) = 1
BEGIN
UPDATE Users SET SuccessSequence = SuccessSequence+1 WHERE UserId = @UserId
END
if ISNULL(@StopLossTouched, 0) = 1
BEGIN
UPDATE Users SET SuccessSequence = 0 WHERE UserId = @UserId
END
END --KNOK is resolved
UPDATE Signals
SET [EntryPriceTouched] = ISNULL(@EntryPriceTouched, [EntryPriceTouched]),
[ExitPriceTouched] = ISNULL(@ExitPriceTouched, [ExitPriceTouched]),
[StopLossTouched] = ISNULL(@StopLossTouched, [StopLossTouched]),
[KnokStatusId] = ISNULL(@KnokStatusId, [KnokStatusId]),
[HighRate] = ISNULL(@HighRate, [HighRate]),
[LowRate] = ISNULL(@LowRate, [LowRate]),
[CloseDate] = IIF(ISNULL(@KnokStatusId, 0) = 5, GETUTCDATE(), [CloseDate]),
[CloseRate] = ISNULL(@CloseRate, [CloseRate]),
[DistanceFromTarget] = ISNULL(@DistanceFromTarget, [DistanceFromTarget])
WHERE
KnokId = @KnokId
EXEC KST_GetKnoks @KnokId = @KnokId
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