

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [dbo].[ACCspUpdateSingleAccount_Cascade]
    @LevelType NVARCHAR(20),  /* -- نوع حسابی که ویرایش شده: 'KOL' یا 'MOEIN'*/
    @TargetID INT,            /*-- شناسه رکورد (KOLID یا HESABID)*/
    @NewCode NVARCHAR(50)     /*-- کد جدیدی که کاربر وارد کرده است*/
AS
BEGIN
    SET NOCOUNT ON;
    
    /*-- ضریب ثابت طبق سناریوی شما*/
    DECLARE @Multiplier BIGINT = 1000; 

    BEGIN TRY
        BEGIN TRANSACTION;

         /*=============================================
         حالت اول: ویرایش حساب کل (KOL)
         تاثیر: آپدیت خود کل + آپدیت معین‌ها + آپدیت تفصیلی‌ها
         =============================================*/
        IF @LevelType = 'KOL'
        BEGIN
            /*-- 1. آپدیت کد خود حساب کل*/
            UPDATE dbo.T_KolHesab
            SET KolNumber = @NewCode
            WHERE KOLID = @TargetID;

            /*-- 2. آپدیت حساب‌های معین زیرمجموعه این کل*/
            /*-- فرمول: (کد کل جدید * 1000) + (بخش انتهایی کد معین قبلی)*/
            /*-- بخش انتهایی = HESABNumber % 1000*/
            UPDATE dbo.T_Heasb
            SET HESABNumber = CAST(
                                (CAST(@NewCode AS BIGINT) * @Multiplier) 
                                + (CAST(HESABNumber AS BIGINT) % @Multiplier)
                              AS NVARCHAR(50))
            WHERE KOLID = @TargetID 
              AND ISNUMERIC(HESABNumber) = 1;

            /*-- 3. آپدیت حساب‌های تفصیلی (نوه های حساب کل)*/
            /*-- چون کد معین عوض شده، کد تفصیلی هم باید عوض شود*/
            /*-- فرمول پیچیده: محاسبه بر اساس کد معینِ جدید شده*/
            UPDATE T
            SET THESABNumber = CAST(
                                (CAST(M.HESABNumber AS BIGINT) * @Multiplier) 
                                + (CAST(T.THESABNumber AS BIGINT) % @Multiplier)
                               AS NVARCHAR(50))
            FROM dbo.T_T_Heasb T
            INNER JOIN dbo.T_Heasb M ON T.HESABID = M.HESABID
            WHERE M.KOLID = @TargetID 
              AND ISNUMERIC(T.THESABNumber) = 1;
        END

        /* =============================================
         حالت دوم: ویرایش حساب معین (MOEIN)
         تاثیر: آپدیت خود معین + آپدیت تفصیلی‌ها
         =============================================*/
        ELSE IF @LevelType = 'MOEIN'
        BEGIN
            /*-- 1. آپدیت کد خود حساب معین*/
            UPDATE dbo.T_Heasb
            SET HESABNumber = @NewCode
            WHERE HESABID = @TargetID;

            /*-- 2. آپدیت حساب‌های تفصیلی زیرمجموعه این معین*/
            /*-- فرمول: (کد معین جدید * 1000) + (بخش انتهایی کد تفصیلی قبلی)*/
            UPDATE dbo.T_T_Heasb
            SET THESABNumber = CAST(
                                (CAST(@NewCode AS BIGINT) * @Multiplier) 
                                + (CAST(THESABNumber AS BIGINT) % @Multiplier)
                              AS NVARCHAR(50))
            WHERE HESABID = @TargetID
              AND ISNUMERIC(THESABNumber) = 1;
        END

        COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
        ROLLBACK TRANSACTION;
        
    END CATCH
END;
GO

/****** Object:  StoredProcedure [dbo].[ACCspCorrectAccountsBazargani]    Script Date: 03/30/2026 13:38:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create PROCEDURE [dbo].[ACCspCorrectAccountsBazargani]
	@Userid INT
AS
BEGIN
	
/*********************************************************************
   تنظيمات اوليه
*********************************************************************/
DECLARE @Kol_Digits INT; SET @Kol_Digits = 3;   /*-- ضريب 1000*/
DECLARE @Start_Val  INT; SET @Start_Val  = 100; /*-- شروع از 100*/
DECLARE @Step_Val   INT; SET @Step_Val   = 1;   /*-- گام 1*/

DECLARE @Multiplier BIGINT;
SET @Multiplier = POWER(10, @Kol_Digits); /*-- 1000*/

PRINT '=== STARTING UPDATE PROCESS ===';

