public static IList <MessageString> AssignToOrder(IUnitOfWork db,
                                                          ILogService log,
                                                          long emailId,
                                                          string orderNumber,
                                                          DateTime when,
                                                          long?by)
        {
            var messages = new List <MessageString>();

            var email    = db.Emails.GetAll().FirstOrDefault(e => e.Id == emailId);
            var fromDate = when.AddDays(-30);
            var allNotAssignedEmailIds = (from e in db.Emails.GetAll()
                                          join eToO in db.EmailToOrders.GetAll() on e.Id equals eToO.EmailId into assigned
                                          from eToO in assigned.DefaultIfEmpty()
                                          where eToO == null &&
                                          e.ReceiveDate > fromDate &&
                                          e.From == email.From
                                          select e.Id).ToList();

            allNotAssignedEmailIds.Add(emailId);
            allNotAssignedEmailIds = allNotAssignedEmailIds.Distinct().ToList();

            orderNumber = OrderHelper.RemoveOrderNumberFormat(orderNumber);
            var order = db.Orders.GetByCustomerOrderNumber(orderNumber);

            if (order != null)
            {
                var bindings = db.EmailToOrders.GetAll().Where(e => e.EmailId == emailId).ToList();
                foreach (var binding in bindings)
                {
                    log.Info("Remove, orderId=" + binding.OrderId + ", emailId=" + binding.EmailId);
                    db.EmailToOrders.Remove(binding);
                }
                var orderIds = new List <string>()
                {
                    order.CustomerOrderId
                }.Distinct();                                                          //order.AmazonIdentifier,

                foreach (var orderId in orderIds)
                {
                    foreach (var toAssignEmailId in allNotAssignedEmailIds)
                    {
                        db.EmailToOrders.Add(new EmailToOrder()
                        {
                            EmailId    = toAssignEmailId,
                            OrderId    = orderId,
                            CreateDate = when,
                            CreatedBy  = by,
                        });
                    }
                }
                db.Commit();
            }
            else
            {
                messages.Add(MessageString.Error("Unable to find a matching order"));
            }

            return(messages);
        }
Beispiel #2
0
        public ParentItemDTO CreateFromStyle(IUnitOfWork db,
                                             string styleString,
                                             decimal?customPrice,
                                             MarketType market,
                                             string marketplaceId,
                                             out IList <MessageString> messages)
        {
            messages = new List <MessageString>();

            var style = db.Styles.GetAllActiveAsDto().FirstOrDefault(s => s.StyleID == styleString);

            if (style == null)
            {
                messages.Add(MessageString.Error("Style String was not found"));
                return(null);
            }
            var model = CreateFromStyle(db,
                                        style,
                                        market,
                                        marketplaceId,
                                        out messages);

            if (model != null && customPrice.HasValue)
            {
                model.Variations.ForEach(v => v.CurrentPrice = customPrice.Value);
            }

            return(model);
        }
        public static ItemExportViewModel FromParentASIN(IUnitOfWork db,
                                                         string asin,
                                                         int market,
                                                         string marketplaceId,
                                                         out IList <MessageString> messages)
        {
            messages = new List <MessageString>();

            var parentItem = db.ParentItems.GetAllAsDto().FirstOrDefault(s => s.ASIN == asin &&
                                                                         s.Market == market &&
                                                                         s.MarketplaceId == marketplaceId);

            if (parentItem == null)
            {
                messages.Add(MessageString.Error("Parent ASIN was not found"));
                return(null);
            }

            var items = db.Items.GetAllViewAsDto().Where(i => i.ParentASIN == parentItem.ASIN &&
                                                         !i.IsFBA &&
                                                         i.Market == parentItem.Market &&
                                                         i.MarketplaceId == parentItem.MarketplaceId)
                        .ToList();

            foreach (var item in items)
            {
                item.BrandName = item.BrandName ?? parentItem.BrandName;
            }

            var model = new ItemExportViewModel();

            var            mainItem = items.FirstOrDefault();
            StyleEntireDto style    = mainItem != null && mainItem.StyleId.HasValue
                ? db.Styles.GetByStyleIdAsDto(mainItem.StyleId.Value)
                : null;

            var firstStyleString = items.Any() ? items.First().StyleString : "";

            model.ASIN = parentItem.ASIN;
            model.Id   = parentItem.Id;

            model.Market        = (int)market;
            model.MarketplaceId = marketplaceId;

            model.Name = parentItem.AmazonName;

            model.PictureSourceType = PictureSourceTypes.FromStyle; //NOTE: always generate excel with fresh images
            model.ListingImage      = mainItem?.ImageUrl;
            model.StyleImage        = style?.Image;

            model.VariationList = items
                                  .OrderBy(i => i.StyleId)
                                  .ThenBy(i => SizeHelper.GetSizeIndex(i.StyleSize))
                                  .Select(i => new ItemVariationExportViewModel(i)).ToList();

            return(model);
        }
