Promact/slack-erp-custom-integration-mvc

View on GitHub
Slack.Automation/Promact.Core.Repository/TaskMailReportRepository/TaskMailReportRepository.cs

Summary

Maintainability
B
5 hrs
Test Coverage
using NLog;
using Promact.Core.Repository.AttachmentRepository;
using Promact.Core.Repository.BotQuestionRepository;
using Promact.Core.Repository.EmailServiceTemplateRepository;
using Promact.Core.Repository.OauthCallsRepository;
using Promact.Erp.DomainModel.ApplicationClass;
using Promact.Erp.DomainModel.DataRepository;
using Promact.Erp.DomainModel.Models;
using Promact.Erp.Util.Email;
using Promact.Erp.Util.StringConstants;
using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Threading.Tasks;

namespace Promact.Core.Repository.TaskMailReportRepository
{
    public class TaskMailReportRepository : ITaskMailReportRepository
    {
        #region Private Variables
        private readonly IRepository<TaskMail> _taskMailRepository;
        private readonly IRepository<TaskMailDetails> _taskMailDetailRepository;
        private readonly IOauthCallHttpContextRespository _oauthCallsRepository;
        private readonly IBotQuestionRepository _botQuestionRepository;
        private readonly IAttachmentRepository _attachmentRepository;
        private readonly IRepository<ApplicationUser> _userRepository;
        private readonly IEmailService _emailService;
        private readonly ApplicationUserManager _userManager;
        private readonly IStringConstantRepository _stringConstant;
        private readonly IEmailServiceTemplateRepository _emailServiceTemplate;
        private readonly ILogger _logger;
        #endregion

        #region Constructor
        public TaskMailReportRepository(IRepository<TaskMail> taskMailRepository, IStringConstantRepository stringConstant,
            IOauthCallHttpContextRespository oauthCallsRepository, IRepository<TaskMailDetails> taskMailDetailRepository,
            IAttachmentRepository attachmentRepository, IRepository<ApplicationUser> userRepository, IEmailService emailService,
            IBotQuestionRepository botQuestionRepository, ApplicationUserManager userManager,
            IEmailServiceTemplateRepository emailServiceTemplate)
        {
            _taskMailRepository = taskMailRepository;
            _stringConstant = stringConstant;
            _oauthCallsRepository = oauthCallsRepository;
            _taskMailDetailRepository = taskMailDetailRepository;
            _attachmentRepository = attachmentRepository;
            _userRepository = userRepository;
            _emailService = emailService;
            _botQuestionRepository = botQuestionRepository;
            _userManager = userManager;
            _emailServiceTemplate = emailServiceTemplate;
            _logger = LogManager.GetLogger("TaskReportModule");
        }
        #endregion

        #region Public Method
        /// <summary>
        ///Method geting Employee or list of Employees 
        /// </summary>
        /// <param name="userId"></param>
        /// <returns>list of task mail report</returns>
        public async Task<List<TaskMailReportAc>> GetUserInformationAsync(string userId)
        {
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            var user = await _userRepository.FirstAsync(x => x.Id == userId);

            //getting user information from Promact Oauth Server.
            _logger.Info("Getting user information from oauth server");
            List<UserRoleAc> userRoleAcList = await _oauthCallsRepository.GetUserRoleAsync(user.Id);
            var userInformation = userRoleAcList.First(x => x.UserName == user.UserName);
            if (userInformation.Role == _stringConstant.RoleAdmin)
            {
                //if user is admin then remove from user list. because admin dose not have any taks mail.
                userRoleAcList.Remove(userInformation);
            }
            foreach (var userRole in userRoleAcList)
            {
                TaskMailReportAc taskMailReportAc = new TaskMailReportAc(userRole.UserId, userRole.Role, userRole.Name, userEmail: userRole.UserName);
                taskMailReportAcList.Add(taskMailReportAc);
            }
            _logger.Debug("Task Report List");
            return taskMailReportAcList;
        }

