diff --git a/Website/DesktopModules/Hotcakes/Core/Controllers/CheckoutController.cs b/Website/DesktopModules/Hotcakes/Core/Controllers/CheckoutController.cs index fbde65903..0bf842747 100644 --- a/Website/DesktopModules/Hotcakes/Core/Controllers/CheckoutController.cs +++ b/Website/DesktopModules/Hotcakes/Core/Controllers/CheckoutController.cs @@ -29,6 +29,7 @@ using System.Linq; using System.Web.Mvc; using System.Web.Security; +using System.Text.RegularExpressions; using System.Web.WebPages.Scope; using DotNetNuke.Security; using DotNetNuke.Security.Membership; @@ -38,6 +39,7 @@ using Hotcakes.Commerce.Contacts; using Hotcakes.Commerce.Dnn; using Hotcakes.Commerce.Extensions; +using Hotcakes.Commerce.Globalization; using Hotcakes.Commerce.Membership; using Hotcakes.Commerce.Metrics; using Hotcakes.Commerce.Orders; @@ -405,6 +407,79 @@ public ActionResult GetCustomerData() return new PreJsonResult(Web.Json.ObjectToJson(result)); } + /// + /// Gets called after a the VAT number was changed. + /// + /// + [HccHttpPost] + public ActionResult ApplyEUVatRules() + { + // https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s21.html - 23.06.2020 + Regex EUVatRegex = new Regex(@"^( + (AT)?U[0-9]{8} | # Austria + (BE)?0[0-9]{9} | # Belgium + (BG)?[0-9]{9,10} | # Bulgaria + (CY)?[0-9]{8}L | # Cyprus + (CZ)?[0-9]{8,10} | # Czech Republic + (DE)?[0-9]{9} | # Germany + (DK)?[0-9]{8} | # Denmark + (EE)?[0-9]{9} | # Estonia + (EL|GR)?[0-9]{9} | # Greece + (ES)?[0-9A-Z][0-9]{7}[0-9A-Z] | # Spain + (FI)?[0-9]{8} | # Finland + (FR)?[0-9A-Z]{2}[0-9]{9} | # France + (GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3}) | # United Kingdom + (HU)?[0-9]{8} | # Hungary + (IE)?[0-9]S[0-9]{5}L | # Ireland + (IT)?[0-9]{11} | # Italy + (LT)?([0-9]{9}|[0-9]{12}) | # Lithuania + (LU)?[0-9]{8} | # Luxembourg + (LV)?[0-9]{11} | # Latvia + (MT)?[0-9]{8} | # Malta + (NL)?[0-9]{9}B[0-9]{2} | # Netherlands + (PL)?[0-9]{10} | # Poland + (PT)?[0-9]{9} | # Portugal + (RO)?[0-9]{2,10} | # Romania + (SE)?[0-9]{12} | # Sweden + (SI)?[0-9]{8} | # Slovenia + (SK)?[0-9]{10} # Slovakia + )$", RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace); + + + var countryRepo = Factory.CreateRepo(); + var storeIsoCode = countryRepo.Find(HccApp.ContactServices.Addresses.FindStoreContactAddress().CountryBvin).IsoCode; + + string result = null; + string userVatNumber = security.InputFilter(Regex.Replace(Request.Form["UserVatNumber"], "[-. ]", ""), PortalSecurity.FilterFlag.NoMarkup); + bool foundMatch = EUVatRegex.IsMatch(userVatNumber); + + var orderid = Request.Form["OrderId"] ?? string.Empty; + orderid = security.InputFilter(orderid.Trim(), PortalSecurity.FilterFlag.NoMarkup); + var order = HccApp.OrderServices.Orders.FindForCurrentStore(orderid); + + // EU VAT: remove tax if VAT number is valid and customer is not in the same country as seller + if (foundMatch && storeIsoCode != userVatNumber.Substring(0, 2).ToUpper()) + { + foreach (var i in order.Items) + { + i.IsTaxExempt = true; + } + HccApp.CalculateOrderAndSave(order); + result = "worx"; + } + else if (!foundMatch) + { + foreach (var i in order.Items) + { + i.IsTaxExempt = false; + } + HccApp.CalculateOrderAndSave(order); + result = "invalid"; + } + + return new PreJsonResult(Web.Json.ObjectToJson(result)); + } + #endregion #region Implementation / Load model diff --git a/Website/Portals/_default/HotcakesViews/_default/Scripts/Checkout.js b/Website/Portals/_default/HotcakesViews/_default/Scripts/Checkout.js index 4ff5d2d33..813e5c03f 100644 --- a/Website/Portals/_default/HotcakesViews/_default/Scripts/Checkout.js +++ b/Website/Portals/_default/HotcakesViews/_default/Scripts/Checkout.js @@ -211,6 +211,7 @@ this.$shState = $('#shippingstate'); this.$shFirstname = $('#shippingfirstname'); this.$shLastname = $('#shippinglastname'); + this.$shVatNumber = $('#shippingvatnumber'); this.$shAddress = $('#shippingaddress'); this.$shAddress2 = $('#shippingaddress2'); this.$shCity = $('#shippingcity'); @@ -269,6 +270,7 @@ $('#shippingtempregion').val($(this).val()); }); this.$shAll.change(function (e) { Addresses.shippingChanged(e); }); + this.$shVatNumber.change(function () { ApplyEUVatRules(); }); this.$blAvailableAddresses.change(function (e) { Addresses.selectedAddressChanged(e); }); this.$blCountry.change(function () { @@ -672,6 +674,22 @@ } } + function ApplyEUVatRules() { + $.ajax({ + type: "POST", + url: hcc.getServiceUrl("checkout/applyeuvatrules"), + data: { + UserVatNumber: $('#shippingvat').val(), + OrderId: $('#orderbvin').val() + }, + dataType: "json", + success: function (data) { + $("#shippingaddress").change(); + }, + error: function () { } + }); + } + // Order Summary ------------------------ var OrderSummary = {