Beispiel #4
0
        public virtual ActionResult Generate(MailViewModel model)
        {
            LogI("Index, model=" + model);

            if (ModelState.IsValid)
            {
                model.OrderID = model.OrderID.RemoveWhitespaces();
                if (model.IsAddressSwitched)
                {
                    model.ToAddress.IsVerified = true;
                }
                else
                {
                    model.FromAddress.IsVerified = true;
                }


                var shipmentProviders = ServiceFactory.GetShipmentProviders(LogService,
                                                                            Time,
                                                                            DbFactory,
                                                                            WeightService,
                                                                            AccessManager.ShipmentProviderInfoList,
                                                                            AppSettings.DefaultCustomType,
                                                                            AppSettings.LabelDirectory,
                                                                            AppSettings.ReserveDirectory,
                                                                            AppSettings.TemplateDirectory);

                var labelService    = new LabelService(shipmentProviders, LogService, Time, DbFactory, EmailService, PdfMaker, AddressService);
                var quantityManager = new QuantityManager(LogService, Time);

                var results = model.Generate(LogService,
                                             Time,
                                             labelService,
                                             quantityManager,
                                             Db,
                                             WeightService,
                                             ShippingService,
                                             AppSettings.IsSampleLabels,
                                             Time.GetAppNowTime(),
                                             AccessManager.UserId);

                model.Messages.AddRange(results);
            }
            else
            {
                model.Messages.AddRange(ModelState.GetErrors().Select(m => MessageString.Error(m)));
            }

            LogI("Index, Generate results=");
            model.Messages.ForEach(m => LogI(m.Status + ": " + m.Message));

            return(new JsonResult {
                Data = model, JsonRequestBehavior = JsonRequestBehavior.AllowGet
            });
        }
Beispiel #5
0
        public IList <MessageString> Validate(IUnitOfWork db)
        {
            var results = new List <MessageString>();

            if (!Id.HasValue)
            {
                var userByName = db.Users.GetAllAsDto().FirstOrDefault(u => u.Name == UserName);
                if (userByName != null)
                {
                    results.Add(MessageString.Error("", "User with that name already exists"));
                }
            }
            return(results);
        }
        public IList <MessageString> ValidateTrackingNumber()
        {
            TrackingNumber = StringHelper.TrimWhitespace(TrackingNumber);

            if (String.IsNullOrEmpty(TrackingNumber))
            {
                return new List <MessageString>()
                       {
                           MessageString.Error("Tracking number is empty")
                       }
            }
            ;

            if (Carrier == ShippingServiceUtils.USPSCarrier)
            {
                if (TrackingNumber.Length != 22)
                {
                    return new List <MessageString>()
                           {
                               MessageString.Error("Invalid tracking number format")
                           }
                }
                ;

                var checkDigitResult = TrackingHelper.GetCheckDigit(TrackingNumber);
                if (checkDigitResult.IsFail)
                {
                    return new List <MessageString>()
                           {
                               MessageString.Error(checkDigitResult.Message)
                           }
                }
                ;

                if (checkDigitResult.Data.ToString()[0] != TrackingNumber.Last())
                {
                    return new List <MessageString>()
                           {
                               MessageString.Error("Invalid check sum. Expected: " + checkDigitResult.Data)
                           }
                }
                ;
            }

            return(new List <MessageString>());
        }
        public List <MessageString> ProcessApplyResult(ApplyOrderResult applyResult,
                                                       IUnitOfWork db,
                                                       ILogService log,
                                                       ITime time,
                                                       IOrderSynchronizer synchronizer,
                                                       AddressChecker addressChecker,
                                                       IOrderHistoryService orderHistoryService,
                                                       IWeightService weightService,
                                                       long?by)
        {
            var results = new List <MessageString>();

            if (applyResult.RateRecalcRequested)
            {
                var dtoOrder = db.ItemOrderMappings.GetOrderWithItems(weightService, OrderId, unmaskReferenceStyle: false, includeSourceItems: true);

                try
                {
                    RetryHelper.ActionWithRetries(() => synchronizer.UIUpdate(db,
                                                                              dtoOrder,
                                                                              isForceOverride: false,
                                                                              keepActiveShipping: true,
                                                                              keepCustomShipping: applyResult.ShipmentProviderChanged ? false : true,
                                                                              switchToMethodId: null),
                                                  log,
                                                  2,
                                                  300,
                                                  RetryModeType.Normal,
                                                  true);

                    orderHistoryService.AddRecord(dtoOrder.Id, OrderHistoryHelper.RecalculateRatesKey, null, true, by);
                }
                catch (Exception ex)
                {
                    results.Add(MessageString.Error("", "An unexpected error has occurred. Please try again. Detail: " + ex.Message));
                }
            }

            if (applyResult.AddressValidationRequested)
            {
                addressChecker.UpdateOrderAddressValidationStatus(db, EntityId, null);
            }

            return(results);
        }
Beispiel #8
0
        public IList <MessageString> Validate()
        {
            var messages = new List <MessageString>();

            if (!DiscountPercent.HasValue)
            {
                messages.Add(MessageString.Error("Empty 'Discount Percent'"));
            }
            if (DiscountPercent <= 0 || DiscountPercent >= 100)
            {
                messages.Add(MessageString.Error("Invalid 'Discount Percent' value"));
            }
            if (!Market.HasValue)
            {
                messages.Add(MessageString.Error("Please choose marketplace"));
            }

            return(messages);
        }
