-- P_Code (کد شرکتها)      
-- 10000<P_Code<99999
-- P_Code  ==>  خريداران خرده فروشي = 10000

-- A_Code ==> کد انبار (Small int)  
-- 00100<A_Code<00999
-- A_Code  ==> 00999 = انبار کالاهاي ساختني


--msg-num = -1  برخي از کالاها ها موجودي ندارند
--msg-num = -2 موردي براي صدور وجود ندارد
--msg-num = -3 سريال کالايي که براي فروش انتخاب شده قبلا به فروش رسيده است
--msg-num = -4 انقضا کالاهائي که براي فروش انتخاب شده قبلا بع فروش رسيده است
--msg-num = -5 خطاي سيستم
--msg-num = -6 برخي از کالاها قيمت ندارند
-------------------------------------------------------------------------
-- اطلاعات تمپ اور اندر را در جدول اصلي ان کپي مي کند
--@Msg_Num=-20 با اين شمره موردي براي صدور وجود ندارد
--@Msg_Num=-21
--@msg-num = -25 خطاي سيستم
-------------------------------------------------------------------------
-- مربوطه به وجه
--@Msg_Num=-10 با اين شمره موردي براي صدور وجود ندارد
--@Msg_Num=-11
--@msg-num = -5 خطاي سيستم
------------------------------------------------------------
-- باز بودن سند
--@msg-num = -99+ شماره سند                       
-- سند مربوطه بسته است
------------------------------------------------------------
--  HAVALEH             = 1;
--  RESID               = 2;
--  KHARID              = 3;
--  RETURNKHARID        = 4;
--  FOROSH              = 5;
--  RETURNFOROSH        = 6;
--  KHORDEHFOROSHI      = 7;
--  RETURNKHORDEHFOROSH = 8;
--  OMDEHFOROSHI        = 9;
--  RETURNOMDEHFOROSHI  = 0;

-- Kind_Flag=1             

