예제 #1
0
        public IChangeStatusInfo GetJobStatusInfo(IJobStatusLogModel jobStatusLog, IDayAssign dayAssign)
        {
            ChangeStatusInfo resultModel = null;

            if (IsValidLog(jobStatusLog, dayAssign))
            {
                resultModel = new ChangeStatusInfo
                {
                    ChangeStatusComment = jobStatusLog.Comment,
                    CancellationReason  = jobStatusLog.CancelingReason,
                    ChangeStatusDate    = jobStatusLog.Date,
                    UploadedFileList    = GetUploadedFileList(dayAssign)
                };

                IMemberModel member = memberService.GetById(jobStatusLog.MemberId);

                if (member != null)
                {
                    resultModel.Avatar = member.Avatar;
                    resultModel.Name   = member.Name;
                }
            }

            return(resultModel);
        }
예제 #2
0
        private bool IsValidLog(IJobStatusLogModel jobStatusLog, IDayAssign dayAssign)
        {
            bool result = jobStatusLog != null &&
                          (!string.IsNullOrEmpty(jobStatusLog.Comment) || !string.IsNullOrEmpty(jobStatusLog.CancelingReason) || dayAssign.UploadList != null && dayAssign.UploadList.Count > 0);

            return(result);
        }
예제 #3
0
        private IHistoryModel MapHistoryModelFromLog(IJobStatusLogModel log, IEnumerable <IDayAssign> dayAssigns, IEnumerable <IJob> jobs)
        {
            IDayAssign dayAssign = dayAssigns.First(t => t.Id == log.DayAssignId);
            IJob       job       = jobs.First(j => j.Id == dayAssign.JobId);

            return(GetHistoryModel(log, dayAssign, job));
        }
예제 #4
0
        private IEnumerable <string> GetCancelingReasons(IJobStatusLogModel parentLog, IEnumerable <IJobStatusLogModel> childLogs)
        {
            if (parentLog == null)
            {
                return(Enumerable.Empty <string>());
            }

            var logs = new List <IJobStatusLogModel>();

            logs.Add(parentLog);
            logs.AddRange(childLogs);

            IEnumerable <string> cancelingReasons = logs.Where(x => x.CancelingReason != null).Select(x => x.CancelingReason).Distinct();

            return(cancelingReasons);
        }
예제 #5
0
        private List <TaskInfo> GetFilledTaskInfoList(List <IDayAssign> dayAssignList, List <IJob> jobList, List <IJobStatusLogModel> jobLogList, IDictionary <Guid, ICategoryModel> categoryDictionary, bool onlyWithTime = false)
        {
            var result = new List <TaskInfo>();

            IEnumerable <Guid>         creatorIds   = jobList.Select(x => x.CreatorId).Distinct();
            IDictionary <Guid, string> creatorNames = memberService.GetMemberNames(creatorIds);

            foreach (var dayAssign in dayAssignList)
            {
                IJob job = jobList.First(x => x.Id == dayAssign.JobId);
                IJobStatusLogModel      log       = jobLogList.FirstOrDefault(x => x.DayAssignId == dayAssign.Id);
                IJobStatusLogModel      cancelLog = jobLogList.FirstOrDefault(x => x.DayAssignId == dayAssign.Id && x.StatusId == JobStatus.Canceled);
                IHousingDepartmentModel assignedHousingDepartment = managementDepartmentService.GetHousingDepartment(dayAssign.DepartmentId);
                string categoryPath = job.CategoryId != Guid.Empty ?
                                      categoryService.GetFullPathString(categoryDictionary[job.CategoryId], Constants.Common.CategoryPathDelimeter, categoryDictionary)
                    : string.Empty;
                string address = job.AddressList.Any(x => x.HousingDepartmentId == dayAssign.DepartmentId)
                    ? job.AddressList.Last(x => x.HousingDepartmentId == dayAssign.DepartmentId).Address
                    : string.Empty;

                JobStatus status = log?.StatusId ?? JobStatus.Pending;

                result.Add(new TaskInfo
                {
                    Id                    = job.Id,
                    CategoryName          = categoryPath,
                    Title                 = job.Title,
                    CompletitionDate      = log != null ? GetLogDate(log.StatusId, JobStatus.Completed, log) : string.Empty,
                    CancelingDate         = log != null ? GetLogDate(log.StatusId, JobStatus.Canceled, log) : string.Empty,
                    CancelingReason       = cancelLog != null ? cancelLog.CancelingReason : string.Empty,
                    StatusName            = status.GetStatusLabel(translationService),
                    SpentTime             = log?.TotalSpentTime ?? default(decimal),
                    CreatorName           = creatorNames[job.CreatorId],
                    TenantType            = dayAssign.TenantType.HasValue ? GetTenantTaskTypeTranslationsKey(dayAssign.TenantType.Value) : string.Empty,
                    TenantTypeEnum        = dayAssign.TenantType,
                    TaskType              = job.JobTypeId.GetTaskTypeLabel(translationService),
                    HousingDepartmentName = $"{assignedHousingDepartment.SyncDepartmentId} {assignedHousingDepartment.Name}",
                    Address               = address,
                    OriginalTaskId        = job.ParentId
                });
            }

            return(result);
        }
