/// <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>());
        }
Esempio n. 8
0
        /// <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;
            }
        }
Esempio n. 9
0
        /// <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);
        }