Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        /// <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();
        }
    }