daily pastebin goal
41%
SHARE
TWEET

Untitled

a guest Jan 29th, 2018 66 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. [RegisterToDi]
  2.     public class CheckInvoiceRowsQuery
  3.     {
  4.         private readonly GetOrdersWithPortionQuery _getOrdersWithPortionQuery;
  5.  
  6.         public CheckInvoiceRowsQuery(GetOrdersWithPortionQuery getOrdersWithPortionQuery)
  7.         {
  8.             _getOrdersWithPortionQuery = getOrdersWithPortionQuery;
  9.         }
  10.  
  11.         public InvoiceParsingResult Execute(InvoiceParsingResult parsingResult, int supplierId)
  12.         {
  13.             var orders = _getOrdersWithPortionQuery.Query(supplierId,
  14.                 new[] {OrderState.RequestedFromSupplier, OrderState.ApprovedBySupplier});
  15.  
  16.             var groupingRows = parsingResult.Rows
  17.                 .GroupBy(r => new {r.Article, r.Price})
  18.                 .ToDictionary(g => g.Key, g => g.ToList());
  19.  
  20.             foreach (var row in groupingRows)
  21.             {
  22.                 var ordersCheckedByArticle = orders.Where(o =>
  23.                     string.Equals(
  24.                         o.DetailArticle,
  25.                         row.Key.Article.CleanDigitsAndChars(),
  26.                         StringComparison.InvariantCultureIgnoreCase))
  27.                     .ToList();
  28.  
  29.                 if (!ordersCheckedByArticle.Any())
  30.                 {
  31.                     row.Value.ForEach(r =>
  32.                     {
  33.                         r.Comment = "Эту позицию не заказывали";
  34.                         r.Success = false;
  35.                     });
  36.                     continue;
  37.                 }
  38.  
  39.                 var ordersCheckedByPrice = ordersCheckedByArticle
  40.                     .Where(o => o.Price == row.Key.Price)
  41.                     .ToList();
  42.                 if (!ordersCheckedByPrice.Any())
  43.                 {
  44.                     row.Value.ForEach(r =>
  45.                     {
  46.                         r.Comment = "Цена выше чем в заказе";
  47.                         r.Success = false;
  48.                     });
  49.                     continue;
  50.                 }
  51.  
  52.                 var matchedOrders = new List<Order>();
  53.                 var matchedRows = new List<InvoiceRow>();
  54.                 foreach (var order in ordersCheckedByPrice)
  55.                 {
  56.                     var qq = row.Value.SingleOrDefault(r => r.Qty == order.QuantityAnswer);
  57.                     if (qq == default(InvoiceRow)) continue;
  58.  
  59.                     qq.Success = true;
  60.                     matchedOrders.Add(order);
  61.                     matchedRows.Add(qq);
  62.                 }
  63.  
  64.                 var remainRows = row.Value.Except(matchedRows).ToList();
  65.                 var remainOrders = ordersCheckedByPrice.Except(matchedOrders).ToList();
  66.  
  67.                 var remainRowsQty = remainRows.Sum(r => r.Qty);
  68.                 var remainOrdersQty = remainOrders.Sum(r => r.QuantityAnswer);
  69.  
  70.                 if (remainOrdersQty >= remainRowsQty)
  71.                 {
  72.                     foreach (var invoiceRow in remainRows)
  73.                     {
  74.                         invoiceRow.Success = true;
  75.                     }
  76.                     continue;
  77.                 }
  78.  
  79.                 var overage = remainRowsQty - remainOrdersQty;
  80.  
  81.                 foreach (var rr in remainRows.OrderBy(r => r.Qty))
  82.                 {
  83.                     rr.Success = false;
  84.                     rr.Comment = "Превышение количества заказанного";
  85.                     overage = overage - rr.Qty;
  86.                     if (overage <= 0) break;
  87.                 }
  88.             }
  89.             return parsingResult;
  90.         }
  91.     }
RAW Paste Data
Pastebin PRO WINTER Special!
Get 40% OFF Pastebin PRO accounts!
Top