using CAPI.Custom.Data; using CAPI.Custom.Domain.Quotes; using CAPI.Custom.Entities; using CAPI.Custom.Repositories; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CAPI.Custom.Services { public class RequestItemsCalculator { private QuoteRepository repository; public RequestItemsCalculator(QuoteRepository service) { this.repository = service; } public IQueryable Execute(int quoteId, string masterNumber) { var emptyResult = Enumerable.Empty().AsQueryable(); try { var requestItems = repository.GetRequestItems(quoteId) .Where(p => masterNumber == p.MasterNumber) .OrderBy(p => p.Sequence) .ToList(); // exit if (requestItems.IsEmpty()) { return emptyResult; } var quoteItems = repository.GetItems(quoteId) .Where(p => masterNumber == p.MasterPartNumber) .ToList(); // exit if (quoteItems.IsEmpty()) { return emptyResult; } if (requestItems.Count == 1) { var requestItem = requestItems.First(); requestItem.QuantitySelected = quoteItems.Sum(p => p.QuantitySelected) .GetValueOrDefault(); // outstanding = required - selected requestItem.QuantityOutstanding = requestItem.QuantityRequired .GetValueOrDefault() - requestItem.QuantitySelected .GetValueOrDefault(); } else { int totalSelected = quoteItems .Sum(p => p.QuantitySelected) .GetValueOrDefault(); requestItems.ForEach(requestItem => { int required = requestItem .QuantityRequired .GetValueOrDefault(); int selected = 0; int outstanding = required - selected; if (outstanding > 0) { if (totalSelected >= outstanding) { selected += outstanding; totalSelected -= outstanding; outstanding = 0; } else if (outstanding > totalSelected) { selected += totalSelected; outstanding -= totalSelected; totalSelected = 0; } } requestItem.QuantitySelected = selected; requestItem.QuantityOutstanding = outstanding; }); // requested limit reached but still more to select // will be added to the first found request item if (totalSelected > 0) { var firstItem = requestItems.FirstOrDefault(); if (!firstItem.IsNull()) { firstItem.QuantitySelected += totalSelected; firstItem.QuantityOutstanding -= totalSelected; } } } } catch (Exception ex) { BusinessUtils.HandleException(ex); } return emptyResult; } } }