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)); }
public void DeleteWorkingTime(WorkingTimeRange workingTimeRange) { //Task.Delay(TimeSpan.FromSeconds(3)) // .ContinueWith((t, _) => IsSample4DialogOpen = false, null, // TaskScheduler.FromCurrentSynchronizationContext()); _Model.DeleteWorkingTime(workingTimeRange); }
public void Edit(WorkingTimeRange workingTimeRange) { RepositoryAction.Transaction((c, t) => { var row = WorkingTimeTableRow.FromDomainObject(workingTimeRange); var dao = new WorkingTimeDao(c, t); dao.Update(row); }); }
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") ?? "", }); }
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); }
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); }
/// <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 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); } }
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()); }
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)); }
public void DeleteWorkingTime(WorkingTimeRange target) { _WorkingTimeRangeUseCase.DeleteWorkingTimeRange(target.Id); ObjectChangedNotificator.Instance.NotifyWorkTaskEdited(); }
public void EditWorkingTime(WorkingTimeRange target) { _WorkingTimeRangeUseCase.EditWorkingTimeRange(target.Id, target.TimePeriod.StartDateTime, target.TimePeriod.EndDateTime); ObjectChangedNotificator.Instance.NotifyWorkTaskEdited(); }
public void AddWorkingTime(WorkingTimeRange timeRange) { _WorkingTimeRanges.Add(timeRange); }