feat: Add GetNetworkTree stored procedure for binary network retrieval with activation logic
Build and Deploy to Production / build-and-deploy (push) Successful in 8m27s
Build and Deploy to Production / build-and-deploy (push) Successful in 8m27s
This commit is contained in:
@@ -0,0 +1,136 @@
|
|||||||
|
-- =============================================
|
||||||
|
-- Stored Procedure: GetNetworkTree
|
||||||
|
-- Description: دریافت درخت شبکه باینری با CTE recursive
|
||||||
|
-- Author: FourSat Team
|
||||||
|
-- Updated: 2026-04-30 — اضافه کردن IsNewActivation، PackageName، PackageId
|
||||||
|
-- منطق هفتهبندی از ActivatedAt به PackagePurchasedAt تغییر کرد
|
||||||
|
-- =============================================
|
||||||
|
|
||||||
|
CREATE OR ALTER PROCEDURE [CMS].[GetNetworkTree]
|
||||||
|
@RootUserId BIGINT,
|
||||||
|
@MaxDepth INT = 100,
|
||||||
|
@IsClubActive BIT = NULL,
|
||||||
|
@ActivationWeekDefinitionId BIGINT = NULL
|
||||||
|
AS
|
||||||
|
BEGIN
|
||||||
|
SET NOCOUNT ON;
|
||||||
|
|
||||||
|
-- تاریخ شروع و پایان هفته فیلتر
|
||||||
|
DECLARE @WeekStartDate DATETIME = NULL;
|
||||||
|
DECLARE @WeekEndDate DATETIME = NULL;
|
||||||
|
|
||||||
|
IF @ActivationWeekDefinitionId IS NOT NULL
|
||||||
|
BEGIN
|
||||||
|
SELECT @WeekStartDate = StartDate, @WeekEndDate = EndDate
|
||||||
|
FROM [CMS].[WeekDefinitions]
|
||||||
|
WHERE Id = @ActivationWeekDefinitionId;
|
||||||
|
END
|
||||||
|
|
||||||
|
-- CTE برای پیمایش درخت باینری به صورت recursive
|
||||||
|
;WITH NetworkTreeCTE AS (
|
||||||
|
-- Base case: ریشه درخت
|
||||||
|
SELECT
|
||||||
|
u.Id AS UserId,
|
||||||
|
u.Mobile,
|
||||||
|
u.FirstName,
|
||||||
|
u.LastName,
|
||||||
|
u.ReferralCode,
|
||||||
|
u.LegPosition,
|
||||||
|
u.NetworkParentId AS ParentId,
|
||||||
|
0 AS NetworkLevel,
|
||||||
|
u.Created AS UserCreated
|
||||||
|
FROM [CMS].[Users] u
|
||||||
|
WHERE u.Id = @RootUserId
|
||||||
|
AND u.IsDeleted = 0
|
||||||
|
|
||||||
|
UNION ALL
|
||||||
|
|
||||||
|
-- Recursive case: فرزندان
|
||||||
|
SELECT
|
||||||
|
u.Id AS UserId,
|
||||||
|
u.Mobile,
|
||||||
|
u.FirstName,
|
||||||
|
u.LastName,
|
||||||
|
u.ReferralCode,
|
||||||
|
u.LegPosition,
|
||||||
|
u.NetworkParentId AS ParentId,
|
||||||
|
parent.NetworkLevel + 1 AS NetworkLevel,
|
||||||
|
u.Created AS UserCreated
|
||||||
|
FROM [CMS].[Users] u
|
||||||
|
INNER JOIN NetworkTreeCTE parent ON u.NetworkParentId = parent.UserId
|
||||||
|
WHERE u.IsDeleted = 0
|
||||||
|
AND parent.NetworkLevel < @MaxDepth
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
t.UserId,
|
||||||
|
t.Mobile,
|
||||||
|
t.FirstName,
|
||||||
|
t.LastName,
|
||||||
|
t.ReferralCode,
|
||||||
|
t.LegPosition,
|
||||||
|
t.ParentId,
|
||||||
|
t.NetworkLevel,
|
||||||
|
cm.ActivatedAt AS ClubActivatedAt,
|
||||||
|
ISNULL(cm.IsActive, 0) AS IsClubActive,
|
||||||
|
|
||||||
|
-- هفته فعالسازی بر اساس Cycle جاری (PackagePurchasedAt)
|
||||||
|
wd.Id AS ActivationWeekDefinitionId,
|
||||||
|
wd.DisplayName AS ActivationWeekDisplayName,
|
||||||
|
|
||||||
|
-- آیا کاربر در هفته هدف Cycle داشته؟
|
||||||
|
CASE WHEN cc_target.UserId IS NOT NULL THEN 1 ELSE 0 END AS IsActivatedInTargetWeek,
|
||||||
|
|
||||||
|
-- نوع فعالسازی: 1=جدید، 0=تمدید/خرید مجدد، NULL=بدون Cycle
|
||||||
|
CASE
|
||||||
|
WHEN cc_eff.CycleNumber IS NULL THEN NULL
|
||||||
|
WHEN cc_eff.CycleNumber = 1 THEN 1
|
||||||
|
ELSE 0
|
||||||
|
END AS IsNewActivation,
|
||||||
|
|
||||||
|
-- نام پکیج موثر (هفته هدف اگر فیلتر باشد، وگرنه پکیج فعلی)
|
||||||
|
ISNULL(p_eff.Title, '') AS PackageName,
|
||||||
|
cc_eff.PackageId AS PackageId,
|
||||||
|
|
||||||
|
t.UserCreated
|
||||||
|
FROM NetworkTreeCTE t
|
||||||
|
LEFT JOIN [CMS].[ClubMemberships] cm ON cm.UserId = t.UserId AND cm.IsDeleted = 0
|
||||||
|
|
||||||
|
-- Cycle جاری — برای نمایش هفته و پکیج وقتی فیلتر هفته نیست
|
||||||
|
OUTER APPLY (
|
||||||
|
SELECT TOP 1 CycleNumber, PackageId, PackagePurchasedAt
|
||||||
|
FROM [CMS].[ClubMembershipCycles]
|
||||||
|
WHERE UserId = t.UserId AND IsCurrentCycle = 1
|
||||||
|
) cc_current
|
||||||
|
|
||||||
|
-- Cycle هفته هدف — برای IsActivatedInTargetWeek و نوع فعالسازی
|
||||||
|
OUTER APPLY (
|
||||||
|
SELECT TOP 1 UserId, CycleNumber, PackageId
|
||||||
|
FROM [CMS].[ClubMembershipCycles]
|
||||||
|
WHERE UserId = t.UserId
|
||||||
|
AND @WeekStartDate IS NOT NULL
|
||||||
|
AND PackagePurchasedAt >= @WeekStartDate
|
||||||
|
AND PackagePurchasedAt < @WeekEndDate
|
||||||
|
ORDER BY CycleNumber ASC
|
||||||
|
) cc_target
|
||||||
|
|
||||||
|
-- Cycle موثر: اگر هفته فیلتر داریم → cc_target، وگرنه → cc_current
|
||||||
|
CROSS APPLY (
|
||||||
|
SELECT
|
||||||
|
CASE WHEN @WeekStartDate IS NOT NULL AND cc_target.UserId IS NOT NULL
|
||||||
|
THEN cc_target.CycleNumber ELSE cc_current.CycleNumber END AS CycleNumber,
|
||||||
|
CASE WHEN @WeekStartDate IS NOT NULL AND cc_target.UserId IS NOT NULL
|
||||||
|
THEN cc_target.PackageId ELSE cc_current.PackageId END AS PackageId
|
||||||
|
) cc_eff
|
||||||
|
|
||||||
|
-- پکیج موثر
|
||||||
|
LEFT JOIN [CMS].[Packages] p_eff ON p_eff.Id = cc_eff.PackageId AND p_eff.IsDeleted = 0
|
||||||
|
|
||||||
|
-- هفته بر اساس PackagePurchasedAt سایکل جاری
|
||||||
|
LEFT JOIN [CMS].[WeekDefinitions] wd
|
||||||
|
ON cc_current.PackagePurchasedAt >= wd.StartDate
|
||||||
|
AND cc_current.PackagePurchasedAt < wd.EndDate
|
||||||
|
|
||||||
|
WHERE (@IsClubActive IS NULL OR ISNULL(cm.IsActive, 0) = @IsClubActive OR t.NetworkLevel = 0)
|
||||||
|
ORDER BY t.NetworkLevel, t.ParentId, t.LegPosition
|
||||||
|
OPTION (MAXRECURSION 0);
|
||||||
|
END
|
||||||
Reference in New Issue
Block a user