Ejemplo n.º 1
0
        public async Task <IActionResult> AddLabOrder([FromBody] AddLabOrderCommand addLabOrderCommand)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            var response = await _mediator.Send(addLabOrderCommand, Request.HttpContext.RequestAborted);

            if (response.IsValid)
            {
                return(Ok(response.Value));
            }
            return(BadRequest(response));
        }
        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));
                }
            }
        }