Beispiel #1
0
 public OrderValidatorService(
     ILogService log,
     IDbFactory dbFactory,
     IEmailService emailService,
     ISettingsService settings,
     IOrderHistoryService orderHistory,
     ISystemActionService actionService,
     IPriceService priceService,
     IHtmlScraperService htmlScraper,
     IAddressService addressService,
     AddressDTO returnAddress,
     IShipmentApi stampsRateApi,
     ITime time,
     CompanyDTO company)
 {
     _log            = log;
     _dbFactory      = dbFactory;
     _time           = time;
     _emailService   = emailService;
     _settings       = settings;
     _orderHistory   = orderHistory;
     _actionService  = actionService;
     _priceService   = priceService;
     _htmlScraper    = htmlScraper;
     _addressService = addressService;
     _returnAddress  = returnAddress;
     _stampsRateApi  = stampsRateApi;
     _company        = company;
 }
Beispiel #2
0
 public ExceededShippingCostChecker(ILogService log,
                                    ISystemActionService actionService,
                                    IPriceService priceService,
                                    IShipmentApi stampsRateProvider,
                                    AddressDTO fromAddress,
                                    ITime time)
 {
     _log                = log;
     _time               = time;
     _fromAddress        = fromAddress;
     _stampsRateProvider = stampsRateProvider;
     _actionService      = actionService;
     _priceService       = priceService;
 }
        public IList <IShipmentApi> GetShipmentProviders(ILogService log,
                                                         ITime time,
                                                         IDbFactory dbFactory,
                                                         IWeightService weightService,
                                                         IList <ShipmentProviderDTO> shipmentProviderInfos,
                                                         string defaultCustomType,
                                                         string outputDirectory,
                                                         string reserveDirectory,
                                                         string templateDirectory)
        {
            var results          = new List <IShipmentApi>();
            var providerTypeList = new List <ShipmentProviderType>()
            {
                ShipmentProviderType.Stamps,
                ShipmentProviderType.StampsPriority,
                ShipmentProviderType.Amazon,
                ShipmentProviderType.Dhl,
                ShipmentProviderType.DhlECom,
                ShipmentProviderType.IBC,
                ShipmentProviderType.SkyPostal,
                ShipmentProviderType.FIMS,
                ShipmentProviderType.FedexSmartPost,
                ShipmentProviderType.FedexOneRate,
                ShipmentProviderType.FedexGeneral
            };

            foreach (var providerType in providerTypeList)
            {
                IShipmentApi provider = null;
                provider = GetShipmentProviderByType(providerType,
                                                     log,
                                                     time,
                                                     dbFactory,
                                                     weightService,
                                                     shipmentProviderInfos,
                                                     defaultCustomType,
                                                     outputDirectory,
                                                     reserveDirectory,
                                                     templateDirectory);

                if (provider != null)
                {
                    results.Add(provider);
                }
            }

            return(results);
        }
        public CallResult <List <ShippingMethodViewModel> > GetShippingOptionsModel(IUnitOfWork db,
                                                                                    ITime time,
                                                                                    ILogService log,
                                                                                    IShipmentApi rateProvider,
                                                                                    IWeightService weightService,
                                                                                    IShippingService shippingService,
                                                                                    IList <OrderItemRateInfo> orderItems)
        {
            var result = new CallResult <List <ShippingMethodViewModel> >();

            var fromAddress = FromAddress.GetAddressDto();
            var toAddress   = ToAddress.GetAddressDto();

            if (AddressHelper.IsEmpty(fromAddress) ||
                AddressHelper.IsEmpty(toAddress))
            {
                result.Status  = CallStatus.Fail;
                result.Message = "Empty from/to address";
            }


            result = GetShippingOptionsWithRate(db,
                                                log,
                                                time,
                                                rateProvider,
                                                shippingService,
                                                fromAddress,
                                                toAddress,
                                                time.GetAppNowTime(),
                                                WeightLb ?? 0,
                                                (decimal)(WeightOz ?? 0),
                                                0,
                                                new OrderRateInfo()
            {
                Items = orderItems,
            });

            return(result);
        }
        public static CallResult <List <ShippingMethodViewModel> > GetShippingOptionsWithRate(IUnitOfWork db,
                                                                                              ILogService log,
                                                                                              ITime time,
                                                                                              IShipmentApi rateProvider,
                                                                                              IShippingService shippingService,
                                                                                              AddressDTO fromAddress,
                                                                                              AddressDTO toAddress,
                                                                                              DateTime shipDate,
                                                                                              int weightLb,
                                                                                              decimal weightOz,
                                                                                              decimal insuredValue,
                                                                                              OrderRateInfo orderInfo)
        {
            var result        = new CallResult <List <ShippingMethodViewModel> >();
            var pickupAddress = fromAddress;

            var rateResult = rateProvider.GetAllRate(
                fromAddress,
                pickupAddress,
                toAddress,
                shipDate,
                (double)(weightLb * 16 + weightOz),
                null,
                0,
                false,
                orderInfo,
                RetryModeType.Fast);

            if (rateResult.Result != GetRateResultType.Success)
            {
                result.Status  = CallStatus.Fail;
                result.Message = rateResult.Message;
                return(result);
            }

            var methodList = GetShippingMethods(db,
                                                fromAddress.FinalCountry,
                                                toAddress.FinalCountry,
                                                weightLb,
                                                weightOz,
                                                rateProvider.Type);


            result.Data   = new List <ShippingMethodViewModel>();
            result.Status = CallStatus.Success;

            foreach (var method in methodList)
            {
                var rate = rateResult.Rates.FirstOrDefault(r => r.ServiceIdentifier == method.ServiceIdentifier);

                if (rate != null)
                {
                    //var deliveryDays = time.GetBizDaysCount(rate.ShipDate, rate.DeliveryDate);
                    var    deliveryDaysInfo = rate.DeliveryDaysInfo;
                    string providerPrefix   = "";
                    switch ((ShipmentProviderType)method.ShipmentProviderType)
                    {
                    case ShipmentProviderType.Amazon:
                        providerPrefix = "AMZ ";
                        break;

                    case ShipmentProviderType.Stamps:
                        providerPrefix = "";
                        break;

                    case ShipmentProviderType.Dhl:
                        providerPrefix = "";
                        break;

                    case ShipmentProviderType.DhlECom:
                        providerPrefix = "";
                        break;
                    }

                    var adjustedAmount = shippingService.ApplyCharges(method.Id, rate.Amount);

                    result.Data.Add(new ShippingMethodViewModel()
                    {
                        Id             = method.Id,
                        ProviderPrefix = providerPrefix,
                        Carrier        = method.CarrierName,
                        Name           = ShippingUtils.PrepareMethodNameToDisplay(method.Name, deliveryDaysInfo),
                        Rate           = adjustedAmount,
                    });
                }
            }

            return(result);
        }
