Esempio n. 1
0
        public async Task <Result <AddHeiLabTestsDoneResponse> > Handle(AddHeiLabTestsDoneCommand request, CancellationToken cancellationToken)
        {
            using (_labUnitOfWork)
            {
                try
                {
                    if (request.HeiLabTestTypes.Any())
                    {
                        List <HeiLabTests> heiLabTestses = new List <HeiLabTests>();
                        request.HeiLabTestTypes.ForEach(x => heiLabTestses.Add(new HeiLabTests
                        {
                            PatientId        = request.PatientId,
                            HeiLabTestTypeId = x.Id,
                            LabOrderId       = request.LabOrderId
                        }));

                        await _labUnitOfWork.Repository <HeiLabTests>().AddRangeAsync(heiLabTestses);

                        await _labUnitOfWork.SaveAsync();
                    }

                    return(Result <AddHeiLabTestsDoneResponse> .Valid(new AddHeiLabTestsDoneResponse()
                    {
                        Message = "Successfully added Hei Lab Test Types"
                    }));
                }
                catch (Exception e)
                {
                    Log.Error(e, $"An error occured while trying to add Hei Lab Tests Types");
                    return(Result <AddHeiLabTestsDoneResponse> .Invalid($"An error occured while trying to add Hei Lab Tests Types"));
                }
            }
        }
        public async Task <Result <AddLabOrderResponse> > Handle(AddLabOrderCommand request, CancellationToken cancellationToken)
        {
            using (var transaction = _labUnitOfWork.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                try
                {
                    if (request.LabTests == null)
                    {
                        throw new ArgumentException("LabTests details not found");
                    }

                    var labOrder = _mapper.Map <LabOrder>(request);
                    await _labUnitOfWork.Repository <LabOrder>().AddAsync(labOrder);

                    await _labUnitOfWork.SaveAsync();

                    var labOrderTests = request.LabTests
                                        .Select(x => new LabOrderTest(labOrder.Id, x.Id, x.Notes, request.UserId, false))
                                        .ToList();

                    await _labUnitOfWork.Repository <LabOrderTest>().AddRangeAsync(labOrderTests);

                    await _labUnitOfWork.SaveAsync();

                    var patientLabTrackers = new List <PatientLabTracker>();

                    foreach (var labOrderTest in labOrderTests)
                    {
                        var labName = request.LabTests.FirstOrDefault(x => x.Id == labOrderTest.LabTestId)?.LabTestName;

                        var parameterCount = _labUnitOfWork.Repository <LabTest>().Get(x => x.Id == labOrderTest.LabTestId)
                                             .SingleOrDefault()?.ParameterCount;

                        if (parameterCount == 0)
                        {
                            continue;
                        }

                        var orderReason = request.LabTests.SingleOrDefault(x => x.Id == labOrderTest.LabTestId)
                                          ?.OrderReason;

                        var patientLabTacker = new PatientLabTracker(request.PatientId, labName,
                                                                     request.PatientMasterVisitId, labOrderTest.LabTestId,
                                                                     labOrder.Id, labOrderTest.Id, request.LocationId, request.OrderDate, request.UserId,
                                                                     orderReason, null);

                        patientLabTrackers.Add(patientLabTacker);
                    }

                    await _labUnitOfWork.Repository <PatientLabTracker>().AddRangeAsync(patientLabTrackers);

                    await _labUnitOfWork.SaveAsync();

                    transaction.Commit();

                    return(Result <AddLabOrderResponse> .Valid(new AddLabOrderResponse
                    {
                        LabOrderId = labOrder.Id
                    }));
                }
                catch (Exception ex)
                {
                    string message = $"An error occured while saving lab order request for patientId {request.PatientId}";
                    Log.Error(ex, message);
                    transaction.Rollback();

                    return(Result <AddLabOrderResponse> .Invalid(message));
                }
            }
        }