Beispiel #9
0
        public ParentItemDTO CreateFromStyle(IUnitOfWork db,
                                             long styleId,
                                             MarketType market,
                                             string marketplaceId,
                                             out IList <MessageString> messages)
        {
            messages = new List <MessageString>();

            var style = db.Styles.GetAllActiveAsDto().FirstOrDefault(s => s.Id == styleId);

            if (style == null)
            {
                messages.Add(MessageString.Error("Style Id was not found"));
                return(null);
            }
            return(CreateFromStyle(db,
                                   style,
                                   market,
                                   marketplaceId,
                                   out messages));
        }
        public static IList <MessageString> ValidateFeed(string filepath)
        {
            var results = new List <MessageString>();

            try
            {
                using (var stream = new FileStream(filepath, FileMode.Open, FileAccess.ReadWrite))
                {
                    IWorkbook workbook = null;
                    if (filepath.EndsWith(".xlsx"))
                    {
                        workbook = new XSSFWorkbook(stream);
                    }
                    else
                    {
                        workbook = new HSSFWorkbook(stream);
                    }

                    var sheet = workbook.GetSheetAt(0);

                    var headerRow = sheet.GetRow(0);

                    //var modelColumnIndex = headerRow.Cells.FirstOrDefault(c => c != null
                    //                                                           &&
                    //                                                           (StringHelper.IsEqualNoCase(
                    //                                                               StringHelper.TrimWhitespace(
                    //                                                                   c.StringCellValue), "SKU")
                    //                                                            ||
                    //                                                            StringHelper.IsEqualNoCase(
                    //                                                                StringHelper.TrimWhitespace(
                    //                                                                    c.StringCellValue), "Model")
                    //                                                            ||
                    //                                                            StringHelper.IsEqualNoCase(
                    //                                                                StringHelper.TrimWhitespace(
                    //                                                                    c.StringCellValue), "Product Id")))?
                    //    .ColumnIndex;

                    //if (!modelColumnIndex.HasValue)
                    //    results.Add(MessageString.Error("Unable to find the SKU/Model column"));

                    //if (market == MarketType.Amazon
                    //    || market == MarketType.AmazonPrime)
                    //{
                    //    var minPriceColumnIndex = headerRow.Cells.FirstOrDefault(c => c != null
                    //        && (StringHelper.IsEqualNoCase(StringHelper.TrimWhitespace(c.StringCellValue), "Min Price")
                    //        || StringHelper.IsEqualNoCase(StringHelper.TrimWhitespace(c.StringCellValue), "Min")
                    //        || StringHelper.IsEqualNoCase(StringHelper.TrimWhitespace(c.StringCellValue), "Min/Floor")))?.ColumnIndex;

                    //    var maxPriceColumnIndex = headerRow.Cells.FirstOrDefault(c => c != null
                    //        && (StringHelper.IsEqualNoCase(StringHelper.TrimWhitespace(c.StringCellValue), "Max Price")
                    //            || StringHelper.IsEqualNoCase(StringHelper.TrimWhitespace(c.StringCellValue), "Max")))?.ColumnIndex;

                    //    if (!minPriceColumnIndex.HasValue)
                    //    {
                    //        results.Add(MessageString.Error("Unable to find the \"Min Price\" column"));
                    //    }
                    //    if (!maxPriceColumnIndex.HasValue)
                    //    {
                    //        results.Add(MessageString.Error("Unable to find the \"Max Price\" column"));
                    //    }
                    //}
                }
            }
            catch (Exception ex)
            {
                results.Add(MessageString.Error("Invalid file format. Details: " + ex.Message));
            }
            return(results);
        }