예제 #6
0
        public void Save(Guid dayAssignId, JobStatus statusId, string comment, List <IMemberSpentTimeModel> timeLogList, Guid?cancelingReasonId, Guid[] uploadedFileIds, Guid?creatorId)
        {
            IMemberModel currentUser = creatorId == null?memberService.GetCurrentUser() : memberService.GetById(creatorId.Value);

            IJobStatusLogModel previousStatusLog = GetLatestJobStatusLog(dayAssignId);

            JobStatusLog jobStatusLog = new JobStatusLog
            {
                DayAssignId      = dayAssignId,
                MemberId         = currentUser.MemberId,
                StatusId         = statusId,
                Date             = DateTime.Now,
                Comment          = comment,
                PreviousStatusId = previousStatusLog?.Id ?? Guid.Empty,
                TimeLogList      = timeLogList?.Select(GetMemberTimeModel) ?? new List <TimeLog>(),
                CancellingId     = cancelingReasonId,
                UploadedFileIds  = uploadedFileIds
            };

            jobStatusLogRepository.Save(jobStatusLog);
        }
예제 #7
0
        private ICancelingReasonDataModel GetCancelingReasonDataModel(IDayAssign dayAssign, IEnumerable <IJobStatusLogModel> jobStatusLogs, IEnumerable <IJob> jobs,
                                                                      Dictionary <Guid, string> creatorNames, IEnumerable <IHousingDepartmentModel> housingDepartments)
        {
            List <IJobStatusLogModel> jobStatusLogList = jobStatusLogs.Where(x => x.DayAssignId == dayAssign.Id).ToList();

            IJobStatusLogModel unassignedLog = jobStatusLogList
                                               .OrderByDescending(log => log.Date)
                                               .FirstOrDefault(x => x.StatusId == JobStatus.Rejected);

            if (unassignedLog == null)
            {
                return(null);
            }

            IJob job = jobs.First(x => x.Id == dayAssign.JobId);
            IHousingDepartmentModel housingDepartment = housingDepartments.First(x => x.Id == dayAssign.DepartmentId);

            decimal    totalTimeSpent         = (decimal)jobStatusLogList.SelectMany(x => x.TimeLogList).Sum(y => y.SpentTime.TotalHours);
            Guid       managementDepartmentId = managementDepartmentService.GetParentManagementId(dayAssign.DepartmentId);
            JobAddress addressModel           = job.AddressList.FirstOrDefault(x => x.HousingDepartmentId == dayAssign.DepartmentId);

            return(new CancelingReasonDataModel
            {
                HousingDepartmentId = dayAssign.DepartmentId,
                DayAssignId = dayAssign.Id,
                ReasonId = unassignedLog.CancelingId ?? Guid.Empty,
                ManagementDepartmentId = managementDepartmentId,
                RejectionDate = unassignedLog.Date.ToString(Constants.DateTime.CsvDateFormat),
                Reason = unassignedLog.CancelingReason,
                SpentTime = totalTimeSpent,
                JobId = job.Id,
                Title = job.Title,
                HousingDepartmentName = housingDepartment.DisplayName,
                Address = addressModel?.Address,
                CreatorName = creatorNames[job.CreatorId],
                TenantType = dayAssign.TenantType.HasValue ? dayAssign.TenantType.Value.GetTenantTypeTaskLabel(translationService) : string.Empty,
                StatusName = dayAssign.StatusId.GetStatusLabel(translationService)
            });
        }
