public bool IsAccept(OrderToTrackDTO orderToTrackInfo, string status, DateTime?statusDate, IList <TrackingRecord> records) { var today = _time.GetAppNowTime().Date; //var now = _time.GetAppNowTime(); //почта после 60 дней за них не отвечает //старше 55 дней if (statusDate.HasValue && statusDate.Value.AddDays(55) < today) { return(false); } //5. Don’t show “Label Never Shipped” for 36 hours after it was generated. //NOTE: round to 2 days //TASK: давай сделаем 10 if (statusDate.HasValue && _time.GetBizDaysCount(statusDate.Value.Date, today) > 10) { return(false); } if (orderToTrackInfo.LabelCanceled) { return(false); } if (orderToTrackInfo.ActualDeliveryDate.HasValue) { return(false); } if (status.ToLower().Contains("delivered")) { return(false); } if ((status.Contains(USPSPreShipmentInfoStatus) || status == USPSShipmentPickedUp || status == USPSNoRecordStatus || status == USPSShipmentProcessing) && statusDate.HasValue) { var dayCount = _time.GetBizDaysCount(statusDate.Value.Date, today); if (dayCount > 1) { return(true); } } return(false); }
public bool IsAccept(OrderToTrackDTO orderToTrackInfo, string status, DateTime?statusDate, IList <TrackingRecord> records) { var now = _time.GetAppNowTime(); var today = _time.GetAppNowTime().Date; var lastRecord = records.FirstOrDefault(); var packageGoBack = (lastRecord != null ? _addressService.IsMine(lastRecord.AsAddressDto()) : false) || orderToTrackInfo.DeliveredStatus == (int)DeliveredStatusEnum.DeliveredToSender; //почта после 60 дней за них не отвечает //старше 55 дней if (statusDate.HasValue && statusDate.Value.AddDays(55) < today) { return(false); } if (packageGoBack) { return(false); //No actions if package go back } if (orderToTrackInfo.Carrier == ShippingServiceUtils.USPSCarrier) { if (statusDate.HasValue && !_time.IsBusinessDay(statusDate.Value) && _time.GetBizDaysCount(statusDate.Value, today) < 2) { //TASK: Let’s not send Exception messages for First Class packages if they were not delivered on Weekends/holidays. if (orderToTrackInfo.ShippingMethodId.HasValue && ShippingUtils.GetShippingType(orderToTrackInfo.ShippingMethodId.Value) == ShippingTypeCode.Standard) { //Don’t send notice to first class orders which USPS tried to deliver on Saturday. //They will automatically will redeliver it on the next business day. return(false); } //TASK: if any package couldn’t be delivered to FF on weekends/holidays if (AddressHelper.IsFFAddress(orderToTrackInfo.ShippingAddress)) { return(false); } } //TASK: If First Class order wasn’t delivered like 102-1600419-5915438 check again in 24 hours, and only then send notifications. if (orderToTrackInfo.ShippingMethodId.HasValue && ShippingUtils.GetShippingType(orderToTrackInfo.ShippingMethodId.Value) == ShippingTypeCode.Standard) { var statusNextBusiessDay = _time.AddBusinessDays(statusDate, 1); if (statusNextBusiessDay > now) { return(false); } } if (!String.IsNullOrEmpty(status) && (status.IndexOf("Notice Left", StringComparison.InvariantCultureIgnoreCase) >= 0 || status.IndexOf("Receptacle Blocked", StringComparison.CurrentCultureIgnoreCase) >= 0 || status.IndexOf("Available for Pickup", StringComparison.InvariantCultureIgnoreCase) >= 0 || status.IndexOf("Business Closed", StringComparison.OrdinalIgnoreCase) >= 0 || status.IndexOf("Undeliverable as Addressed", StringComparison.OrdinalIgnoreCase) >= 0 || status.IndexOf("Addressee not available", StringComparison.OrdinalIgnoreCase) >= 0) && statusDate.HasValue) { return(true); } } if (orderToTrackInfo.Carrier == ShippingServiceUtils.DHLCarrier || orderToTrackInfo.Carrier == ShippingServiceUtils.DHLMXCarrier) { if (!String.IsNullOrEmpty(status) && status.IndexOf("Delivery attempted; recipient not home", StringComparison.InvariantCultureIgnoreCase) >= 0 && statusDate.HasValue) { return(true); } } return(false); }
public void SwitchToECommerce() { var syncInfo = new EmptySyncInformer(_log, SyncType.Orders); var serviceFactory = new ServiceFactory(); var rateProviders = serviceFactory.GetShipmentProviders(_log, _time, _dbFactory, _weightService, _company.ShipmentProviderInfoList, null, null, null, null); var companyAddress = new CompanyAddressService(_company); var synchronizer = new AmazonOrdersSynchronizer(_log, _company, syncInfo, rateProviders, companyAddress, _time, _weightService, _messageService); var toSwitchNumber = 100; using (var db = _dbFactory.GetRWDb()) { //Caclulate correction number var correctionNumber = 0; var fromDate = DateHelper.GetStartOfWeek(_time.GetAppNowTime()); var toDate = _time.GetAppNowTime().Date; var shippingQuery = from o in db.Orders.GetAll() join sh in db.OrderShippingInfos.GetAllAsDto() on o.Id equals sh.OrderId where sh.ShipmentProviderType == (int)ShipmentProviderType.DhlECom && o.OrderStatus == OrderStatusEnumEx.Shipped && sh.LabelPurchaseDate >= fromDate && sh.LabelPurchaseDate <= toDate && sh.IsActive select sh.Id; var shippedCount = shippingQuery.Count(); var workDayCount = _time.GetBizDaysCount(fromDate, _time.GetAppNowTime()); correctionNumber = workDayCount * 100 - shippedCount; if (correctionNumber > 100) { correctionNumber = 0; } toSwitchNumber += correctionNumber; _log.Info("To switch number=" + correctionNumber); IList <DTOOrder> dtoOrders = db.ItemOrderMappings.GetFilteredOrdersWithItems(_weightService, new OrderSearchFilter() { OrderStatus = OrderStatusEnumEx.AllUnshipped }).ToList(); // orderIds.ToArray(), includeSourceItems: true).ToList(); //STEP 1. Switch all stamps firstclass orders var switchedCount = (from o in db.Orders.GetAll() join sh in db.OrderShippingInfos.GetAllAsDto() on o.Id equals sh.OrderId where sh.ShipmentProviderType == (int)ShipmentProviderType.DhlECom && o.OrderStatus == OrderStatusEnumEx.Unshipped && sh.IsActive select sh.Id).Count(); foreach (var dtoOrder in dtoOrders) { if (dtoOrder.ShipmentProviderType == (int)ShipmentProviderType.Stamps && dtoOrder.ShippingInfos.Where(sh => sh.IsActive) .All(sh => sh.ShippingMethodId == ShippingUtils.FirstClassShippingMethodId)) { _log.Info("Change provider for order: " + dtoOrder.OrderId + ", from=" + dtoOrder.ShipmentProviderType); var order = db.Orders.GetById(dtoOrder.Id); order.ShipmentProviderType = (int)ShipmentProviderType.DhlECom; db.Commit(); dtoOrder.ShipmentProviderType = (int)ShipmentProviderType.DhlECom; if (synchronizer.UIUpdate(db, dtoOrder, false, false, false, switchToMethodId: null)) { switchedCount++; _log.Info("Success"); } else { _log.Info("Failed"); } } } var amazonOrderToSwitch = toSwitchNumber - switchedCount; foreach (var dtoOrder in dtoOrders) { _log.Info("Change provider for order: " + dtoOrder.OrderId + ", from=" + dtoOrder.ShipmentProviderType); if (amazonOrderToSwitch > 0) { if (dtoOrder.ShipmentProviderType == (int)ShipmentProviderType.Amazon && dtoOrder.ShippingInfos.Where(sh => sh.IsActive) .All(sh => sh.ShippingMethodId == ShippingUtils.AmazonFirstClassShippingMethodId)) { var order = db.Orders.GetById(dtoOrder.Id); order.ShipmentProviderType = (int)ShipmentProviderType.DhlECom; db.Commit(); dtoOrder.ShipmentProviderType = (int)ShipmentProviderType.DhlECom; if (synchronizer.UIUpdate(db, dtoOrder, false, false, false, null)) { switchedCount++; amazonOrderToSwitch--; _log.Info("Success"); } else { _log.Info("Failed"); } } } } _emailService.SendSystemEmailToAdmin("Dhl eCommerce, switched count: " + switchedCount, "Correction count: " + correctionNumber + ", should switched: " + toSwitchNumber); } }
public bool IsAccept(OrderToTrackDTO orderToTrackInfo, string status, DateTime?statusDate, IList <TrackingRecord> records) { var today = _time.GetAppNowTime().Date; if (orderToTrackInfo.LabelCanceled == true || orderToTrackInfo.CancelLabelRequested == true) { return(false); } //почта после 60 дней за них не отвечает //старше 55 дней if (statusDate.HasValue && statusDate.Value.AddDays(55) < today) { return(false); } if (orderToTrackInfo.LabelCanceled) { return(false); } if (orderToTrackInfo.ActualDeliveryDate.HasValue) { return(false); } if (status.IndexOf("Pre-Shipment Info Sent to USPS", StringComparison.InvariantCultureIgnoreCase) > 0) { return(false); } if (statusDate.HasValue && orderToTrackInfo.ShippingMethodId.HasValue) { var isInternational = ShippingUtils.IsInternationalShippingType(orderToTrackInfo.ShippingMethodId.Value); if (!isInternational) { var shippingType = ShippingUtils.GetShippingType(orderToTrackInfo.ShippingMethodId.Value); var periodDays = 4; switch (shippingType) { case ShippingTypeCode.Standard: periodDays = 4; break; case ShippingTypeCode.Priority: periodDays = 2; break; case ShippingTypeCode.PriorityExpress: periodDays = 1; break; case ShippingTypeCode.SameDay: periodDays = 1; //TODO: 0.5 break; } var dayCount = _time.GetBizDaysCount(statusDate.Value, today); if (dayCount > periodDays) { return(true); } } } return(false); }
public static CallResult <IList <SelectListShippingOption> > Apply(IUnitOfWork db, ILogService log, ITime time, IWeightService weightService, long orderId, IList <IShipmentApi> ratePrividers, AddressDTO returnAddress, AddressDTO pickupAddress, IList <CustomShippingItemViewModel> customShippingItems, bool isFulfilmentUser) { var order = db.Orders.GetById(orderId); var correctedInitialShippingType = ShippingUtils.CorrectInitialShippingService(order.InitialServiceType, order.SourceShippingService, (OrderTypeEnum)order.OrderType); var shippingService = ShippingUtils.InitialShippingServiceIncludeUpgrade(correctedInitialShippingType, order.UpgradeLevel); var shippingProviderType = (ShipmentProviderType)db.Orders.GetById(orderId).ShipmentProviderType; var rateProvider = ratePrividers.FirstOrDefault(p => p.Type == shippingProviderType); var oldShippings = db.OrderShippingInfos.GetByOrderId(orderId).ToList(); var previousNumberInBatch = oldShippings.FirstOrDefault(sh => sh.IsActive)?.NumberInBatch; var items = db.OrderItems.GetWithListingInfo() .Where(oi => oi.OrderId == orderId) .Select(oi => new ListingOrderDTO() { ItemOrderId = oi.ItemOrderId, OrderItemEntityId = oi.OrderItemEntityId, Weight = oi.Weight }).ToList(); if (items.Any(i => !i.Weight.HasValue || i.Weight == 0)) { return(CallResult <IList <SelectListShippingOption> > .Fail("No rates. Order has items w/o weight.", null)); } var packageDict = new Dictionary <string, PackageInfo>(); foreach (var shippingItem in customShippingItems.OrderBy(sh => sh.PackageValue).ToList()) { var packageValue = shippingItem.PackageValue; var orderItem = items.FirstOrDefault(oi => oi.OrderItemEntityId == shippingItem.OrderItemId); var package = packageDict.ContainsKey(packageValue) ? packageDict[packageValue] : null; if (package == null) { var shippingMethodId = int.Parse(shippingItem.PackageValue.Split('-')[0]); var dbShippingMethod = db.ShippingMethods.GetAll().FirstOrDefault(m => m.Id == shippingMethodId); package = new PackageInfo { Items = new List <OrderItemRateInfo>(), RequiredServiceIdentifier = dbShippingMethod.ServiceIdentifier, ServiceTypeUniversal = ShippingUtils.GetShippingType(shippingMethodId), PackageTypeUniversal = ShippingUtils.GetPackageType(shippingMethodId), GroupId = RateHelper.CustomPartialGroupId, }; packageDict[packageValue] = package; } package.Items.Add(new OrderItemRateInfo() { Quantity = 1, ItemOrderId = orderItem.ItemOrderId, Weight = orderItem.Weight ?? 0, }); } var packages = packageDict.Values; var addressTo = db.Orders.GetAddressInfo(order.Id); var shipDate = db.Dates.GetOrderShippingDate(null); var rates = new List <RateDTO>(); foreach (var package in packages) { package.Weight = weightService.AdjustWeight(package.Items.Sum(i => i.Weight * i.Quantity), package.Items.Sum(i => i.Quantity)); GetRateResult rateResult = null; log.Info("GetSpecificLocalRate, orderId=" + orderId); rateResult = rateProvider.GetAllRate(returnAddress, pickupAddress, addressTo, shipDate, package.Weight ?? 1, package.GetDimension(), order.IsInsured ? order.TotalPrice : 0, order.IsSignConfirmation, new OrderRateInfo() { OrderNumber = order.AmazonIdentifier, Items = package.Items, SourceItems = package.Items, EstimatedShipDate = ShippingUtils.AlignMarketDateByEstDayEnd(order.LatestShipDate, (MarketType)order.Market), ShippingService = shippingService, TotalPrice = order.TotalPrice, Currency = order.TotalPriceCurrency, }, RetryModeType.Random); if (rateResult.Result != GetRateResultType.Success) { return(CallResult <IList <SelectListShippingOption> > .Fail("Error when get rates for package, serviceType=" + package.ServiceTypeUniversal.ToString() + ", packageType=" + package.PackageTypeUniversal.ToString(), null)); } var rate = rateResult.Rates.FirstOrDefault(r => r.ServiceIdentifier == package.RequiredServiceIdentifier); if (rate == null) { return(CallResult <IList <SelectListShippingOption> > .Fail("Not rates for package, serviceType=" + package.ServiceTypeUniversal.ToString() + ", packageType=" + package.PackageTypeUniversal.ToString(), null)); } rate.GroupId = RateHelper.CustomPartialGroupId; RateHelper.GroupPackageItems(package); rate.ItemOrderIds = package.Items.Select(i => new RateItemDTO() { OrderItemId = i.ItemOrderId, Quantity = i.Quantity }).ToList(); rates.AddRange(new List <RateDTO>() { rate }); } foreach (var rate in rates) { rate.IsDefault = true; rate.IsVisible = true; if (previousNumberInBatch.HasValue) { rate.NumberInBatch = previousNumberInBatch; previousNumberInBatch = null; } } //save var newShippings = new List <OrderShippingInfo>(); var shippingMethodList = db.ShippingMethods.GetAllAsDto().ToList(); var lastShippingNumber = oldShippings.Any() ? oldShippings.Max(sh => sh.ShippingNumber) ?? 0 : 0; var shippingNumber = lastShippingNumber; foreach (var rate in rates) { log.Debug("store rate, service" + rate.ServiceTypeUniversal + ", package=" + rate.PackageTypeUniversal + ", cost=" + rate.Amount + ", defualt=" + rate.IsDefault + ", visible=" + rate.IsVisible + ", groupId=" + rate.GroupId + ", shipDate=" + rate.ShipDate + ", deliveryDate=" + rate.DeliveryDate + ", daysInfo=" + rate.DeliveryDaysInfo + ", items=" + (rate.ItemOrderIds != null ? String.Join(", ", rate.ItemOrderIds.Select(i => (i.OrderItemId.ToString() + "-" + i.Quantity.ToString())).ToList()) : "")); var currentRate = rate; shippingNumber++; var method = shippingMethodList.FirstOrDefault(m => m.ServiceIdentifier == currentRate.ServiceIdentifier); if (method != null) { currentRate.DeliveryDays = time.GetBizDaysCount(currentRate.ShipDate, currentRate.DeliveryDate); var shippingInfo = db.OrderShippingInfos.CreateShippingInfo(currentRate, orderId, shippingNumber, method.Id); newShippings.Add(shippingInfo); if (currentRate.ItemOrderIds != null && currentRate.ItemOrderIds.Any()) { log.Debug("store partial, items=" + String.Join(", ", currentRate.ItemOrderIds.Select( i => (i.OrderItemId.ToString() + "-" + i.Quantity.ToString())).ToList())); db.ItemOrderMappings.StorePartialShippingItemMappings(shippingInfo.Id, currentRate.ItemOrderIds, items, time.GetAppNowTime()); } else { db.ItemOrderMappings.StoreShippingItemMappings(shippingInfo.Id, items, time.GetAppNowTime()); } } } foreach (var oldShipping in oldShippings) { if (oldShipping.ShippingGroupId == RateHelper.CustomPartialGroupId) { db.OrderShippingInfos.Remove(oldShipping); } else { oldShipping.IsActive = false; } } order.ShippingCalculationStatus = (int)ShippingCalculationStatusEnum.FullCalculation; db.Commit(); //Return actual values var allShippings = db.OrderShippingInfos.GetByOrderIdAsDto(orderId); var results = OrderViewModel.GetShippingOptions(allShippings, (MarketType)order.Market, order.IsSignConfirmation, order.IsInsured, isFulfilmentUser, showOptionsPrices: true, showProviderName: false); return(CallResult <IList <SelectListShippingOption> > .Success(results)); }