We have moved!

You are currently looking at documentation for Umbraco 8 and older versions.
An automated guess is that docs.umbraco.com/umbraco-forms/developer/extending/adding-a-workflowtype could be the link to the new documentation for Umbraco 9 and newer versions.

    Adding a workflow type to Umbraco Forms

    This builds on the "adding a type to the provider model" chapter

    Add a new class to your project and have it inherit from Umbraco.Forms.Core.WorkflowType, implement the class. For this sample we will focus on the execute method. This method process the current record (the data submitted by the form) and have the ability to change data and state.

    using Serilog;
    using System;
    using System.Collections.Generic;
    using Umbraco.Forms.Core;
    using Umbraco.Forms.Core.Data.Storage;
    using Umbraco.Forms.Core.Enums;
    using Umbraco.Forms.Core.Persistence.Dtos;
    using Umbraco.Core.Logging;
    using Umbraco.Core.Composing;
    
    namespace PrereleaseForm8_4.Workflows
    {
        /// <summary>
        /// Summary description for TestWorkflow
        /// </summary>
        public class TestWorkflow : WorkflowType
        {   
            public TestWorkflow()
            {
                this.Id = new Guid("ccbeb0d5-adaa-4729-8b4c-4bb439dc0202");
                this.Name = "TestWorkflow";
                this.Description = "This workflow is just for testing";
                this.Icon = "icon-chat-active";
                this.Group = "Services";                      
            }
            public override WorkflowExecutionStatus Execute(Record record, RecordEventArgs e)
            {
                // first we log it
                Current.Logger.Debug<TestWorkflow>("the IP " + record.IP + " has submitted a record");            
    
                // we can then iterate through the fields
                foreach (RecordField rf in record.RecordFields.Values)
                {
                    // and we can then do something with the collection of values on each field
                    List<object> vals = rf.Values;
    
                    // or get it as a string
                    rf.ValuesAsString();
                }
                          
                //Change the state
                record.State = FormState.Approved;
    
                Current.Logger.Debug<TestWorkflow>("The record with unique id {RecordId} that was submitted via the Form {FormName} with id {FormId} has been changed to {RecordState} state",
                   record.UniqueId, e.Form.Name, e.Form.Id, "approved");
    
                return WorkflowExecutionStatus.Completed;
            }
    
            public override List<Exception> ValidateSettings()
            {
                return new List<Exception>();
            }
           
        }
    }
    

    The Execute() method gets a Record and a RecordEventArgs argument. These 2 arguments contains all information related to the workflow. The record contains all data and meta data submitted by the form. The RecordEventArgs contains references to what form the record is from, what state it is in and a reference to the current HttpContext.