Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Has been cancelled
Build and Deploy to Production / build-and-deploy (push) Has been cancelled
This commit is contained in:
+6
-6
@@ -166,10 +166,10 @@ BEGIN
|
||||
LeftNewMembers AS (
|
||||
SELECT
|
||||
cte.ParentId AS UserId,
|
||||
COUNT(*) AS NewMembersCount
|
||||
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
||||
FROM LeftLegCTE cte
|
||||
INNER JOIN CMS.ClubMemberships cm ON cm.UserId = cte.ChildId AND cm.IsActive = 1
|
||||
WHERE cm.ActivatedAt >= @StartDate AND cm.ActivatedAt <= @EndDate
|
||||
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
||||
WHERE cc.PackagePurchasedAt >= @StartDate AND cc.PackagePurchasedAt <= @EndDate
|
||||
GROUP BY cte.ParentId
|
||||
)
|
||||
UPDATE b
|
||||
@@ -203,10 +203,10 @@ BEGIN
|
||||
RightNewMembers AS (
|
||||
SELECT
|
||||
cte.ParentId AS UserId,
|
||||
COUNT(*) AS NewMembersCount
|
||||
COUNT(DISTINCT cte.ChildId) AS NewMembersCount
|
||||
FROM RightLegCTE cte
|
||||
INNER JOIN CMS.ClubMemberships cm ON cm.UserId = cte.ChildId AND cm.IsActive = 1
|
||||
WHERE cm.ActivatedAt >= @StartDate AND cm.ActivatedAt <= @EndDate
|
||||
INNER JOIN CMS.ClubMembershipCycles cc ON cc.UserId = cte.ChildId
|
||||
WHERE cc.PackagePurchasedAt >= @StartDate AND cc.PackagePurchasedAt <= @EndDate
|
||||
GROUP BY cte.ParentId
|
||||
)
|
||||
UPDATE b
|
||||
|
||||
+72
-57
@@ -3,10 +3,12 @@
|
||||
-- Description: محاسبه استخر کمیسیون هفتگی و توزیع بین کاربران
|
||||
-- Author: System
|
||||
-- Created: 2025-12-19
|
||||
-- Updated: Q29 — اضافه کردن @PackageId، fix فیلتر pool، مدیریت pool خالی
|
||||
-- =============================================
|
||||
|
||||
CREATE OR ALTER PROCEDURE [CMS].[sp_CalculateWeeklyCommissionPool]
|
||||
@WeekDefinitionId BIGINT,
|
||||
@PackageId BIGINT, -- هر بار به ازای یک پکیج اجرا میشود
|
||||
@ForceRecalculate BIT = 0,
|
||||
@PoolId BIGINT OUTPUT
|
||||
AS
|
||||
@@ -15,7 +17,7 @@ BEGIN
|
||||
SET XACT_ABORT ON;
|
||||
|
||||
DECLARE @ErrorMessage NVARCHAR(4000);
|
||||
DECLARE @TotalPoolAmount BIGINT;
|
||||
DECLARE @TotalPoolAmount BIGINT = 0;
|
||||
DECLARE @TotalBalances INT;
|
||||
DECLARE @ValuePerBalance BIGINT;
|
||||
DECLARE @CalculatedAt DATETIME = GETDATE();
|
||||
@@ -24,64 +26,73 @@ BEGIN
|
||||
BEGIN TRANSACTION;
|
||||
|
||||
-- =============================================
|
||||
-- 1. پیدا کردن Pool هفته
|
||||
-- 1. پیدا کردن Pool هفته (فیلتر بر اساس PackageId)
|
||||
-- =============================================
|
||||
SELECT @PoolId = Id, @TotalPoolAmount = TotalPoolAmount
|
||||
FROM CMS.WeeklyCommissionPools
|
||||
WHERE WeekDefinitionId = @WeekDefinitionId;
|
||||
WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId;
|
||||
|
||||
-- اگر Pool وجود ندارد (هیچ فعالسازی در این هفته نبوده)، یک رکورد خالی ایجاد میکنیم
|
||||
IF @PoolId IS NULL
|
||||
BEGIN
|
||||
SET @ErrorMessage = N'استخر کمیسیون برای هفته ' + CAST(@WeekDefinitionId AS NVARCHAR(20)) + N' تعریف نشده است';
|
||||
RAISERROR(@ErrorMessage, 16, 1);
|
||||
RETURN;
|
||||
INSERT INTO CMS.WeeklyCommissionPools (
|
||||
WeekDefinitionId, PackageId, TotalPoolAmount, TotalBalances,
|
||||
ValuePerBalance, IsCalculated, CalculatedAt,
|
||||
IsDeleted, Created, CreatedBy, LastModified, LastModifiedBy
|
||||
) VALUES (
|
||||
@WeekDefinitionId, @PackageId, 0, 0, 0, 0, NULL,
|
||||
0, @CalculatedAt, 'SP', @CalculatedAt, 'SP'
|
||||
);
|
||||
SET @PoolId = SCOPE_IDENTITY();
|
||||
SET @TotalPoolAmount = 0;
|
||||
END
|
||||
|
||||
-- =============================================
|
||||
-- 2. بررسی محاسبات قبلی
|
||||
-- 2. بررسی محاسبات قبلی (بر اساس همین Pool نه کل هفته)
|
||||
-- =============================================
|
||||
IF EXISTS (SELECT 1 FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId)
|
||||
IF EXISTS (SELECT 1 FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId)
|
||||
BEGIN
|
||||
IF @ForceRecalculate = 0
|
||||
BEGIN
|
||||
SET @ErrorMessage = N'کمیسیون هفته ' + CAST(@WeekDefinitionId AS NVARCHAR(20)) + N' قبلاً محاسبه شده است. برای محاسبه مجدد از ForceRecalculate استفاده کنید';
|
||||
SET @ErrorMessage = N'کمیسیون هفته ' + CAST(@WeekDefinitionId AS NVARCHAR(20))
|
||||
+ N' (پکیج ' + CAST(@PackageId AS NVARCHAR(20)) + N') قبلاً محاسبه شده است. برای محاسبه مجدد از ForceRecalculate استفاده کنید';
|
||||
RAISERROR(@ErrorMessage, 16, 1);
|
||||
RETURN;
|
||||
END
|
||||
|
||||
-- =============================================
|
||||
-- 3. Revert کیف پولها (در صورت ForceRecalculate)
|
||||
-- 3. Revert کیف پولها (در صورت ForceRecalculate، فقط پرداختهای این Pool)
|
||||
-- =============================================
|
||||
|
||||
|
||||
-- کم کردن مقادیر قبلی از NetworkBalance
|
||||
UPDATE uw
|
||||
SET uw.NetworkBalance = uw.NetworkBalance - ISNULL(
|
||||
(SELECT SUM(wl.ChangeNerworkValue)
|
||||
FROM CMS.UserWalletChangeLogs wl
|
||||
WHERE wl.WalletId = uw.Id
|
||||
AND wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId)
|
||||
(SELECT SUM(wl.ChangeNerworkValue)
|
||||
FROM CMS.UserWalletChangeLogs wl
|
||||
WHERE wl.WalletId = uw.Id
|
||||
AND wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId)
|
||||
), 0)
|
||||
FROM CMS.UserWallets uw
|
||||
WHERE uw.Id IN (
|
||||
SELECT DISTINCT wl.WalletId
|
||||
FROM CMS.UserWalletChangeLogs wl
|
||||
WHERE wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId)
|
||||
SELECT DISTINCT wl.WalletId
|
||||
FROM CMS.UserWalletChangeLogs wl
|
||||
WHERE wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId)
|
||||
);
|
||||
|
||||
-- حذف لاگهای تغییرات قبلی
|
||||
DELETE FROM CMS.UserWalletChangeLogs
|
||||
WHERE RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId);
|
||||
DELETE FROM CMS.UserWalletChangeLogs
|
||||
WHERE RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId);
|
||||
|
||||
-- حذف تاریخچه پرداخت
|
||||
DELETE FROM CMS.CommissionPayoutHistories
|
||||
WHERE UserCommissionPayoutId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId);
|
||||
DELETE FROM CMS.CommissionPayoutHistories
|
||||
WHERE UserCommissionPayoutId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId);
|
||||
|
||||
-- حذف پرداختهای قبلی
|
||||
DELETE FROM CMS.UserCommissionPayouts WHERE WeekDefinitionId = @WeekDefinitionId;
|
||||
-- حذف پرداختهای قبلی این Pool
|
||||
DELETE FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId;
|
||||
|
||||
-- Reset وضعیت Pool
|
||||
UPDATE CMS.WeeklyCommissionPools
|
||||
SET IsCalculated = 0
|
||||
UPDATE CMS.WeeklyCommissionPools
|
||||
SET IsCalculated = 0
|
||||
WHERE Id = @PoolId;
|
||||
END
|
||||
|
||||
@@ -90,8 +101,12 @@ BEGIN
|
||||
-- =============================================
|
||||
IF NOT EXISTS (SELECT 1 FROM CMS.NetworkWeeklyBalances WHERE WeekDefinitionId = @WeekDefinitionId)
|
||||
BEGIN
|
||||
SET @ErrorMessage = N'ابتدا باید تعادلهای هفتگی محاسبه شوند. sp_CalculateWeeklyBalances را اجرا کنید';
|
||||
RAISERROR(@ErrorMessage, 16, 1);
|
||||
-- بالانسی محاسبه نشده — pool را به عنوان "محاسبه شده بدون پرداخت" علامت میزنیم
|
||||
UPDATE CMS.WeeklyCommissionPools
|
||||
SET IsCalculated = 1, CalculatedAt = @CalculatedAt
|
||||
WHERE Id = @PoolId;
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
|
||||
@@ -104,11 +119,11 @@ BEGIN
|
||||
|
||||
IF @TotalBalances IS NULL OR @TotalBalances = 0
|
||||
BEGIN
|
||||
-- هیچ تعادلی برای توزیع وجود ندارد
|
||||
UPDATE CMS.WeeklyCommissionPools
|
||||
-- هیچ تعادلی برای توزیع وجود ندارد — pool محاسبه شده اما پرداختی ندارد
|
||||
UPDATE CMS.WeeklyCommissionPools
|
||||
SET IsCalculated = 1, CalculatedAt = @CalculatedAt
|
||||
WHERE Id = @PoolId;
|
||||
|
||||
|
||||
COMMIT TRANSACTION;
|
||||
RETURN;
|
||||
END
|
||||
@@ -136,16 +151,16 @@ BEGIN
|
||||
LastModified,
|
||||
LastModifiedBy
|
||||
)
|
||||
SELECT
|
||||
SELECT
|
||||
nb.UserId,
|
||||
@WeekDefinitionId,
|
||||
@PoolId,
|
||||
nb.TotalBalances,
|
||||
@ValuePerBalance,
|
||||
nb.TotalBalances * @ValuePerBalance,
|
||||
0, -- Status: Pending
|
||||
0, -- Status: Pending
|
||||
NULL, -- PaidAt
|
||||
0, -- IsDeleted
|
||||
0, -- IsDeleted
|
||||
@CalculatedAt,
|
||||
'SP',
|
||||
@CalculatedAt,
|
||||
@@ -173,35 +188,35 @@ BEGIN
|
||||
LastModified,
|
||||
LastModifiedBy
|
||||
)
|
||||
SELECT
|
||||
cp.Id, -- UserCommissionPayoutId
|
||||
cp.UserId, -- UserId
|
||||
SELECT
|
||||
cp.Id,
|
||||
cp.UserId,
|
||||
@WeekDefinitionId,
|
||||
0, -- AmountBefore
|
||||
cp.TotalAmount, -- AmountAfter
|
||||
0,
|
||||
cp.TotalAmount,
|
||||
0, -- OldStatus: Pending
|
||||
0, -- NewStatus: Pending
|
||||
0, -- Action: Created (assuming enum value)
|
||||
'SP', -- PerformedBy
|
||||
N'محاسبه اولیه توسط SP', -- Reason
|
||||
0, -- IsDeleted
|
||||
0, -- Action: Created
|
||||
'SP',
|
||||
N'محاسبه اولیه توسط SP',
|
||||
0,
|
||||
@CalculatedAt,
|
||||
'SP',
|
||||
@CalculatedAt,
|
||||
'SP'
|
||||
FROM CMS.UserCommissionPayouts cp
|
||||
WHERE cp.WeekDefinitionId = @WeekDefinitionId;
|
||||
WHERE cp.WeeklyPoolId = @PoolId;
|
||||
|
||||
-- =============================================
|
||||
-- 9. شارژ کیف پول کاربران
|
||||
-- =============================================
|
||||
|
||||
|
||||
-- بروزرسانی NetworkBalance
|
||||
UPDATE uw
|
||||
SET uw.NetworkBalance = uw.NetworkBalance + cp.TotalAmount
|
||||
FROM CMS.UserWallets uw
|
||||
INNER JOIN CMS.UserCommissionPayouts cp ON cp.UserId = uw.UserId
|
||||
WHERE cp.WeekDefinitionId = @WeekDefinitionId;
|
||||
WHERE cp.WeeklyPoolId = @PoolId;
|
||||
|
||||
-- ثبت لاگ تغییرات کیف پول
|
||||
INSERT INTO CMS.UserWalletChangeLogs (
|
||||
@@ -220,24 +235,24 @@ BEGIN
|
||||
LastModified,
|
||||
LastModifiedBy
|
||||
)
|
||||
SELECT
|
||||
SELECT
|
||||
uw.Id,
|
||||
uw.Balance, -- CurrentBalance
|
||||
0, -- ChangeValue (no change to main balance)
|
||||
uw.NetworkBalance, -- CurrentNetworkBalance (after update)
|
||||
cp.TotalAmount, -- ChangeNerworkValue
|
||||
uw.DiscountBalance, -- CurrentDiscountBalance
|
||||
0, -- ChangeDiscountValue
|
||||
1, -- IsIncrease: true
|
||||
cp.Id, -- RefrenceId: PayoutId
|
||||
0, -- IsDeleted
|
||||
uw.Balance,
|
||||
0, -- ChangeValue (no change to main balance)
|
||||
uw.NetworkBalance, -- CurrentNetworkBalance (after update)
|
||||
cp.TotalAmount, -- ChangeNerworkValue
|
||||
uw.DiscountBalance,
|
||||
0, -- ChangeDiscountValue
|
||||
1, -- IsIncrease: true
|
||||
cp.Id, -- RefrenceId: PayoutId
|
||||
0,
|
||||
@CalculatedAt,
|
||||
'SP',
|
||||
@CalculatedAt,
|
||||
'SP'
|
||||
FROM CMS.UserCommissionPayouts cp
|
||||
INNER JOIN CMS.UserWallets uw ON uw.UserId = cp.UserId
|
||||
WHERE cp.WeekDefinitionId = @WeekDefinitionId;
|
||||
WHERE cp.WeeklyPoolId = @PoolId;
|
||||
|
||||
-- =============================================
|
||||
-- 10. بروزرسانی Pool
|
||||
|
||||
Reference in New Issue
Block a user