public Diff GetDiff(Dictionary<string, PriceItem> newProds, Dictionary<string, PriceItem> oldProds) { oldProds = oldProds ?? new Dictionary<string, PriceItem>(); var diff = new Diff { NewItems = newProds.Where(kvp => !oldProds.ContainsKey(kvp.Key)).ToDictionary(key => key.Key, value => value.Value), DeletedItems = oldProds.Where(kvp => !newProds.ContainsKey(kvp.Key)).ToDictionary(key => key.Key, value => value.Value), UpdatedItems = newProds.Where(kvp => oldProds.ContainsKey(kvp.Key)).ToDictionary(key => key.Key, value => value.Value) }; var toRemove = new List<string>(); foreach (var item in diff.UpdatedItems.Values) { var oldItem = oldProds[item.Reference]; if (item.WholesalePrice == oldItem.WholesalePrice && item.Active == oldItem.Active && !SameBalance(item, oldItem)) { toRemove.Add(item.Reference); } } foreach (var reference in toRemove) { diff.UpdatedItems.Remove(reference); } return diff; }
public PriceUpdateResult Process(Diff diff, PriceType priceType) { try { switch (priceType) { case PriceType.Stock: Log.Info("Price type is stock. New items are excluded from processing"); diff.NewItems.Clear(); break; case PriceType.Full: break; case PriceType.Discount: diff.NewItems.Values.ToList().ForEach(p => { p.OnSale = true; p.DiscountValue = DiscountValue; }); diff.UpdatedItems.Values.ToList().ForEach(p => { p.OnSale = true; p.DiscountValue = DiscountValue; }); break; } IProcessor processor = new PriceWebServiceProcessor(_apiUrl, _apiAccessToken); if (diff.NewItems.Any()) { Log.Debug("Building retail prices for new items"); diff.NewItems.Values.ToList().ForEach(p => p.RetailPrice = _retailPriceBuilder.Build(p)); Log.Debug("Adding items"); processor.Process(diff.NewItems, GeneratedPriceType.NewItems, priceType); } if (diff.UpdatedItems.Any()) { Log.Debug("Building retail prices for updated items"); diff.UpdatedItems.Values.ToList().ForEach(p => p.RetailPrice = _retailPriceBuilder.Build(p)); Log.Debug("Updating items"); processor.Process(diff.UpdatedItems, GeneratedPriceType.SameItems, priceType); } if (diff.DeletedItems.Any()) { Log.Debug("Deleting items"); processor.Process(diff.DeletedItems, GeneratedPriceType.DeletedItems, priceType); } return new PriceUpdateResult(PriceUpdateResultStatus.Ok); } catch (PhotoLoadException) { return new PriceUpdateResult(PriceUpdateResultStatus.PhotoLoadFailed); } catch (ProcessAbortedException) { return new PriceUpdateResult(PriceUpdateResultStatus.ProcessAborted); } catch (Exception ex) { Log.Error("Price processing error", ex); return new PriceUpdateResult(PriceUpdateResultStatus.InternalError); } }