Beispiel #11
0
        public void Create(ILogService log,
                           ITime time,
                           IQuantityManager quantityManager,
                           IDbFactory dbFactory,
                           IWeightService weightService,
                           IShippingService shippingService,
                           IAutoCreateListingService createListingService,
                           ISettingsService settingService,
                           IEmailService emailService,
                           ISystemActionService actionService,
                           IHtmlScraperService htmlScraper,
                           IOrderHistoryService orderHistory,
                           IPriceService priceService,
                           CompanyDTO company,
                           DateTime when,
                           long?by)
        {
            var syncInfo      = new EmptySyncInformer(log, SyncType.Orders);
            var market        = (int)MarketType.OfflineOrders;
            var marketplaceId = MarketplaceKeeper.ManuallyCreated;

            var orderItems = new List <ListingOrderDTO>();

            using (var db = dbFactory.GetRWDb())
            {
                var index = 1;
                foreach (var item in Items)
                {
                    var dbItem = db.Items.GetAll().FirstOrDefault(i => i.Market == market &&
                                                                  i.MarketplaceId == marketplaceId &&
                                                                  i.StyleItemId == item.StyleItemId);

                    if (dbItem == null)
                    {
                        var itemPrice = item.ItemPrice; // db.Items.GetAllViewActual()
                                                        //.FirstOrDefault(i => i.Market == (int)MarketType.Amazon
                                                        //    && i.MarketplaceId == MarketplaceKeeper.AmazonComMarketplaceId)?.CurrentPrice;

                        log.Info("Request create listing, market=" + market
                                 + ", marketplaceId=" + marketplaceId);

                        IList <MessageString> messages = new List <MessageString>();
                        //Create New
                        var model = createListingService.CreateFromStyle(db,
                                                                         item.StyleId.Value,
                                                                         (MarketType)market,
                                                                         marketplaceId,
                                                                         out messages);

                        model.Variations.ForEach(v => v.CurrentPrice = itemPrice);

                        createListingService.Save(model,
                                                  "",
                                                  db,
                                                  when,
                                                  by);

                        dbItem = db.Items.GetAll().FirstOrDefault(i => i.Market == market &&
                                                                  i.MarketplaceId == marketplaceId &&
                                                                  i.StyleItemId == item.StyleItemId);
                    }

                    var dbListing = db.Listings.GetAll().FirstOrDefault(l => l.Market == market &&
                                                                        l.MarketplaceId == marketplaceId &&
                                                                        l.ItemId == dbItem.Id);

                    orderItems.Add(new ListingOrderDTO()
                    {
                        ASIN            = dbItem.ASIN,
                        SKU             = dbListing.SKU,
                        ItemPaid        = item.ItemPrice,
                        ItemPrice       = item.ItemPrice,
                        ItemGrandPrice  = item.ItemPrice,
                        StyleId         = dbItem.StyleId,
                        StyleID         = dbItem.StyleString,
                        StyleItemId     = dbItem.StyleItemId,
                        Market          = dbItem.Market,
                        MarketplaceId   = dbItem.MarketplaceId,
                        QuantityOrdered = item.Quantity,
                        ItemOrderId     = index.ToString(),
                        SourceListingId = dbListing.Id,
                    });

                    index++;
                }

                OrderNumber = db.Orders.GetAll()
                              .Where(o => o.Market == (int)market &&
                                     o.MarketplaceId == marketplaceId)
                              .OrderByDescending(o => o.Id).FirstOrDefault()?.AmazonIdentifier;

                if (String.IsNullOrEmpty(OrderNumber))
                {
                    OrderNumber = "1000";
                }
                else
                {
                    OrderNumber = ((StringHelper.TryGetInt(OrderNumber) ?? 1000) + 1).ToString();
                }
            }

            var dtoOrder = new DTOOrder()
            {
                Market            = market,
                MarketplaceId     = marketplaceId,
                OrderDate         = OrderDate,
                OrderStatus       = "Unshipped",
                SourceOrderStatus = "Unshipped",
                OrderId           = OrderNumber,
                CustomerOrderId   = OrderNumber,
                MarketOrderId     = OrderNumber,

                AmazonEmail      = ToAddress.Email,
                BuyerEmail       = ToAddress.Email,
                PersonName       = ToAddress.FullName,
                BuyerName        = ToAddress.FullName,
                ShippingAddress1 = ToAddress.Address1,
                ShippingAddress2 = ToAddress.Address2,
                ShippingCity     = ToAddress.City,
                ShippingCountry  = ToAddress.Country,
                ShippingZip      = ToAddress.Zip,
                ShippingZipAddon = ToAddress.ZipAddon,
                ShippingPhone    = ToAddress.Phone,
                ShippingState    = StringHelper.GetFirstNotEmpty(ToAddress.USAState, ToAddress.NonUSAState),

                ShippingPaid  = 0,
                ShippingPrice = 0,
                TotalPaid     = Items.Sum(i => i.ItemPrice),
                TotalPrice    = Items.Sum(i => i.ItemPrice),

                Quantity = Items.Sum(i => i.Quantity),

                InitialServiceType    = ShippingService,
                ShippingService       = ShippingService,
                SourceShippingService = ShippingService,

                Items = orderItems,
            };

            var userOrderApi = new UserOrderApi(new List <DTOOrder>()
            {
                dtoOrder
            });

            var serviceFactory       = new ServiceFactory();
            var addressCheckServices = serviceFactory.GetAddressCheckServices(log,
                                                                              time,
                                                                              dbFactory,
                                                                              company.AddressProviderInfoList);
            var companyAddress = new CompanyAddressService(company);
            var addressService = new AddressService(addressCheckServices, companyAddress.GetReturnAddress(MarketIdentifier.Empty()), companyAddress.GetPickupAddress(MarketIdentifier.Empty()));

            var rateProviders = serviceFactory.GetShipmentProviders(log,
                                                                    time,
                                                                    dbFactory,
                                                                    weightService,
                                                                    company.ShipmentProviderInfoList,
                                                                    null,
                                                                    null,
                                                                    null,
                                                                    null);

            var stampsRateProvider = rateProviders.FirstOrDefault(r => r.Type == ShipmentProviderType.Stamps);

            var validatorService = new OrderValidatorService(log, dbFactory, emailService, settingService, orderHistory, actionService,
                                                             priceService, htmlScraper, addressService, companyAddress.GetReturnAddress(MarketIdentifier.Empty()), stampsRateProvider, time, company);
            var orderHistoryService = new OrderHistoryService(log, time, dbFactory);
            var cacheService        = new CacheService(log, time, actionService, quantityManager);

            using (var db = dbFactory.GetRWDb())
            {
                try
                {
                    var orderSyncFactory = new OrderSyncFactory();
                    var synchronizer     = orderSyncFactory.GetForMarket(userOrderApi,
                                                                         log,
                                                                         company,
                                                                         settingService,
                                                                         syncInfo,
                                                                         rateProviders,
                                                                         quantityManager,
                                                                         emailService,
                                                                         validatorService,
                                                                         orderHistoryService,
                                                                         cacheService,
                                                                         actionService,
                                                                         companyAddress,
                                                                         time,
                                                                         weightService,
                                                                         null);

                    if (!String.IsNullOrEmpty(OrderNumber))
                    {
                        synchronizer.ProcessSpecifiedOrder(db, OrderNumber);
                        Messages.Add(MessageString.Success("The order has been successfully created, order #: " + OrderNumber));
                    }
                }
                catch (Exception ex)
                {
                    Messages.Add(MessageString.Error(ex.Message));
                }
            }
        }
 public MessagesResult Error(string message)
 {
     Messages.Add(MessageString.Error(message));
     return(this);
 }
