/*********************************************************************
   تنظیمات اولیه
*********************************************************************/
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 ===';

GO