/// <summary> /// Get the test items from Labworks and replace the test items in our order to reflect what was actually done. /// </summary> /// <param name="orderToUpdate"></param> /// <returns></returns> public async Task <OverwriteOrderResult> OverwriteOrderFromDb(Order orderToUpdate) { var rtValue = new OverwriteOrderResult(); if (string.IsNullOrWhiteSpace(orderToUpdate.RequestNum)) { throw new Exception("RequestNum not populated"); //TODO: Something better } OrderUpdateFromDbModel orderFromDb = null; try { orderFromDb = await _labworksService.GetRequestDetails(orderToUpdate.RequestNum); } catch (Exception e) { rtValue.ErrorMessage = e.Message; return(rtValue); } var allTests = orderToUpdate.GetTestDetails(); var testIds = allTests.Where(a => orderFromDb.TestCodes.Contains(a.Id)).Select(s => s.Id).ToArray(); var tests = PopulateSelectedTestsItemModel(testIds, allTests); if (orderFromDb.TestCodes.Count != testIds.Length) { //Oh No!!! tests were returned that we don't know about var foundCodes = allTests.Where(a => testIds.Contains(a.Id)).Select(s => s.Id).Distinct().ToList(); rtValue.MissingCodes = orderFromDb.TestCodes.Except(foundCodes).ToList(); return(rtValue); } var orderDetails = orderToUpdate.GetOrderDetails(); orderDetails.Quantity = orderFromDb.Quantity; orderDetails.LabworksSampleDisposition = orderFromDb.Disposition; //Don't think this is doing anything var calcualtedTests = new List <TestDetails>(); foreach (var test in tests) { CalculateTest(orderDetails, test, calcualtedTests); } rtValue.SelectedTests = calcualtedTests; rtValue.ClientId = orderFromDb.ClientId; rtValue.Quantity = orderFromDb.Quantity; rtValue.RushMultiplier = orderFromDb.RushMultiplier; rtValue.LabworksSampleDisposition = orderFromDb.Disposition; return(rtValue); }
public async Task <OrderUpdateFromDbModel> GetRequestDetails(string RequestNum) { var rtValue = new OrderUpdateFromDbModel(); using (var db = new DbManager(_connectionSettings.AnlabConnection)) { var sql = $"{QueryResource.AnlabTestsRunForOrder};{QueryResource.AnlabSampleDetails};{QueryResource.AnlabRushMultiplierForOrder}"; using (var multi = await db.Connection.QueryMultipleAsync(sql, new { RequestNum })) { IEnumerable <string> codes = await multi.ReadAsync <string>(); var sampleDetails = await multi.ReadAsync <OrderUpdateFromDbModel>(); var rush = await multi.ReadAsync <OrderUpdateFromDbModel>(); //TODO: maybe we should only return tests with a $ amount if (codes.Count() <= 0) { throw new Exception($"No codes found (Request number not found? {RequestNum})"); } rtValue.TestCodes = codes as IList <string>; if (sampleDetails.Count() != 1) { throw new Exception("(Sample Details) Client Id / Quantity not found or too many results."); } rtValue.ClientId = sampleDetails.ElementAtOrDefault(0).ClientId; rtValue.Quantity = sampleDetails.ElementAtOrDefault(0).Quantity; rtValue.Disposition = sampleDetails.ElementAtOrDefault(0).Disposition; if (rush.Count() == 1) { rtValue.RushMultiplier = rush.ElementAtOrDefault(0).RushMultiplier; } } return(rtValue); } }
public async Task <OrderUpdateFromDbModel> GetRequestDetails(string RequestNum) { string clientId = "XYZ"; int quantity = 5; IList <string> codes = new List <string>(5); codes.Add("-SNA-PMF"); codes.Add("-PCL-P-IC"); codes.Add("X-NA"); codes.Add("X-MG"); codes.Add("SP-FOR"); var order = new OrderUpdateFromDbModel { ClientId = clientId, Quantity = quantity, TestCodes = codes }; return(await Task.FromResult(order)); }
/// <summary> /// Get the test items from Labworks and replace the test items in our order to reflect what was actually done. /// </summary> /// <param name="orderToUpdate"></param> /// <returns></returns> public async Task <OverwriteOrderResult> OverwriteOrderFromDb(Order orderToUpdate) { var rtValue = new OverwriteOrderResult(); if (string.IsNullOrWhiteSpace(orderToUpdate.RequestNum)) { throw new Exception("RequestNum not populated"); //TODO: Something better } OrderUpdateFromDbModel orderFromDb = null; try { orderFromDb = await _labworksService.GetRequestDetails(orderToUpdate.RequestNum); } catch (Exception e) { rtValue.ErrorMessage = e.Message; return(rtValue); } var allTests = orderToUpdate.GetTestDetails(); var testIds = allTests.Where(a => orderFromDb.TestCodes.Contains(a.Id)).Select(s => s.Id).ToArray(); if (orderFromDb.TestCodes.Count != testIds.Length) { //Oh No!!! tests were returned that we don't know about var foundCodes = allTests.Where(a => testIds.Contains(a.Id)).Select(s => s.Id).Distinct().ToList(); rtValue.MissingCodes = orderFromDb.TestCodes.Except(foundCodes).ToList(); var currentPrices = await PopulateTestItemModel(true); rtValue.MissingTestsToAdd = currentPrices.Where(a => rtValue.MissingCodes.Contains(a.Id)).ToList(); if (rtValue.MissingTestsToAdd.Count != rtValue.MissingCodes.Count) { return(rtValue); } var testIdsList = testIds.ToList(); foreach (var missingWithPrice in rtValue.MissingTestsToAdd) { allTests.Add(missingWithPrice); testIdsList.Add(missingWithPrice.Id); } testIds = testIdsList.ToArray(); rtValue.MissingCodes = new List <string>(); //Clear it out } var restoreTests = orderToUpdate.GetBackedupTestDetails(); if (restoreTests.Any()) { foreach (var restoreTest in restoreTests) { var test = allTests.FirstOrDefault(a => a.Id == restoreTest.Id); if (test == null) { Log.Information($"Test not found to restore out: {restoreTest}"); continue; } test = restoreTest.ShallowCopy(); //This is doing something even if it doesn't look like it. } } var groupTestIds = testIds.Where(a => a.IsGroupTest()).ToArray(); if (groupTestIds.Any()) { var savedPrices = new List <TestItemModel>(); var testsToZeroOut = await _labworksService.GetTestsForDiscountedGroups(groupTestIds); foreach (var zeroTest in testsToZeroOut) { var test = allTests.FirstOrDefault(a => a.Id == zeroTest); if (test == null) { Log.Information($"Test not found to zero out: {zeroTest}"); continue; } savedPrices.Add(test.ShallowCopy()); test.ExternalCost = 0; test.InternalCost = 0; test.ExternalSetupCost = 0; test.InternalSetupCost = 0; } if (savedPrices.Any()) { rtValue.BackedupTests = savedPrices; } } var tests = PopulateSelectedTestsItemModel(testIds, allTests); var orderDetails = orderToUpdate.GetOrderDetails(); orderDetails.Quantity = orderFromDb.Quantity; orderDetails.LabworksSampleDisposition = orderFromDb.Disposition; //Don't think this is doing anything var calcualtedTests = new List <TestDetails>(); foreach (var test in tests) { CalculateTest(orderDetails, test, calcualtedTests); } rtValue.SelectedTests = calcualtedTests; rtValue.ClientId = orderFromDb.ClientId; rtValue.Quantity = orderFromDb.Quantity; rtValue.RushMultiplier = orderFromDb.RushMultiplier; rtValue.LabworksSampleDisposition = orderFromDb.Disposition; return(rtValue); }