IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_TevkifatTutar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_TevkifatTutar]
GO
create function [dbo].[fn_TevkifatTutar]
( @VergiTutar   float          = 0.0,
  @TevkifatOran nVarChar( 20 ) = ''
) RETURNS float 

as

BEGIN

  /* NULL Kontrol */
  set @VergiTutar   = IsNull( @VergiTutar,
                              0
                            )

  set @TevkifatOran = IsNull( @TevkifatOran,
                              ''
                            )

  /* Vergi Tutarı   = Vergi Matrahı * ( Vergi Oranı (%) / 100 )        */

  /* dbo.fn_KesirBolen sonucu asla SIFIR gelmez Sıfıra bölüm kontrolüne gerek yok */
                          /* Noktadan Sonra 2 Haneye Yuvarla                                                             */
  return dbo.FN_RoundBanker(   @VergiTutar
                             * (   dbo.fn_KesirBolunen( @TevkifatOran )
                                 / dbo.fn_KesirBolen( @TevkifatOran )
                               ),
                             2 
                           ) 

END
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_KesirBolen]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_KesirBolen]
GO
create function [dbo].[fn_KesirBolen]
( @Kesir  nVarChar( 20 )  /* Kesirli Sayı Metni */
) RETURNS float  

as

BEGIN

   declare @Boy int
   declare @Pos int
   declare @Bolen nVarChar( 20 )

   set @Kesir = IsNull( NullIf( Ltrim( RTrim( @Kesir )
                                     ),
                                ''
                              ),             
                        '0'
                      )

   set @Boy   = Len( @Kesir)
   set @Pos   = CharIndex( '/',
                           @Kesir,
                           1
                         )

   set @Bolen = Ltrim( RTrim( Right( @Kesir,
                                     @Boy - @Pos 
                                   ) 
                            )
                     )
                               
                /* Sıfır Kontrol -> Kesir SIFIR mı? */
    return IIF( @Kesir = '0',

                /* Sıfır Kontrol -> Kesir SIFIR ise Sonuç = Bir ( 1 ) */
                1.00,

                /* Sıfır Kontrol -> Kesir SIFIR değilse işle */
                     /* Bölüm Bulundu Kontrol -> Bölüm Bulundu mu? */
                IIF( @Pos > 0,
                              
                     /* Bölüm Bulundu Kontrol -> Bulunduysa İşle */
                          /* Bölüm Son Karakter mi Kontrol -> Bölüm son karakter mi? */
                     IIF( @Pos = @Boy,

                          /* Bölüm Son Karakter mi Kontrol -> Bölüm son karakterse Sonuç = Bir ( 1 )  */
                          1.00,
                          
                          /* Bölüm Son Karakter mi Kontrol -> Bölüm Son karakter değilse İşle */
                               /* Sayısal Kontrol -> Sonuç Sayısal mı? */
                          IIF( IsNumeric( @Bolen ) = 1,

                               /* Sayısal Kontrol -> Sonuç Sayısalsa İşle*/
                                    /* Sıfır Kontrol -> Sonuç Sıfır ( 0 ) mı? */
                               IIF( Cast( @Bolen as float ) = 0,
                               
                               
                                    /* Sıfır Kontrol -> Sonuç Sıfır ( 0 ) ise */
                                    1.00,

                                    /* Sıfır Kontrol -> Sonuç Sıfır ( 0 ) değilse */
                                    Cast( @Bolen as float )
                                  ),

                              /* Sayısal Kontrol -> Sonuç Sayısal Değilse Sonuç = Bir ( 1 ) */
                               1.00
                             )
                        ),

                     /* Bölüm Bulundu Kontrol -> Bölüm Bulunmadıysa işle */
                     1.00
                   )
              ) 

END
GO


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_KesirBolunen]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_KesirBolunen]
GO
create function [dbo].[fn_KesirBolunen]
( @Kesir  nVarChar( 20 )  /* Kesirli Sayı Metni */
) RETURNS float    

