public async Task <IActionResult> PutTravelApprovalRequest(int id, TravelApprovalRequestDTO travelApprovalRequestDto) { if (id != travelApprovalRequestDto.Id) { return(BadRequest()); } var travelApprovalRequest = await _context.TravelApprovalRequests.FindAsync(id); travelApprovalRequest.Id = travelApprovalRequestDto.Id; travelApprovalRequest.EmployeeId = travelApprovalRequestDto.EmployeeId; travelApprovalRequest.TravelStartDate = travelApprovalRequestDto.TravelStartDate; travelApprovalRequest.TravelEndDate = travelApprovalRequestDto.TravelEndDate; _context.TravelApprovalRequests.Update(travelApprovalRequest); //_context.Entry(projectDto).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { if (!TravelApprovalRequestExists(id)) { return(NotFound()); } else { throw; } } return(NoContent()); }
private async Task DepartmentTravelRequest(TravelApprovalRequestDTO travelApprovalRequestDto) { //Add oned entry to the TravelApprovalRequestTracker for Department based Request //Here project ID will be null int empid = travelApprovalRequestDto.EmployeeId; int empApprGroupId = _context.Employees.Find(empid).ApprovalGroupId; int costCentre = _context.Projects.Find(travelApprovalRequestDto.ProjectId).CostCentreId; int projManagerid = _context.ProjectManagements.Find(travelApprovalRequestDto.ProjectId).EmployeeId; var getEmpApproversAllLevels = _context.ApprovalRoleMaps.Where(a => a.ApprovalGroupId == empApprGroupId).ToList().OrderBy(a => a.ApprovalLevel); foreach (ApprovalRoleMap ApprMap in getEmpApproversAllLevels) { int role_id = ApprMap.RoleId; var approver = _context.Employees.Where(e => e.RoleId == role_id).FirstOrDefault(); /// Step 2: Enter a Record in Travel Approval Request Tracker (table) _context.TravelApprovalStatusTrackers.Add(new TravelApprovalStatusTracker { EmployeeId = travelApprovalRequestDto.EmployeeId, TravelApprovalRequestId = travelApprovalRequestDto.Id, DepartmentId = approver.DepartmentId, ProjectId = null, RoleId = approver.RoleId, ReqDate = DateTime.Now, FinalApprovedDate = null, ApprovalStatusTypeId = (int)ApprovalStatus.Pending //1-Pending, 2-Approved, 3-Rejected }); //##### 5. Send email to the Approver //Multiple instance for Department //#################################### var approverMailAddress = approver.Email; string subject = "Expense Claim Approval Request " + travelApprovalRequestDto.Id.ToString(); Employee emp = _context.Employees.Find(travelApprovalRequestDto.EmployeeId); var expenseReimClaimReq = _context.ExpenseReimburseRequests.Find(travelApprovalRequestDto.Id); string content = "Travel Request Approval sought by " + emp.FirstName + "/nfor the purpose of " + travelApprovalRequestDto.TravelPurpose; var messagemail = new Message(new string[] { approverMailAddress }, subject, content); await _emailSender.SendEmailAsync(messagemail); //repeat for each approver } }
public async Task <ActionResult <IEnumerable <TravelApprovalRequestDTO> > > GetTravelApprovalRequest() { List <TravelApprovalRequestDTO> ListTravelRequestDTO = new List <TravelApprovalRequestDTO>(); var travelrequests = await _context.TravelApprovalRequests.ToListAsync(); foreach (TravelApprovalRequest travelrequest in travelrequests) { TravelApprovalRequestDTO travelApprovalRequestDTO = new TravelApprovalRequestDTO(); travelApprovalRequestDTO.Id = travelrequest.Id; travelApprovalRequestDTO.EmployeeId = travelrequest.EmployeeId; travelApprovalRequestDTO.TravelStartDate = travelrequest.TravelStartDate; travelApprovalRequestDTO.TravelEndDate = travelrequest.TravelEndDate; ListTravelRequestDTO.Add(travelApprovalRequestDTO); } return(ListTravelRequestDTO); }
public async Task <ActionResult <TravelApprovalRequestDTO> > GetTravelApprovalRequest(int id) { var travelrequest = await _context.TravelApprovalRequests.FindAsync(id); TravelApprovalRequestDTO travelApprovalRequestDTO = new TravelApprovalRequestDTO(); travelApprovalRequestDTO.Id = travelrequest.Id; travelApprovalRequestDTO.EmployeeId = travelrequest.EmployeeId; travelApprovalRequestDTO.TravelStartDate = travelrequest.TravelStartDate; travelApprovalRequestDTO.TravelEndDate = travelrequest.TravelEndDate; if (travelrequest == null) { return(NotFound()); } travelApprovalRequestDTO.Id = travelrequest.Id; travelApprovalRequestDTO.EmployeeId = travelrequest.EmployeeId; travelApprovalRequestDTO.TravelStartDate = travelrequest.TravelStartDate; travelApprovalRequestDTO.TravelEndDate = travelrequest.TravelEndDate; return(travelApprovalRequestDTO); }
private async Task ProjectTravelRequest(TravelApprovalRequestDTO travelApprovalRequestDto) { //Add oned entry to the TravelApprovalRequestTracker for PROJECT based Request //Here Department ID will be null int costCentre = _context.Projects.Find(travelApprovalRequestDto.ProjectId).CostCentreId; int projManagerid = _context.ProjectManagements.Find(travelApprovalRequestDto.ProjectId).EmployeeId; var approver = _context.Employees.Find(projManagerid); _context.TravelApprovalStatusTrackers.Add(new TravelApprovalStatusTracker() { EmployeeId = travelApprovalRequestDto.EmployeeId, TravelApprovalRequestId = travelApprovalRequestDto.Id, DepartmentId = null, ProjectId = travelApprovalRequestDto.ProjectId.Value, RoleId = approver.RoleId, ReqDate = DateTime.Now, FinalApprovedDate = null, ApprovalStatusTypeId = (int)ApprovalStatus.Pending //1-Pending, 2-Approved, 3-Rejected }); //##### 5. Send email to the Approver //Single instance for Project //#################################### var approverMailAddress = approver.Email; string subject = "Expense Claim Approval Request " + travelApprovalRequestDto.Id.ToString(); Employee emp = _context.Employees.Find(travelApprovalRequestDto.EmployeeId); var expenseReimClaimReq = _context.ExpenseReimburseRequests.Find(travelApprovalRequestDto.Id); string content = "Travel Request Approval sought by " + emp.FirstName + "/nfor the purpose of " + travelApprovalRequestDto.TravelPurpose; var messagemail = new Message(new string[] { approverMailAddress }, subject, content); await _emailSender.SendEmailAsync(messagemail); }
public async Task <ActionResult <TravelApprovalRequest> > PostTravelApprovalRequest(TravelApprovalRequestDTO travelApprovalRequestDto) { /// Step 1 : enter a record in TravelApprovalRequest table TravelApprovalRequest travelApprovalRequest = new TravelApprovalRequest(); travelApprovalRequest.Id = travelApprovalRequestDto.Id; travelApprovalRequest.EmployeeId = travelApprovalRequestDto.EmployeeId; travelApprovalRequest.TravelStartDate = travelApprovalRequestDto.TravelStartDate; travelApprovalRequest.TravelEndDate = travelApprovalRequestDto.TravelEndDate; travelApprovalRequest.ProjectId = travelApprovalRequestDto.ProjectId; travelApprovalRequest.SubProjectId = travelApprovalRequestDto.SubProjectId; travelApprovalRequest.WorkTaskId = travelApprovalRequestDto.WorkTaskId; _context.TravelApprovalRequests.Add(travelApprovalRequest); await _context.SaveChangesAsync(); //Check if the Requestor is raising Travel reques on behalf of Project (Or) department //Process the travel request appropriately if (travelApprovalRequestDto.ProjectId == null) { await Task.Run(() => ProjectTravelRequest(travelApprovalRequestDto)); } else { await Task.Run(() => DepartmentTravelRequest(travelApprovalRequestDto)); } return(CreatedAtAction("GetGetTravelApprovalRequest", new { id = travelApprovalRequest.Id }, travelApprovalRequest)); }
/// <summary> /// This is option 2 : DEPARTMENT BASED CASH ADVANCE REQUEST /// </summary> /// <param name="travelApprovalRequestDto"></param> private async Task DepartmentTravelRequest(TravelApprovalRequestDTO travelApprovalRequestDto) { //### 1. If Employee Eligible for Cash Claim enter a record and reduce the available amount for next claim #region int reqEmpid = travelApprovalRequestDto.EmployeeId; Employee reqEmp = _context.Employees.Find(reqEmpid); int reqApprGroupId = reqEmp.ApprovalGroupId; int reqRoleId = reqEmp.RoleId; int maxApprLevel = _context.ApprovalRoleMaps.Include("ApprovalLevel").Where(a => a.ApprovalGroupId == reqApprGroupId).ToList().Select(x => x.ApprovalLevel).Max(a => a.Level); int reqApprLevel = _context.ApprovalRoleMaps.Include("ApprovalLevel").Where(a => a.ApprovalGroupId == reqApprGroupId && a.RoleId == reqRoleId).Select(x => x.ApprovalLevel).FirstOrDefault().Level; bool isSelfApprovedRequest = false; var travelApprovalRequest = new TravelApprovalRequest() { EmployeeId = reqEmpid, TravelStartDate = travelApprovalRequestDto.TravelStartDate, TravelEndDate = travelApprovalRequestDto.TravelEndDate, TravelPurpose = travelApprovalRequestDto.TravelPurpose, ReqRaisedDate = DateTime.Now, DepartmentId = _context.Employees.Find(reqEmpid).DepartmentId, ProjectId = travelApprovalRequestDto.ProjectId, SubProjectId = travelApprovalRequestDto.SubProjectId, WorkTaskId = travelApprovalRequestDto.WorkTaskId, CostCenterId = _context.Departments.Find(_context.Employees.Find(reqEmpid).DepartmentId).CostCenterId, ApprovalStatusTypeId = (int)EApprovalStatus.Pending, Comments = "Travel Request In Process!" }; _context.TravelApprovalRequests.Add(travelApprovalRequest); await _context.SaveChangesAsync(); //get the saved record Id travelApprovalRequestDto.Id = travelApprovalRequest.Id; #endregion #region //##### STEP 3. ClaimsApprovalTracker to be updated for all the allowed Approvers ///////////////////////////// Check if self Approved Request ///////////////////////////// //if highest approver is requesting Petty cash request himself if (maxApprLevel == reqApprLevel) { isSelfApprovedRequest = true; } ////////////////////////////////////////////////////////////////////////////////////////// var getEmpClaimApproversAllLevels = _context.ApprovalRoleMaps .Include(a => a.ApprovalLevel) .Where(a => a.ApprovalGroupId == reqApprGroupId) .OrderBy(o => o.ApprovalLevel.Level).ToList(); bool isFirstApprover = true; if (isSelfApprovedRequest) { TravelApprovalStatusTracker travelApprovalStatusTracker = new() { EmployeeId = travelApprovalRequestDto.EmployeeId, TravelApprovalRequestId = travelApprovalRequestDto.Id, TravelStartDate = travelApprovalRequestDto.TravelStartDate, TravelEndDate = travelApprovalRequestDto.TravelEndDate, DepartmentId = _context.Employees.Find(travelApprovalRequestDto.EmployeeId).DepartmentId, ProjectId = null, RoleId = _context.Employees.Find(travelApprovalRequestDto.EmployeeId).RoleId, ApprovalLevelId = reqApprLevel, ApprovalGroupId = reqApprGroupId, ReqDate = DateTime.Now, FinalApprovedDate = DateTime.Now, ApprovalStatusTypeId = (int)EApprovalStatus.Approved, Comments = "Travel Request in Proceess" }; _context.TravelApprovalStatusTrackers.Add(travelApprovalStatusTracker); travelApprovalRequest.ApprovalStatusTypeId = (int)EApprovalStatus.Approved; _context.TravelApprovalRequests.Update(travelApprovalRequest); await _context.SaveChangesAsync(); } else { foreach (ApprovalRoleMap ApprMap in getEmpClaimApproversAllLevels) { int role_id = ApprMap.RoleId; var approver = _context.Employees.Where(e => e.RoleId == role_id && e.ApprovalGroupId == reqApprGroupId).FirstOrDefault(); if (approver == null) { continue; } int approverLevelid = _context.ApprovalRoleMaps.Where(x => x.RoleId == approver.RoleId && x.ApprovalGroupId == reqApprGroupId).FirstOrDefault().ApprovalLevelId; int approverLevel = _context.ApprovalLevels.Find(approverLevelid).Level; if (reqApprLevel >= approverLevel) { continue; } TravelApprovalStatusTracker travelApprovalStatusTracker = new() { EmployeeId = travelApprovalRequestDto.EmployeeId, TravelApprovalRequestId = travelApprovalRequestDto.Id, TravelStartDate = travelApprovalRequestDto.TravelStartDate, TravelEndDate = travelApprovalRequestDto.TravelEndDate, DepartmentId = _context.Employees.Find(travelApprovalRequestDto.EmployeeId).DepartmentId, ProjectId = null, RoleId = approver.RoleId, ApprovalLevelId = ApprMap.ApprovalLevelId, ApprovalGroupId = reqApprGroupId, ReqDate = DateTime.Now, FinalApprovedDate = null, ApprovalStatusTypeId = isFirstApprover ? (int)EApprovalStatus.Pending : (int)EApprovalStatus.Initiating, Comments = "Travel Request in Proceess" //1-Initiating, 2-Pending, 3-InReview, 4-Approved, 5-Rejected }; _context.TravelApprovalStatusTrackers.Add(travelApprovalStatusTracker); await _context.SaveChangesAsync(); if (isFirstApprover) { //##### 4. Send email to the Approver //#################################### var approverMailAddress = approver.Email; string subject = "Travel Approval Request No# " + travelApprovalRequestDto.Id.ToString(); Employee emp = await _context.Employees.FindAsync(travelApprovalRequestDto.EmployeeId); var pettycashreq = _context.TravelApprovalRequests.Find(travelApprovalRequestDto.Id); string content = "Travel Approval Request sought by " + emp.FirstName + "<br/>Travel Request Deetails <br/>Start Date: " + travelApprovalRequestDto.TravelStartDate + "<br/>End Date: " + travelApprovalRequestDto.TravelEndDate + "<br/>Travel Purpose: " + travelApprovalRequestDto.TravelPurpose; var messagemail = new Message(new string[] { approverMailAddress }, subject, content); await _emailSender.SendEmailAsync(messagemail); } //first approver will be added as Pending, other approvers will be with In Approval Queue isFirstApprover = false; } } #endregion await _context.SaveChangesAsync(); } }
/// <summary> /// This is the option 1 : : PROJECT BASED TRAVEL REQUEST /// </summary> /// <param name="travelApprovalRequestDto"></param> /// <param name="travelApprovalRequestDto"></param> private async Task <IActionResult> ProjectTravelRequest(TravelApprovalRequestDTO travelApprovalRequestDTO) { #region int costCenterId = _context.Projects.Find(travelApprovalRequestDTO.ProjectId).CostCenterId; int projManagerid = _context.Projects.Find(travelApprovalRequestDTO.ProjectId).ProjectManagerId; var approver = _context.Employees.Find(projManagerid); int reqEmpid = travelApprovalRequestDTO.EmployeeId; int maxApprLevel = _context.ApprovalRoleMaps.Max(a => a.ApprovalLevelId); int empApprLevel = _context.ApprovalRoleMaps.Where(a => a.RoleId == _context.Employees.Find(reqEmpid).RoleId).FirstOrDefault().Id; bool isSelfApprovedRequest = false; #endregion //### 1. If Employee Travel Request enter a record in TravelApprovalRequestTracker #region TravelApprovalRequest travelApprovalRequest = new(); travelApprovalRequest.Id = travelApprovalRequestDTO.Id; travelApprovalRequest.EmployeeId = travelApprovalRequestDTO.EmployeeId; travelApprovalRequest.TravelStartDate = travelApprovalRequestDTO.TravelStartDate; travelApprovalRequest.TravelEndDate = travelApprovalRequestDTO.TravelEndDate; travelApprovalRequest.TravelPurpose = travelApprovalRequestDTO.TravelPurpose; travelApprovalRequest.ReqRaisedDate = DateTime.Now; travelApprovalRequest.DepartmentId = travelApprovalRequestDTO.DepartmentId; travelApprovalRequest.ProjectId = travelApprovalRequestDTO.ProjectId; travelApprovalRequest.SubProjectId = travelApprovalRequestDTO.SubProjectId; travelApprovalRequest.WorkTaskId = travelApprovalRequestDTO.WorkTaskId; travelApprovalRequest.CostCenterId = _context.Projects.Find(travelApprovalRequestDTO.ProjectId).CostCenterId; travelApprovalRequest.ApprovalStatusTypeId = (int)EApprovalStatus.Pending; travelApprovalRequest.Comments = "Travel Request In Process!"; _context.TravelApprovalRequests.Add(travelApprovalRequest); await _context.SaveChangesAsync(); //get the saved record Id travelApprovalRequestDTO.Id = travelApprovalRequest.Id; #endregion //##### 3. Add an entry to ClaimApproval Status tracker //get costcenterID based on project #region ///////////////////////////// Check if self Approved Request ///////////////////////////// //if highest approver is requesting Petty cash request himself if (maxApprLevel == empApprLevel || projManagerid == reqEmpid) { isSelfApprovedRequest = true; } ////////////////////////////////////////////////////////////////////////////////////////// TravelApprovalStatusTracker travelApprovalStatusTracker = new(); if (isSelfApprovedRequest) { travelApprovalStatusTracker.EmployeeId = travelApprovalRequestDTO.EmployeeId; travelApprovalStatusTracker.TravelApprovalRequestId = travelApprovalRequestDTO.Id; travelApprovalStatusTracker.TravelStartDate = travelApprovalRequestDTO.TravelStartDate; travelApprovalStatusTracker.TravelEndDate = travelApprovalRequestDTO.TravelEndDate; travelApprovalStatusTracker.DepartmentId = null; travelApprovalStatusTracker.ProjManagerId = projManagerid; travelApprovalStatusTracker.ProjectId = travelApprovalRequestDTO.ProjectId; travelApprovalStatusTracker.RoleId = approver.RoleId; travelApprovalStatusTracker.ApprovalGroupId = _context.Employees.Find(travelApprovalRequestDTO.EmployeeId).ApprovalGroupId; travelApprovalStatusTracker.ApprovalLevelId = 2; // default approval level is 2 for Project based request travelApprovalStatusTracker.ReqDate = DateTime.Now; travelApprovalStatusTracker.FinalApprovedDate = DateTime.Now; travelApprovalStatusTracker.ApprovalStatusTypeId = (int)EApprovalStatus.Approved; //1-Initiating; 2-Pending; 3-InReview; 4-Approved; 5-Rejected travelApprovalStatusTracker.Comments = "Travel Request is Self Approved!"; _context.TravelApprovalStatusTrackers.Add(travelApprovalStatusTracker); travelApprovalRequest.ApprovalStatusTypeId = (int)EApprovalStatus.Approved; _context.TravelApprovalRequests.Update(travelApprovalRequest); await _context.SaveChangesAsync(); } else { travelApprovalStatusTracker.EmployeeId = travelApprovalRequestDTO.EmployeeId; travelApprovalStatusTracker.TravelApprovalRequestId = travelApprovalRequestDTO.Id; travelApprovalStatusTracker.TravelStartDate = travelApprovalRequestDTO.TravelStartDate; travelApprovalStatusTracker.TravelEndDate = travelApprovalRequestDTO.TravelEndDate; travelApprovalStatusTracker.DepartmentId = null; travelApprovalStatusTracker.ProjManagerId = projManagerid; travelApprovalStatusTracker.ProjectId = travelApprovalRequestDTO.ProjectId; travelApprovalStatusTracker.RoleId = approver.RoleId; // get the next ProjectManager approval. travelApprovalStatusTracker.ApprovalGroupId = _context.Employees.Find(travelApprovalRequestDTO.EmployeeId).ApprovalGroupId; travelApprovalStatusTracker.ApprovalLevelId = 2; // default approval level is 2 for Project based request travelApprovalStatusTracker.ReqDate = DateTime.Now; travelApprovalStatusTracker.FinalApprovedDate = null; travelApprovalStatusTracker.ApprovalStatusTypeId = (int)EApprovalStatus.Pending; //1-Initiating, 2-Pending, 3-InReview, 4-Approved, 5-Rejected travelApprovalStatusTracker.Comments = "Travel Request in Proceess"; } _context.TravelApprovalStatusTrackers.Add(travelApprovalStatusTracker); try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } #endregion //##### 4. Send email to the user //#################################### #region if (isSelfApprovedRequest) { return(null); } var approverMailAddress = approver.Email; string subject = "Travel Approval Request No# " + travelApprovalRequestDTO.Id.ToString(); Employee emp = await _context.Employees.FindAsync(travelApprovalRequestDTO.EmployeeId); var pettycashreq = _context.TravelApprovalRequests.Find(travelApprovalRequestDTO.Id); string content = "Travel Approval Request sought by " + emp.FirstName + "<br/>Travel Request Details <br/>Start Date: " + travelApprovalRequestDTO.TravelStartDate + "<br/>End Date: " + travelApprovalRequestDTO.TravelEndDate + "<br/>Travel Purpose: " + travelApprovalRequestDTO.TravelPurpose; var messagemail = new Message(new string[] { approverMailAddress }, subject, content); await _emailSender.SendEmailAsync(messagemail); #endregion await _context.SaveChangesAsync(); return(Ok(new RespStatus { Status = "Success", Message = "Travel Request Created!" })); }
public async Task <ActionResult <TravelApprovalRequest> > PostTravelApprovalRequest(TravelApprovalRequestDTO travelApprovalRequestDTO) { //Step ##1 var dupReq = _context.TravelApprovalRequests.Where( t => t.TravelStartDate.Date == travelApprovalRequestDTO.TravelStartDate.Date && t.TravelEndDate.Date == travelApprovalRequestDTO.TravelEndDate.Date && t.EmployeeId == travelApprovalRequestDTO.EmployeeId && t.TravelPurpose == travelApprovalRequestDTO.TravelPurpose).Count(); if (dupReq != 0) { return(Conflict(new RespStatus { Status = "Failure", Message = "Duplicate request cannot be created" })); } //##Step 2 if (travelApprovalRequestDTO.ProjectId != null) { //Goes to Option 1 (Project) await Task.Run(() => ProjectTravelRequest(travelApprovalRequestDTO)); } else { //Goes to Option 2 (Department) await Task.Run(() => DepartmentTravelRequest(travelApprovalRequestDTO)); } try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return(Ok(new RespStatus { Status = "Success", Message = "Travel Request Created!" })); }
public async Task <IActionResult> PutTravelApprovalRequest(int id, TravelApprovalRequestDTO travelApprovalRequestDTO) { if (id != travelApprovalRequestDTO.Id) { return(Conflict(new RespStatus { Status = "Failure", Message = "Travel Id is invalid" })); } var travelApprovalRequest = await _context.TravelApprovalRequests.FindAsync(id); ///update the Wallet of the employe to reflect the changes int ApprovedCount = _context.TravelApprovalStatusTrackers.Where(e => e.TravelApprovalRequestId == travelApprovalRequest.Id && e.ApprovalStatusTypeId == (int)EApprovalStatus.Approved).Count(); if (ApprovedCount != 0) { return(Conflict(new RespStatus { Status = "Failure", Message = "Travel Requests cant be Edited after Approval!" })); } travelApprovalRequest.Id = travelApprovalRequestDTO.Id; travelApprovalRequest.EmployeeId = travelApprovalRequestDTO.EmployeeId; travelApprovalRequest.TravelStartDate = travelApprovalRequestDTO.TravelStartDate; travelApprovalRequest.TravelEndDate = travelApprovalRequestDTO.TravelEndDate; travelApprovalRequest.TravelPurpose = travelApprovalRequestDTO.TravelPurpose; travelApprovalRequest.ReqRaisedDate = DateTime.Now; if (travelApprovalRequestDTO.DepartmentId != null) { travelApprovalRequest.DepartmentId = travelApprovalRequestDTO.DepartmentId; } if (travelApprovalRequestDTO.ProjectId != null) { travelApprovalRequest.ProjectId = travelApprovalRequestDTO.ProjectId; travelApprovalRequest.SubProjectId = travelApprovalRequestDTO.SubProjectId; travelApprovalRequest.WorkTaskId = travelApprovalRequestDTO.WorkTaskId; } _context.TravelApprovalRequests.Update(travelApprovalRequest); //now update the TravelApprovalStatus Trackers var travelStatusTrackers = _context.TravelApprovalStatusTrackers.Where(e => e.TravelApprovalRequestId == travelApprovalRequest.Id).OrderBy(o => o.Id).ToList(); bool IsFirstEmail = true; foreach (var travel in travelStatusTrackers) { TravelApprovalStatusTracker travelStatusItem = await _context.TravelApprovalStatusTrackers.FindAsync(travel.Id); travelStatusItem.TravelStartDate = travelApprovalRequestDTO.TravelStartDate; travelStatusItem.TravelEndDate = travelApprovalRequestDTO.TravelEndDate; if (travelApprovalRequestDTO.DepartmentId != null) { travelStatusItem.DepartmentId = travelApprovalRequestDTO.DepartmentId; } if (travelApprovalRequestDTO.ProjectId != null) { travelStatusItem.ProjectId = travelApprovalRequestDTO.ProjectId; travelStatusItem.SubProjectId = travelApprovalRequestDTO.SubProjectId; travelStatusItem.WorkTaskId = travelApprovalRequestDTO.WorkTaskId; } travelStatusItem.ReqDate = DateTime.Now; _context.TravelApprovalStatusTrackers.Update(travelStatusItem); if (IsFirstEmail) { var approver = _context.Employees.Where(e => e.RoleId == travelStatusItem.RoleId && e.ApprovalGroupId == travelStatusItem.ApprovalGroupId).FirstOrDefault(); var approverMailAddress = approver.Email; string subject = "(Modified) Travel Approval Request No# " + travelApprovalRequestDTO.Id.ToString(); Employee emp = await _context.Employees.FindAsync(travelApprovalRequestDTO.EmployeeId); var pettycashreq = _context.TravelApprovalRequests.Find(travelApprovalRequestDTO.Id); string content = "(Modified)Travel Approval Request sought by " + emp.FirstName + "<br/>Travel Request Details <br/>Start Date: " + travelApprovalRequestDTO.TravelStartDate + "<br/>End Date: " + travelApprovalRequestDTO.TravelEndDate + "<br/>Travel Purpose: " + travelApprovalRequestDTO.TravelPurpose; var messagemail = new Message(new string[] { approverMailAddress }, subject, content); await _emailSender.SendEmailAsync(messagemail); IsFirstEmail = false; } } //_context.Entry(travelApprovalRequest).State = EntityState.Modified; try { await _context.SaveChangesAsync(); } catch (DbUpdateConcurrencyException) { throw; } return(Ok(new RespStatus { Status = "Success", Message = "Travel Approval Request Updated!" })); }