public ValidationResult IsSatisfiedBy(WorkingTimeRange workingTimeRange)
        {
            if (workingTimeRange.TaskId == null)
            {
                return(new ValidationResult("タスクが割り当てられていません"));
            }

            var timeRangesAtSameday = _WorkingTimeRangeRepository.SelectByYmd(workingTimeRange.TimePeriod.TargetYmd)
                                      .Where(t => t.Id != workingTimeRange.Id)
                                      .ToArray();

            // 調整中...
            // 時間の重複チェック
            // 自身以外の作業時間と重複していないか
            //var overlapTimes = timeRangesAtSameday.Where(t => t.TimePeriod.IsOverlapped(workingTimeRange.TimePeriod)).ToArray();
            //if (overlapTimes.Any())
            //{

            //    return new ValidationResult("");
            //}

            // 新規登録の場合のみ
            if (workingTimeRange.Id.IsTemporary)
            {
                // 終了時間未設定のタスクがあればNG
                if (timeRangesAtSameday.Any(t => t.TimePeriod.IsStopped == false))
                {
                    return(new ValidationResult("未完了のタスクが残っています"));
                }
            }

            return(ValidationResult.Success);
        }
        public WorkingTimeRange StartWorking(Identity <WorkTask> id)
        {
            var targetTask = _WorkTaskRepository.SelectById(id);

            if (targetTask == null)
            {
                throw new NotFoundException("開始対象のタスクがみつかりませんでした");
            }

            // 実行中のタスクがあれば終了する
            var today   = SystemClockServiceLocator.Current.Now.ToString("yyyyMMdd");
            var working = _WorkingTimeRangeRepository.SelectByYmd(today).FirstOrDefault(w => w.IsDoing);

            if (working != null)
            {
                StopWorkingCore(working);
            }

            if (targetTask.IsCompleted)
            {
                _WorkTaskCompletionCommand.ReStartTask(id);
            }

            var newWorkingTime = WorkingTimeRange.ForStart(id);

            var validationResult = _WorkingTimeRegistSpecification.IsSatisfiedBy(newWorkingTime);

            if (validationResult != null)
            {
                throw new SpecificationCheckException(validationResult);
            }

            return(_WorkingTimeRangeRepository.Add(newWorkingTime));
        }
예제 #3
0
        public void DeleteWorkingTime(WorkingTimeRange workingTimeRange)
        {
            //Task.Delay(TimeSpan.FromSeconds(3))
            //    .ContinueWith((t, _) => IsSample4DialogOpen = false, null,
            //        TaskScheduler.FromCurrentSynchronizationContext());

            _Model.DeleteWorkingTime(workingTimeRange);
        }
예제 #4
0
 public void Edit(WorkingTimeRange workingTimeRange)
 {
     RepositoryAction.Transaction((c, t) =>
     {
         var row = WorkingTimeTableRow.FromDomainObject(workingTimeRange);
         var dao = new WorkingTimeDao(c, t);
         dao.Update(row);
     });
 }
예제 #5
0
 public static WorkingTimeTableRow FromDomainObject(WorkingTimeRange workingTimeRange)
 {
     return(new WorkingTimeTableRow
     {
         Id = workingTimeRange.Id.Value,
         TaskId = workingTimeRange.TaskId.Value,
         Ymd = workingTimeRange.TimePeriod.TargetYmd,
         StartTime = workingTimeRange.TimePeriod.StartDateTime.ToString("HHmmss"),
         EndTime = workingTimeRange.TimePeriod.EndDateTime?.ToString("HHmmss") ?? "",
     });
 }
예제 #6
0
        public WorkingTimeRange SelectById(Identity <WorkingTimeRange> id)
        {
            WorkingTimeRange result = null;

            RepositoryAction.Query(c =>
            {
                var dao = new WorkingTimeDao(c, null);

                result = dao.SelectId(id.Value)?.ToDomainObject();
            });

            return(result);
        }
예제 #7
0
        public WorkingTimeRange Add(WorkingTimeRange workingTimeRange)
        {
            var row = WorkingTimeTableRow.FromDomainObject(workingTimeRange);

            RepositoryAction.Transaction((c, t) =>
            {
                var dao = new WorkingTimeDao(c, t);
                var id  = dao.Insert(row);

                // ID採番結果
                row.Id = id;
            });

            return(row.ToDomainObject());
        }
        public WorkingTimeViewModel(WorkingTimeRange workingTimeRange)
        {
            DomainModel = workingTimeRange;

            TargetDate = new ReactivePropertySlim <DateTime>(DomainModel.TimePeriod.StartDateTime);

            StartTimeText = new ReactiveProperty <string>(DomainModel.TimePeriod.StartDateTime.ToString("HHmm"))
                            .SetValidateNotifyError(x => string.IsNullOrEmpty(x) ? "入力必須です" : null)
                            .SetValidateNotifyError(x => DateTimeParser.ConvertFromHHmm(x).HasValue == false ? "HHmm形式で入力してください" : null)
                            .AddTo(CompositeDisposable);

            EndTimeText = new ReactiveProperty <string>(DomainModel.TimePeriod.EndDateTime?.ToString("HHmm") ?? "")
                          .SetValidateNotifyError(x => string.IsNullOrEmpty(x) == false && DateTimeParser.ConvertFromHHmm(x).HasValue == false ? "HHmm形式で入力してください" : null)
                          .AddTo(CompositeDisposable);
        }
