Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Has been cancelled

This commit is contained in:
masoodafar-web
2026-05-01 00:15:48 +03:30
18 changed files with 423 additions and 115 deletions
@@ -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
@@ -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