CREATE PROCEDURE [dbo].[CreateSummarySanad]   @Computername varchar(50), @IdSanad Bigint, @TypeSql Char (1) ,@MsgNum int output AS

   Declare @P_Code      Varchar (20)
   Declare @Acc_Code  Varchar (20)
   Declare @Acc_CodeLike  Varchar (20)
   Declare @Acc_Name  NVarchar (60)
   Declare @Has_Child   SmallInt
   Declare @ParentCode int
   Declare @PLen           Smallint
   Declare @AccLevel    Smallint
   Declare @Autoid        Bigint 
   Declare @Bedeh         Money
   Declare @Bestan        Money
   Declare @UserId        Smallint
   Declare @Type          Char
   Declare @LastAutoId BigInt

/***************************************************************************/
   Truncate Table SummarySanad
  /*****************************(ǐ    )*****************************/
   IF @TypeSql = '1' 
   Begin
      Declare SumSanad Cursor Local For
      SELECT      Account.Acc_Name, Sanad.Acc_Code, Sanad.Type, Account.Parent_Code, Account.Acc_Level, 
      Account.Has_Child, Sum(Sanad.Bedeh) Bedeh, Sum(Sanad.Bestan) Bestan, Sanad.User_Id
      FROM         Sanad INNER JOIN   Account ON Sanad.Acc_Code = Account.Acc_Code
      WHERE     (Sanad.Id_Sanad = @IdSanad) 
      GROUP BY Sanad.Acc_Code, Sanad.Type, Account.Acc_Name, Account.Parent_Code, Account.Acc_Level, Account.Has_Child , Sanad.User_Id    
      Having  Sum(Sanad.Bedeh)  > 0
      Open SumSanad

      Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan, @UserId
      Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code

     While @@FETCH_STATUS = 0     
     Begin
        Insert into  SummarySanad (Acc_Name,     Acc_Code ,    bedeh,      Bestan, Parent_Code, ComputerName,Acc_Level, Has_Child, User_Id)  
                                      values ( @Acc_Name + '   ', @Acc_Code, IsNull(@Bedeh,0),IsNull(@Bestan,0) ,  @ParentCode, @Computername,  @AccLevel,@Has_Child, @UserId)	
        Select @LastAutoId = @@Identity
   
        Insert Into  SummarySanad  (Acc_Name,   Bedeh,  Bestan, Parent_Code, ComputerName)      
        SELECT   Sanad.NOTE + '      ',  SUM(Sanad.BEDEH) Bedeh, SUM(Sanad.BESTAN)  Bestan, @LastAutoId, @Computername  
        FROM  Sanad INNER JOIN Account ON Sanad.Acc_Code = Account.Acc_Code
        WHERE     (Sanad.Id_Sanad = @IdSanad) AND (Sanad.Acc_Code = @Acc_Code) AND (Sanad.Type = @Type) And Sanad.User_Id = @UserId
        GROUP BY Sanad.NOTE, Account.Parent_Code, Account.Has_Child        

        Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan, @UserId
        Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code
     End

     Close SumSanad
     Deallocate SumSanad

    /*************************************************************************************/
     Declare SummerySanad Cursor Local For
     Select  Parent_Code, User_Id  From   SummarySanad  where ComputerName = @ComputerName 
                                                        And Bedeh > 0 And Acc_Code Is Not Null
     Group by Parent_Code, User_Id
     Order By Parent_Code


     Open  SummerySanad
     Fetch Next From  SummerySanad into @ParentCode, @UserId
   
     While @@FETCH_STATUS = 0     
      Begin
         Select @Acc_Name = Acc_Name ,  @Acc_Code = Acc_Code, @AccLevel = Acc_Level  From Account Where AutoId = @ParentCode
         Set @P_Code = @Acc_Code
      
         While  @AccLevel >= 2   
         Begin
            Select @Bedeh =  Sum(Bedeh) From SummarySanad Where Parent_Code = @ParentCode And User_Id = @UserId  And Bedeh > 0
            IF (Select Count (Acc_Code) From SummarySanad   Where Acc_Code = @P_Code and ComputerName = @ComputerName And User_Id = @UserId And Bedeh > 0) = 0 
            Begin
               Select @Acc_Name = Acc_Name, @ParentCode = Parent_Code  From Account Where Acc_Code = @P_Code    
               Insert Into  SummarySanad (Acc_Name   , Acc_Code ,Bedeh   ,Bestan, ComputerName, User_Id, Acc_Level, Parent_Code, Has_Child)
                                      Values (@Acc_Name, @P_Code ,@Bedeh,0, @ComputerName, @UserId, @AccLevel, @ParentCode, 1)
            End
            Else
            Begin
               Update SummarySanad set Bedeh =  @Bedeh  where Acc_Code = @P_Code And ComputerName  = @ComputerName And User_Id= @UserId And Bedeh >0
            End
            Select @P_Code = Dbo.GetParent (@P_Code)    
            Select @AccLevel = Acc_Level From Account Where Acc_Code = @P_Code
            Select @Acc_Name = Acc_Name  From Account Where Acc_Code = @P_Code    
        End
       Fetch Next From  SummerySanad into @ParentCode, @UserId
     End
    Close SummerySanad
    Deallocate SummerySanad

     Declare UpdateSummarySanad cursor local for
     Select  Acc_Code, User_Id, Autoid  From  SummarySanad   Where Has_Child = 1 And ComputerName = @ComputerName And Bedeh > 0
     Open UpdateSummarySanad

     Fetch Next From  UpdateSummarySanad into @Acc_Code, @UserId, @Autoid

     While @@FETCH_STATUS = 0     
     Begin
       Set @Acc_CodeLike = @Acc_Code + '%'
       Set @PLen = Len(@Acc_Code)
       Select @AccLevel = Acc_Level From Acc_Level Where Len = @PLen
       Set @Plen = @AccLevel + 1
       Update SummarySanad Set Parent_Code = @Autoid Where Acc_Code  <> @Acc_Code And User_Id = @UserId And Acc_Code Like @Acc_CodeLike And Bedeh> 0 And Acc_Level = @PLen
       Fetch Next From  UpdateSummarySanad into @Acc_Code, @UserId,@Autoid
     End

     Close UpdateSummarySanad
     Deallocate UpdateSummarySanad

   ---------------------------------------------------------------------------------------------------------------------------------------
      Declare SumSanad Cursor Local For
      SELECT      Account.Acc_Name, Sanad.Acc_Code, Sanad.Type, Account.Parent_Code, Account.Acc_Level, 
      Account.Has_Child, Sum(Sanad.Bedeh) Bedeh, Sum(Sanad.Bestan) Bestan, Sanad.User_Id
      FROM         Sanad INNER JOIN   Account ON Sanad.Acc_Code = Account.Acc_Code
      WHERE     (Sanad.Id_Sanad = @IdSanad)
      GROUP BY Sanad.Acc_Code, Sanad.Type, Account.Acc_Name, Account.Parent_Code, Account.Acc_Level, Account.Has_Child , Sanad.User_Id    
      Having  Sum(Sanad.Bestan)  > 0
      Open SumSanad

      Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan, @UserId
      Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code

     While @@FETCH_STATUS = 0     
     Begin
        Insert into  SummarySanad (Acc_Name,     Acc_Code ,    bedeh,      Bestan, Parent_Code, ComputerName,Acc_Level, Has_Child, User_Id)  
                                      values ( @Acc_Name + '   ', @Acc_Code, IsNull(@Bedeh,0),IsNull(@Bestan,0) ,  @ParentCode, @Computername,  @AccLevel,@Has_Child, @UserId)	
        Select @LastAutoId = @@Identity
   
        Insert Into  SummarySanad  (Acc_Name,   Bedeh,  Bestan, Parent_Code, ComputerName)      
        SELECT   Sanad.NOTE + '      ',  SUM(Sanad.BEDEH) Bedeh, SUM(Sanad.BESTAN)  Bestan, @LastAutoId, @Computername  
        FROM  Sanad INNER JOIN Account ON Sanad.Acc_Code = Account.Acc_Code
        WHERE     (Sanad.Id_Sanad = @IdSanad) AND (Sanad.Acc_Code = @Acc_Code) AND (Sanad.Type = @Type) And Sanad.User_Id = @UserId
        GROUP BY Sanad.NOTE, Account.Parent_Code, Account.Has_Child        

        Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan, @UserId
        Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code
     End

     Close SumSanad
     Deallocate SumSanad


     Declare SummerySanad Cursor Local For
     Select  Parent_Code, User_Id  From   SummarySanad  where ComputerName = @ComputerName 
                                                        And Bestan > 0 And Acc_Code Is Not Null
     Group by Parent_Code, User_Id
     Order By Parent_Code


     Open  SummerySanad
     Fetch Next From  SummerySanad into @ParentCode, @UserId
   
     While @@FETCH_STATUS = 0     
      Begin
         Select @Acc_Name = Acc_Name ,  @Acc_Code = Acc_Code, @AccLevel = Acc_Level  From Account Where AutoId = @ParentCode
         Set @P_Code = @Acc_Code
      
         While  @AccLevel >= 2   
         Begin
            Select @Bestan =  Sum(Bestan) From SummarySanad Where Parent_Code = @ParentCode And User_Id = @UserId  And Bestan > 0
            IF (Select Count (Acc_Code) From SummarySanad   Where Acc_Code = @P_Code and ComputerName = @ComputerName And User_Id = @UserId And Bestan > 0) = 0 
            Begin
               Select @Acc_Name = Acc_Name, @ParentCode = Parent_Code  From Account Where Acc_Code = @P_Code    
               Insert Into  SummarySanad (Acc_Name   , Acc_Code ,Bedeh   ,Bestan, ComputerName, User_Id, Acc_Level, Parent_Code, Has_Child)
                                      Values (@Acc_Name, @P_Code ,0, @Bestan, @ComputerName, @UserId, @AccLevel, @ParentCode, 1)
            End
            Else
            Begin
               Update SummarySanad set Bestan =  @Bestan  where Acc_Code = @P_Code And ComputerName  = @ComputerName And User_Id= @UserId And Bestan >0
            End
            Select @P_Code = Dbo.GetParent (@P_Code)    
            Select @AccLevel = Acc_Level From Account Where Acc_Code = @P_Code
            Select @Acc_Name = Acc_Name  From Account Where Acc_Code = @P_Code    
        End
       Fetch Next From  SummerySanad into @ParentCode, @UserId
     End
    Close SummerySanad
    Deallocate SummerySanad

     Declare UpdateSummarySanad cursor local for
     Select  Acc_Code, User_Id, Autoid  From  SummarySanad   Where Has_Child = 1 And ComputerName = @ComputerName And Bestan > 0
     Open UpdateSummarySanad

     Fetch Next From  UpdateSummarySanad into @Acc_Code, @UserId, @Autoid

     While @@FETCH_STATUS = 0     
     Begin
       Set @Acc_CodeLike = @Acc_Code + '%'
       Set @PLen = Len(@Acc_Code)
       Select @AccLevel = Acc_Level From Acc_Level Where Len = @PLen
       Set @Plen = @AccLevel + 1
       Update SummarySanad Set Parent_Code = @Autoid Where Acc_Code  <> @Acc_Code And User_Id = @UserId And Acc_Code Like @Acc_CodeLike And Bestan > 0 And Acc_Level = @PLen
       Fetch Next From  UpdateSummarySanad into @Acc_Code, @UserId,@Autoid
     End

     Close UpdateSummarySanad
     Deallocate UpdateSummarySanad

  ---------------------------------------------------------------------------------------------------------------------------------------
   End --IF @TypeSql = '1' */

  /*****************************(ǐ   )*****************************/
  Else
  IF @TypeSql = '0'
  Begin
      Declare SumSanad Cursor Local For
      SELECT Account.Acc_Name, Sanad.Acc_Code, Sanad.Type, Account.Parent_Code, Account.Acc_Level, 
      Account.Has_Child, Sum(Sanad.Bedeh) Bedeh, Sum(Sanad.Bestan) Bestan
      FROM         Sanad INNER JOIN   Account ON Sanad.Acc_Code = Account.Acc_Code
      WHERE     (Sanad.Id_Sanad = @IdSanad)
      GROUP BY Sanad.Acc_Code, Sanad.Type, Account.Acc_Name, Account.Parent_Code, Account.Acc_Level, Account.Has_Child     
      Having  Sum(Sanad.Bedeh)  > 0
      Open SumSanad

      Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan
      Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code

     While @@FETCH_STATUS = 0     
     Begin
        Insert into  SummarySanad (Acc_Name,     Acc_Code ,    bedeh,      Bestan, Parent_Code, ComputerName,Acc_Level, Has_Child)  
                                      values ( @Acc_Name + '   ', @Acc_Code, IsNull(@Bedeh,0),IsNull(@Bestan,0) ,  @ParentCode, @Computername,  @AccLevel,@Has_Child)	
        Select @LastAutoId = @@Identity
   
        Insert Into  SummarySanad  (Acc_Name,   Bedeh,  Bestan, Parent_Code, ComputerName)      
        SELECT   Sanad.NOTE + '      ',  SUM(Sanad.BEDEH) Bedeh, SUM(Sanad.BESTAN)  Bestan, @LastAutoId, @Computername  
        FROM  Sanad INNER JOIN Account ON Sanad.Acc_Code = Account.Acc_Code
        WHERE     (Sanad.Id_Sanad = @IdSanad) AND (Sanad.Acc_Code = @Acc_Code) AND (Sanad.Type = @Type)
        GROUP BY Sanad.NOTE, Account.Parent_Code, Account.Has_Child        

        Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan
        Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code
     End

     Close SumSanad
     Deallocate SumSanad

    /*************************************************************************************/
     Declare SummerySanad Cursor Local For
     Select  Parent_Code  From   SummarySanad  where ComputerName = @ComputerName 
                                               And Bedeh > 0 And Acc_Code Is Not Null
     Group by Parent_Code
     Order By Parent_Code


     Open  SummerySanad
     Fetch Next From  SummerySanad into @ParentCode
   
     While @@FETCH_STATUS = 0     
      Begin
         Select @Acc_Name = Acc_Name ,  @Acc_Code = Acc_Code, @AccLevel = Acc_Level  From Account Where AutoId = @ParentCode
         Set @P_Code = @Acc_Code
      
         While  @AccLevel >= 2   
         Begin
            Select @Bedeh =  Sum(Bedeh) From SummarySanad Where Parent_Code = @ParentCode And Bedeh > 0
            IF (Select Count (Acc_Code) From SummarySanad   Where Acc_Code = @P_Code and ComputerName = @ComputerName  And Bedeh > 0) = 0 
            Begin
               Select @Acc_Name = Acc_Name, @ParentCode = Parent_Code  From Account Where Acc_Code = @P_Code    
               Insert Into  SummarySanad (Acc_Name   , Acc_Code ,Bedeh   ,Bestan, ComputerName, Acc_Level, Parent_Code, Has_Child)
                                      Values (@Acc_Name, @P_Code ,@Bedeh,0, @ComputerName, @AccLevel, @ParentCode, 1)
            End
            Else
            Begin
               Update SummarySanad set Bedeh =  @Bedeh  where Acc_Code = @P_Code And ComputerName  = @ComputerName And Bedeh >0
            End
            Select @P_Code = Dbo.GetParent (@P_Code)    
            Select @AccLevel = Acc_Level From Account Where Acc_Code = @P_Code
            Select @Acc_Name = Acc_Name  From Account Where Acc_Code = @P_Code    
        End
       Fetch Next From  SummerySanad into @ParentCode
     End
    Close SummerySanad
    Deallocate SummerySanad

     Declare UpdateSummarySanad cursor local for
     Select  Acc_Code, Autoid  From  SummarySanad   Where Has_Child = 1 And ComputerName = @ComputerName And Bedeh > 0
     Open UpdateSummarySanad

     Fetch Next From  UpdateSummarySanad into @Acc_Code,@Autoid

     While @@FETCH_STATUS = 0     
     Begin
       Set @Acc_CodeLike = @Acc_Code + '%'
       Set @PLen = Len(@Acc_Code)
       Select @AccLevel = Acc_Level From Acc_Level Where Len = @PLen
       Set @Plen = @AccLevel + 1
       Update SummarySanad Set Parent_Code = @Autoid Where Acc_Code  <> @Acc_Code  And Acc_Code Like @Acc_CodeLike And Bedeh> 0 And Acc_Level = @PLen
       Fetch Next From  UpdateSummarySanad into @Acc_Code, @Autoid
     End

     Close UpdateSummarySanad
     Deallocate UpdateSummarySanad

   ---------------------------------------------------------------------------------------------------------------------------------------
      Declare SumSanad Cursor Local For
      SELECT      Account.Acc_Name, Sanad.Acc_Code, Sanad.Type, Account.Parent_Code, Account.Acc_Level, 
      Account.Has_Child, Sum(Sanad.Bedeh) Bedeh, Sum(Sanad.Bestan) Bestan
      FROM         Sanad INNER JOIN   Account ON Sanad.Acc_Code = Account.Acc_Code
      WHERE     (Sanad.Id_Sanad = @IdSanad) 
      GROUP BY Sanad.Acc_Code, Sanad.Type, Account.Acc_Name, Account.Parent_Code, Account.Acc_Level, Account.Has_Child     
      Having  Sum(Sanad.Bestan)  > 0
      Open SumSanad

      Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan
      Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code

     While @@FETCH_STATUS = 0     
     Begin
        Insert into  SummarySanad (Acc_Name,     Acc_Code ,    bedeh,      Bestan, Parent_Code, ComputerName,Acc_Level, Has_Child)  
                                      values ( @Acc_Name + '   ', @Acc_Code, IsNull(@Bedeh,0),IsNull(@Bestan,0) ,  @ParentCode, @Computername,  @AccLevel,@Has_Child)	
        Select @LastAutoId = @@Identity
   
        Insert Into  SummarySanad  (Acc_Name,   Bedeh,  Bestan, Parent_Code, ComputerName)      
        SELECT    Sanad.NOTE + '      ',  SUM(Sanad.BEDEH) Bedeh, SUM(Sanad.BESTAN)  Bestan, @LastAutoId, @Computername  
        FROM  Sanad INNER JOIN Account ON Sanad.Acc_Code = Account.Acc_Code
        WHERE     (Sanad.Id_Sanad = @IdSanad) AND (Sanad.Acc_Code = @Acc_Code) AND (Sanad.Type = @Type)
        GROUP BY Sanad.NOTE, Account.Parent_Code, Account.Has_Child        
        Fetch Next From  SumSanad into @Acc_Name, @Acc_Code, @Type , @ParentCode, @AccLevel , @Has_Child, @Bedeh, @Bestan
        Select @AccLevel = Acc_Level From Account Where Acc_Code = @Acc_Code
     End

     Close SumSanad
     Deallocate SumSanad

     Declare SummerySanad Cursor Local For
     Select  Parent_Code  From   SummarySanad  where ComputerName = @ComputerName 
                                               And Bestan > 0 And Acc_Code Is Not Null
     Group by Parent_Code
     Order By Parent_Code

     Open  SummerySanad
     Fetch Next From  SummerySanad into @ParentCode
   
     While @@FETCH_STATUS = 0     
      Begin
         Select @Acc_Name = Acc_Name ,  @Acc_Code = Acc_Code, @AccLevel = Acc_Level  From Account Where AutoId = @ParentCode
         Set @P_Code = @Acc_Code
      
         While  @AccLevel >= 2   
         Begin
            Select @Bestan =  Sum(Bestan) From SummarySanad Where Parent_Code = @ParentCode   And Bestan > 0
            IF (Select Count (Acc_Code) From SummarySanad   Where Acc_Code = @P_Code and ComputerName = @ComputerName And Bestan > 0) = 0 
            Begin
               Select @Acc_Name = Acc_Name, @ParentCode = Parent_Code  From Account Where Acc_Code = @P_Code    
               Insert Into  SummarySanad (Acc_Name   , Acc_Code ,Bedeh   ,Bestan, ComputerName, Acc_Level, Parent_Code, Has_Child)
                                      Values (@Acc_Name, @P_Code ,0, @Bestan, @ComputerName,  @AccLevel, @ParentCode, 1)
            End
            Else
            Begin
               Update SummarySanad set Bestan =  @Bestan  where Acc_Code = @P_Code And ComputerName  = @ComputerName And Bestan >0
            End
            Select @P_Code = Dbo.GetParent (@P_Code)    
            Select @AccLevel = Acc_Level From Account Where Acc_Code = @P_Code
            Select @Acc_Name = Acc_Name  From Account Where Acc_Code = @P_Code    
        End
       Fetch Next From  SummerySanad into @ParentCode
     End
    Close SummerySanad
    Deallocate SummerySanad

     Declare UpdateSummarySanad cursor local for
     Select  Acc_Code, Autoid  From  SummarySanad   Where Has_Child = 1 And ComputerName = @ComputerName And Bestan > 0
     Open UpdateSummarySanad

     Fetch Next From  UpdateSummarySanad into @Acc_Code, @Autoid

     While @@FETCH_STATUS = 0     
     Begin
       Set @Acc_CodeLike = @Acc_Code + '%'
       Set @PLen = Len(@Acc_Code)
       Select @AccLevel = Acc_Level From Acc_Level Where Len = @PLen
       Set @Plen = @AccLevel + 1
       Update SummarySanad Set Parent_Code = @Autoid Where Acc_Code  <> @Acc_Code  And Acc_Code Like @Acc_CodeLike And Bestan > 0 And Acc_Level = @PLen
       Fetch Next From  UpdateSummarySanad into @Acc_Code, @Autoid
     End

     Close UpdateSummarySanad
     Deallocate UpdateSummarySanad
  End --IF TypeSql = '0'
