public bool FillOrderItemsByListingId(IList <ListingOrderDTO> orderItems, MarketType market, string marketplaceId) { if (!ArgumentHelper.CheckMarket(market)) { throw new ArgumentNullException("market"); } if (!ArgumentHelper.CheckMarketplaceId(market, marketplaceId)) { throw new ArgumentNullException("marketplaceId"); } var result = true; foreach (var dto in orderItems) { var listingList = (from vi in unitOfWork.GetSet <ViewListing>() join i in unitOfWork.GetSet <Item>() on vi.ItemId equals i.Id where (vi.ListingId == dto.ListingId || vi.ASIN == dto.ListingId || i.Barcode == dto.ListingId) && vi.Market == (int)market && (String.IsNullOrEmpty(marketplaceId) || vi.MarketplaceId == marketplaceId) orderby vi.CreateDate select vi) .ToList(); //TODO: Not sure is it safely to take by ASIN (m.b. better to wait while appear the listing) //?? unitOfWork.GetSet<ViewListing>().FirstOrDefault(v => v.ASIN == dto.ASIN); ViewListing listing = null; if (listingList.Count > 0) { listing = listingList.OrderByDescending(l => l.StyleItemId.HasValue ? 1 : 0) .ThenByDescending(l => l.CreateDate) .FirstOrDefault(l => l.Quantity > 0); if (listing == null) { listing = listingList.OrderByDescending(l => l.StyleItemId.HasValue ? 1 : 0) .ThenByDescending(l => l.CreateDate).FirstOrDefault(); } } if (listing == null && !String.IsNullOrEmpty(dto.SKU)) { listing = (from vi in unitOfWork.GetSet <ViewListing>() where vi.SKU == dto.SKU && vi.Market == (int)market && (String.IsNullOrEmpty(marketplaceId) || vi.MarketplaceId == marketplaceId) select vi).FirstOrDefault(); } if (listing == null && !String.IsNullOrEmpty(dto.ListingId)) { listing = (from vi in unitOfWork.GetSet <ViewListing>() where vi.ListingId == dto.ListingId && vi.Market == (int)market && (String.IsNullOrEmpty(marketplaceId) || vi.MarketplaceId == marketplaceId) select vi).FirstOrDefault(); } if (listing != null && listing.StyleItemId.HasValue) //NOTE: only if listing has linked styleItemId, otherwise we skipped that listing!!! No needed listing w/o style item { dto.Id = listing.Id; dto.SKU = listing.SKU; dto.ASIN = listing.ASIN; dto.ListingId = listing.ListingId; dto.DropShipperId = listing.DropShipperId; dto.Weight = listing.Weight; dto.ShippingSize = listing.ShippingSize; dto.PackageLength = listing.PackageLength; dto.PackageWidth = listing.PackageWidth; dto.PackageHeight = listing.PackageHeight; dto.InternationalPackage = listing.InternationalPackage; dto.ItemStyle = listing.ItemStyle; dto.RestockDate = listing.RestockDate; dto.Size = listing.Size; dto.ParentASIN = listing.ParentASIN; dto.Picture = listing.Picture; dto.StyleItemId = listing.StyleItemId; dto.StyleId = listing.StyleId; dto.StyleID = listing.StyleString; dto.StyleSize = listing.StyleSize; dto.StyleColor = listing.StyleColor; dto.RealQuantity = listing.Quantity; } else { result = false; } } return(result); }
public bool FillOrderItemsBySourceMarketId(IList <ListingOrderDTO> orderItems, MarketType market, string marketplaceId) { if (!ArgumentHelper.CheckMarket(market)) { throw new ArgumentNullException("market"); } if (!ArgumentHelper.CheckMarketplaceId(market, marketplaceId)) { throw new ArgumentNullException("marketplaceId"); } var result = true; foreach (var dto in orderItems) { var listingList = (from vi in unitOfWork.GetSet <ViewListing>() join pi in unitOfWork.GetSet <ParentItem>() on new { vi.ParentASIN, vi.Market, vi.MarketplaceId } equals new { ParentASIN = pi.ASIN, pi.Market, pi.MarketplaceId } where (pi.SourceMarketId == dto.ParentSourceMarketId || vi.IsRemoved == true) && //NOTE: Parent Ids should be same or listing marked as removed (in that case skip checking parent Ids, it had value from new listing) vi.SourceMarketId == dto.SourceMarketId && vi.Market == (int)market && (String.IsNullOrEmpty(marketplaceId) || vi.MarketplaceId == marketplaceId) orderby vi.CreateDate descending select vi).ToList(); //TODO: I'm not sure is safely to take by ASIN (m.b. better to wait while appear the listing) //?? unitOfWork.GetSet<ViewListing>().FirstOrDefault(v => v.ASIN == dto.ASIN); ViewListing listing = null; if (listingList.Count > 0) { listing = listingList.FirstOrDefault(l => l.Quantity > 0); if (listing == null) { listing = listingList.LastOrDefault(); } } if (listing == null && !String.IsNullOrEmpty(dto.SKU)) { var candidateQuery = from vi in unitOfWork.GetSet <ViewListing>() where vi.SKU == dto.SKU && vi.Market == (int)market && (String.IsNullOrEmpty(marketplaceId) || vi.MarketplaceId == marketplaceId) select vi; var listingCandidates = candidateQuery.Count(); if (listingCandidates > 1) { var withNotRemovedCandidateQuery = candidateQuery.Where(c => !c.IsRemoved); listingCandidates = withNotRemovedCandidateQuery.Count(); if (listingCandidates == 0) //All removed we get any of them { listingCandidates = 1; } else { candidateQuery = withNotRemovedCandidateQuery; } } if (listingCandidates == 1) { listing = candidateQuery.FirstOrDefault(); } } if (listing != null && listing.StyleItemId.HasValue) //NOTE: only if listing has linked styleItemId, otherwise we skipped that listing!!! No needed listing w/o style item { dto.Id = listing.Id; dto.SKU = listing.SKU; dto.ASIN = listing.ASIN; dto.ListingId = listing.ListingId; dto.DropShipperId = listing.DropShipperId; dto.Weight = listing.Weight; dto.ShippingSize = listing.ShippingSize; dto.PackageLength = listing.PackageLength; dto.PackageWidth = listing.PackageWidth; dto.PackageHeight = listing.PackageHeight; dto.InternationalPackage = listing.InternationalPackage; dto.ItemStyle = listing.ItemStyle; dto.RestockDate = listing.RestockDate; dto.FulfillDate = listing.FulfillDate; dto.PreOrderExpReceiptDate = listing.PreOrderExpReceiptDate; dto.Size = listing.Size; dto.Color = listing.Color; dto.ParentASIN = listing.ParentASIN; dto.Picture = listing.Picture; dto.StyleItemId = listing.StyleItemId; dto.StyleId = listing.StyleId; dto.StyleID = listing.StyleString; dto.StyleSize = listing.StyleSize; dto.StyleColor = listing.StyleColor; dto.RealQuantity = listing.Quantity; } else { result = false; } } return(result); }