2015-12-11 3 views
1

Я пытаюсь достичь следующего сценария, и я не уверен, как настроить налоговые классы магазина, как и любой пытался добиться следующего за:Международные и национальные налоговые классы

  • 23% налогом, если в стране Y.
  • Нулевой налог, если нет страны Y и идентификационный номер налогоплательщика, в противном случае 23% налог.

Я попытался создать 2 отдельные налоговые классы:

  • Normal, 23% для страны Y.
  • International, 23% для всех стран, нулевой налог, если налог ID поставляется.

Как я могу обеспечить, чтобы Международный не применялся к стране Y? Кажется, он не позволяет удалить страну из списка.

ответ

1

Работая со сложной налоговой логикой в ​​Kentico, потребуется некоторая специальная разработка (по крайней мере, в версии 7, и я считаю, что v8 не сильно изменилось, насколько идет расчет налогов). Если вы будете смотреть this webinar, есть раздел, в котором рассказывается о пользовательских TaxClassInfoProviders. Он также содержит некоторые образцы кода, которые вы можете загрузить, чтобы начать работу.

Вот один из способов изменения процесса расчета налогов. Он основан на одном из файлов примеров из вебинара, связанных выше:

public class CustomTaxClassInfoProvider : TaxClassInfoProvider 
{ 

    #region Properties 

    private ShoppingCartInfo Cart 
    { 
     get 
     { 
      return ECommerceContext.CurrentShoppingCart; 
     } 
    } 

    private string CustomerZipCode 
    { 
     get 
     { 
      AddressInfo customerAddress = AddressInfoProvider.GetAddressInfo(Cart.ShoppingCartShippingAddressID); 

      if(customerAddress != null) 
       return customerAddress.AddressZip; 

      return null; 
     } 
    } 

    #endregion 

    /// <summary> 
    /// Returns DataSet with all the taxes which should be applied to the shopping cart items. 
    /// </summary> 
    /// <param name="cart">Shopping cart</param> 
    protected override DataSet GetTaxesInternal(ShoppingCartInfo cart) 
    { 
     DataSet taxDataSet = new DataSet(); 

     // Create an empty taxes table 
     DataTable table = GetNewTaxesTable(); 

     List<TaxRow> taxRows = new List<TaxRow>(); 

     foreach (ShoppingCartItemInfo item in cart.CartItems) 
     { 
      TaxRow row = new TaxRow(); 

      row.SKUID = item.SKU.SKUID; 
      row.SKUGUID = item.SKU.SKUGUID; 

      taxRows.Add(row); 
     } 

     foreach (TaxRow row in taxRows) 
     { 
      double rate = 0; 
      string name = ""; 

      // Add conditions for different tax rates here 
      // -------------------------------------------- 

      // For Example 
      if (cart.Customer.CustomerCountryID == countryYouWantToExclude) 
      { 
       rate = yourTaxRate; 
       name = "Name for the tax"; 
      } 
      else 
      { 
       rate = 0; 
       name = ""; 
      } 

      row.TaxRate = rate; 
      row.TaxName = name; 
     } 

     BuildTaxTable(ref table, taxRows); 

     // Return our dataset with the taxes 
     taxDataSet.Tables.Add(table); 
     return taxDataSet; 
    } 

    private void BuildTaxTable(ref DataTable table, List<TaxRow> taxRows) 
    { 
     foreach (TaxRow row in taxRows) 
     { 
      AddTaxRow(table, row.SKUID, row.TaxName, row.TaxRate); 
     } 
    } 

    private DataTable GetNewTaxesTable() 
    { 
     DataTable table = new DataTable(); 

     // Add required columns 
     table.Columns.Add("SKUID", typeof(int)); 
     table.Columns.Add("TaxClassDisplayName", typeof(string)); 
     table.Columns.Add("TaxValue", typeof(double)); 

     return table; 
    } 

    private void AddTaxRow(DataTable taxTable, int skuId, string taxName, double taxValue, bool taxIsFlat, bool taxIsGlobal, bool zeroTaxIfIDSupplied) 
    { 
     DataRow row = taxTable.NewRow(); 

     // Set required columns 
     row["SKUID"] = skuId; 
     row["TaxClassDisplayName"] = taxName; 
     row["TaxValue"] = taxValue; 

     // Set optional columns 
     //row["TaxIsFlat"] = taxIsFlat; 
     //row["TaxIsGlobal"] = taxIsGlobal; 
     //row["TaxClassZeroIfIDSupplied"] = taxIsGlobal; 

     taxTable.Rows.Add(row); 
    } 

    private void AddTaxRow(DataTable taxTable, int skuId, string taxName, double taxValue) 
    { 
     AddTaxRow(taxTable, skuId, taxName, taxValue, false, false, false); 
    } 
} 

/// <summary> 
/// Represents a DataRow to be inserted into the tax calculation data table 
/// </summary> 
public class TaxRow 
{ 
    public int SKUID { get; set; } 
    public Guid SKUGUID { get; set; } 
    public string TaxName { get; set; } 
    public double TaxRate { get; set; } 

    public TaxRow() 
    { 

    } 
} 

Затем вам нужно настроить свой класс CMSModuleLoader, который также является одним из образцов файлов из указанной выше ссылке:

/// <summary> 
/// Sample e-commerce module class. Partial class ensures correct registration. 
/// </summary> 
[SampleECommerceModuleLoader] 
public partial class CMSModuleLoader 
{ 
    #region "Macro methods loader attribute" 

    /// <summary> 
    /// Module registration 
    /// </summary> 
    private class SampleECommerceModuleLoaderAttribute : CMSLoaderAttribute 
    { 
     /// <summary> 
     /// Constructor 
     /// </summary> 
     public SampleECommerceModuleLoaderAttribute() 
     { 
      // Require E-commerce module to load properly 
      RequiredModules = new string[] { ModuleEntry.ECOMMERCE }; 
     } 


     /// <summary> 
     /// Initializes the module 
     /// </summary> 
     public override void Init() 
     { 

      TaxClassInfoProvider.ProviderObject = new CustomTaxClassInfoProvider(); 
     } 
    } 

    #endregion 
} 

Добавьте эти файлы в любом месте в AppCode, и вам должно быть хорошо идти. Дайте знать, если у вас появятся вопросы.

Смежные вопросы