CREATE PROCEDURE [dbo].[Sodor_Factor] @msg_num Numeric(18,0) OUTPUT,@TmpId  Numeric(18,0) AS

 Declare @Nu_sanad Bigint
 Declare @idSanad Bigint

 set @msg_num=0
 If (Select Count(*)  From Dbo.TmpHeadH Where Id_Havaleh = @TmpId  ) > 0   And  (Select Count(*)  From Dbo.TmpHavaleh  Where Id_Havaleh = @TmpId) > 0
 Begin
   -- كنترل باز بودن سند
   Select @IdSanad = Sanad From TmpHeadH Where Id_Havaleh = @TmpId
   IF (@IdSanad is null) Or (@IdSanad = '')
     SELECT @Nu_Sanad=Nu_Manual FROM dbo.heads where (DateDiff(day,Tarikh_User,getdate() ) =0 ) And (Auto=1)  and (Fiexd=1 )

   
   SELECT @Nu_Sanad= Nu_Manual FROM dbo.heads where Id_Sanad = @IdSanad  And (Fiexd=1 )
   iF ( @Nu_Sanad ) > 0 
   Begin
     Set  @msg_num= cast ('-99'+Ltrim(str(@Nu_Sanad)) as int)-- -10  --msg-num = -10 سند مربوطه بسته است --msg-num = -10 سند مربوطه بسته است
     RETURN @msg_num  --@@Error
   End
   ------------------------------------------------------------------------------------------------
   -- کنترل موجودي
   IF (Select Count(*) from LESS_Mojodi(@TmpId))  > 0 Begin
     Set  @msg_num=-1  --msg-num = -1  برخي از کالاها ها موجودي ندارند
     RETURN @msg_num
   End
   
   ------------------------------------------------------------------------------------------------
   -- کنترل سريال
   Else IF (Select Count(*) from LESS_Serial(@TmpId))  > 0 
   Begin
     Set  @msg_num=-3 --msg-num = -3 سريال کالايي که براي فروش انتخاب شده قبلا به فروش رسيده است
     RETURN @msg_num
   End
   ------------------------------------------------------------------------------------------------
   -- کنترل تارخ انقضا
   Else IF (Select Count(*) from LESS_Exp(@TmpId))  > 0 
   Begin
     Set  @msg_num=-4 --msg-num = -4 انقضا کالاهائي که براي فروش انتخاب شده قبلا به فروش رسيده است
     RETURN @msg_num
   End
   
   ------------------------------------------------------------------------------------------------
   -- کنترل مانده حسابها
   ------------------------------------------------------------------------------------------------
   Else 
   Begin   
     Exec dbo.checkMandeh10000 @TmpId
     --   Set language arabic
     Begin Tran z1 -- شروع ترنزکشن
     -- متغير هاي هدر
     Declare @Last_Id        Numeric(18,0)
     Declare @Tmp_Kind_Flag  Char(1)
     -- صدور رسيد يا حواله
     -- اضافه نمودن هدر حواله
     Insert Into Dbo.HeadH(Kind_Flag,Nu_Havaleh,Nu_Resid,Nu_Forosh,Nu_Kharid,Nu_Bargasht_Forosh,Nu_Bargasht_kharid,Items,Recive_Name,Trans_Name,Tot_Price_kharid,Tot_Price_Forosh,Tot_Price_Omdeh,Note,Tot_kahandeh,Tot_Afzayandeh,User_Id,Tarikh_Faktor, Tarikh_Pardakht, CheckTarikh_Pardakht, Number_Bar, Sanad)
                    Select Kind_Flag,Nu_Havaleh,Nu_Resid,Nu_Forosh,Nu_Kharid,Nu_Bargasht_Forosh,Nu_Bargasht_kharid,Items,Recive_Name,Trans_Name,Tot_Price_kharid,Tot_Price_Forosh,Tot_Price_Omdeh,Note,Tot_kahandeh,Tot_Afzayandeh,User_Id,Tarikh_Faktor,Tarikh_Pardakht, CheckTarikh_Pardakht ,Number_Bar, Sanad  From TmpHeadH
                    Where Id_Havaleh=@TmpId	
     If @@Error > 0  
     Begin
       Set  @msg_num=-5  
       ROLLBACK TRANSACTION z1
       RETURN @msg_num 
     End    
   
     Select @Last_Id=@@Identity --  Last_Id = به دست آوردن شماره آخرين حواله 
   
     -- رکوردهاي جدول تمپ را به جدول اصلي حواله اضافه ميکند
     Insert Into Dbo.Havaleh(Id_Havaleh,AutoId,Sender,Reciver,Radif,K_Code,K_Qty1,K_Qty2,R_Unit1_2,Price_Kharid,Price_Forosh,Price_Omdeh,Status,Takhfif_Flag,Point_Flag,Serial_Flag,Hamrah_Flag,EditQty_Flag,CtrMojodi,Link_Record,Exp_Flag,Make_Flag,Note,DayOfKala, Price_Consumer)
                     Select @Last_Id ,AutoId,Sender,Reciver,Radif,K_Code,K_Qty1,K_Qty2,R_Unit1_2,Price_Kharid,Price_Forosh,Price_Omdeh,Status,Takhfif_Flag,Point_Flag,Serial_Flag,Hamrah_Flag,EditQty_Flag,CtrMojodi,Link_Record,Exp_Flag,Make_Flag,Note,DayOfKala,Price_Consumer
                     From TmpHavaleh Where Id_Havaleh=@TmpId  -- رکوردهاي جدول تمپ را به جدول اصلي حواله اضافه ميکند
   
     If @@Error > 0  
     Begin
       Set  @msg_num=-5  
       ROLLBACK TRANSACTION z1
       RETURN @msg_num 
     End    
     ------------------------------------------------------------------------------------------------    -- صدور تاريخ انقضا
     -- در ورتي که  در فايل ها موردي با تاريخ انقضا وجود داشته باشد انقضا مربوطه را بروزرساني مي کنن     
     If ( Select Count(*) From Dbo.TmpHavaleh WHERE (Id_Havaleh = @TmpId) AND (Exp_Flag = 1) ) > 0
        Exec Sodor_Exp @TmpId   --@Last_Id
     If @@Error > 0  
     Begin
       Set  @msg_num=-5  
       ROLLBACK TRANSACTION z1
       RETURN @msg_num 
     End    
     ------------------------------------------------------------------------------------------------
     -- صدور سريال
     -- در صورتي که فايل گارانتي داراي رکوردي مربوط به اين حواله باشد گارانتي هاي آن را نيز بروز رساني  ميکند
     If (Select Count(*)  FROM  dbo.TmpSerial 
       WHERE  AutoId In (Select  AutoId From dbo.TmpHavaleh Where Id_Havaleh = @TmpId)) > 0 
       exec  Sodor_Serial  @TmpId   --,@last_id
     If @@Error > 0  
     Begin
       Set  @msg_num=-5  
       ROLLBACK TRANSACTION z1
       RETURN @msg_num 
     End    
     ------------------------------------------------------------------------------------------------
     --  صدور موارد کاهشي و افزايشي فاکتور
     -- حذف موارد با قيمت صفر  
     Delete from dbo.Tmp_Over_Under_Factor Where  (Id_Havaleh=@TmpId) And (Price <=0 Or Price is null )
     If (SELECT     Count(*) FROM dbo.Tmp_Over_Under_Factor   WHERE     (Id_Havaleh = @TmpId)) > 0 
     Begin
       Exec  @Msg_Num=Sodor_Over_Under  @Msg_num   ,@TmpId  ,@last_id
       If (@@Error > 0) Or (@Msg_Num < 0)  
       Begin
         Set  @msg_num=-5  
         ROLLBACK TRANSACTION z1
         RETURN @msg_num 
       End    
     End
     
     ------------------------------------------------------------------------------------------------
       -- در صورت وجود موارد كاهنده و افزاينده روي تك تك اقلام اطلاعات آن از تمپ به جدول اصلي منتقل مي شود 
              Insert Into Dbo.Over_Under_Row (AutoId,name,Code_Act,Type,Price,[Percent],Code_Over_Under)
              SELECT  Tmp_Over_Under_Row.AutoId, Tmp_Over_Under_Row.name, Tmp_Over_Under_Row.Code_Act, 
                            Tmp_Over_Under_Row.Type, Tmp_Over_Under_Row.Price, Tmp_Over_Under_Row.[Percent], 
                            Tmp_Over_Under_Row.Code_Over_Under FROM  TmpHavaleh INNER JOIN
                            Tmp_Over_Under_Row ON TmpHavaleh.AutoId = Tmp_Over_Under_Row.AutoId
                            WHERE  TmpHavaleh.Id_Havaleh = @TmpId And Price > 0 
           IF @@Error > 0  
           Begin
                Set  @Msg_Num= -5  
                ROLLBACK TRANSACTION SF
                RETURN @Msg_Num 
           End