/*********************************************************************
   مرحله 1: اصلاح شماره گروه (GoNumber) در جدول T_GropHesab
   دقيقاً طبق ليست ارسالي شما بر اساس GOID
*********************************************************************/
PRINT '1. Updating GoNumber based on GOID mapping...';

/*-- آپديت تجميعي با استفاده از CASE براي اطمينان از صحت نگاشت*/
UPDATE dbo.T_GropHesab
SET GoNumber = CASE GOID
    WHEN 1 THEN '1'  /*-- داراييهاي غير جاري*/
    WHEN 2 THEN '2'  /*-- داراييهاي جاري*/
    WHEN 3 THEN '3'  /*-- بدهيهاي بلند مدت*/
    WHEN 4 THEN '4'  /*-- بدهيهاي جاري*/
    WHEN 5 THEN '5'  /*-- حقوق صاحبان سهام*/
    WHEN 6 THEN '6'  /*-- بهاي تمام شده*/
    WHEN 8 THEN '7'  /*-- درآمدها (طبق فايل شما: GoNumber=7 براي GOID=8)*/
    WHEN 9 THEN '8'  /*-- هزينه ها (طبق فايل شما: GoNumber=8 براي GOID=9)*/
    WHEN 7 THEN '9'  /*-- ساير حسابها (طبق فايل شما: GoNumber=9 براي GOID=7)*/
    ELSE GoNumber    /*-- ساير موارد بدون تغيير*/
END
WHERE GOID IN (1, 2, 3, 4, 5, 6, 7, 8, 9);

PRINT '   GoNumber updated successfully.';

/*********************************************************************
   مرحله 2: ساخت کد کل (KolNumber)
   فرمول: (GoNumber * 1000) + 100 + RowIndex
*********************************************************************/
PRINT '2. Updating Kol Level...';

;WITH KolUpdateCTE AS (
    SELECT 
        K.KOLID,
        K.GOID,
        K.KolNumber,
        G.GoNumber,
        ROW_NUMBER() OVER (PARTITION BY K.GOID ORDER BY K.KOLID ASC) - 1 AS RowIndex
    FROM dbo.T_KolHesab K
    INNER JOIN dbo.T_GropHesab G ON K.GOID = G.GOID
    WHERE ISNUMERIC(G.GoNumber) = 1
)
UPDATE KolUpdateCTE
SET KolNumber = CAST(
                    (CAST(GoNumber AS BIGINT) * @Multiplier) 
                    + @Start_Val 
                    + (RowIndex * @Step_Val)
                  AS NVARCHAR(50));

/*********************************************************************
   مرحله 3: ساخت کد معين (HESABNumber)
   بر اساس کد کل جديد
*********************************************************************/
PRINT '3. Updating Moein Level...';

;WITH MoeinUpdateCTE AS (
    SELECT 
        M.HESABID,
        M.KOLID,
        M.HESABNumber,
        CAST(K.KolNumber AS BIGINT) AS ParentKolCode,
        ROW_NUMBER() OVER (PARTITION BY M.KOLID ORDER BY M.HESABID ASC) - 1 AS RowIndex
    FROM dbo.T_Heasb M
    INNER JOIN dbo.T_KolHesab K ON M.KOLID = K.KOLID
    WHERE ISNUMERIC(K.KolNumber) = 1
)
UPDATE MoeinUpdateCTE
SET HESABNumber = CAST(
                    (ParentKolCode * @Multiplier) 
                    + @Start_Val 
                    + (RowIndex * @Step_Val) 
                  AS NVARCHAR(50));

/*********************************************************************
   مرحله 4: ساخت کد تفصيلي (THESABNumber)
   بر اساس کد معين جديد
*********************************************************************/
PRINT '4. Updating Tafsili Level...';

;WITH TafsiliUpdateCTE AS (
    SELECT 
        T.THESABID,
        T.HESABID,
        T.THESABNumber,
        CAST(M.HESABNumber AS BIGINT) AS ParentMoeinCode,
        ROW_NUMBER() OVER (PARTITION BY T.HESABID ORDER BY T.THESABID ASC) - 1 AS RowIndex
    FROM dbo.T_T_Heasb T
    INNER JOIN dbo.T_Heasb M ON T.HESABID = M.HESABID
    WHERE ISNUMERIC(M.HESABNumber) = 1
)
UPDATE TafsiliUpdateCTE
SET THESABNumber = CAST(
                    (ParentMoeinCode * @Multiplier) 
                    + @Start_Val 
                    + (RowIndex * @Step_Val) 
                  AS NVARCHAR(50));

PRINT '=== DONE ===';



END       