public WorkingTimeRecordForReport[] Get(YmdString ymdString)
        {
            var yearMonth = YearMonth.FromYmdString(ymdString);

            var headers = _DailyWorkRecordQueryService.SelectByYearMonth(yearMonth);

            return(headers.WorkingTimeRecordForReports
                   .Where(h => h.Ymd.Equals(ymdString))
                   .OrderBy(h => h.StartDateTime)
                   .ToArray());
        }
예제 #2
0
        public WorkTaskWithTimesDto[] SelectByYmd(YmdString ymd, bool containsCompleted)
        {
            var list = new List <WorkTaskWithTimesDto>();

            RepositoryAction.Query(c =>
            {
                var workTaskDao    = new WorkTaskDao(c, null);
                var workingTimeDao = new WorkingTimeDao(c, null);
                var processes      = new WorkProcessDao(c, null).SelectAll();
                var products       = new ProductDao(c, null).SelectAll();
                var clients        = new ClientDao(c, null).SelectAll();
                var completedDao   = new WorkTaskCompletedDao(c, null);

                var tasks     = workTaskDao.SelectPlaned(ymd, containsCompleted);
                var times     = workingTimeDao.SelectByTaskIds(tasks.Select(t => t.Id).Distinct().ToArray());
                var completed = completedDao.SelectCompleted(tasks.Select(t => t.Id).Distinct().ToArray());

                foreach (var task in tasks)
                {
                    var dto = new WorkTaskWithTimesDto
                    {
                        TaskId       = new Identity <Domain.Domain.Tasks.WorkTask>(task.Id),
                        ClientName   = clients.FirstOrDefault(c => c.Id == task.ClientId)?.Name ?? "",
                        ProcessName  = processes.FirstOrDefault(p => p.Id == task.ProcessId)?.Title ?? "",
                        ProductName  = products.FirstOrDefault(p => p.Id == task.ProductId)?.Name ?? "",
                        TaskCategory = task.TaskCategory,
                        Title        = task.Title,
                        IsCompleted  = completed.Any(c => c == task.Id),
                        IsScheduled  = task.TaskSource == Domain.Domain.Tasks.TaskSource.Schedule,
                    };

                    dto.WorkingTimes = times.Where(t => t.TaskId == task.Id)
                                       .Select(t => t.ToDomainObject())
                                       .OrderBy(t => t.TimePeriod.StartDateTime)
                                       .ThenBy(t => t.Id)
                                       .ToArray();

                    list.Add(dto);
                }
            });

            try
            {
                return(list.OrderBy(i => i.WorkingTimes.Any(t => t.IsDoing) ? 0 : 1)
                       .ThenByDescending(i => i.WorkingTimes.Where(t => t.TimePeriod.IsFuture == false).Any() ? i.WorkingTimes.Where(t => t.TimePeriod.IsFuture == false).Max(t => t.TimePeriod.StartDateTime) : DateTime.MinValue)
                       .ThenBy(i => i.WorkingTimes.Where(t => t.TimePeriod.IsFuture).Any() ? i.WorkingTimes.Where(t => t.TimePeriod.IsFuture).Min(t => t.TimePeriod.StartDateTime) : DateTime.MaxValue)
                       .ThenBy(i => i.TaskId.Value).ToArray());
            }
            catch (Exception)
            {
                return(list.ToArray());
            }
        }
예제 #3
0
        /// <summary>
        /// 作業時間の記録に利用するためのタスクを取得します
        /// </summary>
        /// <param name="ymd">日付</param>
        /// <returns></returns>
        public WorkTaskTableRow[] SelectPlaned(YmdString ymd, bool containsCompleted)
        {
            var where = "";

            if (containsCompleted)
            {
                where = "( id IN ( select taskid from workingtimes where ymd = @ymd ) OR actualenddatetime IS NULL )";
            }
            else
            {
                where = "actualenddatetime IS NULL";
            }

            return(SelectCore(where, new { ymd = ymd.Value }).ToArray());
        }
