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) { }