        /// <summary>
        /// This Method use to fetch the task mail details.
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="role"></param>
        /// <param name="userName"></param>
        /// <param name="loginId"></param>
        /// <returns>list of task mail report with task mail details</returns>
        public async Task<List<TaskMailReportAc>> TaskMailDetailsReportAsync(string userId, string role, string userName, string loginId)
        {
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            if (role == _stringConstant.RoleAdmin || role == _stringConstant.RoleEmployee)
            {
                //getting the employee task mail reports   
                taskMailReportAcList = await GetTaskMailDetailsInformationAsync(userId, role, userName, loginId);
            }
            else if (role == _stringConstant.RoleTeamLeader)
            {
                //getting the team members information.
                List<UserRoleAc> userRoleAcList = await GetUserRoleAsync(loginId);
                //getting maximum and minimum date from the team members task mails
                var maxMinTaskMailDate = await GetMaxMinDateAsync(userRoleAcList);
                //first time there are no selected date that's why pass maxdate as a selected date.
                //getting the team members task mail reports
                taskMailReportAcList = await TaskMailDetailsAsync(role, loginId, maxMinTaskMailDate.Item1.Date, maxMinTaskMailDate.Item1.Date, maxMinTaskMailDate.Item2.Date);
            }
            return taskMailReportAcList;
        }

        /// <summary>
        /// this Method use to fetch the task mail details for the selected date.
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="userName"></param>
        /// <param name="role"></param>
        /// <param name="createdOn"></param>
        /// <param name="loginId"></param>
        /// <param name="selectedDate"></param>
        /// <returns>list of task mail report with task mail details</returns>
        public async Task<List<TaskMailReportAc>> TaskMailDetailsReportSelectedDateAsync(string userId, string userName, string role, string createdOn, string loginId, DateTime selectedDate)
        {
            _logger.Debug("In Repo Created On" + createdOn);
            _logger.Debug("In Repo Selected Date " + selectedDate);
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            if (role == _stringConstant.RoleAdmin || role == _stringConstant.RoleEmployee)
            {
                //getting the employee task mail reports for selected date  
                taskMailReportAcList = await TaskMailsDetailAsync(userId, userName, role, loginId, createdOn, selectedDate);
            }
            else if (role == _stringConstant.RoleTeamLeader)
            {
                //getting the team members information 
                List<UserRoleAc> userRoleAcList = await GetUserRoleAsync(loginId);
                //find maximum and minimum date from the team members task mails
                var maxMinTaskMailDate = await GetMaxMinDateAsync(userRoleAcList);
                //getting the team members task mail reports for selected date
                taskMailReportAcList = await TaskMailDetailsAsync(role, loginId, selectedDate.Date, maxMinTaskMailDate.Item1.Date, maxMinTaskMailDate.Item2.Date);
            }
            return taskMailReportAcList;
        }
        #endregion

        #region Private Methods

        /// <summary>
        /// Getting user information
        /// </summary>
        /// <param name="loginId"></param>
        /// <returns>fetch users role</returns>
        private async Task<List<UserRoleAc>> GetUserRoleAsync(string loginId)
        {
            //getting user information from Promact Oauth Server
            return await _oauthCallsRepository.GetListOfEmployeeAsync(loginId);
        }


        /// <summary>
        /// Getting max and min date from users task mails
        /// </summary>
        /// <param name="userRoleAcList"></param>
        /// <returns>max and min Date</returns> 
        private async Task<Tuple<DateTime, DateTime>> GetMaxMinDateAsync(List<UserRoleAc> userRoleAcList)
        {
            //getting list of userId.
            var userIdList = userRoleAcList.Select(x => x.UserId);
            //getting list of task mails using userIdList.
            var taskMails = (await _taskMailRepository.FetchAsync(x => userIdList.Contains(x.EmployeeId))).ToList();
            DateTime maxDate, minDate;
            if (taskMails.Any())
            {
                maxDate = taskMails.Max(x => x.CreatedOn);
                minDate = taskMails.Min(x => x.CreatedOn);
            }
            else
            {
                maxDate = DateTime.UtcNow;
                minDate = DateTime.UtcNow;
            }
            //getting maximum and minimum date form the team members task mails
            return new Tuple<DateTime, DateTime>(maxDate, minDate);
        }


