Example #1
0
        /// <summary>
        /// This should probably be moved to a service...
        /// </summary>
        /// <param name="order"></param>
        /// <param name="result"></param>
        /// <param name="finalizeModel"></param>
        /// <returns></returns>
        private async Task <Order> UpdateOrderFromLabworksResult(Order order, OverwriteOrderResult result, LabFinalizeModel finalizeModel = null)
        {
            order.ClientId   = result.ClientId;
            order.ClientName = "[Not Found]"; //Updated below if we find it
            var orderDetails = order.GetOrderDetails();

            if (!string.IsNullOrWhiteSpace(order.ClientId))
            {
                //TODO: update other info if we pull it: phone numbers
                var clientInfo = await _labworksService.GetClientDetails(order.ClientId);

                if (clientInfo != null)
                {
                    orderDetails.ClientInfo.ClientId    = order.ClientId;
                    orderDetails.ClientInfo.Email       = clientInfo.SubEmail;
                    orderDetails.ClientInfo.Name        = clientInfo.Name;
                    orderDetails.ClientInfo.PhoneNumber = clientInfo.SubPhone;
                    orderDetails.ClientInfo.CopyPhone   = clientInfo.CopyPhone;
                    orderDetails.ClientInfo.Department  = clientInfo.Department;
                    order.ClientName = clientInfo.Name;
                }

                order.AdditionalEmails = AdditionalEmailsHelper.AddClientInfoEmails(order, orderDetails.ClientInfo);
            }

            if (result.MissingTestsToAdd.Any())
            {
                var allTests = order.GetTestDetails();
                foreach (var missingTest in result.MissingTestsToAdd)
                {
                    allTests.Add(missingTest);
                }
                order.SaveTestDetails(allTests);
            }

            orderDetails.Quantity                  = result.Quantity;
            orderDetails.SelectedTests             = result.SelectedTests;
            orderDetails.Total                     = orderDetails.SelectedTests.Sum(x => x.Total) + (orderDetails.Payment.IsInternalClient ? orderDetails.InternalProcessingFee : orderDetails.ExternalProcessingFee);
            orderDetails.Total                     = orderDetails.Total * result.RushMultiplier;
            orderDetails.RushMultiplier            = result.RushMultiplier;
            orderDetails.LabworksSampleDisposition = result.LabworksSampleDisposition;

            if (finalizeModel != null)
            {
                orderDetails.LabComments      = finalizeModel.LabComments;
                orderDetails.AdjustmentAmount = finalizeModel.AdjustmentAmount;
                if (orderDetails.AdjustmentAmount != 0)
                {
                    orderDetails.AdjustmentComments = finalizeModel.AdjustmentComments;
                }
            }



            order.SaveDetails(orderDetails);
            order.SaveBackedupTestDetails(result.BackedupTests);

            return(order);
        }
Example #2
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);
        }
Example #3
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);
        }