예제 #1
0
        public IHttpActionResult ValidateAddress(VirtoCommerce.Domain.Customer.Model.Address address)
        {
            IHttpActionResult retVal = BadRequest();

            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (!_taxSettings.IsValidateAddress)
                {
                    retVal = BadRequest("AvaTax address validation disabled");
                    throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                }

                if (!string.IsNullOrEmpty(_taxSettings.Username) && !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    var addressSvc = new JsonAddressSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);

                    var request = address.ToValidateAddressRequest(_taxSettings.CompanyCode);

                    var validateAddressResult = addressSvc.Validate(request);
                    if (!validateAddressResult.ResultCode.Equals(SeverityLevel.Success))
                    {
                        var error = string.Join(Environment.NewLine,
                                                validateAddressResult.Messages.Where(ms => ms.Severity == SeverityLevel.Error).Select(
                                                    m => m.Summary + string.Format(" [{0} - {1}] ", m.RefersTo, m.Details == null ? string.Empty : string.Join(", ", m.Details))));
                        retVal = BadRequest(error);
                        throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                    }

                    retVal = Ok(validateAddressResult);
                }

                if (!(retVal is OkNegotiatedContentResult <ValidateResult>))
                {
                    retVal = BadRequest("AvaTax credentials not provided");
                    throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.AddressValidationError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.ValidateAddress);

            return(retVal);
        }
예제 #2
0
        public IHttpActionResult TestConnection()
        {
            IHttpActionResult retVal = BadRequest();

            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (!string.IsNullOrEmpty(_taxSettings.Username) && !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    if (!_taxSettings.IsEnabled)
                    {
                        retVal = BadRequest("Tax calculation disabled, enable before testing connection");
                        throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                    }

                    var taxSvc = new JsonTaxSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);
                    var result = taxSvc.Ping();
                    if (!result.ResultCode.Equals(SeverityLevel.Success))
                    {
                        retVal =
                            BadRequest(string.Join(Environment.NewLine,
                                                   result.Messages.Where(ms => ms.Severity == SeverityLevel.Error).Select(
                                                       m => m.Summary + string.Format(" [{0} - {1}] ", m.RefersTo, m.Details == null ? string.Empty : string.Join(", ", m.Details)))));
                        throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                    }

                    retVal = Ok(result);
                }
                else
                {
                    retVal = BadRequest("AvaTax credentials not provided");
                    throw new Exception((retVal as BadRequestErrorMessageResult).Message);
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.TaxPingError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.Ping);

            return(retVal);
        }
        private void CancelCustomerOrderTaxes(OrderChangeEvent context)
        {
            if (!context.ModifiedOrder.IsCancelled)
            {
                return;
            }

            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (_taxSettings.IsEnabled && !string.IsNullOrEmpty(_taxSettings.Username) && !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    var order   = context.ModifiedOrder;
                    var request = order.ToAvaTaxCancelRequest(_taxSettings.CompanyCode, CancelCode.DocDeleted);
                    if (request != null)
                    {
                        slab.docCode = request.DocCode;
                        slab.docType = request.DocType.ToString();

                        var taxSvc       = new JsonTaxSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);
                        var getTaxResult = taxSvc.CancelTax(request);

                        if (!getTaxResult.ResultCode.Equals(SeverityLevel.Success))
                        {
                            var error = string.Join(Environment.NewLine, getTaxResult.Messages.Select(m => m.Summary));
                            throw new Exception(error);
                        }
                    }
                }
                else
                {
                    throw new Exception("AvaTax credentials not provided or tax calculation disabled");
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.TaxCalculationError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.GetTaxRequestTime);
        }