Esempio n. 3
0
        public async Task <Result <CompleteLabOrderResponse> > Handle(CompleteLabOrderCommand request, CancellationToken cancellationToken)
        {
            using (var transaction = _labUnitOfwork.BeginTransaction(IsolationLevel.ReadCommitted))
            {
                try
                {
                    DateTime resultDate = request.DateResultsCollected.HasValue
                        ? request.DateResultsCollected.Value
                        : DateTime.Now;

                    request.LabTestResults = string.IsNullOrEmpty(request.StrLabTestResults)
                        ? request.LabTestResults
                        : BuildLabTestResultCommandCollection(request.StrLabTestResults);

                    var submittedLabOrderTest = _labUnitOfwork.Repository <LabOrderTest>()
                                                .Get(x => x.Id == request.LabOrderTestId).FirstOrDefault();
                    if (submittedLabOrderTest == null)
                    {
                        return(Result <CompleteLabOrderResponse> .Invalid($"Lab order request with Id {request.LabOrderTestId} not found"));
                    }

                    if (!request.LabTestResults.Any())
                    {
                        return(Result <CompleteLabOrderResponse> .Invalid($"Submit atleast one lab result to complete the lab order"));
                    }

                    var labOrderTestResults = new List <LabOrderTestResult>();

                    foreach (var labTestResult in request.LabTestResults)
                    {
                        var parameterConfig = GetParamterConfigDetails(labTestResult.ParameterId);

                        var resultUnit = parameterConfig?.LabTestParameterConfig?.Unit;

                        var resultOption =
                            parameterConfig?.LabTestParameterResultOptions?.SingleOrDefault(x =>
                                                                                            x.Id == labTestResult.ResultOptionId)?.Value;

                        var labOrderTestResult = new LabOrderTestResult(request.LabOrderId, request.LabOrderTestId,
                                                                        request.LabTestId, labTestResult.ParameterId, labTestResult.ResultValue, labTestResult.ResultText,
                                                                        labTestResult.ResultOptionId, resultOption, resultUnit?.UnitName, resultUnit?.UnitId,
                                                                        request.UserId, labTestResult.Undetectable, resultDate, labTestResult.DetectionLimit);

                        labOrderTestResults.Add(labOrderTestResult);
                    }


                    await _labUnitOfwork.Repository <LabOrderTestResult>().AddRangeAsync(labOrderTestResults);

                    // PatientLabTracker is updated only for LabTests with only one parameter count
                    var labTestParameters = _labUnitOfwork.Repository <LabTestParameter>()
                                            .Get(x => x.LabTestId == request.LabTestId && x.DeleteFlag == false).ToList();

                    var totalLabTestParameterCount = labTestParameters.Count;

                    UpdatePatientLabTestTracker(labTestParameters[0].Id, request.LabOrderId, totalLabTestParameterCount,
                                                request.LabOrderTestId, labOrderTestResults.FirstOrDefault());
                    submittedLabOrderTest.ReceiveResult(request.UserId, resultDate);
                    submittedLabOrderTest.MarkAsReceived();

                    _labUnitOfwork.Repository <LabOrderTest>().Update(submittedLabOrderTest);

                    await _labUnitOfwork.SaveAsync();

                    var labOrderTestPendingSubmission = _labUnitOfwork.Repository <LabOrderTest>()
                                                        .Get(x => x.LabOrderId == request.LabOrderId && x.ResultStatus != ResultStatusEnum.Received.ToString()).Any();

                    if (!labOrderTestPendingSubmission)
                    {
                        var labOrder = _labUnitOfwork.Repository <LabOrder>().Get(x => x.Id == request.LabOrderId).SingleOrDefault();
                        labOrder?.CompleteOrder();
                        _labUnitOfwork.Repository <LabOrder>().Update(labOrder);
                        await _labUnitOfwork.SaveAsync();
                    }

                    transaction.Commit();

                    return(Result <CompleteLabOrderResponse> .Valid(new CompleteLabOrderResponse { LabOrderId = request.LabOrderId }));
                }
                catch (Exception ex)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }