private async Task <bool> CommandPunchTodayIsOffAsync(IDialogContext context, Command command) { if (_currentUser == null) { await context.PostAsync("ユーザー登録されている人のみ使える機能です。"); return(false); } var usecase = new MainUsecase(_currentUser); var stateEntity = await usecase.GetCurrentUserStatus(); // 「今日は休み」と言われたら、 AskingEoW でなくともその日は休日にする if (_currentUser != null && stateEntity != null) { // 今日を休みに更新 await usecase.PunchTodayIsOff(stateEntity); var ymd = Yyyymmdd.Parse(stateEntity.TargetDate, _currentUser.TimeZoneId); await context.PostAsync($"今日はお休みなのですね、分かりました。" + $"今日({ymd.FormatMd()})はもう聞きません。よい休日をお過ごし下さい。"); } else { await context.PostAsync($"今は仕事の終わりを聞いていません。よい休日をお過ごし下さい。"); } return(false); }
private async Task <bool> CommandAnswerToDoNotAskTodayAsync(IDialogContext context, Command command) { if (_currentUser == null) { await context.PostAsync("ユーザー登録されている人のみ使える機能です。"); return(false); } var usecase = new MainUsecase(_currentUser); var stateEntity = await usecase.GetCurrentUserStatus(); // 終業かを問い合わせ中なら、 // (y:終わった/n:終わってない/d:今日は徹夜)に応答する。 if ((stateEntity?.State ?? AskingState.None) == AskingState.AskingEoW) { // 今日はもう聞かないにして更新 await usecase.PunchDoNotAskToday(stateEntity); var ymd = Yyyymmdd.Parse(stateEntity.TargetDate, _currentUser.TimeZoneId); await context.PostAsync($"分かりました。今日({ymd.FormatMd()})はもう聞きません。"); } else { await context.PostAsync($"今は仕事の終わりを聞いていません。"); } return(false); }
public async Task ModifyTimecard(string yyyymmdd, string eoWTime) { var ymd = Yyyymmdd.Parse(yyyymmdd, _currentUser.TimeZoneId); if (ymd.isEmpty) { Trace.WriteLine($"ModifyTimecard parse ymd failed - {yyyymmdd}"); return; } // なしと言われたら該当日のタイムカードを削除 if (eoWTime.Contains("なし")) { await _monthlyTimecardRepo.DeleteTimecardRecord(_currentUser.UserId, ymd); // ユーザーのタイムゾーンでの現在時刻 var tzUser = TimeZoneInfo.FindSystemTimeZoneById(_currentUser.TimeZoneId); var nowUserTz = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzUser); var today = Yyyymmdd.FromDate(nowUserTz); // 削除日が今日だったら、また聞き始めるようにステータスを削除する if (ymd.Equals(today)) { var stateEntity = await _conversationStateRepo.GetStatusByUserId(_currentUser.UserId); if (stateEntity != null) { stateEntity.State = AskingState.None; await _conversationStateRepo.UpsertState(stateEntity); } } } else { // 該当日のタイムカードを更新または追加 var hhmm = Hhmm.Parse(eoWTime); if (hhmm.IsEmpty) { Trace.WriteLine($"ModifyTimecard parse hhmm failed - {hhmm}"); return; } await PunchEoW(ymd, hhmm); } }
public async Task PunchEoW(Yyyymmdd ymd, Hhmm hm) { // 指定された日付の終業時刻を、指定された時刻で更新する var monthlyTimecardRepo = new MonthlyTimecardRepository(); await monthlyTimecardRepo.UpsertTimecardRecord(_currentUser.UserId, ymd, hm); // 当日ならもう聞かないようにステータスを打刻済みに更新 var stateEntity = await _conversationStateRepo.GetStatusByUserId(_currentUser.UserId); var targetYmd = Yyyymmdd.Parse(stateEntity.TargetDate, _currentUser.TimeZoneId); if (stateEntity != null && ymd.Equals(targetYmd)) { stateEntity.State = AskingState.Punched; await _conversationStateRepo.UpsertState(stateEntity); } return; }
PunchEoW(ConversationStateEntity stateEntity) { var hhmm = Hhmm.Parse(stateEntity.TargetTime); // 該当日のタイムカードの終業時刻を更新 var ymd = Yyyymmdd.Parse(stateEntity.TargetDate, _currentUser.TimeZoneId); if (ymd.isEmpty || hhmm.IsEmpty) { Trace.WriteLine($"PunchEoW parse ymd, hhmm failed - {ymd}, {hhmm}"); return(ymd, hhmm); } var monthlyTimecardRepo = new MonthlyTimecardRepository(); await monthlyTimecardRepo.UpsertTimecardRecord(_currentUser.UserId, ymd, hhmm); // 打刻済みにして更新 stateEntity.State = AskingState.Punched; await _conversationStateRepo.UpsertState(stateEntity); return(ymd, hhmm); }