        /// <summary>
        /// Task mail details for teamLeader
        /// </summary>
        /// <param name="role"></param>
        /// <param name="loginId"></param>
        /// <param name="selectedDate"></param>
        /// <param name="maxDate"></param>
        /// <param name="minDate"></param>
        /// <returns>list of task mail reports</returns>
        private async Task<List<TaskMailReportAc>> TaskMailDetailsAsync(string role, string loginId, DateTime selectedDate, DateTime maxDate, DateTime minDate)
        {
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            List<UserRoleAc> userRoleAcList = await GetUserRoleAsync(loginId);
            //getting the team members task mails using users information.
            foreach (var userRole in userRoleAcList)
            {
                TaskMailReportAc taskMailReportAc = await GetTaskReportAsync(userRole.UserId, role, userRole.Name, selectedDate, maxDate, minDate);
                taskMailReportAcList.Add(taskMailReportAc);
            }
            return taskMailReportAcList;
        }

        /// <summary>
        /// Getting task mail reports
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="role"></param>
        /// <param name="userName"></param>
        /// <param name="selectedDate"></param>
        /// <param name="maxDate"></param>
        /// <param name="minDate"></param>
        /// <returns>task mail report</returns>
        private async Task<TaskMailReportAc> GetTaskReportAsync(string userId, string role, string userName, DateTime selectedDate, DateTime maxDate, DateTime minDate)
        {
            _logger.Debug("In Get Task Report Async selected Date" + selectedDate);
            _logger.Debug("In Get Task Report Async max Date" + maxDate);
            _logger.Debug("In Get Task Report Async min Date" + minDate);
            TaskMailReportAc taskMailReportAc;
            var taskMail = (await _taskMailRepository.FirstOrDefaultAsync(y => y.EmployeeId == userId && DbFunctions.TruncateTime(y.CreatedOn) == DbFunctions.TruncateTime(selectedDate)));
            if (taskMail != null)
            {
                //getting the team members task mails details.
                _logger.Debug("if taskmail not null then" + taskMail.CreatedOn.Date);
                taskMailReportAc = await GetTaskMailReportAsync(userId, role, userName, taskMail.Id, taskMail.CreatedOn.Date, maxDate, minDate);
            }
            else
            {
                _logger.Debug("if taskmail not then selected date" + selectedDate.Date);
                _logger.Debug("if taskmail not then max Date" + maxDate.Date);
                _logger.Debug("if taskmail not then min Date" + minDate.Date);
                //if team member does not have any task mail than show default task mail to the end users. 
                taskMailReportAc = GetTaskMailReport(userId, role, userName, selectedDate.Date, maxDate.Date, minDate.Date);
            }
            return taskMailReportAc;
        }

        /// <summary>
        /// Task mail fetails for admin or employee 
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="userName"></param>
        /// <param name="role"></param>
        /// <param name="createdOn"></param>
        /// <param name="loginId"></param>
        /// <param name="selectedDate"></param>
        /// <returns>list of task mail reports</returns>
        private async Task<List<TaskMailReportAc>> TaskMailsDetailAsync(string userId, string userName, string role, string createdOn, string loginId, DateTime selectedDate)
        {
            _logger.Debug("Task Mail Detail Async created on" + createdOn);
            _logger.Debug("Task Mail Detail Async selected date" + selectedDate);
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            //find maximum and minimum date from the employee task mails
            IEnumerable<TaskMail> taskMails = (await _taskMailRepository.FetchAsync(x => x.EmployeeId == userId)).ToList();
            DateTime maxDate, minDate;
            if (taskMails.Any())
            {
                maxDate = taskMails.Max(x => x.CreatedOn);
                minDate = taskMails.Min(x => x.CreatedOn);
            }
            else {
                maxDate = selectedDate;
                minDate = selectedDate;
            }
            //getting task mail information.
            TaskMailReportAc taskMailReportAc = await GetTaskReportAsync(userId, role, userName, selectedDate.Date, maxDate.Date, minDate.Date);
            taskMailReportAcList.Add(taskMailReportAc);
            return taskMailReportAcList;
        }

