Example #1
0
        public HttpResponseMessage Get(
            [FromUri] string tenant,
            [FromUri] string token,
            [FromUri] string select = null
            )
        {
            if (!Factory.FeatureSwitch.Get("enableWfUserActionNotify"))
            {
                return(new HttpResponseMessage(System.Net.HttpStatusCode.NotFound));
            }

            using (Profiler.Measure("ApproveController.Approve"))
            {
                using (WebApiHelpers.GetTenantContext(tenant))
                {
                    string responseHtml = null;

                    var task = UserTaskHelper.GetTaskFromLinkToken(token);

                    if (task == null)
                    {
                        responseHtml = _htmlGenerator.GenerateRejectionPage();
                    }
                    else
                    {
                        if (select == null)
                        {
                            responseHtml = _htmlGenerator.GenerateSelectionPage(task);
                        }
                        else
                        {
                            // TODO: make the selection]
                            UserTaskHelper.ProcessApproval(task.Id, select);
                            responseHtml = _htmlGenerator.GenerateCompletedPage(task);
                        }
                    }

                    var response = new HttpResponseMessage(System.Net.HttpStatusCode.Accepted);
                    response.Content = new StringContent(responseHtml, Encoding.UTF8, "text/html");

                    return(response);
                }
            }
        }
        private const decimal DefaultTimeOutMins = 0;     // no time out

        public override bool OnStart(IRunState context, ActivityInputs inputs)
        {
            var assignedTo          = GetArgumentEntity <Person>(inputs, "inDisplayFormForUser");
            var recordToPresent     = GetArgumentEntity <UserResource>(inputs, "inDisplayFormResource");
            var form                = GetArgumentEntity <CustomEditForm>(inputs, "inDisplayFormForm");
            var timeoutDays         = GetArgumentValue <decimal>(inputs, "inDisplayFormTimeOut", DefaultTimeOutMins);
            var priority            = GetArgumentEntity <EventEmailPriorityEnum>(inputs, "inDisplayFormPriority");
            var activityInstanceAs  = ActivityInstance.Cast <DisplayFormActivity>();
            var percentageCompleted = GetArgumentValue <decimal?>(inputs, "inDisplayFormPercentageCompleted", null);
            var waitForNext         = GetArgumentValue <bool>(inputs, "inDisplayFormWaitForNext", false);
            var recordHistory       = GetArgumentValue <bool>(inputs, "inDisplayFormRecordHistory", false);
            var hideComment         = GetArgumentValue <bool>(inputs, "inHideComment", false);
            var openInEditMode      = GetArgumentValue <bool>(inputs, "inOpenInEditMode", false);

            priority = priority ?? Entity.Get <EventEmailPriorityEnum>(new EntityRef("core", "normalPriority"));

            var workflowRun = context.WorkflowRun;


            var dueDate = DateTime.UtcNow.AddDays((double)timeoutDays);

            var userTask = new DisplayFormUserTask
            {
                Name                 = ActivityInstance.Name ?? DefaultTitle,
                RecordToPresent      = recordToPresent,
                FormToUse            = form,
                AvailableTransitions = GetAvailableUserTransitions(),
                AssignedToUser       = assignedTo,
                TaskPriority         = priority,
                TaskStatus_Enum      = TaskStatusEnum_Enumeration.TaskStatusNotStarted,
                PercentageCompleted  = percentageCompleted,
                WaitForNextTask      = waitForNext,
                UserTaskDueOn        = dueDate,
                HideComment          = hideComment,
                OpenInEditMode       = openInEditMode,
                DfutLinkToken        = CryptoHelper.GetRandomPrintableString(8)
            };

            context.SetUserTask(userTask.Cast <BaseUserTask>());

            if (recordHistory)
            {
                CreateLogEntry(context, userTask);
            }

            SetTimeoutIfNeeded(context, timeoutDays);

            var tenantSetting = Entity.Get <TenantGeneralSettings>(WellKnownAliases.CurrentTenant.TenantGeneralSettingsInstance);

            if (Factory.FeatureSwitch.Get("enableWfUserActionNotify"))
            {
                //
                // IN PROGRESS - Please leave
                // This code is in development and switched off until email and SMS approvals are required by PM.
                //
                Notifier notifier = null; // tenantSetting.UserActionNotifier;
                if (notifier != null)
                {
                    // TODO: Format correctly for where it is being sent SMS email etc. Move the decision out of here and make the notfier decide on the type of message
                    var generator = new HtmlGenerator();

                    string message = null;
                    if (notifier.Is <EmailNotifier>())           // TODO: This is wrong, it should be somehow tied to the Router
                    {
                        var transitionOptions = userTask.AvailableTransitions.Select(t => t.FromExitPoint.Name).Where(n => !String.IsNullOrEmpty(n));

                        if (transitionOptions.Any())
                        {
                            message = generator.GenerateSelectionPage(userTask);
                        }
                    }
                    else if (notifier.Is <TwilioNotifier>())
                    {
                        message = generator.GenerateSelectionPageUrl(userTask.DfutLinkToken);
                    }

                    if (message != null)
                    {
                        var userList = userTask.AssignedToUser.ToEnumerable();

                        var notification = new Notification {
                            NMessage = message
                        };

                        //TOOD: Add alternative text in the email with a link to the SMS page
                        NotificationRouter.Instance.Send(notifier, notification, userList, false);
                    }
                }
            }

            context.SetArgValue(ActivityInstance, GetArgumentKey("core:outDisplayFormUserTask"), userTask);
            context.SetArgValue(ActivityInstance, GetArgumentKey("core:dfaInternalKeepHistory"), recordHistory);

            return(false);
        }