diff --git a/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyCommissionPool.sql b/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyCommissionPool.sql index 69faddb..50f55d1 100644 --- a/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyCommissionPool.sql +++ b/src/CMSMicroservice.Infrastructure/Persistence/StoredProcedures/sp_CalculateWeeklyCommissionPool.sql @@ -28,9 +28,9 @@ BEGIN -- ============================================= -- 1. پیدا کردن Pool هفته (فیلتر بر اساس PackageId) -- ============================================= - SELECT @PoolId = Id, @TotalPoolAmount = TotalPoolAmount + SELECT @PoolId = MIN(Id), @TotalPoolAmount = ISNULL(SUM(TotalPoolAmount), 0) FROM CMS.WeeklyCommissionPools - WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId; + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0; -- اگر Pool وجود ندارد (هیچ فعال‌سازی در این هفته نبوده)، یک رکورد خالی ایجاد می‌کنیم IF @PoolId IS NULL @@ -50,7 +50,15 @@ BEGIN -- ============================================= -- 2. بررسی محاسبات قبلی (بر اساس همین Pool نه کل هفته) -- ============================================= - IF EXISTS (SELECT 1 FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId) + IF EXISTS ( + SELECT 1 + FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ) + ) BEGIN IF @ForceRecalculate = 0 BEGIN @@ -70,30 +78,67 @@ BEGIN (SELECT SUM(wl.ChangeNerworkValue) FROM CMS.UserWalletHistories wl WHERE wl.WalletId = uw.Id - AND wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId) + AND wl.RefrenceId IN ( + SELECT Id + FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ) + ) ), 0) FROM CMS.UserWallets uw WHERE uw.Id IN ( SELECT DISTINCT wl.WalletId FROM CMS.UserWalletHistories wl - WHERE wl.RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId) + WHERE wl.RefrenceId IN ( + SELECT Id + FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ) + ) ); -- حذف لاگ‌های تغییرات قبلی DELETE FROM CMS.UserWalletHistories - WHERE RefrenceId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId); + WHERE RefrenceId IN ( + SELECT Id + FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ) + ); -- حذف تاریخچه پرداخت DELETE FROM CMS.CommissionPayoutHistories - WHERE UserCommissionPayoutId IN (SELECT Id FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId); + WHERE UserCommissionPayoutId IN ( + SELECT Id + FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ) + ); -- حذف پرداخت‌های قبلی این Pool - DELETE FROM CMS.UserCommissionPayouts WHERE WeeklyPoolId = @PoolId; + DELETE FROM CMS.UserCommissionPayouts + WHERE WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ); -- Reset وضعیت Pool UPDATE CMS.WeeklyCommissionPools SET IsCalculated = 0 - WHERE Id = @PoolId; + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0; END -- ============================================= @@ -104,7 +149,7 @@ BEGIN -- بالانسی محاسبه نشده — pool را به عنوان "محاسبه شده بدون پرداخت" علامت می‌زنیم UPDATE CMS.WeeklyCommissionPools SET IsCalculated = 1, CalculatedAt = @CalculatedAt - WHERE Id = @PoolId; + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0; COMMIT TRANSACTION; RETURN; @@ -122,7 +167,7 @@ BEGIN -- هیچ تعادلی برای توزیع وجود ندارد — pool محاسبه شده اما پرداختی ندارد UPDATE CMS.WeeklyCommissionPools SET IsCalculated = 1, CalculatedAt = @CalculatedAt - WHERE Id = @PoolId; + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0; COMMIT TRANSACTION; RETURN; @@ -140,6 +185,7 @@ BEGIN UserId, WeekDefinitionId, WeeklyPoolId, + PackageId, BalancesEarned, ValuePerBalance, TotalAmount, @@ -155,6 +201,7 @@ BEGIN nb.UserId, @WeekDefinitionId, @PoolId, + @PackageId, nb.TotalBalances, @ValuePerBalance, nb.TotalBalances * @ValuePerBalance, @@ -205,7 +252,11 @@ BEGIN @CalculatedAt, 'SP' FROM CMS.UserCommissionPayouts cp - WHERE cp.WeeklyPoolId = @PoolId; + WHERE cp.WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ); -- ============================================= -- 9. شارژ کیف پول کاربران @@ -216,7 +267,11 @@ BEGIN SET uw.NetworkBalance = uw.NetworkBalance + cp.TotalAmount FROM CMS.UserWallets uw INNER JOIN CMS.UserCommissionPayouts cp ON cp.UserId = uw.UserId - WHERE cp.WeeklyPoolId = @PoolId; + WHERE cp.WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ); -- ثبت لاگ تغییرات کیف پول INSERT INTO CMS.UserWalletHistories ( @@ -252,7 +307,11 @@ BEGIN 'SP' FROM CMS.UserCommissionPayouts cp INNER JOIN CMS.UserWallets uw ON uw.UserId = cp.UserId - WHERE cp.WeeklyPoolId = @PoolId; + WHERE cp.WeeklyPoolId IN ( + SELECT Id + FROM CMS.WeeklyCommissionPools + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0 + ); -- ============================================= -- 10. بروزرسانی Pool @@ -265,7 +324,7 @@ BEGIN ValuePerBalance = @ValuePerBalance, LastModified = @CalculatedAt, LastModifiedBy = 'SP' - WHERE Id = @PoolId; + WHERE WeekDefinitionId = @WeekDefinitionId AND PackageId = @PackageId AND IsDeleted = 0; COMMIT TRANSACTION; diff --git a/src/CMSMicroservice.Infrastructure/Services/Commission/StoredProcedureCommissionCalculationStrategy.cs b/src/CMSMicroservice.Infrastructure/Services/Commission/StoredProcedureCommissionCalculationStrategy.cs index b37459a..1eb3d15 100644 --- a/src/CMSMicroservice.Infrastructure/Services/Commission/StoredProcedureCommissionCalculationStrategy.cs +++ b/src/CMSMicroservice.Infrastructure/Services/Commission/StoredProcedureCommissionCalculationStrategy.cs @@ -141,6 +141,7 @@ public class StoredProcedureCommissionCalculationStrategy : ICommissionCalculati // حلقه روی پکیج‌ها — هر پکیج Pool مستقل دارد foreach (var package in activePackages) { + using var command = connection.CreateCommand(); command.CommandText = "CMS.sp_CalculateWeeklyCommissionPool"; command.CommandType = System.Data.CommandType.StoredProcedure;