Beispiel #13
0
        public static IList <MessageString> CancelCurrentOrderLabels(
            ILogService log,
            IUnitOfWork db,
            ILabelService labelService,
            ITime time,
            long orderId,
            bool sampleMode)
        {
            var cancelTrackings = GetOrdersToCancel(db, orderId);

            var results = new List <MessageString>();

            foreach (var tracking in cancelTrackings)
            {
                MailLabelInfo     mailInfo     = null;
                OrderShippingInfo shippingInfo = null;
                if (tracking.LabelFromType == (int)LabelFromType.Mail)
                {
                    mailInfo = db.MailLabelInfos.Get(tracking.Id);
                    if (mailInfo != null)
                    {
                        mailInfo.CancelLabelRequested = true;
                    }
                }
                else
                {
                    shippingInfo = db.OrderShippingInfos.Get(tracking.Id);
                    if (shippingInfo != null)
                    {
                        shippingInfo.CancelLabelRequested = true;
                    }
                }

                try
                {
                    string shipmentIdentifier = tracking.StampsTxId;
                    if (tracking.ShipmentProviderType == (int)ShipmentProviderType.Stamps ||
                        tracking.ShipmentProviderType == (int)ShipmentProviderType.StampsPriority)
                    {
                        shipmentIdentifier = tracking.TrackingNumber;
                    }

                    var result = labelService.CancelLabel((ShipmentProviderType)tracking.ShipmentProviderType,
                                                          shipmentIdentifier,
                                                          sampleMode);

                    if (result.IsSuccess)
                    {
                        results.Add(MessageString.Success(tracking.TrackingNumber + " (cancelled)" + ", OrderId=" + orderId));
                        if (tracking.LabelFromType == (int)LabelFromType.Mail)
                        {
                            if (mailInfo != null)
                            {
                                mailInfo.LabelCanceled     = true;
                                mailInfo.LabelCanceledDate = time.GetAppNowTime();
                            }
                        }
                        else
                        {
                            if (shippingInfo != null)
                            {
                                shippingInfo.LabelCanceled     = true;
                                shippingInfo.LabelCanceledDate = time.GetAppNowTime();
                            }
                        }
                    }
                    else
                    {
                        results.Add(MessageString.Error(tracking.TrackingNumber + " (cancellation was failed with error: " + result.Message + ")"));
                    }
                }
                catch (Exception ex)
                {
                    results.Add(MessageString.Error(tracking.TrackingNumber + " (cancellation was failed with error: " + ExceptionHelper.GetMostDeeperException(ex) + ")"));
                }
            }
            db.Commit();

            if (!cancelTrackings.Any())
            {
                results.Add(MessageString.Success("No tracking numbers to cancel"));
            }

            return(results);
        }
Beispiel #14
0
        public ParentItemDTO CreateFromParentASIN(IUnitOfWork db,
                                                  string asin,
                                                  int market,
                                                  string marketplaceId,
                                                  bool includeAllChild,
                                                  bool includeZeroQtyChild,
                                                  int?minQty,
                                                  out IList <MessageString> messages)
        {
            messages = new List <MessageString>();

            var parentItem = db.ParentItems.GetAllAsDto().FirstOrDefault(s => s.ASIN == asin &&
                                                                         s.Market == market &&
                                                                         s.MarketplaceId == marketplaceId);

            if (parentItem == null)
            {
                messages.Add(MessageString.Error("Parent ASIN was not found"));
                return(null);
            }

            minQty = minQty ?? 0;
            var itemsQuery = from i in db.Items.GetAllViewAsDto()
                             join sic in db.StyleItemCaches.GetAll() on i.StyleItemId equals sic.Id
                             where i.ParentASIN == parentItem.ASIN &&
                             sic.RemainingQuantity > minQty &&    //Exclude items w/o qty
                             i.Market == parentItem.Market &&
                             i.MarketplaceId == parentItem.MarketplaceId
                             select i;

            if (!includeAllChild)
            {
                itemsQuery = itemsQuery.Where(i => !i.IsFBA && //Exclude FBA
                                              !i.SKU.Contains("-FBP") &&       //Exclude FBP
                                              !i.StyleString.Contains("-tmp")          //Remove items linked to tmp styles
                                              );
            }

            var items = itemsQuery.ToList();

            var model = new ParentItemDTO();

            var firstStyleString = items.Any() ? items.First().StyleString : "";

            model.ASIN = firstStyleString;

            model.Market        = (int)market;
            model.MarketplaceId = marketplaceId;

            model.AmazonName = parentItem.AmazonName;

            foreach (var item in items)
            {
                item.Size         = SizeHelper.SizeCorrection(item.Size, item.StyleSize);
                item.RealQuantity = 0;
            }

            model.Variations = items
                               .OrderBy(i => i.StyleId)
                               .ThenBy(i => SizeHelper.GetSizeIndex(i.StyleSize))
                               .ToList();

            return(model);
        }