Beispiel #6
0
        public CallResult <string> Closeout(IUnitOfWork db,
                                            IShipmentApi shipmentApi,
                                            IFileMaker pdfMaker,
                                            string outputDirectory,
                                            bool isSample,
                                            long?by)
        {
            _log.Info("Begin Closeout");
            var toCloseoutShippings = db.OrderShippingInfos.GetAllAsDto()
                                      .Where(sh => sh.ShipmentProviderType == (int)ShipmentProviderType.DhlECom &&
                                             !sh.ScanFormId.HasValue &&
                                             !sh.CancelLabelRequested &&
                                             !sh.LabelCanceled &&
                                             !String.IsNullOrEmpty(sh.StampsTxId))
                                      .ToList();

            var toCloseoutMails = db.MailLabelInfos.GetAllAsDto()
                                  .Where(m => m.ShipmentProviderType == (int)ShipmentProviderType.DhlECom &&
                                         !m.ScanFormId.HasValue &&
                                         !m.CancelLabelRequested &&
                                         !m.LabelCanceled &&
                                         !String.IsNullOrEmpty(m.StampsTxId))
                                  .ToList();

            //var shippingWithEmptyPackageIds = toCloseoutShippings.Where(sh => String.IsNullOrEmpty(sh.StampsTxId)).ToList();
            //if (shippingWithEmptyPackageIds.Any())
            //    return CallResult<string>.Fail("The following orders have has empty Package Id: "
            //        + String.Join(", ", shippingWithEmptyPackageIds.Select(sh => sh.OrderAmazonId).ToList()), null);

            //var mailingWithEmptyPackageIds = toCloseoutMails.Where(sh => String.IsNullOrEmpty(sh.StampsTxId)).ToList();
            //if (mailingWithEmptyPackageIds.Any())
            //    return CallResult<string>.Fail("The following orders have has empty Package Id: "
            //        + String.Join(", ", mailingWithEmptyPackageIds.Select(sh => sh.OrderAmazonId).ToList()), null);


            var closeoutIds = toCloseoutShippings.Select(sh => sh.StampsTxId).ToList();

            closeoutIds.AddRange(toCloseoutMails.Select(m => m.StampsTxId).ToList());

            _log.Info("Request closeout for Ids: " + String.Join(", ", closeoutIds));

            CallResult <IList <ScanFormInfo> > result = null;

            if (isSample)
            {
                result = CallResult <IList <ScanFormInfo> > .Success(new List <ScanFormInfo>()
                {
                    new ScanFormInfo()
                    {
                        ScanFormId   = "Test1",
                        ScanFormPath = "~/Closeouts/closeout_1_7027750.pdf"
                    }
                });
            }
            else
            {
                result = shipmentApi.GetScanForm(closeoutIds, null, DateTime.UtcNow);
            }
            _log.Info("Result: " + result.IsSuccess);

            if (result.IsSuccess)
            {
                var forms = result.Data;

                long?lastFormId = null;
                foreach (var form in forms)
                {
                    var dbForm = new ScanForm()
                    {
                        FormId     = form.ScanFormId,
                        FileName   = form.ScanFormPath,
                        CreateDate = _time.GetAppNowTime(),
                        CreatedBy  = by,
                    };
                    db.ScanForms.Add(dbForm);
                    db.Commit();
                    lastFormId = dbForm.Id;
                }

                var pdfFileName = pdfMaker.CreateFileWithLabels(new List <PrintLabelInfo>(),
                                                                forms.Select(s => outputDirectory + s.ScanFormPath.Trim(new[] { '~' })).ToList(),
                                                                null,
                                                                outputDirectory);

                var printPack = new LabelPrintPack()
                {
                    FileName   = pdfFileName,
                    CreateDate = _time.GetAppNowTime(),
                };
                db.LabelPrintPacks.Add(printPack);
                db.Commit();

                _log.Info("Begin update shipments");
                var fromDate          = _time.GetAppNowTime().AddDays(-30);
                var shipmentsToUpdate = db.OrderShippingInfos.GetAll().Where(sh => sh.CreateDate > fromDate &&
                                                                             closeoutIds.Contains(sh.StampsTxId))
                                        .ToList();
                var mailingsToUpdate = db.MailLabelInfos.GetAll().Where(sh => sh.CreateDate > fromDate &&
                                                                        closeoutIds.Contains(sh.StampsTxId))
                                       .ToList();

                foreach (var shipment in shipmentsToUpdate)
                {
                    shipment.ScanFormId = lastFormId;
                }
                db.Commit();
                foreach (var mailing in mailingsToUpdate)
                {
                    mailing.ScanFormId = lastFormId;
                }
                db.Commit();
                _log.Info("End update shipments");

                var url = Models.UrlHelper.GetPrintLabelPathById(printPack.Id);

                return(CallResult <string> .Success(url));
            }
            else
            {
                return(CallResult <string> .Fail(result.Message, null));
            }
        }
