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 PunchTodayIsOff(ConversationStateEntity stateEntity) { // 今日は休み にして更新 stateEntity.State = AskingState.TodayIsOff; await _conversationStateRepo.UpsertState(stateEntity); // もし終業時刻が登録済みだったら削除する var tzUser = TimeZoneInfo.FindSystemTimeZoneById(_currentUser.TimeZoneId); var nowUserTz = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzUser); // ユーザーのタイムゾーンでの現在時刻 await _monthlyTimecardRepo.DeleteTimecardRecord(_currentUser.UserId, Yyyymmdd.FromDate(nowUserTz)); }
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 UpsertTimecardRecord(string userId, Yyyymmdd ymd, Hhmm hm) { // 既存の月次タイムカードを得る var monthlyTimecardEntity = await GetMonthlyTimecardsByYearMonth(userId, ymd.Year, ymd.Month); IList <TimecardRecord> timecardRecords = new List <TimecardRecord>(); if (monthlyTimecardEntity == null) { // 得られなかったら新たに月次タイムカードを作る monthlyTimecardEntity = new MonthlyTimecardEntity(_paritionKey, userId, $"{ymd.Year:0000}{ymd.Month:00}"); } else { // 得られたら、月次タイムカード内にJsonで入っている各日のタイムカード情報をデシリアライズして得る timecardRecords = monthlyTimecardEntity.GetTimecardsAsList(); } // 月次タイムカード内の各日のタイムカード群から該当日を検索する var hit = timecardRecords.FirstOrDefault(x => x.Day == ymd.Day); if (hit != null) { // 見つかればその終業時刻を書き換え hit.EoWTime = $"{hm.Hour:00}{hm.Minute:00}"; } else { // 見つからなければ新たにタイムカードレコードを作って追加 var newRecord = new TimecardRecord() { Day = ymd.Day, EoWTime = $"{hm.Hour:00}{hm.Minute:00}" }; timecardRecords.Add(newRecord); } // Jsonにシリアライズして戻す monthlyTimecardEntity.SetTimecardDataJsonFromList(timecardRecords); // 月次タイムカードをUpsertする var upsertOp = TableOperation.InsertOrReplace(monthlyTimecardEntity); await _monthlyTimecardTable.ExecuteAsync(upsertOp); }
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; }
public async Task <(Yyyymmdd ymd, Hhmm hm)> PunchEoW(string hhmmText) { var tzUser = TimeZoneInfo.FindSystemTimeZoneById(_currentUser.TimeZoneId); var nowUserTz = TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, tzUser); // ユーザーのタイムゾーンでの現在時刻 var hhmm = Hhmm.Parse(hhmmText); var ymd = Yyyymmdd.FromDate(nowUserTz); // パース失敗していたら処理しない if (hhmm.IsEmpty || ymd.isEmpty) { Trace.WriteLine($"PunchEoW parse hhmm failed - {hhmmText}"); return(ymd, hhmm); } await PunchEoW(ymd, hhmm); return(ymd, hhmm); }
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); }
public async Task DeleteTimecardRecord(string userId, Yyyymmdd ymd) { // 既存の月次タイムカードを得る var monthlyTimecardEntity = await GetMonthlyTimecardsByYearMonth(userId, ymd.Year, ymd.Month); IList <TimecardRecord> timecardRecords = new List <TimecardRecord>(); if (monthlyTimecardEntity == null) { // 見つからなければ終わり return; } else { // 得られたら、月次タイムカード内にJsonで入っている各日のタイムカード情報をデシリアライズして得る timecardRecords = monthlyTimecardEntity.GetTimecardsAsList(); } // 月次タイムカード内の各日のタイムカード群から該当日を検索する var hit = timecardRecords.FirstOrDefault(x => x.Day == ymd.Day); if (hit != null) { // 見つかればそれをリストから削除 timecardRecords.Remove(hit); } else { // 見つからなければ終わり return; } // Jsonにシリアライズして戻す monthlyTimecardEntity.SetTimecardDataJsonFromList(timecardRecords); // 月次タイムカードをUpsertする var upsertOp = TableOperation.InsertOrReplace(monthlyTimecardEntity); await _monthlyTimecardTable.ExecuteAsync(upsertOp); }