public async Task <BidAndTenderRegRespObj> Handle(SendSupplierBidAndTenderToApprovalCommand request, CancellationToken cancellationToken) { var apiResponse = new BidAndTenderRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage() } }; try { var bidAndTenderObj = await _repo.GetBidAndTender(request.BidAndTenderId); // IEnumerable<cor_paymentterms> paymentTerms = await _repo.GetPaymenttermsAsync(); if (bidAndTenderObj == null) { apiResponse.Status.Message.FriendlyMessage = $"Bid Not found"; return(apiResponse); } var enumName = (ApprovalStatus)bidAndTenderObj.ApprovalStatusId; if (bidAndTenderObj.ApprovalStatusId != (int)ApprovalStatus.Pending) { apiResponse.Status.Message.FriendlyMessage = $"Unable to push supplier bid with status '{enumName.ToString()}' for approval"; return(apiResponse); } var _ThisBidLPO = await _repo.GetLPOByNumberAsync(bidAndTenderObj.LPOnumber); if (_ThisBidLPO.WinnerSupplierId > 0) { apiResponse.Status.Message.FriendlyMessage = $"Supplier already taken for the item associated to this bid"; return(apiResponse); } if (bidAndTenderObj.Paymentterms.Count() > 0 && bidAndTenderObj.Paymentterms.Count(q => q.ProposedBy == (int)Proposer.STAFF) == 0) { apiResponse.Status.Message.FriendlyMessage = $"No Payment Plan Found"; return(apiResponse); } var user = await _serverRequest.UserDataAsync(); IEnumerable <cor_paymentterms> paymentTerms = await _repo.GetPaymenttermsAsync(); using (var _transaction = await _dataContext.Database.BeginTransactionAsync()) { try { var targetList = new List <int>(); targetList.Add(bidAndTenderObj.BidAndTenderId); GoForApprovalRequest wfRequest = new GoForApprovalRequest { Comment = "Bid and tender", OperationId = (int)OperationsEnum.BidAndTenders, 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(); GoForApprovalRespObj res = JsonConvert.DeserializeObject <GoForApprovalRespObj>(stringData); if (res.ApprovalProcessStarted) { bidAndTenderObj.ApprovalStatusId = (int)ApprovalStatus.Processing; bidAndTenderObj.WorkflowToken = res.Status.CustomToken; // var thisBidPaymentTerms = paymentTerms.Where(d => d.BidAndTenderId == bidAndTenderObj.BidAndTenderId).ToList(); ///bidAndTenderObj.Paymentterms = thisBidPaymentTerms; await _repo.AddUpdateBidAndTender(bidAndTenderObj); await _transaction.CommitAsync(); apiResponse.BidAndTenderId = bidAndTenderObj.BidAndTenderId; apiResponse.Status = res.Status; return(apiResponse); } if (res.EnableWorkflow || !res.HasWorkflowAccess) { await _transaction.RollbackAsync(); apiResponse.Status.Message = res.Status.Message; return(apiResponse); } if (!res.EnableWorkflow) { bidAndTenderObj.ApprovalStatusId = (int)ApprovalStatus.Approved; bidAndTenderObj.DecisionResult = (int)DecisionResult.Win; bidAndTenderObj.PLPOId = _ThisBidLPO.PLPOId; var thisBidPaymentTerms = paymentTerms.Where(d => d.BidAndTenderId == bidAndTenderObj.BidAndTenderId).ToList(); bidAndTenderObj.Paymentterms = thisBidPaymentTerms; await _repo.SendEmailToSuppliersSelectedAsync(bidAndTenderObj.SupplierId, bidAndTenderObj.DescriptionOfRequest, _ThisBidLPO.PLPOId); await _repo.AddUpdateBidAndTender(bidAndTenderObj); var terms = paymentTerms.Where(q => q.BidAndTenderId == bidAndTenderObj.BidAndTenderId).ToList(); foreach (var term in terms) { term.LPOId = bidAndTenderObj.PLPOId; term.CompanyId = bidAndTenderObj.CompanyId; await _repo.AddUpdatePaymentTermsAsync(term); } var otherBids = _dataContext.cor_bid_and_tender.Where(q => q.LPOnumber.Trim().ToLower() == bidAndTenderObj.LPOnumber.Trim().ToLower() && q.BidAndTenderId != bidAndTenderObj.BidAndTenderId).ToList(); if (otherBids.Count() > 0) { foreach (var otherbid in otherBids) { otherbid.ApprovalStatusId = (int)ApprovalStatus.Disapproved; otherbid.DecisionResult = (int)DecisionResult.Lost; otherbid.Paymentterms = _dataContext.cor_paymentterms.Where(q => q.BidAndTenderId == otherbid.BidAndTenderId).ToList(); await _repo.AddUpdateBidAndTender(otherbid); } } var thisBidLpo = _repo.BuildThisBidLPO(_ThisBidLPO, bidAndTenderObj); await _repo.AddUpdateLPOAsync(thisBidLpo); await _transaction.CommitAsync(); } apiResponse.Status.IsSuccessful = true; apiResponse.Status.Message.FriendlyMessage = "LPO Generated"; return(apiResponse); } catch (Exception ex) { await _transaction.RollbackAsync(); #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 BidAndTenderRegRespObj { Status = new APIResponseStatus { Message = new APIResponseMessage { FriendlyMessage = "Error occured!! Please try again later", MessageId = errorCode, TechnicalMessage = $"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}" } } }); #endregion } finally { await _transaction.DisposeAsync(); } } } 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 BidAndTenderRegRespObj { Status = new APIResponseStatus { Message = new APIResponseMessage { FriendlyMessage = "Error occured!! Please try again later", MessageId = errorCode, TechnicalMessage = $"ErrorID : {errorCode} Ex : {ex?.Message ?? ex?.InnerException?.Message} ErrorStack : {ex?.StackTrace}" } } }); #endregion } }
public async Task <StaffApprovalRegRespObj> Handle(BidandTenderStaffApprovalCommand request, CancellationToken cancellationToken) { try { if (request.ApprovalStatus == (int)ApprovalStatus.Revert && request.ReferredStaffId < 1) { return(new StaffApprovalRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = "Please select staff to revert to" } } }); } var currentUserId = _accessor.HttpContext.User?.FindFirst(x => x.Type == "userId").Value; var user = await _serverRequest.UserDataAsync(); var currentBid = await _repo.GetBidAndTender(request.TargetId); if (!Validation(currentBid).Status.IsSuccessful) { return(Validation(currentBid)); } var _ThisBidLPO = await _repo.GetLPOByNumberAsync(currentBid.LPOnumber); if (_ThisBidLPO.WinnerSupplierId > 0 && request.ApprovalStatus != (int)ApprovalStatus.Approved) { return(new StaffApprovalRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = $"Supplier already selected for this LPO {currentBid.LPOnumber}" } } }); } IEnumerable <cor_paymentterms> paymentTerms = await _repo.GetPaymenttermsAsync(); var detail = BuildApprovalDetailObject(request, currentBid, user.StaffId); var req = new IndentityServerApprovalCommand { ApprovalComment = request.ApprovalComment, ApprovalStatus = request.ApprovalStatus, TargetId = request.TargetId, WorkflowToken = currentBid.WorkflowToken, ReferredStaffId = request.ReferredStaffId }; using (var _trans = await _dataContext.Database.BeginTransactionAsync()) { try { var result = await _serverRequest.StaffApprovalRequestAsync(req); if (!result.IsSuccessStatusCode) { return(new StaffApprovalRegRespObj { Status = new APIResponseStatus { IsSuccessful = false, Message = new APIResponseMessage { FriendlyMessage = result.ReasonPhrase } } }); } var stringData = await result.Content.ReadAsStringAsync(); response = JsonConvert.DeserializeObject <StaffApprovalRegRespObj>(stringData); if (!response.Status.IsSuccessful) { return(new StaffApprovalRegRespObj { Status = response.Status }); } if (response.ResponseId == (int)ApprovalStatus.Processing) { await _detailService.AddUpdateApprovalDetailsAsync(detail); currentBid.ApprovalStatusId = (int)ApprovalStatus.Processing; currentBid.DecisionResult = (int)DecisionResult.Non_Applicable; var thisBidPaymentTerms = paymentTerms.Where(d => d.BidAndTenderId == currentBid.BidAndTenderId).ToList(); currentBid.Paymentterms = thisBidPaymentTerms; await _repo.AddUpdateBidAndTender(currentBid); await _trans.CommitAsync(); return(new StaffApprovalRegRespObj { ResponseId = (int)ApprovalStatus.Processing, Status = new APIResponseStatus { IsSuccessful = true, Message = response.Status.Message } }); } if (response.ResponseId == (int)ApprovalStatus.Revert) { await _detailService.AddUpdateApprovalDetailsAsync(detail); currentBid.ApprovalStatusId = (int)ApprovalStatus.Revert; currentBid.DecisionResult = (int)DecisionResult.Non_Applicable; await _repo.AddUpdateBidAndTender(currentBid); await _trans.CommitAsync(); return(new StaffApprovalRegRespObj { ResponseId = (int)ApprovalStatus.Revert, Status = new APIResponseStatus { IsSuccessful = true, Message = response.Status.Message } }); } if (response.ResponseId == (int)ApprovalStatus.Approved) { await _detailService.AddUpdateApprovalDetailsAsync(detail); currentBid.ApprovalStatusId = (int)ApprovalStatus.Approved; currentBid.DecisionResult = (int)DecisionResult.Win; currentBid.PLPOId = _ThisBidLPO.PLPOId; var thisBidPaymentTerms = paymentTerms.Where(d => d.BidAndTenderId == currentBid.BidAndTenderId).ToList(); currentBid.Paymentterms = thisBidPaymentTerms; await _repo.SendEmailToSuppliersSelectedAsync(currentBid.SupplierId, currentBid.DescriptionOfRequest, _ThisBidLPO.PLPOId); await _repo.AddUpdateBidAndTender(currentBid); var terms = paymentTerms.Where(q => q.BidAndTenderId == currentBid.BidAndTenderId).ToList(); foreach (var term in terms) { term.LPOId = currentBid.PLPOId; term.CompanyId = currentBid.CompanyId; await _repo.AddUpdatePaymentTermsAsync(term); } var otherBids = _dataContext.cor_bid_and_tender.Where(q => q.LPOnumber.Trim().ToLower() == currentBid.LPOnumber.Trim().ToLower() && q.BidAndTenderId != currentBid.BidAndTenderId).ToList(); if (otherBids.Count() > 0) { foreach (var otherbid in otherBids) { otherbid.ApprovalStatusId = (int)ApprovalStatus.Disapproved; otherbid.DecisionResult = (int)DecisionResult.Lost; otherbid.Paymentterms = _dataContext.cor_paymentterms.Where(q => q.BidAndTenderId == otherbid.BidAndTenderId).ToList(); await _repo.AddUpdateBidAndTender(otherbid); } } var thisBidLpo = _repo.BuildThisBidLPO(_ThisBidLPO, currentBid); await _repo.AddUpdateLPOAsync(thisBidLpo); await _trans.CommitAsync(); return(new StaffApprovalRegRespObj { ResponseId = (int)ApprovalStatus.Approved, Status = new APIResponseStatus { IsSuccessful = true, Message = new APIResponseMessage { FriendlyMessage = $"Final Approval </br> Successfully selected Supplier for {currentBid.LPOnumber}" } } }); } if (response.ResponseId == (int)ApprovalStatus.Disapproved) { await _detailService.AddUpdateApprovalDetailsAsync(detail); _ThisBidLPO.JobStatus = _ThisBidLPO.JobStatus; currentBid.ApprovalStatusId = (int)ApprovalStatus.Disapproved; currentBid.DecisionResult = (int)DecisionResult.Lost; await _repo.AddUpdateBidAndTender(currentBid); await _trans.CommitAsync(); return(new StaffApprovalRegRespObj { ResponseId = (int)ApprovalStatus.Disapproved, Status = new APIResponseStatus { IsSuccessful = true, Message = response.Status.Message } }); } } catch (Exception ex) { await _trans.RollbackAsync(); throw new Exception("Error Occurerd", new Exception($"{ex.Message}")); } finally { await _trans.DisposeAsync(); } } return(new StaffApprovalRegRespObj { ResponseId = detail.ApprovalDetailId, Status = response.Status }); } catch (Exception ex) { throw ex; } }