Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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));
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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;
        }
Beispiel #7
0
        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);
        }
Beispiel #8
0
        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);
        }