예제 #4
0
        /// <summary>
        /// 指定した日付の予定をタスクとして取り込みます
        /// </summary>
        /// <param name="ymdString">取り込み対象日付</param>
        /// <returns></returns>
        public async Task <WorkTask[]> ImportToTaskAsync(YmdString ymdString)
        {
            try
            {
                _Logger.Info($"[ScheduleImporter] ▼スケジュール取り込み開始 target=[{ymdString}]");

                // イベントの取得
                var fromDateTime = ymdString.ToDateTime().Value;
                var toDateTime   = fromDateTime.AddDays(1).AddMinutes(-1);
                var targetKinds  = _WorkTaskBuilderConfig.EventMappers.Select(e => e.EventKind).ToArray();
                var events       = await _ScheduledEventRepository.FetchScheduledEventsAsync(targetKinds, fromDateTime, toDateTime);

                if (events == null)
                {
                    _Logger.Error("[ScheduleImporter] unknown error");
                    return(Array.Empty <WorkTask>());
                }

                // 未登録のイベントを取り込み
                var registedWorkTasks = _WorkTaskRepository.SelectByImportKeys(events.Select(e => e.Id).ToArray());

                var list    = new List <WorkTask>();
                var builder = new WorkTaskBuilder(_WorkTaskBuilderConfig, _ScheduleTitleMaps);
                foreach (var @event in events)
                {
                    // 登録済みは無視する
                    if (registedWorkTasks.Any(t => t.ImportKey == @event.Id))
                    {
                        continue;
                    }

                    // 未登録ならスケジュールに合わせて登録
                    (WorkTask workTask, ImportedTask importedTask) = builder.Build(@event);
                    workTask = _WorkTaskRepository.AddForSchedule(workTask, importedTask);
                    list.Add(workTask);

                    var newWorkingTime = WorkingTimeRange.FromScheduledEvent(workTask.Id, @event);
                    _WorkingTimeRangeRepository.Add(newWorkingTime);
                }

                return(list.ToArray());
            }
            finally
            {
                _Logger.Info($"[ScheduleImporter] ▲スケジュール取り込み終了 target=[{ymdString}]");
            }
        }
        public async Task <WorkTask[]> ImportToTaskAsync(YmdString ymdString)
        {
            // イベントの取得
            var fromDateTime = ymdString.ToDateTime().Value;
            var toDateTime   = fromDateTime.AddDays(1).AddMinutes(-1);
            var targetKinds  = _WorkTaskBuilderConfig.EventMappers.Select(e => e.EventKind).ToArray();
            var events       = await _ScheduledEventRepository.FetchScheduledEventsAsync(targetKinds, fromDateTime, toDateTime);

            if (events == null)
            {
                return(new WorkTask[0]);
            }

            // 未登録のイベントを取り込み
            var registedWorkTasks = _WorkTaskRepository.SelectByImportKeys(events.Select(e => e.Id).ToArray());

            var list    = new List <WorkTask>();
            var builder = new WorkTaskBuilder(_WorkTaskBuilderConfig, _ScheduleTitleMaps);

            foreach (var @event in events)
            {
                // 登録済みは無視する
                if (registedWorkTasks.Any(t => t.ImportKey == @event.Id))
                {
                    continue;
                }

                // 未登録ならスケジュールに合わせて登録
                var workTask = builder.Build(@event);
                workTask = _WorkTaskRepository.Add(workTask);
                list.Add(workTask);

                var newWorkingTime = WorkingTimeRange.FromScheduledEvent(workTask.Id, @event);
                _WorkingTimeRangeRepository.Add(newWorkingTime);
            }

            return(list.ToArray());
        }
예제 #6
0
        /// <summary>
        /// 作業時間の記録に利用するためのタスクを取得します
        /// </summary>
        /// <param name="ymd">日付</param>
        /// <returns></returns>
        public WorkTaskTableRow[] SelectPlaned(YmdString ymd, bool containsCompleted)
        {
            string where;
            object param;

            if (containsCompleted)
            {
                where = @"
( id IN ( SELECT worktaskid FROM worktaskscompleted WHERE registdatetime BETWEEN @start AND @end ) 
  OR NOT EXISTS ( SELECT 1 FROM worktaskscompleted WHERE worktaskid = worktasks.id )
)";
                param = new { start = ymd.ToDateTime().Value, end = ymd.ToDateTime().Value.AddDays(1).AddMinutes(-1) };
            }
            else
            {
                where = @"
NOT EXISTS ( 
  SELECT 1 FROM worktaskscompleted WHERE worktaskid = worktasks.id 
)";

                param = new object();
            }
            return(SelectCore(where, param).ToArray());
        }
예제 #7
0
 public WorkTaskWithTimesDto[] GetByYmd(YmdString ymdString, bool containsCompleted)
 {
     return(_WorkTaskWithTimesQueryService.SelectByYmd(ymdString, containsCompleted));
 }
예제 #8
0
 public WorkingHour GetWorkingHour(YmdString ymd)
 {
     return(_WorkingHourRepository.SelectYmd(ymd));
 }
예제 #9
0
 public WorkingHour(YmdString ymd, DateTime?startTime, DateTime?endTime)
 {
     Ymd       = ymd;
     StartTime = startTime;
     EndTime   = endTime;
 }
예제 #10
0
 public WorkingHour SelectYmd(YmdString ymd)
 {
     throw new NotImplementedException();
 }