예제 #4
0
        private void CalculateCustomerOrderTaxes(OrderChangeEvent context)
        {
            if (context.ModifiedOrder.IsCancelled)
            {
                return;
            }

            var order         = context.ModifiedOrder;
            var originalOrder = context.OrigOrder;

            //do nothing if order Items quantities did not changed
            if (
                originalOrder.Items.Any(
                    li => !order.Items.Any(oli => oli.Id.Equals(li.Id)) ||
                    order.Items.Single(oli => li.Id.Equals(oli.Id)).Quantity < li.Quantity))
            {
                return;
            }

            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (_taxSettings.IsEnabled && !string.IsNullOrEmpty(_taxSettings.Username) &&
                    !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    //if all payments completed commit tax document in avalara
                    var isCommit = order.InPayments != null && order.InPayments.Any() &&
                                   order.InPayments.All(pi => pi.IsApproved);

                    Contact contact = null;
                    if (order.CustomerId != null)
                    {
                        contact = _customerSearchService.GetById(order.CustomerId);
                    }

                    var request = order.ToAvaTaxRequest(_taxSettings.CompanyCode, contact, isCommit);
                    if (request != null)
                    {
                        slab.docCode      = request.DocCode;
                        slab.docType      = request.DocType.ToString();
                        slab.customerCode = request.CustomerCode;
                        slab.amount       = (double)order.Sum;
                        slab.isCommit     = isCommit;

                        var taxSvc       = new JsonTaxSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);
                        var getTaxResult = taxSvc.GetTax(request);

                        if (!getTaxResult.ResultCode.Equals(SeverityLevel.Success))
                        {
                            //if tax calculation failed create exception with provided error info
                            var error = string.Join(Environment.NewLine, getTaxResult.Messages.Select(m => m.Summary));
                            throw new Exception(error);
                        }

                        //reset items taxes
                        if (order.Items.Any())
                        {
                            order.Items.ForEach(x =>
                            {
                                x.Tax        = 0;
                                x.TaxDetails = null;
                            });
                        }

                        //reset order shipments taxes
                        if (order.Shipments.Any())
                        {
                            order.Shipments.ForEach(x =>
                            {
                                x.Tax        = 0;
                                x.TaxDetails = null;
                            });
                        }

                        order.Tax = 0;

                        foreach (var taxLine in getTaxResult.TaxLines ?? Enumerable.Empty <TaxLine>())
                        {
                            var lineItem = order.Items.FirstOrDefault(x => x.Id == taxLine.LineNo);
                            if (lineItem != null)
                            {
                                lineItem.Tax = taxLine.Tax;
                                if (taxLine.TaxDetails != null && taxLine.TaxDetails.Any(td => !string.IsNullOrEmpty(td.TaxName)))
                                {
                                    lineItem.TaxDetails =
                                        taxLine.TaxDetails.Where(td => !string.IsNullOrEmpty(td.TaxName)).Select(taxDetail => new domainModel.TaxDetail
                                    {
                                        Amount = taxDetail.Tax,
                                        Name   = taxDetail.TaxName,
                                        Rate   = taxDetail.Rate
                                    }).ToList();
                                }
                            }
                            else
                            {
                                var shipment = order.Shipments.FirstOrDefault(s => s.Id != null ? s.Id.Equals(taxLine.LineNo) : s.ShipmentMethodCode.Equals(taxLine.LineNo));
                                if (shipment != null)
                                {
                                    shipment.Tax = taxLine.Tax;
                                    if (taxLine.TaxDetails != null && taxLine.TaxDetails.Any(td => !string.IsNullOrEmpty(td.TaxName)))
                                    {
                                        shipment.TaxDetails =
                                            taxLine.TaxDetails.Where(td => !string.IsNullOrEmpty(td.TaxName)).Select(taxDetail => new domainModel.TaxDetail
                                        {
                                            Amount = taxDetail.Tax,
                                            Name   = taxDetail.TaxName,
                                            Rate   = taxDetail.Rate
                                        }).ToList();
                                    }
                                }
                            }

                            order.Tax = getTaxResult.TotalTax;
                        }
                    }
                    else
                    {
                        throw new Exception("Failed to create get tax request");
                    }
                }
                else
                {
                    throw new Exception("Failed to create get tax request");
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.TaxCalculationError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.GetSalesInvoiceRequestTime);
        }