as

BEGIN

   declare @Boy int
   declare @Pos int
   declare @Bolunen nVarChar( 20 )

   set @Kesir   = IsNull( NullIf( Ltrim( RTrim( @Kesir )
                                       ),
                                  ''
                                ),             
                          '0'
                        )

   set @Boy     = Len( @Kesir)
   set @Pos     = CharIndex( '/',
                             @Kesir,
                             1
                           )

   set @Bolunen = Ltrim( RTrim( Left( @Kesir,
                                      @Boy - @Pos - 1 
                                    ) 
                              )
                       )
                               
                /* Sıfır Kontrol -> Kesir SIFIR mı? */
    return IIF( @Kesir = '0',

                /* Sıfır Kontrol -> Kesir SIFIR ise Sonuç = Sıfır ( 0 ) */
                0.00,

                /* Sıfır Kontrol -> Kesir SIFIR değilse işle */
                     /* Bölüm Bulundu Kontrol -> Bölüm Bulundu mu? */
                IIF( @Pos > 0,

                     /* Bölüm Bulundu Kontrol -> Bulunduysa İşle */
                          /* Bölüm İlk Karakter mi Kontrol -> Bölüm ilk karakter mi? */
                     IIF( @Pos = 1,

                          /* Bölüm İlk Karakter mi Kontrol -> Bölüm ilk karakterse Sonuç = Sıfır ( 0 )  */
                          0.00,

                          /* Bölüm İlk Karakter mi Kontrol -> Bölüm ilk karakter değilse İşle */
                               /* Sayısal Kontrol -> Sonuç Sayısal mı? */
                          IIF( IsNumeric( @Bolunen ) = 1,

                               /* Sayısal Kontrol -> Sonuç Sayısalsa İşle*/
                               Cast( @Bolunen as float ),
                               /* Sayısal Kontrol -> Sonuç Sayısal Değilse Sonuç = Sıfır ( 0 ) */
                               0.00
                             )
                        ),

                     /* Bölüm Bulundu Kontrol -> Bölüm Bulunmadıysa işle */
                          /* Sayısal Kontrol -> Sonuç Sayısal mı? */
                     IIF( IsNumeric( @Kesir ) = 1,

                          /* Sayısal Kontrol -> Sonuç Sayısalsa İşle */
                          Cast( @Kesir as float ),

                          /* Sayısal Kontrol -> Sonuç Sayısal Değilse Sonuç = Sıfır ( 0 ) */
                          0.00
                        )
                   )
              ) 

END
GO


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_TevkifatTutar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_TevkifatTutar]
GO
create function [dbo].[fn_TevkifatTutar]
( @VergiTutar   float          = 0.0,
  @TevkifatOran nVarChar( 20 ) = ''
) RETURNS float 


as

BEGIN

  /* NULL Kontrol */
  set @VergiTutar   = IsNull( @VergiTutar,
                              0
                            )

  set @TevkifatOran = IsNull( @TevkifatOran,
                              ''
                            )

  /* Vergi Tutarı   = Vergi Matrahı * ( Vergi Oranı (%) / 100 )        */

  /* dbo.fn_KesirBolen sonucu asla SIFIR gelmez Sıfıra bölüm kontrolüne gerek yok */
                          /* Noktadan Sonra 2 Haneye Yuvarla                                                             */
  return dbo.FN_RoundBanker(   @VergiTutar
                             * (   dbo.fn_KesirBolunen( @TevkifatOran )
                                 / dbo.fn_KesirBolen( @TevkifatOran )
                               ),
                             2 
                           ) 

END
GO




IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IndirimliFiyat3lu]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_IndirimliFiyat3lu]
GO
create function [dbo].[fn_IndirimliFiyat3lu]
( @IndirimsizFiyat  float = 0.0,
  @YuzdeselIndirim1 float = 0.0,
  @TutarsalIndirim1 float = 0.0,
  @YuzdeselIndirim2 float = 0.0,
  @TutarsalIndirim2 float = 0.0,
  @YuzdeselIndirim3 float = 0.0,
  @TutarsalIndirim3 float = 0.0
) RETURNS float  


