/// <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);
        }
Beispiel #2
0
        /// <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));
        }
Beispiel #3
0
        /// <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));
        }