예제 #5
0
        private void CalculatePartialReturnTaxes(OrderChangeEvent context)
        {
            //do nothing if order cancelled (should work another observer)
            if (context.ModifiedOrder.IsCancelled)
            {
                return;
            }

            var originalOrder = context.OrigOrder;
            var modifiedOrder = context.ModifiedOrder;

            //do nothing if order Items quantities did not changed
            if (
                originalOrder.Items.All(
                    li => modifiedOrder.Items.Any(oli => oli.Id.Equals(li.Id)) &&
                    modifiedOrder.Items.Single(oli => li.Id.Equals(oli.Id)).Quantity.Equals(li.Quantity)))
            {
                return;
            }

            //otherwise make partial return/add request
            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (_taxSettings.IsEnabled && !string.IsNullOrEmpty(_taxSettings.Username) &&
                    !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    //if all payments completed commit tax document in avalara
                    var isCommit = modifiedOrder.InPayments != null && modifiedOrder.InPayments.Any() &&
                                   modifiedOrder.InPayments.All(pi => pi.IsApproved);

                    Contact contact = null;
                    if (modifiedOrder.CustomerId != null)
                    {
                        contact = _customerSearchService.GetById(modifiedOrder.CustomerId);
                    }

                    var request = modifiedOrder.ToAvaTaxAdjustmentRequest(_taxSettings.CompanyCode, contact, originalOrder, isCommit);
                    if (request != null)
                    {
                        slab.docCode      = request.ReferenceCode;
                        slab.docType      = request.DocType.ToString();
                        slab.customerCode = request.CustomerCode;
                        slab.amount       = (double)originalOrder.Sum;

                        var taxSvc       = new JsonTaxSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);
                        var getTaxResult = taxSvc.GetTax(request);

                        if (!getTaxResult.ResultCode.Equals(SeverityLevel.Success))
                        {
                            var error = string.Join(Environment.NewLine,
                                                    getTaxResult.Messages.Select(m => m.Summary));
                            throw new Exception(error);
                        }

                        foreach (var taxLine in getTaxResult.TaxLines ?? Enumerable.Empty <TaxLine>())
                        {
                            var lineItem = modifiedOrder.Items.FirstOrDefault(x => x.Id == taxLine.LineNo);
                            if (lineItem != null)
                            {
                                lineItem.Tax += taxLine.Tax;
                                if (taxLine.TaxDetails != null && taxLine.TaxDetails.Any(td => !string.IsNullOrEmpty(td.TaxName)))
                                {
                                    var taxLines =
                                        taxLine.TaxDetails.Where(td => !string.IsNullOrEmpty(td.TaxName)).Select(taxDetail => new domainModel.TaxDetail
                                    {
                                        Amount = taxDetail.Tax,
                                        Name   = taxDetail.TaxName,
                                        Rate   = taxDetail.Rate
                                    }).ToList();

                                    lineItem.TaxDetails = lineItem.TaxDetails == null ? taxLines : lineItem.TaxDetails.AddRange(taxLines);
                                }
                            }
                        }

                        modifiedOrder.Tax = 0;
                    }
                }
                else
                {
                    throw new Exception("AvaTax credentials not provided or tax calculation disabled");
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.TaxCalculationError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.GetTaxRequestTime);
        }
        private void CalculateCustomerOrderTaxes(CartChangeEvent context)
        {
            SlabInvoker <VirtoCommerceEventSource.TaxRequestContext> .Execute(slab =>
            {
                if (_taxSettings.IsEnabled && !string.IsNullOrEmpty(_taxSettings.Username) && !string.IsNullOrEmpty(_taxSettings.Password) &&
                    !string.IsNullOrEmpty(_taxSettings.ServiceUrl) &&
                    !string.IsNullOrEmpty(_taxSettings.CompanyCode))
                {
                    var cart        = context.ModifiedCart;
                    Contact contact = null;
                    if (cart.CustomerId != null)
                    {
                        contact = _customerSearchService.GetById(cart.CustomerId);
                    }

                    var request = cart.ToAvaTaxRequest(_taxSettings.CompanyCode, contact);
                    if (request != null)
                    {
                        slab.docCode      = request.DocCode;
                        slab.customerCode = request.CustomerCode;
                        slab.docType      = request.DocType.ToString();
                        slab.amount       = (double)cart.Total;

                        var taxSvc       = new JsonTaxSvc(_taxSettings.Username, _taxSettings.Password, _taxSettings.ServiceUrl);
                        var getTaxResult = taxSvc.GetTax(request);

                        if (!getTaxResult.ResultCode.Equals(SeverityLevel.Success))
                        {
                            //if tax calculation failed create exception with provided error info
                            var error = string.Join(Environment.NewLine,
                                                    getTaxResult.Messages.Select(m => m.Summary));
                            throw new Exception(error);
                        }

                        //reset all cart items taxes
                        if (cart.Items.Any())
                        {
                            cart.Items.ForEach(x =>
                            {
                                x.TaxTotal   = 0;
                                x.TaxDetails = null;
                            });
                        }

                        //reset all cart shipments taxes
                        if (cart.Shipments.Any())
                        {
                            cart.Shipments.ForEach(x =>
                            {
                                x.TaxTotal   = 0;
                                x.TaxDetails = null;
                            });
                        }

                        foreach (var taxLine in getTaxResult.TaxLines ?? Enumerable.Empty <TaxLine>())
                        {
                            var lineItem = cart.Items.FirstOrDefault(x => x.Id == taxLine.LineNo);
                            if (lineItem != null)
                            {
                                lineItem.TaxTotal = taxLine.Tax;
                                if (taxLine.TaxDetails != null && taxLine.TaxDetails.Any(td => !string.IsNullOrEmpty(td.TaxName)))
                                {
                                    lineItem.TaxDetails =
                                        taxLine.TaxDetails.Where(td => !string.IsNullOrEmpty(td.TaxName)).Select(taxDetail => new domainModel.TaxDetail
                                    {
                                        Amount = taxDetail.Tax,
                                        Name   = taxDetail.TaxName,
                                        Rate   = taxDetail.Rate
                                    }).ToList();
                                }
                            }
                            else
                            {
                                var shipment = cart.Shipments.FirstOrDefault(s => s.Id != null ? s.Id.Equals(taxLine.LineNo) : s.ShipmentMethodCode.Equals(taxLine.LineNo));
                                if (shipment != null)
                                {
                                    shipment.TaxTotal = taxLine.Tax;
                                    if (taxLine.TaxDetails != null && taxLine.TaxDetails.Any(td => !string.IsNullOrEmpty(td.TaxName)))
                                    {
                                        shipment.TaxDetails =
                                            taxLine.TaxDetails.Where(td => !string.IsNullOrEmpty(td.TaxName)).Select(taxDetail => new domainModel.TaxDetail
                                        {
                                            Amount = taxDetail.Tax,
                                            Name   = taxDetail.TaxName,
                                            Rate   = taxDetail.Rate
                                        }).ToList();
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        throw new Exception("Failed to create get tax request");
                    }
                }
                else
                {
                    throw new Exception("Tax calculation disabled or credentials not provided");
                }
            })
            .OnError(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.TaxCalculationError)
            .OnSuccess(VirtoCommerceEventSource.Log, VirtoCommerceEventSource.EventCodes.GetTaxRequestTime);
        }