        /// <summary>
        /// Get default task mail 
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="role"></param>
        /// <param name="userName"></param>
        /// <param name="createdOn"></param>
        /// <param name="maxDate"></param>
        /// <param name="minDate"></param>
        /// <returns>Task mail report</returns>
        private TaskMailReportAc GetTaskMailReport(string userId, string role, string userName, DateTime createdOn, DateTime maxDate, DateTime minDate)
        {
            List<TaskMailDetailReportAc> taskMailDetailReportList = new List<TaskMailDetailReportAc>();
            var taskMailDetailReportAc = new TaskMailDetailReportAc(description: _stringConstant.NotAvailable, comment: _stringConstant.NotAvailable, status: TaskMailStatus.none);
            taskMailDetailReportList.Add(taskMailDetailReportAc);
            TaskMailReportAc taskMailReportAc = new TaskMailReportAc(userId, role, userName, taskMailDetailReportList, createdOn: createdOn, maxDate: maxDate, minDate: minDate);
            return taskMailReportAc;
        }

        /// <summary>
        /// Getting taskmail details infromation
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="role"></param>
        /// <param name="userName"></param>
        /// <param name="taskId"></param>
        /// <param name="createdOn"></param>
        /// <param name="maxDate"></param>
        /// <param name="minDate"></param>
        /// <returns>List of task mail report</returns>
        private async Task<TaskMailReportAc> GetTaskMailReportAsync(string userId, string role, string userName, int taskId, DateTime createdOn, DateTime maxDate, DateTime minDate)
        {
            List<TaskMailDetailReportAc> taskMailDetailReportAcList = new List<TaskMailDetailReportAc>();
            // getting taskmail details infromation using taskId. 
            var taskMailDetailList = (await _taskMailDetailRepository.FetchAsync(x => x.TaskId == taskId));
            foreach (var taskMailDetail in taskMailDetailList)
            {
                TaskMailDetailReportAc taskmailReportAc = new TaskMailDetailReportAc(taskMailDetail.Description, taskMailDetail.Comment, id: taskMailDetail.Id, hours: taskMailDetail.Hours, status: taskMailDetail.Status);
                taskMailDetailReportAcList.Add(taskmailReportAc);
            }
            TaskMailReportAc taskMailReportAc = new TaskMailReportAc(userId, role, userName, taskMailDetailReportAcList, createdOn: createdOn, maxDate: maxDate, minDate: minDate);
            return taskMailReportAc;
        }

        /// <summary>
        /// Task mail details report information for the user role admin and employee
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="role"></param>
        /// <param name="userName"></param>
        /// <param name="loginId"></param>
        /// <returns>List task mail Report</returns>
        private async Task<List<TaskMailReportAc>> GetTaskMailDetailsInformationAsync(string userId, string role, string userName, string loginId)
        {
            List<TaskMailReportAc> taskMailReportAcList = new List<TaskMailReportAc>();
            var taskMail = (await _taskMailRepository.FetchAsync(y => y.EmployeeId == userId)).ToList();
            TaskMailReportAc taskMailReportAc;
            if (taskMail.Any())
            {
                //first time there are no selected date that's why pass maxdate as a selected date.
                taskMailReportAc = await GetTaskMailReportAsync(userId, role, userName, taskMail.OrderByDescending(y => y.CreatedOn).First().Id, taskMail.Max(x => x.CreatedOn).Date, taskMail.Max(x => x.CreatedOn).Date, taskMail.Min(x => x.CreatedOn).Date);
            }
            else
            {
                //if employee does not have any task mail than show default task mail to the end users. 
                taskMailReportAc = GetTaskMailReport(userId, role, userName, DateTime.UtcNow.Date, DateTime.UtcNow.Date, DateTime.UtcNow.Date);
            }
            taskMailReportAcList.Add(taskMailReportAc);
            return taskMailReportAcList;
        }

        #endregion
    }
}