예제 #8
0
        private List <IFileModel> GetUploadedFiles(IDayAssign dayAssign, IJobStatusLogModel log)
        {
            List <IFileModel> result = new List <IFileModel>();

            if (log.UploadedFileIds != null)
            {
                foreach (Guid uploadedFileId in log.UploadedFileIds)
                {
                    UploadFileModel uploadedFileModel =
                        dayAssign.UploadList.FirstOrDefault(l => l.FileId == uploadedFileId);
                    if (uploadedFileModel != null)
                    {
                        FileModel fileModel = new FileModel
                        {
                            FileName = uploadedFileModel.FileName,
                            FileUrl  = GetUploadedFileLink(uploadedFileModel, dayAssign.Id)
                        };
                        result.Add(fileModel);
                    }
                }
            }

            return(result);
        }
예제 #9
0
        private IHistoryModel GetHistoryModel(IJobStatusLogModel log, IDayAssign dayAssign, IJob job)
        {
            var summarizedReportedTime = GetSummarizedReportedTime(log);

            return(new HistoryModel
            {
                JobCreationDate = job.CreationDate,
                JobStatus = log.StatusId,
                ChangeStatusComment = log.Comment,
                ChangeStatusDate = log.Date,
                Title = new string(job.Title.Take(200).ToArray()),
                JobComment = dayAssign.Comment,
                ResidentName = dayAssign.ResidentName,
                DayAssignId = dayAssign.Id,
                JobId = job.Id,
                JobHousingDepartmentId = dayAssign.DepartmentId,
                UserNameWhoChangedStatus = GetMemberName(log.MemberId),
                ReportedHours = summarizedReportedTime.Hours,
                ReportedMinutes = summarizedReportedTime.Minutes,
                Address = job.GetAddress(dayAssign.DepartmentId),
                UploadedFiles = GetUploadedFiles(dayAssign, log),
                CancellationReason = log.CancelingReason
            });
        }
예제 #10
0
 private TimeSpan GetSummarizedReportedTime(IJobStatusLogModel log)
 {
     return(log.TimeLogList.Aggregate(default(TimeSpan), (acc, timeLog) => acc + timeLog.SpentTime));
 }
예제 #11
0
        private IEnumerable <string> GetCancelingReasons(IJobStatusLogModel log)
        {
            string result = log?.CancelingReason ?? string.Empty;

            return(new [] { result });
        }
예제 #12
0
 private string GetLogDate(JobStatus currentStatus, JobStatus status, IJobStatusLogModel log)
 {
     return(currentStatus == status?log.Date.ToString(Constants.DateTime.CsvDateFormat) : string.Empty);
 }
예제 #13
0
        private TaskInfo GetTaskInfo(IDayAssign dayAssign, Action <TaskInfo> groupingFiller, IJob job, IJobStatusLogModel log)
        {
            JobStatus status = log?.StatusId ?? JobStatus.Pending;

            var model = new TaskInfo
            {
                Id               = job.Id,
                Title            = job.Title,
                TaskType         = job.JobTypeId.GetTaskTypeLabel(translationService),
                StatusName       = status.GetStatusLabel(translationService),
                SpentTime        = log?.TotalSpentTime ?? default(decimal),
                CompletitionDate = log != null?GetLogDate(log.StatusId, JobStatus.Completed, log) : string.Empty,
                                       RejectionDate = log != null?GetLogDate(log.StatusId, JobStatus.Canceled, log) : string.Empty,
                                                           CreatorName    = memberService.GetById(job.CreatorId).Name,
                                                           TenantTypeEnum = dayAssign.TenantType
            };

            groupingFiller(model);
            return(model);
        }