/// <summary> /// TimeOff Success Card. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="response">Time off response data.</param> /// <param name="obj">Advanced time off object.</param> /// <returns>Time off success card.</returns> public AdaptiveCard ShowTimeOffSuccessCard(IDialogContext context, Models.ResponseEntities.TimeOff.AddResponse.Response response, AdvancedTimeOff obj) { var repoMessage = context.MakeMessage(); string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/TimeOffSuccessCard.json"); var adaptiveCard = File.ReadAllText(fullPath); var period = response.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().TimeOffPeriodsList.TimeOffPerd.FirstOrDefault(); DateTime.TryParse(response.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().CreationDateTime, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime creationdate); DateTime.TryParse(period.StartDate, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime sdt); DateTime.TryParse(period.EndDate, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime edt); edt = edt.AddHours(23); edt = edt.AddMinutes(59); var days = (int)Math.Round(edt.Subtract(sdt).TotalDays, MidpointRounding.AwayFromZero); adaptiveCard = adaptiveCard.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{Info}", KronosResourceText.TimeOffRequestSuccessInfoText); adaptiveCard = adaptiveCard.Replace("{Paycode}", period.PayCodeName).Replace("{Paycode_Info}", period.PayCodeName.ToLowerInvariant()).Replace("{StartDate}", sdt.ToString("MMM d, yyyy")).Replace("{EndDate}", edt.ToString("MMM d, yyyy")); adaptiveCard = adaptiveCard.Replace("{Type}", KronosResourceText.Type).Replace("{StartDate_Txt}", KronosResourceText.StartDate).Replace("{EndDate_Txt}", KronosResourceText.EndDate).Replace("{Duration_Txt}", KronosResourceText.Duration); adaptiveCard = adaptiveCard.Replace("{PendingImg}", Constants.PendingImg); var duration = period.Duration == Constants.full_day ? Constants.FullDay : period.Duration == Constants.half_day ? Constants.HalfDay : period.Duration == Constants.first_half_day ? Constants.FirstHalfDay : Constants.Hours; if (period.Duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant()) { var shr = Convert.ToInt32(obj.StartTime.Split(' ')[0].Split(':')[0]); var smin = Convert.ToInt32(obj.StartTime.Split(' ')[0].Split(':')[1]); var ehr = Convert.ToInt32(obj.EndTime.Split(' ')[0].Split(':')[0]); var emin = Convert.ToInt32(obj.EndTime.Split(' ')[0].Split(':')[1]); var stime = new DateTime(2000, 1, 1, shr, smin, 0); var etime = new DateTime(2000, 1, 1, ehr, emin, 0); duration += $" ({stime.ToString("h:mm tt", CultureInfo.InvariantCulture) + " - " + etime.ToString("h:mm tt", CultureInfo.InvariantCulture)})"; } adaptiveCard = adaptiveCard.Replace("{Duration}", duration).Replace("{AdditionalRequest}", KronosResourceText.AdditionalRequest); var card = AdaptiveCard.FromJson(adaptiveCard).Card; return(card); }
/// <summary> /// Create time off request draft and submit it. /// </summary> /// <param name="context">Dialog context.</param> /// <returns>Task.</returns> private async Task SubmitAdvancedTimeOffRequest(IDialogContext context) { var superUserLogonRes = await this.authenticationService.LoginSuperUser((Activity)context.Activity); if (superUserLogonRes?.Status == ApiConstants.Success) { context.UserData.SetValue(context.Activity.From.Id + Constants.SuperUser, superUserLogonRes.Jsession); } var activity = context.Activity as Activity; JToken token = JObject.Parse(activity.Value.ToString()); JObject tenant = context.Activity.ChannelData as JObject; string tenantId = tenant["tenant"].SelectToken("id").ToString(); var advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.Comment = (string)token.SelectToken("Comment"); advancedObj.Note = (string)token.SelectToken("note"); if (!string.IsNullOrEmpty(advancedObj.Note) && string.IsNullOrEmpty(advancedObj.Comment)) { await context.PostAsync(Resources.KronosResourceText.CommentSelectionValidation); } else { context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); DateTime.TryParse(advancedObj.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime sdt); DateTime.TryParse(advancedObj.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime edt); edt = edt.AddHours(23); edt = edt.AddMinutes(59); string querySpan = sdt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + edt.ToString("M/d/yyyy", CultureInfo.InvariantCulture); var startDate = sdt.ToString(ApiConstants.DateFormat, CultureInfo.InvariantCulture); var endDate = edt.ToString(ApiConstants.DateFormat, CultureInfo.InvariantCulture); advancedObj.sdt = startDate; advancedObj.edt = endDate; string jSessionId = this.response?.JsessionID; string personNumber = this.response?.PersonNumber; context.UserData.TryGetValue(context.Activity.From.Id + Constants.SuperUser, out string superSession); Models.ResponseEntities.TimeOff.AddResponse.Response timeOffResponse = await this.timeOffActivity.AdvancedTimeOffRequest(tenantId, jSessionId, personNumber, advancedObj); if (timeOffResponse?.Status == ApiConstants.Failure) { if (timeOffResponse.Error?.ErrorCode == ApiConstants.UserNotLoggedInError) { await this.authenticationService.SendAuthCardAsync(context, (Activity)context.Activity); } else { await context.PostAsync(Resources.KronosResourceText.UnableToProceed); } } if (timeOffResponse?.Status == ApiConstants.Success) { Models.ResponseEntities.TimeOff.SubmitResponse.Response submitTimeOffResponse = await this.timeOffActivity.SubmitTimeOffRequest(tenantId, jSessionId, personNumber, timeOffResponse.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().Id, querySpan); if (submitTimeOffResponse?.Status == ApiConstants.Failure) { if (submitTimeOffResponse.Error.DetailErrors.Error.FirstOrDefault().ErrorCode == "611") { await context.PostAsync(Resources.KronosResourceText.TimeOffRequestOverlap); } else { await context.PostAsync(Resources.KronosResourceText.UnableToProceed); } } if (submitTimeOffResponse?.Status == ApiConstants.Success) { var conversationId = context.Activity.Conversation.Id; var activityId = context.Activity.ReplyToId; IConnectorClientFactory factory = new ConnectorClientFactory(Address.FromActivity(context.Activity), new MicrosoftAppCredentials(AppSettings.Instance.MicrosoftAppId, AppSettings.Instance.MicrosoftAppPassword)); var card = this.timeOffCard.ShowTimeOffSuccessCard(context, timeOffResponse, advancedObj); var supervisorConversationId = await this.commonActivity.GetConversationId(personNumber, tenantId, superSession, activity.ChannelId); var timePeriod = advancedObj.duration.ToLowerInvariant() == Constants.FullDay.ToLowerInvariant() ? Constants.FullDay : advancedObj.duration.ToLowerInvariant() == Constants.HalfDay.ToLowerInvariant() ? Constants.HalfDay : advancedObj.duration.ToLowerInvariant() == Constants.FirstHalfDay.ToLowerInvariant() ? Constants.FirstHalfDay : Constants.Hours; if (advancedObj.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant()) { var shr = Convert.ToInt32(advancedObj.StartTime.Split(' ')[0].Split(':')[0]); var smin = Convert.ToInt32(advancedObj.StartTime.Split(' ')[0].Split(':')[1]); var ehr = Convert.ToInt32(advancedObj.EndTime.Split(' ')[0].Split(':')[0]); var emin = Convert.ToInt32(advancedObj.EndTime.Split(' ')[0].Split(':')[1]); var stime = new DateTime(2000, 1, 1, shr, smin, 0); var etime = new DateTime(2000, 1, 1, ehr, emin, 0); timePeriod += " (" + stime.ToString("h:mm tt", CultureInfo.InvariantCulture) + " to " + etime.ToString("h:mm tt", CultureInfo.InvariantCulture) + ")"; } var period = timeOffResponse.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().TimeOffPeriodsList.TimeOffPerd.FirstOrDefault(); var duration = period.Duration == Constants.full_day ? Constants.FullDay : period.Duration == Constants.half_day ? Constants.HalfDay : period.Duration == Constants.first_half_day ? Constants.FirstHalfDay : Constants.Hours; if (supervisorConversationId != null) { await this.SendNotificationToSupervisor(tenantId, personNumber, timeOffResponse.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().Id, supervisorConversationId, advancedObj.DeductFrom, context, duration, advancedObj); } try { activity.Text = null; activity.Value = null; activity.Attachments.Add(new Attachment() { Content = card, ContentType = "application/vnd.microsoft.card.adaptive", }); await factory.MakeConnectorClient().Conversations.UpdateActivityAsync(conversationId, activityId, activity); if (supervisorConversationId == null) { await context.PostAsync(Resources.KronosResourceText.SupervisorNotFoundForNotification); } context.PrivateConversationData.RemoveValue("AdvancedRequestObj"); } catch (Exception) { return; } } } } context.Done(default(string)); }
/// <summary> /// Create time off request draft and submit it. /// </summary> /// <param name="context">Dialog context.</param> /// <returns>Task.</returns> private async Task SubmitTimeOffRequest(IDialogContext context) { var superUserLogonRes = await this.authenticationService.LoginSuperUser((Activity)context.Activity); if (superUserLogonRes?.Status == ApiConstants.Success) { context.UserData.SetValue(context.Activity.From.Id + Constants.SuperUser, superUserLogonRes.Jsession); } var activity = context.Activity as Activity; JToken token = JObject.Parse(activity.Value.ToString()); JObject tenant = context.Activity.ChannelData as JObject; string tenantId = tenant["tenant"].SelectToken("id").ToString(); DateTime.TryParse((string)token.SelectToken("sdt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime sdt); DateTime.TryParse((string)token.SelectToken("edt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime edt); string querySpan = sdt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + edt.ToString("M/d/yyyy", CultureInfo.InvariantCulture); edt = edt.AddHours(23); edt = edt.AddMinutes(59); var startDate = sdt.ToString(ApiConstants.DateFormat, CultureInfo.InvariantCulture); var endDate = edt.ToString(ApiConstants.DateFormat, CultureInfo.InvariantCulture); string jSessionId = this.response?.JsessionID; string personNumber = this.response?.PersonNumber; context.UserData.TryGetValue(context.Activity.From.Id + Constants.SuperUser, out string superSession); Models.ResponseEntities.TimeOff.AddResponse.Response timeOffResponse = await this.timeOffActivity.TimeOffRequest(tenantId, jSessionId, startDate, endDate, personNumber, (string)token.SelectToken("reason")); if (timeOffResponse?.Status == ApiConstants.Failure) { if (timeOffResponse.Error?.ErrorCode == ApiConstants.UserNotLoggedInError) { await this.authenticationService.SendAuthCardAsync(context, (Activity)context.Activity); } } if (timeOffResponse?.Status == ApiConstants.Success) { Models.ResponseEntities.TimeOff.SubmitResponse.Response submitTimeOffResponse = await this.timeOffActivity.SubmitTimeOffRequest(tenantId, jSessionId, personNumber, timeOffResponse.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().Id, querySpan); if (submitTimeOffResponse?.Status == ApiConstants.Failure) { if (submitTimeOffResponse?.Error.DetailErrors.Error.FirstOrDefault().ErrorCode == "611") { await context.PostAsync(Resources.KronosResourceText.TimeOffRequestOverlap); } else { await context.PostAsync(Resources.KronosResourceText.UnableToProceed); } } if (submitTimeOffResponse?.Status == ApiConstants.Success) { var conversationId = context.Activity.Conversation.Id; var activityId = context.Activity.ReplyToId; IConnectorClientFactory factory = new ConnectorClientFactory(Address.FromActivity(context.Activity), new MicrosoftAppCredentials(AppSettings.Instance.MicrosoftAppId, AppSettings.Instance.MicrosoftAppPassword)); var card = this.timeOffCard.ShowTimeOffSuccessCard(context, timeOffResponse, null); var supervisorConversationId = await this.commonActivity.GetConversationId(personNumber, tenantId, superSession, activity.ChannelId); if (supervisorConversationId != null) { await this.SendNotificationToSupervisor(tenantId, personNumber, timeOffResponse.EmployeeRequestMgm.RequestItem.GlobalTimeOffRequestItms.FirstOrDefault().Id, supervisorConversationId, (string)token.SelectToken("reason"), context, "Full Day", null); } try { activity.Text = null; activity.Value = null; activity.Attachments.Add(new Attachment() { Content = card, ContentType = "application/vnd.microsoft.card.adaptive", }); await factory.MakeConnectorClient().Conversations.UpdateActivityAsync(conversationId, activityId, activity); if (supervisorConversationId == null) { await context.PostAsync(Resources.KronosResourceText.SupervisorNotFoundForNotification); } } catch (Exception) { return; } finally { context.PrivateConversationData.RemoveValue("AdvancedRequestObj"); } } } context.Done(default(string)); }