CREATE Procedure [dbo].[Create_Sanad_Radif]   @msg_num BigInt  OUTPUT, @Act  Smallint ,  @Code  VarChar(20)  ,@Price Money,@PNote NvarChar(100) , @Nu_Sanad Bigint,@TmpOrMainOrAutoSanad Char,@Guid_Cheqe Uniqueidentifier ,@Acc_Code_Cheqe VarChar(20),@Id_Cheqe Bigint
AS
Declare  @Guid_Sanad          Uniqueidentifier
Declare  @Acc_Code            VarChar(20)
Declare  @Acc_Code_Equal      VarChar(20)
Declare  @Parent_Code         VarChar(20)
Declare  @Parent_Code_Equal   VarChar(20)
Declare  @Type                Bit  
Declare  @ActNote             NvarChar(100)
Declare  @Note                NVarChar(150)
Declare  @Auto                Char
DEclare  @UserId              Smallint
Declare  @TypeSanad           Char(1)
Declare  @StoreCode           Varchar(3)
Declare  @Autoid              Bigint

Begin Tran D1 


    Select @TypeSanad = Type From Auto_Code
    IF (@TypeSanad Is Null) Or (@TypeSanad = '')
      Set @TypeSanad = '0'

    Select @Userid = User_Id, @StoreCode = Store_Code From HeadC Where Id_Cheqe = @Id_Cheqe
    DECLARE Cursor_Act CURSOR FOR 
    SELECT Type , Note_In_Sanad , Parent_Code ,Parent_Code_Equal
    FROM dbo.Act Where (Act_Code=@Act )
    OPEN Cursor_Act
    

    FETCH NEXT FROM Cursor_Act INTO  @Type,@ActNote , @Parent_Code, @Parent_Code_Equal

    Set @msg_Num=0
    -- اضافه به سند خودکار و بدست آورن شماره سند خودکار
    IF @TmpOrMainOrAutoSanad='0' 
    Begin
       IF @@FETCH_STATUS = 0 
       Begin
         SELECT @NU_Sanad=Id_Sanad,@Auto=Auto FROM dbo.heads
         Where (DateDiff(day,Tarikh_User,getdate() ) =0 ) And (Auto=1)
       
         IF (@Nu_Sanad Is not Null) And (@Auto='0') and (@Nu_Sanad  > 0) 
         Begin
           Update Dbo.Heads Set Auto='1'  Where Nu_Manual=dbo.samsi_Date(GetDate())  
           IF @@Error > 0 
           Begin
             ROLLBACK TRANSACTION D1
             Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
             RETURN   @msg_num  --@@Error
           End 
         End  
          	
         IF (@NU_Sanad Is Null) Or (@NU_Sanad=0) -- اگر قبلا با اين شماره در سندها وجود نداشته باشد
         Begin 
           Insert Into Dbo.Heads(Auto,Fiexd,Nu_Manual, Store_Code, User_Id) 
           Values(1,0,dbo.samsi_Date(GetDate()), @StoreCode, @UserId)
           IF @@Error > 0 
           Begin
             ROLLBACK TRANSACTION D1
             Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
             RETURN   @msg_num  --@@Error
           End 
           Select @Nu_Sanad=Scope_Identity() --   به دست آوردن شماره آخرين سند 
         End 
         Select @msg_Num=@Nu_Sanad
       End --IF @@FETCH_STATUS = 0 
    End --IF @TmpOrMainOrAutoSanad='0' 
   -------------------------------------------------------------------------------------------
    WHILE @@FETCH_STATUS = 0
    BEGIN 
      Set @Acc_Code='0'
      Set @Acc_Code_Equal='0' 
      SELECT @Acc_Code=dbo.Acc_link.Acc_Code FROM dbo. Acc_link 
      WHERE (Acc_link.Code = @Code) And (Acc_Parent_Code=@Parent_Code )
      SELECT @Acc_Code_Equal=dbo.Acc_link.Acc_Code FROM dbo. Acc_link
      WHERE (Acc_link.Code = @Code) And (Acc_Parent_Code=@Parent_Code_Equal )
      
      IF (@Acc_Code='0' Or @Acc_Code Is NULL) And (@Acc_Code_Equal='0' Or @Acc_Code_Equal Is NULL)   -- در صورتي که کد حسابداري در اسي اسي  تعريف نشده باشد
      Begin  
        IF (@Parent_Code='0' Or @Parent_Code Is NULL) And (@Parent_Code_Equal='0' Or @Parent_Code_Equal Is NULL) And (@Acc_Code_Cheqe <> '0' Or @Acc_Code_Cheqe Is not Null) -- در صورتي که در اکت ها هيچ کد پرنت و معادل ان نباشد ولي در خود چک کد حسابداري ان باشد 
          Set @Acc_Code=@Acc_Code_Cheqe -- اگر مستقيما کد حسابداري در چک وجود داشته باشد
        Else
          IF  (@Parent_Code<> '0' Or @Parent_Code Is not  NULL)  -- اگر مستقيما کد حسابداري در اکت وجود داشته باشد
          Begin 
            IF (Select Has_Child from Dbo.Account where Acc_Code=@Parent_Code)=0 
              Set @Acc_Code=@Parent_Code -- اگر مستقيما کد حسابداري در اکت وجود داشته باشد
            Else
              IF (Select Has_Child from Dbo.Account where Acc_Code=@Acc_Code_Cheqe)=0 
                Set @Acc_Code=@Acc_Code_Cheqe -- اگر مستقيما کد حسابداري در چک وجود داشته باشد
          End
          Else
            IF (@Parent_Code_Equal <> '0'  Or @Parent_Code_Equal Is not  NULL)  -- اگر مستقيما کد حسابداري در اکت و معادل آن وجود داشت
            Begin  
              IF (Select Has_Child from Dbo.Account where Acc_Code=@Parent_Code_Equal)=0 
                 Set @Acc_Code=@Parent_Code_Equal -- اگر مستقيما کد حسابداري در اکت  معادل آن وجود داشت
              Else
                If (Select Has_Child from Dbo.Account where Acc_Code=@Acc_Code_Cheqe)=0 
                  Set @Acc_Code=@Acc_Code_Cheqe -- اگر مستقيما کد حسابداري در چک وجود داشته باشد
            End --IF (@Parent_Code_Equal <> '0'  Or @Parent_Code_Equal Is not  NULL)
            Else 
              print ' code account not exist'
      End --IF (@Acc_Code='0' Or @Acc_Code Is NULL) And (@Acc_Code_Equal='0' Or @Acc_Code_Equal Is NULL
      Else      
        IF (@Acc_Code='0') And (@Acc_Code_Equal<>'0')                 
           Set @Acc_Code=@Acc_Code_Equal -- If Code Equql exist
        Else
          IF (@Acc_Code<>'0') And (@Acc_Code_Equal<>'0')                    
            If ((Select Sum(Bedeh) from Dbo.Account Where Acc_Code=@Acc_Code_Equal) > 0) Or 
               ((Select Sum(Bestan) from Dbo.Account Where Acc_Code=@Acc_Code_Equal) > 0 )         
              Set @Acc_Code=@Acc_Code_Equal -- If Code Equql exist

           IF @TmpOrMainOrAutoSanad='2' --اضافه به شماره سند ورودي در جدول تمپ سند                
           Begin   
             IF @Type = 0   
             begin
               Select @Guid_Sanad = NewId() --   به دست آورن اخرين شماره خوکار رديف سند
               Insert Into Dbo.TmpSanad (Id_Sanad  , Acc_Code  ,         Note            ,  Bedeh   , Auto_Create  , Edit_Flag ,Type ,Guid_Sanad  ,Nu_Vajeh, User_ID  )  
                                 Values (@Nu_Sanad , @Acc_Code ,@ActNote + ' ' + @PNote  ,  @Price  ,        1     ,    1      ,@Type,@Guid_Sanad ,@Id_Cheqe, @UserId )
               IF @@Error > 0 
               Begin
                 ROLLBACK TRANSACTION D1
                 Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
                 RETURN   @msg_num  --@@Error
               End 
               Insert Into dbo.TmpAcc_Cheqe_Link (Guid_Cheqe,Guid_Sanad)Values (@Guid_Cheqe,@Guid_Sanad)
               IF @@Error > 0 
               Begin
                 ROLLBACK TRANSACTION D1
                 Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
                 RETURN   @msg_num  --@@Error
               End 
	     End --IF @Type = 0   
	     Else 
             Begin
    	        Select @Guid_Sanad = NewId() --   به دست آورن اخرين شماره خوکار رديف سند
	        Insert Into Dbo.TmpSanad (Id_Sanad  ,  Acc_Code  ,   Note                  , Bestan  , Auto_Create  , Edit_Flag , Type ,Guid_Sanad ,NU_Vajeh, User_ID)  
	                          Values (@Nu_Sanad , @Acc_Code  , @ActNote + ' ' + @PNote , @Price  ,        1     ,        1  , @Type,@Guid_Sanad,@Id_Cheqe, @UserId)
                IF @@Error > 0 
                Begin
                  ROLLBACK TRANSACTION D1
                  Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
                  RETURN   @msg_num  --@@Error
                End 
                Insert Into dbo.TmpAcc_Cheqe_Link(Guid_Cheqe  , Guid_Sanad) Values( @Guid_Cheqe,@Guid_Sanad)
                IF @@Error > 0 
                Begin
                  ROLLBACK TRANSACTION D1
                  Set  @msg_num=-5  --msg-num = -5 خطاي سيستم
                  RETURN   @msg_num  --@@Error
                End 
	     End
           End --IF @TmpOrMainOrAutoSanad='2'
           Else 
           Begin
             IF (@TmpOrMainOrAutoSanad='0') Or (@TmpOrMainOrAutoSanad='1')   -- اضافه به شماره سند ورودي در جدول سند اصلي يا سند اصلي با شماره خودکار
               IF @Type = 0   
               Begin
                 Select @Guid_Sanad=NewId() --   به دست آورن اخرين شماره خوکار رديف سند
                 Set @Note= @ActNote+' '+@PNote
                 ----------------------------------------------------------------------------------------------------------------------------------------------------
                 IF @Code = '10000'
                 Begin
                   IF @TypeSanad = '1'
                   Begin
                     Select @Autoid = Autoid From Sanad Where Type = @Type 
                                                        And Acc_Code = @Acc_Code
                                                        And FlagVajh = @Act 
                                                        And User_ID = @UserId
                                                        And Id_Sanad = @Nu_Sanad
                  
                     IF @Autoid is not null                                                   
                       Update Sanad Set Bedeh = Bedeh + @Price Where AutoId = @Autoid

                     Else
                     Begin
                       Insert Into Dbo.Sanad (Id_Sanad  , Acc_Code   ,     Note                          ,  Bedeh   , Auto_Create  , Edit_Flag ,Type  ,Guid_Sanad,Nu_Vajeh     , FlagVajh, User_ID )  
                               Values        (@Nu_Sanad , @Acc_Code  , @ActNote + ' '+ 'خريداران متفرقه' ,  @Price  ,        1     ,    1      ,@Type ,@Guid_Sanad  ,@Id_Cheqe , @Act, @UserId)
                       IF @@Error > 0  
                       Begin
                         ROLLBACK TRANSACTION D1
                         Set  @msg_num=-5
                         RETURN   @msg_num  --@@Error
                       End
                       Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad)Values( @Guid_Cheqe,@Guid_Sanad)
                       IF @@Error > 0  
                       Begin
                         ROLLBACK TRANSACTION D1
                         Set  @msg_num=-5
                         RETURN   @msg_num  --@@Error
                       End
                     End
                   End--IF @TypeSanad = '1'
                   Else
                   Begin
                     Insert Into Dbo.Sanad (Id_Sanad   , Acc_Code   ,  Note  ,  Bedeh   , Auto_Create  , Edit_Flag ,Type    ,Guid_Sanad  ,Nu_Vajeh, User_ID )  
                                   Values  (@Nu_Sanad  , @Acc_Code  , @Note  ,  @Price  ,        1     ,    1      ,@Type   ,@Guid_Sanad ,@Id_Cheqe, @UserId)
                     IF @@Error > 0  
                     Begin
                       ROLLBACK TRANSACTION D1
                       Set  @msg_num=-5
                       RETURN   @msg_num  --@@Error
                     End
                     Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad) Values( @Guid_Cheqe,@Guid_Sanad)
                     IF @@Error > 0  
                     Begin
                        ROLLBACK TRANSACTION D1
                        Set  @msg_num=-5
                        RETURN   @msg_num  --@@Error
                     End
                   End
                 End --IF @Code = '10000'
                 Else
                 Begin
                   Insert Into Dbo.Sanad (Id_Sanad   , Acc_Code   ,     Note  ,  Bedeh   , Auto_Create  , Edit_Flag ,Type    ,Guid_Sanad  ,Nu_Vajeh, User_ID)  
                                 Values  (@Nu_Sanad  , @Acc_Code  ,    @Note  ,  @Price  ,        1     ,    1      ,@Type   ,@Guid_Sanad ,@Id_Cheqe, @UserId)
                   IF @@Error > 0  
                   Begin
                     ROLLBACK TRANSACTION D1
                     Set  @msg_num=-5
                     RETURN   @msg_num  --@@Error
                   End
                   Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad) Values( @Guid_Cheqe,@Guid_Sanad)
                   IF @@Error > 0  
                   Begin
                      ROLLBACK TRANSACTION D1
                      Set  @msg_num=-5
                      RETURN   @msg_num  --@@Error
                   End
                 End
               End --IF @Type = 0   
               Else 
               Begin
  	         Select @Guid_Sanad = NewId() --   به دست آورن اخرين شماره خوکار رديف سند
                 Set @Note= @ActNote+' '+@PNote
                 ----------------------------------------------------------------------------------------------------------------------------------------------------
                 IF @Code = '10000'
                 Begin
                   IF @TypeSanad = '1'
                   Begin
                     Select @Autoid = Autoid From Sanad Where Type = @Type 
												                                                            And Acc_Code = @Acc_Code
                                                        And FlagVajh = @Act 
                                                        And User_ID = @UserId
                                                        And Id_Sanad = @Nu_Sanad
                      IF @Autoid is not null                                                   
                         Update Sanad Set Bestan = Bestan + @Price Where AutoId = @Autoid
                     Else
                     Begin
                       Insert Into  Dbo.Sanad (Id_Sanad  , Acc_Code  ,    Note  , Bestan  , Auto_Create  , Edit_Flag , Type ,Guid_Sanad,Nu_Vajeh , FlagVajh, User_ID )  
                                   Values     (@Nu_Sanad , @Acc_Code , @ActNote + ' '+ 'خريداران متفرقه' ,@Price     ,   1  ,     1    , @Type,@Guid_Sanad,@Id_Cheqe, @Act, @UserId)
                       IF @@Error > 0  
                       Begin
                         ROLLBACK TRANSACTION D1
                         Set  @msg_num=-5
                         RETURN   @msg_num  --@@Error
                       End
                       Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad)Values( @Guid_Cheqe,@Guid_Sanad)
                       IF @@Error > 0  
                       Begin
                         ROLLBACK TRANSACTION D1
                         Set  @msg_num=-5
                         RETURN   @msg_num  --@@Error
                       End
                     End 
                   End--IF @TypeSanad = '1'
                   Else
                   Begin
                     Insert Into  Dbo.Sanad (Id_Sanad  , Acc_Code   ,   Note   , Bestan  , Auto_Create  , Edit_Flag , Type ,Guid_Sanad,Nu_Vajeh, User_ID )  
                                  Values    (@Nu_Sanad , @Acc_Code  , @Note    ,@Price   ,        1     ,        1  , @Type,@Guid_Sanad,@Id_Cheqe, @UserId)
                     IF @@Error > 0  
                     Begin
                       ROLLBACK TRANSACTION D1
                       Set  @msg_num=-5
                       RETURN   @msg_num  --@@Error
                     End
                     Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad) Values( @Guid_Cheqe,@Guid_Sanad)
                     IF @@Error > 0  
                     Begin
                       ROLLBACK TRANSACTION D1
                       Set  @msg_num=-5
                       RETURN   @msg_num  --@@Error
                     End
                   End
                 End --IF @Code = '10000'
                 Else
                 Begin
                   Insert Into  Dbo.Sanad (Id_Sanad  , Acc_Code   ,   Note   , Bestan  , Auto_Create  , Edit_Flag , Type ,Guid_Sanad,Nu_Vajeh, User_ID )  
                                Values    (@Nu_Sanad , @Acc_Code  , @Note  ,@Price     ,        1     ,        1  , @Type,@Guid_Sanad,@Id_Cheqe, @UserId)
                   IF @@Error > 0  
                   Begin
                     ROLLBACK TRANSACTION D1
                     Set  @msg_num=-5
                     RETURN   @msg_num  --@@Error
                   End
                   Insert Into dbo.Acc_Cheqe_Link(Guid_Cheqe,Guid_Sanad) Values( @Guid_Cheqe,@Guid_Sanad)
                   IF @@Error > 0  
                   Begin
                     ROLLBACK TRANSACTION D1
                     Set  @msg_num=-5
                     RETURN   @msg_num  --@@Error
                   End
                 End
               End -- Type = '1'
           End
           FETCH NEXT FROM Cursor_Act
           INTO  @Type,@ActNote , @Parent_Code ,@Parent_Code_Equal
       END
  
       CLOSE Cursor_Act
       DEALLOCATE Cursor_Act

       Commit  Tran D1
       RETURN @msg_Num