예제 #9
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}]");
            }
        }
예제 #10
0
        public async void EditWorkingTime(WorkingTimeRange workingTimeRange)
        {
            var editDialogVm = new WorkingTimeRangeEditDialogViewModel(workingTimeRange);

            var view = new WorkingTimeRangeEditDialog
            {
                DataContext = editDialogVm
            };

            //show the dialog
            var result = (bool?)await DialogHost.Show(view);

            if (result.HasValue && result.Value)
            {
                var editObj = editDialogVm.WorkingTimeViewModel.DomainModel;
                _Model.EditWorkingTime(editObj);
            }
        }
        private void StopWorkingCore(WorkingTimeRange target)
        {
            var targetTask = _WorkTaskRepository.SelectById(target.TaskId);

            if (targetTask == null)
            {
                throw new NotFoundException("終了対象のタスクがみつかりませんでした");
            }

            target.Stop();
            _WorkingTimeRangeRepository.Edit(target);

            // 割り込みタスクであればそのまま完了させる
            if (targetTask.IsTemporary)
            {
                _WorkTaskCompletionCommand.CompleteWorkTask(target.TaskId);
            }
        }
예제 #12
0
        public async void AddWorkingTime()
        {
            var selectedDate = MainWindowViewModel.Instance.Contents.OfType <WorkUnitRecorderViewModel>().First().TargetDateTime.Value.Date;

            var now = SystemClockServiceLocator.Current.Now;
            var workingTimeRange = WorkingTimeRange.ForEdit(Dto.TaskId, now, now);

            if (now.Date == selectedDate)
            {
                // もう少しお行儀のいい書き方はないものか...
                var usecase  = new GetWorkingTimeForTimelineUseCase(ContainerHelper.Resolver.Resolve <IWorkingTimeQueryService>());
                var list     = usecase.SelectByYmd(selectedDate.ToYmd());
                var lastTime = list.Where(i => i.TimePeriod.IsFuture == false)
                               .Where(i => i.TimePeriod.IsStopped)
                               .OrderBy(i => i.TimePeriod.EndDateTime.Value)
                               .LastOrDefault();
                if (lastTime != null)
                {
                    workingTimeRange = WorkingTimeRange.ForEdit(Dto.TaskId, lastTime.TimePeriod.EndDateTime.Value.AddMinutes(1), null);
                }
            }
            else
            {
                workingTimeRange = WorkingTimeRange.ForEdit(Dto.TaskId, selectedDate, selectedDate);
            }

            var editDialogVm = new WorkingTimeRangeEditDialogViewModel(workingTimeRange);

            var view = new WorkingTimeRangeEditDialog
            {
                DataContext = editDialogVm
            };

            //show the dialog
            var result = (bool?)await DialogHost.Show(view);

            if (result.HasValue && result.Value)
            {
                var editObj = editDialogVm.WorkingTimeViewModel.DomainModel;
                _Model.AddWorkingTime(editObj);
            }
        }
        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());
        }
예제 #14
0
 public WorkingTimeRangeEditDialogViewModel(WorkingTimeRange workingTimeRange)
 {
     DomainModel          = workingTimeRange;
     WorkingTimeViewModel = new WorkingTimeViewModel(workingTimeRange);
 }
 /// <summary>
 /// 作業時間を追加します(入力し忘れ対応)
 /// </summary>
 /// <param name="workingTimeRange"></param>
 /// <returns></returns>
 public WorkingTimeRange AddWorkingTimeRange(WorkingTimeRange workingTimeRange)
 {
     return(_WorkingTimeRangeRepository.Add(workingTimeRange));
 }
예제 #16
0
 public void DeleteWorkingTime(WorkingTimeRange target)
 {
     _WorkingTimeRangeUseCase.DeleteWorkingTimeRange(target.Id);
     ObjectChangedNotificator.Instance.NotifyWorkTaskEdited();
 }
예제 #17
0
 public void EditWorkingTime(WorkingTimeRange target)
 {
     _WorkingTimeRangeUseCase.EditWorkingTimeRange(target.Id, target.TimePeriod.StartDateTime, target.TimePeriod.EndDateTime);
     ObjectChangedNotificator.Instance.NotifyWorkTaskEdited();
 }
예제 #18
0
 public void AddWorkingTime(WorkingTimeRange timeRange)
 {
     _WorkingTimeRanges.Add(timeRange);
 }