コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
            }
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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));
        }