---------------------------------------------------------------------------------------------------------------------------------------
     
     -- صدور رسيد وجه
  
     Declare @Id_Cheqe BigInt      
  
     -- حذف موارد با قيمت صفر  
  
     SELECT  @Id_cheqe= dbo.TmpHeadC.Id_Cheqe
     FROM dbo.TmpHeadC INNER JOIN dbo.TmpCheqe ON dbo.TmpHeadC.Id_Cheqe = dbo.TmpCheqe.Id_Cheqe
     WHERE (dbo.TmpHeadc.Id_Havaleh = @TmpId)And (dbo.TmpCheqe.CH_Price > 0)
  
     IF  (@Id_Cheqe <> Null) Or (@Id_Cheqe <> 0) 
       Exec  @Msg_Num=Sodor_Vajeh  @Msg_num,@Id_Cheqe,@TmpId,@last_id,@IdSanad
     If (@@Error > 0) Or (@Msg_Num < 0)  
     Begin
       Set  @msg_num=-5  
       ROLLBACK TRANSACTION z1
       RETURN @msg_num 
     End    
     ------------------------------------------------------------------------------------------------
     -- حذف اطلاعات موقت از جداول تمپ       
     Delete from dbo.tmphavaleh where  Id_Havaleh=@TmpId --@Last_Id --رکوردهاي صادر شده را از جدول تمپ حواله پاک ميکند
     Delete from dbo.tmpheadh   where  Id_Havaleh=@TmpId -- هدر حواله صادر شده را از جدول تمپ هدر پاک ميکند
     ------------------------------------------------------------------------------------------------
     print 'فاکتور صادر شد' 
  End 
   
  Commit Tran z1
  
  Select @msg_num=@Last_Id
  RETURN @msg_num
 End -- If (Select Count(*)  From Dbo.TmpHeadH Where Id_Havaleh = @TmpId  ) > 0   And  (Select Count(*)  From Dbo.TmpHavaleh  Where Id_Havaleh = @TmpId) > 0
 Else 
 Begin
   Set  @msg_num=-2 
   RETURN @msg_num
 Print 'موردي براي صدور وجود ندارد'
End