as

BEGIN

  /* NULL Kontrol */
  set @IndirimsizFiyat  = IsNull( @IndirimsizFiyat,
                                  0
                                )

  set @YuzdeselIndirim1 = IsNull( @YuzdeselIndirim1,
                                  0
                                )

  set @TutarsalIndirim1 = IsNull( @TutarsalIndirim1,
                                  0
                                )

  set @YuzdeselIndirim2 = IsNull( @YuzdeselIndirim2,
                                  0
                                )

  set @TutarsalIndirim2 = IsNull( @TutarsalIndirim2,
                                  0
                                )

  set @YuzdeselIndirim3 = IsNull( @YuzdeselIndirim3,
                                  0
                                )

  set @TutarsalIndirim3 = IsNull( @TutarsalIndirim3,
                                  0
                                )

  /* İndirim Oranı (%) = ( ( Normal Fiyat - İndirimli Fiyat ) / Normal Fiyat ) x 100 */
  /* İndirim Oranı (%) = (  1  -  ( İndirimli Fiyat / Normal Fiyat ) )         x 100 */
  
  /* İndirimli Fiyat   = Normal Fiyat * ( 1  -  ( İndirim Oranı (%) / 100 ) )        */
  
  return dbo.fn_IndirimliFiyat( dbo.fn_IndirimliFiyat( dbo.fn_IndirimliFiyat( @IndirimsizFiyat,   /* İndirimsiz Fiyat        */
                                                                              @YuzdeselIndirim1,
                                                                              @TutarsalIndirim1
                                                                            ),                    /* 1.İndirim Sonrası Fiyat */
                                                       @YuzdeselIndirim2,
                                                       @TutarsalIndirim2
                                                     ),                                           /* 2.İndirim Sonrası Fiyat */
                                @YuzdeselIndirim3,
                                @TutarsalIndirim3
                              )                                                                   /* 3.İndirim Sonrası Fiyat */  

END
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IndirimTutar3lu]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_IndirimTutar3lu]
GO
create function [dbo].[fn_IndirimTutar3lu]
( @IndirimsizFiyat  float = 0.0,
  @YuzdeselIndirim1 float = 0.0,
  @TutarsalIndirim1 float = 0.0,
  @YuzdeselIndirim2 float = 0.0,
  @TutarsalIndirim2 float = 0.0,
  @YuzdeselIndirim3 float = 0.0,
  @TutarsalIndirim3 float = 0.0
) RETURNS float  

as

BEGIN

  /* NULL Kontrol */
  set @IndirimsizFiyat  = IsNull( @IndirimsizFiyat,
                                  0
                                )

  set @YuzdeselIndirim1 = IsNull( @YuzdeselIndirim1,
                                  0
                                )

  set @TutarsalIndirim1 = IsNull( @TutarsalIndirim1,
                                  0
                                )

  set @YuzdeselIndirim2 = IsNull( @YuzdeselIndirim2,
                                  0
                                )

  set @TutarsalIndirim2 = IsNull( @TutarsalIndirim2,
                                  0
                                )

  set @YuzdeselIndirim3 = IsNull( @YuzdeselIndirim3,
                                  0
                                )

  set @TutarsalIndirim3 = IsNull( @TutarsalIndirim3,
                                  0
                                )

  /* TOPLAM İndirim = İndirimsiz Fiyat - İndirimli Fiyat */

  return @IndirimsizFiyat - dbo.fn_IndirimliFiyat3lu( @IndirimsizFiyat,
                                                      @YuzdeselIndirim1,
                                                      @TutarsalIndirim1,
                                                      @YuzdeselIndirim2,
                                                      @TutarsalIndirim2,
                                                      @YuzdeselIndirim3,
                                                      @TutarsalIndirim3
                                                    )  

