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