Beispiel #7
0
        public CallResult <string> Closeout(IUnitOfWork db,
                                            IShipmentApi shipmentApi,
                                            IList <DropShipperApi> externalApis,
                                            IFileMaker pdfMaker,
                                            string outputDirectory,
                                            bool isSample,
                                            long?by)
        {
            _log.Info("Begin Closeout");
            var toCloseoutShippings = db.OrderShippingInfos.GetAllAsDto()
                                      .Where(sh => sh.ShipmentProviderType == (int)ShipmentProviderType.IBC &&
                                             !sh.ScanFormId.HasValue &&
                                             !sh.CancelLabelRequested &&
                                             !sh.LabelCanceled &&
                                             !String.IsNullOrEmpty(sh.StampsTxId))
                                      .ToList();

            var toCloseoutMails = db.MailLabelInfos.GetAllAsDto()
                                  .Where(m => m.ShipmentProviderType == (int)ShipmentProviderType.IBC &&
                                         !m.ScanFormId.HasValue &&
                                         !m.CancelLabelRequested &&
                                         !m.LabelCanceled &&
                                         !String.IsNullOrEmpty(m.StampsTxId))
                                  .ToList();

            var closeoutIds = toCloseoutShippings.Select(sh => sh.StampsTxId).ToList();

            closeoutIds.AddRange(toCloseoutMails.Select(m => m.StampsTxId).ToList());

            foreach (var extApi in externalApis)
            {
                var extInfo = extApi.GetIBCOrdersToClose();
                if (!extInfo.IsFail)
                {
                    var mbgCloseoutShippingIds = extInfo.Data.ToCloseoutIds;
                    _log.Info("External API " + extApi.Market + "-" + extApi.MarketplaceId + " closeout ids: " + String.Join(", ", mbgCloseoutShippingIds));
                    closeoutIds.AddRange(mbgCloseoutShippingIds);
                }
                else
                {
                    _log.Info("No communication with " + extApi.Market + "-" + extApi.MarketplaceId + ". Details: " + extInfo.Message);
                    //return CallResult<string>.Fail("No communication with " + extApi.Market + "-" + extApi.MarketplaceId + ". Details: " + extInfo.Message, null);
                }
            }

            _log.Info("Request closeout for Ids: " + String.Join(", ", closeoutIds));

            CallResult <IList <ScanFormInfo> > result = null;

            if (isSample)
            {
                result = CallResult <IList <ScanFormInfo> > .Success(new List <ScanFormInfo>()
                {
                    new ScanFormInfo()
                    {
                        ScanFormId   = "Test1",
                        ScanFormPath = "~/Closeouts/closeout_1_7027750.pdf"
                    }
                });
            }
            else
            {
                result = shipmentApi.GetScanForm(closeoutIds, null, DateTime.UtcNow);
            }
            _log.Info("Result: " + result.IsSuccess);

            if (result.IsSuccess)
            {
                var form = result.Data.FirstOrDefault();

                long?lastFormId = null;
                var  dbForm     = new ScanForm()
                {
                    FormId     = form.ScanFormId,
                    FileName   = form.ScanFormPath,
                    CreateDate = _time.GetAppNowTime(),
                    CreatedBy  = by,
                };
                db.ScanForms.Add(dbForm);
                db.Commit();
                lastFormId = dbForm.Id;

                _log.Info("Begin update shipments");
                var fromDate          = _time.GetAppNowTime().AddDays(-30);
                var shipmentsToUpdate = db.OrderShippingInfos.GetAll().Where(sh => sh.CreateDate > fromDate &&
                                                                             closeoutIds.Contains(sh.StampsTxId))
                                        .ToList();
                var mailingsToUpdate = db.MailLabelInfos.GetAll().Where(sh => sh.CreateDate > fromDate &&
                                                                        closeoutIds.Contains(sh.StampsTxId))
                                       .ToList();

                foreach (var shipment in shipmentsToUpdate)
                {
                    shipment.ScanFormId = lastFormId;
                }
                db.Commit();
                foreach (var mailing in mailingsToUpdate)
                {
                    mailing.ScanFormId = lastFormId;
                }
                db.Commit();
                _log.Info("End update shipments");

                _log.Info("Form: " + (form.CloseoutIds != null ? String.Join(",", form.CloseoutIds) : "null"));

                foreach (var extApi in externalApis)
                {
                    _log.Info("Begin update " + extApi.Market + "-" + extApi.MarketplaceId + " shipments");
                    var closeResult = extApi.CloseIBCOrders(form);
                    _log.Info("Close result: isSuccess: " + closeResult.IsSuccess + ", message: " + closeResult.Message);
                    _log.Info("End update shipments");
                }

                return(CallResult <string> .Success(""));
            }
            else
            {
                return(CallResult <string> .Fail(result.Message, null));
            }
        }