END

GO


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IndirimliFiyat]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_IndirimliFiyat]
GO
create function [dbo].[fn_IndirimliFiyat]
( @IndirimsizFiyat float = 0.0,
  @YuzdeselIndirim float = 0.0,
  @TutarsalIndirim float = 0.0
) RETURNS float 


as

BEGIN

  /* NULL Kontrol */
  set @IndirimsizFiyat = IsNull( @IndirimsizFiyat,
                                 0
                               )

  set @YuzdeselIndirim = IsNull( @YuzdeselIndirim,
                                 0
                               )

  set @TutarsalIndirim = IsNull( @TutarsalIndirim,
                                 0
                               )

  /* İndirim Oranı (%) = ( ( Normal Fiyat - İndirimli Fiyat ) / Normal Fiyat ) x 100 */
  /* İndirim Oranı (%) = (  1  -  ( İndirimli Fiyat / Normal Fiyat ) )         x 100 */

  /* İndirimli Fiyat   = Normal Fiyat * ( 1  -  ( İndirim Oranı (%) / 100 ) )        */
  /* İndirimli Fiyat   = Normal Fiyat  -  Normal Fiyat * ( İndirim Oranı (%) / 100 ) */

  return   dbo.FN_RoundBanker( @IndirimsizFiyat,
                               2
                             )
      /* Yüzdesel İndirim Uygulanmış Tutar */
         - dbo.FN_RoundBanker( dbo.FN_RoundBanker( @IndirimsizFiyat,
                                                   2
                                                 ) * @YuzdeselIndirim / 100,
                               2
                             )
      /* - Tutarsal İndirim */
         - dbo.FN_RoundBanker( @TutarsalIndirim,
                               2
                             ) 

END
GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IndirimTutar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_IndirimTutar]
GO
create function [dbo].[fn_IndirimTutar]
( @IndirimsizFiyat Float = 0.0, 
  @YuzdeselIndirim Float = 0.0, 
  @TutarsalIndirim Float = 0.0
) RETURNS float  


as

BEGIN

  /* NULL Kontrol */
  set @IndirimsizFiyat = IsNull( @IndirimsizFiyat,
                                 0
                               )

  set @YuzdeselIndirim = IsNull( @YuzdeselIndirim,
                                 0
                               )

  set @TutarsalIndirim = IsNull( @TutarsalIndirim,
                                 0
                               )

  /* TOPLAM İndirim = Yüzdesel İndirim + Tutarsal İndirim */

      /* Noktadan Sonra 2 Haneye Yuvarla                                                      */
                          /* Noktadan Sonra 2 Haneye Yuvarla                                  */
                                              /* Yüzdesel İndirimin Tutarsal Karşılığı        */  
  return dbo.FN_RoundBanker( dbo.FN_RoundBanker( @IndirimsizFiyat * ( @YuzdeselIndirim  / 100 ),
                                                 2
                                              /* + Tutarsal İndirim */
                                               ) + @TutarsalIndirim,
                             2
                           )  

END
GO




IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_AraToplam]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_AraToplam]
go
create function [dbo].[fn_AraToplam]
( @Adet  float = 0.0,
  @Fiyat float = 0.0
) RETURNS float 

as

BEGIN

  /* NULL Kontrol */
  set @Adet  = IsNull( @Adet,
                       0
                     )
  set @Fiyat = IsNull( @Fiyat,
                       0
                     )

  return dbo.fn_RoundBanker( @Adet * @Fiyat, 2 ) 

END
GO



IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_VergiTutar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_VergiTutar]
go
create function [dbo].[fn_VergiTutar]
( @VergiMatrah float = 0.0,
  @VergiOran   float = 0.0
) RETURNS float 


as