Beispiel #15
0
        public bool Merge(ILogService log,
                          IUnitOfWork db,
                          ICacheService cacheService,
                          DateTime?when,
                          long?by,
                          out IList <MessageString> messages)
        {
            messages = new List <MessageString>();

            if (String.IsNullOrEmpty(InputMainStyleId))
            {
                messages.Add(MessageString.Error("MainStyleId", "Empty main styleId"));
                return(false);
            }

            if (String.IsNullOrEmpty(InputSecondStyleId))
            {
                messages.Add(MessageString.Error("SecondStyleId", "Empty second styleId"));
                return(false);
            }

            var results   = new List <MessageString>();
            var styleTo   = db.Styles.GetAll().FirstOrDefault(s => s.StyleID == InputMainStyleId && !s.Deleted);
            var styleFrom = db.Styles.GetAll().FirstOrDefault(s => s.StyleID == InputSecondStyleId && !s.Deleted);

            if (styleTo == null)
            {
                messages.Add(MessageString.Error("MainStyleId", "Not found main style"));
                return(false);
            }

            if (styleFrom == null)
            {
                messages.Add(MessageString.Error("MainStyleId", "Not found second style"));
                return(false);
            }

            //Move/update styleItems
            var styleItemToList   = db.StyleItems.GetAll().Where(si => si.StyleId == styleTo.Id).ToList();
            var styleItemFromList = db.StyleItems.GetAll().Where(si => si.StyleId == styleFrom.Id).ToList();

            foreach (var toMoveItem in styleItemFromList)
            {
                var toMoveListings         = db.Items.GetAll().Where(i => i.StyleItemId == toMoveItem.Id).ToList();
                var toMoveOrderItems       = db.OrderItems.GetAll().Where(b => b.StyleItemId == toMoveItem.Id || b.SourceStyleItemId == toMoveItem.Id).ToList();
                var toMoveSourceOrderItems = db.OrderItemSources.GetAll().Where(b => b.StyleItemId == toMoveItem.Id).ToList();

                var existStyleItem = styleItemToList.FirstOrDefault(si => si.SizeId == toMoveItem.SizeId);
                if (existStyleItem == null)
                {
                    toMoveItem.StyleId = styleTo.Id;

                    foreach (var toMoveListing in toMoveListings)
                    {
                        toMoveListing.StyleId = styleTo.Id;
                    }

                    toMoveOrderItems.ForEach(i =>
                    {
                        if (i.StyleId == styleFrom.Id)
                        {
                            i.StyleId     = styleTo.Id;
                            i.StyleString = styleTo.StyleID;
                        }
                        log.Info("Moved orderItem=" + i.Id);
                    });
                    toMoveSourceOrderItems.ForEach(i =>
                    {
                        i.StyleId     = styleTo.Id;
                        i.StyleString = styleTo.StyleID;
                        log.Info("Moved source orderItem=" + i.Id);
                    });

                    log.Info("Moved whole styleItem=" + toMoveItem.Size);
                }
                else
                {
                    if (!existStyleItem.Weight.HasValue)
                    {
                        existStyleItem.Weight = toMoveItem.Weight;
                    }
                    if (!existStyleItem.MinPrice.HasValue)
                    {
                        existStyleItem.MinPrice = toMoveItem.MinPrice;
                    }
                    if (!existStyleItem.MaxPrice.HasValue)
                    {
                        existStyleItem.MaxPrice = toMoveItem.MaxPrice;
                    }

                    var toMoveBarcodes = db.StyleItemBarcodes.GetAll().Where(b => b.StyleItemId == toMoveItem.Id).ToList();
                    foreach (var toMoveBarcode in toMoveBarcodes)
                    {
                        toMoveBarcode.StyleItemId = existStyleItem.Id;
                        log.Info("Moved barcode=" + toMoveBarcode.Barcode);
                    }

                    var toMoveSpecialCases = db.QuantityChanges.GetAll().Where(b => b.StyleItemId == toMoveItem.Id).ToList();
                    foreach (var toMoveSpecialCase in toMoveSpecialCases)
                    {
                        toMoveSpecialCase.StyleItemId = existStyleItem.Id;
                        toMoveSpecialCase.StyleId     = existStyleItem.StyleId;
                        log.Info("Moved special case, id=" + toMoveSpecialCase.Id + ", quantity=" + toMoveSpecialCase.Quantity);
                    }

                    //Move/update listings
                    foreach (var toMoveListing in toMoveListings)
                    {
                        toMoveListing.StyleId     = existStyleItem.StyleId;
                        toMoveListing.StyleItemId = existStyleItem.Id;
                        log.Info("Moved listing, id=" + toMoveListing.Id);
                    }

                    toMoveOrderItems.ForEach(i =>
                    {
                        if (i.StyleId == styleFrom.Id)
                        {
                            i.StyleId     = styleTo.Id;
                            i.StyleString = styleTo.StyleID;
                        }
                        if (i.StyleItemId == toMoveItem.Id)
                        {
                            i.StyleItemId = existStyleItem.Id;
                        }
                        if (i.SourceStyleItemId == toMoveItem.Id)
                        {
                            i.SourceStyleItemId = existStyleItem.Id;
                        }
                        log.Info("Moved orderItem=" + i.Id);
                    });
                    toMoveSourceOrderItems.ForEach(i =>
                    {
                        i.StyleId     = styleTo.Id;
                        i.StyleString = styleTo.StyleID;
                        i.StyleItemId = existStyleItem.Id;
                        log.Info("Moved source orderItem=" + i.Id);
                    });

                    //Move/update box items
                    var toMoveOpenBoxItems = db.OpenBoxItems
                                             .GetAll()
                                             .Where(b => b.StyleItemId == toMoveItem.Id)
                                             .ToList();

                    var toMoveSealedBoxItems = db.SealedBoxItems
                                               .GetAll()
                                               .Where(b => b.StyleItemId == toMoveItem.Id)
                                               .ToList();

                    foreach (var openBoxItem in toMoveOpenBoxItems)
                    {
                        openBoxItem.StyleItemId = existStyleItem.Id;
                    }

                    foreach (var sealedBoxItem in toMoveSealedBoxItems)
                    {
                        sealedBoxItem.StyleItemId = existStyleItem.Id;
                    }
                }
            }
            db.Commit();

            //Move locations
            var style1Locations = db.StyleLocations.GetAll().Where(l => l.StyleId == styleTo.Id).ToList();
            var style2Locations = db.StyleLocations.GetAll().Where(l => l.StyleId == styleFrom.Id).ToList();

            var existDefaultLocation = style1Locations.Any(l => l.IsDefault);

            foreach (var toMoveLocation in style2Locations)
            {
                var existLocation = style1Locations.FirstOrDefault(l => l.Isle == toMoveLocation.Isle &&
                                                                   l.Section == toMoveLocation.Section &&
                                                                   l.Shelf == toMoveLocation.Shelf);
                if (existLocation == null)
                {
                    toMoveLocation.StyleId = styleTo.Id;
                    if (existDefaultLocation)
                    {
                        toMoveLocation.IsDefault = false;
                    }

                    log.Info(String.Format("Moved location, isle={0}, section={1}, shelf={2}, isDefault={3}",
                                           toMoveLocation.Isle,
                                           toMoveLocation.Section,
                                           toMoveLocation.Shelf,
                                           toMoveLocation.IsDefault));
                }
            }
            db.Commit();


            //Move/update features
            var style1Features = db.StyleFeatureValues.GetAll().Where(f => f.StyleId == styleTo.Id).ToList();
            var style2Features = db.StyleFeatureValues.GetAll().Where(f => f.StyleId == styleFrom.Id).ToList();

            foreach (var toMoveFeature in style2Features)
            {
                var existFeature = style1Features.FirstOrDefault(f => f.FeatureId == toMoveFeature.FeatureId);
                if (existFeature == null)
                {
                    toMoveFeature.StyleId = styleTo.Id;
                }
            }
            db.Commit();


            //Boxes
            var style2SealedBoxes = db.SealedBoxes.GetAll().Where(b => b.StyleId == styleFrom.Id).ToList();

            foreach (var toMoveSealedBox in style2SealedBoxes)
            {
                toMoveSealedBox.StyleId = styleTo.Id;
                log.Info("Moved sealed box=" + toMoveSealedBox.Id);
            }

            var style2OpenBoxes = db.OpenBoxes.GetAll().Where(b => b.StyleId == styleFrom.Id).ToList();

            foreach (var toMoveOpenBox in style2OpenBoxes)
            {
                toMoveOpenBox.StyleId = styleTo.Id;
                log.Info("Moved open box=" + toMoveOpenBox.Id);
            }
            db.Commit();


            //Update caches
            cacheService.RequestStyleIdUpdates(db,
                                               new List <long>()
            {
                styleTo.Id,
                styleFrom.Id
            },
                                               UpdateCacheMode.IncludeChild,
                                               by);

            //Delete style
            styleFrom.Deleted    = true;
            styleFrom.UpdateDate = when;
            styleFrom.UpdatedBy  = by;
            db.Commit();

            return(true);
        }
