public async Task <RequisitionNoteRegRespObj> Handle(AddUpdateRequisitionNoteCommand request, CancellationToken cancellationToken) { try { var apiResponse = new RequisitionNoteRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage() } }; var user = await _serverRequest.UserDataAsync(); if (user == null) { return(new RequisitionNoteRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = " Unable To Process This User" } } }); } List <purch_prndetails> prnDetails = new List <purch_prndetails>(); using (var _trans = await _dataContext.Database.BeginTransactionAsync()) { try { var prn = _repo.BuildPurchRequisionNoteObject(request, user.StaffId, user.CompanyId); await _repo.AddUpdatePurchaseRequisitionNoteAsync(prn); if (request.PRNDetails.Count() > 0) { prnDetails = _repo.BuildListOfPrnDetails(request.PRNDetails, prn.CompanyId); } var targetList = new List <int>(); targetList.Add(prn.PurchaseReqNoteId); GoForApprovalRequest wfRequest = new GoForApprovalRequest { Comment = "Purchase PRN", OperationId = (int)OperationsEnum.PurchasePRNApproval, TargetId = targetList, ApprovalStatus = (int)ApprovalStatus.Pending, DeferredExecution = true, StaffId = user.StaffId, CompanyId = user.CompanyId, EmailNotification = true, ExternalInitialization = false, StatusId = (int)ApprovalStatus.Processing, }; var result = await _serverRequest.GotForApprovalAsync(wfRequest); if (!result.IsSuccessStatusCode) { apiResponse.Status.Message.FriendlyMessage = $"{result.ReasonPhrase} {result.StatusCode}"; return(apiResponse); } var stringData = await result.Content.ReadAsStringAsync(); var res = JsonConvert.DeserializeObject <GoForApprovalRespObj>(stringData); if (res.ApprovalProcessStarted) { prn.ApprovalStatusId = (int)ApprovalStatus.Processing; prn.WorkflowToken = res.Status.CustomToken; await _repo.AddUpdatePurchaseRequisitionNoteAsync(prn); foreach (var item in prnDetails) { item.PurchaseReqNoteId = prn.PurchaseReqNoteId; await _repo.AddUpdatePrnDetailsAsync(item); } await _trans.CommitAsync(); apiResponse.PurchaseReqNoteId = prn.PurchaseReqNoteId; apiResponse.Status.IsSuccessful = res.Status.IsSuccessful; apiResponse.Status.Message = res.Status.Message; return(apiResponse); } if (res.EnableWorkflow || !res.HasWorkflowAccess) { await _trans.CommitAsync(); apiResponse.PurchaseReqNoteId = prn.PurchaseReqNoteId; apiResponse.Status.IsSuccessful = true; apiResponse.Status.Message.FriendlyMessage = "Successful"; return(apiResponse); } if (!res.EnableWorkflow) { prn.ApprovalStatusId = (int)ApprovalStatus.Approved; EmailMessageObj email = new EmailMessageObj { ToAddresses = new List <EmailAddressObj>() }; var lponum = 0; foreach (var item in prnDetails) { if (await _repo.AddUpdatePrnDetailsAsync(item)) { item.LPONumber = _repo.LpoNubmer(prn.PurchaseReqNoteId + item.PRNDetailsId); item.PurchaseReqNoteId = prn.PurchaseReqNoteId; await _repo.AddUpdatePrnDetailsAsync(item); var lpoObject = _repo.BuildLPODomianObject(item, prn.DeliveryLocation, prn.ExpectedDeliveryDate ?? DateTime.Today); if (await _repo.AddUpdateLPOAsync(lpoObject)) { var SuggestedSupplierList = lpoObject.SupplierIds.Split(',').Select(int.Parse); foreach (var supplierId in SuggestedSupplierList) { var supplier = await _suprepo.GetSupplierAsync(supplierId); if (supplier != null) { var bidAndTenderObject = _repo.BuildBidAndTenderDomianObject(supplier, lpoObject, prn.DepartmentId, item); bidAndTenderObject.CompanyId = prn.CompanyId; bidAndTenderObject.PurchaseReqNoteId = prn.PurchaseReqNoteId; if (await _repo.AddUpdateBidAndTender(bidAndTenderObject)) { email.ToAddresses.Add(new EmailAddressObj { Address = supplier.Email, Name = supplier.Name }); } } } var otherSupplierbid = _repo.BuildBidAndTenderDomianObjectForNonSelectedSuppliers(lpoObject, prn.DepartmentId, item); otherSupplierbid.PurchaseReqNoteId = prn.PurchaseReqNoteId; otherSupplierbid.CompanyId = prn.CompanyId; await _repo.AddUpdateBidAndTender(otherSupplierbid); } } } email.ToAddresses.Distinct(); await _repo.SendEmailToSuppliersAsync(email, prn.Description); await _repo.AddUpdatePurchaseRequisitionNoteAsync(prn); await _trans.CommitAsync(); apiResponse.Status.IsSuccessful = true; apiResponse.Status.Message.FriendlyMessage = "Successful"; return(apiResponse); } } catch (SqlException ex) { await _trans.RollbackAsync(); var errorCode = ErrorID.Generate(4); _logger.Error($"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}"); throw ex; } finally { await _trans.DisposeAsync(); } } return(new RequisitionNoteRegRespObj { Status = new APIResponseStatus { IsSuccessful = true, Message = new APIResponseMessage { FriendlyMessage = "Success" } } }); } catch (Exception ex) { #region Log error to file var errorCode = ErrorID.Generate(4); _logger.Error($"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}"); return(new RequisitionNoteRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = "Error occured!! Unable to process item", MessageId = errorCode, TechnicalMessage = $"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}" } } }); #endregion } }