Beispiel #8
0
        public CallResult <List <ShippingMethodViewModel> > GetShippingOptionsModel(IUnitOfWork db,
                                                                                    ITime time,
                                                                                    ILogService log,
                                                                                    IShipmentApi rateProvider,
                                                                                    IShippingService shippingService,
                                                                                    IWeightService weightService)
        {
            var result = new CallResult <List <ShippingMethodViewModel> >();

            if (String.IsNullOrEmpty(OrderID))
            {
                result.Status  = CallStatus.Fail;
                result.Message = "Empty Order Id";
                return(result);
            }

            var fromAddress = FromAddress.GetAddressDto();
            var toAddress   = ToAddress.GetAddressDto();

            if (AddressHelper.IsEmpty(fromAddress) ||
                AddressHelper.IsEmpty(toAddress))
            {
                result.Status  = CallStatus.Fail;
                result.Message = "Empty from/to address";
            }

            var orders = db.ItemOrderMappings.GetFilteredOrdersWithItems(weightService,
                                                                         new OrderSearchFilter()
            {
                Market                = MarketType.None,
                EqualOrderNumber      = OrderID,
                IgnoreBatchFilter     = true,
                IncludeNotify         = false,
                UnmaskReferenceStyles = false,
                IncludeSourceItems    = true,
            });

            if (!orders.Any())
            {
                result.Status  = CallStatus.Fail;
                result.Message = "Cannot find order Id";
                return(result);
            }

            //NOTE: no need to use Items from model, we always buy label for all items, only needs a custom weight
            var orderItems = OrderHelper.BuildAndGroupOrderItems(orders.SelectMany(o => o.Items).ToList());

            orderItems = OrderHelper.GroupBySourceItemOrderId(orderItems);

            var sourceOrderItems = OrderHelper.BuildAndGroupOrderItems(orders.SelectMany(o => o.SourceItems).ToList());

            sourceOrderItems = OrderHelper.GroupBySourceItemOrderId(sourceOrderItems);

            var shipDate  = db.Dates.GetOrderShippingDate(null);
            var mainOrder = orders.FirstOrDefault();

            result = MailViewModel.GetShippingOptionsWithRate(db,
                                                              log,
                                                              time,
                                                              rateProvider,
                                                              shippingService,
                                                              fromAddress,
                                                              toAddress,
                                                              shipDate,
                                                              WeightLb ?? 0,
                                                              (decimal)(WeightOz ?? 0),
                                                              new ItemPackageDTO()
            {
                PackageLength = PackageLength,
                PackageWidth  = PackageWidth,
                PackageHeight = PackageHeight,
            },
                                                              0,
                                                              new OrderRateInfo()
            {
                OrderNumber = mainOrder.OrderId,

                Items       = orderItems,
                SourceItems = sourceOrderItems,

                EstimatedShipDate = ShippingUtils.AlignMarketDateByEstDayEnd(mainOrder.LatestShipDate, (MarketType)mainOrder.Market),
                TotalPrice        = orders.Sum(o => o.TotalPrice),
                Currency          = mainOrder.TotalPriceCurrency,
            });

            return(result);
        }