/// <summary> /// This method processes the aggregated incoming request from Aggregator Service, applies business rules and inserts transaction record. /// </summary> /// <param name="request">Incoming request</param> /// <param name="headers">Headers</param> public async Task ProcessTransactionRequest(TransactionRequest request, Dictionary <string, string> headers) { _logger.LogInformation(string.Format(CommonConstants.LoggingMessage.ProcessIncomingRequest, JsonConvert.SerializeObject(request))); var status = TransactionStatus.Interim; var facilityId = request.Facility.FacilityId; FacilityStorageSpace storageSpaceInfo = null; var priority = await _transactionPriorityManager.ValidatePriority(request.Facility.FacilityId, request.Priority); var facility = await _facilityManager.ValidateFacility(facilityId); var destination = await _destinationManager.GetDestinationByCode(request?.Patient?.DeliverToLocation); if (facility != null) { if ((facility.AduIgnoreCritLow == true && string.Equals(request.Priority, Priority.PYXISCRITLOW.ToString(), StringComparison.OrdinalIgnoreCase)) || (facility.AduIgnoreStockout == true && (string.Equals(request.Priority, Priority.PYXISSTOCKOUT.ToString(), StringComparison.OrdinalIgnoreCase) || string.Equals(request.Priority, Priority.PYXISSTKOUT.ToString(), StringComparison.OrdinalIgnoreCase)))) { _logger.LogInformation(string.Format(CommonConstants.LoggingMessage.RejectedRequest, request.RequestId)); status = TransactionStatus.Ignored; } storageSpaceInfo = facility.StorageSpaces?.Where(x => x.IsDefault).FirstOrDefault(); } var partNo = 0; var multiMedName = string.Empty; var transactionList = new List <TransactionQueueModel>(); var orderCount = Enumerable.Count <Item>(request.Items); var isMultiComponent = orderCount > 1 ? true : false; foreach (var item in request.Items) { FacilityFormulary facilityFormulary = null; var formulary = await _formularyManager.GetFormularyByItemId(item.ItemId); if (formulary != null && formulary.FacilityFormulary != null && formulary.FacilityFormulary.FacilityId == facilityId) { facilityFormulary = formulary.FacilityFormulary; } if (facility != null && facilityFormulary != null && ((string.Equals(request.Priority, Priority.PYXISCRITLOW.ToString(), StringComparison.OrdinalIgnoreCase) && facilityFormulary.AduIgnoreCritLow != null && (bool)facilityFormulary.AduIgnoreCritLow) || ((string.Equals(request.Priority, Priority.PYXISSTOCKOUT.ToString(), StringComparison.OrdinalIgnoreCase) || string.Equals(request.Priority, Priority.PYXISSTKOUT.ToString(), StringComparison.OrdinalIgnoreCase)) && facilityFormulary.AduIgnoreStockout != null && (bool)facilityFormulary.AduIgnoreStockout))) { status = TransactionStatus.Ignored; } //Checks for ADUIgnoreCritLow and ADUIgnoreStockOut prior to ADU Cases if (priority != null && destination != null && ((priority.TransactionPriorityCode.ToLower() == Priority.PYXISCRITLOW.ToString().ToLower() && destination.AduIgnoreCritLow.GetValueOrDefault()) || ((priority.TransactionPriorityCode.ToLower() == Priority.PYXISSTOCKOUT.ToString().ToLower() || priority.TransactionPriorityCode.ToLower() == Priority.PYXISSTKOUT.ToString().ToLower()) && destination.AduIgnoreStockOut.GetValueOrDefault()))) { status = TransactionStatus.Ignored; } int.TryParse(item.OrderAmount, out int quantity); var newTransaction = new TransactionQueueModel(); if (status != TransactionStatus.Ignored) { var isExceptionTransaction = SetExceptionTransaction(facility, formulary, facilityFormulary, storageSpaceInfo, request, item, quantity, newTransaction); if (!isExceptionTransaction) { SetValidTransaction(storageSpaceInfo.Id, newTransaction, status); } } partNo += 1; SetTransactionDetails(priority, formulary, facility, facilityFormulary, destination, request, item, partNo, orderCount, newTransaction, quantity); //ADU Processing variables Tuple <bool, bool> admResult = default(Tuple <bool, bool>); bool isIgnoredTxn = false, isPartialUpdated = false; if (newTransaction.Status != TransactionStatus.Exception && status != TransactionStatus.Ignored && priority.IsAdu.GetValueOrDefault(false)) { admResult = await _aduTransactionManager.ProcessAduTransaction(request, newTransaction, item, priority, facility); isIgnoredTxn = admResult.Item1; isPartialUpdated = admResult.Item2; //Logging for ADU Processing if (isIgnoredTxn) { _logger.LogInformation(string.Format(CommonConstants.LoggingMessage.ProcessedAdmTransaction, request.RequestId)); } } ConfigureTimeToLive(priority, newTransaction); if (status != TransactionStatus.Ignored && !isIgnoredTxn && !isPartialUpdated) { newTransaction.TransactionQueueId = await _transactionQueueRepository.CreateTransaction(newTransaction); _logger.LogInformation(string.Format(CommonConstants.LoggingMessage.TransactionCreated, newTransaction.TransactionQueueId, newTransaction.IncomingRequestId)); if (newTransaction.Status == TransactionStatus.Interim) { PublishFormularyLocationRequest(newTransaction, headers); } } else if (!isPartialUpdated) { newTransaction.Status = TransactionStatus.Ignored; newTransaction.TransactionQueueId = await _transactionQueueHistoryRepository.CreateTransaction(newTransaction); _logger.LogInformation(string.Format(CommonConstants.LoggingMessage.IgnoredTransactionCreated, newTransaction.TransactionQueueId, newTransaction.IncomingRequestId)); } } }
private bool SetExceptionTransaction(Facility facility, Formulary formulary, FacilityFormulary facilityFormulary, FacilityStorageSpace storageSpaceInfo, TransactionRequest request, Item item, int quantity, TransactionQueueModel newTransaction) { var isItemAccepted = (facilityFormulary != null && facilityFormulary.Approved) ? true : false; var isActiveFormulary = (formulary != null && !formulary.IsActive.GetValueOrDefault()) ? false : true; if (formulary == null) { newTransaction.Description = item.ItemName; SetTransactionException(newTransaction, CommonConstants.TransactionException.UnknownItemId); if (!int.TryParse(item.OrderAmount.Trim(), out quantity)) { newTransaction.Exception += Environment.NewLine + CommonConstants.TransactionException.InvalidQuantity; } newTransaction.Quantity = quantity; return(true); } if (!isActiveFormulary) { SetTransactionException(newTransaction, CommonConstants.TransactionException.InactiveFormularyItem); return(true); } if (facilityFormulary == null) { SetTransactionException(newTransaction, CommonConstants.TransactionException.FormularyNotMapped); return(true); } if (!isItemAccepted) { SetTransactionException(newTransaction, CommonConstants.TransactionException.NotApprovedFormularyItem); return(true); } if (quantity <= 0) { SetTransactionException(newTransaction, CommonConstants.TransactionException.InvalidUnitQuantity); return(true); } if (storageSpaceInfo == null) { SetTransactionException(newTransaction, CommonConstants.TransactionException.UnassignedLocation); return(true); } return(false); }