예제 #1
0
        /// <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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
        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));
        }
예제 #4
0
        /// <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);
        }