public virtual void UpdateRates()
        {
            if (Documents.Current != null)
            {
                CarrierRates.Cache.Clear();

                ValidatePackages();
                bool autoPackWarning = false;

                List <CarrierRequestInfo> requests = new List <CarrierRequestInfo>();
                foreach (CarrierPlugin plugin in GetApplicableCarrierPlugins())
                {
                    ICarrierService cs = CarrierPluginMaint.CreateCarrierService(Base, plugin);
                    if (cs != null)
                    {
                        CarrierRequest cRequest = BuildQuoteRequest(Documents.Current, plugin);
                        if (cRequest.PackagesEx.Count == 0)
                        {
                            PXTrace.WriteWarning(Messages.AutoPackagingZeroPackWarning, plugin.CarrierPluginID);
                            autoPackWarning = true;
                            continue;
                        }

                        requests.Add(new CarrierRequestInfo
                        {
                            Plugin  = plugin,
                            Service = cs,
                            Request = cRequest
                        });
                    }
                }

                Parallel.ForEach(requests, info => info.Result = info.Service.GetRateList(info.Request));

                int           cx            = 0;
                StringBuilder errorMessages = new StringBuilder();
                foreach (CarrierRequestInfo info in requests)
                {
                    CarrierResult <IList <RateQuote> > result = info.Result;

                    if (result.IsSuccess)
                    {
                        foreach (RateQuote item in result.Result)
                        {
                            if (item.IsSuccess && item.Currency != Documents.Current.CuryID)
                            {
                                if (string.IsNullOrEmpty(arsetup.Current.DefaultRateTypeID))
                                {
                                    throw new PXException(Messages.RateTypeNotSpecified);
                                }
                            }

                            PXSelectBase <Carrier> selectCarrier = new PXSelectReadonly <Carrier,
                                                                                         Where <Carrier.carrierPluginID, Equal <Required <Carrier.carrierPluginID> >,
                                                                                                And <Carrier.pluginMethod, Equal <Required <Carrier.pluginMethod> >,
                                                                                                     And <Carrier.isExternal, Equal <True> > > > >(Base);

                            foreach (Carrier shipVia in selectCarrier.Select(info.Plugin.CarrierPluginID, item.Method.Code))
                            {
                                var r = new SOCarrierRate
                                {
                                    LineNbr      = cx++,
                                    Method       = shipVia.CarrierID,
                                    Description  = item.Method.Description,
                                    Amount       = ConvertAmt(item.Currency, Documents.Current.CuryID, arsetup.Current.DefaultRateTypeID, Documents.Current.DocumentDate.Value, item.Amount),
                                    DeliveryDate = item.DeliveryDate
                                };

                                r.Selected = r.Method == Documents.Current.ShipVia;
                                if (item.DaysInTransit > 0)
                                {
                                    r.DaysInTransit = item.DaysInTransit;
                                }
                                r = CarrierRates.Insert(r);

                                if (!item.IsSuccess)
                                {
                                    CarrierRates.Cache.RaiseExceptionHandling(typeof(SOCarrierRate.method).Name, r, null, new PXSetPropertyException("{0}: {1}", PXErrorLevel.RowError, item.Messages[0].Code, item.Messages[0].Description));
                                }
                            }
                        }
                    }
                    else
                    {
                        foreach (Message message in result.Messages)
                        {
                            errorMessages.AppendFormat(PXMessages.LocalizeNoPrefix(Messages.ReturnedError), info.Plugin.CarrierPluginID, message.ToString());
                        }

                        if (!string.IsNullOrEmpty(result.RequestData))
                        {
                            PXTrace.WriteInformation(result.RequestData);
                        }
                    }
                }


                if (errorMessages.Length > 0)
                {
                    throw new PXException(Messages.CarrierServiceError, errorMessages.ToString());
                }

                if (autoPackWarning)
                {
                    throw new PXException(Messages.AutoPackagingIssuesCheckTrace);
                }
            }
        }
 protected virtual void RateHasBeenSelected(SOCarrierRate cr)
 {
 }