Beispiel #1
0
        public void CreateGrouponListings(string filename)
        {
            var    skuPriceInfo        = LoadItems(filename);
            var    targetMarket        = MarketType.Groupon;
            string targetMarketplaceId = null;

            using (var db = _dbFactory.GetRWDb())
            {
                var styleIds     = skuPriceInfo.Select(i => i.SKU).ToList();
                var dtoStyleList = db.Styles.GetAllAsDto().Where(st => styleIds.Contains(st.StyleID) && !st.Deleted).ToList();

                var existMarketItems = db.Items.GetAll().Where(i => i.Market == (int)targetMarket &&
                                                               (i.MarketplaceId == targetMarketplaceId || String.IsNullOrEmpty(targetMarketplaceId)))
                                       .ToList();

                IList <MessageString> messages;
                foreach (var style in dtoStyleList)
                {
                    if (existMarketItems.Any(i => i.StyleId == style.Id))
                    {
                        continue;
                    }

                    var priceInfo = skuPriceInfo.FirstOrDefault(s => s.SKU == style.StyleID);

                    var model = _autoCreateListingService.CreateFromStyle(db,
                                                                          style.Id,
                                                                          targetMarket,
                                                                          targetMarketplaceId,
                                                                          out messages);

                    model.Market        = (int)MarketType.Groupon;
                    model.MarketplaceId = "";

                    if (model.Variations.Select(i => i.StyleId).Distinct().Count() != 1)
                    {
                        _log.Info("Parent ASIN is multilisting");
                        continue;
                    }

                    model.Variations.ForEach(v => { if (String.IsNullOrEmpty(v.Barcode))
                                                    {
                                                        v.AutoGeneratedBarcode = true;
                                                    }
                                             });
                    model.Variations.ForEach(v => v.CurrentPrice = (priceInfo?.CurrentPrice > 0 ? (priceInfo?.CurrentPrice ?? 99) : 99));

                    _autoCreateListingService.PrepareData(model);
                    _autoCreateListingService.Save(model, null, db, _time.GetAppNowTime(), null);
                }
            }
        }
Beispiel #2
0
        private void CreateListing(IDbFactory dbFactory,
                                   ILogService log,
                                   IAutoCreateListingService listingCreateService,
                                   string marketplaceId,
                                   string sku,
                                   string barcode,
                                   decimal price,
                                   decimal?shippingPrice,
                                   DateTime when)
        {
            var market = MarketType.Groupon;

            using (var db = dbFactory.GetRWDb())
            {
                var dbStyle = db.Styles.GetAll().FirstOrDefault(st => st.StyleID == sku && !st.Deleted);

                if (dbStyle == null)
                {
                    var dbStyleCandidates = (from st in db.Styles.GetAll()
                                             join si in db.StyleItems.GetAll() on st.Id equals si.StyleId
                                             join sib in db.StyleItemBarcodes.GetAll() on si.Id equals sib.StyleItemId
                                             where sib.Barcode == barcode &&
                                             !st.Deleted
                                             select st).ToList();

                    if (dbStyleCandidates.Count() > 1)
                    {
                        log.Error("Multiple style by barcode: " + barcode + ", sku=" + sku);
                    }
                    if (dbStyleCandidates.Count() == 1)
                    {
                        dbStyle = dbStyleCandidates[0];
                    }
                }

                //Check other marketplaces
                if (dbStyle == null)
                {
                    var dbListing = (from l in db.Listings.GetAll()
                                     join i in db.Items.GetAll() on l.ItemId equals i.Id
                                     where l.SKU == sku &&
                                     !l.IsRemoved &&
                                     i.StyleItemId.HasValue &&
                                     i.StyleId.HasValue
                                     orderby l.Market ascending
                                     select i)
                                    .FirstOrDefault();

                    if (dbListing != null)
                    {
                        dbStyle = db.Styles.Get(dbListing.StyleId.Value);
                    }
                }

                if (dbStyle != null)
                {
                    IList <MessageString> messages = new List <MessageString>();
                    log.Info("Create listing for style: " + dbStyle.StyleID);

                    var model = listingCreateService.CreateFromStyle(db,
                                                                     dbStyle.StyleID,
                                                                     price,
                                                                     MarketType.Groupon,
                                                                     marketplaceId,
                                                                     out messages);

                    model.Variations.ForEach(v => v.CurrentPrice            = price);
                    model.Variations.ForEach(v => v.ShippingPriceFromMarket = shippingPrice);

                    listingCreateService.Save(model,
                                              "",
                                              db,
                                              when,
                                              null);
                }
                else
                {
                    log.Info("Missing SKU=" + sku + ", barcode=" + barcode);
                }
            }
        }
Beispiel #3
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 void CreatePAonMBGListings(string filename)
        {
            //var skuPriceInfo = ExcelReader.LoadPrices(filename, 0, 1);
            var    targetMarket        = MarketType.DropShipper;
            string targetMarketplaceId = MarketplaceKeeper.DsToMBG;

            using (var db = _dbFactory.GetRWDb())
            {
                var styleIds = new List <string>()
                {
                    "GS20053SS",
                    "TS20054SS",
                    "WS20052SS",
                    "GS20056SS",
                    "WS20055SS",
                    "TS20057SS"
                };// skuPriceInfo.Select(i => i.SKU).ToList();

                var skuPriceInfo = (from i in db.Items.GetAll()
                                    join l in db.Listings.GetAll() on i.Id equals l.ItemId
                                    where i.StyleId.HasValue
                                    group new { i, l } by i.StyleId into byStyleId
                                    select new ItemDTO
                {
                    StyleId = byStyleId.Key,
                    CurrentPrice = byStyleId.Max(l => l.l.CurrentPrice)
                }).ToList();

                var dtoStyleList = db.Styles.GetAllAsDto().Where(st => styleIds.Contains(st.StyleID) && !st.Deleted).ToList();

                var existMarketItems = db.Items.GetAll().Where(i => i.Market == (int)targetMarket &&
                                                               (i.MarketplaceId == targetMarketplaceId || String.IsNullOrEmpty(targetMarketplaceId)))
                                       .ToList();

                IList <MessageString> messages;
                foreach (var style in dtoStyleList)
                {
                    if (existMarketItems.Any(i => i.StyleId == style.Id))
                    {
                        continue;
                    }

                    var priceInfo = skuPriceInfo.FirstOrDefault(s => s.StyleId == style.Id);

                    var model = _autoCreateListingService.CreateFromStyle(db,
                                                                          style.Id,
                                                                          targetMarket,
                                                                          targetMarketplaceId,
                                                                          out messages);

                    model.Market        = (int)targetMarket;
                    model.MarketplaceId = targetMarketplaceId;

                    if (model.Variations.Select(i => i.StyleId).Distinct().Count() != 1)
                    {
                        _log.Info("Parent ASIN is multilisting");
                        continue;
                    }

                    model.Variations.ForEach(v => { if (String.IsNullOrEmpty(v.Barcode))
                                                    {
                                                        v.AutoGeneratedBarcode = true;
                                                    }
                                             });
                    model.Variations.ForEach(v => v.CurrentPrice = (priceInfo?.CurrentPrice > 0 ? (priceInfo?.CurrentPrice ?? 99) : 99));

                    _autoCreateListingService.PrepareData(model);
                    _autoCreateListingService.Save(model, null, db, _time.GetAppNowTime(), null);
                }
            }
        }