BEGIN

  /* NULL Kontrol */
  set @VergiMatrah = IsNull( @VergiMatrah,
                             0
                           )

  set @VergiOran   = IsNull( @VergiOran,
                             0
                           )

  /* Vergi Tutarı   = Vergi Matrahı * ( Vergi Oranı (%) / 100 )        */

                           /* Noktadan Sonra 2 Haneye Yuvarla     */
   return dbo.FN_RoundBanker( @VergiMatrah * ( @VergiOran  / 100 ),
                              2 
                            ) 

END
GO





IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_VergiliTutar]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_VergiliTutar]
go

create function [dbo].[fn_VergiliTutar]
( @VergiMatrah float = 0.0,
  @VergiOran   float = 0.0
) RETURNS float 

as

BEGIN

  /* NULL Kontrol */
  set @VergiMatrah = IsNull( @VergiMatrah,
                             0
                           )

  set @VergiOran   = IsNull( @VergiOran,
                             0
                           )

  declare @VergiTutar float = 0.0
  /* Vergi Tutarı   = Vergi Matrahı * ( Vergi Oranı (%) / 100 )        */

                                     /* Noktadan Sonra 2 Haneye Yuvarla     */
  set @VergiTutar = dbo.FN_RoundBanker( @VergiMatrah * ( @VergiOran  / 100 ),
                                        2
                                      )

  return   dbo.FN_RoundBanker( @VergiMatrah,
                               2
                             )
         + @VergiTutar 

END
GO




IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_VergiMatrahi]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_VergiMatrahi]
go
create function [dbo].[fn_VergiMatrahi]
( @VergiliTutar float = 0.0,
  @VergiOran    float = 0.0
) RETURNS float 


as

BEGIN

  /* NULL Kontrol */
  set @VergiliTutar = IsNull( @VergiliTutar,
                              0
                            )

  set @VergiOran    = IsNull( @VergiOran,
                              0
                            )

  /* Vergi Matrahı = Vergili Tutar / ( 1 + ( Vergi Oranı (%) / 100 ) )   */

                          /* Noktadan Sonra 2 Haneye Yuvarla             */
  return dbo.FN_RoundBanker( @VergiliTutar / ( 1 + ( @VergiOran / 100 ) ),
                             2
                           ) 

END

GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_VergiTutarVergiliden]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_VergiTutarVergiliden]
go
create function [dbo].[fn_VergiTutarVergiliden]
( @VergiliTutar float = 0.0,
  @VergiOran    float = 0.0
) RETURNS float 


as

BEGIN

  /* NULL Kontrol */
  set @VergiliTutar = IsNull( @VergiliTutar,
                              0
                            )

  set @VergiOran    = IsNull( @VergiOran,
                              0
                            )

  /* Vergi Tutar = Vergili Tutar - ( Vergili Tutar / ( 1 + ( Vergi Oranı (%) / 100 ) ) )  */

                          /* Noktadan Sonra 2 Haneye Yuvarla             */
  return   dbo.FN_RoundBanker( @VergiliTutar,
                               2
                             )
         - dbo.FN_RoundBanker( @VergiliTutar / ( 1 + ( @VergiOran / 100 ) ),
                               2
                             ) 

END


GO

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_RoundBanker]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION  [dbo].[fn_RoundBanker]
go

create function [dbo].[fn_RoundBanker]
( @NumToRound money, 
  @Digits Int
) RETURNS money  

as

BEGIN

  set @NumToRound = @NumToRound * power( 10, @Digits ) 

  return case 

           when @NumToRound = floor( @NumToRound ) 
           then @NumToRound 
           
           else case sign( ceiling( @NumToRound ) - 2 * @NumToRound + floor( @NumToRound ) ) 
                  
                  when 1 
                  then floor( @NumToRound ) 
                  
                  when -1 
                  then ceiling( @NumToRound ) 
                  
                  else 2 * round( @NumToRound / 2, 0 ) 
                  
                end 

         end / power( 10, @Digits )  

END


GO


