156 lines
4.5 KiB
Transact-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 |