SHARE
TWEET
Untitled
a guest
Jan 29th, 2018
66
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
- [RegisterToDi]
- public class CheckInvoiceRowsQuery
- {
- private readonly GetOrdersWithPortionQuery _getOrdersWithPortionQuery;
- public CheckInvoiceRowsQuery(GetOrdersWithPortionQuery getOrdersWithPortionQuery)
- {
- _getOrdersWithPortionQuery = getOrdersWithPortionQuery;
- }
- public InvoiceParsingResult Execute(InvoiceParsingResult parsingResult, int supplierId)
- {
- var orders = _getOrdersWithPortionQuery.Query(supplierId,
- new[] {OrderState.RequestedFromSupplier, OrderState.ApprovedBySupplier});
- var groupingRows = parsingResult.Rows
- .GroupBy(r => new {r.Article, r.Price})
- .ToDictionary(g => g.Key, g => g.ToList());
- foreach (var row in groupingRows)
- {
- var ordersCheckedByArticle = orders.Where(o =>
- string.Equals(
- o.DetailArticle,
- row.Key.Article.CleanDigitsAndChars(),
- StringComparison.InvariantCultureIgnoreCase))
- .ToList();
- if (!ordersCheckedByArticle.Any())
- {
- row.Value.ForEach(r =>
- {
- r.Comment = "Эту позицию не заказывали";
- r.Success = false;
- });
- continue;
- }
- var ordersCheckedByPrice = ordersCheckedByArticle
- .Where(o => o.Price == row.Key.Price)
- .ToList();
- if (!ordersCheckedByPrice.Any())
- {
- row.Value.ForEach(r =>
- {
- r.Comment = "Цена выше чем в заказе";
- r.Success = false;
- });
- continue;
- }
- var matchedOrders = new List<Order>();
- var matchedRows = new List<InvoiceRow>();
- foreach (var order in ordersCheckedByPrice)
- {
- var qq = row.Value.SingleOrDefault(r => r.Qty == order.QuantityAnswer);
- if (qq == default(InvoiceRow)) continue;
- qq.Success = true;
- matchedOrders.Add(order);
- matchedRows.Add(qq);
- }
- var remainRows = row.Value.Except(matchedRows).ToList();
- var remainOrders = ordersCheckedByPrice.Except(matchedOrders).ToList();
- var remainRowsQty = remainRows.Sum(r => r.Qty);
- var remainOrdersQty = remainOrders.Sum(r => r.QuantityAnswer);
- if (remainOrdersQty >= remainRowsQty)
- {
- foreach (var invoiceRow in remainRows)
- {
- invoiceRow.Success = true;
- }
- continue;
- }
- var overage = remainRowsQty - remainOrdersQty;
- foreach (var rr in remainRows.OrderBy(r => r.Qty))
- {
- rr.Success = false;
- rr.Comment = "Превышение количества заказанного";
- overage = overage - rr.Qty;
- if (overage <= 0) break;
- }
- }
- return parsingResult;
- }
- }
RAW Paste Data