Beispiel #16
0
        public virtual ActionResult Generate(ReturnOrderViewModel model)
        {
            LogI("Index, model=" + model);

            if (ModelState.IsValid)
            {
                model.OrderID = model.OrderID.RemoveWhitespaces();

                var shipmentProviders = ServiceFactory.GetShipmentProviders(LogService,
                                                                            Time,
                                                                            DbFactory,
                                                                            WeightService,
                                                                            AccessManager.ShipmentProviderInfoList,
                                                                            AppSettings.DefaultCustomType,
                                                                            AppSettings.LabelDirectory,
                                                                            AppSettings.ReserveDirectory,
                                                                            AppSettings.TemplateDirectory);

                var labelService   = new LabelService(shipmentProviders, LogService, Time, DbFactory, EmailService, PdfMaker, AddressService);
                var quntityManager = new QuantityManager(LogService, Time);
                var actionService  = new SystemActionService(LogService, Time);

                if (model.ReasonCode == (int)MailLabelReasonCodes.ReturnLabelReasonCode)
                {
                    var returnResults = model.ReturnAction(Db,
                                                           quntityManager,
                                                           actionService,
                                                           LogService,
                                                           Time,
                                                           Time.GetAppNowTime(),
                                                           AccessManager.UserId);

                    model.Messages.AddRange(returnResults);
                }

                if (model.ReasonCode == (int)MailLabelReasonCodes.ExchangeCode)
                {
                    var exchangeResults = model.ExchangeAction(Db,
                                                               LogService,
                                                               Time,
                                                               quntityManager,
                                                               labelService,
                                                               WeightService,
                                                               ShippingService,
                                                               AccessManager.Company,
                                                               Time.GetAppNowTime(),
                                                               AccessManager.UserId);

                    model.Messages.AddRange(exchangeResults);
                }

                if (model.ReasonCode == (int)MailLabelReasonCodes.RefundCode)
                {
                    var refundResults = model.RefundAction(Db,
                                                           quntityManager,
                                                           actionService,
                                                           LogService,
                                                           Time,
                                                           Time.GetAppNowTime(),
                                                           AccessManager.UserId);

                    model.Messages.AddRange(refundResults);
                }

                var affectedStyleIdList = model.Items.Where(i => i.ExchangeStyleId.HasValue).Select(i => (long)i.ExchangeStyleId.Value).Distinct().ToList();
                affectedStyleIdList.AddRange(model.Items.Where(i => i.StyleId.HasValue).Select(i => i.StyleId.Value).Distinct().ToList());
                Cache.RequestStyleIdUpdates(Db,
                                            affectedStyleIdList,
                                            UpdateCacheMode.IncludeChild,
                                            AccessManager.UserId);
            }
            else
            {
                model.Messages.AddRange(ModelState.GetErrors().Select(m => MessageString.Error(m)));
            }

            LogI("Index, Generate results=");
            model.Messages.ForEach(m => LogI(m.Status + ": " + m.Message));

            return(new JsonResult {
                Data = model, JsonRequestBehavior = JsonRequestBehavior.AllowGet
            });
        }
