/// <summary> /// Show start and end date selection card once 'Back' is clicked from Duration selection card. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="data">Advanced time off object.</param> /// <returns>Date range card.</returns> public AdaptiveCard OnBackGetDateRangeCard(IDialogContext context, AdvancedTimeOff data) { string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/AdvanceTimeOff1.json"); var json = File.ReadAllText(fullPath); json = json.Replace("sdtValue", data.sdt).Replace("edtValue", data.edt); json = json.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{StartDate}", KronosResourceText.StartDate).Replace("{EndDate}", KronosResourceText.EndDate); json = json.Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Next}", KronosResourceText.NextButton); var card = AdaptiveCard.FromJson(json).Card; return(card); }
/// <summary> /// Show duration selection card once 'Back' is clicked from DeductFrom card. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="data">Advanced time off object.</param> /// <returns>Duration card.</returns> public AdaptiveCard OnBackGetDurationCard(IDialogContext context, AdvancedTimeOff data) { string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/AdvanceTimeOff2.json"); var json = File.ReadAllText(fullPath); json = json.Replace("{duration}", data.duration).Replace("{Title}", KronosResourceText.TimeOffRequstText); json = json.Replace("{Duration}", KronosResourceText.Duration).Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Next}", KronosResourceText.NextButton); var card = AdaptiveCard.FromJson(json).Card; return(card); }
/// <summary> /// For displaying advanced time off card for selection of start and end time after clicking 'Next' action from duration selection card and selected duration is 'Hours'. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="obj">Advanced time off object.</param> /// <returns>Hours card.</returns> public AdaptiveCard OnNextGetHoursCard(IDialogContext context, AdvancedTimeOff obj) { string fullPath = fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/AdvanceTimeOff3_Hours.json"); var json = File.ReadAllText(fullPath); json = json.Replace("{sTime}", obj.StartTime ?? "09:00"); json = json.Replace("{eTime}", obj.EndTime ?? "17:00"); json = json.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{StartTime}", KronosResourceText.StartTime).Replace("{EndTime}", KronosResourceText.EndTime); json = json.Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Next}", KronosResourceText.NextButton); var card = AdaptiveCard.FromJson(json).Card; return(card); }
/// <summary> /// For displaying advanced time off card for selection of start and end date after clicking 'Advanced' from initial time off card. /// </summary> /// <param name="context">Dialog context object.</param> /// <param name="obj">Advanced time off object.</param> /// <returns>Advanced time off request card.</returns> public AdaptiveCard GetAdvancedTimeOffRequestCard(IDialogContext context, AdvancedTimeOff obj) { string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/AdvanceTimeOff1.json"); var adaptiveCard = File.ReadAllText(fullPath); adaptiveCard = adaptiveCard.Replace("sdtValue", obj.sdt ?? DateTime.Now.ToString("MMM,d yyyy", CultureInfo.InvariantCulture)); adaptiveCard = adaptiveCard.Replace("edtValue", obj.edt ?? DateTime.Now.ToString("MMM,d yyyy", CultureInfo.InvariantCulture)); adaptiveCard = adaptiveCard.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{StartDate}", KronosResourceText.StartDate).Replace("{EndDate}", KronosResourceText.EndDate); adaptiveCard = adaptiveCard.Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Next}", KronosResourceText.NextButton); var card = AdaptiveCard.FromJson(adaptiveCard).Card; return(card); }
/// <summary> /// Show DeductFrom selection card once 'Back' is clicked either from time selection or confirmation card depending upon duration value. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="data">Advanced time off object.</param> /// <param name="paycodes">List of paycodes from azure storage.</param> /// <returns>Deduct from card.</returns> public AdaptiveCard OnBackGetDeductFromCard(IDialogContext context, AdvancedTimeOff data, List <string> paycodes) { string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/AdvanceTimeOff3.json"); var json = File.ReadAllText(fullPath); if (paycodes.Count > 0) { var row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < paycodes.Count; i++) { var paycode = row.Replace("{Text}", paycodes[i]).Replace("{Value}", paycodes[i]); if (i == 0) { sb.Append(paycode); json = json.Replace("{DeductFrom}", data.DeductFrom ?? paycodes[i]); } else { sb.Append(", " + paycode); } } json = json.Replace("{Paycodes}", sb.ToString()); } else { json = json.Replace("{Paycodes}", string.Empty).Replace("{DeductFrom}", data.DeductFrom ?? string.Empty); } json = json.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{TimeOffType}", KronosResourceText.TypeOfTimeoff); json = json.Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Next}", KronosResourceText.NextButton); json = data.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant() ? json.Replace(Constants.AdvancedBack2, Constants.AdvancedBack3ToHours) : json.Replace(Constants.AdvancedBack2, Constants.AdvancedBack2); var card = AdaptiveCard.FromJson(json).Card; return(card); }
/// <summary> /// Send advanced time off request to Kronos API and get response. /// </summary> /// <param name="tenantId">Tensnt ID.</param> /// <param name="jSession">J Session.</param> /// <param name="personNumber">Person Number.</param> /// <param name="obj">Submitted values from employee.</param> /// <returns>Time of add response.</returns> public async Task <TimeOffAddResponse.Response> AdvancedTimeOffRequest(string tenantId, string jSession, string personNumber, AdvancedTimeOff obj) { string xmlTimeOffRequest = this.CreateAddAdvancedTimeOffRequest(personNumber, obj); TenantMapEntity tenantMapEntity = await this.azureTableStorageHelper.ExecuteQueryUsingPointQueryAsync <TenantMapEntity>(Constants.ActivityChannelId, tenantId); var tupleResponse = await ApiHelper.Instance.SendSoapPostRequest(tenantMapEntity.EndpointUrl, ApiConstants.SoapEnvOpen, xmlTimeOffRequest, ApiConstants.SoapEnvClose, jSession); TimeOffAddResponse.Response timeOffResponse = this.ProcessResponse(tupleResponse.Item1); return(timeOffResponse); }
/// <summary> /// Create XML to add advanced time off request. /// </summary> /// <param name="personNumber">Person Number.</param> /// <param name="obj">Submitted values from employee.</param> /// <returns>Advanced time of request.</returns> public string CreateAddAdvancedTimeOffRequest(string personNumber, AdvancedTimeOff obj) { var monthStartDt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var monthEndDt = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.DaysInMonth(monthStartDt.Year, monthStartDt.Month)); double?length = null; if (obj.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]); length = new DateTime(2000, 1, 1, ehr, emin, 0).Subtract(new DateTime(2000, 1, 1, shr, smin, 0)).TotalHours; } TimeOffAddRequest.TimeOffPeriod[] t = new TimeOffAddRequest.TimeOffPeriod[] { new TimeOffAddRequest.TimeOffPeriod() { Duration = obj.duration, EndDate = obj.edt, PayCodeName = obj.DeductFrom, StartDate = obj.sdt, StartTime = obj.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant() ? obj.StartTime : null, Length = length?.ToString(), }, }; Request rq = new Request() { Action = ApiConstants.AddRequests, EmployeeRequestMgm = new EmployeeRequestMgmt() { Employees = new Employee() { PersonIdentity = new TimeOffAddRequest.PersonIdentity() { PersonNumber = personNumber } }, QueryDateSpan = monthStartDt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + monthEndDt.ToString("M/d/yyyy", CultureInfo.InvariantCulture), RequestItems = new RequestItems() { GlobalTimeOffRequestItem = new GlobalTimeOffRequestItem() { Employee = new Employee() { PersonIdentity = new PersonIdentity() { PersonNumber = personNumber } }, RequestFor = "TOR", TimeOffPeriods = new TimeOffPeriods() { TimeOffPeriod = t }, Comments = new Comments { Comment = null }, }, }, }, }; if (!string.IsNullOrEmpty(obj.Note)) { rq.EmployeeRequestMgm.RequestItems.GlobalTimeOffRequestItem.Comments.Comment = new List <Comment> { new Comment { CommentText = obj.Comment, Notes = new Notes { Note = new Note { Text = obj.Note } } }, }; } else { rq.EmployeeRequestMgm.RequestItems.GlobalTimeOffRequestItem.Comments = null; } return(rq.XmlSerialize <TimeOffAddRequest.Request>()); }
/// <summary> /// Send approval notification to supervisor. /// </summary> /// <param name="tenantId">Tenand Id.</param> /// <param name="personNumber">Person number of employee who raised time off request.</param> /// <param name="reqId">Request Id generated for submitted request.</param> /// <param name="conversationId">Supervisor conversation Id to send notification.</param> /// <param name="paycode">Pay code for request.</param> /// <param name="context">Dialog context.</param> /// <param name="timePeriod">Time period for request.</param> /// <param name="advancedTimeOff">Advanced time off request object ('null' for normal time off request).</param> /// <returns>Task.</returns> public async Task SendNotificationToSupervisor(string tenantId, string personNumber, string reqId, string conversationId, string paycode, IDialogContext context, string timePeriod, AdvancedTimeOff advancedTimeOff) { 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); } try { context.UserData.TryGetValue(context.Activity.From.Id + Constants.SuperUser, out string superSession); var activity = context.Activity as Activity; JToken token = JObject.Parse(activity.Value.ToString()); DateTime sdt, edt; string note = null; if (advancedTimeOff == null) { DateTime.TryParse((string)token.SelectToken("sdt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt); DateTime.TryParse((string)token.SelectToken("edt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out edt); } else { note = advancedTimeOff.Note; DateTime.TryParse(advancedTimeOff.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt); DateTime.TryParse(advancedTimeOff.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out edt); } edt = edt.AddDays(1); var requests = await this.timeOffActivity.GetTimeOffRequestDetails(tenantId, superSession, sdt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + edt.ToString("M/d/yyyy", CultureInfo.InvariantCulture), personNumber); var filteredRequest = (from d in requests.RequestMgmt.RequestItems.GlobalTimeOffRequestItem where d.Id == reqId select d).FirstOrDefault(); var requestorInfo = await this.roleActivity.GetPersonInfo(tenantId, personNumber, superSession); for (int i = 0; i < filteredRequest.RequestStatusChanges.RequestStatusChange.Count; i++) { var personInfo = await this.roleActivity.GetPersonInfo(tenantId, filteredRequest.RequestStatusChanges.RequestStatusChange[i].User.PersonIdentity.PersonNumber, superSession); filteredRequest.RequestStatusChanges.RequestStatusChange[i].User.PersonIdentity.PersonNumber = personInfo.PersonInformation.PersonDat.PersonDetail.FullName; } var comments = await this.commentsActivity.GetComments(tenantId, superSession); var channelData = new TeamsChannelData { Tenant = new TenantInfo() { Id = tenantId, }, }; var message = Activity.CreateMessageActivity(); message.From = new ChannelAccount(AppSettings.Instance.MicrosoftAppId, AppSettings.Instance.MicrosoftAppPassword); MicrosoftAppCredentials.TrustServiceUrl(context.Activity.ServiceUrl); message.ChannelData = channelData; message.ChannelId = Constants.ActivityChannelId; message.Conversation = new ConversationAccount( conversationType: "personal", id: conversationId, isGroup: false); AdaptiveCard card = this.timeOffCard.GetSupervisorNotificationCard(context, reqId, personNumber, paycode, timePeriod, filteredRequest, note, requestorInfo.PersonInformation.PersonDat.PersonDetail.FullName, comments, advancedTimeOff); message.Attachments.Add(new Attachment() { ContentType = "application/vnd.microsoft.card.adaptive", Content = card, }); IConnectorClientFactory factory = new ConnectorClientFactory(Address.FromActivity(context.Activity), new MicrosoftAppCredentials(AppSettings.Instance.MicrosoftAppId, AppSettings.Instance.MicrosoftAppPassword)); await factory.MakeConnectorClient().Conversations.SendToConversationAsync((Activity)message); } catch (Exception) { throw; } }
/// <summary> /// Process advanced time off request commands and call respective methods. /// </summary> /// <param name="context">Dialog context.</param> /// <returns>Task.</returns> private async Task ProcessAdvancedTimeOffRequest(IDialogContext context) { 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(); AdaptiveCard card = new AdaptiveCard("1.0"); var conversationId = context.Activity.Conversation.Id; var activityId = context.Activity.ReplyToId; var advancedObj = new AdvancedTimeOff(); IConnectorClientFactory factory = new ConnectorClientFactory(Address.FromActivity(context.Activity), new MicrosoftAppCredentials(AppSettings.Instance.MicrosoftAppId, AppSettings.Instance.MicrosoftAppPassword)); if (activity.Text.ToLowerInvariant() == Constants.CreateAdvancedTimeOff.ToLowerInvariant()) { if (context.PrivateConversationData.ContainsKey("AdvancedRequestObj")) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); } card = this.timeOffCard.GetAdvancedTimeOffRequestCard(context, advancedObj); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedNext2.ToLowerInvariant()) { if (context.PrivateConversationData.ContainsKey("AdvancedRequestObj")) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); } advancedObj.sdt = (string)token.SelectToken("sdt"); advancedObj.edt = (string)token.SelectToken("edt"); context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); card = this.timeOffCard.OnNextGetDurationCard(context, advancedObj); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedNext3.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.duration = (string)token.SelectToken("duration"); if (advancedObj.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant()) { card = this.timeOffCard.OnNextGetHoursCard(context, advancedObj); } else { advancedObj.StartTime = null; advancedObj.EndTime = null; var allPaycodes = await this.azureTableStorageHelper.GetTimeOffPaycodes(AppSettings.Instance.OvertimeMappingtableName); var filteredPaycodes = (from d in allPaycodes where d.RowKey.Contains(tenantId) select d).Select(w => w.Properties["PayCodeName"].StringValue).ToList(); card = this.timeOffCard.OnNextGetDeductFromCard(context, advancedObj, filteredPaycodes); } context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedNext3FromHours.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.StartTime = (string)token.SelectToken("StartTime"); advancedObj.EndTime = (string)token.SelectToken("EndTime"); context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); var allPaycodes = await this.azureTableStorageHelper.GetTimeOffPaycodes(AppSettings.Instance.OvertimeMappingtableName); var filteredPaycodes = (from d in allPaycodes where d.RowKey.Contains(tenantId) select d).Select(w => w.Properties["PayCodeName"].StringValue).ToList(); card = this.timeOffCard.OnNextGetDeductFromCard(context, advancedObj, filteredPaycodes); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedNext4.ToLowerInvariant()) { 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); } advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.DeductFrom = (string)token.SelectToken("DeductFrom"); context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); context.UserData.TryGetValue(context.Activity.From.Id + Constants.SuperUser, out string superSession); var comments = await this.commentsActivity.GetComments(tenantId, superSession); card = this.timeOffCard.OnNextGetConfirmationCard(context, advancedObj, comments); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedBack3ToHours.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.DeductFrom = (string)token.SelectToken("DeductFrom"); card = this.timeOffCard.OnBackGetHoursCard(context, advancedObj); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedBack3.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); var allPaycodes = await this.azureTableStorageHelper.GetTimeOffPaycodes(AppSettings.Instance.OvertimeMappingtableName); var filteredPaycodes = (from d in allPaycodes where d.RowKey.Contains(tenantId) select d).Select(w => w.Properties["PayCodeName"].StringValue).ToList(); card = this.timeOffCard.OnBackGetDeductFromCard(context, advancedObj, filteredPaycodes); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedBack2.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); if (advancedObj.duration.ToLowerInvariant() == Constants.Hours.ToLowerInvariant()) { advancedObj.StartTime = (string)token.SelectToken("StartTime"); advancedObj.EndTime = (string)token.SelectToken("EndTime"); } else { advancedObj.DeductFrom = (string)token.SelectToken("DeductFrom"); } context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); card = this.timeOffCard.OnBackGetDurationCard(context, advancedObj); } else if (activity.Text.ToLowerInvariant() == Constants.AdvancedBack1.ToLowerInvariant()) { advancedObj = context.PrivateConversationData.GetValue <AdvancedTimeOff>("AdvancedRequestObj"); advancedObj.duration = (string)token.SelectToken("duration"); context.PrivateConversationData.SetValue("AdvancedRequestObj", advancedObj); card = this.timeOffCard.OnBackGetDateRangeCard(context, advancedObj); } else { await context.PostAsync(Constants.CommandNotRecognized); } 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); } catch (Exception) { throw; } }
/// <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 supervisor approval notification card. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="reqId">Created request Id.</param> /// <param name="personNumber">Person number of request creator.</param> /// <param name="paycode">Paycode for request.</param> /// <param name="timePeriod">Time period for request.</param> /// <param name="details">Request details from API.</param> /// <param name="note">Comment by requestor while creating request.</param> /// <param name="requestor">Request creator name.</param> /// <param name="comments">List of comments to which note will be attached.</param> /// <param name="advancedTimeOff">Advanced time off request object.</param> /// <returns>Supervisor notification card.</returns> public AdaptiveCard GetSupervisorNotificationCard(IDialogContext context, string reqId, string personNumber, string paycode, string timePeriod, GlobalTimeOffRequestItem details, string note, string requestor, Models.ResponseEntities.CommentList.Response comments, AdvancedTimeOff advancedTimeOff = null) { var repoMessage = context.MakeMessage(); var adaptiveCard = File.ReadAllText(HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/SupervisorNotificationCard.json")); var activity = context.Activity as Activity; JToken token = JObject.Parse(activity.Value.ToString()); DateTime sdt, edt; if (advancedTimeOff == null) { DateTime.TryParse((string)token.SelectToken("sdt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt); DateTime.TryParse((string)token.SelectToken("edt"), CultureInfo.InvariantCulture, DateTimeStyles.None, out edt); } else { DateTime.TryParse(advancedTimeOff.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out sdt); DateTime.TryParse(advancedTimeOff.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out 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("{Status_txt}", KronosResourceText.Status).Replace("{Employee_txt}", KronosResourceText.Employee); adaptiveCard = adaptiveCard.Replace("{Paycode_txt}", KronosResourceText.PayCode).Replace("{Date_txt}", KronosResourceText.Date).Replace("{TimePeriod_txt}", KronosResourceText.TimePeriod); adaptiveCard = adaptiveCard.Replace("{Note_txt}", KronosResourceText.Note).Replace("{SelectComment}", KronosResourceText.SelectComment).Replace("{EnterNote}", KronosResourceText.EnterNote); adaptiveCard = adaptiveCard.Replace("{Submit}", KronosResourceText.Submit).Replace("{Refuse}", KronosResourceText.Refuse); adaptiveCard = adaptiveCard.Replace("{Days}", days.ToString() + (days > 1 ? " Days" : " Day")); adaptiveCard = adaptiveCard.Replace("{StartDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture)); adaptiveCard = adaptiveCard.Replace("{Approve}", KronosResourceText.Approve).Replace("{Submit}", KronosResourceText.Submit).Replace("{Refuse}", KronosResourceText.Refuse).Replace("{ShowHistory}", KronosResourceText.ShowHistory); if (timePeriod.ToLowerInvariant() == Constants.FullDay.ToLowerInvariant() && days == 0) { adaptiveCard = adaptiveCard.Replace("- {EndDate}", string.Empty); } else { adaptiveCard = adaptiveCard.Replace("{EndDate}", edt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture)); } adaptiveCard = adaptiveCard.Replace("{RequestId}", reqId).Replace("{PersonNumber}", personNumber).Replace("{Status}", KronosResourceText.Submitted); adaptiveCard = adaptiveCard.Replace("{Color}", Constants.Default).Replace("{Employee}", requestor).Replace("{PayCode}", paycode); adaptiveCard = adaptiveCard.Replace("{TimePeriod}", timePeriod).Replace("{QueryDateSpan}", sdt.ToString("M/d/yyyy", CultureInfo.InvariantCulture) + "-" + edt.ToString("M/d/yyyy", CultureInfo.InvariantCulture)); adaptiveCard = adaptiveCard.Replace("{Note}", note ?? KronosResourceText.NoComment); var historyItem = File.ReadAllText(HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/HistoryItem.json")); var first = true; StringBuilder sb = new StringBuilder(); foreach (var item in details?.RequestStatusChanges?.RequestStatusChange) { sb.Append("," + historyItem.Replace("{Seperator}", first == true ? "False" : "True").Replace("{Status}", item.ToStatusName).Replace("{Person}", item.User.PersonIdentity.PersonNumber).Replace("{Datetime}", item.ChangeDateTime)); first = false; } adaptiveCard = adaptiveCard.Replace("{rows}", details?.RequestStatusChanges.RequestStatusChange.Count == 0 ? null : sb.ToString()); var row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}"; sb = new StringBuilder(); for (int i = 0; i < comments.Comments.Count; i++) { if (i == 0) { sb.Append(row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText)); adaptiveCard.Replace("{CommentValue}", comments.Comments[i].CommentText); } else { sb.Append(", " + row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText)); } } adaptiveCard = adaptiveCard.Replace("{CommentRows}", sb.ToString()); var card = AdaptiveCard.FromJson(adaptiveCard).Card; return(card); }
/// <summary> /// For displaying advanced time off confirmation card which shows details selected by employee through previous steps. /// </summary> /// <param name="context">Dialog context.</param> /// <param name="obj">Advanced timeoff object.</param> /// <param name="comments">List of comments from API.</param> /// <returns>Confirmation card.</returns> public AdaptiveCard OnNextGetConfirmationCard(IDialogContext context, AdvancedTimeOff obj, Models.ResponseEntities.CommentList.Response comments) { string fullPath = HttpContext.Current.Server.MapPath("/Cards/AdaptiveCards/TimeOff/ConfirmAdvanceTimeOff.json"); var json = File.ReadAllText(fullPath); DateTime.TryParse(obj.sdt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime sdt); DateTime.TryParse(obj.edt, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime edt); edt = edt.AddHours(23).AddMinutes(59); var days = (int)Math.Round(edt.Subtract(sdt).TotalDays, MidpointRounding.AwayFromZero); if (obj.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); json = json.Replace("{DurationHours}", "**" + KronosResourceText.TimePeriod + ":** " + stime.ToString("h:mm tt", CultureInfo.InvariantCulture) + " to " + etime.ToString("h:mm tt", CultureInfo.InvariantCulture)); json = json.Replace("{Duration}", KronosResourceText.Hours); } else { json = json.Replace("{DurationHours}", string.Empty); if (obj.duration.ToLowerInvariant() == Constants.first_half_day.ToLowerInvariant()) { json = json.Replace("{Duration}", KronosResourceText.FirstHalfDay); } else if (obj.duration.ToLowerInvariant() == Constants.half_day.ToLowerInvariant()) { json = json.Replace("{Duration}", KronosResourceText.HalfDay); } else { json = json.Replace("{Duration}", KronosResourceText.FullDay); } } json = json.Replace("{Title}", KronosResourceText.TimeOffRequstText).Replace("{ConfirmTimeOffRequest}", KronosResourceText.ConfirmTimeoffRequest).Replace("{PayCode_txt}", KronosResourceText.PayCode); json = json.Replace("{Date_txt}", KronosResourceText.Date).Replace("{Duration_txt}", KronosResourceText.Duration).Replace("{Back}", KronosResourceText.Back).Replace("{Cancel}", KronosResourceText.Cancel).Replace("{Confirm}", KronosResourceText.Confirm); json = json.Replace("{SelectComment}", KronosResourceText.SelectComment).Replace("{EnterNote}", KronosResourceText.EnterNote).Replace("{Submit}", KronosResourceText.Submit); json = json.Replace("{Days}", days.ToString() + (days > 1 ? " " + KronosResourceText.Days : " " + KronosResourceText.Day)); json = days > 1 ? json.Replace("{DurationDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture) + " - " + edt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture)) : json.Replace("{DurationDate}", sdt.ToString("MMM d, yyyy", CultureInfo.InvariantCulture)); json = json.Replace("{DeductFrom}", obj.DeductFrom); var row = "{\"title\": \"{Text}\",\"value\": \"{Value}\"}"; StringBuilder sb = new StringBuilder(); for (int i = 0; i < comments.Comments.Count; i++) { if (i == 0) { sb.Append(row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText)); json.Replace("{CommentValue}", comments.Comments[i].CommentText); } else { sb.Append(", " + row.Replace("{Text}", comments.Comments[i].CommentText).Replace("{Value}", comments.Comments[i].CommentText)); } } json = json.Replace("{CommentRows}", sb.ToString()); var card = AdaptiveCard.FromJson(json).Card; return(card); }