public async Task <IActionResult> CreateManagerReport(short id)
        {
            var report  = _reportData.Get(id);
            var manager = await _userManager.FindByNameAsync(User.Identity.Name);

            var managerReport = _managerReportData.GetManagerReportByUserReportId(id, manager.Id);

            if (report == null)
            {
                return(NotFound());
            }
            if (!report.ProjectManagers.Any(pm => pm.ManagerId == manager.Id)) //If current user is not manager of loaded report
            {
                return(RedirectToAction("AccessDenied", "Home"));
            }
            var reportModel = new ReportViewModel
            {
                Id              = report.Id,
                Title           = report.Title,
                Author          = report.Author,
                ProjectName     = report.Project.Title,
                ActvivityName   = report.Activity.Name,
                SubActivityName = report.SubActivity != null ? report.SubActivity.Name : null,
                Text            = report.Text,
                TaskStartTime   = report.TaskStartTime,
                TaskEndTime     = report.TaskEndTime,
                Date            = report.Date.ToHijri(),
                AttachmentName  = report.AttachmentName != null ? report.AttachmentName : null
            };
            var managerReportViewModel = new ManagerReportViewModel {
                UserReport = reportModel
            };

            if (managerReport != null)
            {
                managerReportViewModel.Id               = managerReport.Id;
                managerReportViewModel.Text             = managerReport.Text;
                managerReportViewModel.IsAcceptable     = managerReport.IsUserReportAcceptable;
                managerReportViewModel.IsViewableByUser = managerReport.IsCommentViewableByUser;
            }
            return(View(managerReportViewModel));
        }
        public async Task <IActionResult> CreateManagerReport(ManagerReportViewModel model)
        {
            var manager = await _userManager.FindByNameAsync(User.Identity.Name);

            var           managerReport = _managerReportData.GetManagerReportByUserReportId(model.UserReport.Id, manager.Id);
            ManagerReport savedManagerReport;

            if (ModelState.IsValid)
            {
                if (managerReport == null) //means that user creating a new manager report
                {
                    managerReport = new ManagerReport
                    {
                        Date   = DateTime.Now,
                        Author = manager,
                        Text   = model.Text,
                        IsUserReportAcceptable  = model.IsAcceptable,
                        IsCommentViewableByUser = model.IsViewableByUser,
                        ReportId = model.UserReport.Id
                    };
                    savedManagerReport = _managerReportData.Add(managerReport);
                    if (savedManagerReport == null)
                    {
                        ModelState.AddModelError("", "مشکل در ثبت گزارش!");
                        return(View(model));
                    }
                    //Change the report status to viewed
                    var result = _reportData.SetViewed(model.UserReport.Id, manager.Id);
                    if (!result)
                    {
                        ModelState.AddModelError("", "مشکل در ثبت گزارش!");
                        return(View(model));
                    }
                }
                else //means user updating manager report
                {
                    savedManagerReport = managerReport;
                    managerReport.Text = model.Text;
                    managerReport.IsUserReportAcceptable  = model.IsAcceptable;
                    managerReport.IsCommentViewableByUser = model.IsViewableByUser;
                    var result = _managerReportData.Update(managerReport);
                    if (result == false)
                    {
                        ModelState.AddModelError("", "مشکل در بروزرسانی!");
                        return(View(model));
                    }
                    //Change the report status to viewed
                    var setViewedResult = _reportData.SetViewed(model.UserReport.Id, manager.Id);
                    if (!setViewedResult)
                    {
                        ModelState.AddModelError("", "مشکل در ثبت گزارش!");
                        return(View(model));
                    }
                }

                //Notify user if manager report is viewable by user
                if (model.IsViewableByUser)
                {
                    var message = new Message
                    {
                        Title  = "گزارش مدیر :: " + model.UserReport.Title,
                        Text   = model.Text,
                        Sender = manager,
                        Type   = MessageType.Manager_Review_Notification,
                        Time   = DateTime.Now,
                    };
                    _messageService.AddManagerReviewMessage(message, savedManagerReport.Id, model.UserReport.Author.Id);
                }
                else
                {
                    _messageService.DeleteManagerReviewMessage(savedManagerReport.Id);
                }
                return(RedirectToAction("ManageReports", "Manager"));
            }
            return(View(model));
        }