Beispiel #17
0
        public IList <MessageString> Generate(ILogService log,
                                              ITime time,
                                              ILabelService labelService,
                                              IQuantityManager quantityManager,
                                              IUnitOfWork db,
                                              IWeightService weightService,
                                              IShippingService shippingService,
                                              bool sampleMode,
                                              DateTime when,
                                              long?by)
        {
            var results = new List <MessageString>();

            //Cancel privious
            if (CancelCurrentOrderLabel)
            {
                var cancelResults = CancelCurrentOrderLabels(log,
                                                             db,
                                                             labelService,
                                                             time,
                                                             OrderEntityId.Value,
                                                             sampleMode);

                results.AddRange(cancelResults);
            }

            //Print new
            var printResult = GenerateLabel(db,
                                            labelService,
                                            weightService,
                                            shippingService,
                                            this,
                                            time.GetAppNowTime(),
                                            by);

            if (printResult.Success)
            {
                //Remove from batch if unshipped
                var wasRemoved = RemoveFromBatchIfUnshipped(log,
                                                            db,
                                                            OrderEntityId.Value);
                if (wasRemoved)
                {
                    results.Add(MessageString.Success("Order was removed from batch"));
                }
            }

            //Processing print result
            Messages.AddRange(printResult.Messages.Select(m => MessageString.Error(m.Text)).ToList());
            IsPrinted             = printResult.Success;
            PrintedLabelPath      = printResult.Url;
            PrintedLabelUrl       = UrlHelper.GetPrintLabelPathById(printResult.PrintPackId);
            PrintedTrackingNumber = printResult.TrackingNumber;

            if (ReduceInventory)
            {
                AddQuantityOperation(log,
                                     db,
                                     quantityManager,
                                     OrderID,
                                     Items.Select(i => i.GetItemDto()).ToList(),
                                     time,
                                     by);

                results.Add(MessageString.Success("Inventory quantity was adjusted"));
            }

            //Add to track table
            if (ReasonCode == (int)MailLabelReasonCodes.ReturnLabelReasonCode)
            {
                AddToOrderTracking(log,
                                   db,
                                   OrderID,
                                   printResult.TrackingNumber,
                                   printResult.Carrier,
                                   when,
                                   by);

                results.Add(MessageString.Success("Tracking number was added to Track Orders list"));
            }

            if (OrderEntityId.HasValue &&
                !String.IsNullOrEmpty(OrderComment))
            {
                db.OrderComments.Add(new OrderComment()
                {
                    OrderId    = OrderEntityId.Value,
                    Message    = OrderComment, // "[System] Returned",
                    Type       = (int)CommentType.ReturnExchange,
                    CreateDate = when,
                    CreatedBy  = by
                });
                db.Commit();

                results.Add(MessageString.Success("Comment was added"));
            }

            if (printResult.Success && !string.IsNullOrEmpty(printResult.Url))
            {
                log.Info(string.Format("LabelPath for {0} order: {1}",
                                       string.IsNullOrEmpty(OrderID) ? "Ebay" : OrderID, printResult.Url));
            }


            if (printResult.Success && UpdateAmazon)
            {
                results.Add(MessageString.Success("Send the order update to the market was scheduled"));
            }

            return(results);
        }