https://wiki.smartsimple.com/api.php?action=feedcontributions&user=Ciaran&feedformat=atomSmartWiki - User contributions [en-gb]2024-03-29T07:12:29ZUser contributionsMediaWiki 1.27.1https://wiki.smartsimple.com/index.php?title=Attach_a_PDF_to_a_Web_Page_View&diff=42286Attach a PDF to a Web Page View2024-02-23T19:49:43Z<p>Ciaran: /* Additional Information */</p>
<hr />
<div>You can use the '''ssattach''' function to append one or more PDF documents stored in either a [[Custom Field Type: Link – Single File|Single File Field]] or [[Smart Folder]] to a [[Web Page View Field]]. <br />
<br />
<br />
'''Note:''' The attached PDF file(s) will '''not''' be visible when viewing the web page in HTML mode, but will be appended when exported as a PDF, saved as a PDF, emailed as PDF or created by a [[Workflow]] as attachment.<br />
<br />
==Syntax==<br />
To attach a PDF file to the beginning or the end of the [[Web Page View]]:<br />
:<font size="3">'''&lt;!--@ssattach(''position'';''pdf file location'')-->'''</font><br />
<br />
'''Where:'''<br />
* ''position'' is either '''before''' or '''after'''.<br />
* ''pdf file location'' is:<br />
:{|cellpadding="5" cellspacing="0" border="1"<br />
| '''File Source'''<br />
| '''Syntax'''<br />
|'''Comments'''<br />
|-<br />
| [[Smart Folder]]<br />
| /files/''folder1''/''folder2''/''File_Name''.pdf<br />
| To obtain select '''View URL''' from the '''File Options''' combo box next to the relevant file in the [[Smart Folder]]. <br><br />
The first part of the URL should be omitted: the location specified should begin with "/files/..." as in the examples below.<br />
|-<br />
| [[Single File]] Custom Field<br />
| @''Custom Field Name''.value@<br />
|<br />
|-<br />
| [[Multiple Files]] Custom Field<br />
| @''Custom Field Name''.files@<br />
| All PDF files stored in field will be attached.<br />
|}<br />
<br />
<br />
'''Notes:'''<br />
* Single or Multiple file fields on parent/grandparent levels can also be included using: <br />
::* @parent.''Custom Field Name''.value@, @parent.parent.''Custom Field Name''.files@, etc.<br />
<br />
==Examples==<br />
* Append a PDF file from a [[Smart Folder]] '''before''' the current [[Web Page View Field]] page:<br />
<br />
<pre><br />
<!--@ssattach(before;/files/1234/123/myfile.pdf )--><br />
</pre><br />
<br />
<br />
* Append a PDF file from a [[Smart Folder]] '''after''' the current [[Web Page View Field]] page:<br />
<br />
<pre><br />
<!--@ssattach(after;/files/1234/123/myfile.pdf )--><br />
</pre><br />
<br />
<br />
* Append a PDF file from a [[Custom Field Type: Link – Single File|Single File Custom Field]] called ''"AttachPDFFile"'' <u>before</u> the current [[Web Page View Field]] page:.<br />
<br />
<pre><br />
<!--@ssattach(before;@AttachPDFFile.value@)--> <br />
</pre><br />
<br />
:* '''Note:''' Don't forget to include '''.value'''<br />
<br />
<br />
* Attach PDF files to a Level 1 [[Web Page View]] from the UTA Role [[Custom Fields]] on the contact section:<br />
<br />
<pre> [#(?object=contact;)<!--@ssattach(after;$?opr_123456.value$)-->#]<br />
</pre><br />
Where 123456 is the Custom Field ID<br />
<br />
<br />
* Attach PDF files to a Level 1 [[Web Page View]] from the organization [[Custom Fields]] associated as the Customer on the Level 1 record:<br />
<br />
<pre> <!--@ssattach(after;@client.UploadFieldName.files@)--><br />
</pre><br />
Where UploadFieldName is the field name of the multi-file upload custom field on the organization record<br />
<br />
==Additional Information==<br />
* '''IMPORTANT''' Any [[PDF]] files that have security restriction in place such as '''Content Copying''' or '''Content Copying or Extraction''' have been encrypted and '''cannot''' be included. <br />
::The settings can be viewed by opening the [[PDF]] and clicking File > Document Properties > Security (steps may vary depending on the version of your PDF reader)<br />
::See also: [[Display Additional File Attributes for PDF Documents]]<br />
<br />
* The '''ssattach''' function can be placed anywhere inside the HTML tags within the [[Web Page View Field]]<br />
* All PDF page settings will driven by the first PDF document file, whether it is a static file or one generated by [[SmartSimple]]<br />
* Multiple PDF files can be attached from different sources by using multiple ssattach statements:<br />
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><!--@ssattach(before;/files/1234/123/myfileheader.pdf )--><!--@ssattach(after;/files/1234/123/myfilefooter.pdf )--><br />
<!--@ssattach(after;/files/1234/123/myfileappendix.pdf )--><br />
<html><body><br />
My Pdf file<br />
</body></html><br />
</pre><br />
<br />
* [[sslogic]] can be used if the PDF file(s) to be attached needs to be varied using conditional statements:<br />
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;"><!--@sslogic('@type@'='contact')--><br />
<!--@ssattach(after;@parent.contract.value@)--><br />
<!--@else--><br />
<!--@ssattach(after;@parent.othercontract.value@)--><br />
<!--@end--><br />
</pre><br />
<br />
Attaching a file from a transaction to a {{l1}} {{WPV}}, use:<br />
<br />
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">@client.[#(?object=transaction::criteria=typename="Transaction Name" and statusname="Submitted"::orderby=trsts desc)<br />
<!--@ssattach(after;$fieldname.value$)-->#]@<br />
</pre><br />
<br />
Example: <br />
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">@client.[#(?object=transaction::criteria=typename="Audited Financial Statements" and statusname="Submitted"::orderby=trsts desc)<br />
<!--@ssattach(after;$Recent Audited Financial statements.value$)-->#]@</pre><br />
<br />
==See Also==<br />
* [[Web Page View]]<br />
* [[sslogic]]<br />
* [[Display Additional File Attributes for PDF Documents]]<br />
<br />
<br />
[[Category:Custom Fields]][[Category:PDF]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=%2BAI_Directive&diff=42217+AI Directive2024-02-01T18:49:26Z<p>Ciaran: /* Things to Consider */</p>
<hr />
<div>==Overview==<br />
The multi-faceted +AI Directive feature may be used in conjunction with natural language, scripts and the variable processor to perform many time saving tasks including:<br />
<br />
* analyzing text and automatically populating custom fields with relevant information<br />
* converting text into different formats like JSON<br />
* summarizing and translating text<br />
* performing calculations<br />
* comparing application requests with program objectives and providing suggestions or scores on their alignment<br />
* populating custom fields with data extracted from the internet<br />
<br />
'''Note:''' You will need an OpenAI license to use AI features on SmartSimple. You must be a '''Global Administrator''' to enable this feature. Contact your account manager or [mailto:sales@smartsimple.com sales@smartsimple.com] for further information on billing and implementation.<br />
<br />
'''+AI Directive''' is implemented through SmartSimple as a new custom field setting. Below, we outline the two main modalities under which '''+AI Directive''' may be used.<br />
<br />
===Modality 1: Named-Entity Recognition (NER) Parser===<br />
The first method of using the +AI Directive is through named-entity recognition (NER), which enables the AI to identify and designate named entities referenced in a block of unstructured text into pre-defined classifications such as an organization, user, or amount.<br />
<br />
This can be accomplished by adding a hashtag (#) into the +AI Directive field.<br />
<br />
Additionally, you can use this input to specify in plain text how you want the data to be returned by the AI. For example, the following prompts could be used:<br />
<br />
* “Create a summary in one hundred words or less”<br />
* “Create a summary in one hundred words or less and translate into Spanish”<br />
* “Is funding amount requested greater than $1000 answer 1 for Yes or 2 for No”<br />
* “organization as JSON Object”<br />
<br />
===Modality 2: On Demand===<br />
The second modality is referred to as “On Demand”.<br />
You may call this using the +AI Directive field and trigger this with a P3 Script. In this scenario you would enter something like the following into the +AI Directive input:<br />
<br />
<pre>## Compare the following granting program requirements to the grant application and determine its suitability for funding and suggest improvements<br />
<br />
Program eligibility: "@txtProgramEligibility@"<br />
Grant Application: "@txtApplicationBody@"<br />
</pre><br />
<br />
Alternatively, you could do something similar using the Variable Processor. In this scenario you would enter something like:<br />
<br />
<pre><br />
<!--@ai(openai,chatgpt,9)--><br />
Compare the following granting program requirements to the grant application and determine its suitability for funding and suggest improvements<br />
Program eligibility: "@txtProgramEligibility@"<br />
Grant Application: "@txtApplicationBody@"<br />
<!--@aiend--><br />
</pre><br />
<br />
This article will explore use cases using both the named-entity recognition (NER) and the “On Demand” modality utilizing the +AI Directive input.<br />
<br />
===Syntax===<br />
In summary, the following syntax can be used:<br />
<br />
* (NER Parser Modality) To parse the document using the caption, enter a single hashtag ( # ). This will use the record’s '''Caption''' for NER matching.<br />
* (NER Parser Modality) To parse the document with specific instructions, enter a hashtag ( # ) followed by a set of instructions in natural language<br />
* (On Demand Modality) To bypass the NER and trigger the directive with a P3 script, enter double hashtags ( ## ) followed by a set of instructions in natural language. This is used for complex requests that are not suitable for NER parsing.<br />
<br />
===Things to Consider===<br />
* The '''+AI Directive''' input is not available on all standard fields, '''Template''', '''Role''' or '''Category''' custom fields.<br />
* Supported custom field types include: Select One - Dropdown List, Select Many - Checkboxes, Special - JSON, and the Text Box type of fields.<br />
* Supported Standard fields include:<br />
** '''Level 1 Standard Fields''': Name, Description, Start and End Date, Close Date<br />
** '''Level 2 and 3 Standard Fields''': Subject, Description, Location, Start And End Date<br />
** '''User Standard Fields''': First Name, Middle Name, Last Name, Title, Prefix, Suffix, Phone, Phone Extension, Email, Address, Address 2, City, State/Province, Zip/Postal Code<br />
** '''Company Standard Fields''': Name, Address, Address 2, City, State/Province, Zip/Postal Code, Phone, Website<br />
* The text to be parsed must be less than 6000 words. In a future upgrade, this limit will be increased to 32,000 words.<br />
<br />
==Configuration==<br />
In the following section, we will provide a detailed guide on how to configure your system to accomplish various common use cases.<br />
<br />
As an example, let’s solve a common problem with application submissions using '''+AI Directive'''. Applicants submit long documents containing undifferentiated information about the applicant, their organization, their requested funding, and more. We can save time by using the NER Parser modality of '''+AI Directive''' to parse and retrieve the relevant information.<br />
<br />
In this case, let’s use '''+AI Directive''' to read through the application and do the following: pull out the applicant’s contact information, create a short summary of the application, store the organization’s details as a JSON, and answer a few basic criteria questions about the submission.<br />
<br />
This article will walk through the following process:<br />
<br />
# Create a field to store the sample input text that needs to be parsed<br />
# Create a P3 script to run any '''+AI Directives''' specified<br />
# Create a browser button that can be clicked to run '''+AI Directives''' ad-hoc<br />
# Create a field for the AI to store the parsed text to<br />
# Test the final configuration<br />
<br />
<br />
<br />
===Creating a Custom Field to Store Parsed AI Content===<br />
Before we can use the AI, we must create a custom field to store the content the AI will parse.<br />
<br />
# Navigate to the desired UTA > '''Configuration Settings''' > '''Level 1''' tab > '''Custom Fields''' > Click the '''New Field''' button<br />
# Set the '''Field Type''' to be “Text Box - Text Multiple Lines”. This will be used to hold the text that the AI will parse.<br />
# For '''Field Name''' enter “text_block”. For '''Caption''' enter “A Block of Sample Text”<br />
# Click '''Save'''<br />
# Make a note of the '''Custom Field ID''' that was generated after we saved the field. We will reference this ID when we create a P3 script in the next step.<br />
<br />
<br />
===Creating a P3 Script to Run the AI NER Parser===<br />
A P3 script will be used to trigger the NER Parser.<br />
<br />
# Navigate to the desired UTA > '''Configuration Settings''' > '''Level 1''' tab > '''P3 Script Editor''' > Click the '''New P3 Script''' button<br />
# For '''Name''', enter “aiparseApp”<br />
# For '''Source''', enter:<br />
<br />
<pre>session.AIParse(5378575);<br />
session.runAIdirective();</pre><br />
In the first line of the '''Source''', we are telling the system to parse the contents of the “Text Box - Text Multiple Lines” custom field we created in the previous step by passing the '''Custom Field ID''' as a parameter: the syntax is <code>session.AIParse(CustomFieldID);</code>. In the next line, we are instructing the AI to run any '''+AI Directives''' specified on the record to run concurrently. We will specify the '''+AI Directives''' in a later step.<br />
<br />
===Creating a Button to Trigger the AI NER Parser via P3 Script===<br />
# Create a custom field with the '''Field Type''' set to “Special - Browser Script” and set the '''Trigger Type''' to “On Demand”. This field will create a button on the record that will run the P3 script we created earlier. This allows us to run the P3 script ad-hoc.<br />
# For '''Field Name''' enter “ai_browser_script”. For '''Caption''' enter “Run AI Parser”.<br />
# Under the '''Custom Script''' input, enter the following:<br />
<br />
<pre>runP3Script('aiparseApp()')<br />
alert('Parse Complete')<br />
</pre><br />
<br />
The text “aiparseApp” is the name of the P3 script we will create in the next step. If you name your P3 script differently you will need to update that here. The text “Parse Complete” is the message that will display in a yellow alert on screen when the parsing is complete. You may modify this messaging as desired.<br />
<br />
===Storing Applicant Information in a Custom Field===<br />
In this step we will create a custom field and specify that the AI should fill this field with relevant parsed information using the caption as the label for NER.<br />
<br />
# Create a custom field with the Field Type set to “Text Box - Text Single Line”<br />
# For '''Field Name''' enter “applicant_information”<br />
# For '''Caption''' enter “Applicant Information”<br />
# For '''+AI Directive''' enter a hashtag (#). The hashtag symbol lets the AI know that any text related to the '''Caption''' (“Applicant Information”) should be parsed from the original text block and stored in this field.<br />
<br />
===Storing Organization Information in a JSON Custom Field===<br />
In this step, we will create a JSON custom field and populate this field with information related to the organization. In addition, we will ask the AI to format the parsed information as a JSON object.<br />
<br />
# Create a custom field with the Field Type set to “Special - JSON”<br />
# For '''Field Name''' enter “Organization_Information”<br />
# For '''Caption''' enter “Organization Information”<br />
# For '''+AI Directive''' enter “organization as JSON Object”. This lets the AI know that any information about the applicant’s organization in the original text block should be parsed and stored as a JSON.<br />
# (Optional) Toggle on '''Display As Table'''<br />
# Click '''Save'''<br />
<br />
===Parsing and Storing a Application Summary===<br />
In this step we will create a summary from the original source text and we will condense it to be less than 100 words.<br />
<br />
# Create a custom field with the '''Field Type''' set to “Text Box - Text Multiple Lines”<br />
# For both '''Field Name''' and '''Caption''' enter “Summary”<br />
# For '''+AI Directive''' enter “Create a summary in one hundred words or less”<br />
# Click '''Save'''<br />
<br />
===Translating the Application Summary===<br />
In this step we will create a summary from the original source text and we will condense it to be less than 100 words.<br />
<br />
# Create a custom field with the '''Field Type''' set to “Text Box - Text Multiple Lines”<br />
# For both '''Field Name''' and '''Caption''' enter “Summary”<br />
# For '''+AI Directive''' enter “Create a Spanish summary in one hundred words or less”<br />
# Click '''Save'''<br />
<br />
===Populating a Radio Button Based on Parsed Information===<br />
In this step the AI will parse the information and select the correct radio button option.<br />
<br />
# Create a custom field with the '''Field Type''' set to “Select One - Radio Buttons”<br />
# For '''Field Name''' enter “Funding_over_1000”<br />
# For '''Caption''' enter “Is Funding Requested Over $1000”<br />
# For '''+AI Directive''' enter “Is funding amount requested greater than $1000 answer 1 for Yes or 2 for No”. This tells the AI to answer the question based on the parsed information.<br />
# For '''Predefined Options''' enter “1=Yes;2=No”<br />
# Click '''Save'''.<br />
<br />
<br />
===Testing your Configuration===<br />
To test your configuration, do the following:<br />
<br />
# Create a new record in the UTA<br />
# Under the new custom field we created (“A Block of Sample Text”), enter the sample application text. For reference, you may use [[Media:+AI_Directive_Sample_Text_Block.txt | this sample text block]]. <br /><u>'''Note:'''</u> The text must be less than 6000 words. In a future upgrade, this limit will be increased to 32,000 words.<br />
# Save the record<br />
# Click the browser button we created to run the AI parser<br />
# When the script finishes running, it will display the customizable “Parse Complete” alert. This may take a few minutes.<br />
# Reload the record to see the results<br />
<br />
The information will be parsed and populated into the desired fields.<br />
<br />
[[Category:AI]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Custom_Fields_%E2%80%93_General_Information&diff=41094Custom Fields – General Information2023-04-14T12:46:36Z<p>Ciaran: </p>
<hr />
<div>{{Banner-UnderConstruction}}<br />
<br />
<br />
<br />
=Overview=<br />
A '''Custom Field '''is the basic unit of data storage, created on an as-needed basis for your system, and is associated with a [[SmartSimple]] [[entity]] such as a [[User|contact]], [[Organization|organization]], [[User Role|role]], or activity. These fields can be accessed and controlled from either the [[Global Settings]] area of your system, or on the Entity-based '''Settings '''page within a {{UTA}}.<br />
<br />
New custom fields are added on a regular basis - we currently have over 50 field types that can be used to capture and store data. For a full list of Custom Fields, see [[:Category:Custom Fields#Types of Custom Fields|Types of Custom Fields]]. You can also check the [[Upgrades]] section of our Wiki for continuous notice of the latest field types. <br />
<br />
'''Custom Fields '''are used in addition to [[Standard Fields]], which are automatically built into your system (for example, '''Name '''or '''Address '''are typical Standard Fields). While '''Custom Fields '''can be added, removed, and customized, as a general rule Standard Fields cannot be changed, although they might be renamed or modified. <br />
<br />
All fields display data in configurable ways: for example, they can be grouped into tabs or displayed in multiple columns to avoid cluttering the page. <br />
<br />
* The maximum number of custom fields that can be displayed on a single page is 400 total.<br />
<br />
==Accessing Custom Fields==<br />
1. Click the 9-square menu icon on the top right of your page.<br />
<br />
:: {{Icon-Menu}} <br />
2. Under the heading '''Configuration, '''select '''Global Settings.'''<br />
<br />
The hyperlink to '''Custom Fields '''will be available under ''each ''tab. Clicking the '''Custom Fields '''link under a specific tab will bring you to the custom fields that are associated with the purpose of that tab - for example, if you click on the '''Custom Fields '''under the '''User '''tab, this will bring you to a list of all custom fields specifically associated with [[User|users]], both [[Internal|internal]] and [[External|external]]. <br />
<br />
{| class="wikitable"<br />
|-<br />
||'''System - Custom Fields'''<br />
||A list of all custom fields from ''all ''object types in the system.<br />
|-<br />
||'''Organizations - Custom Fields'''<br />
||Create and manage custom fields for '''Branch '''([[Internal]] organization on the [[Organization hierarchy|organization hierarchy]]) and '''Organization '''([[External]])<br />
|-<br />
||'''Users - Custom Fields'''<br />
||Create and manage custom fields for [[User|users]], both [[Internal]] '''Staff '''and [[External]] '''Contacts'''<br />
|-<br />
||'''Associations - Custom Fields'''<br />
||Create and manage custom fields for [[Association Settings|associations]], which can be between companies and users or company-to-company <br />
|-<br />
||'''Transactions - Custom Fields'''<br />
||Create and manage custom fields for [[:Category:Transactions|Transactions]] and [[Transaction Attribution|transactions attributions]]<br />
|}<br />
:: [[File:All custom fields.png|thumb|none|600px|border|All custom fields for system objects]]<br />
:: [[File:Organization custom fields.png|thumb|none|500px|border|Custom fields for Organizations under the Organizations tab]]<br />
When you click into a '''Custom Fields''' hyperlink from the '''Global Settings''' area, you will be brought to a [[List View Overview|list display]] of all available custom fields relating to that part of the system. In order to modify a Custom Field, you can simply select the '''pencil icon''' to the left side of the custom field name, as shown below:<br />
:: [[File:Edit custom field.png|950px|border]]<br />
: <br />
:* Using the '''Search''' function on the top right, you can search through all '''Object Entities''' or through the fields of specific {{UTA}}s. Simply select or deselect to control your results.<br />
:* '''Tip: '''A Search-based strategy for troubleshooting is to clear your past search, select '''All Object Entities '''within the search bar, then click on the '''Last Modified '''field in the list view so that it is in descending [[Sort By|Sort Order]] and you can see the date that a custom field was changed, added, etc. <br />
:* You can also access all deleted fields by clicking into the second tab. There is no time limit within the system that removes deleted records; therefore, you can simply select and restore or purge these previously deleted fields.<br />
:* There should be no reason to purge as Custom Fields do not take up much space within the system.<br />
:* When you restore fields, there is no loss of data. <br />
<br />
=Configuration - Essentials=<br />
<pre>This page will serve as the main repository for setup information that is shared between most field types. To find setup options that are specific to a certain field type, look into the Wiki page for that field type itself. </pre><br />
==Common Custom Field Functions==<br />
On the top left of the Custom Field record will be a row of buttons, each with different functions relating to the field.<br />
<br />
::: [[File:Custom field menu buttons.png|200px|border]] <br />
The following table describes the functionality of each button from left to right: <br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Custom Fields [[List View Overview|list]]'''<br />
||Clicking this '''list chart '''icon will bring you to the list of all custom fields available in this part of the system. For example, if you are on a Custom Field that is found under the '''Organizations '''tab of '''Global Settings, '''you will be brought to a comprehensive list of all custom fields relating to '''Organizations. '''<br />
|-<br />
||<br />
'''New Custom Field '''<br />
<br />
('''+ icon''')<br />
<br />
||Clicking this '''plus icon '''will allow you to create a '''New Custom Field''' in this part of the system. To understand how to create a new custom field by appropriately filling out the different settings, keep on reading the sections in this page below. <br />
|-<br />
||<br />
'''[[Field Data]] '''<br />
<br />
('''stack of coins icon) '''<br />
<br />
||<br />
Clicking this will open up a page that displays all the values that have been saved to the field.<br />
<br />
Custom Field Data consists of two general types: '''text type '''fields (saved as a text string) and '''object type''' fields (consisting of any files such as documents or images).''' '''<br />
<br />
|-<br />
||<br />
'''[[Update History]] '''<br />
<br />
('''reload icon''')<br />
<br />
||<br />
Clicking this will open up a page with a [[List View Overview|list]] of all of the updates to field settings that have been made on this field.<br />
<br />
|-<br />
||<br />
'''Search Reference'''<br />
<br />
('''magnifying glass icon''') <br />
<br />
||<br />
Clicking this will display all of the locations where the custom field is referenced in the system. For more information, see [[Custom Fields – General Information#Custom Field References]]. <br />
<br />
Fields are fully searchable for any related application. For example, [[User Role|role]]-level fields can be searched through the '''Search People '''feature or any application that provides access to contact data. You can also search and replace these values in bulk by using the '''Field Data '''button and specifying the old and new value required. <br />
<br />
|}<br />
<!--Custom Fields share many of the same setup options, so we've listed them here. Please see below:--><br />
<!--<br />
<span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name="FieldOptionsINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FieldOptionsINFO" data-bs-type="template" data-bs-id="4">{{ FieldOptionsINFO }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name="DisplayINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL1@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="1"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" DisplayINFO" data-bs-type="template" data-bs-id="5">{{ DisplayINFO }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name="ValidationINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL2@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="2"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValidationINFO" data-bs-type="template" data-bs-id="6">{{ ValidationINFO }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name="FeatureOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL3@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="3"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" FeatureOptionsINFO" data-bs-type="template" data-bs-id="7">{{ FeatureOptionsINFO }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
<span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name="ValueStorage" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL5@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="5"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL4@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="4"><span class="mceNonEditable template" id="bs_template:@@@TPL6@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="6"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL7@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="7"><span class="mceNonEditable template" id="bs_template:@@@TPL8@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="8"><span class="mceNonEditable template" id="bs_template:@@@TPL8@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="8"><span class="mceNonEditable template" id="bs_template:@@@TPL8@@@" data-bs-name=" ValueStorage" data-bs-type="template" data-bs-id="8">{{ ValueStorage }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><br />
--><br />
The following settings are common to nearly all [[Custom Fields|Custom Field]] types:<br />
:* [[#General Settings|General Settings]]<br />
:* [[#Display & Formatting|Display & Formatting]]<br />
:* [[#Validation|Validation]]<br />
:* [[#Feature Options|Feature Options]]<br />
:* [[#Value Storage|Value Storage]]<br />
{{FieldOptionsINFO}}<br />
{{DisplayINFO}}<br />
{{ValidationINFO}}<br />
{{FeatureOptionsINFO}}<br />
{{ValueStorageINFO}}<br />
<!--<br />
[[Image:Cf1.png]]--><br />
<!--===Field Name and Field ID===<br />
* The field name is mandatory and can be up to 50 characters in length.<br />
* The name should not include special characters that could be misinterpreted by the [[Browser|browser]].<br />
* The Field ID is automatically generated by the system as a number value and is displayed to the right when viewing the list of custom fields.<br />
<!--<br />
[[Image:Cf6.png]] --><br />
<!--<u>'''Referencing Field Names and Field IDs in other Custom Field Types'''</u><br />
<br />
You can reference fields by name or by ID in other fields. The following field types support this type of referencing:<br />
<br />
* '''Display Only''' – External Entity Details.<br />
* '''Display Only''' - Web Page View.<br />
* '''Special''' – Calculated Value.<br />
<br />
The syntax for these field types varies (some are processed on the server and other in a JavaScript in the client) and is explained for the individual field type.--><br />
<br />
==Permissions & Availability==<br />
The second tab available when opening a '''Custom Field '''is usually the '''Permissions & Availability '''section. Although the sectioning of permissions and availability will differ depending on what type of Custom Field it is, as well as to what part of the system it is attached to, the '''Permissions & Availability '''options might look something like this: <br />
<br />
::: [[File:Custom fields permissions and availability.png|500px|border]]<br />
Access to a [[Custom Field|custom field]] is controlled by permissions. These can be found and set in any custom field, on the Permissions and Availability tab. You can set only certain roles to be able to see/edit a field, or you can do the same thing with statuses. An example would be denying the '''Applicant''' role permission to see the '''Decision '''custom field (as this would reveal pre-emptively whether or not their application has been approved or denied). <br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Role - Field Permissions'''<br />
||<br />
'''Allow View Field: '''Click into this text box to select which roles will have the permission to ''view ''this field. When they open up a record in the system that has this field, they will be able to see the field and any content already inputted into it.<br />
<br />
'''Allow Modify Field: '''Click into this text box to select which roles will have the permission to ''modify ''this field. When they open up a record in the system that has this field, they will be able to see the field as well as modify any content that is inputted into it, or put content if there is nothing inputted already.<br />
<br />
'''Deny View Field: '''Click into this text box to select which roles will be ''denied ''permission to view this field. If they open up a record in the system with this field attached, they will not be able to see it on the record details.<br />
<br />
'''Deny Modify Field: '''Click into this text box to select which roles will be ''denied ''permission to ''modify ''this field. If they open up a record in the system with this field attached, they will be able to view this field but ''not ''have the ability to modify its content at all. <br />
<br />
|-<br />
||'''Organizations Status - Field Permissions'''<br />
||<br />
'''Allow View Field: '''Click into this text box to select which [[Status|statuses]] will have permission to ''view ''this field. In this case the status must be relating to the organization - that is, only an organization that ''is ''in the selected statuses will be able to see this field when opening a record.<br />
<br />
'''Allow Modify Field: '''Click into this text box to select which statuses will have permission to ''modify ''this field.<br />
<br />
'''Deny View Field: '''Click into this text box to select which statuses will be ''denied ''permission to view this field. For example, an organization that is in '''Inactive ''''''Status '''might be denied permission to view fields as there is no need for them to know that information.<br />
<br />
'''Deny Modify Field: '''Click into this text box to select which statuses will be ''denied ''permission to ''modify ''this field.<br />
<br />
|-<br />
||'''Category - Field Availability'''<br />
||<br />
'''Include Field For: '''Click into this text box to select which [[Client Categories|organization categories]] will have permission to have this field to fill out. <br />
<br />
'''Exclude Field For: '''Click into this text box to select which [[Client Categories|organization categories]] will not have permission to have this field to fill out. <br />
<br />
|}<br />
<br />
See [[Role Field Permissions]] , [[Field Permissions]], or [[Status Field Permissions]] for more information.<br />
<!--<u>'''Special Field Name Syntax'''</u><br />
<br />
There are two special characters that can be used to prefix the field name. These prefixes control the presentation on the field name in relation to the presentation of the data.<br />
<br />
* The '''Tilde''' ~ is used to display the field name above the field. <br />
<br />
[[Image:Cf7.png]]<br />
<br />
* A '''Hyphen''' “-“ is used exclusively with the '''Title Bar – Multiple Columns''' field to suppress the title bar but display a multiple column layout.<br />
* A '''@''' sign can be used with the built-in field Location in the [[Universal Tracking Application]] to connect the field to the [[User|user’s]] selected mapping service. <br />
--><br />
<!--<u>'''Field Type'''</u><br />
The field type is used to define the characteristics of the field. There are over '''50''' field types currently available.<br />
===[[display order|Display Order]]===<br />
* This setting determines the order that the field will be displayed on the page. The first field that is added to an [[Entity|entity]] will use a display order of 10.<br />
* Additional fields that you add will automatically increase the display order by increments of 10.<br />
* If you wish to insert a field between two fields you can set the display order to a number that will position the field where required.<br />
* You can change the display order by setting the display order to a different number. For example, if you set the display order on a field to 5000 then the next field added will automatically become 5010.<br />
<br />
===Display Order with Related Entities===<br />
If you add [[Custom Field|custom fields]] to the basic contact [[Entity|entity]] and then add fields to [[Role|roles]] associated with [[contact]]s, you will need to take care, as the fields will become mixed if they have the same number sequence.<br />
<br />
The following table outlines where you need to be careful:<br />
<br />
{| border="1"<br />
|-<br />
||'''Entity'''<br />
||'''Related Entity'''<br />
|-<br />
||Contact<br />
||Roles<br />
|-<br />
||Companies<br />
||Categories<br />
|-<br />
||UTA <span class="mceNonEditable template" id="bs_template:@@@TPL11@@@" data-bs-name="l1" data-bs-type="template" data-bs-id="11"><span class="mceNonEditable template" id="bs_template:@@@TPL11@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="11"><span class="mceNonEditable template" id="bs_template:@@@TPL10@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="10"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL10@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="10"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL0@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="0"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL12@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="12"><span class="mceNonEditable template" id="bs_template:@@@TPL13@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="13"><span class="mceNonEditable template" id="bs_template:@@@TPL13@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="13"><span class="mceNonEditable template" id="bs_template:@@@TPL13@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="13"><span class="mceNonEditable template" id="bs_template:@@@TPL13@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="13"><span class="mceNonEditable template" id="bs_template:@@@TPL13@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="13"><span class="mceNonEditable template" id="bs_template:@@@TPL14@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="14"><span class="mceNonEditable template" id="bs_template:@@@TPL14@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="14"><span class="mceNonEditable template" id="bs_template:@@@TPL14@@@" data-bs-name=" l1" data-bs-type="template" data-bs-id="14">{{ l1 }}</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> Entities<br />
||UTA Level 1 Template Entities<br />
|}<br />
<br />
You should start the number sequence for these types of related fields at some higher level. For example, role 1 starts at 5000, role 2 starts at 8000.<br />
<br />
==Common Custom Field Settings==<br />
Each custom field contains a button at the top linking it to the three following settings pages:<br />
<br />
* [[Field Data]] - displays all the values that have been saved to the field.<br />
* [[Update History]] - displays all the updates to field settings.--><br />
<!--* [[Custom Field Language Settings|Language Setting]] - --><br />
<!--* Search Reference - displays all locations where the custom field is referenced in the system.<br />
<br />
===Tab Name===<br />
* If you add a text value to the tab Name, the field will be displayed on that tab.<br />
* The tab name can be any text string.<br />
* Custom fields that are not associated with a tab will be displayed on a tab named Default.<br />
* The Tab Name option appears once the Advanced Options are enabled, on the Classic Options tab.--><br />
<!--<br />
====Fields with No Tab Set====<br />
[[Image:Cf4.png]]<br />
<br />
====Same Fields with Tab set to Creation Details====<br />
[[Image:Cf5.png]] --><br />
<br />
===Visibility Condition===<br />
The '''Visibility Options '''section when opening a Custom Field is available under the '''Permissions and Availability '''tab once the '''Advanced Options '''feature has been enabled.<br />
<br />
::: [[File:Custom fields visibility.png|500px|border]]<br />
In order to enable '''Advanced Options, '''you must toggle on the feature from the top right of your page.<br />
<br />
::: [[File:Advanced options.png|150px|border]]<br />
Whether or not a [[Custom Field|custom field]] is visible can be controlled using conditional statements in this box. You are able to set this visibility condition for new records based on the following options: '''Always Display, Hide on New Record, '''or '''Only Show on New Record.'''<br />
<br />
See [[Visibility Condition]] for more information.<br />
<br />
==Classic Options==<br />
The last tab available when opening a Custom Field record is usually the '''Classic Options '''section. <br />
<br />
::: [[File:Custom fields classic options.png|750px|border]] <br />
{| class="wikitable"<br />
|-<br />
||'''Tab Name'''<br />
||<br />
If you add a text value to the '''Tab Name, '''this field will be displayed on that tab. <br />
<br />
:* The tab name can be any text string.<br />
:* Custom Fields that are not associated with a tab will be displayed on a tab that is labelled '''Default.'''<br />
:* The '''Tab Name '''option only appears once the '''Advanced Options '''are enabled on the '''Classic Options '''tab. <br />
<br />
|-<br />
||'''Custom HTML Tag'''<br />
||<br />
Use this field for additional attributes to the field HTML tag. For example, you can add HTML such as ''style="background-color"=00ff00 ''in order to color the background for this field box.<br />
<br />
'''Searchable - '''<br />
<br />
'''Read Only - '''<br />
<br />
'''Enable [[KML]] - '''<br />
<br />
'''Disable Quick Edit - '''Toggling on this option will not allow the user to modify this field using the system's [[Quick Edit]] functionality.<br />
<br />
'''Disable Field from Global Search - '''Toggling on this option will remove this field from any results that appear with the system's [[Global Search]] functionality. <br />
<br />
|}<br />
===Custom Field References===<br />
This feature is intended to help determine the impact of a custom field change by highlighting where the custom field is referenced within the system.<br />
Each Custom field has a '''Search Reference'''--this button is found in the action bar, and can be identified by the magnifying glass icon.<br />
<!--<br />
[[Image:SearchReference1.png|border]]--><br />
<br />
When used, the feature will search references to this custom field via variable syntax in various areas, including:<br />
<br />
:* Other custom field options/visibility condition, including [[JavaScript Validation]], [[Visibility Condition]], [[Custom Field Type: Special – Calculated Value|calculated values]], etc.<br />
:* [[Template / Type Formula|Template formulas]]<br />
:* [[Submit buttons]]<br />
:* [[Submit Logic]]<br />
:* [[SmartCheck Validation]]<br />
:* [[Workflow Task]]<br />
:* [[Creating_a_Single_Step_Workflow#Connecting_Tasks|Workflow connectors]]<br />
:* Data class policy<br />
[[Image:SearchReference2.png|border]]<br />
<br />
===Import and Export Custom Fields===<br />
You can use the custom field '''Import''' and '''Export''' features to move or copy custom fields from one [[Entity|entity]] to another (or even another instance of [[SmartSimple]]). The custom fields are exported and importing by using [[XML]] format.<br />
<!--<br />
[[Image:Cf10.png|link=]]--><br />
<br />
To export a block of custom fields, simply click the ''Export'' button at the top of a list of custom fields. A window will pop up showing the custom field settings in XML format:<br />
<br />
[[Image:ImportExportCustomFields.png|link=|500px]]<br />
<br />
The XML block for the entire set of custom fields in the list will be displayed. Individual custom fields are delineated by the tags. Simply copy the block of custom fields you want to copy (you can make edits, e.g. to the [[display order]] in a text editor), click on the ''Import'' button at the top of the list of custom fields where you want to place the new fields, paste the XML block into the blank text area, and confirm that you want to import the fields by clicking ''Import'' at the bottom of the Import pop-up.<br />
<br />
The majority of field settings will be included in the copied fields. Exceptions include:<br />
<br />
:* any [[Field Permissions]]<br />
:* any [[Field Permission Matrix]] assigned to the original custom field<br />
:* any [[Value Stores To]] setting assigned on the original custom field<br />
:* the ''Description'' setting<br />
However, [[Field Permissions]] and [[Field Permission Matrix|Field Permission Matrices]] can be assigned to the new fields using the [[Batch Update]] feature.<br />
<br />
As the [[custom field ID]] is unique to each custom field in the system, the custom field IDs will not be copied. Any newly created custom fields using the Export/Import feature will be assigned new custom field IDs.<br />
<br />
Also see [[Custom Field Import Wizard]]<br />
<br />
===Custom Field Types===<br />
The full list of '''Custom Field Types''' can be found on the [[:Category:Custom Field Types|Custom Field Types]] page.<br />
<br />
==See Also==<br />
:* [[Batch Update Custom Field Settings]]<br />
:* [[Reporting on Custom Fields]]<br />
[[Category:Custom Fields]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40745SmartCheck Validation2023-02-14T15:06:29Z<p>Ciaran: /* Comparing two custom date fields with separate custom time fields storing 24 hour time */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == ""){ <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) { <br />
result.isPassed=false;<br />
result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") { <br />
result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />
}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) { <br />
result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />
}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40744SmartCheck Validation2023-02-14T15:00:11Z<p>Ciaran: /* Multi file upload field has no files */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == ""){ <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) { <br />
result.isPassed=false;<br />
result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") { <br />
result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />
}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) { <br />
result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />
}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40743SmartCheck Validation2023-02-14T14:54:47Z<p>Ciaran: /* Single field upload field has no file */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == ""){ <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) { <br />
result.isPassed=false;<br />
result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") { <br />
result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />
}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) {<br /> result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40742SmartCheck Validation2023-02-14T14:52:51Z<p>Ciaran: /* Requested Amount less than X */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == ""){ <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) { <br />
result.isPassed=false;<br />
result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") {<br /> result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) {<br /> result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40741SmartCheck Validation2023-02-14T14:51:08Z<p>Ciaran: /* Application Name field blank */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == ""){ <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) {<br /> result.isPassed=false;<br /> result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") {<br /> result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) {<br /> result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40740SmartCheck Validation2023-02-14T14:50:17Z<p>Ciaran: /* Application Name field blank */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == "") <br />
result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br />
}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) {<br /> result.isPassed=false;<br /> result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") {<br /> result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) {<br /> result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartCheck_Validation&diff=40739SmartCheck Validation2023-02-14T14:49:30Z<p>Ciaran: /* Application Name field blank */</p>
<hr />
<div>=Overview=<br />
SmartCheck Validation is a secure server side validation method. It enables custom field validation ensuring that applications and form inputs meets specified criteria and returns. It provides a better user experience than other validation methodologies and is preferred over Submit Logic. With SmartCheck, the user can see error messages in context and in one central place.<br />
<br />
Before SmartCheck Validation, some error message would pop up individually, one after another, and some messages would appear in one box at the top, depending on how you setup your validation.<br />
<br />
[[image:Smartcheck validationOLD.png]]<br />
<br />
<br />
With SmartCheck Validation and the message type of '''Field''', you will see all messages in one central spot as well as in context messages. See image below.<br />
<br />
<br />
[[image:Smartcheck validation1.png]]<br />
<br />
Clicking on the '''x''' within the in context error message, such as the description field above, enables you to temporarily hide the message. Clicking the error message at the top will bring the cursor to the field where the error is present (if there is a corresponding input). The context error message will also disappear when you have modified the value within field in question.<br />
<br />
<br />
Before you can use SmartCheck validation you must . . .<br />
<br />
1. Configure SmartCheck Validation<br />
<br />
2. Add SmartCheck Validation to Submit Button<br />
<br />
3. Enable SmartCheck Validation<br />
<br />
Note that once you turn on SmartCheck Validation it is enabled everywhere. If you already set up submit logic or other validation before you turned on SmartCheck validation, you will need to test your validation to ensure it works as expected and or replace it with SmartCheck validation.<br />
<br />
<br />
<br />
=Configure SmartCheck Validation=<br />
SmartCheck Validation can be configured for each object type in the system (i.e. individual [[Entity|UTA Level 1/2/3]], company, user, transaction) and then be attached to a Submit button.<br />
<br />
<br />
1. Each entity will have a SmartCheck Validation link available in the corresponding Settings page. Click on this to begin the process of configuring the SmartCheck validation statements.<br />
<br />
[[Image:SmartCheck1.png|700px]]<br />
<br />
<br />
2. The Smartcheck Validation list view will display. There will be a '''New Validation''' button along the top. Click this.<br />
[[Image:SmartCheckLV.png|800px]]<br />
<br />
3. The SmartCheck validation screen will display, comprised of the following 3 tabs . . .<br />
<br />
* Main<br />
* Code Builder<br />
* Source<br />
<br />
<br />
4. Enter appropriate name and description text into the relevant fields on the Main tab and click Save.<br />
<br />
[[Image:SmartCheck2.png|800px]]<br />
<br />
<br />
5. Navigate to the Code Builder tab to add validation using 2 possible approaches.<br />
<br />
* ''New validation:'' Use the drop-downs at the top of the screen to create new validation. Further details on the options available are provided in the SmartCheck Validation Structure section below.<br />
<br />
[[Image:SmartCheck3.png|800px]]<br />
<br />
<br />
<br />
* ''Existing Submit Logic'': Use the drop-down at the bottom of the screen to select a submit button and any existing validation associated with this button.<br />
<br />
[[Image:SmartCheck4.png|800px]]<br />
<br />
<br />
6. Click on the Insert button under the relevant section. This will take you to the Source tab, and show the updated validation statement.<br />
<br />
[[Image:SmartCheck5.png|800px]]<br />
<br />
<br />
7. Click the Save button to store all changes.<br />
<br />
8. Use the Trial Run at the bottom of the Source tab to check whether there are errors when the validation statements run.<br />
<br />
<br />
<br />
=Add SmartCheck Validation to Submit Button=<br />
Once the validation statements are created you can start to add the logic to [[Submit & Save Buttons|Submit or Save buttons]].<br />
<br />
1. Each entity will have a [Submit & Save Buttons]] link available in the corresponding Settings page. Click on this to begin the process of adding the SmartCheck validation statements to a button.<br />
<br />
[[Image:Submit and save button1.png|700px]]<br />
<br />
<br />
2. The Submit & Save Buttons page is displayed, showing a list of configured buttons. Click on the Edit button for the one you wish to edit.<br />
<br />
<br />
3. Select the SmartCheck Validation option from the corresponding drop-down<br />
<br />
[[Image:SmartCheck6.png|800px]]<br />
<br />
<br />
4. Click Save at the bottom of the page.<br />
<br />
<br />
<br />
=Enable SmartCheck Validation=<br />
# In the top header, click the '''Configuration''' drop down.<br />
# Select '''Global Settings'''.<br />
# On the first tab called System, Check the box beside '''Activate SmartCheck Validation'''.<br />
# Click '''Save'''.<br />
<br />
<br />
<br />
=SmartCheck Update History=<br />
Changes to the SmartCheck logic can be tracked using the Update History feature, which is available against each configured SmartCheck validation.<br />
<br />
[[Image:SmartCheckHistory.png]]<br />
<br />
<br />
If user clicks on the Update History button then are presented with an overview of all changes made to that specific SmartCheck validation, including date and time and the person who made the change.<br />
[[Image:SmartCheckHistory2.png|600px]]<br />
<br />
<br />
Users can also compare versions by checking the box on the left of the list view and then clicking on the Compare button.<br />
[[Image:SmartCheckHistory3.png|500px]]<br />
<br />
<br />
Users will be presented with screen showing differences between the 2 versions.<br />
<br />
[[Image:SmartCheckHistory4.png|600px]]<br />
<br />
=SmartCheck Validation Structure=<br />
Each SmartCheck Validation statement shares the following structure:<br />
<br />
* '''If''' Statement (condition to be tested)<br />
* '''Result''' (assigned result based on the condition)<br />
* '''Message''' (to be displayed when result is false)<br />
<br />
<br />
In the example below:<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}<br />
if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
If custom field is a currency and the format will change based on different locales, use ssParseNumFromCurrency(value,locale,getnumtype,emptyok):<br />
<br />
- "@sslocale@" returns the logged in user's locale, e.g. "fr-CA"<br />
<br />
- getnumtype: 1=real number (10000,78 becomes 10000.78), 2=formatted currency (10000,78)<br />
<br />
- emptyok: field can be empty<br />
<br />
Example: ssParseNumFromCurrency("10000,78","fr-CA",1,true) will return 10000.78<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myCADcurrency"),"@sslocale@",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
For other currencies with format regardless of user's locale, such as DKK, it can be implemented as:<br /> ssParseNumFromCurrency(value,getLocalestrByCurrency('DKK'),1,true) OR ssParseNumFromCurrency(value,"da-DK",1,true)<br />''(getLocalestrByCurrency will get the "default" locale of the currency code)''<br />
<br />
<pre>if(ssParseNumFromCurrency(form.getStr("cf_myDKKcurrency"),"da-DK",1,true) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
Recognize the If, Result, Message structure:<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5)<br />
</pre><br />
Check '''If''' the contents the of the form value (stored in the custom field named cf_Store_Value) is greater than 5,<br />
<br />
<pre>result.isPassed=false;<br />
</pre><br />
Assign the value of the '''Result''' to '''"false"''' and print the custom message below.<br />
<br />
<pre>result.addMsg('Some message here');<br />
</pre><br />
<br />
=Form Value vs Stored Value=<br />
In the SmartCheck code builder there is a select where you choose between '''Form Value''' and '''Stored Value'''. The '''Form Value'''' is the value someone has entered into his or her application (form), this includes information that has not been saved. The '''Stored Value''' is the value from the server (information that has been saved). By using the '''Form Value''' you can validate based on information that the user has entered into the form even if they have not clicked save on their application.<br />
<br />
<br />
Here is how it looks when you call the Form Value for a standard field:<br />
<br />
<pre>if(form.getStr("sf_Application Name") == "")</pre><br />
<br />
Here is how it looks when you call the Stored Value for the same standard field:<br />
<br />
<pre>if("@Application Name@" == "")</pre><br />
<br />
Notice the stored value calls the field using the variable syntax we learned in the variable processor lesson.<br />
<br />
<br />
<br />
=Field vs System Messages=<br />
In the SmartCheck code builder there is a select where you can choose between '''Field''' and '''System''' Messages. '''Field''' messages appear both at the top of the application and on the field that failed validation, this type is recommended for most validations. '''System''' messages appear only at the top of the application. You might use System messages when your validation compares more than one field, as it may not be obvious which field to highlight with the error message.<br />
<br />
<br />
Here is how it looks when you call a system message:<br />
<br />
<pre>result.addMsg('Your message goes here.');</pre><br />
<br />
Here is how it looks when you call a Field message on a custom field:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.');</pre><br />
<br />
Notice the field name is added before your message, so the system knows where to place the validation message, and the system knows where to bring your cursor should you click the message.<br />
<br />
=Configuring Messages for Multilingual Systems=<br />
Messages can also be displayed in different languages based on the user's language of choice within the portal. The langid variable for the language must be included within the syntax to tie the message to a particular language setting.<br />
<br />
<br />
The message below would only be shown for the English language:<br />
<br />
<pre>result.addMsg('Your message goes here.', 1);</pre><br />
<br />
The langid could also be used for Field messages:<br />
<br />
<pre>result.addMsg("cf_@field name.id@", 'Your message goes here.', 1); </pre><br />
<br />
And the following is an example with multiple languages:<br />
<br />
<pre>if(((form.getStr("cf_Strategy").length() - form.getStr("cf_Strategy").replace(';','').length())>4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Strategy.id@",'You can pick up to 4 primary strategies you use.', 1);<br />
result.addMsg("cf_@Strategy.id@",'Puedes elegir 4 estrategias principales.', 14);<br />
result.addMsg("cf_@Strategy.id@",'Vous pouvez choisir à 4 stratégies primaires', 6);<br />
result.addMsg("cf_@Strategy.id@",'Você pode escolher 4 estratégias primárias.', 16);<br />
}</pre><br />
<br />
'''Important:''' The langid variable cannot be selectively applied to the messages, it must be included in every SmartCheck message within the system.<br />
<br />
=Examples=<br />
===Check an amount is greater than $100,000===<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Application Name field blank===<br />
<pre>if(form.getStr("sf_Application Name") == "") {<br/> result.isPassed=false;<br />
result.addMsg('Application name cannot be blank');<br/>}</pre><br />
<br />
===Requested Amount less than X===<br />
<pre>if(ssParseNum(form.getStr("cf_Requested Amount")) < 5000) {<br /> result.isPassed=false;<br /> result.addMsg("cf_@Requested Amount.id@",'Field test message');<br />
}</pre><br />
<br />
===Number value greater than 5===<br />
<pre>if(ssParseNum(form.getStr("cf_Store Value")) > 5) {<br />
result.isPassed=false;<br />
result.addMsg('Some message here');<br />
}</pre><br />
<br />
===Single field upload field has no file===<br />
<pre>if("@Single File Field.filename@" == "") {<br /> result.isPassed=false;<br />
result.addMsg('Please upload a file here');<br />}</pre><br />
<br />
===Multi file upload field has no files===<br />
<pre>if(ssParseNum("@level1.MUlti upload.numoffiles@") < 1) {<br /> result.isPassed=false;<br />
result.addMsg('Please upload at least one file');<br />}</pre><br />
<br />
===Dynamic XML field has no entries===<br />
<pre>if("@xml.fieldname.sectionnodename.rownodename.nodecount@"==0) {<br />
result.isPassed=false;<br />
result.addMsg("xml_@fieldname.id@",'At least one entry is required in the XML worksheet.');<br />
}</pre><br />
<br />
===Comparing two custom date fields with separate custom time fields storing 24 hour time===<br />
<pre>if(ssConvertDate(form.getStr("cf_Event Start Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event Start Time") >= ssConvertDate(form.getStr("cf_Event End Date"),"@dateformat@", "yyyy-mm-dd")+' '+form.getStr("cf_Event End Time")) {<br /> result.isPassed=false;<br />
result.addMsg("cf_@Event End Time.id@",'End Date must take place after the Start Date');<br />
}</pre><br />
<br />
===Comparing a date custom field to the current date===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Individual Review Start Date"), "@dateformat@", "yyyy-mm-dd") > "@date(currentdate)@")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Individual Review Start Date.id@", 'Please enter a date less than or equal to today for the date.');<br />
}</pre><br />
<br />
===Comparing a date custom field to a date that is six months ago (date must be at least six months ago)===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date"),"@dateformat@", "yyyy-mm-dd") > "<!--@sscalculation(DATE_ADD('@date(currentdate)@', INTERVAL -6 MONTH))-->"){<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date.id@","Date must be at least 6 months prior to today's date");<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Ensuring an entered date is at least 3 business days away===<br />
<pre>if(ssConvertDate(form.getStr("cf_Date EOI Revision Deadline"),"@dateformat@",'yyyy-mm-dd') < "<!--@sscalculation(SS_FUNC.addbusdays('@date(currentdate)@',3))-->") {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Date EOI Revision Deadline.id@",'Date must be at least 3 business days away');<br />
}</pre><br />
NOTE: When using @sscalculation, you <u>must</u> wrap the syntax in double quotes<br />
<br />
===Date custom field blank===<br />
<pre>if ((ssConvertDate(form.getStr("cf_Project Start Date"), "@dateformat@", "yyyy-mm-dd") == "yyyy-mm-dd")) {<br />
result.isPassed = false;<br />
result.addMsg("cf_@Project Start Date.id@", 'Project Start Date is a required field.');<br />
}</pre><br />
<br />
===Validation on a Select Many Checkbox Field===<br />
<pre>if(form.getStr("cf_Request Type").indexOf("General Operating")==-1 ) {<br />
result.isPassed=false;<br />
result.addMsg('General Operating was not selected');<br />
}</pre><br />
To trigger when the value is selected, use '!=-1'. This would normally be used in combination with another field for validations.<br />
<br />
===Select Many Checkbox field has at least 5 values selected===<br />
<pre>if(((form.getStr("cf_Check Box Field").length() - form.getStr("cf_Check Box Field").replace(';','').length())<=4)) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Check Box Field.id@",'At least 5 items must be selected.');<br />
}</pre><br />
<br />
===At least one role is selected on a contact===<br />
<pre>if("@rolelist@" == "") {<br />
result.isPassed=false;<br />
result.addMsg('At least one role must be selected.');<br />
}</pre><br />
<br />
===Validation on an e-mail field===<br />
<pre>if(!isEmail(form.getStr("cf_Additional Email 1"))) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@Additional Email 1.id@",'Please enter a valid e-mail address.');<br />
}</pre><br />
<br />
===Validate that the status of the organization is Active===<br />
<pre>if("@client.status@" != "Active") {<br />
result.isPassed=false;<br />
result.addMsg('Please update your Organization Profile then return to this record and click Submit Application.'); <br />
}</pre><br />
<br />
===Validation on a Note Enabled Multiple-Line custom field===<br />
When validating against a Note Enabled field, within the result.addMsg() alert you will need to include '''h''' in-front of the custom field reference.<br />
<br />
<pre>if(form.getStr("cf_notefield")=="") {<br />
result.isPassed= false;<br />
result.addMsg("cf_h@notefield.id@","You must type in a description before submitting for revisions.");<br />
}</pre><br />
<br />
===Minimum word count limit===<br />
Used on multiline text fields to limit the minimum word entry<br />
<br />
<pre>if(ssParseNum(form.getStr("cf_Amount Requested")) > 100000) {<br />
result.isPassed=false; <br />
result.addMsg("cf_@Amount Requested.id@",'Amount Requested cannot exceed $100,000');<br />
}</pre><br />
<br />
===Count contacts in a specific role===<br />
Used to ensure at least one contact is attached to the record in a specific role<br />
<br />
<pre>if("@level1.[#(?object=contact::criteria=rolename IN ('Panel Reviewer - Pending','Panel Reviewer - Accepted')::groupfunction=count)~userid~#]@" < "1") {<br />
result.isPassed=false;<br />
result.addMsg("Please assign reviewers in the Panel Reviewer Pending or Panel Reviewer Accepted role."); <br />
}</pre><br />
<br />
===Defining VAR Variables===<br />
Using var javascript variables to define values to be evaluated within the SmartCheck Validation.<br />
<br />
<pre>var countWatch="[#(?object=activity::criteria=typename='Watchlist Scan' and statusname='Scan Run')~count(eventid)~#]";<br />
<br />
if(countWatch=="0") {<br />
result.isPassed=false;<br />
result.addMsg('Please run a watchlist scan.');<br />
}<br />
</pre><br />
<br />
===Application Limit Check via Specific Criteria===<br />
Validating an application via a custom field on the form and pulling that into report criteria.<br />
<br />
<pre>var maxstores="TEST@ReportProperty2(32735,exportdata,,'@displ_FY@::@typeid@')@";<br />
var selectedstore=form.getStr("cf_txt_StoreNumber");<br />
var y=maxstores.indexOf(selectedstore);<br />
<br />
if(y!=-1) {<br />
result.isPassed=false;<br />
result.addMsg("cf_@txt_StoreNumber.id@",'Test');<br />
}</pre><br />
<br />
==To include other scripts into a SmartCheck script:==<br />
<pre>//@include(AnotherSmartCheckScriptName)@<br />
</pre><br />
<br />
==Validating Currency Fields with Formatting Enabled:==<br />
Please see [[SsParseNum|ssParseNum: When Using Show Currency Format in Edit Mode]]<br />
<br />
==See Also==<br />
* [[Submit buttons]]<br />
* [[Status]]<br />
* [[Submit Logic on Save or Save Draft Buttons]]<br />
<br />
<br />
[[Category:Applications]][[Category:Global Settings]][[Category:Validation]][[Category:How]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Web_Page_View_Field_Variables&diff=40467Web Page View Field Variables2022-12-22T18:36:58Z<p>Ciaran: /* See Also */</p>
<hr />
<div>The [[Web Page View Field]] provides the ability to display a fully formatted document or web page.<br />
<br />
In constructing this type of page HTML is used in conjunction with the following variables.<br />
<br />
=Variable List=<br />
==Current User==<br />
''Note: "me" -- refers to the current user''<br />
<br />
'''@me.firstname@ will be replaced by current user's firstname'''<br />
<br />
'''@me.lastname@'''<br />
<br />
'''@me.email@'''<br />
<br />
'''@me.phone@'''<br />
<br />
'''@me.companyname@'''<br />
<br />
'''@me.type@''' (returns 'User', 'Local User Administrator' or 'Global User Administrator')<br />
<br />
==UTA Level 1, Sales Opportunity and Job Variables==<br />
'''@name@''' - standard field '''Application Name'''.<br />
<br />
'''@type@''' - standard field '''Application Template Type'''.<br />
<br />
'''@status@''' - standard field '''Status'''<br />
<br />
'''@typecaption@''' - standard field '''Application Template Type Caption'''.<br />
<br />
'''@statuscaption@''' - standard field '''Status Caption'''<br />
<br />
'''@type_lang@''' - standard field '''Application Template Type (Based on user language setting)'''.<br />
<br />
'''@status_lang@''' - standard field '''Status (Based on user language setting)'''<br />
<br />
'''@description@'''<br />
<br />
'''@requirements@'''<br />
<br />
'''@currency@'''<br />
<br />
'''@revenue@'''<br />
<br />
'''@probability@'''<br />
<br />
'''@modifiedby@''' / '''@modifiedbyid@'''<br />
<br />
'''@modifieddate@'''<br />
<br />
'''@closedate@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@createddate@'''<br />
<br />
'''@createdby@'''<br />
<br />
'''@jobquestions@''' - displays as combo boxes<br />
<br />
'''@jobquestionsr@''' - displays question only<br />
<br />
'''@jobskills@'''<br />
<br />
<br />
'''@owner.field@'''<br />
<br />
Example: '''@owner.fullname@''' or '''@owner.address@'''<br />
<br />
'''@person.field@'''<br />
<br />
Example: '''@person.fullname@''' or '''@person.address@'''<br />
<br />
<br />
'''@company.field@'''<br />
<br />
Example: '''@company.name@''' or '''@company.address@'''<br />
<br />
<br />
'''@company.owner.field@'''<br />
<br />
Example '''@company.owner.email@'''<br />
<br />
'''@branch.field@'''<br />
<br />
Example: '''@branch.name@''' or '''@branch.address@'''<br />
<br />
'''@apptype@''' the Application ID (appid) of the UTA.<br />
<br />
==UTA Level 2 / Activities Variables==<br />
'''@subject@'''<br />
<br />
'''@description@'''<br />
<br />
'''@location@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@isallday@'''<br />
<br />
'''@modifieddate@''' (numeric value including time)<br />
<br />
'''@longmodifieddate@''' (text value excluding time)<br />
<br />
'''@starthour@''' - (0-23)<br />
<br />
'''@starth@''' - (0-12)<br />
<br />
'''@startpmam@''' - (PM or AM)<br />
<br />
'''@startminute@'''<br />
<br />
'''@endhour@''' - (0-23)<br />
<br />
'''@endh@''' - (0-12)<br />
<br />
'''@endpmam@''' - (PM or AM)<br />
<br />
'''@endminute@'''<br />
<br />
'''@owner@'''<br />
<br />
'''@eownerid@''' - userid of the owner<br />
<br />
'''@contact@'''<br />
<br />
'''@assigned@'''<br />
<br />
'''@eventid@'''<br />
<br />
'''@typename@'''<br />
<br />
'''@objectid@'''<br />
<br />
'''@objecttype@'''<br />
<br />
'''@rootcompanyid@'''<br />
<br />
'''@rootcompany.name@'''<br />
<br />
'''@contact.field@'''<br />
'''@eamount@'''<br />
<br />
Example: @contact.firstname@ or @contact.email@<br />
<br />
'''@assigned.field@'''<br />
<br />
Example: @assigned.firstname@ or @assigned.email@<br />
<br />
'''@contact.company.field@''' (same as assigned)<br />
<br />
Example: @contact.company.address@ or @contact.company.city@<br />
<br />
<u>'''Custom Field Variables'''</u><br />
<br />
'''@customfield name@ - by name'''<br />
<br />
'''or'''<br />
<br />
'''@#customfield id#@ - by id'''<br />
<br />
Example: @more information@ or @#17342#@<br />
<br />
<br />
See Also: [[Invoice Module Variables]] for Variables specific to the Invoicing module.<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 2'''</u><br />
<br />
If your '''Web Page View''' is at Level 2, you can call Level 1 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
Example: '''@parent.status@''' or '''@parent.startdate'''@ or '''@parent.#12345#@'''<br />
<br />
<br />
==UTA Level 2 variables called from UTA Level 3==<br />
When working at Level 3, you can call Level 2 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 3'''</u><br />
<br />
If your '''Web Page View''' is at Level 3, you can call Level 1 variables using:<br />
<br />
'''@parent.parent.'''''fieldname'''''@''' or '''@parent.parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''Level 3 Associated Parent (Opportunity) '''</u><br />
<br />
Where Payment Allocation is enabled you have two models to choose from before configuring: usually the Associated Parent is a Funding Stream of Overall Budget (event) and the associated object is the Disbursement (Level 3). In less granular cases the Associated Parent is the opportunity.<br />
<br />
<u>'''Level 3 Associated Parent'''</u><br />
<br />
<br />
If Payment Allocation is enabled, you can pull fields from the Associated Parent using the following variable:<br />
<br />
'''@linkparent.''fieldname''@'''<br />
<br />
If your associated payment is linked to the event you can pull fields from the opporunity using the following variable:<br />
<br />
'''@linkparent.''parent''.fieldname@''' So '''@linkparent.''parent''.branch@''' will return: '''SmartSimple Inc.'''<br />
<br />
On the company/branch:<br />
<br />
'''@linkparent.parent.branch.''Transit''@''' will return: '''''1950'''''<br />
<br />
=Field List=<br />
<u>'''People Fields'''</u><br />
<br />
firstname, lastname, fullname, title, email, phone, company, address, address2, city,<br />
province, state, country, postalcode, owner, modifieddate, cost, costunit, type,<br />
resourcename, isrecource, uprefix (prefix), usuffix (suffix), uphoneext (Phone Extension)<br />
<br />
<u>'''Company Fields'''</u><br />
<br />
name, address, address2, city, province, state, country, postalcode, phone, fax, website<br />
<br />
<u>'''Lead Fields'''</u><br />
<br />
status, description, name, phone, fax, address, address2, city, state, province, country,<br />
postalcode, website, firstname, lastname, contactphone, title, email, dat_added<br />
<br />
=UTA Contact and Account Variables=<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname'''''@</span><br />
Assigned (Level 2 only):<br />
<br />
: <span style="font-size: medium;">'''@assigned.''fieldname''@'''</span><br />
Company (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@client.''fieldname''@'''</span><br />
Use @client.categoryids@ to return a list of [[Determining the categoryid|category IDs]] - comma delimited - note the leading comma - e.g. ",1234,555,666,"<br />
<br />
Use @client.categories@ to return a list of category names - comma delimited e.g. "Agency,Marketing,Good client"<br />
<br />
==Level 1 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact/account in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename.fieldname''@''' </span> &nbsp; or &nbsp; <span style="font-size: medium;"> '''@company.''rolename.fieldname''@'''</span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact/account on the Level One item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contact.adjuster.firstname@ or @company.funding agency.address@<br />
<br />
Note: if there is more than one contact/account assigned with the rolename specified, only one will be displayed.<br />
<br />
===List===<br />
To display a list of multiple contacts/accounts in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~''fieldname''~ #]''' </span> or <span style="font-size: medium;"> '''[#(?object=company) ~''fieldname''~ #]''' </span><br />
See [[#To display a list of Activities (Level 2 or 3), Notes, Contacts or Companies|below]] for details on how to filter and sort the list(s).<br />
<br />
* '''Note''': to display the role that the contact or account is assigned on the Level 1 record use: <span style="font-size: medium;">'''~role~'''</span><br />
* '''Note''': to display the name of the contact's company use: <span style="font-size: medium;">'''~companyname~'''</span><br />
<br />
==Level 2 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact in the Level 2 contacts section:<br />
<br />
: <span style="font-size: medium;">'''@contacts.''rolename.fieldname''@''' </span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact on the Level Two item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contacts.adjuster.firstname@<br />
<br />
Note: if there is more than one contact assigned with the rolename specified, only one will be displayed.<br />
<br />
===Contacts===<br />
To display a list of the contacts assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To display only contacts assigned at Level 2 with a specific role/roles (only relevant if the Level 2 Multiple Contact List is enabled)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact::criteria=roleid=12345) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To get the intersection record identifier (equivalent to ~oprid~ at Level 1) (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~lnkid~ #]'''</span><br />
To display the contact's profile status:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~ustatusid~ #]'''</span><br />
'''Notes:'''<br />
<br />
* Contacts at level 2 cannot be filtered by rolename, only roleid<br />
* If the multiple contact list is enabled use '''~role~''' to display the assigned role.<br />
<br />
===Accounts===<br />
To display information for a <u>single</u> account in the Level 2 accounts section:<br />
<br />
: <span style="font-size: medium;">'''@companies.''rolename.fieldname''@'''</span><br />
To display a list of the companies assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company::orderby=name)~name~ #]'''</span><br />
To get the intersection record identifier (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company) ~clnkid~ #]'''</span><br />
'''Notes:'''<br />
<br />
:* The Account standard field is only available at Level 2 when the Multiple Account list is enabled. See [[Relating Contacts and Accounts to the Universal Tracking Application#The Account List Field|here]] for details.<br />
<br />
==To display Level 1 Company Role or Contact Role custom fields==<br />
<span style="font-size: medium;">'''[#(?object=company;)$?opc_''customfieldid''$#]'''</span> or <span style="font-size: medium;">'''[#(?object=contact;)$?opr_''customfieldid''$#]'''</span><br />
<br />
<br />
'''where:'''<br />
<br />
* customfieldid = the numeric id of the custom field<br />
<br />
'''Note:''' for level 2 records (when the multiple contact/company list(s) are enabled) use $?opr2_''customfieldid''$ and $?opc2_''customfieldid''$<br />
<br />
Following the same format above, you can also reference custom fields on the company role using the @#field id#@ syntax.<br />
<br />
<u>'''Contact Detail'''</u><br />
<br />
~uprefix~ ~firstname~ ~lastname~<br />
<br />
~uaddress~ ~uaddress2~<br />
<br />
~ucity~, ~ustate~ ~upostalcode~<br />
<br />
==To display Company Association or Contact Association fields==<br />
The syntax for extracting information on the entity to which they are associated is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association)~name~ ~standard field name~ $?afc_custom field id$ $?afc_custom field name$#]<br /><br />
<br />'''[#(?object=companyassociation)~standard field name~ $custom field id$ $custom field name$#]'''</span><br />
<br />
'''where:'''<br />
<br />
* standard field name = name of the standard field<br />
* custom field id = the numeric id of the custom field<br />
* custom field name = the name of the custom field<br />
<br />
<br />
The syntax for extracting information on fields that are on the intersection, rather than the entity to which they are associated, is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association) ~afcompanyid~ #]<br /><br />
<br />'''[#(?object=companyassociation)~afroleid~ #]'''</span><br />
<br />
<br />
Other '''intersection''' specific variables options include:<br />
<br />
* ~afcid~: association (intersection) record id.<br />
* ~afcompanyid~: [[companyid]] of associated company<br />
* ~afcontactid~: [[userid]] of associated contact<br />
* ~afroleid~: [[roleid]] of association<br />
* ~afstartdate~: start date of association<br />
* ~afenddate~: end date of association<br />
<br />
==Role Based Custom Fields==<br />
When you have a [[Custom Field]] such as a [[Web Page View]] or [[MS Word Merge]] that is located <u>'''on'''</u> a User Role or Company Role you can access:<br />
<br />
[[UTA]] Level 1 Information:<br />
<br />
: <span style="font-size: medium;">'''@levelone.''fieldname''@'''</span> or <span style="font-size: medium;">'''@levelone.''customfieldid''@'''</span><br />
Contact Information:<br />
<br />
: <span style="font-size: medium;">'''@contact.''fieldname''@'''</span> or <span style="font-size: medium;">'''@contact.''customfieldid''@'''</span><br />
Company Information:<br />
<br />
: <span style="font-size: medium;">'''@company.''fieldname''@'''</span> or <span style="font-size: medium;">'''@company.''customfieldid''@'''</span><br />
When you want to refer to a User Role based [[Custom Field]] '''<u>from</u>''' a [[UTA]] Level 1 record use the following syntax:<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person:<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname''@'''</span><br />
Contact:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename''.''fieldname''@'''</span><br />
: ''where rolename is the role they are assigned on the Level 1 record''<br />
=To Display a List of Activities, Notes, Transactions, Contacts, Companies, Consumers, Providers=<br />
==Syntax==<br />
: <span style="font-size: medium;">'''[#(?object=''objectname''::{options})~''standardfieldname''~ $''customfieldname''$#]'''</span><br />
'''Where:'''<br />
:* ''objectname'' is the name of the item to be listed.<br />
:: Either: '''address, activity, assign, contact, user, group, company, notes, association, companyassociation, transaction, timesheet''', '''level-1''', '''utaproviderL1''', '''utaproviderL2''', '''utaconsumerL1''', '''utaconsumerL2''' or '''linkactivity'''<br />
: <br />
:* ''standardfieldname'' is the name of a standard field (between tildes, ~)<br />
:* ''customfieldname'' is the name of a custom field (between dollar signs, $)<br />
<br />
'''Notes:'''<br />
<br />
:* You can refer to [[Custom Fields]] in the list using the Custom Field ID instead of the field name, still between dollar signs ('''$12345$''')<br />
:* '''level-1''' can only be used as an object when referenced from a contact record. Also '''level-1''' will only list the level 1s that the contact has been added to in the contacts section.<br />
:* You can include text as well as variables within the [#...#] syntax.<br />
:* When using this syntax for [[Web Page View]]s, [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] etc. you will usually want to include HTML table formatting within the '''[#...#]''' syntax (see examples below). For [[MS Word Merge]] custom fields the table defined on the MS Word Template document, with the columns delimited by pipes (|) within the '''[#...#]'''.<br />
:* '''~Index~''' can be used to number the lines (1, 2, 3...) '''Note:''' ~index~ does not work for all lists. For example, it cannot be used when listing contacts associated with a Level 1.<br />
:** ''~Index~'' (upper case 'I') starts numbering at 1, ''~index~'' (lower case 'i') starts numbering at 0.<br />
~eventid~ will display the id of the level 2.<br />
<br />
<br />
'''Options:'''<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Option'''<br />
||'''Effect'''<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname''</span><br />
||Sorts the list in ascending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname'' desc</span><br />
||Sorts the list in descending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=tbl_''customfieldid''.valuestr</span><br />
||Sorts the list in ascending order by the custom field specified<br />
|-<br />
||<span style="font-size: medium;">criteria=''standardfieldname''='''value'''</span><br />
||Filters the list by the standard field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=tbl_''customfieldid''.valuestr='''value'''</span><br />
||Filter the list by the custom field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' or ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''either''' conditional criteria can apply<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' AND ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''both''' conditional criteria must apply<br />
|-<br />
||<span style="font-size: medium;">groupfunction=''aggregatefunction''</span><br />
||Performs specified aggregate function on the listed fields<br />Ex. sum, count, countdistinct<br />
|}<br />
<br />
* ''multiple options (i.e. a criteria and an orderby option) can be included, separated by doubled colons (::)''<br />
<br />
'''Important:''' Any custom fields that you use as criteria or orderby '''must''' appear in the display. If you do not wish to display the field you can place it in a comment. (i.e.: &lt;!--$12343$-->) However, if referencing a field as a property of a table you must show the value.<br />
<br />
'''Examples:'''<br />
<br />
* To generate a list of Level 2 activities for a [[MS Word Merge]]:<br />
<br />
[#(?object=activity)|~statusname~|~typename~|$speciality$|$123456$|#]<br />
:: ''See [[MS Word Merge]] for further details on including tables on MS Word Merge documents''<br />
: <br />
:* To reference the Consumer UTA Level 1 owner name and ownerid from a Provider UTA Level 1 Read Only - System Variable custom field<br />
<br />
[#(?object=utaconsumer::criteria=statusname IN ('Placed','Resigned/Terminated'))~ownername~,~ownerid~ #]<br />
<br />
:* To Display custom fields via List Syntax for Invoicing (objectname=appliedtoinvoices). Grabbing a custom field value off the invoice (ie. 282588) and into an adjustment.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">Example: [#(?object=appliedtoinvoices)$282588$#]</pre><br />
::: ''Note: refer to the custom field by the number ONLY, do not use the custom field name.''<br />
<br />
<br />
:* To generate a list of all contacts for a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] custom field (note that the HTML table formatting is included within the '''[#...#]''' syntax)<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"><br />
<table><br />
<tr><br />
<th>First Name</th><br />
<th>Last Name</th><br />
<th>E-mail Address</th><br />
<th>Cell Phone Number</th><br />
[#(?object=contact)<br />
<tr><br />
<td>~firstname~</td><br />
<td>~lastname~</td><br />
<td>~email~</td><br />
<td>$Cell Phone$</td><br />
</tr>#]<br />
</table><br />
</pre><br />
<br />
::: ''Note: The first line creates a header row for the table''<br />
<br />
<br />
:* For a list of Level 2 (or Level 3) activities sorted by Start Date in descending order:<br />
<br />
[#(?object=activity::orderby=startdate desc)#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* For a list of contacts assigned to a Level 1 with the role of "Internal People", sorted by surname:<br />
<br />
[#(?object=contact::orderby=lastname::criteria=rolename='Internal People')#]<br />
<br />
{|<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
|}<br />
<br />
:* For a list of level 1 records, including owner details, that a Company has been asssigned to:<br />
<br />
[#(?(object =level-1) NAME: ~name~ OWNERID: ~ownerid~ OWNERNAME: ~ownername~ #]<br />
<br />
:* To display the level 1 ID of the level 1 records:<br />
<br />
[#(?(object =level-1) OPPORTUNITY ID: ~op.opportunityid as oppid~ #]<br />
<br />
<br />
<br />
:* For a list of all companies that the owner of a [[UTA]] record is associated with:<br />
<br />
@owner.[#(?object=association)~name~ (Phone ~phone~)<br />
#]@<br />
<br />
<br />
:* To get a comma-separated list of the companyids of all the companies the current user is associated with with roleid 54545:<br />
<br />
,@me.[#(?object=association::criteria=roleid=54545)~afcompanyid~,#]@<br />
<br />
<br />
:* For a list of all contacts associated to the current user's parent company record (associated to the company with [[roleid]] 12345):<br />
<br />
@me.parent.[#(?object=association::criteria=roleid='12345')~firstname~ ~lastname~ (Phone ~phone~)<br />
#]@<br />
<br />
:* For a list of a company's Active(current date is between start and end date) associations:<br />
<br />
[#(?object=association::criteria=(afstartdate is null OR afstartdate<='@date(currentdate)@') AND (afenddate is null OR afenddate>='@date(currentdate)@'))~userid~,#]<br />
<br />
:* For a list of all contacts/users located under a company with a given role<br />
<br />
[#(?object=user::criteria=rolelist like '%,12345,%') ~email~ #]<br />
<br />
<br />
:* To count the number of contacts assigned with the role of Reviewer:<br />
<br />
[#(?object=contact::criteria=rolename="Reviewer"::groupfunction=count)~userid~#]<br />
<br />
<br />
:* To include and format a date stored in a custom field (see also [[sscalculation]])<br />
<br />
[#(?object=activity)<!--@sscalculation(date_format("$fieldname$","%M %d, %Y"))-->#]<br />
<br />
<br />
:* With Multiple Criteria:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=contact::criteria=(rolename='External' or rolename='Internal'))~firstname~ ~lastname~#]<br />
</pre><br />
<br />
<br />
:* To sort descending by a custom field called ''Total Hours'' with a custom field id of ''67292'':<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=tbl_67292.valuestr desc)Subject: ~subject~Total Hours: $Total Hours$Start Date: ~startdate~#]<br />
</pre><br />
'''Note:''' ''$Total Hours$'' in the list could be listed as ''$67292$'' with the same result.<br />
<br />
<br />
<br />
:* To sort descending reviews in a specific status by a custom field on a separate UTA Level 1 field called ''$Staff Final Score$'' with a custom field id of ''1584168'' in numeric order:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaconsumerL1::orderby=tbl_15868.valuestr*1::criteria=(statusname='Member Review'))<br />
</pre><br />
'''Note:''' ''$Staff Final Score$'' in the list could be listed as ''$15868$'' with the same result.<br />
<br />
<br />
<br />
:* To list a specific activity type only:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate::criteria=typename='This Activity Type')~subject~~location~~startdate~#]<br />
</pre><br />
<br />
<br />
:* To list activities based on the [[Determining the typeid|type ID]] ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=typeid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To include a hyperlink to the object (for Accounts):<br />
<br />
[#(?object=company::criteria=rolename="Cooperating Organization")#]<br />
<br />
{|<br />
|-<br />
||[s_viewcompany.jsp?companyid=~companyid~ ~name~]<br />
||~role~<br />
|}<br />
<br />
<br />
:* To list activities based on status:<br />
<br />
[#(?object=activity::orderby=startdate::criteria=statusname='Open')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list activities based on the status ID ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=status.statusid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list UTA Providers:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=rolename="Panel") ~name~ ~typename~ ~statusname~ ~enddate~ $Panel Review Date$ $Panel ID</pre><br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">lt;br>#]</pre><br />
<br />
<br />
:* To list notes (from the record that contains the notes):<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=notes::orderby=createddate desc)~notes~~createddate~~username~#]<br />
</pre><br />
::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
:: <br />
::* To list all companies under a parent company record:<br />
<br />
[#(?object=company) ~name~ #]<br />
<br />
::* To list all L3 allocations within a L2 budget record:<br />
<br />
[#(?object=linkactivity) ~subject~ #]<br />
<br />
<br />
::* To sum or count all the L3 allocations from the budget L2 record:<br />
<br />
@linkactivity.sum(...)@ or @linkactivity.count(...)@<br />
<br />
'''To list level 2 notes for each level 2 record at level 1:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate desc)~subject~~description~~startdate~<br />
[@(?object=notes::orderby=createddate desc)@]</pre><br />
{|<br />
|-<br />
||~notes~<br />
||~createddate~<br />
||~username~<br />
|}<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">#]<br />
</pre><br />
:::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
'''To do a sum of all the unpaid payment transaction:<br />
<br />
{|<br />
|-<br />
||Total Paid: [#(?object=transaction::criteria=trstranstype=11 and tbl_1145339.valuestr='Paid'::groupfunction=sum)$1145183$ <!--"145339$-->#] Note: $1145339$ - Status of payment $1145183$ - Payment Amount<br />
|}<br />
<br />
==Referencing Standard Fields of UTA Providers==<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 1 Field Name and Variable List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Application Name<br />
||~name~<br />
|-<br />
||Type Name<br />
||~typename~<br />
|-<br />
||Type ID<br />
||~type~<br />
|-<br />
||Status Name<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Close Date<br />
||~closedate~<br />
|-<br />
||Branch<br />
||''No variables''<br />
|-<br />
||Branch ID<br />
||~branchid~<br />
|-<br />
||Currency<br />
||''No variables''<br />
|-<br />
||Exchange Currency<br />
||''No variables''<br />
|-<br />
||Currency Exchange Rate<br />
||''No variables''<br />
|-<br />
||Customer<br />
||~client~<br />
|-<br />
||Customer ID<br />
||~companyid~<br />
|-<br />
||Modified By<br />
||''No variables''<br />
|-<br />
||Modified Date<br />
||''No variables''<br />
|-<br />
||Owner (full name)<br />
||~ownername~<br />
|-<br />
||Owner (userid)<br />
||~updatedby~<br />
|-<br />
||Person (full name)<br />
||''No variables''<br />
|-<br />
||Person (userid)<br />
||~oppeopleid~<br />
|-<br />
||Role Name<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~conroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1) ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 2 Field Names and Variables List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Activity Type<br />
||~typename~<br />
|-<br />
||Activity Type ID<br />
||~typeid~<br />
|-<br />
||Owner<br />
||~ownername~<br />
|-<br />
||Owner ID<br />
||~eownerid~<br />
|-<br />
||Assigned People<br />
||''No variables''<br />
|-<br />
||Status<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Subject<br />
||~subject~<br />
|-<br />
||Description<br />
||~description~<br />
|-<br />
||Location<br />
||~location~<br />
|-<br />
||Amount<br />
||~eamount~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Opportunity ID<br />
||~cevconoppid~<br />
|-<br />
||Event ID<br />
||~cevprovevtid~<br />
|-<br />
||Rolename<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~cevroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL2) ~typename~ | ~statusname~ <br />#]</pre><br />
If you have multiple different UTAs connected as providers, you can use criteria to filter:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=provappid="12345") ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
==To Format the Start Date or Start Time==<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%Y-%m-%d') as startdate~'''</span><br />
:::: or<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%h:%i %p') as starttime~'''</span><br />
'''Note:'''<br />
<br />
:::* If you wish to use ''"orderby=startdate"'', along with a date format other than yyyy-mm-dd you must use a slightly different syntax.<br />
:::* Using ''"~date_format(startdate,'%d-%m-%Y') as startdate~"'' when using ''"orderby=startdate"'' will cause the date to be ordered by dd-mm-yyyy (rather than yyyy-mm-dd, which is chronological)<br />
:::* To avoid this, change ''"date_format(startdate,'%d-%m-%Y') as '''startdate'''"'' to ''"date_format(startdate,'%d-%m-%Y') as '''sdate'''"''<br />
<br />
==Displaying Both Level 2 and Level 3 Activities at Level 1==<br />
When displaying a list of '''Level 2''' activities using the '''[#(?object=activity;)...#]''' syntax, the corresponding '''Level 3''' activities can be displayed under each of the parent '''Level 2''' activities.<br />
<br />
<br />
To facilitate this you must create a [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] field '''at''' Level 2 that contains the list of Level 3 activities, formatted and filtered as desired.<br />
<br />
:::: ''You can use [[Visibility Condition]]s, [[Role Field Permissions]] or [[Status Field Permissions]] to prevent the field from being displayed on the Level 2 record.<br />
'''Example:'''<br />
<br />
::* Create a Level 2 [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] Custom Field called '''Level 3 Activity List''' with the following:<br />
<br />
[@(?object=activity::orderby=typename)@]<br />
<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
<br />
Then create either a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] at Level 1:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|$Level 3 Activity List$<br />
|}<br />
:::: '''where''' "Level 3 Activity List" is the name you gave the [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] field<br />
<br />
<br />
===Level 3s with Less Than 25 Fields===<br />
If Level 3 has less than 25 fields it is not necessary to create a [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] Custom Field on the Level 2 that lists the Level 3 activities.<br />
<br />
Instead you can use the following syntax '''within''' the '''[#...#]''' that lists the Level 2 activities:<br />
<br />
::: <span style="font-size: medium;">'''[@(?object=activity)~standardfieldname~ $customfieldname$@]'''</span><br />
'''Note:'''<br />
<br />
::* This syntax will only work if there are '''less than 25 fields at Level 3.'''<br />
<br />
'''Example:'''<br />
<br />
::* To display a list of Level 2 activities, including any Level 3 activities under their parent Level 2 activity:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|[@(?object=activity;orderby=typename)@]<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
|}<br />
<br />
==Displaying a Specific Number of Items in a List==<br />
When you want to display only specific number of activities or transactions in a [[Web Page View]] use the following syntax.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"> [#(?object=object::orderby=field) <br />
<!--@sslogic(~index~='num')--> <br />
~standard field~ $custom field$ <br /> <br />
<!--@end--> <br />
#] <br /> <br />
</pre><br />
'''where:'''<br />
<br />
::* num = number of activities that should be displayed<br />
<br />
=XML Variables=<br />
==Count how many options were selected==<br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<br />
<br />
==Filtered XML display output==<br />
<pre>@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A")~FirstName.nodevalue~ ~LastName.nodevalue~<br />#]@</pre><br />
<br />
<br />
=Date/Time Variables=<br />
==Standard Fields Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
'''Start Date''''''End Date''''''Close Date'''<br />''Level 1 only'''''Modified Date''''''Display Format'''@startdate@@enddate@@closedate@@modifieddate@Date formatted according to user preferences (At Level 1 Modified Date also includes the time: 15:40)@longstartdate@@longenddate@@longclosedate@@longmodifieddate@Friday, January 23, 2009@fullstartdate@@fullenddate@@fullclosedate@@fullmodifieddate@2009-01-23 15:40:00@datetime(fullstartdate)@@datetime(fullenddate)@@datetime(fullclosedate)@@datetime(fullmodifieddate)@2009-01-23 15:40:00@date(fullstartdate)@@date(fullenddate)@@date(fullclosedate)@@date(fullmodifieddate)@2009-01-23<br />
<br />
<br />
<br />
::* '''Note''': ''Start Time'' and ''End Time'' are stored within the ''fullstartdate'' and ''fullenddate'' fields respectively. They can be accessed and formatted using the variables elements listed below.<br />
<br />
'''To display specific elements of the Start Date, Start Time, End Date, End Time, Close Date, Modified Date''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(fullstartdate)@month number in ''Start Date''@monthname(fullstartdate)@name of month in ''Start Date''@day(fullstartdate)@day in ''Start Date''@dayweek(fullstartdate)@name of day in ''Start Date''@year(fullstartdate)@year in ''Start Date''@hour(fullstartdate)@hour in ''Start Time'' using 12 hour clock (0-12)@ampm(fullstartdate)@AM or PM reference for ''Start Time''@hour24(fullstartdate)@hour in ''Start Time'' using 24 hour clock (0-24)@minute(fullstartdate)@minute in ''Start Time''<br />
<br />
::: '''Note:''' For '''End Date''', '''Close Date''' or '''Modified Date''' replace '''fullstartdate''' with '''fullenddate''', '''fullclosedate''' or '''fullmodifieddate''' respectively.'''<br />
::: ''(seconds are not available for standard date/time fields)''<br />
::: ''('''Close Date''' does not have a time associated with it)<br />
'''Examples:'''<br />
::* To display the Start Date in the format '''February 22, 1985''' you would use:<br />
<br />
@monthname(fullstartdate)@ @day(fullstartdate)@, @year(fullstartdate)@<br />
<br />
::* To display the End Time in the format '''06:45PM''' you would use:<br />
<br />
@hour(fullenddate)@:@minute(fullenddate)@@ampm(fullenddate)@<br />
<br />
==Current Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplayComment@datetime(currentdate)@current date and time as for yyyy-mm-dd HH:mm:ss2013-01-22 17:55:22See also [[Obtain Server Date and Time]]@date(currentdate)@current date as for yyyy-mm-dd2013-05-17&nbsp;@currentdate@current date2009 January 25&nbsp;@now@current date and time2009 August 25 11:05AMWorkflows only. Not available within [[UTA]]s<br />
<br />
<br />
'''To display specific elements of the current date or time''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(currentdate)@current month number@monthname(currentdate)@name of current month@day(currentdate)@current day@dayweek(currentdate)@name of current day@year(currentdate)@current year@hour(currentdate)@current hour using 12 hour clock (0-12)@ampm(currentdate)@AM or PM reference for current time@hour24(currentdate)@current hour using 24 hour clock (0-24)@minute(currentdate)@current minute<br />
<br />
::: (seconds are not available for the current time)<br />
'''Examples:'''<br />
<br />
::* To display the current date/time in the format '''Friday at 19:55''' you would use:<br />
<br />
@dayweek(currentdate)@ at @hour24(currentdate)@:@minute(currentdate)@<br />
<br />
==Custom Fields Date/Time==<br />
'''For a custom field on the same level as the Web Page View Field, you can parse out a particular date/time in a date field'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplay@date(''fieldname'')@custom field date as for yyyy-mm-dd2013-05-17<br />
<br />
<br />
@month(''fieldname'')@month number in ''fieldname''05@monthname(''fieldname'')@name of month in ''fieldname''May@day(''fieldname'')@day in ''fieldname''17@dayweek(''fieldname'')@name of day in ''fieldname''Friday@year(''fieldname'')@year in ''fieldname''2013@hour(''fieldname'')@hour in ''fieldname'' using 12 hour clock (0-12)12@ampm(''fieldname'')@AM or PM reference for time in ''fieldname''AM@hour24(''fieldname'')@hour in ''fieldname'' using 24 hour clock (0-24)00@minute(''fieldname'')@minute in ''fieldname''00@second(''fieldname'')@second in ''fieldname''00<br />
<br />
<br />
'''Examples:'''<br />
<br />
::* To display the custom field '''Date Of Birth''' in the format '''31-01-2001''' you would use:<br />
<br />
@day(date of birth)@-@month(date of birth)@-@year(date of birth)@<br />
<br />
'''Note:'''<br />
This syntax will not work for custom fields on a different level. You will not be able to reference, for example, @day(parent.''fieldname'')@. To parse out date/time information from a custom field on a different level, use the [[Sscalculation#Using_sscalculation_to_Change_Date_Formats_of_Data_in_Custom_Fields|sscalculation]] syntax.<br />
<br />
=Miscellaneous Variables=<br />
==Adding an image from Upload fields==<br />
Users can return image thumbnails or meta data from multiple file fields using the list syntax below":<br />
<br />
::* Show thumbnail image using thunbnailpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~thumbnailpath~" alt="" width="240" /> #]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using filepath option:<br />
<br />
<pre>@multi file name.template[# <img src="~filepath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using compressedpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~compressedpath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show file name, size and upload date:<br />
<br />
<pre>@multi file name.template[# ~filename~, ~filesize~, ~uploaddate~#]@<br />
</pre><br />
<br />
<br />
==Adding a File Upload button==<br />
To display a button to upload to a [[Single File]] or [[Multiple Files]] custom field:<br />
<br />
::* Single File:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label" /></span><br />
:: <br />
::* Multiple Files:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label." /></span><br />
'''where:'''<br />
::* ''customfieldid'' = the field id of the Single or Multiple file custom field (without '''cf_''')<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Multiple files..." /><br />
<br />
'''Note:''' if adding to a [[Web Page View]] you will need to add the following to the page:<br />
<br />
<pre>function include_dom(script_filename) {<br />
var html_doc = document.getElementsByTagName('head').item(0);<br />
var js = document.createElement('script');<br />
js.setAttribute('language', 'javascript');<br />
js.setAttribute('type', 'text/javascript');<br />
js.setAttribute('src', script_filename);<br />
html_doc.appendChild(js);<br />
return false;<br />
}<br />
function includejsfiles() {<br />
include_dom("/validate.js");<br />
}<br />
</pre><br />
You will also have to call the ''includejsfiles'' function in the body onload:<br />
<br />
<br />
<br />
<br />
<br />
'''Alternatively:'''<br />
<br />
You may also use @fieldname.uploadlink@ to get the url for the upload page and construct your own function to open the window.<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Upload" /><br />
<pre>function openupload(url)<br />
{ <br />
upload_window = window.open(url,'upload_window', 'menubar=yes,scrollbars=yes,width=800,height=600,status=no,resizable=yes,dependent=yes,alwaysRaised=yes');<br />
upload_window.opener = window;<br />
upload_window.focus();<br />
}<br />
</pre><br />
<br />
'''Note:''' this method will only open the single file upload page.<br />
<br />
==Displaying a Dynamic Data Grid field==<br />
To show a [[Custom Field Type: Dynamic Data – Data Grid|Dynamic Data – Data Grid]] field in a webpage view field use the following syntax:<br />
<br />
::: <span style="font-size: medium;">'''@fieldname.table'''@</span><br />
==Retrieving History for Fields with Track Changes Enabled==<br />
The following syntax is used to retrieve standard or custom field history:<br />
<br />
For the [[Status]] standard field:<br />
<br />
::: <span style="font-size: medium;">'''@HistoryOf(status)@'''</span><br />
::: <span style="font-size: medium;">'''@HistoryOf(statuscaption)@'''</span><br />
For a [[Custom Field]]:<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldid'')@'''</span><br />
OR<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldname'')@'''</span><br />
'''Notes:'''<br />
:::* ''HistoryOf'' is case sensitive.<br />
:::* See the [[HistoryOf function]] page for a complete description of this variable and its uses.<br />
<br />
<!--:::* You can only obtain the history of the Status field and [[Custom Fields]] in this way.--><br />
==For Hybrid Sign-Up Pages==<br />
::: The @user_input_form@ will display the associated user sign up form on a company sign up page if included in the HTML template of the company sign up page.<br />
<br />
<br />
==Currency Format==<br />
::: You can use the following syntax to format a custom field with currency: @format(L2 Subcontract total y1,currency,USD,2)@. The last parameter can be changed from 2 to 0 to display as a whole number.<br />
=Controls=<br />
==Hide a variable if it is missing==<br />
Put the following in front of variable name.<br />
<br />
::: <span style="font-size: medium;">'''&lt;!--hideifnotfound-->'''</span><br />
'''Example''':<br />
<br />
<pre> <!--hideifnotfound-->@parent.contact.adjuster.email@<br />
</pre><br />
<br />
'''Note:''' the &lt;!--hideifnotfound--> and the variable must be in immediate succession, and not separated by a space.<br />
<br />
==How to display different content based on a value using SSlogic==<br />
To display content based on a value from a variable add '''&lt;!--@sslogic('@branch.name@'='Internal Staff')--&gt;''' in front of the content and '''&lt;!--@end--&gt;''' at the end of the content. If there are 2 different pieces of content to be displayed based on a value and all others add '''&lt;!--@else--&gt;''' between the 2 pieces of content.<br />
<br />
<pre><br />
<!--@sslogic(CONDITION)--><br />
The content to be displayed when condition is true.<br />
This can be more than one line.<br />
<!--@end--><br />
</pre><br />
<br />
::* The content to be displayed (the middle line) can either be in plaintext or in HTML.<br />
::* Be sure there are single quotes around the variable and value.<br />
::* SSlogic does not support nested logic statements.<br />
<br />
'''Example:'''<br />
<br />
::* The following will display a Christmas tree image if the month is December:<br />
<br />
<pre><br />
<!--@sslogic(month(now())=12)--><br />
<img src="images/xmasstree.jpg" alt="" /><br />
<!--@end--><br />
</pre><br />
<br />
'''See [[SSlogic]] for more information and further examples.'''<br />
<br />
==How to display check boxes in the Web Page View==<br />
To display Select Many - Check Box type custom fields as check boxes in a web page view add '''@checkbox('fieldname/fieldnumber','option name')@''' to the check box control.<br />
<br />
This syntax works if the check boxes are on the same level.<br />
<br />
'''Example:'''<br />
<br />
<pre><input type="checkbox" /><br />
</pre><br />
<br />
::: See Also: [[Updateable Web Page View Fields]] if you wish the Web Page View check boxes to have the ability to change the underlying data.<br />
==How to display level two check boxes on level one in the Web Page View==<br />
@checkboxvalue(id<br />
<br />
values to be checked)@<br />
<br />
<input name="checkboxb20" type="checkbox" value="Limited community support" /><br />
<br />
<br />
::* Use two "'''|'''" (pipes) to separate '''id''' and '''value''' to be checked<br />
<br />
where 1199639 is customfield id<br />
if it is used on the same level '''@1199639@'''<br />
if it is used on the child level '''$1199639$'''<br />
<br />
This works for level one check boxes on level one web page view<br />
AND<br />
works for level two check boxes on level one web page view<br />
AND<br />
works for level three check boxes on level one web page view<br />
<br />
<br />
<br />
<br />
<br />
==How to suppress the Page Footer with Printing the Page==<br />
To suppress the footer when printing the page you need to change your browser settings.<br />
<br />
'''Internet Explorer'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Delete the '''Header''' and '''Footer''' text.<br />
<br />
3. If required, change the margins.<br />
<br />
'''FireFox'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Click the '''Margins & Header/Footer''' tab.<br />
<br />
3. Set all '''Header''' and '''Footer''' options to '''Blank'''.<br />
<br />
3. If required, change the margins.<br />
<br />
==How to control print behaviour==<br />
'''To define a page break place the following code in the HTML source before the content you deem as the next page''':<br />
<br />
<br />
'''To change the page orientation to landscape first place the following in the header portion ('''<br />
<br />
''') of the HTML''':<br />
<br />
'''<strong>Then place'''</strong><br />
<br />
<pre> </pre><br />
'''in the HTML source around the "page" content.'''<br />
Example:<br />
<br />
<div class="page">This is the page content that needs to be in landscape</div><br />
Please note that the page orientation control only works with Internet Explorer and is not the greatest quality print due to the page being converted to an image then rotated.<br />
<br />
==How to control print behaviour when saving as a PDF==<br />
To define a page break in a PDF add before the content you deem as the next page.<br />
<br />
To change the orientation of a page to landscape in a PDF add before the content you deem as the next page.<br />
<br />
::* See [[PDF Writer Custom Tags]] for further [[PDF]] formatting options<br />
<br />
=Troubleshooting=<br />
::* '''Issue''': 2 variables run together (thus removing the ending @ and beginning @)<br />
::* '''Resolution''': Place a non-breaking space tag (&amp;nbsp;) between the variables.<br />
<br />
<br />
<br />
::** '''Issue''': For a list of level 2 activities, the code is showing instead of the field headings and values you've designated.<br />
::** '''Resolution''': Insert a comment tag before the first cell tag. i.e.<br />
<br />
<pre> </pre><br />
<br />
index <br />
<br />
==See Also==<br />
::* [[Root Company Variable]]s<br />
::* [[sslogic]]<br />
::* [[ssattach]]<br />
::* [[sscalculation]]<br />
::* [[Web Page View Field]]<br />
::* [[Attach a PDF to a Web Page View]]<br />
::* [[Updateable Web Page View Fields]]<br />
::* [[Changing the Status from a Web Page View]]<br />
::* [[Custom Field Type: Display Only – Web Page View]]<br />
::* [[:Category:PDF|PDF Category]]<br />
::* [[PDF Writer Custom Tags]]<br />
::* [[Adding JavaScript JS files to Web Page View Pages]]<br />
::* [[Custom Field ID|Determining the Custom Field ID]]<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Web_Page_View_Field_Variables&diff=40466Web Page View Field Variables2022-12-22T18:36:45Z<p>Ciaran: /* See Also */</p>
<hr />
<div>The [[Web Page View Field]] provides the ability to display a fully formatted document or web page.<br />
<br />
In constructing this type of page HTML is used in conjunction with the following variables.<br />
<br />
=Variable List=<br />
==Current User==<br />
''Note: "me" -- refers to the current user''<br />
<br />
'''@me.firstname@ will be replaced by current user's firstname'''<br />
<br />
'''@me.lastname@'''<br />
<br />
'''@me.email@'''<br />
<br />
'''@me.phone@'''<br />
<br />
'''@me.companyname@'''<br />
<br />
'''@me.type@''' (returns 'User', 'Local User Administrator' or 'Global User Administrator')<br />
<br />
==UTA Level 1, Sales Opportunity and Job Variables==<br />
'''@name@''' - standard field '''Application Name'''.<br />
<br />
'''@type@''' - standard field '''Application Template Type'''.<br />
<br />
'''@status@''' - standard field '''Status'''<br />
<br />
'''@typecaption@''' - standard field '''Application Template Type Caption'''.<br />
<br />
'''@statuscaption@''' - standard field '''Status Caption'''<br />
<br />
'''@type_lang@''' - standard field '''Application Template Type (Based on user language setting)'''.<br />
<br />
'''@status_lang@''' - standard field '''Status (Based on user language setting)'''<br />
<br />
'''@description@'''<br />
<br />
'''@requirements@'''<br />
<br />
'''@currency@'''<br />
<br />
'''@revenue@'''<br />
<br />
'''@probability@'''<br />
<br />
'''@modifiedby@''' / '''@modifiedbyid@'''<br />
<br />
'''@modifieddate@'''<br />
<br />
'''@closedate@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@createddate@'''<br />
<br />
'''@createdby@'''<br />
<br />
'''@jobquestions@''' - displays as combo boxes<br />
<br />
'''@jobquestionsr@''' - displays question only<br />
<br />
'''@jobskills@'''<br />
<br />
<br />
'''@owner.field@'''<br />
<br />
Example: '''@owner.fullname@''' or '''@owner.address@'''<br />
<br />
'''@person.field@'''<br />
<br />
Example: '''@person.fullname@''' or '''@person.address@'''<br />
<br />
<br />
'''@company.field@'''<br />
<br />
Example: '''@company.name@''' or '''@company.address@'''<br />
<br />
<br />
'''@company.owner.field@'''<br />
<br />
Example '''@company.owner.email@'''<br />
<br />
'''@branch.field@'''<br />
<br />
Example: '''@branch.name@''' or '''@branch.address@'''<br />
<br />
'''@apptype@''' the Application ID (appid) of the UTA.<br />
<br />
==UTA Level 2 / Activities Variables==<br />
'''@subject@'''<br />
<br />
'''@description@'''<br />
<br />
'''@location@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@isallday@'''<br />
<br />
'''@modifieddate@''' (numeric value including time)<br />
<br />
'''@longmodifieddate@''' (text value excluding time)<br />
<br />
'''@starthour@''' - (0-23)<br />
<br />
'''@starth@''' - (0-12)<br />
<br />
'''@startpmam@''' - (PM or AM)<br />
<br />
'''@startminute@'''<br />
<br />
'''@endhour@''' - (0-23)<br />
<br />
'''@endh@''' - (0-12)<br />
<br />
'''@endpmam@''' - (PM or AM)<br />
<br />
'''@endminute@'''<br />
<br />
'''@owner@'''<br />
<br />
'''@eownerid@''' - userid of the owner<br />
<br />
'''@contact@'''<br />
<br />
'''@assigned@'''<br />
<br />
'''@eventid@'''<br />
<br />
'''@typename@'''<br />
<br />
'''@objectid@'''<br />
<br />
'''@objecttype@'''<br />
<br />
'''@rootcompanyid@'''<br />
<br />
'''@rootcompany.name@'''<br />
<br />
'''@contact.field@'''<br />
'''@eamount@'''<br />
<br />
Example: @contact.firstname@ or @contact.email@<br />
<br />
'''@assigned.field@'''<br />
<br />
Example: @assigned.firstname@ or @assigned.email@<br />
<br />
'''@contact.company.field@''' (same as assigned)<br />
<br />
Example: @contact.company.address@ or @contact.company.city@<br />
<br />
<u>'''Custom Field Variables'''</u><br />
<br />
'''@customfield name@ - by name'''<br />
<br />
'''or'''<br />
<br />
'''@#customfield id#@ - by id'''<br />
<br />
Example: @more information@ or @#17342#@<br />
<br />
<br />
See Also: [[Invoice Module Variables]] for Variables specific to the Invoicing module.<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 2'''</u><br />
<br />
If your '''Web Page View''' is at Level 2, you can call Level 1 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
Example: '''@parent.status@''' or '''@parent.startdate'''@ or '''@parent.#12345#@'''<br />
<br />
<br />
==UTA Level 2 variables called from UTA Level 3==<br />
When working at Level 3, you can call Level 2 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 3'''</u><br />
<br />
If your '''Web Page View''' is at Level 3, you can call Level 1 variables using:<br />
<br />
'''@parent.parent.'''''fieldname'''''@''' or '''@parent.parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''Level 3 Associated Parent (Opportunity) '''</u><br />
<br />
Where Payment Allocation is enabled you have two models to choose from before configuring: usually the Associated Parent is a Funding Stream of Overall Budget (event) and the associated object is the Disbursement (Level 3). In less granular cases the Associated Parent is the opportunity.<br />
<br />
<u>'''Level 3 Associated Parent'''</u><br />
<br />
<br />
If Payment Allocation is enabled, you can pull fields from the Associated Parent using the following variable:<br />
<br />
'''@linkparent.''fieldname''@'''<br />
<br />
If your associated payment is linked to the event you can pull fields from the opporunity using the following variable:<br />
<br />
'''@linkparent.''parent''.fieldname@''' So '''@linkparent.''parent''.branch@''' will return: '''SmartSimple Inc.'''<br />
<br />
On the company/branch:<br />
<br />
'''@linkparent.parent.branch.''Transit''@''' will return: '''''1950'''''<br />
<br />
=Field List=<br />
<u>'''People Fields'''</u><br />
<br />
firstname, lastname, fullname, title, email, phone, company, address, address2, city,<br />
province, state, country, postalcode, owner, modifieddate, cost, costunit, type,<br />
resourcename, isrecource, uprefix (prefix), usuffix (suffix), uphoneext (Phone Extension)<br />
<br />
<u>'''Company Fields'''</u><br />
<br />
name, address, address2, city, province, state, country, postalcode, phone, fax, website<br />
<br />
<u>'''Lead Fields'''</u><br />
<br />
status, description, name, phone, fax, address, address2, city, state, province, country,<br />
postalcode, website, firstname, lastname, contactphone, title, email, dat_added<br />
<br />
=UTA Contact and Account Variables=<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname'''''@</span><br />
Assigned (Level 2 only):<br />
<br />
: <span style="font-size: medium;">'''@assigned.''fieldname''@'''</span><br />
Company (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@client.''fieldname''@'''</span><br />
Use @client.categoryids@ to return a list of [[Determining the categoryid|category IDs]] - comma delimited - note the leading comma - e.g. ",1234,555,666,"<br />
<br />
Use @client.categories@ to return a list of category names - comma delimited e.g. "Agency,Marketing,Good client"<br />
<br />
==Level 1 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact/account in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename.fieldname''@''' </span> &nbsp; or &nbsp; <span style="font-size: medium;"> '''@company.''rolename.fieldname''@'''</span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact/account on the Level One item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contact.adjuster.firstname@ or @company.funding agency.address@<br />
<br />
Note: if there is more than one contact/account assigned with the rolename specified, only one will be displayed.<br />
<br />
===List===<br />
To display a list of multiple contacts/accounts in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~''fieldname''~ #]''' </span> or <span style="font-size: medium;"> '''[#(?object=company) ~''fieldname''~ #]''' </span><br />
See [[#To display a list of Activities (Level 2 or 3), Notes, Contacts or Companies|below]] for details on how to filter and sort the list(s).<br />
<br />
* '''Note''': to display the role that the contact or account is assigned on the Level 1 record use: <span style="font-size: medium;">'''~role~'''</span><br />
* '''Note''': to display the name of the contact's company use: <span style="font-size: medium;">'''~companyname~'''</span><br />
<br />
==Level 2 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact in the Level 2 contacts section:<br />
<br />
: <span style="font-size: medium;">'''@contacts.''rolename.fieldname''@''' </span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact on the Level Two item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contacts.adjuster.firstname@<br />
<br />
Note: if there is more than one contact assigned with the rolename specified, only one will be displayed.<br />
<br />
===Contacts===<br />
To display a list of the contacts assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To display only contacts assigned at Level 2 with a specific role/roles (only relevant if the Level 2 Multiple Contact List is enabled)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact::criteria=roleid=12345) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To get the intersection record identifier (equivalent to ~oprid~ at Level 1) (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~lnkid~ #]'''</span><br />
To display the contact's profile status:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~ustatusid~ #]'''</span><br />
'''Notes:'''<br />
<br />
* Contacts at level 2 cannot be filtered by rolename, only roleid<br />
* If the multiple contact list is enabled use '''~role~''' to display the assigned role.<br />
<br />
===Accounts===<br />
To display information for a <u>single</u> account in the Level 2 accounts section:<br />
<br />
: <span style="font-size: medium;">'''@companies.''rolename.fieldname''@'''</span><br />
To display a list of the companies assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company::orderby=name)~name~ #]'''</span><br />
To get the intersection record identifier (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company) ~clnkid~ #]'''</span><br />
'''Notes:'''<br />
<br />
:* The Account standard field is only available at Level 2 when the Multiple Account list is enabled. See [[Relating Contacts and Accounts to the Universal Tracking Application#The Account List Field|here]] for details.<br />
<br />
==To display Level 1 Company Role or Contact Role custom fields==<br />
<span style="font-size: medium;">'''[#(?object=company;)$?opc_''customfieldid''$#]'''</span> or <span style="font-size: medium;">'''[#(?object=contact;)$?opr_''customfieldid''$#]'''</span><br />
<br />
<br />
'''where:'''<br />
<br />
* customfieldid = the numeric id of the custom field<br />
<br />
'''Note:''' for level 2 records (when the multiple contact/company list(s) are enabled) use $?opr2_''customfieldid''$ and $?opc2_''customfieldid''$<br />
<br />
Following the same format above, you can also reference custom fields on the company role using the @#field id#@ syntax.<br />
<br />
<u>'''Contact Detail'''</u><br />
<br />
~uprefix~ ~firstname~ ~lastname~<br />
<br />
~uaddress~ ~uaddress2~<br />
<br />
~ucity~, ~ustate~ ~upostalcode~<br />
<br />
==To display Company Association or Contact Association fields==<br />
The syntax for extracting information on the entity to which they are associated is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association)~name~ ~standard field name~ $?afc_custom field id$ $?afc_custom field name$#]<br /><br />
<br />'''[#(?object=companyassociation)~standard field name~ $custom field id$ $custom field name$#]'''</span><br />
<br />
'''where:'''<br />
<br />
* standard field name = name of the standard field<br />
* custom field id = the numeric id of the custom field<br />
* custom field name = the name of the custom field<br />
<br />
<br />
The syntax for extracting information on fields that are on the intersection, rather than the entity to which they are associated, is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association) ~afcompanyid~ #]<br /><br />
<br />'''[#(?object=companyassociation)~afroleid~ #]'''</span><br />
<br />
<br />
Other '''intersection''' specific variables options include:<br />
<br />
* ~afcid~: association (intersection) record id.<br />
* ~afcompanyid~: [[companyid]] of associated company<br />
* ~afcontactid~: [[userid]] of associated contact<br />
* ~afroleid~: [[roleid]] of association<br />
* ~afstartdate~: start date of association<br />
* ~afenddate~: end date of association<br />
<br />
==Role Based Custom Fields==<br />
When you have a [[Custom Field]] such as a [[Web Page View]] or [[MS Word Merge]] that is located <u>'''on'''</u> a User Role or Company Role you can access:<br />
<br />
[[UTA]] Level 1 Information:<br />
<br />
: <span style="font-size: medium;">'''@levelone.''fieldname''@'''</span> or <span style="font-size: medium;">'''@levelone.''customfieldid''@'''</span><br />
Contact Information:<br />
<br />
: <span style="font-size: medium;">'''@contact.''fieldname''@'''</span> or <span style="font-size: medium;">'''@contact.''customfieldid''@'''</span><br />
Company Information:<br />
<br />
: <span style="font-size: medium;">'''@company.''fieldname''@'''</span> or <span style="font-size: medium;">'''@company.''customfieldid''@'''</span><br />
When you want to refer to a User Role based [[Custom Field]] '''<u>from</u>''' a [[UTA]] Level 1 record use the following syntax:<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person:<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname''@'''</span><br />
Contact:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename''.''fieldname''@'''</span><br />
: ''where rolename is the role they are assigned on the Level 1 record''<br />
=To Display a List of Activities, Notes, Transactions, Contacts, Companies, Consumers, Providers=<br />
==Syntax==<br />
: <span style="font-size: medium;">'''[#(?object=''objectname''::{options})~''standardfieldname''~ $''customfieldname''$#]'''</span><br />
'''Where:'''<br />
:* ''objectname'' is the name of the item to be listed.<br />
:: Either: '''address, activity, assign, contact, user, group, company, notes, association, companyassociation, transaction, timesheet''', '''level-1''', '''utaproviderL1''', '''utaproviderL2''', '''utaconsumerL1''', '''utaconsumerL2''' or '''linkactivity'''<br />
: <br />
:* ''standardfieldname'' is the name of a standard field (between tildes, ~)<br />
:* ''customfieldname'' is the name of a custom field (between dollar signs, $)<br />
<br />
'''Notes:'''<br />
<br />
:* You can refer to [[Custom Fields]] in the list using the Custom Field ID instead of the field name, still between dollar signs ('''$12345$''')<br />
:* '''level-1''' can only be used as an object when referenced from a contact record. Also '''level-1''' will only list the level 1s that the contact has been added to in the contacts section.<br />
:* You can include text as well as variables within the [#...#] syntax.<br />
:* When using this syntax for [[Web Page View]]s, [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] etc. you will usually want to include HTML table formatting within the '''[#...#]''' syntax (see examples below). For [[MS Word Merge]] custom fields the table defined on the MS Word Template document, with the columns delimited by pipes (|) within the '''[#...#]'''.<br />
:* '''~Index~''' can be used to number the lines (1, 2, 3...) '''Note:''' ~index~ does not work for all lists. For example, it cannot be used when listing contacts associated with a Level 1.<br />
:** ''~Index~'' (upper case 'I') starts numbering at 1, ''~index~'' (lower case 'i') starts numbering at 0.<br />
~eventid~ will display the id of the level 2.<br />
<br />
<br />
'''Options:'''<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Option'''<br />
||'''Effect'''<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname''</span><br />
||Sorts the list in ascending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname'' desc</span><br />
||Sorts the list in descending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=tbl_''customfieldid''.valuestr</span><br />
||Sorts the list in ascending order by the custom field specified<br />
|-<br />
||<span style="font-size: medium;">criteria=''standardfieldname''='''value'''</span><br />
||Filters the list by the standard field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=tbl_''customfieldid''.valuestr='''value'''</span><br />
||Filter the list by the custom field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' or ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''either''' conditional criteria can apply<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' AND ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''both''' conditional criteria must apply<br />
|-<br />
||<span style="font-size: medium;">groupfunction=''aggregatefunction''</span><br />
||Performs specified aggregate function on the listed fields<br />Ex. sum, count, countdistinct<br />
|}<br />
<br />
* ''multiple options (i.e. a criteria and an orderby option) can be included, separated by doubled colons (::)''<br />
<br />
'''Important:''' Any custom fields that you use as criteria or orderby '''must''' appear in the display. If you do not wish to display the field you can place it in a comment. (i.e.: &lt;!--$12343$-->) However, if referencing a field as a property of a table you must show the value.<br />
<br />
'''Examples:'''<br />
<br />
* To generate a list of Level 2 activities for a [[MS Word Merge]]:<br />
<br />
[#(?object=activity)|~statusname~|~typename~|$speciality$|$123456$|#]<br />
:: ''See [[MS Word Merge]] for further details on including tables on MS Word Merge documents''<br />
: <br />
:* To reference the Consumer UTA Level 1 owner name and ownerid from a Provider UTA Level 1 Read Only - System Variable custom field<br />
<br />
[#(?object=utaconsumer::criteria=statusname IN ('Placed','Resigned/Terminated'))~ownername~,~ownerid~ #]<br />
<br />
:* To Display custom fields via List Syntax for Invoicing (objectname=appliedtoinvoices). Grabbing a custom field value off the invoice (ie. 282588) and into an adjustment.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">Example: [#(?object=appliedtoinvoices)$282588$#]</pre><br />
::: ''Note: refer to the custom field by the number ONLY, do not use the custom field name.''<br />
<br />
<br />
:* To generate a list of all contacts for a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] custom field (note that the HTML table formatting is included within the '''[#...#]''' syntax)<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"><br />
<table><br />
<tr><br />
<th>First Name</th><br />
<th>Last Name</th><br />
<th>E-mail Address</th><br />
<th>Cell Phone Number</th><br />
[#(?object=contact)<br />
<tr><br />
<td>~firstname~</td><br />
<td>~lastname~</td><br />
<td>~email~</td><br />
<td>$Cell Phone$</td><br />
</tr>#]<br />
</table><br />
</pre><br />
<br />
::: ''Note: The first line creates a header row for the table''<br />
<br />
<br />
:* For a list of Level 2 (or Level 3) activities sorted by Start Date in descending order:<br />
<br />
[#(?object=activity::orderby=startdate desc)#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* For a list of contacts assigned to a Level 1 with the role of "Internal People", sorted by surname:<br />
<br />
[#(?object=contact::orderby=lastname::criteria=rolename='Internal People')#]<br />
<br />
{|<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
|}<br />
<br />
:* For a list of level 1 records, including owner details, that a Company has been asssigned to:<br />
<br />
[#(?(object =level-1) NAME: ~name~ OWNERID: ~ownerid~ OWNERNAME: ~ownername~ #]<br />
<br />
:* To display the level 1 ID of the level 1 records:<br />
<br />
[#(?(object =level-1) OPPORTUNITY ID: ~op.opportunityid as oppid~ #]<br />
<br />
<br />
<br />
:* For a list of all companies that the owner of a [[UTA]] record is associated with:<br />
<br />
@owner.[#(?object=association)~name~ (Phone ~phone~)<br />
#]@<br />
<br />
<br />
:* To get a comma-separated list of the companyids of all the companies the current user is associated with with roleid 54545:<br />
<br />
,@me.[#(?object=association::criteria=roleid=54545)~afcompanyid~,#]@<br />
<br />
<br />
:* For a list of all contacts associated to the current user's parent company record (associated to the company with [[roleid]] 12345):<br />
<br />
@me.parent.[#(?object=association::criteria=roleid='12345')~firstname~ ~lastname~ (Phone ~phone~)<br />
#]@<br />
<br />
:* For a list of a company's Active(current date is between start and end date) associations:<br />
<br />
[#(?object=association::criteria=(afstartdate is null OR afstartdate<='@date(currentdate)@') AND (afenddate is null OR afenddate>='@date(currentdate)@'))~userid~,#]<br />
<br />
:* For a list of all contacts/users located under a company with a given role<br />
<br />
[#(?object=user::criteria=rolelist like '%,12345,%') ~email~ #]<br />
<br />
<br />
:* To count the number of contacts assigned with the role of Reviewer:<br />
<br />
[#(?object=contact::criteria=rolename="Reviewer"::groupfunction=count)~userid~#]<br />
<br />
<br />
:* To include and format a date stored in a custom field (see also [[sscalculation]])<br />
<br />
[#(?object=activity)<!--@sscalculation(date_format("$fieldname$","%M %d, %Y"))-->#]<br />
<br />
<br />
:* With Multiple Criteria:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=contact::criteria=(rolename='External' or rolename='Internal'))~firstname~ ~lastname~#]<br />
</pre><br />
<br />
<br />
:* To sort descending by a custom field called ''Total Hours'' with a custom field id of ''67292'':<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=tbl_67292.valuestr desc)Subject: ~subject~Total Hours: $Total Hours$Start Date: ~startdate~#]<br />
</pre><br />
'''Note:''' ''$Total Hours$'' in the list could be listed as ''$67292$'' with the same result.<br />
<br />
<br />
<br />
:* To sort descending reviews in a specific status by a custom field on a separate UTA Level 1 field called ''$Staff Final Score$'' with a custom field id of ''1584168'' in numeric order:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaconsumerL1::orderby=tbl_15868.valuestr*1::criteria=(statusname='Member Review'))<br />
</pre><br />
'''Note:''' ''$Staff Final Score$'' in the list could be listed as ''$15868$'' with the same result.<br />
<br />
<br />
<br />
:* To list a specific activity type only:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate::criteria=typename='This Activity Type')~subject~~location~~startdate~#]<br />
</pre><br />
<br />
<br />
:* To list activities based on the [[Determining the typeid|type ID]] ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=typeid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To include a hyperlink to the object (for Accounts):<br />
<br />
[#(?object=company::criteria=rolename="Cooperating Organization")#]<br />
<br />
{|<br />
|-<br />
||[s_viewcompany.jsp?companyid=~companyid~ ~name~]<br />
||~role~<br />
|}<br />
<br />
<br />
:* To list activities based on status:<br />
<br />
[#(?object=activity::orderby=startdate::criteria=statusname='Open')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list activities based on the status ID ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=status.statusid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list UTA Providers:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=rolename="Panel") ~name~ ~typename~ ~statusname~ ~enddate~ $Panel Review Date$ $Panel ID</pre><br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">lt;br>#]</pre><br />
<br />
<br />
:* To list notes (from the record that contains the notes):<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=notes::orderby=createddate desc)~notes~~createddate~~username~#]<br />
</pre><br />
::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
:: <br />
::* To list all companies under a parent company record:<br />
<br />
[#(?object=company) ~name~ #]<br />
<br />
::* To list all L3 allocations within a L2 budget record:<br />
<br />
[#(?object=linkactivity) ~subject~ #]<br />
<br />
<br />
::* To sum or count all the L3 allocations from the budget L2 record:<br />
<br />
@linkactivity.sum(...)@ or @linkactivity.count(...)@<br />
<br />
'''To list level 2 notes for each level 2 record at level 1:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate desc)~subject~~description~~startdate~<br />
[@(?object=notes::orderby=createddate desc)@]</pre><br />
{|<br />
|-<br />
||~notes~<br />
||~createddate~<br />
||~username~<br />
|}<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">#]<br />
</pre><br />
:::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
'''To do a sum of all the unpaid payment transaction:<br />
<br />
{|<br />
|-<br />
||Total Paid: [#(?object=transaction::criteria=trstranstype=11 and tbl_1145339.valuestr='Paid'::groupfunction=sum)$1145183$ <!--"145339$-->#] Note: $1145339$ - Status of payment $1145183$ - Payment Amount<br />
|}<br />
<br />
==Referencing Standard Fields of UTA Providers==<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 1 Field Name and Variable List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Application Name<br />
||~name~<br />
|-<br />
||Type Name<br />
||~typename~<br />
|-<br />
||Type ID<br />
||~type~<br />
|-<br />
||Status Name<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Close Date<br />
||~closedate~<br />
|-<br />
||Branch<br />
||''No variables''<br />
|-<br />
||Branch ID<br />
||~branchid~<br />
|-<br />
||Currency<br />
||''No variables''<br />
|-<br />
||Exchange Currency<br />
||''No variables''<br />
|-<br />
||Currency Exchange Rate<br />
||''No variables''<br />
|-<br />
||Customer<br />
||~client~<br />
|-<br />
||Customer ID<br />
||~companyid~<br />
|-<br />
||Modified By<br />
||''No variables''<br />
|-<br />
||Modified Date<br />
||''No variables''<br />
|-<br />
||Owner (full name)<br />
||~ownername~<br />
|-<br />
||Owner (userid)<br />
||~updatedby~<br />
|-<br />
||Person (full name)<br />
||''No variables''<br />
|-<br />
||Person (userid)<br />
||~oppeopleid~<br />
|-<br />
||Role Name<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~conroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1) ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 2 Field Names and Variables List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Activity Type<br />
||~typename~<br />
|-<br />
||Activity Type ID<br />
||~typeid~<br />
|-<br />
||Owner<br />
||~ownername~<br />
|-<br />
||Owner ID<br />
||~eownerid~<br />
|-<br />
||Assigned People<br />
||''No variables''<br />
|-<br />
||Status<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Subject<br />
||~subject~<br />
|-<br />
||Description<br />
||~description~<br />
|-<br />
||Location<br />
||~location~<br />
|-<br />
||Amount<br />
||~eamount~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Opportunity ID<br />
||~cevconoppid~<br />
|-<br />
||Event ID<br />
||~cevprovevtid~<br />
|-<br />
||Rolename<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~cevroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL2) ~typename~ | ~statusname~ <br />#]</pre><br />
If you have multiple different UTAs connected as providers, you can use criteria to filter:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=provappid="12345") ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
==To Format the Start Date or Start Time==<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%Y-%m-%d') as startdate~'''</span><br />
:::: or<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%h:%i %p') as starttime~'''</span><br />
'''Note:'''<br />
<br />
:::* If you wish to use ''"orderby=startdate"'', along with a date format other than yyyy-mm-dd you must use a slightly different syntax.<br />
:::* Using ''"~date_format(startdate,'%d-%m-%Y') as startdate~"'' when using ''"orderby=startdate"'' will cause the date to be ordered by dd-mm-yyyy (rather than yyyy-mm-dd, which is chronological)<br />
:::* To avoid this, change ''"date_format(startdate,'%d-%m-%Y') as '''startdate'''"'' to ''"date_format(startdate,'%d-%m-%Y') as '''sdate'''"''<br />
<br />
==Displaying Both Level 2 and Level 3 Activities at Level 1==<br />
When displaying a list of '''Level 2''' activities using the '''[#(?object=activity;)...#]''' syntax, the corresponding '''Level 3''' activities can be displayed under each of the parent '''Level 2''' activities.<br />
<br />
<br />
To facilitate this you must create a [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] field '''at''' Level 2 that contains the list of Level 3 activities, formatted and filtered as desired.<br />
<br />
:::: ''You can use [[Visibility Condition]]s, [[Role Field Permissions]] or [[Status Field Permissions]] to prevent the field from being displayed on the Level 2 record.<br />
'''Example:'''<br />
<br />
::* Create a Level 2 [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] Custom Field called '''Level 3 Activity List''' with the following:<br />
<br />
[@(?object=activity::orderby=typename)@]<br />
<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
<br />
Then create either a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] at Level 1:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|$Level 3 Activity List$<br />
|}<br />
:::: '''where''' "Level 3 Activity List" is the name you gave the [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] field<br />
<br />
<br />
===Level 3s with Less Than 25 Fields===<br />
If Level 3 has less than 25 fields it is not necessary to create a [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] Custom Field on the Level 2 that lists the Level 3 activities.<br />
<br />
Instead you can use the following syntax '''within''' the '''[#...#]''' that lists the Level 2 activities:<br />
<br />
::: <span style="font-size: medium;">'''[@(?object=activity)~standardfieldname~ $customfieldname$@]'''</span><br />
'''Note:'''<br />
<br />
::* This syntax will only work if there are '''less than 25 fields at Level 3.'''<br />
<br />
'''Example:'''<br />
<br />
::* To display a list of Level 2 activities, including any Level 3 activities under their parent Level 2 activity:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|[@(?object=activity;orderby=typename)@]<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
|}<br />
<br />
==Displaying a Specific Number of Items in a List==<br />
When you want to display only specific number of activities or transactions in a [[Web Page View]] use the following syntax.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"> [#(?object=object::orderby=field) <br />
<!--@sslogic(~index~='num')--> <br />
~standard field~ $custom field$ <br /> <br />
<!--@end--> <br />
#] <br /> <br />
</pre><br />
'''where:'''<br />
<br />
::* num = number of activities that should be displayed<br />
<br />
=XML Variables=<br />
==Count how many options were selected==<br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<br />
<br />
==Filtered XML display output==<br />
<pre>@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A")~FirstName.nodevalue~ ~LastName.nodevalue~<br />#]@</pre><br />
<br />
<br />
=Date/Time Variables=<br />
==Standard Fields Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
'''Start Date''''''End Date''''''Close Date'''<br />''Level 1 only'''''Modified Date''''''Display Format'''@startdate@@enddate@@closedate@@modifieddate@Date formatted according to user preferences (At Level 1 Modified Date also includes the time: 15:40)@longstartdate@@longenddate@@longclosedate@@longmodifieddate@Friday, January 23, 2009@fullstartdate@@fullenddate@@fullclosedate@@fullmodifieddate@2009-01-23 15:40:00@datetime(fullstartdate)@@datetime(fullenddate)@@datetime(fullclosedate)@@datetime(fullmodifieddate)@2009-01-23 15:40:00@date(fullstartdate)@@date(fullenddate)@@date(fullclosedate)@@date(fullmodifieddate)@2009-01-23<br />
<br />
<br />
<br />
::* '''Note''': ''Start Time'' and ''End Time'' are stored within the ''fullstartdate'' and ''fullenddate'' fields respectively. They can be accessed and formatted using the variables elements listed below.<br />
<br />
'''To display specific elements of the Start Date, Start Time, End Date, End Time, Close Date, Modified Date''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(fullstartdate)@month number in ''Start Date''@monthname(fullstartdate)@name of month in ''Start Date''@day(fullstartdate)@day in ''Start Date''@dayweek(fullstartdate)@name of day in ''Start Date''@year(fullstartdate)@year in ''Start Date''@hour(fullstartdate)@hour in ''Start Time'' using 12 hour clock (0-12)@ampm(fullstartdate)@AM or PM reference for ''Start Time''@hour24(fullstartdate)@hour in ''Start Time'' using 24 hour clock (0-24)@minute(fullstartdate)@minute in ''Start Time''<br />
<br />
::: '''Note:''' For '''End Date''', '''Close Date''' or '''Modified Date''' replace '''fullstartdate''' with '''fullenddate''', '''fullclosedate''' or '''fullmodifieddate''' respectively.'''<br />
::: ''(seconds are not available for standard date/time fields)''<br />
::: ''('''Close Date''' does not have a time associated with it)<br />
'''Examples:'''<br />
::* To display the Start Date in the format '''February 22, 1985''' you would use:<br />
<br />
@monthname(fullstartdate)@ @day(fullstartdate)@, @year(fullstartdate)@<br />
<br />
::* To display the End Time in the format '''06:45PM''' you would use:<br />
<br />
@hour(fullenddate)@:@minute(fullenddate)@@ampm(fullenddate)@<br />
<br />
==Current Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplayComment@datetime(currentdate)@current date and time as for yyyy-mm-dd HH:mm:ss2013-01-22 17:55:22See also [[Obtain Server Date and Time]]@date(currentdate)@current date as for yyyy-mm-dd2013-05-17&nbsp;@currentdate@current date2009 January 25&nbsp;@now@current date and time2009 August 25 11:05AMWorkflows only. Not available within [[UTA]]s<br />
<br />
<br />
'''To display specific elements of the current date or time''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(currentdate)@current month number@monthname(currentdate)@name of current month@day(currentdate)@current day@dayweek(currentdate)@name of current day@year(currentdate)@current year@hour(currentdate)@current hour using 12 hour clock (0-12)@ampm(currentdate)@AM or PM reference for current time@hour24(currentdate)@current hour using 24 hour clock (0-24)@minute(currentdate)@current minute<br />
<br />
::: (seconds are not available for the current time)<br />
'''Examples:'''<br />
<br />
::* To display the current date/time in the format '''Friday at 19:55''' you would use:<br />
<br />
@dayweek(currentdate)@ at @hour24(currentdate)@:@minute(currentdate)@<br />
<br />
==Custom Fields Date/Time==<br />
'''For a custom field on the same level as the Web Page View Field, you can parse out a particular date/time in a date field'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplay@date(''fieldname'')@custom field date as for yyyy-mm-dd2013-05-17<br />
<br />
<br />
@month(''fieldname'')@month number in ''fieldname''05@monthname(''fieldname'')@name of month in ''fieldname''May@day(''fieldname'')@day in ''fieldname''17@dayweek(''fieldname'')@name of day in ''fieldname''Friday@year(''fieldname'')@year in ''fieldname''2013@hour(''fieldname'')@hour in ''fieldname'' using 12 hour clock (0-12)12@ampm(''fieldname'')@AM or PM reference for time in ''fieldname''AM@hour24(''fieldname'')@hour in ''fieldname'' using 24 hour clock (0-24)00@minute(''fieldname'')@minute in ''fieldname''00@second(''fieldname'')@second in ''fieldname''00<br />
<br />
<br />
'''Examples:'''<br />
<br />
::* To display the custom field '''Date Of Birth''' in the format '''31-01-2001''' you would use:<br />
<br />
@day(date of birth)@-@month(date of birth)@-@year(date of birth)@<br />
<br />
'''Note:'''<br />
This syntax will not work for custom fields on a different level. You will not be able to reference, for example, @day(parent.''fieldname'')@. To parse out date/time information from a custom field on a different level, use the [[Sscalculation#Using_sscalculation_to_Change_Date_Formats_of_Data_in_Custom_Fields|sscalculation]] syntax.<br />
<br />
=Miscellaneous Variables=<br />
==Adding an image from Upload fields==<br />
Users can return image thumbnails or meta data from multiple file fields using the list syntax below":<br />
<br />
::* Show thumbnail image using thunbnailpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~thumbnailpath~" alt="" width="240" /> #]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using filepath option:<br />
<br />
<pre>@multi file name.template[# <img src="~filepath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using compressedpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~compressedpath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show file name, size and upload date:<br />
<br />
<pre>@multi file name.template[# ~filename~, ~filesize~, ~uploaddate~#]@<br />
</pre><br />
<br />
<br />
==Adding a File Upload button==<br />
To display a button to upload to a [[Single File]] or [[Multiple Files]] custom field:<br />
<br />
::* Single File:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label" /></span><br />
:: <br />
::* Multiple Files:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label." /></span><br />
'''where:'''<br />
::* ''customfieldid'' = the field id of the Single or Multiple file custom field (without '''cf_''')<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Multiple files..." /><br />
<br />
'''Note:''' if adding to a [[Web Page View]] you will need to add the following to the page:<br />
<br />
<pre>function include_dom(script_filename) {<br />
var html_doc = document.getElementsByTagName('head').item(0);<br />
var js = document.createElement('script');<br />
js.setAttribute('language', 'javascript');<br />
js.setAttribute('type', 'text/javascript');<br />
js.setAttribute('src', script_filename);<br />
html_doc.appendChild(js);<br />
return false;<br />
}<br />
function includejsfiles() {<br />
include_dom("/validate.js");<br />
}<br />
</pre><br />
You will also have to call the ''includejsfiles'' function in the body onload:<br />
<br />
<br />
<br />
<br />
<br />
'''Alternatively:'''<br />
<br />
You may also use @fieldname.uploadlink@ to get the url for the upload page and construct your own function to open the window.<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Upload" /><br />
<pre>function openupload(url)<br />
{ <br />
upload_window = window.open(url,'upload_window', 'menubar=yes,scrollbars=yes,width=800,height=600,status=no,resizable=yes,dependent=yes,alwaysRaised=yes');<br />
upload_window.opener = window;<br />
upload_window.focus();<br />
}<br />
</pre><br />
<br />
'''Note:''' this method will only open the single file upload page.<br />
<br />
==Displaying a Dynamic Data Grid field==<br />
To show a [[Custom Field Type: Dynamic Data – Data Grid|Dynamic Data – Data Grid]] field in a webpage view field use the following syntax:<br />
<br />
::: <span style="font-size: medium;">'''@fieldname.table'''@</span><br />
==Retrieving History for Fields with Track Changes Enabled==<br />
The following syntax is used to retrieve standard or custom field history:<br />
<br />
For the [[Status]] standard field:<br />
<br />
::: <span style="font-size: medium;">'''@HistoryOf(status)@'''</span><br />
::: <span style="font-size: medium;">'''@HistoryOf(statuscaption)@'''</span><br />
For a [[Custom Field]]:<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldid'')@'''</span><br />
OR<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldname'')@'''</span><br />
'''Notes:'''<br />
:::* ''HistoryOf'' is case sensitive.<br />
:::* See the [[HistoryOf function]] page for a complete description of this variable and its uses.<br />
<br />
<!--:::* You can only obtain the history of the Status field and [[Custom Fields]] in this way.--><br />
==For Hybrid Sign-Up Pages==<br />
::: The @user_input_form@ will display the associated user sign up form on a company sign up page if included in the HTML template of the company sign up page.<br />
<br />
<br />
==Currency Format==<br />
::: You can use the following syntax to format a custom field with currency: @format(L2 Subcontract total y1,currency,USD,2)@. The last parameter can be changed from 2 to 0 to display as a whole number.<br />
=Controls=<br />
==Hide a variable if it is missing==<br />
Put the following in front of variable name.<br />
<br />
::: <span style="font-size: medium;">'''&lt;!--hideifnotfound-->'''</span><br />
'''Example''':<br />
<br />
<pre> <!--hideifnotfound-->@parent.contact.adjuster.email@<br />
</pre><br />
<br />
'''Note:''' the &lt;!--hideifnotfound--> and the variable must be in immediate succession, and not separated by a space.<br />
<br />
==How to display different content based on a value using SSlogic==<br />
To display content based on a value from a variable add '''&lt;!--@sslogic('@branch.name@'='Internal Staff')--&gt;''' in front of the content and '''&lt;!--@end--&gt;''' at the end of the content. If there are 2 different pieces of content to be displayed based on a value and all others add '''&lt;!--@else--&gt;''' between the 2 pieces of content.<br />
<br />
<pre><br />
<!--@sslogic(CONDITION)--><br />
The content to be displayed when condition is true.<br />
This can be more than one line.<br />
<!--@end--><br />
</pre><br />
<br />
::* The content to be displayed (the middle line) can either be in plaintext or in HTML.<br />
::* Be sure there are single quotes around the variable and value.<br />
::* SSlogic does not support nested logic statements.<br />
<br />
'''Example:'''<br />
<br />
::* The following will display a Christmas tree image if the month is December:<br />
<br />
<pre><br />
<!--@sslogic(month(now())=12)--><br />
<img src="images/xmasstree.jpg" alt="" /><br />
<!--@end--><br />
</pre><br />
<br />
'''See [[SSlogic]] for more information and further examples.'''<br />
<br />
==How to display check boxes in the Web Page View==<br />
To display Select Many - Check Box type custom fields as check boxes in a web page view add '''@checkbox('fieldname/fieldnumber','option name')@''' to the check box control.<br />
<br />
This syntax works if the check boxes are on the same level.<br />
<br />
'''Example:'''<br />
<br />
<pre><input type="checkbox" /><br />
</pre><br />
<br />
::: See Also: [[Updateable Web Page View Fields]] if you wish the Web Page View check boxes to have the ability to change the underlying data.<br />
==How to display level two check boxes on level one in the Web Page View==<br />
@checkboxvalue(id<br />
<br />
values to be checked)@<br />
<br />
<input name="checkboxb20" type="checkbox" value="Limited community support" /><br />
<br />
<br />
::* Use two "'''|'''" (pipes) to separate '''id''' and '''value''' to be checked<br />
<br />
where 1199639 is customfield id<br />
if it is used on the same level '''@1199639@'''<br />
if it is used on the child level '''$1199639$'''<br />
<br />
This works for level one check boxes on level one web page view<br />
AND<br />
works for level two check boxes on level one web page view<br />
AND<br />
works for level three check boxes on level one web page view<br />
<br />
<br />
<br />
<br />
<br />
==How to suppress the Page Footer with Printing the Page==<br />
To suppress the footer when printing the page you need to change your browser settings.<br />
<br />
'''Internet Explorer'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Delete the '''Header''' and '''Footer''' text.<br />
<br />
3. If required, change the margins.<br />
<br />
'''FireFox'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Click the '''Margins & Header/Footer''' tab.<br />
<br />
3. Set all '''Header''' and '''Footer''' options to '''Blank'''.<br />
<br />
3. If required, change the margins.<br />
<br />
==How to control print behaviour==<br />
'''To define a page break place the following code in the HTML source before the content you deem as the next page''':<br />
<br />
<br />
'''To change the page orientation to landscape first place the following in the header portion ('''<br />
<br />
''') of the HTML''':<br />
<br />
'''<strong>Then place'''</strong><br />
<br />
<pre> </pre><br />
'''in the HTML source around the "page" content.'''<br />
Example:<br />
<br />
<div class="page">This is the page content that needs to be in landscape</div><br />
Please note that the page orientation control only works with Internet Explorer and is not the greatest quality print due to the page being converted to an image then rotated.<br />
<br />
==How to control print behaviour when saving as a PDF==<br />
To define a page break in a PDF add before the content you deem as the next page.<br />
<br />
To change the orientation of a page to landscape in a PDF add before the content you deem as the next page.<br />
<br />
::* See [[PDF Writer Custom Tags]] for further [[PDF]] formatting options<br />
<br />
=Troubleshooting=<br />
::* '''Issue''': 2 variables run together (thus removing the ending @ and beginning @)<br />
::* '''Resolution''': Place a non-breaking space tag (&amp;nbsp;) between the variables.<br />
<br />
<br />
<br />
::** '''Issue''': For a list of level 2 activities, the code is showing instead of the field headings and values you've designated.<br />
::** '''Resolution''': Insert a comment tag before the first cell tag. i.e.<br />
<br />
<pre> </pre><br />
<br />
index <br />
<br />
==See Also==<br />
::* [[Root Company Variable]]s<br />
::* [[sslogic]]<br />
::* [[ssattach]]<br />
::* [[sscalculation]]<br />
::* [[Web Page View Field]]<br />
::* [[Attach a PDF to a Web Page View]]<br />
::* [[Updateable Web Page View Fields]]<br />
::* [[Changing the Status from a Web Page View]]<br />
::* [[Custom Field Type: Display Only – Web Page View]]<br />
::* [[:Category:PDF|PDF Category]]<br />
::* [[PDF Writer Custom Tags]]<br />
::* [[Adding JavaScript JS files to Web Page View Pages]]<br />
::* [[Custom Field ID|Determining the Custom Field ID]]<br />
::* <br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=System_Feature_Permissions&diff=39311System Feature Permissions2021-10-29T20:03:29Z<p>Ciaran: /* Overview */</p>
<hr />
<div>__TOC__<br />
==Overview==<br />
System Feature Permissions (formerly part of ''Manager Permissions'') allow for system administrators to personalize their copy of SmartSimple to make various system objects available to users in different roles.<br />
<br />
''System Objects'' include things such as the ''Delete'' button on company [[profile]]s or the button to create a new [[transaction]].<br />
<br />
===Company Permission===<br />
* '''Disable Delete'''<!--NODELETECOMPANY--> - Hide Delete button within an Organization profile for selected roles <br />
* '''Enable Batch Update'''<!--TRANSFERACC--> - Expose Batch Update button when record selected from Organization list view for selected roles <br />
* '''Enable Batch Update Owner'''<!--TRANSFERACC--> <br />
* '''Enable Edit All Companies'''<!--EDITEXTACCOUNT--> <br />
* '''Enable Save Draft'''<!--SAVEDRAFTCOMPANIES--> - Expose Save Draft button within an Organization profile for selected roles <br />
* '''Hide New Company Menu Item on Company Profile'''<!--DISABLENEWCOMPTAB--> - Restrict ability to create new company from within a Company profile for selected roles <br />
* '''Restrict Company Access to Companies with Categories'''<!--VIEWENABLEDCATONLY--> - Restrict ability to view and edit companies with no assigned category for selected roles <br />
* '''Restrict Company and Contact Access to Assigned Category Permissions'''<!--VIEWASSIGNEDCATONLY--> - Restrict ability to view and edit companies based on category permissions for selected roles <br />
* '''Restrict Company and Contact Access to Associated Companies'''<!--ASSOCIATEDCOMPANYONLY--> - Restrict ability to only view and edit associated companies for selected roles <br />
* '''Restrict Company and Contact Access to User Owned Companies'''<!--MYACCOUNTONLY--> - Restrict ability to only view and edit companies where they are the Owner <br />
* '''Restrict Company and Contact Access to User Owned Companies and Company of User'''<!--VIEWMYCOMPANYONLY--> - Restrict ability to only view and edit companies where they are the Owner or it is there parent company<br />
<br />
<br />
===User Permission===<br />
* '''Disable Delete'''<!--NODELETEUSER--> - Hide Delete button within a Contact profile for selected roles <br />
* '''Enable Batch Update'''<!--TRANSFERACC--> - Expose Batch Update button when record selected from User list view for selected roles <br />
* '''Enable Outlook Synchronization'''<!--SYNCALLCONTACTS--> - ability to synchronize SmartSimple calendar and contacts with those in Outlook <br />
* '''Enable Save Draft'''<!--SAVEDRAFTCONTACTS--> - Expose Save Draft button within a Contact profile for selected roles<br />
<br />
===Action Permission===<br />
*'''Activity - Disable Delete'''<!--NODELETEACTIVITY--><!--Also in Manager Permissions - System Permissions--> - Applies to activities created under the company, user, or calendar. Activities for leads and opportunities in Sales Tracking will not be affected.<br />
*'''Activity - Disable Edit'''<!--NOEDITACTIVITY--><!--Also in Manager Permissions - System Permissions--> - Applies to activities created under the company, user, or calendar. Activities for leads and opportunities in Sales Tracking will not be affected.<br />
*'''Calendars - Create'''<!--CREATECALENDARS--><!--Also in Manager Permissions - System Permissions--> - Enables roles to create additional new calendars. All [[User|users]] have full control of their personal calendar regardless of this permission.<br />
*'''Calendars - Manager'''<!--EDITCALENDARS--><!--Also in Manager Permissions - System Permissions--> - Enables roles to view and add entries to calendars. All [[User|users]] have full control of their personal calendar regardless of this permission.<br />
*'''Discussion Groups - Access'''<!--DISCUSSIONACCESS--><!--Also in Manager Permissions - System Permissions--> - Enables roles to access [[Using Discussion Groups|Discussion Groups]].<br />
*'''Discussion Groups - Create'''<!--CREATEDISCUSSIONS--><!--Also in Manager Permissions - System Permissions--> - Enables roles to [[Using Discussion Groups|create Discussion Groups]].<br />
*'''Notes - View Only'''<!--NOTESREADONLY--><!--Also in Manager Permissions - System Permissions--> - Roles with this restriction are not able to edit [[Notes]].<br />
*'''People Relationships - Access'''<!--VIEWRELATION--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to view relationship diagrams and add new relationships between contacts but only using the defined relationship types.<br />
*'''People Relationships - Edit'''<!--EDITRELATION--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to create types or relationships such as colleague, partner spouse, etc.<br />
*'''Public Filters and Templates - Create'''<!--PUBLICTEMPFILADMIN--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to share search filters, and email templates with all other users. All users can create filters and message templates, but the user needs to be in a role associated with this visibility permission in order to make the filter or template public.<br />
*'''Reports - Export Data'''<!--EXPORTREPORT--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to export data from reports.<br />
*'''Reports - Manager'''<!--REPORTADMIN--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to create reports, graphs based on those reports, and dashboards combining those graphs. Once created, each report and dashboard can be permissioned to other roles to view, but not to modify.<br />
*'''Skills & Resume - Edit'''<!--EDITSKILLS--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission can edit [[skills]] and [[resume]]s.<br />
*'''Smart Folders - Manager'''<!--EDITSMARTFOLDERS--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission can edit [[Smart Folders]].<br />
*'''Workflows - Attach Workflow to Company'''<!--WORKFLOWATTACH--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to configure [[Workflow Types|Company-type]] and [[Workflow Types|User-type]] [[workflow]]s to be triggered by a new company or modifications to a company record.<br />
*'''Workflows - Manager'''<!--WORKFLOWADMIN--><!--Also in Manager Permissions - System Permissions--> - Roles with this permission are able to create and edit workflows. Users without this permission can participate in workflow-driven processes, but are not able to view, edit or create new workflows.<br />
<br />
<br />
===Arcadia Permission===<br />
* '''Arcadia - Disable Switching between Portals''' - select the roles that have access to the Portal drop-down, allowing them to switch between roles if they have associations with other companies.<br />
* '''Arcadia - Enable Arcadia''' - select the roles that can access the Arcadia interface.<br />
* '''Arcadia - Switch Between Arcadia and Classic View''' - select the roles can switch between the Arcadia interface and the classic SmartSimple interface.<br />
<br />
See Also: [[Arcadia Permissions]]<br />
<br />
===Miscellaneous Feature Permission===<br />
*'''Disable Recent / Action Bar'''<!--HIDERECENTLYVIEWED--> - Disables the [[Recently Viewed|Recent]] and Back tabs for specified roles.<br />
*'''Enable Attribute Transaction to UTA Level 1'''<!--TRANSATTRIBUTION--> - provides access to [[Transaction Attribution]].<br />
*'''Enable Authenticated Servers'''<!--AUTHENTICATEDSERVERS--> - provides access to [[Authenticated Servers]] feature<br />
*'''Enable Debug Mode'''<br />
*'''Enable Delete on Multiple File Fields'''<!--DELCUSFILES--> - provides [[User|user’s]] the ability to delete any files stored against Multiple File Fields. Will bypass the '''[[Custom_Field_Type:_Link_–_Multiple_Files#Field_Options|No Deletion]]''' settings applied against individual Multiple File custom fields. <br />
*'''Enable Desktop API'''<!--USEAPI--> -<br />
{{Template:Emulate Permissions}}<br />
*'''Enable Emulation of Users in the Following Roles''' - specify what roles can be emulated<br />
*'''Enable Global Search'''<!--GLOBALSEARCH--> - enables the [[Global Search]] functionality <br />
*'''Enable Import Custom Field Language'''<!--IMPORTLANGUAGESETTING--> - Enables [[Translation_Import/Export]] on [[Custom_Field_Language_Settings]] for selected roles.<br />
*'''Enable Message Queue'''<!--VIEWMESSAGEQ--> - provides access to the [[Message_Queue]] functionality <br />
*'''Enable Persistent Login'''<!--PERSISTENTLOGIN--> - enables the [[System_Settings#Persistent_Login|Persistent login]] feature<br />
*'''Enable Personal List View'''<!--CREATEUSERLISTVIEW--> - enables the [[Configuring_List_Views#Personal_Views|Personal Views]] functionality <br />
*'''Enable Screen Capture''' - enables the [[Screen Share]] functionality <br />
*'''Enable SmartCard''' - enables the [[SmartCard]] functionality <br />
*'''Hide UTA Home Button / Link''' - Disables the UTA Home Button, used to return to the overall UTA from within a record for specified roles.<br />
*'''View Field History'''<!--VIEWFIELDHISTORY--> - enables the [[Track Changes|Field History]] feature<br />
*'''View ObjectSync Exchange Logs'''<!--OBJSYNC--> - provides access to [[ObjectSync]] details <br />
*'''View User Access Audit Logs'''<!--USERACCESSAUDIT--> - provides access to [[User/Contact_Security_Audit| User or Contact Security Audit]]<br />
<br />
===Legacy Application Permission===<br />
{{Legacy Application Permissions}}<br />
<br />
==See Also==<br />
* [[Visibility Permissions]]<br />
<br />
[[Category:Global Settings]][[Category:Security]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Template:CurrentUpgradeDate&diff=38191Template:CurrentUpgradeDate2021-01-25T15:17:01Z<p>Ciaran: </p>
<hr />
<div>March 11th 2021</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=38185DocuSign2021-01-11T20:34:39Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need to sign up with DocuSign for an account with API capabilities. DocuSign requires users to create a sandbox account (reference: [https://www.docusign.com/blog/dsdev-new-api-and-keys-page/ https://www.docusign.com/blog/dsdev-new-api-and-keys-page/]) in order to create an integration key for their DocuSign API integration. After you obtained an integration key from your DocuSign sandbox account, to complete the set up process, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions) for the DocuSign - SmartSimple integration.<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
|-<br />
||Date Signed<br />
||<br />
<pre><!--DateBlock AnchorString--></pre><br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date of the signature beside it. <br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
|-<br />
||Set the location of the Date Signed<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date Signed below it.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=38184DocuSign2021-01-11T20:33:33Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need to sign up with DocuSign for an account with API capabilities. DocuSign requires users to create a sandbox account (reference: [https://www.docusign.com/blog/dsdev-new-api-and-keys-page/ https://www.docusign.com/blog/dsdev-new-api-and-keys-page/]) in order to create an integration key for their DocuSign API integration. After you obtained an integration key from your DocuSign sandbox account, to complete the set up process, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions) for the DocuSign - SmartSimple integration.<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
|-<br />
||Date Signed<br />
||<br />
<pre><!--DateBlock AnchorString--></pre><br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date the signature was added beside it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
|-<br />
||Set the location of the Date Signed<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date Signed below it.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=38183DocuSign2021-01-11T20:33:03Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need to sign up with DocuSign for an account with API capabilities. DocuSign requires users to create a sandbox account (reference: [https://www.docusign.com/blog/dsdev-new-api-and-keys-page/ https://www.docusign.com/blog/dsdev-new-api-and-keys-page/]) in order to create an integration key for their DocuSign API integration. After you obtained an integration key from your DocuSign sandbox account, to complete the set up process, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions) for the DocuSign - SmartSimple integration.<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
XX|-<br />
||Date Signed<br />
||<br />
<pre><!--DateBlock Signed On: AnchorString--></pre><br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date the signature was added beside it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
|-<br />
||Set the location of the Date Signed<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date Signed below it.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=38182DocuSign2021-01-11T20:30:16Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need to sign up with DocuSign for an account with API capabilities. DocuSign requires users to create a sandbox account (reference: [https://www.docusign.com/blog/dsdev-new-api-and-keys-page/ https://www.docusign.com/blog/dsdev-new-api-and-keys-page/]) in order to create an integration key for their DocuSign API integration. After you obtained an integration key from your DocuSign sandbox account, to complete the set up process, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions) for the DocuSign - SmartSimple integration.<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
|-<br />
||Set the location of the Date Signed<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date Signed below it.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=38180DocuSign2021-01-11T20:29:41Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need to sign up with DocuSign for an account with API capabilities. DocuSign requires users to create a sandbox account (reference: [https://www.docusign.com/blog/dsdev-new-api-and-keys-page/ https://www.docusign.com/blog/dsdev-new-api-and-keys-page/]) in order to create an integration key for their DocuSign API integration. After you obtained an integration key from your DocuSign sandbox account, to complete the set up process, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions) for the DocuSign - SmartSimple integration.<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
|-<br />
||Date of Signing<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
<pre><!--DateBlock Signed On: --></pre><br />
||Here the anchor string is "Signed On: "<br />
DocuSign will find "Signed On: " in your HTML and place the Date Signed below it. <br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Template:Upgrade_Schedule&diff=37804Template:Upgrade Schedule2020-08-26T12:03:53Z<p>Ciaran: </p>
<hr />
<div>{| class="wikitable"<br />
|-<br />
||'''Upgrade'''<br />
||'''Planned Production Date'''<br />
|-<br />
||November 2020<br />
||Thu, November 12 2020<br />
|-<br />
||March 2021<br />
||Thu, March 11 2021<br />
|-<br />
||July 2021<br />
||Thu, July 8 2021<br />
|-<br />
||November 2021<br />
||Thu, November 11 2021<br />
|-<br />
||March 2022<br />
||Thu, March 10 2022<br />
|-<br />
||July 2022<br />
||Thu, July 14 2022<br />
|-<br />
||November 2022<br />
||Thu, November 10 2022<br />
|-<br />
||March 2023<br />
||Thu, March 9 2023<br />
|-<br />
||July 2023<br />
||Thu, July 13 2023<br />
|-<br />
||November 2023<br />
||Thu, November 9 2023<br />
|}</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Workflows_Overview&diff=37483Workflows Overview2020-04-23T17:30:20Z<p>Ciaran: /* Workflow Condition Examples */</p>
<hr />
<div>=Overview=<br />
A Workflow is a set of repeatable steps used to automate and streamline your business processes within the system (e.g. creating review forms and notifying reviewers via email).<br />
<br />
Workflows are created through the Global Settings tab and can be associated with any entity within the system, such as UTA objects, folders, organizations or users.<br />
<br />
Workflows are constructed using two basic elements:<br />
<br />
* Tasks: define the actions required in the workflow – each task represents a single step in the process. Specific roles or specific users are associated with each task, and these people will be automatically alerted when they need to perform the action defined by that task. These actions are generally used to accept, reject, or request a revision on the associated object, file, user or some application-specific information.<br />
* Connectors: link tasks together, and provide for branching logic based on the user responses to the task or pre-set conditions.<br />
<br />
<br />
=Configuration – Essentials=<br />
==Create Workflow==<br />
First create and configure the workflow.<br />
<br />
Next add tasks and connectors.<br />
<br />
The tasks available are dependent on the Workflow Type, so specify the desired type before adding tasks.<br />
<br />
1. Click the Menu Icon and under the System Processes , click the Workflows link.<br />
<br />
2. The Workflows page is displayed. This includes the following tabs:<br />
<br />
3. Workflows – click this tab to see list of workflows. The list includes the name, description, workflow type, Trigger, System Call Identifier and date last updated. In the top right of the action bar is a Category drop down. The list of workflows displayed under the Workflows tab is dependent on the Workflow Category selected. Use the "All Workflows" option to see all workflows.<br />
<br />
* Tasks – click this tab to see a list of tasks for all workflows.<br />
* Outstanding Tasks – click this tab to see a list of outstanding tasks for all workflows. This is where the workflow in question has been triggered, and the task has been scheduled for future completion date<br />
<br />
[[Image:workflow2017_1.png|900px|border]]<br />
<br />
<br />
4. Click the New Workflow button to see the New Workflow page.<br />
<br />
[[Image:workflow2017_2.png|900px|border]]<br />
<br />
<br />
5. Populate the Name field with a suitable a descriptive name for the workflow, and the Description field with a suitable narrative description for the workflow.<br />
<br />
6. you attempt to connect the workflow to the object.<br />
<br />
The table below shows a list of available Workflow Types, the objects that each type is enabled on, and the Trigger When options as well as the Termination Trigger options.<br />
<br />
{| class="wikitable"<br />
|-<br />
!|Workflow Type<br />
!|Enabled On<br />
!|Trigger<br />
!|Termination<br />
|-<br />
||[[Recurring Workflow|Recurring]]<br />
||N/A<br />
||'''Activate''' button on Workflow<br />
||'''Deactivate''' button on Workflow<br />
|-<br />
||Company<br />
||Company or Branch<br />
||New or Modified company or Branch<br />
||N/A<br />
|-<br />
||User<br />
||Company or Branch<br />
||New or Modified user or contact<br />
||N/A<br />
|-<br />
||File<br />
||SmartFolder<br />
||New or Modified file in [[SmartFolder]]<br />
||N/A<br />
|-<br />
||Applicant Tracking<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Applicant Assignment<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Content Management<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Document Library<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Email Broadcast<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Costing<br />
||Job in Job Tracking or Applicant Tracking<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Tracking<br />
||Job in Job Tracking or Applicant Tracking<br />
||Job Status<br />
||Job Status<br />
|-<br />
||[[Sales Tracking]]<br />
||Opportunity<br />
||Opportunity Status<br />
||Opportunity Status<br />
|-<br />
||Smart Folders<br />
||N/A<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||[[Web Forms]]<br />
||Web Form<br />
||New or Modified Web Form<br />
||N/A<br />
|-<br />
| rowspan="2"|[[Universal Tracking Application]]<br /><span style="font-size: xx-small;">''Select the name of the relevant UTA''</span><br />
||UTA Template<br />
||Level 1 Status<br />
||Level 1 Status<br />
|-<br />
||[[Custom Field Type: Link – Single File|Single File]] or [[Custom Field Type: Link – Multiple Files|Multiple Files]] Custom Field<br /> <span style="font-size: xx-small;">''Note: Can be at any level within the selected [[UTA]]''</span><br />
||File upload<br /><span style="font-size: xx-small;">''Note: Within the workflow set '''Trigger When''' to ''' --Deactivate--'''''</span><br />
||N/A<br />
|-<br />
||Tracking Activities<br />
||UTA Template<br />
||Level 2 Status<br />
||Level 2 Status<br />
|-<br />
||Tracking Activity Assignment<br />
||UTA Template<br />
||Addition of Level 2 Contact<br />
||N/A<br />
|-<br />
||Tracking Sub-Activities<br />
||UTA Template<br />
||Level 3 Status<br />
||Level 3 Status<br />
|-<br />
||[[Transactions]]<br />
||Always available<br />
||Transaction Status<br />
||N/A<br />
|-<br />
||Notes<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||UTA Role Assignment<br />
||UTA Template<br />
||Contact Assignment at Level 1<br /><span style="font-size: xx-small;">(with the [[Role]] specified) </span><br />
||N/A<br />
|-<br />
||UTA Company Assignment<br />
||UTA Template<br />
||Company Assignment at Level 1<br />
||N/A<br />
|}<br />
<br />
7. Set the Trigger When option. This determines when a new instance of the workflow should be started. The options available, are determined by the Workflow Type (see Workflow Types table above). The available options include:.<br />
<br />
* The New option will only trigger when a new object is created.<br />
* The Modified option will trigger the workflow when an existing object is changed.<br />
* The On Demand option will trigger the workflow when called by a System Call or a browser script.<br />
* The Status Change option found on the Company and User Workflow Type, will expose the statuses for the relevant company/user. The workflow will trigger when the company/user status is changed and saved.<br />
* The Trigger When option will expose different options depending on the Workflow Type:<br />
** UTA specific statuses when Workflow Type is UTA specific (e.g. Universal Tracking Application, Tracking Activities, Tracking Sub-Activities). The workflow will trigger when UTA level 1, 2 or 3 is created or updated to the selected status.<br />
** Roles for assigning users or companies to an object when Workflow Type is User / Org assignment specific (e.g. UTA Role Assignment, UTA Company Assignment). The workflow will trigger when user/company is added to the object with the selected role.<br />
<br />
8. Set the Termination Trigger options if appropriate. This option is exposed for certain workflow types, including the UTA specific workflow types (see Workflow Types table above). If the entity changes to the status after the workflow has triggered, any Pending tasks are removed (not executed).<br />
<br />
9. Click the Save button. The workflow is saved and the Workflow ID is now populated. The following options appear in the action bar near the top of the screen:<br />
<br />
* Back/Recently Visited – click this button to return to pages previous accessed.<br />
* Workflows – click this button to return to the workflow list.<br />
* New Task – click this button to create a new workflow task.<br />
* Diagram – click this button to see a diagram view of the workflow.<br />
<br />
10. The following tabs are also now displayed:<br />
<br />
* Task – click this tab to view workflow task and to edit tasks. Tasks are steps within the workflow.<br />
* Pending Queue – click this tab to see a list of outstanding tasks for this workflow, you can delete tasks and reassign tasks to other contacts within the system.<br />
* History - click this tab to see a list of completed tasks for this workflow.<br />
<br />
==Create workflow tasks==<br />
Once you have created the workflow you can add tasks, each task automates and streamlines some action or step in your business processes.<br />
<br />
The process for adding a task to a workflow is as follows:<br />
<br />
1. Navigate to the desired workflow and click on the Tasks tab.<br />
<br />
2. Click the New task button in the action bar.<br />
<br />
3. The Task details are displayed, with a Task Number initially set to 100 and increasing in increments of 100 for each subsequent workflow task.<br />
<br />
[[Image:workflow2017_3.png|1000px|border]]<br />
<br />
<br />
4. Update Task Name then select the Task Type. The task type determines how the task should be processed. The available Task Types include:<br />
<br />
* '''Acknowledgement''' - use to generate a message such as an email to appropriate users.<br />
* '''Request for Approval''' - use to generate action requirements that need an approval. These action requirements display in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Request for Comment''' - use to generate comment requirements. These will be displayed in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Change Status''' - use to change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
* '''Create Consumer/Provider Link''' - use to create Consumer/Provider relationship without custom scripting.<br />
* '''Create New Activity''' - use in Universal Tracking Application workflows, to create Level 2 records.<br />
* '''Update Custom Field Value''' - use to update a custom field to an entered value.<br />
* '''Update Standard Field Value''' - use to update a standard field to an entered value.<br />
* '''Select User for Next Task''' - use to pre-select the user that is responsible for a task that immediately follows this task type. This is necessary for tasks that will trigger at a later date.<br />
* '''User Activation''' - use to activate a contact as a user and send the credentials in order to log in. This is useful for project-type work when you only wish to activate a user as part of a project.<br />
* '''Generate PDF File''' - use for automatic generation of a PDF that will be emailed to the person(s) designated in the workflow step.<br />
* '''People Association''' - use to add either pre-defined, or user selected, contact(s) to the contacts section of a Level 1 record with a given role.<br />
* '''Company Association''' - use to add either pre-defined, or user selected, companies to the Account section of a Level 1 record with a given category.<br />
* '''Activate/Deactivate User''' - use to set the access type of a user or remove access.<br />
* '''Update User Role''' - use to add or remove selected roles from a user.<br />
* '''Update Company Category''' - use to add or remove selected categories from a company.<br />
* '''Web Service - HTTP Request''' - use to send the HTTP Post web service request via a workflow step to retrieve a web service response.<br />
* '''Web Service - SOAP Message''' - use to pass information to a system outside of SmartSimple as a Web Services call.<br />
* '''Web Service - RESTful Request''' - use to consume Restful web service request via a workflow step to get/post a web service response.<br />
* '''Trigger Workflow''' - use to trigger a different workflow against a specified object.<br />
* '''Signority Submission''' - use to trigger Signority signing process.<br />
* '''Retrieve Latitude / Longitude''' - use to retrieve Latitude and Longitude values without need to save the object itself<br />
* '''Translate Field Values''' - use to automatically translate records and field values in the system<br />
<br />
<br />
The Task Types available will vary depending on the Workflow Type selected. The following matrix displays Workflow Task Types availability for Workflow Types.<br />
<br />
The following matrix displays which [[Workflow Task Types]] are available for which [[Workflow Types]].<br />
<br />
scope row Move Object<br />
<br />
{| border="1"<br />
|-<br />
! rowspan="2"|Workflow Task Type Available?<br />
! colspan="17" scope="col"|Workflow Types<br />
|-<br />
! scope="col"|[[Recurring Workflow|Recurring]]<br />
! scope="col"|Company<br />
! scope="col"|User<br />
! scope="col"|File<br />
! scope="col"|Applicant Tracking<br />
! scope="col"|Job Tracking<br />
! scope="col"|Sales Tracking<br />
! scope="col"|Smart Folders<br />
! scope="col"|Web Forms<br />
! scope="col"|Universal Tracking Application<br />
! scope="col"|Tracking Activities<br />
! scope="col"|Tracking Activity Assignment<br />
! scope="col"|Tracking Sub-Activities<br />
! scope="col"|Transactions<br />
! scope="col"|Notes<br />
! scope="col"|UTA Role Assignment<br />
! scope="col"|UTA Company Assignment<br />
|-<br />
! scope="row"|[[Workflow Task Type: Acknowledgement|Acknowledgement]]<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Activate/Deactivate User|Activate/Deactivate User]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Change Status|Change Status]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Create New Activity|Create New Activity]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Generate PDF File|Generate PDF File]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: PDF Merge|PDF Merge]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: People Association|People Association]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Approval|Request for Approval]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Comment|Request for Comment]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Select User for Next Task|Select User for Next Task]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Trigger Workflow|Trigger Workflow]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Custom Field Value|Update Custom Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Standard Field Value|Update Standard Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update User Role|Update User Role]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Company Category|Update Company Category]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: User Activation|User Activation]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - HTTP Request|Web Service - HTTP Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - SOAP Message|Web Service - SOAP Message]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - RESTful Request|Web Service - RESTful Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
<br />
|-<br />
! scope="row"|Retrieve Latitude / Longtitude<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|Translate Field Values<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|}<br />
<br />
5. Set the ''Name'' of the Task as appropriate.<br />
<br />
6. Populate the Description field if required.<br />
<br />
7. Click Save at the bottom of the page.<br />
NOTE: There are a number of other settings specific to the Task Type selected. These are covered in the individual entries specific to each Task Type within the Configuring - Advanced section.<br />
<br />
8. Click on the Back button to return to the Edit Workflow screen.<br />
<br />
[[Image:workflow2017_4.png|1100px|border]]<br />
<br />
9. The Task is listed, but without Connectors, the task will not be executed if the workflow is triggered.<br />
<br />
==Create Workflow Connectors==<br />
All tasks must be connected to other tasks or to the start and complete before they will execute.<br />
<br />
The connectors control when the next steps execute and control what the next steps are (based on defined conditions).<br />
<br />
1. Navigate to the desired workflow and click on the Task tab.<br />
<br />
2. Inside the list of tasks, click the New button in the row preceding the task you wish to connect. In the example below the preceding task may be the Start option, but it could also be a preceding Task.<br />
<br />
3. The New Connector modal window launches with number of options.<br />
<br />
[[Image:workflow201802_6.png|border]]<br />
<br />
<br />
The available options include:<br />
<br />
* '''Name''' - use to enter a descriptive name for the connector<br />
* '''Trigger Type''' - use to select Default or Expired options<br />
* '''Connect To''' - use to select what you want to connect. All tasks within the workflow appear, alongside the Start and Complete options. Also, there will be a list of other workflows in the system.<br />
* '''Trigger Date''' - use to define a trigger date. The connector triggers, when the date matches the selected date.<br />
** '''Trigger Date''' - The date the task is triggers.<br />
** '''Start Date''' - The date in the Start Date field of the record with which the workflow is associated.<br />
** '''End Date''' - The date in the End Date field of the record with which the workflow is associated.<br />
** '''Custom Date Field''' - The date in a selected custom field that stores date values.<br />
* '''Delay(s)''' - user can specify any delays based on the trigger date:<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Hour, then the task will trigger 1 hour after the defined Trigger Date.<br />
** If the value -1 entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours before the defined Trigger Date.<br />
* '''Trigger Time''' – allow relevant when a delay is scheduled with the Day option selected. The drop-downs to allow users to specify what time the task should be trigger.<br />
* '''Business Day Only''' - toggle on to take into account the normal working week, and statutory holidays when determining dates and delays.<br />
* '''Holiday Calendar Used''' - used to select a custom calendar. Holiday calendars can be created and used when you specify which days are Business Days for your community instead of using the predefined Business Days Only option.<br />
* '''Required Respondents''' - use to specify how many people must complete an action before the workflow moves to the next task.<br />
* '''Type Filter''' - lookup to select L1, L2, or L3 types, which will then act as the type condition<br />
* '''Status Filter''' - Lookup to select L1, L2, or L3 statuses, which will then act as the status condition<br />
* '''Condition''' - use to specify a logical condition that must be met before a connector triggers the next workflow task. Multiple connectors can be set up with mutually exclusive conditions to have branching logic on the workflow.<br />
<br />
<br />
4. Complete as appropriate and click Save at the bottom of the screen.<br />
<br />
5. Click the New button in the desired row for the task you wish to connect and connect to a proceeding task, the Complete option or to another workflow entirely. Click Save when finished.<br />
<br />
6. Go back to the General tab and click Save once all connectors have been defined. When the page refreshes then the connectors should be displayed.<br />
<br />
[[Image:workflow2017_7.png|1000px|border]]<br />
<br />
<br />
When you create a Workflow with a delay connector, the recipients of the subsequent task are processed at the time the workflow is triggered and NOT at the time it runs. In other words, the tasks on the workflow, such as generating an email, are processed before the delay, not at the end of the delay.<br />
<br />
If the recipients change between the time the workflow is initiated and the time it fires (based on the delay) the recipients will not be updated. To ensure recipients are evaluated at the time the workflow task fires, insert a blank task after the delay connector (i.e. an Acknowledgement workflow with no recipients), then flow into a new Workflow Task with the desired recipients.<br />
<br />
Example scenario:<br />
<br />
* A workflow is configured to wait 5 days and then mail all contacts attached to the Level 1 with role Reviewer.<br />
* That workflow is triggered against a specific Level 1 record which has three contacts in the contacts section with the role Reviewer.<br />
* After the workflow has been triggered, before the 5 days have gone by, two additional Reviewers are added to the contacts section, and one of the original three is removed.<br />
* If the Acknowledgement task is attached directly after the connector with the delay then the original three contacts will receive the email, even though they are no longer current.<br />
* If there is a blank workflow task following the connector with the delay, which flows into a workflow task configured to email all Level 1 contacts with the role Reviewer, then the four reviewers on the Level 1 record at the time the email is sent, will be emailed, rather than the original three reviewers.<br />
<br />
==Enable on Object==<br />
===Enable Workflow on Company/User===<br />
Workflows must be enabled against an organization before workflows will run against the organization itself, its sub-branches and the users within the organization and its sub-branches.<br />
<br />
If the current User has the Workflows - Attach Workflow to Company System Feature Permission enabled then they will see 2 drop-downs on an organization profile<br />
<br />
* '''Company Workflow''' - which lists all Workflows with a Workflow Type of Company. Only a single company workflow can be selected per Company<br />
* '''User Workflow''' - which lists all Workflows with a Workflow Type of User. Only a single User workflow can be selected per Company<br />
<br />
The way the selected Company workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new Company is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new Company is created, and when an existing Company is modified.<br />
<br />
The way the selected User workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new User or Contact is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new User/Contact is created, and when an existing User/Contact is modified.<br />
<br />
<br />
===Enable Workflow on Company/User Registration Page===<br />
This feature enables a Workflow to trigger on a Company/User registration page.<br />
<br />
An example use would be sending an email to an employee every time a new company registers so that they can verify the information entered for the company.<br />
<br />
Company/User registration Workflows will override other new and modified status-based Workflows. We recommended Workflows triggered from Sign Up pages be On Demand.<br />
<br />
Every sign-up page has an Attach Workflow drop-down menu where users can choose the Workflow they want triggered from the sign up page.<br />
<br />
<br />
<br />
===Enable Status-Driven Workflow on UTA===<br />
Status-driven workflows can be triggered from all levels of a UTA if Workflows have been enabled on the types . To enable workflows for a type do the following:<br />
<br />
1. In your desired UTA, click configuration Settings. Click on the level 1 tab, Click on Types. A list of types is displayed.<br />
<br />
2. Click the Edit button on the desired Type The template details are displayed.<br />
<br />
[[Image:workflow2017_8.png|500px|border]]<br />
<br />
<br />
3. To enable workflows for the Level 1 items, select Yes in the first workflow combo box.<br />
<br />
4. To enable workflows for the Level 2 and 3 activities, select Yes in the second workflow combo box.<br />
<br />
5. Click Save.<br />
<br />
Note: upon creation of new Templates, the Workflow combo boxes default to "Yes." Change these values to "No" in the case that you would like to disable workflows for this template at Level 1 and/or Level 2 and 3.<br />
<br />
<br />
<br />
===Enable Workflow on UTA Type===<br />
Level 1/2/3 Types can be configured to trigger a unique workflow whenever a new item using this template type is added.<br />
<br />
Go to configuration settings, choose the desired tab (level 1/2/3) click the types link, edit the desired type and click on the Template Page tab.<br />
<br />
In the Workflow drop-down, select the appropriate workflow and then click Save.<br />
<br />
<br />
<br />
===Enable UTA Role / Company Assignment Workflow on UTA===<br />
If you wish to trigger a UTA Role Assignment Workflow or a UTA Company Assignment Workflow from a UTA level one record then you must have configured the [[Types|Level 1 Type]] settings.<br />
<br />
Each Level One Type page has the following 2 options:<br />
<br />
* '''UTA Role Assignment Workflow''' - use to define one or more UTA Role Assignment Workflows that are triggered by this type .<br />
* '''UTA Company Assignment Workflow''' - use to define one or more UTA Company Assignment Workflows that are triggered by this type.<br />
<br />
<br />
===Enable Workflow on File Upload field===<br />
To trigger a workflow when a file is uploaded to a Link - Single File or Link - Multiple Files Custom Field scroll down to the File Options section. For Workflow on Upload select the desired workflow and save .<br />
<br />
If the file upload Custom Field is located at Level 2 or Level 3, you can select Tracking Activities or Tracking Sub-Activities Workflow Types.<br />
<br />
If the file Custom Field is located on a Company or User you can select Company or User Workflow Types.<br />
NOTE: The Workflow is only triggered when I file is uploaded, it is not triggered by file deletions.<br />
<br />
<br />
<br />
===Enable Workflow on SmartFolder===<br />
To trigger a workflow when a file is uploaded into a SmartFolder navigate to the desired SmartFolder.<br />
<br />
Click the Folder Settings button (looks like a gear).<br />
<br />
For Workflows select the desired work flow (all workflows of the Type File will be displayed) and click save.<br />
<br />
=Configuration – Advanced=<br />
==Suppress Workflow Window==<br />
When a workflow step is executed the user is generally presented with a Workflow window where they can select a value that will be used to determine the next task to be performed.<br />
<br />
This feature is vital for workflows that require user interventions, but is not required for workflows that are used to simply send an instant message or email message to one or more users.<br />
<br />
If the User has a pop-up stopper/blocker enabled within their browser, the Workflow Window will be suppressed and the Workflow will not trigger. You must ensure that users of workflows that prompt their<br />
<br />
Workflow Window, have enabled pop-up window display for your instance of SmartSimple.<br />
<br />
If you wish to suppress the display of this window you can change the workflow settings as follows:<br />
<br />
1. Go to the menu icon and under System Process click Workflows.<br />
<br />
2. Click the edit button on the desired Workflow.<br />
<br />
3. For Workflow Window enable the Suppress option.<br />
<br />
4. Click Save.<br />
NOTE: If you do not require a user interventions in your workflows it is recommended that the Workflow window be suppressed to ensure workflows execute as you may have little control over user browser settings.<br />
<br />
<br />
<br />
==Recurring Workflow==<br />
A recurring workflow is a Workflow that is not triggered against any particular object.<br />
<br />
A recurring workflows ability to use variables is limited, but recurring workflows are useful for tasks that recur at regular intervals, such as a weekly reminder e-mail.<br />
<br />
When using a recurring workflow, the tasks must be connected in a loop, and there must be at least one connector with a delay. Otherwise, the workflow would endlessly loop.<br />
<br />
If the workflow is set to look endlessly (without a delay), the system will automatically stop processing any workflows configured this way, after five loops.<br />
<br />
Once you have configured the Workflow, the Activate button can be used to start the workflow. Once activated, a Deactivate button will be visible that can be used to stop the workflow.<br />
<br />
If you wish to have a recurring workflow send an e-mail on a particular day or days of the month, you can use the following conditions:<br />
<br />
* date_format(now(),"%d")="01" - Will be true only on the 1st of the month<br />
* date_format(now(),"%d") in ("01","15") - Will be true on the 1st and 15th of the month.<br />
<br />
You will need to configure an empty task (i.e. an Acknowledgement with no recipients) to manage the branching based on the date, and an empty task to manage the one-day delay so the workflow will loop daily and connect to the task that sends the e-mail on the appropriate day(s).<br />
<br />
[[Image:workflow2017_9.png|1000px|border]]<br />
<br />
<br />
The Workflow Connectors attached to the "Empty Task for Branching" should have the following Conditions:<br />
<br />
[[Image:workflow2017_10.png|1000px|border]]<br />
<br />
<br />
<br />
==Task Type specific configuration==<br />
Each available task type represents a different type of action and has different configurations needs as a result.<br />
<br />
This section discusses the specific configuration needs for the different tasks types<br />
<br />
<br />
<br />
===Task Type: Acknowledgement===<br />
Acknowledgements use this Task to send messages to users in SmartSimple.<br />
<br />
Acknowledgement Tasks have the following settings:<br />
<br />
* '''Name''' - name for the task.<br />
* '''Task Type''' - manually set to Acknowledgment<br />
* '''Task Number''' - a system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location, but order or execution of tasks is determined by the Connectors.<br />
* '''Description''' - optional description of the task.<br />
* '''Expire After''' - intended duration of the workflow.<br />
{{Template:WorkflowMessageTemplate}}<br />
* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables.<br />
* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients. Only appears if workflow is UTA specific.<br />
* '''Routing: Role''' - Used to select recipients by role. This list includes all roles configured in the system, alongside the built-in roles that can be used in a workflow:<br />
*** The Originator role is used to reference the name of the person that started the workflow. This could be the person that submitted an expense claim, added a file to a workflow or added a new employee. :*The Initiator role is used to reference the name of the person that initiated the current task in the workflow. This refers to the person that approved the current step of an expense claim, or reviewed a document loaded into a workflow enabled Smart Folder.<br />
*** The Owner role is used to reference the user assigned as the Owner of the record.<br />
*** The People role is used to reference the user assigned as the Person on the level one. This role is only available to Level One specific tasks.<br />
*** The Assigned Users role is used to send messaging to users who are in the Assigned field of a Level Two activity. This role is only available for Level Two workflows.<br />
Once the role has been selected the following recipient choices are available:<br />
<br />
* <br />
*::* Let the current user select target user from this role – When the workflow is triggered, the user will be prompted to select recipients from the list of users currently in the role.<br />
*::* All Users of this role – The message will be sent to all users in the selected role.<br />
*::* Selectable list of users currently in the role – The message is sent to the specific users that are selected.<br />
* '''Routing: Selected Users''' - details of the users configured as Recipients in the Role section<br />
* '''Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
===Task Type: Activate/Deactivate User===<br />
This type of Workflow task is used to set the access type for a user or to deactivate a user.<br />
<br />
No message accompanies this workflow task. If you wish to notify users of a change in access type, for example to notify activated users of their password, you can configure an Acknowledgement type workflow task to follow this step in the workflow.<br />
<br />
Activate/Deactivate User Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Activate / Deactivate User.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - Sets the access type for the user against which the workflow is triggered. Options are:<br />
* '''Activate (Administrative or Portal Interface)''' - Provides access to the system to the extent permitted through the user's membership of specific roles.<br />
* '''Activate (User Centric or Applicant Interface)''' – Only provides access through the User Centric Interface and Applicant Tracking “career sites”.<br />
* '''Activate (Web Service Client Access)''' - Account type used to access data in a SmartSimple instance via an API (Application Programming Interface). Does not give access to SmartSimple interface directly.<br />
* '''Deactivate (No Access)''' – User cannot log into the system.<br />
<br />
===Task Type: Change Status===<br />
Change Status Workflow Task Types change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
<br />
Change Status Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Change Status<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Change Status To''' - lists statuses from the selected UTA level. This workflow task will change the status of the object that triggered the workflow to the selected status.<br />
<br />
===Task Type: Company Association===<br />
You can use the Company Association Workflow Task Type to automatically add, remove or update one or more companies to a Level 1 record. They will be assigned to the record with the UTA category defined in the "Roles will be assigned" setting.<br />
<br />
Company Association Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Company Association<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Variables for companies''' - Allows user to use syntax to reference the company IDs<br />
* '''Action''' - Add, update or delete the company association<br />
* '''Companies''' - use Lookup to select the Companies that will be added.<br />
* '''Roles will be Assigned''' - select the categories that you want the companies to be assigned with. To assign different companies with different categories, you will have to create more than one Company Association task.<br />
<br />
===Task Type: Create Consumer/Provider Link===<br />
Consumer/Provider Link Workflow Task Type creates Consumer/Provider relationships, and is only available to Level 1 and Level 2 workflows.<br />
<br />
Consumer/Provider Tasks have the following settings, all of which control how the target record is linked to the record triggering the workflow:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Connection Type''' - Select whether the link will be a Consumer or Provider<br />
* '''Connection Application''' - Select the UTA being connected<br />
* '''Connection Level''' - Choose the connection level (Level One or Level Two)<br />
* '''Object ID / Variable''' - Enter the Record ID (or a variable to obtain the Record ID of the object to connect to). It accepts semicolon separated lists.<br />
* '''Connection Role''' - Select the Consumer UTA Connection role to be used for the connection<br />
<br />
===Task Type: Create New Activity===<br />
You can use the Create New Activity Workflow Task Type to automatically create and attach one or more Level 2 records to a Level 1 record. This workflow can be driven by a Status change on the Level 1 record. The workflow will also trigger (in this sequence):<br />
<br />
1. Auto-assignments<br />
<br />
2. Level 2 Formulas<br />
<br />
3. Level 2 Workflows<br />
<br />
<br />
New Activity Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create New Activity<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional)<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Activity Scheduling Options''' - drop-down with 3 options (Disable, Schedule by Date and Amount, Schedule by Number of Activities) that can be used to create multiple instances of the Activity.<br />
<br />
: If '''Schedule by Date and Amount''' option is selected then following settings are exposed.<br />
::* '''Start Date''': Level 1 field used to set the start date of the activity scheduling period<br />
::* '''End Date''': Level 1 field used to set the end date of the activity scheduling period<br />
::* '''Schedule Every''': frequency of scheduling<br />
::* '''Total Amount''': Level 1 field used for the Total Amount to be distributed. The amount specified will be split evenly between each Level 2. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Date''': Level 2 field used to set the date to be assigned to each record based on the scheduling options."<br />
::* '''Activity Amount''': Level 2 field used to store the calculated amount for each record. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
: If '''Schedule by Number of Activities''' option is selected then following settings are exposed.<br />
::* '''Number of Activities''': Level 1 field used to set the number of activities to be created<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
'''Days Delay''' - Number in days of delay before creation of new activity. If left blank, the new activity will be created immediately.<br />
::* '''Create for Users in UTA Role''' - select the UTA Role of the users that the Peer Activity should be created against.<br />
::* '''Activity Type''' - This is where you specify which Level 2 Type you wish to create. If you select the Custom Field option then a Custom Field ID field is exposed.<br />
::* '''Custom Field ID''' - The Create New Activity workflow can be driven by a Custom Field. For example, you could have check boxes at Level 1 corresponding to various Level 2 Types. Selecting each check box would create and attach the relevant Level 2 activity type. You must first create a Custom Field on the Level 1 record which stores the typeid(s) of the Level 2 Types to be created. To create multiple Level 2 records use one of the Select many field types (e.g. Select Many – Check Boxes, Select Many – Scrolling Check Box, Select Many – List Box) and to create a single Level 2 record use the Select One – Combo Box.<br />
::* '''Activity Status''' - Allows you to define the Status for the newly created Level 2 record(s). Note: If that Level 2 Status has a workflow attached to it the workflow will be triggered at the point of creation of the Level 2 record.<br />
::* '''Reminder Type''' - You can select whether a Quick Message or reminder email will be sent out to the Owner or contacts attached to the record, or any combination of the above.<br />
::* '''Reminder Days''' - Sets delay for reminder message being sent.<br />
<br />
: <br />
===Task Type: Generate PDF File===<br />
Auto generation of a PDF that can be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field.<br />
The PDF generated must be based upon a Web Page View Custom Field. You must specify the Custom Field ID of the Web Page View to be converted in the Web Page Field ID field on the Workflow Task settings.<br />
<br />
: <br />
Multiple PDFs can be created and stored in a single Link - Multiple Files custom field using this workflow task type, by entering the Custom Field IDs of the Web Page View fields, separated by commas.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Web Page Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: PDF Merge===<br />
Will convert [[Custom Field Type: Special – MS Word Merge|Word Merge]] document to a PDF which can then be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field<br />
<br />
: <br />
The PDF generated must be based upon a [[Custom Field Type: Special – MS Word Merge|Word Merge]] Custom Field. You must specify the Custom Field ID of the MS Word Merge document to be converted in the MSWord Merge Field ID field on the Workflow Task settings.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''MSWord Merge Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: People Association===<br />
You can use the People Association Workflow Task Type to automatically add one or more contacts to a Level 1 record. They will be assigned to the record with the UTA role defined in the "Roles will be assigned" setting.<br />
<br />
People Association have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to People Association<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Action''': Add, update or delete the people association<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. This is discussed in greater detail in the Configuration – Advanced section.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to control role of user that will be associated.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to be associated<br />
::* '''Roles will be Assigned''' - select the role(s) that you want the contact(s) to be associated with. To assign different contacts with different roles, you will have to create more than one People Association task.<br />
In the Routing section select a Role currently possessed by the contact(s) you wish to add, whether this is a system role or a UTA role. You can then either select specific contacts or groups that will always be added to the Level 1 when the workflow is triggered, or you can choose Let current user select target user from this role to allow the person that triggers the workflow to select a contact to be added.<br />
Note:<br />
::** If you are allowing the current user to select target user Suppress Workflow Window must be off (not enabled) otherwise the workflow will not fire.<br />
::** If you are allowing the current user to select target user, the Workflow must be triggered by a status, and not by a script.<br />
::** Include a description, as the description will be presented to the user when they are asked to select the contact to be assigned.<br />
In order to notify the contact(s) that they have been assigned you can create a subsequent Acknowledgement Workflow Task to e-mail all contacts with the UTA role you selected.<br />
<br />
===Task Type: Request for Approval / Request for Comment===<br />
Both of these Workflow Task Types prompt users to review the work of others, and keep track of outstanding reviews on the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] page.<br />
<br />
The settings for both of these Workflow Task Types match those used for the Acknowledgment task except for 2 additional settings:<br />
<br />
:* '''Respondents''' - Indicates the number of respondents required for this approval.<br />
:* '''Allow Edit''' - Allows editing of the attached object.<br />
By default, a Request for Approval or Comment workflow task will move on to the next task (whether approved, rejected, etc.) as soon as the first recipient of the Workflow Task responds. The Respondents field allows a specific number of respondents to be required, which will keep the Request for Comment Task active until that number of respondents has replied.<br />
The Routing options field is used as part of the Request for Approval process. Users should enter appropriate options within the Routing Options section(Example: 10=approved;20=reject;30=Revise) and click Save.<br />
<br />
These Routing Options will then be available in the Trigger Type drop-down when configuring Connectors. It is suggested that each routing option should have a corresponding task so that the routing option can then be connected to an appropriate task.<br />
<br />
You must set the minimum number of respondents on the connector associated with each of the approval options.<br />
<br />
::* If you have selected three respondents on the Request for Approval Task, and the task should only pass if all three respondents click approve you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be one.<br />
::* If you have selected four respondents on the Request for Approval Task, and the task should only pass if three respondents click "Approve," you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be two.<br />
The system checks the connectors once the number of respondents on the task has been met, this behaviour is not configurable. The first connector the system checks will be taken if the requirements are met.<br />
You must ensure the Workflow Task is sent to enough people to meet the minimum number of respondents required, if you do not send the task to enough recipients the task would never complete.<br />
<br />
===Task Type: Select User for Next Task===<br />
This task type used to allow the current user to pre-select the user that is responsible for the task that immediately follows this task type.<br />
<br />
This is necessary for tasks that will trigger at a later date.<br />
<br />
For example, consider a Workflow that is triggered on the status of Escalated which is configured to send a reminder e-mail to a manager if the status has not changed for seven days. If the reminder e-mail workflow task has Let current user select target user from this role as the recipient the Workflow would fail. This is because the e-mail is triggered (seven days later) by the system, and there is no current user.<br />
<br />
The settings for this Workflow Task Types match those used for the Acknowledgment task. The only difference if that the Request with the Routing options.<br />
<br />
<br />
<br />
===Task Type: Signority Submission===<br />
You can use the Signority Submission Workflow Task Type to automatically trigger the Signority signing process via workflow.<br />
<br />
Signority Submission Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Signority Field''' - drop-down which lists all Signority enabled WPV fields for the entity the workflow is configured against.<br />
<br />
===Task Type: Trigger Workflow===<br />
You can use the Trigger Workflow tasks to trigger a different workflow.<br />
<br />
Trigger Workflow Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Trigger Workflow''' - Select the workflow that should be triggered from this dropdown menu.<br />
:* '''Record id / Variable''' - this setting should contain the unique record ID for the record against which the selected workflow should be triggered. This record ID can be referenced using variables.<br />
:*** Examples: If the workflow to be triggered is a User type workflow, you would need to provide a User ID for the contact record against which you would want the workflow to be triggered.<br />
:*** If the workflow is to be triggered against a series of Level 2s attached to a Level 1 record, you could use List Syntax to define a list of activities meeting certain criteria against which the workflow should be triggered.<br />
<br />
===Task Type: Update Company Category===<br />
Update User Role Workflow Task Types can add or remove categories from SmartSimple organizations.<br />
<br />
This task type is only available for "Company" workflows.<br />
<br />
Update Company Category Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove categories from the organization upon which the workflow is triggered.<br />
* '''Categories''' - select the categories that should be added or removed from the organization's profile.<br />
<br />
===Task Type: Update Custom Field Value===<br />
The Update Custom Field Value workflow task type can be used to write values to custom fields on the object against which the Workflow is triggered.<br />
<br />
These values can be hard-coded or they can use variables.<br />
<br />
You can also use MySQL syntax to manipulate values using sscalculation.<br />
<br />
Update Custom Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists custom fields across all UTAs from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
Note: If the field to be updated has the Read Only toggle enabled in the Formatting section of the field options (or a "read-only" HTML tag or "textreadonly" CSS class) the value will not update.<br />
* '''Update To Value''' - This workflow task will use this value to update the field selected in the "Use Field" setting. Variables can be used in the "Update To Value" setting as well as hard-coded values.<br />
<br />
===Task Type: Update Standard Field Value===<br />
The Update Standard Field Value workflow type can be used to write values to standard fields on the object against which the Workflow is triggered.<br />
<br />
Standard fields on the level 1, level 2, level 3, companies, contact and transaction can be updated using this method:<br />
<br />
Update Standard Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists standard fields from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
* '''Update To Value''' - accepts hard-coded values and variables. This workflow task will use this value to update the field selected in the "Use Field" setting.<br />
Note: Some standard fields (such as Type) require the ID, not the type name in order to update correctly.<br />
<br />
===Task Type: Update User Role===<br />
Update User Role Workflow Task Types can add or remove roles from SmartSimple contacts.<br />
<br />
This task type is only available for "User" workflows.<br />
<br />
Update User Role Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove roles from the contact upon which the workflow is triggered.<br />
* '''Roles''' - select the roles that should be added or removed from the contact's profile.<br />
<br />
===Task Type: Web Service - HTTP Request===<br />
This workflow task type is used to consume a [[APIs|web service]] via a workflow step. The web service will send the HTTP Post request to retrieve information. The response returned by the web service can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:HTTPPost.PNG|500px]]<br />
<br />
HTTP Post have the following settings:<br />
<br />
:* '''URL''' - endpoint of the HTTP Post web service<br />
:* '''User Name''' - username to access post location if needed<br />
:* '''Password''' - password to access post location if needed<br />
:* '''Parameters''' - free text field to pass in parameters such as apitoken , alias id, etc. Can include username and password if not specified in the specific fields<br />
:* '''Response Stores To''' - field on system where response from HTTP post can be stored<br />
<br />
===Task Type: Web Service – SOAP Message===<br />
The Web Service - SOAP Message Workflow Task allows you to post data to another system, outside of SmartSimple. The response returned by the external system can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:SOAP.png]]<br />
<br />
This Task type has the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Message Template: Action''' - The action to called by the Web Service call (These actions are defined by the external server, and are not part of SmartSimple)<br />
* '''Message Template: Custom Field ID for Response''' - The Custom Field ID of an XML custom field on the object that the Workflow was triggered against that the response returned by the external server.<br />
* '''Message Template: Email Message Header''' - The email header can be modified using the following syntax, with the arguments separated by semicolon:<br />
** X-Priority={1,2,3,4,5}<br />
** Priority={normal,urgent,non-urgent}<br />
** Importance={high,normal,low}<br />
** Sensitivity={personal,private,company,confidential}<br />
*: e.g. Priority=urgent;Importance=high<br />
** '''Message Template: Endpoint''' - The URL or IP address of the destination server<br />
** '''Message Template: Envelope Template''' - The content of the Web Service message to be sent to the external service. This can contain variables related to the object the workflow is triggered against.<br />
** '''Message Template: Attach Object''' - Attaches the details of the object to the message. In the case of a SmartSimple object, such as a company, person, or application, the textual details of the object will be added. If the object is a file, then the file will be attached to an e-mail message, but not an instant message.<br />
** '''Message Template: Attachment File IDs''' - Attach additional default files when triggered from a Smart Folder. See the Determining the File ID article for instructions.<br />
** '''Message Template: Save as Event''' - Email will be saved as an event.<br />
If the content from the custom fields being included within the SOAP message contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server.<br />
<br />
The less than symbol (<) and ampersand (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving system understands that they are data content and not part of the XML structure:<br />
<br />
:: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
For example, an address could contain ampersands, so it should be wrapped as follows:<br />
<br />
<pre>@firstname@@lastname@</pre><address> </address><br />
<br />
If the response to your Web Service call contains values that you wish to store within a Custom Field on the object against which the Workflow was triggered, you can connect a Update Custom Field Value Workflow Task to be the task following the Web Service - SOAP Message and use the variable syntax to pull the value from the XML Custom Field you selected to store the response to the Web Service call.<br />
<br />
For example, if the [[Custom Field Type: Special - XML Data|XML]] Custom Field that stores the response (custom field ID 155255 in the image above) is called '''Web Service Response''', the variable in the [[Update Custom Field Value]] task to pull a node called '''AssignedIdentifier''' could be:<br />
<br />
@xml.Web Service Response.soap:Body.AssignedIdentifier.nodevalue@<br />
<br />
If the response should be saved to a [[System Variable]], the syntax would be:<br />
<br />
@system.xml.''fieldname''.''nodename''.nodevalue@<br />
<br />
===Task Type: Web Service - RESTful Request===<br />
This workflow task type is used to consume a RESTful web service using GET or POST method.<br />
<br />
====RESTful Web Service Request using GET Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_GET.PNG|500px]]<br />
<br />
GET RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - resource of the web service<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====RESTful Web Service Request using POST Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_POST.PNG|500px]]<br />
<br />
POST RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - endpoint of the web service<br />
:* '''Request Body''' - data sent with the request.<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====Credentials of the RESTful Web Service Request====<br />
<!--89397 - Workflow Task Type: Web Service - RESTful Request --><br />
Credentials of the web service can be added in the Request Header in the format: Authorization=Basic [base64 encoded credentials].<br/><br />
A third party software can be used to convert the username/password to a base64 encoded credentials.<br/><br />
Note that all equal signs within the base64 credentials should be replaced with %3D.<br/><br />
Example:<br/><br />
FROM: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''='''</span><br/><br />
TO: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''%3D'''</span><br />
====Parsing JSON response====<br />
<!--67458 - Add GET/POST REST services workflow tasks that are compatible with JSON--><br />
Variable syntax is available to parse and retrieve values from JSON format data.<br/><br />
''Sample 1''<br />
<pre>FIELD_NAME: {"firstname":"John"}<br />
variable syntax: @json.FIELD_NAME.firstname@ <br />
result: John<br />
</pre><br />
''Sample 2''<br />
<br />
<pre>FIELD_NAME: {"primarycontact":{"firstname":"Thomas"}}<br />
variable syntax: @json.FIELD_NAME.primarycontact.firstname@ <br />
result: Thomas<br />
</pre><br />
''Sample 3''<br />
<br />
<pre>FIELD_NAME: {"users":[{"firstname":"Marie"},{"firstname":"Eve"}]}<br />
variable syntax: @json.FIELD_NAME.users.[# ~firstname~, #]@<br />
result: Marie, Eve<br />
</pre><br />
<br />
===Task Type: Translate Field Value===<br />
The Translate Field Value Workflow Task allows you to perform automatic translation of records and field values in the system. It will only apply to those custom fields that have [[Enable_Translation_Service|enabled translation services]].<br />
<br />
This Task type has the following settings:<br />
<br />
** '''Name''' - Narrative name for the task.<br />
** '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
** '''Description''' - Detailed description of the task (optional).<br />
** '''Translate to''' - set which language or languages to translate to for the custom fields that have enabled translation<br />
If a record has translation enabled and a stored field translation exist, there will be a "Show Translation Values" in the Options menu<br />
<br />
When shown, the translated field values will appear directly underneath the existing field value.<br />
<br />
If more than one translated language exist, there will be a language drop down appearing at the top of the record.<br />
<br />
==Importing and Exporting Workflow Tasks==<br />
Workflow Tasks can be exported and imported into other Workflows using the Import/Export function on the Edit Workflow page. This feature is particularly useful if you have created workflows for testing on your backup instance and wish to implement the finalized reports in your live system.<br />
<br />
The steps to export a workflow task or set of workflow tasks are as follows:<br />
<br />
[[Image:ExportWorkflow2017.png|1000px|border]]<br />
<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab and select the checkbox next to the workflow task(s) that you wish to export.<br />
<br />
2. Click on the Export button.<br />
<br />
3. A pop-up window will appear, containing the details of the tasks you have selected in XML format. Select all of the text in the pop-up window and save it to a text editing program, such as Notepad.<br />
<br />
Note that, if multiple tasks are selected, they will be delimited in the XML text block with the tag.<br />
<br />
<br />
The steps to '''import''' a workflow task or set of workflow tasks are as follows:<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab, then click on the Import button.<br />
<br />
2. A blank pop-up window will appear. Paste the XML data that you have exported into this window.<br />
<br />
3. Confirm your selection by clicking on the Import button at the bottom of the pop-up window.<br />
<br />
* The workflow tasks will be imported into the new workflow.<br />
* The Edit Workflow page will refresh to show the newly-added workflow tasks.<br />
<br />
==Workflow Condition==<br />
A logical statement can be added to workflow connectors in the Condition field, enabling you to specify which workflow task will be triggered.<br />
<br />
Example Branching Logic can be implemented to send an approval message to Senior Management when the request is over $100,000, while requests under $100,000 will take a different path when the workflow is triggered.<br />
<br />
<br />
[[Image:workflow2017_13.png|600px|border]]<br />
<br />
<br />
In general the Workflow Condition is used with several different connectors attached to a task. Collectively the conditions on each task should accommodate every possibility.<br />
<br />
Note: because the sequence in which the system accesses each connector is not configurable it is important that the conditions are mutually exclusive. For example, if you have 3 connectors for different paths based on a particular value the conditions could be:<br />
<br />
* "@Selection@"="Yes"<br />
* "@Selection@"="No"<br />
* "@Selection@"!="Yes" and "@Selection@"!="No"<br />
* The last statement could also be represented as "@Selection@" not in ("Yes","No")<br />
You can also use MySQL syntax to perform calculations within the Condition:<br />
* date_format(now(),"%d")="01"<br />
<br />
<br />
This condition will be true only on the 1st of the month. This could be used with a Recurring Workflow that loops daily if you wish to send out a summary e-mail on the 1st of every month.<br />
<br />
It is recommended that workflows with a loop include an empty task with 2 connectors with 2 separate conditions, one which goes back to the looped task and another which proceeds on to the next task, thus preventing an endless loop.<br />
<br />
Note: Other than values that are always numeric, all variables should be enclosed in double quotes.<br />
<br />
<br />
<br />
===Workflow Condition Examples===<br />
There are two rules that must be followed when adding multiple connectors to a workflow task that incorporate conditional logic statements:<br />
<br />
'''1. Collectively, the conditions on each task must accommodate every possible permutation'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three level one [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@levelone.typeid@"="12345"'' and<br />
* ''"@levelone.typeid@"="45678"'', respectively<br />
<br />
If the workflow is fired against a record associated with typeID 67890, the workflow will never progress to the next task.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
Three level one [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Three connectors are set up on a workflow task with conditions of:<br />
<br />
<br />
<br />
* ''"@levelone.typeid@"="12345"'',<br />
* ''"@levelone.typeid@"="45678"'' and<br />
* ''"@levelone.typeid@"="67890"'', respectively<br />
<br />
<br />
Alternatively, connectors with the following conditions could be set up:<br />
<br />
<br />
<br />
* ''"@levelone.typeid@"="12345"''<br />
* ''"@levelone.typeid@"!="12345"'' (not equal to "12345"), and<br />
* ''"@levelone.typeid@" NOT IN ("12345","45678")'', respectively<br />
<br />
<br />
'''2. Each condition must be mutually exclusive from every other'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[Level_2_Types|level 2 types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two level 2 [[status]]es exist in the same application, with [[Determining the statusid|statusIDs]] of 888 and 999.<br />
<br />
The system administrator wishes to send emails via workflow if the record is in one of the above statuses. One email should be sent out if the type is 12345 or 45678 and a different email should be sent out if a different type has been used.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@level2.typeid@" in ("12345","45678") AND "@level2.statusid@" in ("888","999")'' and<br />
* ''"@level2.statusid@" in ("888","999")''<br />
<br />
<br />
The issue here is that both statements [[Boolean Operators|evaluate]] as '''true''' if the statuses on the record triggering the workflow have a statusID of 888 or 999.<br />
<br />
The workflow process will not "know" which task to connect to. The workflow will progress, but not necessarily to the next intended workflow task. In other words, the wrong email may be sent.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
The types and statuses exist as above, and the system administrator wishes to configure the same branching logic.<br />
<br />
Two connectors should be set up on a workflow task with the following conditions:<br />
<br />
* ''"@level2.typeid@" in ("12345","45678") AND "@level2.statusid@" in ("888","999")'' and<br />
* ''"@level2.typeid@" not in ("12345","45678") AND "@level2.statusid@" in ("888","999")''<br />
<br />
<br />
This configuration satisfies Rule #2, in that the conditions are now mutually exclusive. However, a third connector must be included, with the following condition, which connects to the "Complete" task, in order to satisfy Rule #1 above:<br />
<br />
* ''"@level2.statusid@" not in ("888","999")''<br />
<br />
<br />
With these three connectors configured, the workflow will:<br />
<br />
* never not have instructions on ''whether'' to trigger the next workflow task (Rule #1), and<br />
* always have clear instructions on ''which'' task to trigger given a certain set of conditions (Rule #2).<br />
<br />
==Using iCalendar to generate Meeting Requests, Tasks and Contact cards==<br />
iCalendar is a file format that allows Internet users to send meeting requests, contacts and tasks through email and other digital methods.<br />
<br />
SmartSimple workflows support 3 email attachments types (ievent, itodo and icard).<br />
<br />
The SmartSimple email engine will look for email contents that have ievent, itodo, and icard objects. The contents of these objects are assembled and added as email attachments.<br />
<br />
The email engine will process iCalendar objects using the following syntax:<br />
<br />
* "@@ievent"<br />
* "@@itodo"<br />
* "@@icard"<br />
<br />
Simple sample iCalendar objects are shown below<br />
<br />
<br />
<br />
===ievent Object===<br />
Manifests as an ical attachment on the email.<br />
<br />
<pre><br />
<!--@ssattach(icalendar,vevent)--><br />
@@ievent<br />
UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DTSTART:TO_UTC(@startdate@ @starttime@)<br />
DTEND:TO_UTC(@enddate@ @endtime@)<br />
LOCATION:Room 1<br />
SUMMARY: Details to follow<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
instead of UTC you can specify the Time Zone for the DTSTART and DTEND as:<br />
<br />
<pre>DTSTART;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullstartdate@","%Y%m%dT%H%i%s"))--><br />
DTEND;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullenddate@","%Y%m%dT%H%i%s"))--><br />
</pre><br />
<br />
===itodo Object===<br />
<pre><br />
<!--@ssattach(icalendar,vtodo)--><br />
@@itodo<br />UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DUE:TO_UTC(@startdate@)<br />
STATUS:NEEDS-ACTIONLOCATION:Room 1<br />
SUMMARY: Meeting<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
<br />
===icard Object===<br />
<pre><br />
<!--@ssattach(icalendar,vcard)--><br />
@@icard<br />FN:@owner.fullname@<br />
ORG:@company@<br />TITLE:@name@<br />
TEL;TYPE=WORK,VOICE:@owner.phone@<br />
TEL;TYPE=HOME,VOICE:(404) 555-1212<br />
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=WORK:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America<br />
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=HOME:42 Plantation St.\nBaytown\, LA 30314\nUnited States of America<br />
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
==Trigger a Workflow from a Custom Browser Script==<br />
Workflows can be triggered based on a value in a custom field on the object using a browser script:<br />
<br />
_triggerwf(objectid,workflowid,Entity ID); <br />
<br />
The Entity ID should not be included for UTA Level 1 workflows<br />
<br />
You must first create the workflow. Once it has been created you need the [[Workflows_Overview#Determining_the_workflowid|Workflow ID]].<br />
<br />
In the browser script you would use triggerwf with the following syntax:<br /><br />
'''Level 1''': _triggerwf('@opportunityid@',''workflowid'');<br />
<br />
<br />
<br />
Example:<br />
<br />
_triggerwf('@opportunityid@',98765);<br />
<br />
'''Level 2''': _triggerwf('@eventid@',''workflowid'',26);<br />
<br />
Example:<br />
<br />
_triggerwf('@eventid@',98765,26);<br />
<br />
('''26''' is the objecttype for Level 2 activities, and will be the same for all Level 2 workflows)<br />
<br />
NOTE: For workflows triggered by a Browser Script within a UTA you should set Trigger When to --Deactivate-- rather than selecting a Status. This ensures that the workflow is only triggered when called by the script, and there is no risk of triggering it when a status changes.<br />
<br />
Notes:<br />
<br />
* You must not select Let current user select target user from this role for the Routing of workflows triggered by script, as they will not execute.<br />
* Because the workflow is triggered when the script executes it happens before the record is saved. If the workflow changes the Status or a Custom Field value, when the record on the screen is actually saved it will overwrite any changes made by the workflow by those on the page that is being saved. Accordingly you should include any Status or Custom Field changes within the JavaScript that triggers the Workflow.<br />
* If this function is called with a button on a page where standard libraries are not included, make sure to include /js/sstools.js (Example:<script src="js/sstools.js" type="text/javascript"></script>).<br />
<br />
==Using variables with workflows==<br />
===Pass parameters when workflow triggers another workflow===<br />
If a workflow is triggered from another workflow, you can reference a value from the object that triggers the previous workflow (e.g. if a L3 workflow triggers a L2 workflow, you can reference any value from the L3 object from within the L2 workflow). The syntax is as below:<br />
<br />
@triggerobject.FIELDNAME@<br />
<br />
This syntax should work when generating an email, and when used in the connectors as a condition.<br />
<br />
It should also work when using a Trigger Workflow task, and when a Task Connector is linked directly to the workflow.<br />
<br />
===Using variable syntax to select recipients for workflow tasks===<br />
The recipient of workflows (selected in the Acknowledgement, Request for Comment and Request for Approval task types) can be defined using [[Variable List|variable syntax]], rather than being limited to the list by role.<br />
<br />
The benefits to using this approach is, you can send to multiple roles at the same time, rather than having to configure different tasks for each role.<br />
<br />
It also allows you to filter recipients based on a custom field on the contact, or UTA Contact Role Based custom field(s).<br />
<br />
To enable this feature, click on the "Use Variable for Recipients" checkbox under the "Routing" header in the workflow task and then use variables to reference the relevant user.<br />
<br />
<br />
<br />
===Notes Workflow===<br />
The following variables can be used in Notes Workflows:<br />
<br />
@notes@ - the body of the note<br />
<br />
To reference fields found on the associated Level 1, Level 2, Level 3, contact or organization record:<br />
<br />
@parent.fieldname@ or @parent.#fieldID#@<br />
<br />
For Notes at Level 2 you can reference fields on Level 1 using:<br />
<br />
@parent.parent.fieldname@ or @parent.parent.#fieldID#@<br />
The same syntax can be used to call Level 2 fields for Notes at Level 3<br />
<br />
To call Level 1 fields for notes on Level 3:<br />
<br />
@parent.parent.parent.fieldname@ or @parent.parent.parent.#fieldid#@<br />
<br />
Using the "Variable processed recipients" feature of Workflow Tasks, you can direct a Notes Workflow to the contacts on the record to which the note is attached, using the @parent.owner.userid@ or @parent.[#(?object=contact)~userid~,#]@ syntaxes.<br />
<br />
<br />
<br />
===Password Variables===<br />
Different [[Password|password]] [[Variables|variables]] can be used depending on the [[Workflow|workflow]] task type.<br />
<br />
[[UTA]] Activation task type uses @password@<br />
<br />
Acknowledgment task type uses @randompassword@ or @checkactivatedpassword@<br />
<br />
<br />
'''Task Type: User Activation'''<br />
<br />
* @password@ - Checks if the user is activated<br />
** if the [[User|user]] is not activated then generates a new random [[Password|password]] (i.e. Your password is: ABCDEFGH)<br />
** if the [[User|user]] is activated then sends the text "current password" (i.e. Password is: current password)<br />
'''Task Type: Acknowledgment'''<br />
** @randompassword@ - generates a new random [[Password|password]]<br />
** @checkactivatedpassword@ - checks if the [[User|user]] is activated<br />
*** if the [[User|user]] is not activated then generates a new random [[Password|password]]<br />
*** if the [[User|user]] is activated then sends the text "existing password" (see '''Notes''' below)<br />
Because of the complex nature of the password creation and validation process it is not possible to automatically translate '''existing password''' into other languages. If you are sending an e-mail containing the @checkactivatedpassword@ variable you can use the following syntax to display text other than "existing password" if required.<br />
* <br />
<br />
For example, for an existing user the following will show the French translation of '''existing password''' which is '''Mot de passe courant'''. If the user has not been previously activated the syntax will provide a randomly generated password as normal:<br />
<br />
<pre><br />
<!--@sscalculation(if(trim("@checkactivatedpassword@")="existing password","Mot de passe courant","@checkactivatedpassword@"))--><br />
</pre><br />
<br />
{{WorkflowTaskTypeCCEmailSyntaxOptions}}<br />
<!--sendnoto sendnotto Sendnotto sendasto reply-to replyto--><br />
<br />
=Using workflows=<br />
==Searching or Sorting Workflows==<br />
To access the workflows list, click the menu icon in the action bar, followed by the Workflows link in the System Process section.<br />
<br />
The following tabs are also displayed:<br />
<br />
* '''Workflows''' – click this tab to see list of workflows.<br />
* '''Tasks''' – click this tab to see a list of tasks for all workflows.<br />
* '''Outstanding Tasks''' – click this tab to see a list of outstanding tasks for all workflows.<br />
Each of these tabs has search and sort options, to allow quick and easy location of workflows and tasks.<br />
The steps for '''searching''' are as follows:<br />
<br />
<br />
1. Go to the tab that you wish to search against.<br />
<br />
2. Click into the search criteria field to select the list view column to search against.<br />
<br />
3. Enter in appropriate criteria.<br />
<br />
4. Click on the Search button to run the search or click on the X (clear button) to clear the criteria.<br />
<br />
5. All matching results will be listed, as well as filter criteria.<br />
<br />
<br />
<br />
The steps for '''sorting''' are as follows:<br />
<br />
1. Click the column header on the column you wish to sort. First click sorts ascending (going up example 1,2,3).<br />
<br />
2. Second click sorts descending (going down example 3,2,1)<br />
<br />
3. Third click returns to the default sort order.<br />
<br />
==Workflow Requests==<br />
Workflow Requests are generated by Request for Approval / Request for Comment workflow tasks.<br />
<br />
The Workflow Requests page lists:<br />
<br />
* outstanding tasks that you need to complete based on SmartSimple [[workflows]],<br />
* tasks that other people need to complete where you are participating in some steps in the workflow, and<br />
* project tasks that you are assigned to complete.<br />
The request will be listed under the '''Requests to me''' link.<br />
1. Click the '''Communications''', Workflow Requests link. The Workflow task is displayed.<br />
<br />
2. Click the '''Task type''', '''File''' link. The Workflow step is displayed with the following fields in the request:<br />
<br />
* '''Task Name''' – The name of the [[Workflow|workflow]] task.<br />
* '''Created Date''' – The date the task was triggered.<br />
* '''Task Description''' – The description of the task’s purpose.<br />
* '''Action''' – The '''Routing Options''' for the request. These options are only visible for '''Requests For Approval'''.<br />
* '''Comments''' – This box is always visible but can only be used with '''Request For Comments'''.<br />
* '''Object Area''' – The bottom portion of the request screen where the attached object is displayed.<br />
3. Select '''Approve''' to approve the file and click the '''Submit''' button. The '''Approve''' option requires us to select a [[User|user]] to send the approval message to so the '''Select User''' list is displayed.<br />
4. Select the [[User|user]] to receive the approval message and click the '''Submit''' button. The step is complete and the Workflow is also complete. The '''workflow complete''' message is displayed.<br />
<br />
5. Click the '''Communications''', '''Workflow Requests''' button. The [[Workflow|workflow]] is removed from the '''Request to Me''' window.<br />
<br />
==Workflow Diagram==<br />
Clicking on the Diagram button in the action bar of the Edit Workflow page will bring up a graphical representation of the Workflow Tasks that have been configured on that workflow.<br />
<br />
System Administrators use this feature to document and troubleshoot complicated workflow configurations.<br />
<br />
[[Image:workflow2017_17.png|border]]<br />
<br />
<br />
<br />
==Workflow Pending Queue==<br />
On the Edit Workflow page, the Pending Queue tab shows all instances where the workflow in question has been triggered, and the task has been scheduled for future completion.<br />
<br />
The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
[[Image:workflow2017_18.png|900px|border]]<br />
<br />
<br />
<br />
==Workflow History==<br />
In the Edit Workflow page, the history of an individual Workflow can also be accessed by the History tab.<br />
<br />
This page shows all instances of the workflow being triggered. The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
<br />
<br />
==Workflows Triggered by a Given Entity==<br />
The Workflow History tab is made visible for a given Universal Tracking Application™ by enabling the relevant Manager Permission. Go to UTA – Settings – Security, click on Feature and Function Permissions.<br />
<br />
The Enable Workflow History setting is found on the Feature tab.<br />
<br />
Enabling the Manager Permission will enable the Workflow History section from the Option drop-down on Level 1, Level 2 and Level 3 records.<br />
<br />
[[Image:workflow2017_19.png|border]]<br />
<br />
<br />
Clicking on the Workflow History tab will display the history of workflows triggered on the entity.<br />
<br />
[[Image:workflow2017_20.png|border]]<br />
<br />
<br />
<br />
==Configure System to display Workflow options==<br />
The user creating the workflow must have permission to set company workflow trigger.<br />
<br />
Go to Global settings – Security – System Feature Permissions , go to the Action Permission tab and scroll down to the Workflows - Attach Workflow to Company setting.<br />
<br />
There should be a Lookup button to select the roles that should be allowed to attach the workflow.<br />
<br />
Once the role is selected, the options will display in the edit company view.<br />
<br />
[[Image:workflow2017_21.png|border]]<br />
<br />
<br />
<br />
==Reasons workflow messages aren't arriving==<br />
Some common reasons for workflow messages not arriving are:<br />
<br />
# Your [[Browser|browser]] has a pop-up blocker.<br />
# [[Workflow|Workflows]] are not enabled.<br />
# There is another [[Workflow|workflow]] triggering on the same status.<br />
# Your [[Workflow|workflow]] is not configured properly.<br />
Solution to:<br />
# Allow [[SmartSimple]] as a trusted site '''''or''''' check your [[Browser|browser]] for any tool bars that may be blocking the pop-ups '''''or''''' set the [[Workflow|workflows]] to [[Workflow - Silent Mode|suppress pop-ups]].<br />
# Typically in [[UTA]]s, you will need to edit the ''template'' and enable [[Workflow|workflows]] for the level at which they are being triggered.<br />
# You will need to review the other [[Workflow|workflows]] to make sure that two [[Workflow|workflows]] are not triggering on the same status.<br />
# You will need to review the configuration of the [[Workflow|workflows]] to ensure that the connectors are set appropriately as well as the individual tasks that are to take place.<br />
<br />
==Determining the Workflow ID==<br />
Once a workflow has been created, the workflow ID (''wfid'') can be found as follows:<br />
<br />
* Click on the hyperlink for [[Global Settings]]<br />
* Go System tab, click on the hyperlink for ''Workflows''<br />
* The workflow ID is visible as the right-most column on the list of workflows.<br />
Alternatively:<br />
* Click on the Edit workflow icon for the Workflow you want, and the Workflow ID will be at the top of the page:<br />
<br />
[[Category:System Management]][[Category:Workflows]][[Category:Applications]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Workflows_Overview&diff=37482Workflows Overview2020-04-23T17:24:53Z<p>Ciaran: /* Workflow Condition Examples */</p>
<hr />
<div>=Overview=<br />
A Workflow is a set of repeatable steps used to automate and streamline your business processes within the system (e.g. creating review forms and notifying reviewers via email).<br />
<br />
Workflows are created through the Global Settings tab and can be associated with any entity within the system, such as UTA objects, folders, organizations or users.<br />
<br />
Workflows are constructed using two basic elements:<br />
<br />
* Tasks: define the actions required in the workflow – each task represents a single step in the process. Specific roles or specific users are associated with each task, and these people will be automatically alerted when they need to perform the action defined by that task. These actions are generally used to accept, reject, or request a revision on the associated object, file, user or some application-specific information.<br />
* Connectors: link tasks together, and provide for branching logic based on the user responses to the task or pre-set conditions.<br />
<br />
<br />
=Configuration – Essentials=<br />
==Create Workflow==<br />
First create and configure the workflow.<br />
<br />
Next add tasks and connectors.<br />
<br />
The tasks available are dependent on the Workflow Type, so specify the desired type before adding tasks.<br />
<br />
1. Click the Menu Icon and under the System Processes , click the Workflows link.<br />
<br />
2. The Workflows page is displayed. This includes the following tabs:<br />
<br />
3. Workflows – click this tab to see list of workflows. The list includes the name, description, workflow type, Trigger, System Call Identifier and date last updated. In the top right of the action bar is a Category drop down. The list of workflows displayed under the Workflows tab is dependent on the Workflow Category selected. Use the "All Workflows" option to see all workflows.<br />
<br />
* Tasks – click this tab to see a list of tasks for all workflows.<br />
* Outstanding Tasks – click this tab to see a list of outstanding tasks for all workflows. This is where the workflow in question has been triggered, and the task has been scheduled for future completion date<br />
<br />
[[Image:workflow2017_1.png|900px|border]]<br />
<br />
<br />
4. Click the New Workflow button to see the New Workflow page.<br />
<br />
[[Image:workflow2017_2.png|900px|border]]<br />
<br />
<br />
5. Populate the Name field with a suitable a descriptive name for the workflow, and the Description field with a suitable narrative description for the workflow.<br />
<br />
6. you attempt to connect the workflow to the object.<br />
<br />
The table below shows a list of available Workflow Types, the objects that each type is enabled on, and the Trigger When options as well as the Termination Trigger options.<br />
<br />
{| class="wikitable"<br />
|-<br />
!|Workflow Type<br />
!|Enabled On<br />
!|Trigger<br />
!|Termination<br />
|-<br />
||[[Recurring Workflow|Recurring]]<br />
||N/A<br />
||'''Activate''' button on Workflow<br />
||'''Deactivate''' button on Workflow<br />
|-<br />
||Company<br />
||Company or Branch<br />
||New or Modified company or Branch<br />
||N/A<br />
|-<br />
||User<br />
||Company or Branch<br />
||New or Modified user or contact<br />
||N/A<br />
|-<br />
||File<br />
||SmartFolder<br />
||New or Modified file in [[SmartFolder]]<br />
||N/A<br />
|-<br />
||Applicant Tracking<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Applicant Assignment<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Content Management<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Document Library<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Email Broadcast<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Costing<br />
||Job in Job Tracking or Applicant Tracking<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Tracking<br />
||Job in Job Tracking or Applicant Tracking<br />
||Job Status<br />
||Job Status<br />
|-<br />
||[[Sales Tracking]]<br />
||Opportunity<br />
||Opportunity Status<br />
||Opportunity Status<br />
|-<br />
||Smart Folders<br />
||N/A<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||[[Web Forms]]<br />
||Web Form<br />
||New or Modified Web Form<br />
||N/A<br />
|-<br />
| rowspan="2"|[[Universal Tracking Application]]<br /><span style="font-size: xx-small;">''Select the name of the relevant UTA''</span><br />
||UTA Template<br />
||Level 1 Status<br />
||Level 1 Status<br />
|-<br />
||[[Custom Field Type: Link – Single File|Single File]] or [[Custom Field Type: Link – Multiple Files|Multiple Files]] Custom Field<br /> <span style="font-size: xx-small;">''Note: Can be at any level within the selected [[UTA]]''</span><br />
||File upload<br /><span style="font-size: xx-small;">''Note: Within the workflow set '''Trigger When''' to ''' --Deactivate--'''''</span><br />
||N/A<br />
|-<br />
||Tracking Activities<br />
||UTA Template<br />
||Level 2 Status<br />
||Level 2 Status<br />
|-<br />
||Tracking Activity Assignment<br />
||UTA Template<br />
||Addition of Level 2 Contact<br />
||N/A<br />
|-<br />
||Tracking Sub-Activities<br />
||UTA Template<br />
||Level 3 Status<br />
||Level 3 Status<br />
|-<br />
||[[Transactions]]<br />
||Always available<br />
||Transaction Status<br />
||N/A<br />
|-<br />
||Notes<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||UTA Role Assignment<br />
||UTA Template<br />
||Contact Assignment at Level 1<br /><span style="font-size: xx-small;">(with the [[Role]] specified) </span><br />
||N/A<br />
|-<br />
||UTA Company Assignment<br />
||UTA Template<br />
||Company Assignment at Level 1<br />
||N/A<br />
|}<br />
<br />
7. Set the Trigger When option. This determines when a new instance of the workflow should be started. The options available, are determined by the Workflow Type (see Workflow Types table above). The available options include:.<br />
<br />
* The New option will only trigger when a new object is created.<br />
* The Modified option will trigger the workflow when an existing object is changed.<br />
* The On Demand option will trigger the workflow when called by a System Call or a browser script.<br />
* The Status Change option found on the Company and User Workflow Type, will expose the statuses for the relevant company/user. The workflow will trigger when the company/user status is changed and saved.<br />
* The Trigger When option will expose different options depending on the Workflow Type:<br />
** UTA specific statuses when Workflow Type is UTA specific (e.g. Universal Tracking Application, Tracking Activities, Tracking Sub-Activities). The workflow will trigger when UTA level 1, 2 or 3 is created or updated to the selected status.<br />
** Roles for assigning users or companies to an object when Workflow Type is User / Org assignment specific (e.g. UTA Role Assignment, UTA Company Assignment). The workflow will trigger when user/company is added to the object with the selected role.<br />
<br />
8. Set the Termination Trigger options if appropriate. This option is exposed for certain workflow types, including the UTA specific workflow types (see Workflow Types table above). If the entity changes to the status after the workflow has triggered, any Pending tasks are removed (not executed).<br />
<br />
9. Click the Save button. The workflow is saved and the Workflow ID is now populated. The following options appear in the action bar near the top of the screen:<br />
<br />
* Back/Recently Visited – click this button to return to pages previous accessed.<br />
* Workflows – click this button to return to the workflow list.<br />
* New Task – click this button to create a new workflow task.<br />
* Diagram – click this button to see a diagram view of the workflow.<br />
<br />
10. The following tabs are also now displayed:<br />
<br />
* Task – click this tab to view workflow task and to edit tasks. Tasks are steps within the workflow.<br />
* Pending Queue – click this tab to see a list of outstanding tasks for this workflow, you can delete tasks and reassign tasks to other contacts within the system.<br />
* History - click this tab to see a list of completed tasks for this workflow.<br />
<br />
==Create workflow tasks==<br />
Once you have created the workflow you can add tasks, each task automates and streamlines some action or step in your business processes.<br />
<br />
The process for adding a task to a workflow is as follows:<br />
<br />
1. Navigate to the desired workflow and click on the Tasks tab.<br />
<br />
2. Click the New task button in the action bar.<br />
<br />
3. The Task details are displayed, with a Task Number initially set to 100 and increasing in increments of 100 for each subsequent workflow task.<br />
<br />
[[Image:workflow2017_3.png|1000px|border]]<br />
<br />
<br />
4. Update Task Name then select the Task Type. The task type determines how the task should be processed. The available Task Types include:<br />
<br />
* '''Acknowledgement''' - use to generate a message such as an email to appropriate users.<br />
* '''Request for Approval''' - use to generate action requirements that need an approval. These action requirements display in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Request for Comment''' - use to generate comment requirements. These will be displayed in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Change Status''' - use to change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
* '''Create Consumer/Provider Link''' - use to create Consumer/Provider relationship without custom scripting.<br />
* '''Create New Activity''' - use in Universal Tracking Application workflows, to create Level 2 records.<br />
* '''Update Custom Field Value''' - use to update a custom field to an entered value.<br />
* '''Update Standard Field Value''' - use to update a standard field to an entered value.<br />
* '''Select User for Next Task''' - use to pre-select the user that is responsible for a task that immediately follows this task type. This is necessary for tasks that will trigger at a later date.<br />
* '''User Activation''' - use to activate a contact as a user and send the credentials in order to log in. This is useful for project-type work when you only wish to activate a user as part of a project.<br />
* '''Generate PDF File''' - use for automatic generation of a PDF that will be emailed to the person(s) designated in the workflow step.<br />
* '''People Association''' - use to add either pre-defined, or user selected, contact(s) to the contacts section of a Level 1 record with a given role.<br />
* '''Company Association''' - use to add either pre-defined, or user selected, companies to the Account section of a Level 1 record with a given category.<br />
* '''Activate/Deactivate User''' - use to set the access type of a user or remove access.<br />
* '''Update User Role''' - use to add or remove selected roles from a user.<br />
* '''Update Company Category''' - use to add or remove selected categories from a company.<br />
* '''Web Service - HTTP Request''' - use to send the HTTP Post web service request via a workflow step to retrieve a web service response.<br />
* '''Web Service - SOAP Message''' - use to pass information to a system outside of SmartSimple as a Web Services call.<br />
* '''Web Service - RESTful Request''' - use to consume Restful web service request via a workflow step to get/post a web service response.<br />
* '''Trigger Workflow''' - use to trigger a different workflow against a specified object.<br />
* '''Signority Submission''' - use to trigger Signority signing process.<br />
* '''Retrieve Latitude / Longitude''' - use to retrieve Latitude and Longitude values without need to save the object itself<br />
* '''Translate Field Values''' - use to automatically translate records and field values in the system<br />
<br />
<br />
The Task Types available will vary depending on the Workflow Type selected. The following matrix displays Workflow Task Types availability for Workflow Types.<br />
<br />
The following matrix displays which [[Workflow Task Types]] are available for which [[Workflow Types]].<br />
<br />
scope row Move Object<br />
<br />
{| border="1"<br />
|-<br />
! rowspan="2"|Workflow Task Type Available?<br />
! colspan="17" scope="col"|Workflow Types<br />
|-<br />
! scope="col"|[[Recurring Workflow|Recurring]]<br />
! scope="col"|Company<br />
! scope="col"|User<br />
! scope="col"|File<br />
! scope="col"|Applicant Tracking<br />
! scope="col"|Job Tracking<br />
! scope="col"|Sales Tracking<br />
! scope="col"|Smart Folders<br />
! scope="col"|Web Forms<br />
! scope="col"|Universal Tracking Application<br />
! scope="col"|Tracking Activities<br />
! scope="col"|Tracking Activity Assignment<br />
! scope="col"|Tracking Sub-Activities<br />
! scope="col"|Transactions<br />
! scope="col"|Notes<br />
! scope="col"|UTA Role Assignment<br />
! scope="col"|UTA Company Assignment<br />
|-<br />
! scope="row"|[[Workflow Task Type: Acknowledgement|Acknowledgement]]<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Activate/Deactivate User|Activate/Deactivate User]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Change Status|Change Status]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Create New Activity|Create New Activity]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Generate PDF File|Generate PDF File]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: PDF Merge|PDF Merge]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: People Association|People Association]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Approval|Request for Approval]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Comment|Request for Comment]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Select User for Next Task|Select User for Next Task]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Trigger Workflow|Trigger Workflow]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Custom Field Value|Update Custom Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Standard Field Value|Update Standard Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update User Role|Update User Role]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Company Category|Update Company Category]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: User Activation|User Activation]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - HTTP Request|Web Service - HTTP Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - SOAP Message|Web Service - SOAP Message]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - RESTful Request|Web Service - RESTful Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
<br />
|-<br />
! scope="row"|Retrieve Latitude / Longtitude<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|Translate Field Values<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|}<br />
<br />
5. Set the ''Name'' of the Task as appropriate.<br />
<br />
6. Populate the Description field if required.<br />
<br />
7. Click Save at the bottom of the page.<br />
NOTE: There are a number of other settings specific to the Task Type selected. These are covered in the individual entries specific to each Task Type within the Configuring - Advanced section.<br />
<br />
8. Click on the Back button to return to the Edit Workflow screen.<br />
<br />
[[Image:workflow2017_4.png|1100px|border]]<br />
<br />
9. The Task is listed, but without Connectors, the task will not be executed if the workflow is triggered.<br />
<br />
==Create Workflow Connectors==<br />
All tasks must be connected to other tasks or to the start and complete before they will execute.<br />
<br />
The connectors control when the next steps execute and control what the next steps are (based on defined conditions).<br />
<br />
1. Navigate to the desired workflow and click on the Task tab.<br />
<br />
2. Inside the list of tasks, click the New button in the row preceding the task you wish to connect. In the example below the preceding task may be the Start option, but it could also be a preceding Task.<br />
<br />
3. The New Connector modal window launches with number of options.<br />
<br />
[[Image:workflow201802_6.png|border]]<br />
<br />
<br />
The available options include:<br />
<br />
* '''Name''' - use to enter a descriptive name for the connector<br />
* '''Trigger Type''' - use to select Default or Expired options<br />
* '''Connect To''' - use to select what you want to connect. All tasks within the workflow appear, alongside the Start and Complete options. Also, there will be a list of other workflows in the system.<br />
* '''Trigger Date''' - use to define a trigger date. The connector triggers, when the date matches the selected date.<br />
** '''Trigger Date''' - The date the task is triggers.<br />
** '''Start Date''' - The date in the Start Date field of the record with which the workflow is associated.<br />
** '''End Date''' - The date in the End Date field of the record with which the workflow is associated.<br />
** '''Custom Date Field''' - The date in a selected custom field that stores date values.<br />
* '''Delay(s)''' - user can specify any delays based on the trigger date:<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Hour, then the task will trigger 1 hour after the defined Trigger Date.<br />
** If the value -1 entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours before the defined Trigger Date.<br />
* '''Trigger Time''' – allow relevant when a delay is scheduled with the Day option selected. The drop-downs to allow users to specify what time the task should be trigger.<br />
* '''Business Day Only''' - toggle on to take into account the normal working week, and statutory holidays when determining dates and delays.<br />
* '''Holiday Calendar Used''' - used to select a custom calendar. Holiday calendars can be created and used when you specify which days are Business Days for your community instead of using the predefined Business Days Only option.<br />
* '''Required Respondents''' - use to specify how many people must complete an action before the workflow moves to the next task.<br />
* '''Type Filter''' - lookup to select L1, L2, or L3 types, which will then act as the type condition<br />
* '''Status Filter''' - Lookup to select L1, L2, or L3 statuses, which will then act as the status condition<br />
* '''Condition''' - use to specify a logical condition that must be met before a connector triggers the next workflow task. Multiple connectors can be set up with mutually exclusive conditions to have branching logic on the workflow.<br />
<br />
<br />
4. Complete as appropriate and click Save at the bottom of the screen.<br />
<br />
5. Click the New button in the desired row for the task you wish to connect and connect to a proceeding task, the Complete option or to another workflow entirely. Click Save when finished.<br />
<br />
6. Go back to the General tab and click Save once all connectors have been defined. When the page refreshes then the connectors should be displayed.<br />
<br />
[[Image:workflow2017_7.png|1000px|border]]<br />
<br />
<br />
When you create a Workflow with a delay connector, the recipients of the subsequent task are processed at the time the workflow is triggered and NOT at the time it runs. In other words, the tasks on the workflow, such as generating an email, are processed before the delay, not at the end of the delay.<br />
<br />
If the recipients change between the time the workflow is initiated and the time it fires (based on the delay) the recipients will not be updated. To ensure recipients are evaluated at the time the workflow task fires, insert a blank task after the delay connector (i.e. an Acknowledgement workflow with no recipients), then flow into a new Workflow Task with the desired recipients.<br />
<br />
Example scenario:<br />
<br />
* A workflow is configured to wait 5 days and then mail all contacts attached to the Level 1 with role Reviewer.<br />
* That workflow is triggered against a specific Level 1 record which has three contacts in the contacts section with the role Reviewer.<br />
* After the workflow has been triggered, before the 5 days have gone by, two additional Reviewers are added to the contacts section, and one of the original three is removed.<br />
* If the Acknowledgement task is attached directly after the connector with the delay then the original three contacts will receive the email, even though they are no longer current.<br />
* If there is a blank workflow task following the connector with the delay, which flows into a workflow task configured to email all Level 1 contacts with the role Reviewer, then the four reviewers on the Level 1 record at the time the email is sent, will be emailed, rather than the original three reviewers.<br />
<br />
==Enable on Object==<br />
===Enable Workflow on Company/User===<br />
Workflows must be enabled against an organization before workflows will run against the organization itself, its sub-branches and the users within the organization and its sub-branches.<br />
<br />
If the current User has the Workflows - Attach Workflow to Company System Feature Permission enabled then they will see 2 drop-downs on an organization profile<br />
<br />
* '''Company Workflow''' - which lists all Workflows with a Workflow Type of Company. Only a single company workflow can be selected per Company<br />
* '''User Workflow''' - which lists all Workflows with a Workflow Type of User. Only a single User workflow can be selected per Company<br />
<br />
The way the selected Company workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new Company is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new Company is created, and when an existing Company is modified.<br />
<br />
The way the selected User workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new User or Contact is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new User/Contact is created, and when an existing User/Contact is modified.<br />
<br />
<br />
===Enable Workflow on Company/User Registration Page===<br />
This feature enables a Workflow to trigger on a Company/User registration page.<br />
<br />
An example use would be sending an email to an employee every time a new company registers so that they can verify the information entered for the company.<br />
<br />
Company/User registration Workflows will override other new and modified status-based Workflows. We recommended Workflows triggered from Sign Up pages be On Demand.<br />
<br />
Every sign-up page has an Attach Workflow drop-down menu where users can choose the Workflow they want triggered from the sign up page.<br />
<br />
<br />
<br />
===Enable Status-Driven Workflow on UTA===<br />
Status-driven workflows can be triggered from all levels of a UTA if Workflows have been enabled on the types . To enable workflows for a type do the following:<br />
<br />
1. In your desired UTA, click configuration Settings. Click on the level 1 tab, Click on Types. A list of types is displayed.<br />
<br />
2. Click the Edit button on the desired Type The template details are displayed.<br />
<br />
[[Image:workflow2017_8.png|500px|border]]<br />
<br />
<br />
3. To enable workflows for the Level 1 items, select Yes in the first workflow combo box.<br />
<br />
4. To enable workflows for the Level 2 and 3 activities, select Yes in the second workflow combo box.<br />
<br />
5. Click Save.<br />
<br />
Note: upon creation of new Templates, the Workflow combo boxes default to "Yes." Change these values to "No" in the case that you would like to disable workflows for this template at Level 1 and/or Level 2 and 3.<br />
<br />
<br />
<br />
===Enable Workflow on UTA Type===<br />
Level 1/2/3 Types can be configured to trigger a unique workflow whenever a new item using this template type is added.<br />
<br />
Go to configuration settings, choose the desired tab (level 1/2/3) click the types link, edit the desired type and click on the Template Page tab.<br />
<br />
In the Workflow drop-down, select the appropriate workflow and then click Save.<br />
<br />
<br />
<br />
===Enable UTA Role / Company Assignment Workflow on UTA===<br />
If you wish to trigger a UTA Role Assignment Workflow or a UTA Company Assignment Workflow from a UTA level one record then you must have configured the [[Types|Level 1 Type]] settings.<br />
<br />
Each Level One Type page has the following 2 options:<br />
<br />
* '''UTA Role Assignment Workflow''' - use to define one or more UTA Role Assignment Workflows that are triggered by this type .<br />
* '''UTA Company Assignment Workflow''' - use to define one or more UTA Company Assignment Workflows that are triggered by this type.<br />
<br />
<br />
===Enable Workflow on File Upload field===<br />
To trigger a workflow when a file is uploaded to a Link - Single File or Link - Multiple Files Custom Field scroll down to the File Options section. For Workflow on Upload select the desired workflow and save .<br />
<br />
If the file upload Custom Field is located at Level 2 or Level 3, you can select Tracking Activities or Tracking Sub-Activities Workflow Types.<br />
<br />
If the file Custom Field is located on a Company or User you can select Company or User Workflow Types.<br />
NOTE: The Workflow is only triggered when I file is uploaded, it is not triggered by file deletions.<br />
<br />
<br />
<br />
===Enable Workflow on SmartFolder===<br />
To trigger a workflow when a file is uploaded into a SmartFolder navigate to the desired SmartFolder.<br />
<br />
Click the Folder Settings button (looks like a gear).<br />
<br />
For Workflows select the desired work flow (all workflows of the Type File will be displayed) and click save.<br />
<br />
=Configuration – Advanced=<br />
==Suppress Workflow Window==<br />
When a workflow step is executed the user is generally presented with a Workflow window where they can select a value that will be used to determine the next task to be performed.<br />
<br />
This feature is vital for workflows that require user interventions, but is not required for workflows that are used to simply send an instant message or email message to one or more users.<br />
<br />
If the User has a pop-up stopper/blocker enabled within their browser, the Workflow Window will be suppressed and the Workflow will not trigger. You must ensure that users of workflows that prompt their<br />
<br />
Workflow Window, have enabled pop-up window display for your instance of SmartSimple.<br />
<br />
If you wish to suppress the display of this window you can change the workflow settings as follows:<br />
<br />
1. Go to the menu icon and under System Process click Workflows.<br />
<br />
2. Click the edit button on the desired Workflow.<br />
<br />
3. For Workflow Window enable the Suppress option.<br />
<br />
4. Click Save.<br />
NOTE: If you do not require a user interventions in your workflows it is recommended that the Workflow window be suppressed to ensure workflows execute as you may have little control over user browser settings.<br />
<br />
<br />
<br />
==Recurring Workflow==<br />
A recurring workflow is a Workflow that is not triggered against any particular object.<br />
<br />
A recurring workflows ability to use variables is limited, but recurring workflows are useful for tasks that recur at regular intervals, such as a weekly reminder e-mail.<br />
<br />
When using a recurring workflow, the tasks must be connected in a loop, and there must be at least one connector with a delay. Otherwise, the workflow would endlessly loop.<br />
<br />
If the workflow is set to look endlessly (without a delay), the system will automatically stop processing any workflows configured this way, after five loops.<br />
<br />
Once you have configured the Workflow, the Activate button can be used to start the workflow. Once activated, a Deactivate button will be visible that can be used to stop the workflow.<br />
<br />
If you wish to have a recurring workflow send an e-mail on a particular day or days of the month, you can use the following conditions:<br />
<br />
* date_format(now(),"%d")="01" - Will be true only on the 1st of the month<br />
* date_format(now(),"%d") in ("01","15") - Will be true on the 1st and 15th of the month.<br />
<br />
You will need to configure an empty task (i.e. an Acknowledgement with no recipients) to manage the branching based on the date, and an empty task to manage the one-day delay so the workflow will loop daily and connect to the task that sends the e-mail on the appropriate day(s).<br />
<br />
[[Image:workflow2017_9.png|1000px|border]]<br />
<br />
<br />
The Workflow Connectors attached to the "Empty Task for Branching" should have the following Conditions:<br />
<br />
[[Image:workflow2017_10.png|1000px|border]]<br />
<br />
<br />
<br />
==Task Type specific configuration==<br />
Each available task type represents a different type of action and has different configurations needs as a result.<br />
<br />
This section discusses the specific configuration needs for the different tasks types<br />
<br />
<br />
<br />
===Task Type: Acknowledgement===<br />
Acknowledgements use this Task to send messages to users in SmartSimple.<br />
<br />
Acknowledgement Tasks have the following settings:<br />
<br />
* '''Name''' - name for the task.<br />
* '''Task Type''' - manually set to Acknowledgment<br />
* '''Task Number''' - a system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location, but order or execution of tasks is determined by the Connectors.<br />
* '''Description''' - optional description of the task.<br />
* '''Expire After''' - intended duration of the workflow.<br />
{{Template:WorkflowMessageTemplate}}<br />
* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables.<br />
* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients. Only appears if workflow is UTA specific.<br />
* '''Routing: Role''' - Used to select recipients by role. This list includes all roles configured in the system, alongside the built-in roles that can be used in a workflow:<br />
*** The Originator role is used to reference the name of the person that started the workflow. This could be the person that submitted an expense claim, added a file to a workflow or added a new employee. :*The Initiator role is used to reference the name of the person that initiated the current task in the workflow. This refers to the person that approved the current step of an expense claim, or reviewed a document loaded into a workflow enabled Smart Folder.<br />
*** The Owner role is used to reference the user assigned as the Owner of the record.<br />
*** The People role is used to reference the user assigned as the Person on the level one. This role is only available to Level One specific tasks.<br />
*** The Assigned Users role is used to send messaging to users who are in the Assigned field of a Level Two activity. This role is only available for Level Two workflows.<br />
Once the role has been selected the following recipient choices are available:<br />
<br />
* <br />
*::* Let the current user select target user from this role – When the workflow is triggered, the user will be prompted to select recipients from the list of users currently in the role.<br />
*::* All Users of this role – The message will be sent to all users in the selected role.<br />
*::* Selectable list of users currently in the role – The message is sent to the specific users that are selected.<br />
* '''Routing: Selected Users''' - details of the users configured as Recipients in the Role section<br />
* '''Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
===Task Type: Activate/Deactivate User===<br />
This type of Workflow task is used to set the access type for a user or to deactivate a user.<br />
<br />
No message accompanies this workflow task. If you wish to notify users of a change in access type, for example to notify activated users of their password, you can configure an Acknowledgement type workflow task to follow this step in the workflow.<br />
<br />
Activate/Deactivate User Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Activate / Deactivate User.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - Sets the access type for the user against which the workflow is triggered. Options are:<br />
* '''Activate (Administrative or Portal Interface)''' - Provides access to the system to the extent permitted through the user's membership of specific roles.<br />
* '''Activate (User Centric or Applicant Interface)''' – Only provides access through the User Centric Interface and Applicant Tracking “career sites”.<br />
* '''Activate (Web Service Client Access)''' - Account type used to access data in a SmartSimple instance via an API (Application Programming Interface). Does not give access to SmartSimple interface directly.<br />
* '''Deactivate (No Access)''' – User cannot log into the system.<br />
<br />
===Task Type: Change Status===<br />
Change Status Workflow Task Types change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
<br />
Change Status Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Change Status<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Change Status To''' - lists statuses from the selected UTA level. This workflow task will change the status of the object that triggered the workflow to the selected status.<br />
<br />
===Task Type: Company Association===<br />
You can use the Company Association Workflow Task Type to automatically add, remove or update one or more companies to a Level 1 record. They will be assigned to the record with the UTA category defined in the "Roles will be assigned" setting.<br />
<br />
Company Association Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Company Association<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Variables for companies''' - Allows user to use syntax to reference the company IDs<br />
* '''Action''' - Add, update or delete the company association<br />
* '''Companies''' - use Lookup to select the Companies that will be added.<br />
* '''Roles will be Assigned''' - select the categories that you want the companies to be assigned with. To assign different companies with different categories, you will have to create more than one Company Association task.<br />
<br />
===Task Type: Create Consumer/Provider Link===<br />
Consumer/Provider Link Workflow Task Type creates Consumer/Provider relationships, and is only available to Level 1 and Level 2 workflows.<br />
<br />
Consumer/Provider Tasks have the following settings, all of which control how the target record is linked to the record triggering the workflow:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Connection Type''' - Select whether the link will be a Consumer or Provider<br />
* '''Connection Application''' - Select the UTA being connected<br />
* '''Connection Level''' - Choose the connection level (Level One or Level Two)<br />
* '''Object ID / Variable''' - Enter the Record ID (or a variable to obtain the Record ID of the object to connect to). It accepts semicolon separated lists.<br />
* '''Connection Role''' - Select the Consumer UTA Connection role to be used for the connection<br />
<br />
===Task Type: Create New Activity===<br />
You can use the Create New Activity Workflow Task Type to automatically create and attach one or more Level 2 records to a Level 1 record. This workflow can be driven by a Status change on the Level 1 record. The workflow will also trigger (in this sequence):<br />
<br />
1. Auto-assignments<br />
<br />
2. Level 2 Formulas<br />
<br />
3. Level 2 Workflows<br />
<br />
<br />
New Activity Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create New Activity<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional)<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Activity Scheduling Options''' - drop-down with 3 options (Disable, Schedule by Date and Amount, Schedule by Number of Activities) that can be used to create multiple instances of the Activity.<br />
<br />
: If '''Schedule by Date and Amount''' option is selected then following settings are exposed.<br />
::* '''Start Date''': Level 1 field used to set the start date of the activity scheduling period<br />
::* '''End Date''': Level 1 field used to set the end date of the activity scheduling period<br />
::* '''Schedule Every''': frequency of scheduling<br />
::* '''Total Amount''': Level 1 field used for the Total Amount to be distributed. The amount specified will be split evenly between each Level 2. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Date''': Level 2 field used to set the date to be assigned to each record based on the scheduling options."<br />
::* '''Activity Amount''': Level 2 field used to store the calculated amount for each record. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
: If '''Schedule by Number of Activities''' option is selected then following settings are exposed.<br />
::* '''Number of Activities''': Level 1 field used to set the number of activities to be created<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
'''Days Delay''' - Number in days of delay before creation of new activity. If left blank, the new activity will be created immediately.<br />
::* '''Create for Users in UTA Role''' - select the UTA Role of the users that the Peer Activity should be created against.<br />
::* '''Activity Type''' - This is where you specify which Level 2 Type you wish to create. If you select the Custom Field option then a Custom Field ID field is exposed.<br />
::* '''Custom Field ID''' - The Create New Activity workflow can be driven by a Custom Field. For example, you could have check boxes at Level 1 corresponding to various Level 2 Types. Selecting each check box would create and attach the relevant Level 2 activity type. You must first create a Custom Field on the Level 1 record which stores the typeid(s) of the Level 2 Types to be created. To create multiple Level 2 records use one of the Select many field types (e.g. Select Many – Check Boxes, Select Many – Scrolling Check Box, Select Many – List Box) and to create a single Level 2 record use the Select One – Combo Box.<br />
::* '''Activity Status''' - Allows you to define the Status for the newly created Level 2 record(s). Note: If that Level 2 Status has a workflow attached to it the workflow will be triggered at the point of creation of the Level 2 record.<br />
::* '''Reminder Type''' - You can select whether a Quick Message or reminder email will be sent out to the Owner or contacts attached to the record, or any combination of the above.<br />
::* '''Reminder Days''' - Sets delay for reminder message being sent.<br />
<br />
: <br />
===Task Type: Generate PDF File===<br />
Auto generation of a PDF that can be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field.<br />
The PDF generated must be based upon a Web Page View Custom Field. You must specify the Custom Field ID of the Web Page View to be converted in the Web Page Field ID field on the Workflow Task settings.<br />
<br />
: <br />
Multiple PDFs can be created and stored in a single Link - Multiple Files custom field using this workflow task type, by entering the Custom Field IDs of the Web Page View fields, separated by commas.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Web Page Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: PDF Merge===<br />
Will convert [[Custom Field Type: Special – MS Word Merge|Word Merge]] document to a PDF which can then be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field<br />
<br />
: <br />
The PDF generated must be based upon a [[Custom Field Type: Special – MS Word Merge|Word Merge]] Custom Field. You must specify the Custom Field ID of the MS Word Merge document to be converted in the MSWord Merge Field ID field on the Workflow Task settings.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''MSWord Merge Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: People Association===<br />
You can use the People Association Workflow Task Type to automatically add one or more contacts to a Level 1 record. They will be assigned to the record with the UTA role defined in the "Roles will be assigned" setting.<br />
<br />
People Association have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to People Association<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Action''': Add, update or delete the people association<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. This is discussed in greater detail in the Configuration – Advanced section.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to control role of user that will be associated.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to be associated<br />
::* '''Roles will be Assigned''' - select the role(s) that you want the contact(s) to be associated with. To assign different contacts with different roles, you will have to create more than one People Association task.<br />
In the Routing section select a Role currently possessed by the contact(s) you wish to add, whether this is a system role or a UTA role. You can then either select specific contacts or groups that will always be added to the Level 1 when the workflow is triggered, or you can choose Let current user select target user from this role to allow the person that triggers the workflow to select a contact to be added.<br />
Note:<br />
::** If you are allowing the current user to select target user Suppress Workflow Window must be off (not enabled) otherwise the workflow will not fire.<br />
::** If you are allowing the current user to select target user, the Workflow must be triggered by a status, and not by a script.<br />
::** Include a description, as the description will be presented to the user when they are asked to select the contact to be assigned.<br />
In order to notify the contact(s) that they have been assigned you can create a subsequent Acknowledgement Workflow Task to e-mail all contacts with the UTA role you selected.<br />
<br />
===Task Type: Request for Approval / Request for Comment===<br />
Both of these Workflow Task Types prompt users to review the work of others, and keep track of outstanding reviews on the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] page.<br />
<br />
The settings for both of these Workflow Task Types match those used for the Acknowledgment task except for 2 additional settings:<br />
<br />
:* '''Respondents''' - Indicates the number of respondents required for this approval.<br />
:* '''Allow Edit''' - Allows editing of the attached object.<br />
By default, a Request for Approval or Comment workflow task will move on to the next task (whether approved, rejected, etc.) as soon as the first recipient of the Workflow Task responds. The Respondents field allows a specific number of respondents to be required, which will keep the Request for Comment Task active until that number of respondents has replied.<br />
The Routing options field is used as part of the Request for Approval process. Users should enter appropriate options within the Routing Options section(Example: 10=approved;20=reject;30=Revise) and click Save.<br />
<br />
These Routing Options will then be available in the Trigger Type drop-down when configuring Connectors. It is suggested that each routing option should have a corresponding task so that the routing option can then be connected to an appropriate task.<br />
<br />
You must set the minimum number of respondents on the connector associated with each of the approval options.<br />
<br />
::* If you have selected three respondents on the Request for Approval Task, and the task should only pass if all three respondents click approve you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be one.<br />
::* If you have selected four respondents on the Request for Approval Task, and the task should only pass if three respondents click "Approve," you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be two.<br />
The system checks the connectors once the number of respondents on the task has been met, this behaviour is not configurable. The first connector the system checks will be taken if the requirements are met.<br />
You must ensure the Workflow Task is sent to enough people to meet the minimum number of respondents required, if you do not send the task to enough recipients the task would never complete.<br />
<br />
===Task Type: Select User for Next Task===<br />
This task type used to allow the current user to pre-select the user that is responsible for the task that immediately follows this task type.<br />
<br />
This is necessary for tasks that will trigger at a later date.<br />
<br />
For example, consider a Workflow that is triggered on the status of Escalated which is configured to send a reminder e-mail to a manager if the status has not changed for seven days. If the reminder e-mail workflow task has Let current user select target user from this role as the recipient the Workflow would fail. This is because the e-mail is triggered (seven days later) by the system, and there is no current user.<br />
<br />
The settings for this Workflow Task Types match those used for the Acknowledgment task. The only difference if that the Request with the Routing options.<br />
<br />
<br />
<br />
===Task Type: Signority Submission===<br />
You can use the Signority Submission Workflow Task Type to automatically trigger the Signority signing process via workflow.<br />
<br />
Signority Submission Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Signority Field''' - drop-down which lists all Signority enabled WPV fields for the entity the workflow is configured against.<br />
<br />
===Task Type: Trigger Workflow===<br />
You can use the Trigger Workflow tasks to trigger a different workflow.<br />
<br />
Trigger Workflow Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Trigger Workflow''' - Select the workflow that should be triggered from this dropdown menu.<br />
:* '''Record id / Variable''' - this setting should contain the unique record ID for the record against which the selected workflow should be triggered. This record ID can be referenced using variables.<br />
:*** Examples: If the workflow to be triggered is a User type workflow, you would need to provide a User ID for the contact record against which you would want the workflow to be triggered.<br />
:*** If the workflow is to be triggered against a series of Level 2s attached to a Level 1 record, you could use List Syntax to define a list of activities meeting certain criteria against which the workflow should be triggered.<br />
<br />
===Task Type: Update Company Category===<br />
Update User Role Workflow Task Types can add or remove categories from SmartSimple organizations.<br />
<br />
This task type is only available for "Company" workflows.<br />
<br />
Update Company Category Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove categories from the organization upon which the workflow is triggered.<br />
* '''Categories''' - select the categories that should be added or removed from the organization's profile.<br />
<br />
===Task Type: Update Custom Field Value===<br />
The Update Custom Field Value workflow task type can be used to write values to custom fields on the object against which the Workflow is triggered.<br />
<br />
These values can be hard-coded or they can use variables.<br />
<br />
You can also use MySQL syntax to manipulate values using sscalculation.<br />
<br />
Update Custom Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists custom fields across all UTAs from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
Note: If the field to be updated has the Read Only toggle enabled in the Formatting section of the field options (or a "read-only" HTML tag or "textreadonly" CSS class) the value will not update.<br />
* '''Update To Value''' - This workflow task will use this value to update the field selected in the "Use Field" setting. Variables can be used in the "Update To Value" setting as well as hard-coded values.<br />
<br />
===Task Type: Update Standard Field Value===<br />
The Update Standard Field Value workflow type can be used to write values to standard fields on the object against which the Workflow is triggered.<br />
<br />
Standard fields on the level 1, level 2, level 3, companies, contact and transaction can be updated using this method:<br />
<br />
Update Standard Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists standard fields from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
* '''Update To Value''' - accepts hard-coded values and variables. This workflow task will use this value to update the field selected in the "Use Field" setting.<br />
Note: Some standard fields (such as Type) require the ID, not the type name in order to update correctly.<br />
<br />
===Task Type: Update User Role===<br />
Update User Role Workflow Task Types can add or remove roles from SmartSimple contacts.<br />
<br />
This task type is only available for "User" workflows.<br />
<br />
Update User Role Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove roles from the contact upon which the workflow is triggered.<br />
* '''Roles''' - select the roles that should be added or removed from the contact's profile.<br />
<br />
===Task Type: Web Service - HTTP Request===<br />
This workflow task type is used to consume a [[APIs|web service]] via a workflow step. The web service will send the HTTP Post request to retrieve information. The response returned by the web service can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:HTTPPost.PNG|500px]]<br />
<br />
HTTP Post have the following settings:<br />
<br />
:* '''URL''' - endpoint of the HTTP Post web service<br />
:* '''User Name''' - username to access post location if needed<br />
:* '''Password''' - password to access post location if needed<br />
:* '''Parameters''' - free text field to pass in parameters such as apitoken , alias id, etc. Can include username and password if not specified in the specific fields<br />
:* '''Response Stores To''' - field on system where response from HTTP post can be stored<br />
<br />
===Task Type: Web Service – SOAP Message===<br />
The Web Service - SOAP Message Workflow Task allows you to post data to another system, outside of SmartSimple. The response returned by the external system can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:SOAP.png]]<br />
<br />
This Task type has the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Message Template: Action''' - The action to called by the Web Service call (These actions are defined by the external server, and are not part of SmartSimple)<br />
* '''Message Template: Custom Field ID for Response''' - The Custom Field ID of an XML custom field on the object that the Workflow was triggered against that the response returned by the external server.<br />
* '''Message Template: Email Message Header''' - The email header can be modified using the following syntax, with the arguments separated by semicolon:<br />
** X-Priority={1,2,3,4,5}<br />
** Priority={normal,urgent,non-urgent}<br />
** Importance={high,normal,low}<br />
** Sensitivity={personal,private,company,confidential}<br />
*: e.g. Priority=urgent;Importance=high<br />
** '''Message Template: Endpoint''' - The URL or IP address of the destination server<br />
** '''Message Template: Envelope Template''' - The content of the Web Service message to be sent to the external service. This can contain variables related to the object the workflow is triggered against.<br />
** '''Message Template: Attach Object''' - Attaches the details of the object to the message. In the case of a SmartSimple object, such as a company, person, or application, the textual details of the object will be added. If the object is a file, then the file will be attached to an e-mail message, but not an instant message.<br />
** '''Message Template: Attachment File IDs''' - Attach additional default files when triggered from a Smart Folder. See the Determining the File ID article for instructions.<br />
** '''Message Template: Save as Event''' - Email will be saved as an event.<br />
If the content from the custom fields being included within the SOAP message contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server.<br />
<br />
The less than symbol (<) and ampersand (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving system understands that they are data content and not part of the XML structure:<br />
<br />
:: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
For example, an address could contain ampersands, so it should be wrapped as follows:<br />
<br />
<pre>@firstname@@lastname@</pre><address> </address><br />
<br />
If the response to your Web Service call contains values that you wish to store within a Custom Field on the object against which the Workflow was triggered, you can connect a Update Custom Field Value Workflow Task to be the task following the Web Service - SOAP Message and use the variable syntax to pull the value from the XML Custom Field you selected to store the response to the Web Service call.<br />
<br />
For example, if the [[Custom Field Type: Special - XML Data|XML]] Custom Field that stores the response (custom field ID 155255 in the image above) is called '''Web Service Response''', the variable in the [[Update Custom Field Value]] task to pull a node called '''AssignedIdentifier''' could be:<br />
<br />
@xml.Web Service Response.soap:Body.AssignedIdentifier.nodevalue@<br />
<br />
If the response should be saved to a [[System Variable]], the syntax would be:<br />
<br />
@system.xml.''fieldname''.''nodename''.nodevalue@<br />
<br />
===Task Type: Web Service - RESTful Request===<br />
This workflow task type is used to consume a RESTful web service using GET or POST method.<br />
<br />
====RESTful Web Service Request using GET Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_GET.PNG|500px]]<br />
<br />
GET RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - resource of the web service<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====RESTful Web Service Request using POST Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_POST.PNG|500px]]<br />
<br />
POST RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - endpoint of the web service<br />
:* '''Request Body''' - data sent with the request.<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====Credentials of the RESTful Web Service Request====<br />
<!--89397 - Workflow Task Type: Web Service - RESTful Request --><br />
Credentials of the web service can be added in the Request Header in the format: Authorization=Basic [base64 encoded credentials].<br/><br />
A third party software can be used to convert the username/password to a base64 encoded credentials.<br/><br />
Note that all equal signs within the base64 credentials should be replaced with %3D.<br/><br />
Example:<br/><br />
FROM: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''='''</span><br/><br />
TO: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''%3D'''</span><br />
====Parsing JSON response====<br />
<!--67458 - Add GET/POST REST services workflow tasks that are compatible with JSON--><br />
Variable syntax is available to parse and retrieve values from JSON format data.<br/><br />
''Sample 1''<br />
<pre>FIELD_NAME: {"firstname":"John"}<br />
variable syntax: @json.FIELD_NAME.firstname@ <br />
result: John<br />
</pre><br />
''Sample 2''<br />
<br />
<pre>FIELD_NAME: {"primarycontact":{"firstname":"Thomas"}}<br />
variable syntax: @json.FIELD_NAME.primarycontact.firstname@ <br />
result: Thomas<br />
</pre><br />
''Sample 3''<br />
<br />
<pre>FIELD_NAME: {"users":[{"firstname":"Marie"},{"firstname":"Eve"}]}<br />
variable syntax: @json.FIELD_NAME.users.[# ~firstname~, #]@<br />
result: Marie, Eve<br />
</pre><br />
<br />
===Task Type: Translate Field Value===<br />
The Translate Field Value Workflow Task allows you to perform automatic translation of records and field values in the system. It will only apply to those custom fields that have [[Enable_Translation_Service|enabled translation services]].<br />
<br />
This Task type has the following settings:<br />
<br />
** '''Name''' - Narrative name for the task.<br />
** '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
** '''Description''' - Detailed description of the task (optional).<br />
** '''Translate to''' - set which language or languages to translate to for the custom fields that have enabled translation<br />
If a record has translation enabled and a stored field translation exist, there will be a "Show Translation Values" in the Options menu<br />
<br />
When shown, the translated field values will appear directly underneath the existing field value.<br />
<br />
If more than one translated language exist, there will be a language drop down appearing at the top of the record.<br />
<br />
==Importing and Exporting Workflow Tasks==<br />
Workflow Tasks can be exported and imported into other Workflows using the Import/Export function on the Edit Workflow page. This feature is particularly useful if you have created workflows for testing on your backup instance and wish to implement the finalized reports in your live system.<br />
<br />
The steps to export a workflow task or set of workflow tasks are as follows:<br />
<br />
[[Image:ExportWorkflow2017.png|1000px|border]]<br />
<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab and select the checkbox next to the workflow task(s) that you wish to export.<br />
<br />
2. Click on the Export button.<br />
<br />
3. A pop-up window will appear, containing the details of the tasks you have selected in XML format. Select all of the text in the pop-up window and save it to a text editing program, such as Notepad.<br />
<br />
Note that, if multiple tasks are selected, they will be delimited in the XML text block with the tag.<br />
<br />
<br />
The steps to '''import''' a workflow task or set of workflow tasks are as follows:<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab, then click on the Import button.<br />
<br />
2. A blank pop-up window will appear. Paste the XML data that you have exported into this window.<br />
<br />
3. Confirm your selection by clicking on the Import button at the bottom of the pop-up window.<br />
<br />
* The workflow tasks will be imported into the new workflow.<br />
* The Edit Workflow page will refresh to show the newly-added workflow tasks.<br />
<br />
==Workflow Condition==<br />
A logical statement can be added to workflow connectors in the Condition field, enabling you to specify which workflow task will be triggered.<br />
<br />
Example Branching Logic can be implemented to send an approval message to Senior Management when the request is over $100,000, while requests under $100,000 will take a different path when the workflow is triggered.<br />
<br />
<br />
[[Image:workflow2017_13.png|600px|border]]<br />
<br />
<br />
In general the Workflow Condition is used with several different connectors attached to a task. Collectively the conditions on each task should accommodate every possibility.<br />
<br />
Note: because the sequence in which the system accesses each connector is not configurable it is important that the conditions are mutually exclusive. For example, if you have 3 connectors for different paths based on a particular value the conditions could be:<br />
<br />
* "@Selection@"="Yes"<br />
* "@Selection@"="No"<br />
* "@Selection@"!="Yes" and "@Selection@"!="No"<br />
* The last statement could also be represented as "@Selection@" not in ("Yes","No")<br />
You can also use MySQL syntax to perform calculations within the Condition:<br />
* date_format(now(),"%d")="01"<br />
<br />
<br />
This condition will be true only on the 1st of the month. This could be used with a Recurring Workflow that loops daily if you wish to send out a summary e-mail on the 1st of every month.<br />
<br />
It is recommended that workflows with a loop include an empty task with 2 connectors with 2 separate conditions, one which goes back to the looped task and another which proceeds on to the next task, thus preventing an endless loop.<br />
<br />
Note: Other than values that are always numeric, all variables should be enclosed in double quotes.<br />
<br />
<br />
<br />
===Workflow Condition Examples===<br />
There are two rules that must be followed when adding multiple connectors to a workflow task that incorporate conditional logic statements:<br />
<br />
'''1. Collectively, the conditions on each task must accommodate every possible permutation'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three level one [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@levelone.typeid@"="12345"'' and<br />
* ''"@levelone.typeid@"="45678"'', respectively<br />
<br />
If the workflow is fired against a record associated with typeID 67890, the workflow will never progress to the next task.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
Three [[Level 2 Types|Level_2_Types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Three connectors are set up on a workflow task with conditions of:<br />
<br />
<br />
<br />
* ''"@@level2.typeid@"="12345"'',<br />
* ''"@@level2.typeid@"="45678"'' and<br />
* ''"@@level2.typeid@"="67890"'', respectively<br />
<br />
<br />
Alternatively, connectors with the following conditions could be set up:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"''<br />
* ''"@typeid@"!="12345"'' (not equal to "12345"), and<br />
* ''"@typeid@" NOT IN ("12345","45678")'', respectively<br />
<br />
<br />
'''2. Each condition must be mutually exclusive from every other'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two [[status]]es exist in the same application, with [[Determining the statusid|statusIDs]] of 888 and 999.<br />
<br />
The system administrator wishes to send emails via workflow if the record is in one of the above statuses. One email should be sent out if the type is 12345 or 45678 and a different email should be sent out if a different type has been used.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@statusid@" in ("888","999")''<br />
<br />
<br />
The issue here is that both statements [[Boolean Operators|evaluate]] as '''true''' if the statuses on the record triggering the workflow have a statusID of 888 or 999.<br />
<br />
The workflow process will not "know" which task to connect to. The workflow will progress, but not necessarily to the next intended workflow task. In other words, the wrong email may be sent.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
The types and statuses exist as above, and the system administrator wishes to configure the same branching logic.<br />
<br />
Two connectors should be set up on a workflow task with the following conditions:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@typeid@" not in ("12345","45678") AND "@statusid@" in ("888","999")''<br />
<br />
<br />
This configuration satisfies Rule #2, in that the conditions are now mutually exclusive. However, a third connector must be included, with the following condition, which connects to the "Complete" task, in order to satisfy Rule #1 above:<br />
<br />
* ''"@statusid@" not in ("888","999")''<br />
<br />
<br />
With these three connectors configured, the workflow will:<br />
<br />
* never not have instructions on ''whether'' to trigger the next workflow task (Rule #1), and<br />
* always have clear instructions on ''which'' task to trigger given a certain set of conditions (Rule #2).<br />
<br />
==Using iCalendar to generate Meeting Requests, Tasks and Contact cards==<br />
iCalendar is a file format that allows Internet users to send meeting requests, contacts and tasks through email and other digital methods.<br />
<br />
SmartSimple workflows support 3 email attachments types (ievent, itodo and icard).<br />
<br />
The SmartSimple email engine will look for email contents that have ievent, itodo, and icard objects. The contents of these objects are assembled and added as email attachments.<br />
<br />
The email engine will process iCalendar objects using the following syntax:<br />
<br />
* "@@ievent"<br />
* "@@itodo"<br />
* "@@icard"<br />
<br />
Simple sample iCalendar objects are shown below<br />
<br />
<br />
<br />
===ievent Object===<br />
Manifests as an ical attachment on the email.<br />
<br />
<pre><br />
<!--@ssattach(icalendar,vevent)--><br />
@@ievent<br />
UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DTSTART:TO_UTC(@startdate@ @starttime@)<br />
DTEND:TO_UTC(@enddate@ @endtime@)<br />
LOCATION:Room 1<br />
SUMMARY: Details to follow<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
instead of UTC you can specify the Time Zone for the DTSTART and DTEND as:<br />
<br />
<pre>DTSTART;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullstartdate@","%Y%m%dT%H%i%s"))--><br />
DTEND;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullenddate@","%Y%m%dT%H%i%s"))--><br />
</pre><br />
<br />
===itodo Object===<br />
<pre><br />
<!--@ssattach(icalendar,vtodo)--><br />
@@itodo<br />UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DUE:TO_UTC(@startdate@)<br />
STATUS:NEEDS-ACTIONLOCATION:Room 1<br />
SUMMARY: Meeting<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
<br />
===icard Object===<br />
<pre><br />
<!--@ssattach(icalendar,vcard)--><br />
@@icard<br />FN:@owner.fullname@<br />
ORG:@company@<br />TITLE:@name@<br />
TEL;TYPE=WORK,VOICE:@owner.phone@<br />
TEL;TYPE=HOME,VOICE:(404) 555-1212<br />
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=WORK:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America<br />
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=HOME:42 Plantation St.\nBaytown\, LA 30314\nUnited States of America<br />
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
==Trigger a Workflow from a Custom Browser Script==<br />
Workflows can be triggered based on a value in a custom field on the object using a browser script:<br />
<br />
_triggerwf(objectid,workflowid,Entity ID); <br />
<br />
The Entity ID should not be included for UTA Level 1 workflows<br />
<br />
You must first create the workflow. Once it has been created you need the [[Workflows_Overview#Determining_the_workflowid|Workflow ID]].<br />
<br />
In the browser script you would use triggerwf with the following syntax:<br /><br />
'''Level 1''': _triggerwf('@opportunityid@',''workflowid'');<br />
<br />
<br />
<br />
Example:<br />
<br />
_triggerwf('@opportunityid@',98765);<br />
<br />
'''Level 2''': _triggerwf('@eventid@',''workflowid'',26);<br />
<br />
Example:<br />
<br />
_triggerwf('@eventid@',98765,26);<br />
<br />
('''26''' is the objecttype for Level 2 activities, and will be the same for all Level 2 workflows)<br />
<br />
NOTE: For workflows triggered by a Browser Script within a UTA you should set Trigger When to --Deactivate-- rather than selecting a Status. This ensures that the workflow is only triggered when called by the script, and there is no risk of triggering it when a status changes.<br />
<br />
Notes:<br />
<br />
* You must not select Let current user select target user from this role for the Routing of workflows triggered by script, as they will not execute.<br />
* Because the workflow is triggered when the script executes it happens before the record is saved. If the workflow changes the Status or a Custom Field value, when the record on the screen is actually saved it will overwrite any changes made by the workflow by those on the page that is being saved. Accordingly you should include any Status or Custom Field changes within the JavaScript that triggers the Workflow.<br />
* If this function is called with a button on a page where standard libraries are not included, make sure to include /js/sstools.js (Example:<script src="js/sstools.js" type="text/javascript"></script>).<br />
<br />
==Using variables with workflows==<br />
===Pass parameters when workflow triggers another workflow===<br />
If a workflow is triggered from another workflow, you can reference a value from the object that triggers the previous workflow (e.g. if a L3 workflow triggers a L2 workflow, you can reference any value from the L3 object from within the L2 workflow). The syntax is as below:<br />
<br />
@triggerobject.FIELDNAME@<br />
<br />
This syntax should work when generating an email, and when used in the connectors as a condition.<br />
<br />
It should also work when using a Trigger Workflow task, and when a Task Connector is linked directly to the workflow.<br />
<br />
===Using variable syntax to select recipients for workflow tasks===<br />
The recipient of workflows (selected in the Acknowledgement, Request for Comment and Request for Approval task types) can be defined using [[Variable List|variable syntax]], rather than being limited to the list by role.<br />
<br />
The benefits to using this approach is, you can send to multiple roles at the same time, rather than having to configure different tasks for each role.<br />
<br />
It also allows you to filter recipients based on a custom field on the contact, or UTA Contact Role Based custom field(s).<br />
<br />
To enable this feature, click on the "Use Variable for Recipients" checkbox under the "Routing" header in the workflow task and then use variables to reference the relevant user.<br />
<br />
<br />
<br />
===Notes Workflow===<br />
The following variables can be used in Notes Workflows:<br />
<br />
@notes@ - the body of the note<br />
<br />
To reference fields found on the associated Level 1, Level 2, Level 3, contact or organization record:<br />
<br />
@parent.fieldname@ or @parent.#fieldID#@<br />
<br />
For Notes at Level 2 you can reference fields on Level 1 using:<br />
<br />
@parent.parent.fieldname@ or @parent.parent.#fieldID#@<br />
The same syntax can be used to call Level 2 fields for Notes at Level 3<br />
<br />
To call Level 1 fields for notes on Level 3:<br />
<br />
@parent.parent.parent.fieldname@ or @parent.parent.parent.#fieldid#@<br />
<br />
Using the "Variable processed recipients" feature of Workflow Tasks, you can direct a Notes Workflow to the contacts on the record to which the note is attached, using the @parent.owner.userid@ or @parent.[#(?object=contact)~userid~,#]@ syntaxes.<br />
<br />
<br />
<br />
===Password Variables===<br />
Different [[Password|password]] [[Variables|variables]] can be used depending on the [[Workflow|workflow]] task type.<br />
<br />
[[UTA]] Activation task type uses @password@<br />
<br />
Acknowledgment task type uses @randompassword@ or @checkactivatedpassword@<br />
<br />
<br />
'''Task Type: User Activation'''<br />
<br />
* @password@ - Checks if the user is activated<br />
** if the [[User|user]] is not activated then generates a new random [[Password|password]] (i.e. Your password is: ABCDEFGH)<br />
** if the [[User|user]] is activated then sends the text "current password" (i.e. Password is: current password)<br />
'''Task Type: Acknowledgment'''<br />
** @randompassword@ - generates a new random [[Password|password]]<br />
** @checkactivatedpassword@ - checks if the [[User|user]] is activated<br />
*** if the [[User|user]] is not activated then generates a new random [[Password|password]]<br />
*** if the [[User|user]] is activated then sends the text "existing password" (see '''Notes''' below)<br />
Because of the complex nature of the password creation and validation process it is not possible to automatically translate '''existing password''' into other languages. If you are sending an e-mail containing the @checkactivatedpassword@ variable you can use the following syntax to display text other than "existing password" if required.<br />
* <br />
<br />
For example, for an existing user the following will show the French translation of '''existing password''' which is '''Mot de passe courant'''. If the user has not been previously activated the syntax will provide a randomly generated password as normal:<br />
<br />
<pre><br />
<!--@sscalculation(if(trim("@checkactivatedpassword@")="existing password","Mot de passe courant","@checkactivatedpassword@"))--><br />
</pre><br />
<br />
{{WorkflowTaskTypeCCEmailSyntaxOptions}}<br />
<!--sendnoto sendnotto Sendnotto sendasto reply-to replyto--><br />
<br />
=Using workflows=<br />
==Searching or Sorting Workflows==<br />
To access the workflows list, click the menu icon in the action bar, followed by the Workflows link in the System Process section.<br />
<br />
The following tabs are also displayed:<br />
<br />
* '''Workflows''' – click this tab to see list of workflows.<br />
* '''Tasks''' – click this tab to see a list of tasks for all workflows.<br />
* '''Outstanding Tasks''' – click this tab to see a list of outstanding tasks for all workflows.<br />
Each of these tabs has search and sort options, to allow quick and easy location of workflows and tasks.<br />
The steps for '''searching''' are as follows:<br />
<br />
<br />
1. Go to the tab that you wish to search against.<br />
<br />
2. Click into the search criteria field to select the list view column to search against.<br />
<br />
3. Enter in appropriate criteria.<br />
<br />
4. Click on the Search button to run the search or click on the X (clear button) to clear the criteria.<br />
<br />
5. All matching results will be listed, as well as filter criteria.<br />
<br />
<br />
<br />
The steps for '''sorting''' are as follows:<br />
<br />
1. Click the column header on the column you wish to sort. First click sorts ascending (going up example 1,2,3).<br />
<br />
2. Second click sorts descending (going down example 3,2,1)<br />
<br />
3. Third click returns to the default sort order.<br />
<br />
==Workflow Requests==<br />
Workflow Requests are generated by Request for Approval / Request for Comment workflow tasks.<br />
<br />
The Workflow Requests page lists:<br />
<br />
* outstanding tasks that you need to complete based on SmartSimple [[workflows]],<br />
* tasks that other people need to complete where you are participating in some steps in the workflow, and<br />
* project tasks that you are assigned to complete.<br />
The request will be listed under the '''Requests to me''' link.<br />
1. Click the '''Communications''', Workflow Requests link. The Workflow task is displayed.<br />
<br />
2. Click the '''Task type''', '''File''' link. The Workflow step is displayed with the following fields in the request:<br />
<br />
* '''Task Name''' – The name of the [[Workflow|workflow]] task.<br />
* '''Created Date''' – The date the task was triggered.<br />
* '''Task Description''' – The description of the task’s purpose.<br />
* '''Action''' – The '''Routing Options''' for the request. These options are only visible for '''Requests For Approval'''.<br />
* '''Comments''' – This box is always visible but can only be used with '''Request For Comments'''.<br />
* '''Object Area''' – The bottom portion of the request screen where the attached object is displayed.<br />
3. Select '''Approve''' to approve the file and click the '''Submit''' button. The '''Approve''' option requires us to select a [[User|user]] to send the approval message to so the '''Select User''' list is displayed.<br />
4. Select the [[User|user]] to receive the approval message and click the '''Submit''' button. The step is complete and the Workflow is also complete. The '''workflow complete''' message is displayed.<br />
<br />
5. Click the '''Communications''', '''Workflow Requests''' button. The [[Workflow|workflow]] is removed from the '''Request to Me''' window.<br />
<br />
==Workflow Diagram==<br />
Clicking on the Diagram button in the action bar of the Edit Workflow page will bring up a graphical representation of the Workflow Tasks that have been configured on that workflow.<br />
<br />
System Administrators use this feature to document and troubleshoot complicated workflow configurations.<br />
<br />
[[Image:workflow2017_17.png|border]]<br />
<br />
<br />
<br />
==Workflow Pending Queue==<br />
On the Edit Workflow page, the Pending Queue tab shows all instances where the workflow in question has been triggered, and the task has been scheduled for future completion.<br />
<br />
The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
[[Image:workflow2017_18.png|900px|border]]<br />
<br />
<br />
<br />
==Workflow History==<br />
In the Edit Workflow page, the history of an individual Workflow can also be accessed by the History tab.<br />
<br />
This page shows all instances of the workflow being triggered. The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
<br />
<br />
==Workflows Triggered by a Given Entity==<br />
The Workflow History tab is made visible for a given Universal Tracking Application™ by enabling the relevant Manager Permission. Go to UTA – Settings – Security, click on Feature and Function Permissions.<br />
<br />
The Enable Workflow History setting is found on the Feature tab.<br />
<br />
Enabling the Manager Permission will enable the Workflow History section from the Option drop-down on Level 1, Level 2 and Level 3 records.<br />
<br />
[[Image:workflow2017_19.png|border]]<br />
<br />
<br />
Clicking on the Workflow History tab will display the history of workflows triggered on the entity.<br />
<br />
[[Image:workflow2017_20.png|border]]<br />
<br />
<br />
<br />
==Configure System to display Workflow options==<br />
The user creating the workflow must have permission to set company workflow trigger.<br />
<br />
Go to Global settings – Security – System Feature Permissions , go to the Action Permission tab and scroll down to the Workflows - Attach Workflow to Company setting.<br />
<br />
There should be a Lookup button to select the roles that should be allowed to attach the workflow.<br />
<br />
Once the role is selected, the options will display in the edit company view.<br />
<br />
[[Image:workflow2017_21.png|border]]<br />
<br />
<br />
<br />
==Reasons workflow messages aren't arriving==<br />
Some common reasons for workflow messages not arriving are:<br />
<br />
# Your [[Browser|browser]] has a pop-up blocker.<br />
# [[Workflow|Workflows]] are not enabled.<br />
# There is another [[Workflow|workflow]] triggering on the same status.<br />
# Your [[Workflow|workflow]] is not configured properly.<br />
Solution to:<br />
# Allow [[SmartSimple]] as a trusted site '''''or''''' check your [[Browser|browser]] for any tool bars that may be blocking the pop-ups '''''or''''' set the [[Workflow|workflows]] to [[Workflow - Silent Mode|suppress pop-ups]].<br />
# Typically in [[UTA]]s, you will need to edit the ''template'' and enable [[Workflow|workflows]] for the level at which they are being triggered.<br />
# You will need to review the other [[Workflow|workflows]] to make sure that two [[Workflow|workflows]] are not triggering on the same status.<br />
# You will need to review the configuration of the [[Workflow|workflows]] to ensure that the connectors are set appropriately as well as the individual tasks that are to take place.<br />
<br />
==Determining the Workflow ID==<br />
Once a workflow has been created, the workflow ID (''wfid'') can be found as follows:<br />
<br />
* Click on the hyperlink for [[Global Settings]]<br />
* Go System tab, click on the hyperlink for ''Workflows''<br />
* The workflow ID is visible as the right-most column on the list of workflows.<br />
Alternatively:<br />
* Click on the Edit workflow icon for the Workflow you want, and the Workflow ID will be at the top of the page:<br />
<br />
[[Category:System Management]][[Category:Workflows]][[Category:Applications]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Workflows_Overview&diff=37481Workflows Overview2020-04-23T17:14:48Z<p>Ciaran: /* Workflow Condition Examples */</p>
<hr />
<div>=Overview=<br />
A Workflow is a set of repeatable steps used to automate and streamline your business processes within the system (e.g. creating review forms and notifying reviewers via email).<br />
<br />
Workflows are created through the Global Settings tab and can be associated with any entity within the system, such as UTA objects, folders, organizations or users.<br />
<br />
Workflows are constructed using two basic elements:<br />
<br />
* Tasks: define the actions required in the workflow – each task represents a single step in the process. Specific roles or specific users are associated with each task, and these people will be automatically alerted when they need to perform the action defined by that task. These actions are generally used to accept, reject, or request a revision on the associated object, file, user or some application-specific information.<br />
* Connectors: link tasks together, and provide for branching logic based on the user responses to the task or pre-set conditions.<br />
<br />
<br />
=Configuration – Essentials=<br />
==Create Workflow==<br />
First create and configure the workflow.<br />
<br />
Next add tasks and connectors.<br />
<br />
The tasks available are dependent on the Workflow Type, so specify the desired type before adding tasks.<br />
<br />
1. Click the Menu Icon and under the System Processes , click the Workflows link.<br />
<br />
2. The Workflows page is displayed. This includes the following tabs:<br />
<br />
3. Workflows – click this tab to see list of workflows. The list includes the name, description, workflow type, Trigger, System Call Identifier and date last updated. In the top right of the action bar is a Category drop down. The list of workflows displayed under the Workflows tab is dependent on the Workflow Category selected. Use the "All Workflows" option to see all workflows.<br />
<br />
* Tasks – click this tab to see a list of tasks for all workflows.<br />
* Outstanding Tasks – click this tab to see a list of outstanding tasks for all workflows. This is where the workflow in question has been triggered, and the task has been scheduled for future completion date<br />
<br />
[[Image:workflow2017_1.png|900px|border]]<br />
<br />
<br />
4. Click the New Workflow button to see the New Workflow page.<br />
<br />
[[Image:workflow2017_2.png|900px|border]]<br />
<br />
<br />
5. Populate the Name field with a suitable a descriptive name for the workflow, and the Description field with a suitable narrative description for the workflow.<br />
<br />
6. you attempt to connect the workflow to the object.<br />
<br />
The table below shows a list of available Workflow Types, the objects that each type is enabled on, and the Trigger When options as well as the Termination Trigger options.<br />
<br />
{| class="wikitable"<br />
|-<br />
!|Workflow Type<br />
!|Enabled On<br />
!|Trigger<br />
!|Termination<br />
|-<br />
||[[Recurring Workflow|Recurring]]<br />
||N/A<br />
||'''Activate''' button on Workflow<br />
||'''Deactivate''' button on Workflow<br />
|-<br />
||Company<br />
||Company or Branch<br />
||New or Modified company or Branch<br />
||N/A<br />
|-<br />
||User<br />
||Company or Branch<br />
||New or Modified user or contact<br />
||N/A<br />
|-<br />
||File<br />
||SmartFolder<br />
||New or Modified file in [[SmartFolder]]<br />
||N/A<br />
|-<br />
||Applicant Tracking<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Applicant Assignment<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Content Management<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Document Library<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Email Broadcast<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Costing<br />
||Job in Job Tracking or Applicant Tracking<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Tracking<br />
||Job in Job Tracking or Applicant Tracking<br />
||Job Status<br />
||Job Status<br />
|-<br />
||[[Sales Tracking]]<br />
||Opportunity<br />
||Opportunity Status<br />
||Opportunity Status<br />
|-<br />
||Smart Folders<br />
||N/A<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||[[Web Forms]]<br />
||Web Form<br />
||New or Modified Web Form<br />
||N/A<br />
|-<br />
| rowspan="2"|[[Universal Tracking Application]]<br /><span style="font-size: xx-small;">''Select the name of the relevant UTA''</span><br />
||UTA Template<br />
||Level 1 Status<br />
||Level 1 Status<br />
|-<br />
||[[Custom Field Type: Link – Single File|Single File]] or [[Custom Field Type: Link – Multiple Files|Multiple Files]] Custom Field<br /> <span style="font-size: xx-small;">''Note: Can be at any level within the selected [[UTA]]''</span><br />
||File upload<br /><span style="font-size: xx-small;">''Note: Within the workflow set '''Trigger When''' to ''' --Deactivate--'''''</span><br />
||N/A<br />
|-<br />
||Tracking Activities<br />
||UTA Template<br />
||Level 2 Status<br />
||Level 2 Status<br />
|-<br />
||Tracking Activity Assignment<br />
||UTA Template<br />
||Addition of Level 2 Contact<br />
||N/A<br />
|-<br />
||Tracking Sub-Activities<br />
||UTA Template<br />
||Level 3 Status<br />
||Level 3 Status<br />
|-<br />
||[[Transactions]]<br />
||Always available<br />
||Transaction Status<br />
||N/A<br />
|-<br />
||Notes<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||UTA Role Assignment<br />
||UTA Template<br />
||Contact Assignment at Level 1<br /><span style="font-size: xx-small;">(with the [[Role]] specified) </span><br />
||N/A<br />
|-<br />
||UTA Company Assignment<br />
||UTA Template<br />
||Company Assignment at Level 1<br />
||N/A<br />
|}<br />
<br />
7. Set the Trigger When option. This determines when a new instance of the workflow should be started. The options available, are determined by the Workflow Type (see Workflow Types table above). The available options include:.<br />
<br />
* The New option will only trigger when a new object is created.<br />
* The Modified option will trigger the workflow when an existing object is changed.<br />
* The On Demand option will trigger the workflow when called by a System Call or a browser script.<br />
* The Status Change option found on the Company and User Workflow Type, will expose the statuses for the relevant company/user. The workflow will trigger when the company/user status is changed and saved.<br />
* The Trigger When option will expose different options depending on the Workflow Type:<br />
** UTA specific statuses when Workflow Type is UTA specific (e.g. Universal Tracking Application, Tracking Activities, Tracking Sub-Activities). The workflow will trigger when UTA level 1, 2 or 3 is created or updated to the selected status.<br />
** Roles for assigning users or companies to an object when Workflow Type is User / Org assignment specific (e.g. UTA Role Assignment, UTA Company Assignment). The workflow will trigger when user/company is added to the object with the selected role.<br />
<br />
8. Set the Termination Trigger options if appropriate. This option is exposed for certain workflow types, including the UTA specific workflow types (see Workflow Types table above). If the entity changes to the status after the workflow has triggered, any Pending tasks are removed (not executed).<br />
<br />
9. Click the Save button. The workflow is saved and the Workflow ID is now populated. The following options appear in the action bar near the top of the screen:<br />
<br />
* Back/Recently Visited – click this button to return to pages previous accessed.<br />
* Workflows – click this button to return to the workflow list.<br />
* New Task – click this button to create a new workflow task.<br />
* Diagram – click this button to see a diagram view of the workflow.<br />
<br />
10. The following tabs are also now displayed:<br />
<br />
* Task – click this tab to view workflow task and to edit tasks. Tasks are steps within the workflow.<br />
* Pending Queue – click this tab to see a list of outstanding tasks for this workflow, you can delete tasks and reassign tasks to other contacts within the system.<br />
* History - click this tab to see a list of completed tasks for this workflow.<br />
<br />
==Create workflow tasks==<br />
Once you have created the workflow you can add tasks, each task automates and streamlines some action or step in your business processes.<br />
<br />
The process for adding a task to a workflow is as follows:<br />
<br />
1. Navigate to the desired workflow and click on the Tasks tab.<br />
<br />
2. Click the New task button in the action bar.<br />
<br />
3. The Task details are displayed, with a Task Number initially set to 100 and increasing in increments of 100 for each subsequent workflow task.<br />
<br />
[[Image:workflow2017_3.png|1000px|border]]<br />
<br />
<br />
4. Update Task Name then select the Task Type. The task type determines how the task should be processed. The available Task Types include:<br />
<br />
* '''Acknowledgement''' - use to generate a message such as an email to appropriate users.<br />
* '''Request for Approval''' - use to generate action requirements that need an approval. These action requirements display in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Request for Comment''' - use to generate comment requirements. These will be displayed in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Change Status''' - use to change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
* '''Create Consumer/Provider Link''' - use to create Consumer/Provider relationship without custom scripting.<br />
* '''Create New Activity''' - use in Universal Tracking Application workflows, to create Level 2 records.<br />
* '''Update Custom Field Value''' - use to update a custom field to an entered value.<br />
* '''Update Standard Field Value''' - use to update a standard field to an entered value.<br />
* '''Select User for Next Task''' - use to pre-select the user that is responsible for a task that immediately follows this task type. This is necessary for tasks that will trigger at a later date.<br />
* '''User Activation''' - use to activate a contact as a user and send the credentials in order to log in. This is useful for project-type work when you only wish to activate a user as part of a project.<br />
* '''Generate PDF File''' - use for automatic generation of a PDF that will be emailed to the person(s) designated in the workflow step.<br />
* '''People Association''' - use to add either pre-defined, or user selected, contact(s) to the contacts section of a Level 1 record with a given role.<br />
* '''Company Association''' - use to add either pre-defined, or user selected, companies to the Account section of a Level 1 record with a given category.<br />
* '''Activate/Deactivate User''' - use to set the access type of a user or remove access.<br />
* '''Update User Role''' - use to add or remove selected roles from a user.<br />
* '''Update Company Category''' - use to add or remove selected categories from a company.<br />
* '''Web Service - HTTP Request''' - use to send the HTTP Post web service request via a workflow step to retrieve a web service response.<br />
* '''Web Service - SOAP Message''' - use to pass information to a system outside of SmartSimple as a Web Services call.<br />
* '''Web Service - RESTful Request''' - use to consume Restful web service request via a workflow step to get/post a web service response.<br />
* '''Trigger Workflow''' - use to trigger a different workflow against a specified object.<br />
* '''Signority Submission''' - use to trigger Signority signing process.<br />
* '''Retrieve Latitude / Longitude''' - use to retrieve Latitude and Longitude values without need to save the object itself<br />
* '''Translate Field Values''' - use to automatically translate records and field values in the system<br />
<br />
<br />
The Task Types available will vary depending on the Workflow Type selected. The following matrix displays Workflow Task Types availability for Workflow Types.<br />
<br />
The following matrix displays which [[Workflow Task Types]] are available for which [[Workflow Types]].<br />
<br />
scope row Move Object<br />
<br />
{| border="1"<br />
|-<br />
! rowspan="2"|Workflow Task Type Available?<br />
! colspan="17" scope="col"|Workflow Types<br />
|-<br />
! scope="col"|[[Recurring Workflow|Recurring]]<br />
! scope="col"|Company<br />
! scope="col"|User<br />
! scope="col"|File<br />
! scope="col"|Applicant Tracking<br />
! scope="col"|Job Tracking<br />
! scope="col"|Sales Tracking<br />
! scope="col"|Smart Folders<br />
! scope="col"|Web Forms<br />
! scope="col"|Universal Tracking Application<br />
! scope="col"|Tracking Activities<br />
! scope="col"|Tracking Activity Assignment<br />
! scope="col"|Tracking Sub-Activities<br />
! scope="col"|Transactions<br />
! scope="col"|Notes<br />
! scope="col"|UTA Role Assignment<br />
! scope="col"|UTA Company Assignment<br />
|-<br />
! scope="row"|[[Workflow Task Type: Acknowledgement|Acknowledgement]]<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Activate/Deactivate User|Activate/Deactivate User]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Change Status|Change Status]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Create New Activity|Create New Activity]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Generate PDF File|Generate PDF File]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: PDF Merge|PDF Merge]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: People Association|People Association]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Approval|Request for Approval]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Comment|Request for Comment]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Select User for Next Task|Select User for Next Task]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Trigger Workflow|Trigger Workflow]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Custom Field Value|Update Custom Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Standard Field Value|Update Standard Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update User Role|Update User Role]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Company Category|Update Company Category]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: User Activation|User Activation]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - HTTP Request|Web Service - HTTP Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - SOAP Message|Web Service - SOAP Message]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - RESTful Request|Web Service - RESTful Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
<br />
|-<br />
! scope="row"|Retrieve Latitude / Longtitude<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|Translate Field Values<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|}<br />
<br />
5. Set the ''Name'' of the Task as appropriate.<br />
<br />
6. Populate the Description field if required.<br />
<br />
7. Click Save at the bottom of the page.<br />
NOTE: There are a number of other settings specific to the Task Type selected. These are covered in the individual entries specific to each Task Type within the Configuring - Advanced section.<br />
<br />
8. Click on the Back button to return to the Edit Workflow screen.<br />
<br />
[[Image:workflow2017_4.png|1100px|border]]<br />
<br />
9. The Task is listed, but without Connectors, the task will not be executed if the workflow is triggered.<br />
<br />
==Create Workflow Connectors==<br />
All tasks must be connected to other tasks or to the start and complete before they will execute.<br />
<br />
The connectors control when the next steps execute and control what the next steps are (based on defined conditions).<br />
<br />
1. Navigate to the desired workflow and click on the Task tab.<br />
<br />
2. Inside the list of tasks, click the New button in the row preceding the task you wish to connect. In the example below the preceding task may be the Start option, but it could also be a preceding Task.<br />
<br />
3. The New Connector modal window launches with number of options.<br />
<br />
[[Image:workflow201802_6.png|border]]<br />
<br />
<br />
The available options include:<br />
<br />
* '''Name''' - use to enter a descriptive name for the connector<br />
* '''Trigger Type''' - use to select Default or Expired options<br />
* '''Connect To''' - use to select what you want to connect. All tasks within the workflow appear, alongside the Start and Complete options. Also, there will be a list of other workflows in the system.<br />
* '''Trigger Date''' - use to define a trigger date. The connector triggers, when the date matches the selected date.<br />
** '''Trigger Date''' - The date the task is triggers.<br />
** '''Start Date''' - The date in the Start Date field of the record with which the workflow is associated.<br />
** '''End Date''' - The date in the End Date field of the record with which the workflow is associated.<br />
** '''Custom Date Field''' - The date in a selected custom field that stores date values.<br />
* '''Delay(s)''' - user can specify any delays based on the trigger date:<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Hour, then the task will trigger 1 hour after the defined Trigger Date.<br />
** If the value -1 entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours before the defined Trigger Date.<br />
* '''Trigger Time''' – allow relevant when a delay is scheduled with the Day option selected. The drop-downs to allow users to specify what time the task should be trigger.<br />
* '''Business Day Only''' - toggle on to take into account the normal working week, and statutory holidays when determining dates and delays.<br />
* '''Holiday Calendar Used''' - used to select a custom calendar. Holiday calendars can be created and used when you specify which days are Business Days for your community instead of using the predefined Business Days Only option.<br />
* '''Required Respondents''' - use to specify how many people must complete an action before the workflow moves to the next task.<br />
* '''Type Filter''' - lookup to select L1, L2, or L3 types, which will then act as the type condition<br />
* '''Status Filter''' - Lookup to select L1, L2, or L3 statuses, which will then act as the status condition<br />
* '''Condition''' - use to specify a logical condition that must be met before a connector triggers the next workflow task. Multiple connectors can be set up with mutually exclusive conditions to have branching logic on the workflow.<br />
<br />
<br />
4. Complete as appropriate and click Save at the bottom of the screen.<br />
<br />
5. Click the New button in the desired row for the task you wish to connect and connect to a proceeding task, the Complete option or to another workflow entirely. Click Save when finished.<br />
<br />
6. Go back to the General tab and click Save once all connectors have been defined. When the page refreshes then the connectors should be displayed.<br />
<br />
[[Image:workflow2017_7.png|1000px|border]]<br />
<br />
<br />
When you create a Workflow with a delay connector, the recipients of the subsequent task are processed at the time the workflow is triggered and NOT at the time it runs. In other words, the tasks on the workflow, such as generating an email, are processed before the delay, not at the end of the delay.<br />
<br />
If the recipients change between the time the workflow is initiated and the time it fires (based on the delay) the recipients will not be updated. To ensure recipients are evaluated at the time the workflow task fires, insert a blank task after the delay connector (i.e. an Acknowledgement workflow with no recipients), then flow into a new Workflow Task with the desired recipients.<br />
<br />
Example scenario:<br />
<br />
* A workflow is configured to wait 5 days and then mail all contacts attached to the Level 1 with role Reviewer.<br />
* That workflow is triggered against a specific Level 1 record which has three contacts in the contacts section with the role Reviewer.<br />
* After the workflow has been triggered, before the 5 days have gone by, two additional Reviewers are added to the contacts section, and one of the original three is removed.<br />
* If the Acknowledgement task is attached directly after the connector with the delay then the original three contacts will receive the email, even though they are no longer current.<br />
* If there is a blank workflow task following the connector with the delay, which flows into a workflow task configured to email all Level 1 contacts with the role Reviewer, then the four reviewers on the Level 1 record at the time the email is sent, will be emailed, rather than the original three reviewers.<br />
<br />
==Enable on Object==<br />
===Enable Workflow on Company/User===<br />
Workflows must be enabled against an organization before workflows will run against the organization itself, its sub-branches and the users within the organization and its sub-branches.<br />
<br />
If the current User has the Workflows - Attach Workflow to Company System Feature Permission enabled then they will see 2 drop-downs on an organization profile<br />
<br />
* '''Company Workflow''' - which lists all Workflows with a Workflow Type of Company. Only a single company workflow can be selected per Company<br />
* '''User Workflow''' - which lists all Workflows with a Workflow Type of User. Only a single User workflow can be selected per Company<br />
<br />
The way the selected Company workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new Company is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new Company is created, and when an existing Company is modified.<br />
<br />
The way the selected User workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new User or Contact is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new User/Contact is created, and when an existing User/Contact is modified.<br />
<br />
<br />
===Enable Workflow on Company/User Registration Page===<br />
This feature enables a Workflow to trigger on a Company/User registration page.<br />
<br />
An example use would be sending an email to an employee every time a new company registers so that they can verify the information entered for the company.<br />
<br />
Company/User registration Workflows will override other new and modified status-based Workflows. We recommended Workflows triggered from Sign Up pages be On Demand.<br />
<br />
Every sign-up page has an Attach Workflow drop-down menu where users can choose the Workflow they want triggered from the sign up page.<br />
<br />
<br />
<br />
===Enable Status-Driven Workflow on UTA===<br />
Status-driven workflows can be triggered from all levels of a UTA if Workflows have been enabled on the types . To enable workflows for a type do the following:<br />
<br />
1. In your desired UTA, click configuration Settings. Click on the level 1 tab, Click on Types. A list of types is displayed.<br />
<br />
2. Click the Edit button on the desired Type The template details are displayed.<br />
<br />
[[Image:workflow2017_8.png|500px|border]]<br />
<br />
<br />
3. To enable workflows for the Level 1 items, select Yes in the first workflow combo box.<br />
<br />
4. To enable workflows for the Level 2 and 3 activities, select Yes in the second workflow combo box.<br />
<br />
5. Click Save.<br />
<br />
Note: upon creation of new Templates, the Workflow combo boxes default to "Yes." Change these values to "No" in the case that you would like to disable workflows for this template at Level 1 and/or Level 2 and 3.<br />
<br />
<br />
<br />
===Enable Workflow on UTA Type===<br />
Level 1/2/3 Types can be configured to trigger a unique workflow whenever a new item using this template type is added.<br />
<br />
Go to configuration settings, choose the desired tab (level 1/2/3) click the types link, edit the desired type and click on the Template Page tab.<br />
<br />
In the Workflow drop-down, select the appropriate workflow and then click Save.<br />
<br />
<br />
<br />
===Enable UTA Role / Company Assignment Workflow on UTA===<br />
If you wish to trigger a UTA Role Assignment Workflow or a UTA Company Assignment Workflow from a UTA level one record then you must have configured the [[Types|Level 1 Type]] settings.<br />
<br />
Each Level One Type page has the following 2 options:<br />
<br />
* '''UTA Role Assignment Workflow''' - use to define one or more UTA Role Assignment Workflows that are triggered by this type .<br />
* '''UTA Company Assignment Workflow''' - use to define one or more UTA Company Assignment Workflows that are triggered by this type.<br />
<br />
<br />
===Enable Workflow on File Upload field===<br />
To trigger a workflow when a file is uploaded to a Link - Single File or Link - Multiple Files Custom Field scroll down to the File Options section. For Workflow on Upload select the desired workflow and save .<br />
<br />
If the file upload Custom Field is located at Level 2 or Level 3, you can select Tracking Activities or Tracking Sub-Activities Workflow Types.<br />
<br />
If the file Custom Field is located on a Company or User you can select Company or User Workflow Types.<br />
NOTE: The Workflow is only triggered when I file is uploaded, it is not triggered by file deletions.<br />
<br />
<br />
<br />
===Enable Workflow on SmartFolder===<br />
To trigger a workflow when a file is uploaded into a SmartFolder navigate to the desired SmartFolder.<br />
<br />
Click the Folder Settings button (looks like a gear).<br />
<br />
For Workflows select the desired work flow (all workflows of the Type File will be displayed) and click save.<br />
<br />
=Configuration – Advanced=<br />
==Suppress Workflow Window==<br />
When a workflow step is executed the user is generally presented with a Workflow window where they can select a value that will be used to determine the next task to be performed.<br />
<br />
This feature is vital for workflows that require user interventions, but is not required for workflows that are used to simply send an instant message or email message to one or more users.<br />
<br />
If the User has a pop-up stopper/blocker enabled within their browser, the Workflow Window will be suppressed and the Workflow will not trigger. You must ensure that users of workflows that prompt their<br />
<br />
Workflow Window, have enabled pop-up window display for your instance of SmartSimple.<br />
<br />
If you wish to suppress the display of this window you can change the workflow settings as follows:<br />
<br />
1. Go to the menu icon and under System Process click Workflows.<br />
<br />
2. Click the edit button on the desired Workflow.<br />
<br />
3. For Workflow Window enable the Suppress option.<br />
<br />
4. Click Save.<br />
NOTE: If you do not require a user interventions in your workflows it is recommended that the Workflow window be suppressed to ensure workflows execute as you may have little control over user browser settings.<br />
<br />
<br />
<br />
==Recurring Workflow==<br />
A recurring workflow is a Workflow that is not triggered against any particular object.<br />
<br />
A recurring workflows ability to use variables is limited, but recurring workflows are useful for tasks that recur at regular intervals, such as a weekly reminder e-mail.<br />
<br />
When using a recurring workflow, the tasks must be connected in a loop, and there must be at least one connector with a delay. Otherwise, the workflow would endlessly loop.<br />
<br />
If the workflow is set to look endlessly (without a delay), the system will automatically stop processing any workflows configured this way, after five loops.<br />
<br />
Once you have configured the Workflow, the Activate button can be used to start the workflow. Once activated, a Deactivate button will be visible that can be used to stop the workflow.<br />
<br />
If you wish to have a recurring workflow send an e-mail on a particular day or days of the month, you can use the following conditions:<br />
<br />
* date_format(now(),"%d")="01" - Will be true only on the 1st of the month<br />
* date_format(now(),"%d") in ("01","15") - Will be true on the 1st and 15th of the month.<br />
<br />
You will need to configure an empty task (i.e. an Acknowledgement with no recipients) to manage the branching based on the date, and an empty task to manage the one-day delay so the workflow will loop daily and connect to the task that sends the e-mail on the appropriate day(s).<br />
<br />
[[Image:workflow2017_9.png|1000px|border]]<br />
<br />
<br />
The Workflow Connectors attached to the "Empty Task for Branching" should have the following Conditions:<br />
<br />
[[Image:workflow2017_10.png|1000px|border]]<br />
<br />
<br />
<br />
==Task Type specific configuration==<br />
Each available task type represents a different type of action and has different configurations needs as a result.<br />
<br />
This section discusses the specific configuration needs for the different tasks types<br />
<br />
<br />
<br />
===Task Type: Acknowledgement===<br />
Acknowledgements use this Task to send messages to users in SmartSimple.<br />
<br />
Acknowledgement Tasks have the following settings:<br />
<br />
* '''Name''' - name for the task.<br />
* '''Task Type''' - manually set to Acknowledgment<br />
* '''Task Number''' - a system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location, but order or execution of tasks is determined by the Connectors.<br />
* '''Description''' - optional description of the task.<br />
* '''Expire After''' - intended duration of the workflow.<br />
{{Template:WorkflowMessageTemplate}}<br />
* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables.<br />
* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients. Only appears if workflow is UTA specific.<br />
* '''Routing: Role''' - Used to select recipients by role. This list includes all roles configured in the system, alongside the built-in roles that can be used in a workflow:<br />
*** The Originator role is used to reference the name of the person that started the workflow. This could be the person that submitted an expense claim, added a file to a workflow or added a new employee. :*The Initiator role is used to reference the name of the person that initiated the current task in the workflow. This refers to the person that approved the current step of an expense claim, or reviewed a document loaded into a workflow enabled Smart Folder.<br />
*** The Owner role is used to reference the user assigned as the Owner of the record.<br />
*** The People role is used to reference the user assigned as the Person on the level one. This role is only available to Level One specific tasks.<br />
*** The Assigned Users role is used to send messaging to users who are in the Assigned field of a Level Two activity. This role is only available for Level Two workflows.<br />
Once the role has been selected the following recipient choices are available:<br />
<br />
* <br />
*::* Let the current user select target user from this role – When the workflow is triggered, the user will be prompted to select recipients from the list of users currently in the role.<br />
*::* All Users of this role – The message will be sent to all users in the selected role.<br />
*::* Selectable list of users currently in the role – The message is sent to the specific users that are selected.<br />
* '''Routing: Selected Users''' - details of the users configured as Recipients in the Role section<br />
* '''Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
===Task Type: Activate/Deactivate User===<br />
This type of Workflow task is used to set the access type for a user or to deactivate a user.<br />
<br />
No message accompanies this workflow task. If you wish to notify users of a change in access type, for example to notify activated users of their password, you can configure an Acknowledgement type workflow task to follow this step in the workflow.<br />
<br />
Activate/Deactivate User Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Activate / Deactivate User.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - Sets the access type for the user against which the workflow is triggered. Options are:<br />
* '''Activate (Administrative or Portal Interface)''' - Provides access to the system to the extent permitted through the user's membership of specific roles.<br />
* '''Activate (User Centric or Applicant Interface)''' – Only provides access through the User Centric Interface and Applicant Tracking “career sites”.<br />
* '''Activate (Web Service Client Access)''' - Account type used to access data in a SmartSimple instance via an API (Application Programming Interface). Does not give access to SmartSimple interface directly.<br />
* '''Deactivate (No Access)''' – User cannot log into the system.<br />
<br />
===Task Type: Change Status===<br />
Change Status Workflow Task Types change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
<br />
Change Status Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Change Status<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Change Status To''' - lists statuses from the selected UTA level. This workflow task will change the status of the object that triggered the workflow to the selected status.<br />
<br />
===Task Type: Company Association===<br />
You can use the Company Association Workflow Task Type to automatically add, remove or update one or more companies to a Level 1 record. They will be assigned to the record with the UTA category defined in the "Roles will be assigned" setting.<br />
<br />
Company Association Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Company Association<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Variables for companies''' - Allows user to use syntax to reference the company IDs<br />
* '''Action''' - Add, update or delete the company association<br />
* '''Companies''' - use Lookup to select the Companies that will be added.<br />
* '''Roles will be Assigned''' - select the categories that you want the companies to be assigned with. To assign different companies with different categories, you will have to create more than one Company Association task.<br />
<br />
===Task Type: Create Consumer/Provider Link===<br />
Consumer/Provider Link Workflow Task Type creates Consumer/Provider relationships, and is only available to Level 1 and Level 2 workflows.<br />
<br />
Consumer/Provider Tasks have the following settings, all of which control how the target record is linked to the record triggering the workflow:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Connection Type''' - Select whether the link will be a Consumer or Provider<br />
* '''Connection Application''' - Select the UTA being connected<br />
* '''Connection Level''' - Choose the connection level (Level One or Level Two)<br />
* '''Object ID / Variable''' - Enter the Record ID (or a variable to obtain the Record ID of the object to connect to). It accepts semicolon separated lists.<br />
* '''Connection Role''' - Select the Consumer UTA Connection role to be used for the connection<br />
<br />
===Task Type: Create New Activity===<br />
You can use the Create New Activity Workflow Task Type to automatically create and attach one or more Level 2 records to a Level 1 record. This workflow can be driven by a Status change on the Level 1 record. The workflow will also trigger (in this sequence):<br />
<br />
1. Auto-assignments<br />
<br />
2. Level 2 Formulas<br />
<br />
3. Level 2 Workflows<br />
<br />
<br />
New Activity Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create New Activity<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional)<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Activity Scheduling Options''' - drop-down with 3 options (Disable, Schedule by Date and Amount, Schedule by Number of Activities) that can be used to create multiple instances of the Activity.<br />
<br />
: If '''Schedule by Date and Amount''' option is selected then following settings are exposed.<br />
::* '''Start Date''': Level 1 field used to set the start date of the activity scheduling period<br />
::* '''End Date''': Level 1 field used to set the end date of the activity scheduling period<br />
::* '''Schedule Every''': frequency of scheduling<br />
::* '''Total Amount''': Level 1 field used for the Total Amount to be distributed. The amount specified will be split evenly between each Level 2. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Date''': Level 2 field used to set the date to be assigned to each record based on the scheduling options."<br />
::* '''Activity Amount''': Level 2 field used to store the calculated amount for each record. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
: If '''Schedule by Number of Activities''' option is selected then following settings are exposed.<br />
::* '''Number of Activities''': Level 1 field used to set the number of activities to be created<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
'''Days Delay''' - Number in days of delay before creation of new activity. If left blank, the new activity will be created immediately.<br />
::* '''Create for Users in UTA Role''' - select the UTA Role of the users that the Peer Activity should be created against.<br />
::* '''Activity Type''' - This is where you specify which Level 2 Type you wish to create. If you select the Custom Field option then a Custom Field ID field is exposed.<br />
::* '''Custom Field ID''' - The Create New Activity workflow can be driven by a Custom Field. For example, you could have check boxes at Level 1 corresponding to various Level 2 Types. Selecting each check box would create and attach the relevant Level 2 activity type. You must first create a Custom Field on the Level 1 record which stores the typeid(s) of the Level 2 Types to be created. To create multiple Level 2 records use one of the Select many field types (e.g. Select Many – Check Boxes, Select Many – Scrolling Check Box, Select Many – List Box) and to create a single Level 2 record use the Select One – Combo Box.<br />
::* '''Activity Status''' - Allows you to define the Status for the newly created Level 2 record(s). Note: If that Level 2 Status has a workflow attached to it the workflow will be triggered at the point of creation of the Level 2 record.<br />
::* '''Reminder Type''' - You can select whether a Quick Message or reminder email will be sent out to the Owner or contacts attached to the record, or any combination of the above.<br />
::* '''Reminder Days''' - Sets delay for reminder message being sent.<br />
<br />
: <br />
===Task Type: Generate PDF File===<br />
Auto generation of a PDF that can be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field.<br />
The PDF generated must be based upon a Web Page View Custom Field. You must specify the Custom Field ID of the Web Page View to be converted in the Web Page Field ID field on the Workflow Task settings.<br />
<br />
: <br />
Multiple PDFs can be created and stored in a single Link - Multiple Files custom field using this workflow task type, by entering the Custom Field IDs of the Web Page View fields, separated by commas.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Web Page Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: PDF Merge===<br />
Will convert [[Custom Field Type: Special – MS Word Merge|Word Merge]] document to a PDF which can then be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field<br />
<br />
: <br />
The PDF generated must be based upon a [[Custom Field Type: Special – MS Word Merge|Word Merge]] Custom Field. You must specify the Custom Field ID of the MS Word Merge document to be converted in the MSWord Merge Field ID field on the Workflow Task settings.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''MSWord Merge Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: People Association===<br />
You can use the People Association Workflow Task Type to automatically add one or more contacts to a Level 1 record. They will be assigned to the record with the UTA role defined in the "Roles will be assigned" setting.<br />
<br />
People Association have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to People Association<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Action''': Add, update or delete the people association<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. This is discussed in greater detail in the Configuration – Advanced section.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to control role of user that will be associated.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to be associated<br />
::* '''Roles will be Assigned''' - select the role(s) that you want the contact(s) to be associated with. To assign different contacts with different roles, you will have to create more than one People Association task.<br />
In the Routing section select a Role currently possessed by the contact(s) you wish to add, whether this is a system role or a UTA role. You can then either select specific contacts or groups that will always be added to the Level 1 when the workflow is triggered, or you can choose Let current user select target user from this role to allow the person that triggers the workflow to select a contact to be added.<br />
Note:<br />
::** If you are allowing the current user to select target user Suppress Workflow Window must be off (not enabled) otherwise the workflow will not fire.<br />
::** If you are allowing the current user to select target user, the Workflow must be triggered by a status, and not by a script.<br />
::** Include a description, as the description will be presented to the user when they are asked to select the contact to be assigned.<br />
In order to notify the contact(s) that they have been assigned you can create a subsequent Acknowledgement Workflow Task to e-mail all contacts with the UTA role you selected.<br />
<br />
===Task Type: Request for Approval / Request for Comment===<br />
Both of these Workflow Task Types prompt users to review the work of others, and keep track of outstanding reviews on the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] page.<br />
<br />
The settings for both of these Workflow Task Types match those used for the Acknowledgment task except for 2 additional settings:<br />
<br />
:* '''Respondents''' - Indicates the number of respondents required for this approval.<br />
:* '''Allow Edit''' - Allows editing of the attached object.<br />
By default, a Request for Approval or Comment workflow task will move on to the next task (whether approved, rejected, etc.) as soon as the first recipient of the Workflow Task responds. The Respondents field allows a specific number of respondents to be required, which will keep the Request for Comment Task active until that number of respondents has replied.<br />
The Routing options field is used as part of the Request for Approval process. Users should enter appropriate options within the Routing Options section(Example: 10=approved;20=reject;30=Revise) and click Save.<br />
<br />
These Routing Options will then be available in the Trigger Type drop-down when configuring Connectors. It is suggested that each routing option should have a corresponding task so that the routing option can then be connected to an appropriate task.<br />
<br />
You must set the minimum number of respondents on the connector associated with each of the approval options.<br />
<br />
::* If you have selected three respondents on the Request for Approval Task, and the task should only pass if all three respondents click approve you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be one.<br />
::* If you have selected four respondents on the Request for Approval Task, and the task should only pass if three respondents click "Approve," you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be two.<br />
The system checks the connectors once the number of respondents on the task has been met, this behaviour is not configurable. The first connector the system checks will be taken if the requirements are met.<br />
You must ensure the Workflow Task is sent to enough people to meet the minimum number of respondents required, if you do not send the task to enough recipients the task would never complete.<br />
<br />
===Task Type: Select User for Next Task===<br />
This task type used to allow the current user to pre-select the user that is responsible for the task that immediately follows this task type.<br />
<br />
This is necessary for tasks that will trigger at a later date.<br />
<br />
For example, consider a Workflow that is triggered on the status of Escalated which is configured to send a reminder e-mail to a manager if the status has not changed for seven days. If the reminder e-mail workflow task has Let current user select target user from this role as the recipient the Workflow would fail. This is because the e-mail is triggered (seven days later) by the system, and there is no current user.<br />
<br />
The settings for this Workflow Task Types match those used for the Acknowledgment task. The only difference if that the Request with the Routing options.<br />
<br />
<br />
<br />
===Task Type: Signority Submission===<br />
You can use the Signority Submission Workflow Task Type to automatically trigger the Signority signing process via workflow.<br />
<br />
Signority Submission Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Signority Field''' - drop-down which lists all Signority enabled WPV fields for the entity the workflow is configured against.<br />
<br />
===Task Type: Trigger Workflow===<br />
You can use the Trigger Workflow tasks to trigger a different workflow.<br />
<br />
Trigger Workflow Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Trigger Workflow''' - Select the workflow that should be triggered from this dropdown menu.<br />
:* '''Record id / Variable''' - this setting should contain the unique record ID for the record against which the selected workflow should be triggered. This record ID can be referenced using variables.<br />
:*** Examples: If the workflow to be triggered is a User type workflow, you would need to provide a User ID for the contact record against which you would want the workflow to be triggered.<br />
:*** If the workflow is to be triggered against a series of Level 2s attached to a Level 1 record, you could use List Syntax to define a list of activities meeting certain criteria against which the workflow should be triggered.<br />
<br />
===Task Type: Update Company Category===<br />
Update User Role Workflow Task Types can add or remove categories from SmartSimple organizations.<br />
<br />
This task type is only available for "Company" workflows.<br />
<br />
Update Company Category Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove categories from the organization upon which the workflow is triggered.<br />
* '''Categories''' - select the categories that should be added or removed from the organization's profile.<br />
<br />
===Task Type: Update Custom Field Value===<br />
The Update Custom Field Value workflow task type can be used to write values to custom fields on the object against which the Workflow is triggered.<br />
<br />
These values can be hard-coded or they can use variables.<br />
<br />
You can also use MySQL syntax to manipulate values using sscalculation.<br />
<br />
Update Custom Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists custom fields across all UTAs from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
Note: If the field to be updated has the Read Only toggle enabled in the Formatting section of the field options (or a "read-only" HTML tag or "textreadonly" CSS class) the value will not update.<br />
* '''Update To Value''' - This workflow task will use this value to update the field selected in the "Use Field" setting. Variables can be used in the "Update To Value" setting as well as hard-coded values.<br />
<br />
===Task Type: Update Standard Field Value===<br />
The Update Standard Field Value workflow type can be used to write values to standard fields on the object against which the Workflow is triggered.<br />
<br />
Standard fields on the level 1, level 2, level 3, companies, contact and transaction can be updated using this method:<br />
<br />
Update Standard Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists standard fields from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
* '''Update To Value''' - accepts hard-coded values and variables. This workflow task will use this value to update the field selected in the "Use Field" setting.<br />
Note: Some standard fields (such as Type) require the ID, not the type name in order to update correctly.<br />
<br />
===Task Type: Update User Role===<br />
Update User Role Workflow Task Types can add or remove roles from SmartSimple contacts.<br />
<br />
This task type is only available for "User" workflows.<br />
<br />
Update User Role Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove roles from the contact upon which the workflow is triggered.<br />
* '''Roles''' - select the roles that should be added or removed from the contact's profile.<br />
<br />
===Task Type: Web Service - HTTP Request===<br />
This workflow task type is used to consume a [[APIs|web service]] via a workflow step. The web service will send the HTTP Post request to retrieve information. The response returned by the web service can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:HTTPPost.PNG|500px]]<br />
<br />
HTTP Post have the following settings:<br />
<br />
:* '''URL''' - endpoint of the HTTP Post web service<br />
:* '''User Name''' - username to access post location if needed<br />
:* '''Password''' - password to access post location if needed<br />
:* '''Parameters''' - free text field to pass in parameters such as apitoken , alias id, etc. Can include username and password if not specified in the specific fields<br />
:* '''Response Stores To''' - field on system where response from HTTP post can be stored<br />
<br />
===Task Type: Web Service – SOAP Message===<br />
The Web Service - SOAP Message Workflow Task allows you to post data to another system, outside of SmartSimple. The response returned by the external system can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:SOAP.png]]<br />
<br />
This Task type has the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Message Template: Action''' - The action to called by the Web Service call (These actions are defined by the external server, and are not part of SmartSimple)<br />
* '''Message Template: Custom Field ID for Response''' - The Custom Field ID of an XML custom field on the object that the Workflow was triggered against that the response returned by the external server.<br />
* '''Message Template: Email Message Header''' - The email header can be modified using the following syntax, with the arguments separated by semicolon:<br />
** X-Priority={1,2,3,4,5}<br />
** Priority={normal,urgent,non-urgent}<br />
** Importance={high,normal,low}<br />
** Sensitivity={personal,private,company,confidential}<br />
*: e.g. Priority=urgent;Importance=high<br />
** '''Message Template: Endpoint''' - The URL or IP address of the destination server<br />
** '''Message Template: Envelope Template''' - The content of the Web Service message to be sent to the external service. This can contain variables related to the object the workflow is triggered against.<br />
** '''Message Template: Attach Object''' - Attaches the details of the object to the message. In the case of a SmartSimple object, such as a company, person, or application, the textual details of the object will be added. If the object is a file, then the file will be attached to an e-mail message, but not an instant message.<br />
** '''Message Template: Attachment File IDs''' - Attach additional default files when triggered from a Smart Folder. See the Determining the File ID article for instructions.<br />
** '''Message Template: Save as Event''' - Email will be saved as an event.<br />
If the content from the custom fields being included within the SOAP message contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server.<br />
<br />
The less than symbol (<) and ampersand (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving system understands that they are data content and not part of the XML structure:<br />
<br />
:: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
For example, an address could contain ampersands, so it should be wrapped as follows:<br />
<br />
<pre>@firstname@@lastname@</pre><address> </address><br />
<br />
If the response to your Web Service call contains values that you wish to store within a Custom Field on the object against which the Workflow was triggered, you can connect a Update Custom Field Value Workflow Task to be the task following the Web Service - SOAP Message and use the variable syntax to pull the value from the XML Custom Field you selected to store the response to the Web Service call.<br />
<br />
For example, if the [[Custom Field Type: Special - XML Data|XML]] Custom Field that stores the response (custom field ID 155255 in the image above) is called '''Web Service Response''', the variable in the [[Update Custom Field Value]] task to pull a node called '''AssignedIdentifier''' could be:<br />
<br />
@xml.Web Service Response.soap:Body.AssignedIdentifier.nodevalue@<br />
<br />
If the response should be saved to a [[System Variable]], the syntax would be:<br />
<br />
@system.xml.''fieldname''.''nodename''.nodevalue@<br />
<br />
===Task Type: Web Service - RESTful Request===<br />
This workflow task type is used to consume a RESTful web service using GET or POST method.<br />
<br />
====RESTful Web Service Request using GET Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_GET.PNG|500px]]<br />
<br />
GET RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - resource of the web service<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====RESTful Web Service Request using POST Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_POST.PNG|500px]]<br />
<br />
POST RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - endpoint of the web service<br />
:* '''Request Body''' - data sent with the request.<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====Credentials of the RESTful Web Service Request====<br />
<!--89397 - Workflow Task Type: Web Service - RESTful Request --><br />
Credentials of the web service can be added in the Request Header in the format: Authorization=Basic [base64 encoded credentials].<br/><br />
A third party software can be used to convert the username/password to a base64 encoded credentials.<br/><br />
Note that all equal signs within the base64 credentials should be replaced with %3D.<br/><br />
Example:<br/><br />
FROM: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''='''</span><br/><br />
TO: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''%3D'''</span><br />
====Parsing JSON response====<br />
<!--67458 - Add GET/POST REST services workflow tasks that are compatible with JSON--><br />
Variable syntax is available to parse and retrieve values from JSON format data.<br/><br />
''Sample 1''<br />
<pre>FIELD_NAME: {"firstname":"John"}<br />
variable syntax: @json.FIELD_NAME.firstname@ <br />
result: John<br />
</pre><br />
''Sample 2''<br />
<br />
<pre>FIELD_NAME: {"primarycontact":{"firstname":"Thomas"}}<br />
variable syntax: @json.FIELD_NAME.primarycontact.firstname@ <br />
result: Thomas<br />
</pre><br />
''Sample 3''<br />
<br />
<pre>FIELD_NAME: {"users":[{"firstname":"Marie"},{"firstname":"Eve"}]}<br />
variable syntax: @json.FIELD_NAME.users.[# ~firstname~, #]@<br />
result: Marie, Eve<br />
</pre><br />
<br />
===Task Type: Translate Field Value===<br />
The Translate Field Value Workflow Task allows you to perform automatic translation of records and field values in the system. It will only apply to those custom fields that have [[Enable_Translation_Service|enabled translation services]].<br />
<br />
This Task type has the following settings:<br />
<br />
** '''Name''' - Narrative name for the task.<br />
** '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
** '''Description''' - Detailed description of the task (optional).<br />
** '''Translate to''' - set which language or languages to translate to for the custom fields that have enabled translation<br />
If a record has translation enabled and a stored field translation exist, there will be a "Show Translation Values" in the Options menu<br />
<br />
When shown, the translated field values will appear directly underneath the existing field value.<br />
<br />
If more than one translated language exist, there will be a language drop down appearing at the top of the record.<br />
<br />
==Importing and Exporting Workflow Tasks==<br />
Workflow Tasks can be exported and imported into other Workflows using the Import/Export function on the Edit Workflow page. This feature is particularly useful if you have created workflows for testing on your backup instance and wish to implement the finalized reports in your live system.<br />
<br />
The steps to export a workflow task or set of workflow tasks are as follows:<br />
<br />
[[Image:ExportWorkflow2017.png|1000px|border]]<br />
<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab and select the checkbox next to the workflow task(s) that you wish to export.<br />
<br />
2. Click on the Export button.<br />
<br />
3. A pop-up window will appear, containing the details of the tasks you have selected in XML format. Select all of the text in the pop-up window and save it to a text editing program, such as Notepad.<br />
<br />
Note that, if multiple tasks are selected, they will be delimited in the XML text block with the tag.<br />
<br />
<br />
The steps to '''import''' a workflow task or set of workflow tasks are as follows:<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab, then click on the Import button.<br />
<br />
2. A blank pop-up window will appear. Paste the XML data that you have exported into this window.<br />
<br />
3. Confirm your selection by clicking on the Import button at the bottom of the pop-up window.<br />
<br />
* The workflow tasks will be imported into the new workflow.<br />
* The Edit Workflow page will refresh to show the newly-added workflow tasks.<br />
<br />
==Workflow Condition==<br />
A logical statement can be added to workflow connectors in the Condition field, enabling you to specify which workflow task will be triggered.<br />
<br />
Example Branching Logic can be implemented to send an approval message to Senior Management when the request is over $100,000, while requests under $100,000 will take a different path when the workflow is triggered.<br />
<br />
<br />
[[Image:workflow2017_13.png|600px|border]]<br />
<br />
<br />
In general the Workflow Condition is used with several different connectors attached to a task. Collectively the conditions on each task should accommodate every possibility.<br />
<br />
Note: because the sequence in which the system accesses each connector is not configurable it is important that the conditions are mutually exclusive. For example, if you have 3 connectors for different paths based on a particular value the conditions could be:<br />
<br />
* "@Selection@"="Yes"<br />
* "@Selection@"="No"<br />
* "@Selection@"!="Yes" and "@Selection@"!="No"<br />
* The last statement could also be represented as "@Selection@" not in ("Yes","No")<br />
You can also use MySQL syntax to perform calculations within the Condition:<br />
* date_format(now(),"%d")="01"<br />
<br />
<br />
This condition will be true only on the 1st of the month. This could be used with a Recurring Workflow that loops daily if you wish to send out a summary e-mail on the 1st of every month.<br />
<br />
It is recommended that workflows with a loop include an empty task with 2 connectors with 2 separate conditions, one which goes back to the looped task and another which proceeds on to the next task, thus preventing an endless loop.<br />
<br />
Note: Other than values that are always numeric, all variables should be enclosed in double quotes.<br />
<br />
<br />
<br />
===Workflow Condition Examples===<br />
There are two rules that must be followed when adding multiple connectors to a workflow task that incorporate conditional logic statements:<br />
<br />
'''1. Collectively, the conditions on each task must accommodate every possible permutation'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three level one [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@levelone.typeid@"="12345"'' and<br />
* ''"@levelone.typeid@"="45678"'', respectively<br />
<br />
If the workflow is fired against a record associated with typeID 67890, the workflow will never progress to the next task.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
As above, three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Three connectors are set up on a workflow task with conditions of:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"'',<br />
* ''"@typeid@"="45678"'' and<br />
* ''"@typeid@"="67890"'', respectively<br />
<br />
<br />
Alternatively, connectors with the following conditions could be set up:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"''<br />
* ''"@typeid@"!="12345"'' (not equal to "12345"), and<br />
* ''"@typeid@" NOT IN ("12345","45678")'', respectively<br />
<br />
<br />
'''2. Each condition must be mutually exclusive from every other'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two [[status]]es exist in the same application, with [[Determining the statusid|statusIDs]] of 888 and 999.<br />
<br />
The system administrator wishes to send emails via workflow if the record is in one of the above statuses. One email should be sent out if the type is 12345 or 45678 and a different email should be sent out if a different type has been used.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@statusid@" in ("888","999")''<br />
<br />
<br />
The issue here is that both statements [[Boolean Operators|evaluate]] as '''true''' if the statuses on the record triggering the workflow have a statusID of 888 or 999.<br />
<br />
The workflow process will not "know" which task to connect to. The workflow will progress, but not necessarily to the next intended workflow task. In other words, the wrong email may be sent.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
The types and statuses exist as above, and the system administrator wishes to configure the same branching logic.<br />
<br />
Two connectors should be set up on a workflow task with the following conditions:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@typeid@" not in ("12345","45678") AND "@statusid@" in ("888","999")''<br />
<br />
<br />
This configuration satisfies Rule #2, in that the conditions are now mutually exclusive. However, a third connector must be included, with the following condition, which connects to the "Complete" task, in order to satisfy Rule #1 above:<br />
<br />
* ''"@statusid@" not in ("888","999")''<br />
<br />
<br />
With these three connectors configured, the workflow will:<br />
<br />
* never not have instructions on ''whether'' to trigger the next workflow task (Rule #1), and<br />
* always have clear instructions on ''which'' task to trigger given a certain set of conditions (Rule #2).<br />
<br />
==Using iCalendar to generate Meeting Requests, Tasks and Contact cards==<br />
iCalendar is a file format that allows Internet users to send meeting requests, contacts and tasks through email and other digital methods.<br />
<br />
SmartSimple workflows support 3 email attachments types (ievent, itodo and icard).<br />
<br />
The SmartSimple email engine will look for email contents that have ievent, itodo, and icard objects. The contents of these objects are assembled and added as email attachments.<br />
<br />
The email engine will process iCalendar objects using the following syntax:<br />
<br />
* "@@ievent"<br />
* "@@itodo"<br />
* "@@icard"<br />
<br />
Simple sample iCalendar objects are shown below<br />
<br />
<br />
<br />
===ievent Object===<br />
Manifests as an ical attachment on the email.<br />
<br />
<pre><br />
<!--@ssattach(icalendar,vevent)--><br />
@@ievent<br />
UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DTSTART:TO_UTC(@startdate@ @starttime@)<br />
DTEND:TO_UTC(@enddate@ @endtime@)<br />
LOCATION:Room 1<br />
SUMMARY: Details to follow<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
instead of UTC you can specify the Time Zone for the DTSTART and DTEND as:<br />
<br />
<pre>DTSTART;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullstartdate@","%Y%m%dT%H%i%s"))--><br />
DTEND;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullenddate@","%Y%m%dT%H%i%s"))--><br />
</pre><br />
<br />
===itodo Object===<br />
<pre><br />
<!--@ssattach(icalendar,vtodo)--><br />
@@itodo<br />UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DUE:TO_UTC(@startdate@)<br />
STATUS:NEEDS-ACTIONLOCATION:Room 1<br />
SUMMARY: Meeting<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
<br />
===icard Object===<br />
<pre><br />
<!--@ssattach(icalendar,vcard)--><br />
@@icard<br />FN:@owner.fullname@<br />
ORG:@company@<br />TITLE:@name@<br />
TEL;TYPE=WORK,VOICE:@owner.phone@<br />
TEL;TYPE=HOME,VOICE:(404) 555-1212<br />
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=WORK:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America<br />
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=HOME:42 Plantation St.\nBaytown\, LA 30314\nUnited States of America<br />
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
==Trigger a Workflow from a Custom Browser Script==<br />
Workflows can be triggered based on a value in a custom field on the object using a browser script:<br />
<br />
_triggerwf(objectid,workflowid,Entity ID); <br />
<br />
The Entity ID should not be included for UTA Level 1 workflows<br />
<br />
You must first create the workflow. Once it has been created you need the [[Workflows_Overview#Determining_the_workflowid|Workflow ID]].<br />
<br />
In the browser script you would use triggerwf with the following syntax:<br /><br />
'''Level 1''': _triggerwf('@opportunityid@',''workflowid'');<br />
<br />
<br />
<br />
Example:<br />
<br />
_triggerwf('@opportunityid@',98765);<br />
<br />
'''Level 2''': _triggerwf('@eventid@',''workflowid'',26);<br />
<br />
Example:<br />
<br />
_triggerwf('@eventid@',98765,26);<br />
<br />
('''26''' is the objecttype for Level 2 activities, and will be the same for all Level 2 workflows)<br />
<br />
NOTE: For workflows triggered by a Browser Script within a UTA you should set Trigger When to --Deactivate-- rather than selecting a Status. This ensures that the workflow is only triggered when called by the script, and there is no risk of triggering it when a status changes.<br />
<br />
Notes:<br />
<br />
* You must not select Let current user select target user from this role for the Routing of workflows triggered by script, as they will not execute.<br />
* Because the workflow is triggered when the script executes it happens before the record is saved. If the workflow changes the Status or a Custom Field value, when the record on the screen is actually saved it will overwrite any changes made by the workflow by those on the page that is being saved. Accordingly you should include any Status or Custom Field changes within the JavaScript that triggers the Workflow.<br />
* If this function is called with a button on a page where standard libraries are not included, make sure to include /js/sstools.js (Example:<script src="js/sstools.js" type="text/javascript"></script>).<br />
<br />
==Using variables with workflows==<br />
===Pass parameters when workflow triggers another workflow===<br />
If a workflow is triggered from another workflow, you can reference a value from the object that triggers the previous workflow (e.g. if a L3 workflow triggers a L2 workflow, you can reference any value from the L3 object from within the L2 workflow). The syntax is as below:<br />
<br />
@triggerobject.FIELDNAME@<br />
<br />
This syntax should work when generating an email, and when used in the connectors as a condition.<br />
<br />
It should also work when using a Trigger Workflow task, and when a Task Connector is linked directly to the workflow.<br />
<br />
===Using variable syntax to select recipients for workflow tasks===<br />
The recipient of workflows (selected in the Acknowledgement, Request for Comment and Request for Approval task types) can be defined using [[Variable List|variable syntax]], rather than being limited to the list by role.<br />
<br />
The benefits to using this approach is, you can send to multiple roles at the same time, rather than having to configure different tasks for each role.<br />
<br />
It also allows you to filter recipients based on a custom field on the contact, or UTA Contact Role Based custom field(s).<br />
<br />
To enable this feature, click on the "Use Variable for Recipients" checkbox under the "Routing" header in the workflow task and then use variables to reference the relevant user.<br />
<br />
<br />
<br />
===Notes Workflow===<br />
The following variables can be used in Notes Workflows:<br />
<br />
@notes@ - the body of the note<br />
<br />
To reference fields found on the associated Level 1, Level 2, Level 3, contact or organization record:<br />
<br />
@parent.fieldname@ or @parent.#fieldID#@<br />
<br />
For Notes at Level 2 you can reference fields on Level 1 using:<br />
<br />
@parent.parent.fieldname@ or @parent.parent.#fieldID#@<br />
The same syntax can be used to call Level 2 fields for Notes at Level 3<br />
<br />
To call Level 1 fields for notes on Level 3:<br />
<br />
@parent.parent.parent.fieldname@ or @parent.parent.parent.#fieldid#@<br />
<br />
Using the "Variable processed recipients" feature of Workflow Tasks, you can direct a Notes Workflow to the contacts on the record to which the note is attached, using the @parent.owner.userid@ or @parent.[#(?object=contact)~userid~,#]@ syntaxes.<br />
<br />
<br />
<br />
===Password Variables===<br />
Different [[Password|password]] [[Variables|variables]] can be used depending on the [[Workflow|workflow]] task type.<br />
<br />
[[UTA]] Activation task type uses @password@<br />
<br />
Acknowledgment task type uses @randompassword@ or @checkactivatedpassword@<br />
<br />
<br />
'''Task Type: User Activation'''<br />
<br />
* @password@ - Checks if the user is activated<br />
** if the [[User|user]] is not activated then generates a new random [[Password|password]] (i.e. Your password is: ABCDEFGH)<br />
** if the [[User|user]] is activated then sends the text "current password" (i.e. Password is: current password)<br />
'''Task Type: Acknowledgment'''<br />
** @randompassword@ - generates a new random [[Password|password]]<br />
** @checkactivatedpassword@ - checks if the [[User|user]] is activated<br />
*** if the [[User|user]] is not activated then generates a new random [[Password|password]]<br />
*** if the [[User|user]] is activated then sends the text "existing password" (see '''Notes''' below)<br />
Because of the complex nature of the password creation and validation process it is not possible to automatically translate '''existing password''' into other languages. If you are sending an e-mail containing the @checkactivatedpassword@ variable you can use the following syntax to display text other than "existing password" if required.<br />
* <br />
<br />
For example, for an existing user the following will show the French translation of '''existing password''' which is '''Mot de passe courant'''. If the user has not been previously activated the syntax will provide a randomly generated password as normal:<br />
<br />
<pre><br />
<!--@sscalculation(if(trim("@checkactivatedpassword@")="existing password","Mot de passe courant","@checkactivatedpassword@"))--><br />
</pre><br />
<br />
{{WorkflowTaskTypeCCEmailSyntaxOptions}}<br />
<!--sendnoto sendnotto Sendnotto sendasto reply-to replyto--><br />
<br />
=Using workflows=<br />
==Searching or Sorting Workflows==<br />
To access the workflows list, click the menu icon in the action bar, followed by the Workflows link in the System Process section.<br />
<br />
The following tabs are also displayed:<br />
<br />
* '''Workflows''' – click this tab to see list of workflows.<br />
* '''Tasks''' – click this tab to see a list of tasks for all workflows.<br />
* '''Outstanding Tasks''' – click this tab to see a list of outstanding tasks for all workflows.<br />
Each of these tabs has search and sort options, to allow quick and easy location of workflows and tasks.<br />
The steps for '''searching''' are as follows:<br />
<br />
<br />
1. Go to the tab that you wish to search against.<br />
<br />
2. Click into the search criteria field to select the list view column to search against.<br />
<br />
3. Enter in appropriate criteria.<br />
<br />
4. Click on the Search button to run the search or click on the X (clear button) to clear the criteria.<br />
<br />
5. All matching results will be listed, as well as filter criteria.<br />
<br />
<br />
<br />
The steps for '''sorting''' are as follows:<br />
<br />
1. Click the column header on the column you wish to sort. First click sorts ascending (going up example 1,2,3).<br />
<br />
2. Second click sorts descending (going down example 3,2,1)<br />
<br />
3. Third click returns to the default sort order.<br />
<br />
==Workflow Requests==<br />
Workflow Requests are generated by Request for Approval / Request for Comment workflow tasks.<br />
<br />
The Workflow Requests page lists:<br />
<br />
* outstanding tasks that you need to complete based on SmartSimple [[workflows]],<br />
* tasks that other people need to complete where you are participating in some steps in the workflow, and<br />
* project tasks that you are assigned to complete.<br />
The request will be listed under the '''Requests to me''' link.<br />
1. Click the '''Communications''', Workflow Requests link. The Workflow task is displayed.<br />
<br />
2. Click the '''Task type''', '''File''' link. The Workflow step is displayed with the following fields in the request:<br />
<br />
* '''Task Name''' – The name of the [[Workflow|workflow]] task.<br />
* '''Created Date''' – The date the task was triggered.<br />
* '''Task Description''' – The description of the task’s purpose.<br />
* '''Action''' – The '''Routing Options''' for the request. These options are only visible for '''Requests For Approval'''.<br />
* '''Comments''' – This box is always visible but can only be used with '''Request For Comments'''.<br />
* '''Object Area''' – The bottom portion of the request screen where the attached object is displayed.<br />
3. Select '''Approve''' to approve the file and click the '''Submit''' button. The '''Approve''' option requires us to select a [[User|user]] to send the approval message to so the '''Select User''' list is displayed.<br />
4. Select the [[User|user]] to receive the approval message and click the '''Submit''' button. The step is complete and the Workflow is also complete. The '''workflow complete''' message is displayed.<br />
<br />
5. Click the '''Communications''', '''Workflow Requests''' button. The [[Workflow|workflow]] is removed from the '''Request to Me''' window.<br />
<br />
==Workflow Diagram==<br />
Clicking on the Diagram button in the action bar of the Edit Workflow page will bring up a graphical representation of the Workflow Tasks that have been configured on that workflow.<br />
<br />
System Administrators use this feature to document and troubleshoot complicated workflow configurations.<br />
<br />
[[Image:workflow2017_17.png|border]]<br />
<br />
<br />
<br />
==Workflow Pending Queue==<br />
On the Edit Workflow page, the Pending Queue tab shows all instances where the workflow in question has been triggered, and the task has been scheduled for future completion.<br />
<br />
The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
[[Image:workflow2017_18.png|900px|border]]<br />
<br />
<br />
<br />
==Workflow History==<br />
In the Edit Workflow page, the history of an individual Workflow can also be accessed by the History tab.<br />
<br />
This page shows all instances of the workflow being triggered. The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
<br />
<br />
==Workflows Triggered by a Given Entity==<br />
The Workflow History tab is made visible for a given Universal Tracking Application™ by enabling the relevant Manager Permission. Go to UTA – Settings – Security, click on Feature and Function Permissions.<br />
<br />
The Enable Workflow History setting is found on the Feature tab.<br />
<br />
Enabling the Manager Permission will enable the Workflow History section from the Option drop-down on Level 1, Level 2 and Level 3 records.<br />
<br />
[[Image:workflow2017_19.png|border]]<br />
<br />
<br />
Clicking on the Workflow History tab will display the history of workflows triggered on the entity.<br />
<br />
[[Image:workflow2017_20.png|border]]<br />
<br />
<br />
<br />
==Configure System to display Workflow options==<br />
The user creating the workflow must have permission to set company workflow trigger.<br />
<br />
Go to Global settings – Security – System Feature Permissions , go to the Action Permission tab and scroll down to the Workflows - Attach Workflow to Company setting.<br />
<br />
There should be a Lookup button to select the roles that should be allowed to attach the workflow.<br />
<br />
Once the role is selected, the options will display in the edit company view.<br />
<br />
[[Image:workflow2017_21.png|border]]<br />
<br />
<br />
<br />
==Reasons workflow messages aren't arriving==<br />
Some common reasons for workflow messages not arriving are:<br />
<br />
# Your [[Browser|browser]] has a pop-up blocker.<br />
# [[Workflow|Workflows]] are not enabled.<br />
# There is another [[Workflow|workflow]] triggering on the same status.<br />
# Your [[Workflow|workflow]] is not configured properly.<br />
Solution to:<br />
# Allow [[SmartSimple]] as a trusted site '''''or''''' check your [[Browser|browser]] for any tool bars that may be blocking the pop-ups '''''or''''' set the [[Workflow|workflows]] to [[Workflow - Silent Mode|suppress pop-ups]].<br />
# Typically in [[UTA]]s, you will need to edit the ''template'' and enable [[Workflow|workflows]] for the level at which they are being triggered.<br />
# You will need to review the other [[Workflow|workflows]] to make sure that two [[Workflow|workflows]] are not triggering on the same status.<br />
# You will need to review the configuration of the [[Workflow|workflows]] to ensure that the connectors are set appropriately as well as the individual tasks that are to take place.<br />
<br />
==Determining the Workflow ID==<br />
Once a workflow has been created, the workflow ID (''wfid'') can be found as follows:<br />
<br />
* Click on the hyperlink for [[Global Settings]]<br />
* Go System tab, click on the hyperlink for ''Workflows''<br />
* The workflow ID is visible as the right-most column on the list of workflows.<br />
Alternatively:<br />
* Click on the Edit workflow icon for the Workflow you want, and the Workflow ID will be at the top of the page:<br />
<br />
[[Category:System Management]][[Category:Workflows]][[Category:Applications]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Template:CurrentUpgradeDate&diff=37480Template:CurrentUpgradeDate2020-04-15T13:44:44Z<p>Ciaran: </p>
<hr />
<div>July 9th 2020</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Template:Upgrade_Schedule&diff=37479Template:Upgrade Schedule2020-04-15T13:39:31Z<p>Ciaran: </p>
<hr />
<div>{| class="wikitable"<br />
|-<br />
||'''Upgrade'''<br />
||'''Planned Production Date'''<br />
|-<br />
||July 2020<br />
||Thu, July 9 2020<br />
|-<br />
||November 2020<br />
||Thu, November 12 2020<br />
|-<br />
||March 2021<br />
||Thu, March 11 2021<br />
|-<br />
||July 2021<br />
||Thu, July 8 2021<br />
|-<br />
||November 2021<br />
||Thu, November 11 2021<br />
|-<br />
||March 2022<br />
||Thu, March 10 2022<br />
|-<br />
||July 2022<br />
||Thu, July 14 2022<br />
|-<br />
||November 2022<br />
||Thu, November 10 2022<br />
|}</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37345DocuSign2020-01-24T15:35:34Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If anchor string text is not found in the document, or if you do not include the SignatureBlock tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37344DocuSign2020-01-24T15:29:24Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include SignatureBlock tag with anchor string defined and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If "Please sign" is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37343DocuSign2020-01-24T15:27:45Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must include <pre><!--SignatureBlock Anchor String--></pre> and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If "Please sign" is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37342DocuSign2020-01-24T15:21:53Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must have both <!--SignatureBlock Anchor String--> and then, in the document itself, have a text string that matches the anchor string.<br />
* If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
* If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
* If "Please sign" is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37341DocuSign2020-01-24T15:18:27Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock SignatureAnchorString--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must have both <!--SignatureBlock Anchor String--> and then, in the document itself, have a text string that matches the anchor string.<br />
If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
If "Please sign" is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=DocuSign&diff=37340DocuSign2020-01-24T15:16:32Z<p>Ciaran: /* DocuSign Tags */</p>
<hr />
<div>==Configuring Global Settings==<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br /><br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Integrator Key**:<br />
* Secret Key**: unique secret code for the client (see below for a description of where these are found)<br />
<br />
3. Back in SmartSimple, Click '''Save''' once both keys have been entered.<br /><br />
4. On the Integrations tab, look for the '''Online Signature Provider''' section, and select '''DocuSign'''. You will then need to click the button labeled "Activate DocuSign Access", and enter your '''DocuSign''' login credentials. Once you've saved, the text next to the button should read: '''DocuSign Access: Enabled'''.<br /><br />
5. Configure your Web Page View field and use the tags outlined below to incorporate '''DocuSign''' functions with your SmartSimple data. Make sure these two field options are enabled:<br />
<br />
* Online Signature: This will enable a new button in the Web Page View called "Online Signature".<br />
* Enable Save to Server: This will allow a copy of the signed PDF document to be saved within SmartSimple.<br />
* You can also create an Upload field, if desired, in which to store the signed PDF file. Use the Store-To Value option in the Web Page View field to point to this additional field.<br />
<br />
6. Make sure you've created a role for your Signees, and that the intended person is added as a Contact using this role. Your Web Page View field will need to contain list syntax that specifies the roleid; this is how SmartSimple knows to whom the e-signature request should be sent.<br />
<br />
<pre>* for Integrator Key and Secret Keys, login to your DocuSign account, click on the "User" icon - go to Admin-->Integrations-->API and Keys (on left menu) - click on the Integrator Key and there you will be able to add new Secret keys.</pre><br />
<br />
Tip: Within the Web Page View window, you can click the Online Signature button to view the status of the current request once it's been sent.<br />
<br />
==DocuSign Account Set Up==<br />
To use DocuSign as a signature provider in SmartSimple, you will need a DocuSign API account, during sign up, you will have to provide the Redirect URIs (see screenshots for additional information on the instructions).<br />
<br />
For the Redirect URIs:<br />
<br />
1. Go to Global Settings - Integrations - Integration Key Management. <br />
<br />
2. Click on '''New Integration Key'''. You will be presented with the following fields:<br />
<br />
* Key Type: set to DocuSign<br />
* Key name: set to DocuSign<br />
<br />
3. Copy the '''Redirect URL'''<br />
<br />
4. Use this URL for the DocuSiign API account (when you are on DocuSign site to sign up for an API account)<br />
<br />
[[File:Fromdocusign.png|800px]]<br />
<br />
[[File:docusignURL1.png|800px]]<br />
<br />
[[File:docusignURL2.png|800px]]<br />
<br />
[[File:docusignURL3.png|800px]]<br />
<br />
<br />
<br />
<br />
<br />
==DocuSign Tags==<br />
Use the below tags to configure the contact details and signing order for the signees.<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Function'''<br />
||'''Tag Format'''<br />
||'''Example'''<br />
||'''Notes'''<br />
|-<br />
||Populate the email subject<br />
||<br />
<pre><!--SignatureEmailSubject Place Subject Here--></pre><br />
||<br />
<pre><!--SignatureEmailSubject @name@ Test Email Subject--></pre><br />
||Include a variable here, such as the L1 name.<br />
|-<br />
||Populate the email body<br />
||<br />
<pre><!--SignatureEmailBody Place body text here.--></pre><br />
||<br />
<pre><!--SignatureEmailBody This is a test.--></pre><br />
||<br />
|-<br />
||Configure the DocuSign expiration date<br />
||<br />
<pre><!--SignatureExpiryDays Insert Numeric Value--></pre><br />
||<br />
<pre><!--SignatureExpiryDays 14--></pre><br />
||After submission to Docusign, the document will expire after 14 days. Signees will not be able to access the document if it has gone unsigned at the time of expiry.<br />
|-<br />
||Configure the CC email list<br />
||<br />
<pre><!--SignatureCC email;Name,email2;Name2--></pre><br />
||<br />
<pre><!--SignatureCC abc@fake.com;ABC Smith,qa1@fake.com;QA1--></pre><br />
||Emails will be copied to the list of people included here.<br />
|-<br />
||Configure the email language<br />
||<br />
<pre><!--SignatureLocale Language Code--></pre><br />
||<br />
<pre><!--SignatureLocale en--></pre><br />
||Sets the email language, such as en, fr, etc.<br />
|-<br />
||Configure the email flow for multiple signees<br />
||<br />
<pre><!--SignatureFlow Indicator--></pre><br />
||<br />
<pre><!--SignatureFlow P--></pre><br />
||If you specify the signature flow as P (Parallel), emails will be sent to all signees at the same time.<br />
If you specify the signature flow as S (Sequential), emails will be sent sequentially, for example: email will only be sent to the second signee after the first signee has completed signing the document, and so on.<br />
|-<br />
||Set the Signature Block location<br />
||<br />
<pre><!--SignatureBlock SignatureAnchorString--></pre><br />
||<br />
<pre><!--SignatureBlock Anchor String--></pre><br />
||If you wish to have the Signature Block appear in the document in a fixed position then you must have both <!--SignatureBlock Anchor String--> and then, in the document itself, have a text string that matches the anchor string.<br />
||If the anchor string is "Please sign", DocuSign will find "Please sign" in your HTML and place the Signature block below it. Signees will see a signature block to click on and sign.<br />
|| If you have 2 signees, then the 2nd signee's signature block will be placed 1 inch below the 1st signee's signature block.<br />
||If "Please sign" is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their signature anywhere in the document.<br />
<br />
|-<br />
||Set the location of the Initials Block<br />
||<br />
<pre><!--InitialsBlock InitialsAnchorString--></pre><br />
||<br />
<pre><!--InitialsBlock Your Initials:--></pre><br />
||Here the anchor string is "Your Initials: "<br />
DocuSign will find "Your Initials: " in your HTML and place the Initials Block below it. If the specified AnchorString is not found in the document, or if you do not include this tag in your HTML, signees will have the option to place their initials anywhere in the document.<br />
<br />
||<br />
|}<br />
<br />
==Note==<br />
For DocuSign to retrieve signee emails, names etc, you will have to embed them in your HTML. They will then be used in the email sent to signees. For example:<br />
<br />
<pre> [#(?object=contact;criteria=roleid='12527';orderby=firstname) <!--SignatureFlow P--><!--signature ~email~;SIGNER;~firstname~;~lastname~;~Index~;~companyname~-->#]</pre><br />
<br />
If you have 3 signees assigned to the Level 1, the HTML in your Web Page View will be embedded with the info for all three:<br />
<br />
<pre><br />
<!--signature ttest@smartsimple.com;SIGNER;Tony;Test;1;SmartSimple Software --><br />
<!--signature fake@smartsimple.com;SIGNER;Fake;Man;2;Fake Co. --><br />
<!--signature fake2@smartsimple.com;SIGNER;Fake2;Mann;3;Fake2 Co. --><br />
</pre><br />
<br />
[[Category:Integration]]<br />
[[Category:External Services]]<br />
[[Category: e-Signature]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Template:CurrentUpgradeDate&diff=37335Template:CurrentUpgradeDate2020-01-06T15:34:14Z<p>Ciaran: </p>
<hr />
<div>March 12th 2020</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Workflows_Overview&diff=37292Workflows Overview2019-12-05T13:09:28Z<p>Ciaran: </p>
<hr />
<div>=Overview=<br />
A Workflow is a set of repeatable steps used to automate and streamline your business processes within the system (e.g. creating review forms and notifying reviewers via email).<br />
<br />
Workflows are created through the Global Settings tab and can be associated with any entity within the system, such as UTA objects, folders, organizations or users.<br />
<br />
Workflows are constructed using two basic elements:<br />
<br />
* Tasks: define the actions required in the workflow – each task represents a single step in the process. Specific roles or specific users are associated with each task, and these people will be automatically alerted when they need to perform the action defined by that task. These actions are generally used to accept, reject, or request a revision on the associated object, file, user or some application-specific information.<br />
* Connectors: link tasks together, and provide for branching logic based on the user responses to the task or pre-set conditions.<br />
<br />
<br />
=Configuration – Essentials=<br />
==Create Workflow==<br />
First create and configure the workflow.<br />
<br />
Next add tasks and connectors.<br />
<br />
The tasks available are dependent on the Workflow Type, so specify the desired type before adding tasks.<br />
<br />
1. Click the Menu Icon and under the System Processes , click the Workflows link.<br />
<br />
2. The Workflows page is displayed. This includes the following tabs:<br />
<br />
3. Workflows – click this tab to see list of workflows. The list includes the name, description, workflow type, Trigger, System Call Identifier and date last updated. In the top right of the action bar is a Category drop down. The list of workflows displayed under the Workflows tab is dependent on the Workflow Category selected. Use the "All Workflows" option to see all workflows.<br />
<br />
* Tasks – click this tab to see a list of tasks for all workflows.<br />
* Outstanding Tasks – click this tab to see a list of outstanding tasks for all workflows. This is where the workflow in question has been triggered, and the task has been scheduled for future completion date<br />
<br />
[[Image:workflow2017_1.png|900px|border]]<br />
<br />
<br />
4. Click the New Workflow button to see the New Workflow page.<br />
<br />
[[Image:workflow2017_2.png|900px|border]]<br />
<br />
<br />
5. Populate the Name field with a suitable a descriptive name for the workflow, and the Description field with a suitable narrative description for the workflow.<br />
<br />
6. you attempt to connect the workflow to the object.<br />
<br />
The table below shows a list of available Workflow Types, the objects that each type is enabled on, and the Trigger When options as well as the Termination Trigger options.<br />
<br />
{| class="wikitable"<br />
|-<br />
!|Workflow Type<br />
!|Enabled On<br />
!|Trigger<br />
!|Termination<br />
|-<br />
||[[Recurring Workflow|Recurring]]<br />
||N/A<br />
||'''Activate''' button on Workflow<br />
||'''Deactivate''' button on Workflow<br />
|-<br />
||Company<br />
||Company or Branch<br />
||New or Modified company or Branch<br />
||N/A<br />
|-<br />
||User<br />
||Company or Branch<br />
||New or Modified user or contact<br />
||N/A<br />
|-<br />
||File<br />
||SmartFolder<br />
||New or Modified file in [[SmartFolder]]<br />
||N/A<br />
|-<br />
||Applicant Tracking<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Applicant Assignment<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Content Management<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Document Library<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Email Broadcast<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Costing<br />
||Job in Job Tracking or Applicant Tracking<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Tracking<br />
||Job in Job Tracking or Applicant Tracking<br />
||Job Status<br />
||Job Status<br />
|-<br />
||[[Sales Tracking]]<br />
||Opportunity<br />
||Opportunity Status<br />
||Opportunity Status<br />
|-<br />
||Smart Folders<br />
||N/A<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||[[Web Forms]]<br />
||Web Form<br />
||New or Modified Web Form<br />
||N/A<br />
|-<br />
| rowspan="2"|[[Universal Tracking Application]]<br /><span style="font-size: xx-small;">''Select the name of the relevant UTA''</span><br />
||UTA Template<br />
||Level 1 Status<br />
||Level 1 Status<br />
|-<br />
||[[Custom Field Type: Link – Single File|Single File]] or [[Custom Field Type: Link – Multiple Files|Multiple Files]] Custom Field<br /> <span style="font-size: xx-small;">''Note: Can be at any level within the selected [[UTA]]''</span><br />
||File upload<br /><span style="font-size: xx-small;">''Note: Within the workflow set '''Trigger When''' to ''' --Deactivate--'''''</span><br />
||N/A<br />
|-<br />
||Tracking Activities<br />
||UTA Template<br />
||Level 2 Status<br />
||Level 2 Status<br />
|-<br />
||Tracking Activity Assignment<br />
||UTA Template<br />
||Addition of Level 2 Contact<br />
||N/A<br />
|-<br />
||Tracking Sub-Activities<br />
||UTA Template<br />
||Level 3 Status<br />
||Level 3 Status<br />
|-<br />
||[[Transactions]]<br />
||Always available<br />
||Transaction Status<br />
||N/A<br />
|-<br />
||Notes<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||UTA Role Assignment<br />
||UTA Template<br />
||Contact Assignment at Level 1<br /><span style="font-size: xx-small;">(with the [[Role]] specified) </span><br />
||N/A<br />
|-<br />
||UTA Company Assignment<br />
||UTA Template<br />
||Company Assignment at Level 1<br />
||N/A<br />
|}<br />
<br />
7. Set the Trigger When option. This determines when a new instance of the workflow should be started. The options available, are determined by the Workflow Type (see Workflow Types table above). The available options include:.<br />
<br />
* The New option will only trigger when a new object is created.<br />
* The Modified option will trigger the workflow when an existing object is changed.<br />
* The On Demand option will trigger the workflow when called by a System Call or a browser script.<br />
* The Status Change option found on the Company and User Workflow Type, will expose the statuses for the relevant company/user. The workflow will trigger when the company/user status is changed and saved.<br />
* The Trigger When option will expose different options depending on the Workflow Type:<br />
** UTA specific statuses when Workflow Type is UTA specific (e.g. Universal Tracking Application, Tracking Activities, Tracking Sub-Activities). The workflow will trigger when UTA level 1, 2 or 3 is created or updated to the selected status.<br />
** Roles for assigning users or companies to an object when Workflow Type is User / Org assignment specific (e.g. UTA Role Assignment, UTA Company Assignment). The workflow will trigger when user/company is added to the object with the selected role.<br />
<br />
8. Set the Termination Trigger options if appropriate. This option is exposed for certain workflow types, including the UTA specific workflow types (see Workflow Types table above). If the entity changes to the status after the workflow has triggered, any Pending tasks are removed (not executed).<br />
<br />
9. Click the Save button. The workflow is saved and the Workflow ID is now populated. The following options appear in the action bar near the top of the screen:<br />
<br />
* Back/Recently Visited – click this button to return to pages previous accessed.<br />
* Workflows – click this button to return to the workflow list.<br />
* New Task – click this button to create a new workflow task.<br />
* Diagram – click this button to see a diagram view of the workflow.<br />
<br />
10. The following tabs are also now displayed:<br />
<br />
* Task – click this tab to view workflow task and to edit tasks. Tasks are steps within the workflow.<br />
* Pending Queue – click this tab to see a list of outstanding tasks for this workflow, you can delete tasks and reassign tasks to other contacts within the system.<br />
* History - click this tab to see a list of completed tasks for this workflow.<br />
<br />
==Create workflow tasks==<br />
Once you have created the workflow you can add tasks, each task automates and streamlines some action or step in your business processes.<br />
<br />
The process for adding a task to a workflow is as follows:<br />
<br />
1. Navigate to the desired workflow and click on the Tasks tab.<br />
<br />
2. Click the New task button in the action bar.<br />
<br />
3. The Task details are displayed, with a Task Number initially set to 100 and increasing in increments of 100 for each subsequent workflow task.<br />
<br />
[[Image:workflow2017_3.png|1000px|border]]<br />
<br />
<br />
4. Update Task Name then select the Task Type. The task type determines how the task should be processed. The available Task Types include:<br />
<br />
* '''Acknowledgement''' - use to generate a message such as an email to appropriate users.<br />
* '''Request for Approval''' - use to generate action requirements that need an approval. These action requirements display in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Request for Comment''' - use to generate comment requirements. These will be displayed in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Change Status''' - use to change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
* '''Create Consumer/Provider Link''' - use to create Consumer/Provider relationship without custom scripting.<br />
* '''Create New Activity''' - use in Universal Tracking Application workflows, to create Level 2 records.<br />
* '''Update Custom Field Value''' - use to update a custom field to an entered value.<br />
* '''Update Standard Field Value''' - use to update a standard field to an entered value.<br />
* '''Select User for Next Task''' - use to pre-select the user that is responsible for a task that immediately follows this task type. This is necessary for tasks that will trigger at a later date.<br />
* '''User Activation''' - use to activate a contact as a user and send the credentials in order to log in. This is useful for project-type work when you only wish to activate a user as part of a project.<br />
* '''Generate PDF File''' - use for automatic generation of a PDF that will be emailed to the person(s) designated in the workflow step.<br />
* '''People Association''' - use to add either pre-defined, or user selected, contact(s) to the contacts section of a Level 1 record with a given role.<br />
* '''Company Association''' - use to add either pre-defined, or user selected, companies to the Account section of a Level 1 record with a given category.<br />
* '''Activate/Deactivate User''' - use to set the access type of a user or remove access.<br />
* '''Update User Role''' - use to add or remove selected roles from a user.<br />
* '''Update Company Category''' - use to add or remove selected categories from a company.<br />
* '''Web Service - HTTP Request''' - use to send the HTTP Post web service request via a workflow step to retrieve a web service response.<br />
* '''Web Service - SOAP Message''' - use to pass information to a system outside of SmartSimple as a Web Services call.<br />
* '''Web Service - RESTful Request''' - use to consume Restful web service request via a workflow step to get/post a web service response.<br />
* '''Trigger Workflow''' - use to trigger a different workflow against a specified object.<br />
* '''Signority Submission''' - use to trigger Signority signing process.<br />
* '''Retrieve Latitude / Longitude''' - use to retrieve Latitude and Longitude values without need to save the object itself<br />
* '''Translate Field Values''' - use to automatically translate records and field values in the system<br />
<br />
<br />
The Task Types available will vary depending on the Workflow Type selected. The following matrix displays Workflow Task Types availability for Workflow Types.<br />
<br />
The following matrix displays which [[Workflow Task Types]] are available for which [[Workflow Types]].<br />
<br />
scope row Move Object<br />
<br />
{| border="1"<br />
|-<br />
! rowspan="2"|Workflow Task Type Available?<br />
! colspan="17" scope="col"|Workflow Types<br />
|-<br />
! scope="col"|[[Recurring Workflow|Recurring]]<br />
! scope="col"|Company<br />
! scope="col"|User<br />
! scope="col"|File<br />
! scope="col"|Applicant Tracking<br />
! scope="col"|Job Tracking<br />
! scope="col"|Sales Tracking<br />
! scope="col"|Smart Folders<br />
! scope="col"|Web Forms<br />
! scope="col"|Universal Tracking Application<br />
! scope="col"|Tracking Activities<br />
! scope="col"|Tracking Activity Assignment<br />
! scope="col"|Tracking Sub-Activities<br />
! scope="col"|Transactions<br />
! scope="col"|Notes<br />
! scope="col"|UTA Role Assignment<br />
! scope="col"|UTA Company Assignment<br />
|-<br />
! scope="row"|[[Workflow Task Type: Acknowledgement|Acknowledgement]]<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Activate/Deactivate User|Activate/Deactivate User]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Change Status|Change Status]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Create New Activity|Create New Activity]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Generate PDF File|Generate PDF File]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: PDF Merge|PDF Merge]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: People Association|People Association]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Approval|Request for Approval]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Comment|Request for Comment]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Select User for Next Task|Select User for Next Task]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Trigger Workflow|Trigger Workflow]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Custom Field Value|Update Custom Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Standard Field Value|Update Standard Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update User Role|Update User Role]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Company Category|Update Company Category]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: User Activation|User Activation]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - HTTP Request|Web Service - HTTP Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - SOAP Message|Web Service - SOAP Message]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - RESTful Request|Web Service - RESTful Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
<br />
|-<br />
! scope="row"|Retrieve Latitude / Longtitude<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|Translate Field Values<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|}<br />
<br />
5. Set the ''Name'' of the Task as appropriate.<br />
<br />
6. Populate the Description field if required.<br />
<br />
7. Click Save at the bottom of the page.<br />
NOTE: There are a number of other settings specific to the Task Type selected. These are covered in the individual entries specific to each Task Type within the Configuring - Advanced section.<br />
<br />
8. Click on the Back button to return to the Edit Workflow screen.<br />
<br />
[[Image:workflow2017_4.png|1100px|border]]<br />
<br />
9. The Task is listed, but without Connectors, the task will not be executed if the workflow is triggered.<br />
<br />
==Create Workflow Connectors==<br />
All tasks must be connected to other tasks or to the start and complete before they will execute.<br />
<br />
The connectors control when the next steps execute and control what the next steps are (based on defined conditions).<br />
<br />
1. Navigate to the desired workflow and click on the Task tab.<br />
<br />
2. Inside the list of tasks, click the New button in the row preceding the task you wish to connect. In the example below the preceding task may be the Start option, but it could also be a preceding Task.<br />
<br />
3. The New Connector modal window launches with number of options.<br />
<br />
[[Image:workflow201802_6.png|border]]<br />
<br />
<br />
The available options include:<br />
<br />
* '''Name''' - use to enter a descriptive name for the connector<br />
* '''Trigger Type''' - use to select Default or Expired options<br />
* '''Connect To''' - use to select what you want to connect. All tasks within the workflow appear, alongside the Start and Complete options. Also, there will be a list of other workflows in the system.<br />
* '''Trigger Date''' - use to define a trigger date. The connector triggers, when the date matches the selected date.<br />
** '''Trigger Date''' - The date the task is triggers.<br />
** '''Start Date''' - The date in the Start Date field of the record with which the workflow is associated.<br />
** '''End Date''' - The date in the End Date field of the record with which the workflow is associated.<br />
** '''Custom Date Field''' - The date in a selected custom field that stores date values.<br />
* '''Delay(s)''' - user can specify any delays based on the trigger date:<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Hour, then the task will trigger 1 hour after the defined Trigger Date.<br />
** If the value -1 entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours before the defined Trigger Date.<br />
* '''Trigger Time''' – allow relevant when a delay is scheduled with the Day option selected. The drop-downs to allow users to specify what time the task should be trigger.<br />
* '''Business Day Only''' - toggle on to take into account the normal working week, and statutory holidays when determining dates and delays.<br />
* '''Holiday Calendar Used''' - used to select a custom calendar. Holiday calendars can be created and used when you specify which days are Business Days for your community instead of using the predefined Business Days Only option.<br />
* '''Required Respondents''' - use to specify how many people must complete an action before the workflow moves to the next task.<br />
* '''Type Filter''' - lookup to select L1, L2, or L3 types, which will then act as the type condition<br />
* '''Status Filter''' - Lookup to select L1, L2, or L3 statuses, which will then act as the status condition<br />
* '''Condition''' - use to specify a logical condition that must be met before a connector triggers the next workflow task. Multiple connectors can be set up with mutually exclusive conditions to have branching logic on the workflow.<br />
<br />
<br />
4. Complete as appropriate and click Save at the bottom of the screen.<br />
<br />
5. Click the New button in the desired row for the task you wish to connect and connect to a proceeding task, the Complete option or to another workflow entirely. Click Save when finished.<br />
<br />
6. Go back to the General tab and click Save once all connectors have been defined. When the page refreshes then the connectors should be displayed.<br />
<br />
[[Image:workflow2017_7.png|1000px|border]]<br />
<br />
<br />
When you create a Workflow with a delay connector, the recipients of the subsequent task are processed at the time the workflow is triggered and NOT at the time it runs. In other words, the tasks on the workflow, such as generating an email, are processed before the delay, not at the end of the delay.<br />
<br />
If the recipients change between the time the workflow is initiated and the time it fires (based on the delay) the recipients will not be updated. To ensure recipients are evaluated at the time the workflow task fires, insert a blank task after the delay connector (i.e. an Acknowledgement workflow with no recipients), then flow into a new Workflow Task with the desired recipients.<br />
<br />
Example scenario:<br />
<br />
* A workflow is configured to wait 5 days and then mail all contacts attached to the Level 1 with role Reviewer.<br />
* That workflow is triggered against a specific Level 1 record which has three contacts in the contacts section with the role Reviewer.<br />
* After the workflow has been triggered, before the 5 days have gone by, two additional Reviewers are added to the contacts section, and one of the original three is removed.<br />
* If the Acknowledgement task is attached directly after the connector with the delay then the original three contacts will receive the email, even though they are no longer current.<br />
* If there is a blank workflow task following the connector with the delay, which flows into a workflow task configured to email all Level 1 contacts with the role Reviewer, then the four reviewers on the Level 1 record at the time the email is sent, will be emailed, rather than the original three reviewers.<br />
<br />
==Enable on Object==<br />
===Enable Workflow on Company/User===<br />
Workflows must be enabled against an organization before workflows will run against the organization itself, its sub-branches and the users within the organization and its sub-branches.<br />
<br />
If the current User has the Workflows - Attach Workflow to Company System Feature Permission enabled then they will see 2 drop-downs on an organization profile<br />
<br />
* '''Company Workflow''' - which lists all Workflows with a Workflow Type of Company. Only a single company workflow can be selected per Company<br />
* '''User Workflow''' - which lists all Workflows with a Workflow Type of User. Only a single User workflow can be selected per Company<br />
<br />
The way the selected Company workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new Company is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new Company is created, and when an existing Company is modified.<br />
<br />
The way the selected User workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new User or Contact is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new User/Contact is created, and when an existing User/Contact is modified.<br />
<br />
<br />
===Enable Workflow on Company/User Registration Page===<br />
This feature enables a Workflow to trigger on a Company/User registration page.<br />
<br />
An example use would be sending an email to an employee every time a new company registers so that they can verify the information entered for the company.<br />
<br />
Company/User registration Workflows will override other new and modified status-based Workflows. We recommended Workflows triggered from Sign Up pages be On Demand.<br />
<br />
Every sign-up page has an Attach Workflow drop-down menu where users can choose the Workflow they want triggered from the sign up page.<br />
<br />
<br />
<br />
===Enable Status-Driven Workflow on UTA===<br />
Status-driven workflows can be triggered from all levels of a UTA if Workflows have been enabled on the types . To enable workflows for a type do the following:<br />
<br />
1. In your desired UTA, click configuration Settings. Click on the level 1 tab, Click on Types. A list of types is displayed.<br />
<br />
2. Click the Edit button on the desired Type The template details are displayed.<br />
<br />
[[Image:workflow2017_8.png|500px|border]]<br />
<br />
<br />
3. To enable workflows for the Level 1 items, select Yes in the first workflow combo box.<br />
<br />
4. To enable workflows for the Level 2 and 3 activities, select Yes in the second workflow combo box.<br />
<br />
5. Click Save.<br />
<br />
Note: upon creation of new Templates, the Workflow combo boxes default to "Yes." Change these values to "No" in the case that you would like to disable workflows for this template at Level 1 and/or Level 2 and 3.<br />
<br />
<br />
<br />
===Enable Workflow on UTA Type===<br />
Level 1/2/3 Types can be configured to trigger a unique workflow whenever a new item using this template type is added.<br />
<br />
Go to configuration settings, choose the desired tab (level 1/2/3) click the types link, edit the desired type and click on the Template Page tab.<br />
<br />
In the Workflow drop-down, select the appropriate workflow and then click Save.<br />
<br />
<br />
<br />
===Enable UTA Role / Company Assignment Workflow on UTA===<br />
If you wish to trigger a UTA Role Assignment Workflow or a UTA Company Assignment Workflow from a UTA level one record then you must have configured the [[Types|Level 1 Type]] settings.<br />
<br />
Each Level One Type page has the following 2 options:<br />
<br />
* '''UTA Role Assignment Workflow''' - use to define one or more UTA Role Assignment Workflows that are triggered by this type .<br />
* '''UTA Company Assignment Workflow''' - use to define one or more UTA Company Assignment Workflows that are triggered by this type.<br />
<br />
<br />
===Enable Workflow on File Upload field===<br />
To trigger a workflow when a file is uploaded to a Link - Single File or Link - Multiple Files Custom Field scroll down to the File Options section. For Workflow on Upload select the desired workflow and save .<br />
<br />
If the file upload Custom Field is located at Level 2 or Level 3, you can select Tracking Activities or Tracking Sub-Activities Workflow Types.<br />
<br />
If the file Custom Field is located on a Company or User you can select Company or User Workflow Types.<br />
NOTE: The Workflow is only triggered when I file is uploaded, it is not triggered by file deletions.<br />
<br />
<br />
<br />
===Enable Workflow on SmartFolder===<br />
To trigger a workflow when a file is uploaded into a SmartFolder navigate to the desired SmartFolder.<br />
<br />
Click the Folder Settings button (looks like a gear).<br />
<br />
For Workflows select the desired work flow (all workflows of the Type File will be displayed) and click save.<br />
<br />
=Configuration – Advanced=<br />
==Suppress Workflow Window==<br />
When a workflow step is executed the user is generally presented with a Workflow window where they can select a value that will be used to determine the next task to be performed.<br />
<br />
This feature is vital for workflows that require user interventions, but is not required for workflows that are used to simply send an instant message or email message to one or more users.<br />
<br />
If the User has a pop-up stopper/blocker enabled within their browser, the Workflow Window will be suppressed and the Workflow will not trigger. You must ensure that users of workflows that prompt their<br />
<br />
Workflow Window, have enabled pop-up window display for your instance of SmartSimple.<br />
<br />
If you wish to suppress the display of this window you can change the workflow settings as follows:<br />
<br />
1. Go to the menu icon and under System Process click Workflows.<br />
<br />
2. Click the edit button on the desired Workflow.<br />
<br />
3. For Workflow Window enable the Suppress option.<br />
<br />
4. Click Save.<br />
NOTE: If you do not require a user interventions in your workflows it is recommended that the Workflow window be suppressed to ensure workflows execute as you may have little control over user browser settings.<br />
<br />
<br />
<br />
==Recurring Workflow==<br />
A recurring workflow is a Workflow that is not triggered against any particular object.<br />
<br />
A recurring workflows ability to use variables is limited, but recurring workflows are useful for tasks that recur at regular intervals, such as a weekly reminder e-mail.<br />
<br />
When using a recurring workflow, the tasks must be connected in a loop, and there must be at least one connector with a delay. Otherwise, the workflow would endlessly loop.<br />
<br />
If the workflow is set to look endlessly (without a delay), the system will automatically stop processing any workflows configured this way, after five loops.<br />
<br />
Once you have configured the Workflow, the Activate button can be used to start the workflow. Once activated, a Deactivate button will be visible that can be used to stop the workflow.<br />
<br />
If you wish to have a recurring workflow send an e-mail on a particular day or days of the month, you can use the following conditions:<br />
<br />
* date_format(now(),"%d")="01" - Will be true only on the 1st of the month<br />
* date_format(now(),"%d") in ("01","15") - Will be true on the 1st and 15th of the month.<br />
<br />
You will need to configure an empty task (i.e. an Acknowledgement with no recipients) to manage the branching based on the date, and an empty task to manage the one-day delay so the workflow will loop daily and connect to the task that sends the e-mail on the appropriate day(s).<br />
<br />
[[Image:workflow2017_9.png|1000px|border]]<br />
<br />
<br />
The Workflow Connectors attached to the "Empty Task for Branching" should have the following Conditions:<br />
<br />
[[Image:workflow2017_10.png|1000px|border]]<br />
<br />
<br />
<br />
==Task Type specific configuration==<br />
Each available task type represents a different type of action and has different configurations needs as a result.<br />
<br />
This section discusses the specific configuration needs for the different tasks types<br />
<br />
<br />
<br />
===Task Type: Acknowledgement===<br />
Acknowledgements use this Task to send messages to users in SmartSimple.<br />
<br />
Acknowledgement Tasks have the following settings:<br />
<br />
* '''Name''' - name for the task.<br />
* '''Task Type''' - manually set to Acknowledgment<br />
* '''Task Number''' - a system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location, but order or execution of tasks is determined by the Connectors.<br />
* '''Description''' - optional description of the task.<br />
* '''Expire After''' - intended duration of the workflow.<br />
{{Template:WorkflowMessageTemplate}}<br />
* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables.<br />
* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients. Only appears if workflow is UTA specific.<br />
* '''Routing: Role''' - Used to select recipients by role. This list includes all roles configured in the system, alongside the built-in roles that can be used in a workflow:<br />
*** The Originator role is used to reference the name of the person that started the workflow. This could be the person that submitted an expense claim, added a file to a workflow or added a new employee. :*The Initiator role is used to reference the name of the person that initiated the current task in the workflow. This refers to the person that approved the current step of an expense claim, or reviewed a document loaded into a workflow enabled Smart Folder.<br />
*** The Owner role is used to reference the user assigned as the Owner of the record.<br />
*** The People role is used to reference the user assigned as the Person on the level one. This role is only available to Level One specific tasks.<br />
*** The Assigned Users role is used to send messaging to users who are in the Assigned field of a Level Two activity. This role is only available for Level Two workflows.<br />
Once the role has been selected the following recipient choices are available:<br />
<br />
* <br />
*::* Let the current user select target user from this role – When the workflow is triggered, the user will be prompted to select recipients from the list of users currently in the role.<br />
*::* All Users of this role – The message will be sent to all users in the selected role.<br />
*::* Selectable list of users currently in the role – The message is sent to the specific users that are selected.<br />
* '''Routing: Selected Users''' - details of the users configured as Recipients in the Role section<br />
* '''Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
===Task Type: Activate/Deactivate User===<br />
This type of Workflow task is used to set the access type for a user or to deactivate a user.<br />
<br />
No message accompanies this workflow task. If you wish to notify users of a change in access type, for example to notify activated users of their password, you can configure an Acknowledgement type workflow task to follow this step in the workflow.<br />
<br />
Activate/Deactivate User Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Activate / Deactivate User.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - Sets the access type for the user against which the workflow is triggered. Options are:<br />
* '''Activate (Administrative or Portal Interface)''' - Provides access to the system to the extent permitted through the user's membership of specific roles.<br />
* '''Activate (User Centric or Applicant Interface)''' – Only provides access through the User Centric Interface and Applicant Tracking “career sites”.<br />
* '''Activate (Web Service Client Access)''' - Account type used to access data in a SmartSimple instance via an API (Application Programming Interface). Does not give access to SmartSimple interface directly.<br />
* '''Deactivate (No Access)''' – User cannot log into the system.<br />
<br />
===Task Type: Change Status===<br />
Change Status Workflow Task Types change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
<br />
Change Status Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Change Status<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Change Status To''' - lists statuses from the selected UTA level. This workflow task will change the status of the object that triggered the workflow to the selected status.<br />
<br />
===Task Type: Company Association===<br />
You can use the Company Association Workflow Task Type to automatically add, remove or update one or more companies to a Level 1 record. They will be assigned to the record with the UTA category defined in the "Roles will be assigned" setting.<br />
<br />
Company Association Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Company Association<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Variables for companies''' - Allows user to use syntax to reference the company IDs<br />
* '''Action''' - Add, update or delete the company association<br />
* '''Companies''' - use Lookup to select the Companies that will be added.<br />
* '''Roles will be Assigned''' - select the categories that you want the companies to be assigned with. To assign different companies with different categories, you will have to create more than one Company Association task.<br />
<br />
===Task Type: Create Consumer/Provider Link===<br />
Consumer/Provider Link Workflow Task Type creates Consumer/Provider relationships, and is only available to Level 1 and Level 2 workflows.<br />
<br />
Consumer/Provider Tasks have the following settings, all of which control how the target record is linked to the record triggering the workflow:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Connection Type''' - Select whether the link will be a Consumer or Provider<br />
* '''Connection Application''' - Select the UTA being connected<br />
* '''Connection Level''' - Choose the connection level (Level One or Level Two)<br />
* '''Object ID / Variable''' - Enter the Record ID (or a variable to obtain the Record ID of the object to connect to). It accepts semicolon separated lists.<br />
* '''Connection Role''' - Select the Consumer UTA Connection role to be used for the connection<br />
<br />
===Task Type: Create New Activity===<br />
You can use the Create New Activity Workflow Task Type to automatically create and attach one or more Level 2 records to a Level 1 record. This workflow can be driven by a Status change on the Level 1 record. The workflow will also trigger (in this sequence):<br />
<br />
1. Auto-assignments<br />
<br />
2. Level 2 Formulas<br />
<br />
3. Level 2 Workflows<br />
<br />
<br />
New Activity Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create New Activity<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional)<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Activity Scheduling Options''' - drop-down with 3 options (Disable, Schedule by Date and Amount, Schedule by Number of Activities) that can be used to create multiple instances of the Activity.<br />
<br />
: If '''Schedule by Date and Amount''' option is selected then following settings are exposed.<br />
::* '''Start Date''': Level 1 field used to set the start date of the activity scheduling period<br />
::* '''End Date''': Level 1 field used to set the end date of the activity scheduling period<br />
::* '''Schedule Every''': frequency of scheduling<br />
::* '''Total Amount''': Level 1 field used for the Total Amount to be distributed. The amount specified will be split evenly between each Level 2. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Date''': Level 2 field used to set the date to be assigned to each record based on the scheduling options."<br />
::* '''Activity Amount''': Level 2 field used to store the calculated amount for each record. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
: If '''Schedule by Number of Activities''' option is selected then following settings are exposed.<br />
::* '''Number of Activities''': Level 1 field used to set the number of activities to be created<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
'''Days Delay''' - Number in days of delay before creation of new activity. If left blank, the new activity will be created immediately.<br />
::* '''Create for Users in UTA Role''' - select the UTA Role of the users that the Peer Activity should be created against.<br />
::* '''Activity Type''' - This is where you specify which Level 2 Type you wish to create. If you select the Custom Field option then a Custom Field ID field is exposed.<br />
::* '''Custom Field ID''' - The Create New Activity workflow can be driven by a Custom Field. For example, you could have check boxes at Level 1 corresponding to various Level 2 Types. Selecting each check box would create and attach the relevant Level 2 activity type. You must first create a Custom Field on the Level 1 record which stores the typeid(s) of the Level 2 Types to be created. To create multiple Level 2 records use one of the Select many field types (e.g. Select Many – Check Boxes, Select Many – Scrolling Check Box, Select Many – List Box) and to create a single Level 2 record use the Select One – Combo Box.<br />
::* '''Activity Status''' - Allows you to define the Status for the newly created Level 2 record(s). Note: If that Level 2 Status has a workflow attached to it the workflow will be triggered at the point of creation of the Level 2 record.<br />
::* '''Reminder Type''' - You can select whether a Quick Message or reminder email will be sent out to the Owner or contacts attached to the record, or any combination of the above.<br />
::* '''Reminder Days''' - Sets delay for reminder message being sent.<br />
<br />
: <br />
===Task Type: Generate PDF File===<br />
Auto generation of a PDF that can be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field.<br />
The PDF generated must be based upon a Web Page View Custom Field. You must specify the Custom Field ID of the Web Page View to be converted in the Web Page Field ID field on the Workflow Task settings.<br />
<br />
: <br />
Multiple PDFs can be created and stored in a single Link - Multiple Files custom field using this workflow task type, by entering the Custom Field IDs of the Web Page View fields, separated by commas.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Web Page Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: PDF Merge===<br />
Will convert [[Custom Field Type: Special – MS Word Merge|Word Merge]] document to a PDF which can then be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field<br />
<br />
: <br />
The PDF generated must be based upon a [[Custom Field Type: Special – MS Word Merge|Word Merge]] Custom Field. You must specify the Custom Field ID of the MS Word Merge document to be converted in the MSWord Merge Field ID field on the Workflow Task settings.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''MSWord Merge Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: People Association===<br />
You can use the People Association Workflow Task Type to automatically add one or more contacts to a Level 1 record. They will be assigned to the record with the UTA role defined in the "Roles will be assigned" setting.<br />
<br />
People Association have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to People Association<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Action''': Add, update or delete the people association<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. This is discussed in greater detail in the Configuration – Advanced section.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to control role of user that will be associated.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to be associated<br />
::* '''Roles will be Assigned''' - select the role(s) that you want the contact(s) to be associated with. To assign different contacts with different roles, you will have to create more than one People Association task.<br />
In the Routing section select a Role currently possessed by the contact(s) you wish to add, whether this is a system role or a UTA role. You can then either select specific contacts or groups that will always be added to the Level 1 when the workflow is triggered, or you can choose Let current user select target user from this role to allow the person that triggers the workflow to select a contact to be added.<br />
Note:<br />
::** If you are allowing the current user to select target user Suppress Workflow Window must be off (not enabled) otherwise the workflow will not fire.<br />
::** If you are allowing the current user to select target user, the Workflow must be triggered by a status, and not by a script.<br />
::** Include a description, as the description will be presented to the user when they are asked to select the contact to be assigned.<br />
In order to notify the contact(s) that they have been assigned you can create a subsequent Acknowledgement Workflow Task to e-mail all contacts with the UTA role you selected.<br />
<br />
===Task Type: Request for Approval / Request for Comment===<br />
Both of these Workflow Task Types prompt users to review the work of others, and keep track of outstanding reviews on the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] page.<br />
<br />
The settings for both of these Workflow Task Types match those used for the Acknowledgment task except for 2 additional settings:<br />
<br />
:* '''Respondents''' - Indicates the number of respondents required for this approval.<br />
:* '''Allow Edit''' - Allows editing of the attached object.<br />
By default, a Request for Approval or Comment workflow task will move on to the next task (whether approved, rejected, etc.) as soon as the first recipient of the Workflow Task responds. The Respondents field allows a specific number of respondents to be required, which will keep the Request for Comment Task active until that number of respondents has replied.<br />
The Routing options field is used as part of the Request for Approval process. Users should enter appropriate options within the Routing Options section(Example: 10=approved;20=reject;30=Revise) and click Save.<br />
<br />
These Routing Options will then be available in the Trigger Type drop-down when configuring Connectors. It is suggested that each routing option should have a corresponding task so that the routing option can then be connected to an appropriate task.<br />
<br />
You must set the minimum number of respondents on the connector associated with each of the approval options.<br />
<br />
::* If you have selected three respondents on the Request for Approval Task, and the task should only pass if all three respondents click approve you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be one.<br />
::* If you have selected four respondents on the Request for Approval Task, and the task should only pass if three respondents click "Approve," you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be two.<br />
The system checks the connectors once the number of respondents on the task has been met, this behaviour is not configurable. The first connector the system checks will be taken if the requirements are met.<br />
You must ensure the Workflow Task is sent to enough people to meet the minimum number of respondents required, if you do not send the task to enough recipients the task would never complete.<br />
<br />
===Task Type: Select User for Next Task===<br />
This task type used to allow the current user to pre-select the user that is responsible for the task that immediately follows this task type.<br />
<br />
This is necessary for tasks that will trigger at a later date.<br />
<br />
For example, consider a Workflow that is triggered on the status of Escalated which is configured to send a reminder e-mail to a manager if the status has not changed for seven days. If the reminder e-mail workflow task has Let current user select target user from this role as the recipient the Workflow would fail. This is because the e-mail is triggered (seven days later) by the system, and there is no current user.<br />
<br />
The settings for this Workflow Task Types match those used for the Acknowledgment task. The only difference if that the Request with the Routing options.<br />
<br />
<br />
<br />
===Task Type: Signority Submission===<br />
You can use the Signority Submission Workflow Task Type to automatically trigger the Signority signing process via workflow.<br />
<br />
Signority Submission Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Signority Field''' - drop-down which lists all Signority enabled WPV fields for the entity the workflow is configured against.<br />
<br />
===Task Type: Trigger Workflow===<br />
You can use the Trigger Workflow tasks to trigger a different workflow.<br />
<br />
Trigger Workflow Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Trigger Workflow''' - Select the workflow that should be triggered from this dropdown menu.<br />
:* '''Record id / Variable''' - this setting should contain the unique record ID for the record against which the selected workflow should be triggered. This record ID can be referenced using variables.<br />
:*** Examples: If the workflow to be triggered is a User type workflow, you would need to provide a User ID for the contact record against which you would want the workflow to be triggered.<br />
:*** If the workflow is to be triggered against a series of Level 2s attached to a Level 1 record, you could use List Syntax to define a list of activities meeting certain criteria against which the workflow should be triggered.<br />
<br />
===Task Type: Update Company Category===<br />
Update User Role Workflow Task Types can add or remove categories from SmartSimple organizations.<br />
<br />
This task type is only available for "Company" workflows.<br />
<br />
Update Company Category Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove categories from the organization upon which the workflow is triggered.<br />
* '''Categories''' - select the categories that should be added or removed from the organization's profile.<br />
<br />
===Task Type: Update Custom Field Value===<br />
The Update Custom Field Value workflow task type can be used to write values to custom fields on the object against which the Workflow is triggered.<br />
<br />
These values can be hard-coded or they can use variables.<br />
<br />
You can also use MySQL syntax to manipulate values using sscalculation.<br />
<br />
Update Custom Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists custom fields across all UTAs from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
Note: If the field to be updated has the Read Only toggle enabled in the Formatting section of the field options (or a "read-only" HTML tag or "textreadonly" CSS class) the value will not update.<br />
* '''Update To Value''' - This workflow task will use this value to update the field selected in the "Use Field" setting. Variables can be used in the "Update To Value" setting as well as hard-coded values.<br />
<br />
===Task Type: Update Standard Field Value===<br />
The Update Standard Field Value workflow type can be used to write values to standard fields on the object against which the Workflow is triggered.<br />
<br />
Standard fields on the level 1, level 2, level 3, companies, contact and transaction can be updated using this method:<br />
<br />
Update Standard Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists standard fields from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
* '''Update To Value''' - accepts hard-coded values and variables. This workflow task will use this value to update the field selected in the "Use Field" setting.<br />
Note: Some standard fields (such as Type) require the ID, not the type name in order to update correctly.<br />
<br />
===Task Type: Update User Role===<br />
Update User Role Workflow Task Types can add or remove roles from SmartSimple contacts.<br />
<br />
This task type is only available for "User" workflows.<br />
<br />
Update User Role Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove roles from the contact upon which the workflow is triggered.<br />
* '''Roles''' - select the roles that should be added or removed from the contact's profile.<br />
<br />
===Task Type: Web Service - HTTP Request===<br />
This workflow task type is used to consume a [[APIs|web service]] via a workflow step. The web service will send the HTTP Post request to retrieve information. The response returned by the web service can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:HTTPPost.PNG|500px]]<br />
<br />
HTTP Post have the following settings:<br />
<br />
:* '''URL''' - endpoint of the HTTP Post web service<br />
:* '''User Name''' - username to access post location if needed<br />
:* '''Password''' - password to access post location if needed<br />
:* '''Parameters''' - free text field to pass in parameters such as apitoken , alias id, etc. Can include username and password if not specified in the specific fields<br />
:* '''Response Stores To''' - field on system where response from HTTP post can be stored<br />
<br />
===Task Type: Web Service – SOAP Message===<br />
The Web Service - SOAP Message Workflow Task allows you to post data to another system, outside of SmartSimple. The response returned by the external system can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:SOAP.png]]<br />
<br />
This Task type has the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Message Template: Action''' - The action to called by the Web Service call (These actions are defined by the external server, and are not part of SmartSimple)<br />
* '''Message Template: Custom Field ID for Response''' - The Custom Field ID of an XML custom field on the object that the Workflow was triggered against that the response returned by the external server.<br />
* '''Message Template: Email Message Header''' - The email header can be modified using the following syntax, with the arguments separated by semicolon:<br />
** X-Priority={1,2,3,4,5}<br />
** Priority={normal,urgent,non-urgent}<br />
** Importance={high,normal,low}<br />
** Sensitivity={personal,private,company,confidential}<br />
*: e.g. Priority=urgent;Importance=high<br />
** '''Message Template: Endpoint''' - The URL or IP address of the destination server<br />
** '''Message Template: Envelope Template''' - The content of the Web Service message to be sent to the external service. This can contain variables related to the object the workflow is triggered against.<br />
** '''Message Template: Attach Object''' - Attaches the details of the object to the message. In the case of a SmartSimple object, such as a company, person, or application, the textual details of the object will be added. If the object is a file, then the file will be attached to an e-mail message, but not an instant message.<br />
** '''Message Template: Attachment File IDs''' - Attach additional default files when triggered from a Smart Folder. See the Determining the File ID article for instructions.<br />
** '''Message Template: Save as Event''' - Email will be saved as an event.<br />
If the content from the custom fields being included within the SOAP message contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server.<br />
<br />
The less than symbol (<) and ampersand (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving system understands that they are data content and not part of the XML structure:<br />
<br />
:: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
For example, an address could contain ampersands, so it should be wrapped as follows:<br />
<br />
<pre>@firstname@@lastname@</pre><address> </address><br />
<br />
If the response to your Web Service call contains values that you wish to store within a Custom Field on the object against which the Workflow was triggered, you can connect a Update Custom Field Value Workflow Task to be the task following the Web Service - SOAP Message and use the variable syntax to pull the value from the XML Custom Field you selected to store the response to the Web Service call.<br />
<br />
For example, if the [[Custom Field Type: Special - XML Data|XML]] Custom Field that stores the response (custom field ID 155255 in the image above) is called '''Web Service Response''', the variable in the [[Update Custom Field Value]] task to pull a node called '''AssignedIdentifier''' could be:<br />
<br />
@xml.Web Service Response.soap:Body.AssignedIdentifier.nodevalue@<br />
<br />
If the response should be saved to a [[System Variable]], the syntax would be:<br />
<br />
@system.xml.''fieldname''.''nodename''.nodevalue@<br />
<br />
===Task Type: Web Service - RESTful Request===<br />
This workflow task type is used to consume a RESTful web service using GET or POST method.<br />
<br />
====RESTful Web Service Request using GET Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_GET.PNG|500px]]<br />
<br />
GET RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - resource of the web service<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====RESTful Web Service Request using POST Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_POST.PNG|500px]]<br />
<br />
POST RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - endpoint of the web service<br />
:* '''Request Body''' - data sent with the request.<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====Credentials of the RESTful Web Service Request====<br />
<!--89397 - Workflow Task Type: Web Service - RESTful Request --><br />
Credentials of the web service can be added in the Request Header in the format: Authorization=Basic [base64 encoded credentials].<br/><br />
A third party software can be used to convert the username/password to a base64 encoded credentials.<br/><br />
Note that all equal signs within the base64 credentials should be replaced with %3D.<br/><br />
Example:<br/><br />
FROM: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''='''</span><br/><br />
TO: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''%3D'''</span><br />
====Parsing JSON response====<br />
<!--67458 - Add GET/POST REST services workflow tasks that are compatible with JSON--><br />
Variable syntax is available to parse and retrieve values from JSON format data.<br/><br />
''Sample 1''<br />
<pre>FIELD_NAME: {"firstname":"John"}<br />
variable syntax: @json.FIELD_NAME.firstname@ <br />
result: John<br />
</pre><br />
''Sample 2''<br />
<br />
<pre>FIELD_NAME: {"primarycontact":{"firstname":"Thomas"}}<br />
variable syntax: @json.FIELD_NAME.primarycontact.firstname@ <br />
result: Thomas<br />
</pre><br />
''Sample 3''<br />
<br />
<pre>FIELD_NAME: {"users":[{"firstname":"Marie"},{"firstname":"Eve"}]}<br />
variable syntax: @json.FIELD_NAME.users.[# ~firstname~, #]@<br />
result: Marie, Eve<br />
</pre><br />
<br />
===Task Type: Translate Field Value===<br />
The Translate Field Value Workflow Task allows you to perform automatic translation of records and field values in the system. It will only apply to those custom fields that have [[Enable_Translation_Service|enabled translation services]].<br />
<br />
This Task type has the following settings:<br />
<br />
** '''Name''' - Narrative name for the task.<br />
** '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
** '''Description''' - Detailed description of the task (optional).<br />
** '''Translate to''' - set which language or languages to translate to for the custom fields that have enabled translation<br />
If a record has translation enabled and a stored field translation exist, there will be a "Show Translation Values" in the Options menu<br />
<br />
When shown, the translated field values will appear directly underneath the existing field value.<br />
<br />
If more than one translated language exist, there will be a language drop down appearing at the top of the record.<br />
<br />
==Importing and Exporting Workflow Tasks==<br />
Workflow Tasks can be exported and imported into other Workflows using the Import/Export function on the Edit Workflow page. This feature is particularly useful if you have created workflows for testing on your backup instance and wish to implement the finalized reports in your live system.<br />
<br />
The steps to export a workflow task or set of workflow tasks are as follows:<br />
<br />
[[Image:ExportWorkflow2017.png|1000px|border]]<br />
<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab and select the checkbox next to the workflow task(s) that you wish to export.<br />
<br />
2. Click on the Export button.<br />
<br />
3. A pop-up window will appear, containing the details of the tasks you have selected in XML format. Select all of the text in the pop-up window and save it to a text editing program, such as Notepad.<br />
<br />
Note that, if multiple tasks are selected, they will be delimited in the XML text block with the tag.<br />
<br />
<br />
The steps to '''import''' a workflow task or set of workflow tasks are as follows:<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab, then click on the Import button.<br />
<br />
2. A blank pop-up window will appear. Paste the XML data that you have exported into this window.<br />
<br />
3. Confirm your selection by clicking on the Import button at the bottom of the pop-up window.<br />
<br />
* The workflow tasks will be imported into the new workflow.<br />
* The Edit Workflow page will refresh to show the newly-added workflow tasks.<br />
<br />
==Workflow Condition==<br />
A logical statement can be added to workflow connectors in the Condition field, enabling you to specify which workflow task will be triggered.<br />
<br />
Example Branching Logic can be implemented to send an approval message to Senior Management when the request is over $100,000, while requests under $100,000 will take a different path when the workflow is triggered.<br />
<br />
<br />
[[Image:workflow2017_13.png|600px|border]]<br />
<br />
<br />
In general the Workflow Condition is used with several different connectors attached to a task. Collectively the conditions on each task should accommodate every possibility.<br />
<br />
Note: because the sequence in which the system accesses each connector is not configurable it is important that the conditions are mutually exclusive. For example, if you have 3 connectors for different paths based on a particular value the conditions could be:<br />
<br />
* "@Selection@"="Yes"<br />
* "@Selection@"="No"<br />
* "@Selection@"!="Yes" and "@Selection@"!="No"<br />
* The last statement could also be represented as "@Selection@" not in ("Yes","No")<br />
You can also use MySQL syntax to perform calculations within the Condition:<br />
* date_format(now(),"%d")="01"<br />
<br />
<br />
This condition will be true only on the 1st of the month. This could be used with a Recurring Workflow that loops daily if you wish to send out a summary e-mail on the 1st of every month.<br />
<br />
It is recommended that workflows with a loop include an empty task with 2 connectors with 2 separate conditions, one which goes back to the looped task and another which proceeds on to the next task, thus preventing an endless loop.<br />
<br />
Note: Other than values that are always numeric, all variables should be enclosed in double quotes.<br />
<br />
<br />
<br />
===Workflow Condition Examples===<br />
There are two rules that must be followed when adding multiple connectors to a workflow task that incorporate conditional logic statements:<br />
<br />
'''1. Collectively, the conditions on each task must accommodate every possible permutation'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@"="12345"'' and<br />
* ''"@typeid@"="45678"'', respectively<br />
<br />
If the workflow is fired against a record associated with typeID 67890, the workflow will never progress to the next task.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
As above, three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Three connectors are set up on a workflow task with conditions of:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"'',<br />
* ''"@typeid@"="45678"'' and<br />
* ''"@typeid@"="67890"'', respectively<br />
<br />
<br />
Alternatively, connectors with the following conditions could be set up:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"''<br />
* ''"@typeid@"!="12345"'' (not equal to "12345"), and<br />
* ''"@typeid@" NOT IN ("12345","45678")'', respectively<br />
<br />
<br />
'''2. Each condition must be mutually exclusive from every other'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two [[status]]es exist in the same application, with [[Determining the statusid|statusIDs]] of 888 and 999.<br />
<br />
The system administrator wishes to send emails via workflow if the record is in one of the above statuses. One email should be sent out if the type is 12345 or 45678 and a different email should be sent out if a different type has been used.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@statusid@" in ("888","999")''<br />
<br />
<br />
The issue here is that both statements [[Boolean Operators|evaluate]] as '''true''' if the statuses on the record triggering the workflow have a statusID of 888 or 999.<br />
<br />
The workflow process will not "know" which task to connect to. The workflow will progress, but not necessarily to the next intended workflow task. In other words, the wrong email may be sent.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
The types and statuses exist as above, and the system administrator wishes to configure the same branching logic.<br />
<br />
Two connectors should be set up on a workflow task with the following conditions:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@typeid@" not in ("12345","45678") AND "@statusid@" in ("888","999")''<br />
<br />
<br />
This configuration satisfies Rule #2, in that the conditions are now mutually exclusive. However, a third connector must be included, with the following condition, which connects to the "Complete" task, in order to satisfy Rule #1 above:<br />
<br />
* ''"@statusid@" not in ("888","999")''<br />
<br />
<br />
With these three connectors configured, the workflow will:<br />
<br />
* never not have instructions on ''whether'' to trigger the next workflow task (Rule #1), and<br />
* always have clear instructions on ''which'' task to trigger given a certain set of conditions (Rule #2).<br />
<br />
==Using iCalendar to generate Meeting Requests, Tasks and Contact cards==<br />
iCalendar is a file format that allows Internet users to send meeting requests, contacts and tasks through email and other digital methods.<br />
<br />
SmartSimple workflows support 3 email attachments types (ievent, itodo and icard).<br />
<br />
The SmartSimple email engine will look for email contents that have ievent, itodo, and icard objects. The contents of these objects are assembled and added as email attachments.<br />
<br />
The email engine will process iCalendar objects using the following syntax:<br />
<br />
* "@@ievent"<br />
* "@@itodo"<br />
* "@@icard"<br />
<br />
Simple sample iCalendar objects are shown below<br />
<br />
<br />
<br />
===ievent Object===<br />
Manifests as an ical attachment on the email.<br />
<br />
<pre><br />
<!--@ssattach(icalendar,vevent)--><br />
@@ievent<br />
UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DTSTART:TO_UTC(@startdate@ @starttime@)<br />
DTEND:TO_UTC(@enddate@ @endtime@)<br />
LOCATION:Room 1<br />
SUMMARY: Details to follow<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
instead of UTC you can specify the Time Zone for the DTSTART and DTEND as:<br />
<br />
<pre>DTSTART;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullstartdate@","%Y%m%dT%H%i%s"))--><br />
DTEND;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullenddate@","%Y%m%dT%H%i%s"))--><br />
</pre><br />
<br />
===itodo Object===<br />
<pre><br />
<!--@ssattach(icalendar,vtodo)--><br />
@@itodo<br />UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DUE:TO_UTC(@startdate@)<br />
STATUS:NEEDS-ACTIONLOCATION:Room 1<br />
SUMMARY: Meeting<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
<br />
===icard Object===<br />
<pre><br />
<!--@ssattach(icalendar,vcard)--><br />
@@icard<br />FN:@owner.fullname@<br />
ORG:@company@<br />TITLE:@name@<br />
TEL;TYPE=WORK,VOICE:@owner.phone@<br />
TEL;TYPE=HOME,VOICE:(404) 555-1212<br />
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=WORK:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America<br />
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=HOME:42 Plantation St.\nBaytown\, LA 30314\nUnited States of America<br />
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
==Trigger a Workflow from a Custom Browser Script==<br />
Workflows can be triggered based on a value in a custom field on the object using a browser script:<br />
<br />
_triggerwf(objectid,workflowid,Entity ID); <br />
<br />
The Entity ID should not be included for UTA Level 1 workflows<br />
<br />
You must first create the workflow. Once it has been created you need the [[Workflows_Overview#Determining_the_workflowid|Workflow ID]].<br />
<br />
In the browser script you would use triggerwf with the following syntax:<br /><br />
'''Level 1''': _triggerwf('@opportunityid@',''workflowid'');<br />
<br />
<br />
<br />
Example:<br />
<br />
_triggerwf('@opportunityid@',98765);<br />
<br />
'''Level 2''': _triggerwf('@eventid@',''workflowid'',26);<br />
<br />
Example:<br />
<br />
_triggerwf('@eventid@',98765,26);<br />
<br />
('''26''' is the objecttype for Level 2 activities, and will be the same for all Level 2 workflows)<br />
<br />
NOTE: For workflows triggered by a Browser Script within a UTA you should set Trigger When to --Deactivate-- rather than selecting a Status. This ensures that the workflow is only triggered when called by the script, and there is no risk of triggering it when a status changes.<br />
<br />
Notes:<br />
<br />
* You must not select Let current user select target user from this role for the Routing of workflows triggered by script, as they will not execute.<br />
* Because the workflow is triggered when the script executes it happens before the record is saved. If the workflow changes the Status or a Custom Field value, when the record on the screen is actually saved it will overwrite any changes made by the workflow by those on the page that is being saved. Accordingly you should include any Status or Custom Field changes within the JavaScript that triggers the Workflow.<br />
* If this function is called with a button on a page where standard libraries are not included, make sure to include /js/sstools.js (Example:<script src="js/sstools.js" type="text/javascript"></script>).<br />
<br />
==Using variables with workflows==<br />
===Pass parameters when workflow triggers another workflow===<br />
If a workflow is triggered from another workflow, you can reference a value from the object that triggers the previous workflow (e.g. if a L3 workflow triggers a L2 workflow, you can reference any value from the L3 object from within the L2 workflow). The syntax is as below:<br />
<br />
@triggerobject.FIELDNAME@<br />
<br />
This syntax should work when generating an email, and when used in the connectors as a condition.<br />
<br />
It should also work when using a Trigger Workflow task, and when a Task Connector is linked directly to the workflow.<br />
<br />
===Using variable syntax to select recipients for workflow tasks===<br />
The recipient of workflows (selected in the Acknowledgement, Request for Comment and Request for Approval task types) can be defined using [[Variable List|variable syntax]], rather than being limited to the list by role.<br />
<br />
The benefits to using this approach is, you can send to multiple roles at the same time, rather than having to configure different tasks for each role.<br />
<br />
It also allows you to filter recipients based on a custom field on the contact, or UTA Contact Role Based custom field(s).<br />
<br />
To enable this feature, click on the "Use Variable for Recipients" checkbox under the "Routing" header in the workflow task and then use variables to reference the relevant user.<br />
<br />
<br />
<br />
===Notes Workflow===<br />
The following variables can be used in Notes Workflows:<br />
<br />
@notes@ - the body of the note<br />
<br />
To reference fields found on the associated Level 1, Level 2, Level 3, contact or organization record:<br />
<br />
@parent.fieldname@ or @parent.#fieldID#@<br />
<br />
For Notes at Level 2 you can reference fields on Level 1 using:<br />
<br />
@parent.parent.fieldname@ or @parent.parent.#fieldID#@<br />
The same syntax can be used to call Level 2 fields for Notes at Level 3<br />
<br />
To call Level 1 fields for notes on Level 3:<br />
<br />
@parent.parent.parent.fieldname@ or @parent.parent.parent.#fieldid#@<br />
<br />
Using the "Variable processed recipients" feature of Workflow Tasks, you can direct a Notes Workflow to the contacts on the record to which the note is attached, using the @parent.owner.userid@ or @parent.[#(?object=contact)~userid~,#]@ syntaxes.<br />
<br />
<br />
<br />
===Password Variables===<br />
Different [[Password|password]] [[Variables|variables]] can be used depending on the [[Workflow|workflow]] task type.<br />
<br />
[[UTA]] Activation task type uses @password@<br />
<br />
Acknowledgment task type uses @randompassword@ or @checkactivatedpassword@<br />
<br />
<br />
'''Task Type: User Activation'''<br />
<br />
* @password@ - Checks if the user is activated<br />
** if the [[User|user]] is not activated then generates a new random [[Password|password]] (i.e. Your password is: ABCDEFGH)<br />
** if the [[User|user]] is activated then sends the text "current password" (i.e. Password is: current password)<br />
'''Task Type: Acknowledgment'''<br />
** @randompassword@ - generates a new random [[Password|password]]<br />
** @checkactivatedpassword@ - checks if the [[User|user]] is activated<br />
*** if the [[User|user]] is not activated then generates a new random [[Password|password]]<br />
*** if the [[User|user]] is activated then sends the text "existing password" (see '''Notes''' below)<br />
Because of the complex nature of the password creation and validation process it is not possible to automatically translate '''existing password''' into other languages. If you are sending an e-mail containing the @checkactivatedpassword@ variable you can use the following syntax to display text other than "existing password" if required.<br />
* <br />
<br />
For example, for an existing user the following will show the French translation of '''existing password''' which is '''Mot de passe courant'''. If the user has not been previously activated the syntax will provide a randomly generated password as normal:<br />
<br />
<pre><br />
<!--@sscalculation(if(trim("@checkactivatedpassword@")="existing password","Mot de passe courant","@checkactivatedpassword@"))--><br />
</pre><br />
<br />
{{WorkflowTaskTypeCCEmailSyntaxOptions}}<br />
<!--sendnoto sendnotto Sendnotto sendasto reply-to replyto--><br />
<br />
=Using workflows=<br />
==Searching or Sorting Workflows==<br />
To access the workflows list, click the menu icon in the action bar, followed by the Workflows link in the System Process section.<br />
<br />
The following tabs are also displayed:<br />
<br />
* '''Workflows''' – click this tab to see list of workflows.<br />
* '''Tasks''' – click this tab to see a list of tasks for all workflows.<br />
* '''Outstanding Tasks''' – click this tab to see a list of outstanding tasks for all workflows.<br />
Each of these tabs has search and sort options, to allow quick and easy location of workflows and tasks.<br />
The steps for '''searching''' are as follows:<br />
<br />
<br />
1. Go to the tab that you wish to search against.<br />
<br />
2. Click into the search criteria field to select the list view column to search against.<br />
<br />
3. Enter in appropriate criteria.<br />
<br />
4. Click on the Search button to run the search or click on the X (clear button) to clear the criteria.<br />
<br />
5. All matching results will be listed, as well as filter criteria.<br />
<br />
<br />
<br />
The steps for '''sorting''' are as follows:<br />
<br />
1. Click the column header on the column you wish to sort. First click sorts ascending (going up example 1,2,3).<br />
<br />
2. Second click sorts descending (going down example 3,2,1)<br />
<br />
3. Third click returns to the default sort order.<br />
<br />
==Workflow Requests==<br />
Workflow Requests are generated by Request for Approval / Request for Comment workflow tasks.<br />
<br />
The Workflow Requests page lists:<br />
<br />
* outstanding tasks that you need to complete based on SmartSimple [[workflows]],<br />
* tasks that other people need to complete where you are participating in some steps in the workflow, and<br />
* project tasks that you are assigned to complete.<br />
The request will be listed under the '''Requests to me''' link.<br />
1. Click the '''Communications''', Workflow Requests link. The Workflow task is displayed.<br />
<br />
2. Click the '''Task type''', '''File''' link. The Workflow step is displayed with the following fields in the request:<br />
<br />
* '''Task Name''' – The name of the [[Workflow|workflow]] task.<br />
* '''Created Date''' – The date the task was triggered.<br />
* '''Task Description''' – The description of the task’s purpose.<br />
* '''Action''' – The '''Routing Options''' for the request. These options are only visible for '''Requests For Approval'''.<br />
* '''Comments''' – This box is always visible but can only be used with '''Request For Comments'''.<br />
* '''Object Area''' – The bottom portion of the request screen where the attached object is displayed.<br />
3. Select '''Approve''' to approve the file and click the '''Submit''' button. The '''Approve''' option requires us to select a [[User|user]] to send the approval message to so the '''Select User''' list is displayed.<br />
4. Select the [[User|user]] to receive the approval message and click the '''Submit''' button. The step is complete and the Workflow is also complete. The '''workflow complete''' message is displayed.<br />
<br />
5. Click the '''Communications''', '''Workflow Requests''' button. The [[Workflow|workflow]] is removed from the '''Request to Me''' window.<br />
<br />
==Workflow Diagram==<br />
Clicking on the Diagram button in the action bar of the Edit Workflow page will bring up a graphical representation of the Workflow Tasks that have been configured on that workflow.<br />
<br />
System Administrators use this feature to document and troubleshoot complicated workflow configurations.<br />
<br />
[[Image:workflow2017_17.png|border]]<br />
<br />
<br />
<br />
==Workflow Pending Queue==<br />
On the Edit Workflow page, the Pending Queue tab shows all instances where the workflow in question has been triggered, and the task has been scheduled for future completion.<br />
<br />
The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
[[Image:workflow2017_18.png|900px|border]]<br />
<br />
<br />
<br />
==Workflow History==<br />
In the Edit Workflow page, the history of an individual Workflow can also be accessed by the History tab.<br />
<br />
This page shows all instances of the workflow being triggered. The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
<br />
<br />
==Workflows Triggered by a Given Entity==<br />
The Workflow History tab is made visible for a given Universal Tracking Application™ by enabling the relevant Manager Permission. Go to UTA – Settings – Security, click on Feature and Function Permissions.<br />
<br />
The Enable Workflow History setting is found on the Feature tab.<br />
<br />
Enabling the Manager Permission will enable the Workflow History section from the Option drop-down on Level 1, Level 2 and Level 3 records.<br />
<br />
[[Image:workflow2017_19.png|border]]<br />
<br />
<br />
Clicking on the Workflow History tab will display the history of workflows triggered on the entity.<br />
<br />
[[Image:workflow2017_20.png|border]]<br />
<br />
<br />
<br />
==Configure System to display Workflow options==<br />
The user creating the workflow must have permission to set company workflow trigger.<br />
<br />
Go to Global settings – Security – System Feature Permissions , go to the Action Permission tab and scroll down to the Workflows - Attach Workflow to Company setting.<br />
<br />
There should be a Lookup button to select the roles that should be allowed to attach the workflow.<br />
<br />
Once the role is selected, the options will display in the edit company view.<br />
<br />
[[Image:workflow2017_21.png|border]]<br />
<br />
<br />
<br />
==Reasons workflow messages aren't arriving==<br />
Some common reasons for workflow messages not arriving are:<br />
<br />
# Your [[Browser|browser]] has a pop-up blocker.<br />
# [[Workflow|Workflows]] are not enabled.<br />
# There is another [[Workflow|workflow]] triggering on the same status.<br />
# Your [[Workflow|workflow]] is not configured properly.<br />
Solution to:<br />
# Allow [[SmartSimple]] as a trusted site '''''or''''' check your [[Browser|browser]] for any tool bars that may be blocking the pop-ups '''''or''''' set the [[Workflow|workflows]] to [[Workflow - Silent Mode|suppress pop-ups]].<br />
# Typically in [[UTA]]s, you will need to edit the ''template'' and enable [[Workflow|workflows]] for the level at which they are being triggered.<br />
# You will need to review the other [[Workflow|workflows]] to make sure that two [[Workflow|workflows]] are not triggering on the same status.<br />
# You will need to review the configuration of the [[Workflow|workflows]] to ensure that the connectors are set appropriately as well as the individual tasks that are to take place.<br />
<br />
==Determining the Workflow ID==<br />
Once a workflow has been created, the workflow ID (''wfid'') can be found as follows:<br />
<br />
* Click on the hyperlink for [[Global Settings]]<br />
* Go System tab, click on the hyperlink for ''Workflows''<br />
* The workflow ID is visible as the right-most column on the list of workflows.<br />
Alternatively:<br />
* Click on the Edit workflow icon for the Workflow you want, and the Workflow ID will be at the top of the page:<br />
<br />
[[Category:System Management]][[Category:Workflows]][[Category:Applications]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Workflows_Overview&diff=37291Workflows Overview2019-12-05T13:08:07Z<p>Ciaran: </p>
<hr />
<div>=Overview=<br />
A Workflow is a set of repeatable steps used to automate and streamline your business processes within the system (e.g. creating review forms and notifying reviewers via email).<br />
<br />
Workflows are created through the Global Settings tab and can be associated with any entity within the system, such as UTA objects, folders, organizations or users.<br />
<br />
Workflows are constructed using two basic elements:<br />
<br />
* Tasks: define the actions required in the workflow – each task represents a single step in the process. Specific roles or specific users are associated with each task, and these people will be automatically alerted when they need to perform the action defined by that task. These actions are generally used to accept, reject, or request a revision on the associated object, file, user or some application-specific information.<br />
* Connectors: link tasks together, and provide for branching logic based on the user responses to the task or pre-set conditions.<br />
<br />
<br />
=Configuration – Essentials=<br />
==Create Workflow==<br />
First create and configure the workflow.<br />
<br />
Next add tasks and connectors.<br />
<br />
The tasks available are dependent on the Workflow Type, so specify the desired type before adding tasks.<br />
<br />
1. Click the Menu Icon and under the System Processes , click the Workflows link.<br />
<br />
2. The Workflows page is displayed. This includes the following tabs:<br />
<br />
3. Workflows – click this tab to see list of workflows. The list includes the name, description, workflow type, Trigger, System Call Identifier and date last updated. In the top right of the action bar is a Category drop down. The list of workflows displayed under the Workflows tab is dependent on the Workflow Category selected. Use the "All Workflows" option to see all workflows.<br />
<br />
* Tasks – click this tab to see a list of tasks for all workflows.<br />
* Outstanding Tasks – click this tab to see a list of outstanding tasks for all workflows. This is where the workflow in question has been triggered, and the task has been scheduled for future completion date<br />
<br />
[[Image:workflow2017_1.png|900px|border]]<br />
<br />
<br />
4. Click the New Workflow button to see the New Workflow page.<br />
<br />
[[Image:workflow2017_2.png|900px|border]]<br />
<br />
<br />
5. Populate the Name field with a suitable a descriptive name for the workflow, and the Description field with a suitable narrative description for the workflow.<br />
<br />
6. you attempt to connect the workflow to the object.<br />
<br />
The table below shows a list of available Workflow Types, the objects that each type is enabled on, and the Trigger When options as well as the Termination Trigger options.<br />
<br />
{| class="wikitable"<br />
|-<br />
!|Workflow Type<br />
!|Enabled On<br />
!|Trigger<br />
!|Termination<br />
|-<br />
||[[Recurring Workflow|Recurring]]<br />
||N/A<br />
||'''Activate''' button on Workflow<br />
||'''Deactivate''' button on Workflow<br />
|-<br />
||Company<br />
||Company or Branch<br />
||New or Modified company or Branch<br />
||N/A<br />
|-<br />
||User<br />
||Contact or User<br />
||New or Modified user or contact<br />
||N/A<br />
|-<br />
||File<br />
||SmartFolder<br />
||New or Modified file in [[SmartFolder]]<br />
||N/A<br />
|-<br />
||Applicant Tracking<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Applicant Assignment<br />
||Always Available<br />
||Assignment Status<br />
||Assignment Status<br />
|-<br />
||Content Management<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Document Library<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Email Broadcast<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Costing<br />
||Job in Job Tracking or Applicant Tracking<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||Job Tracking<br />
||Job in Job Tracking or Applicant Tracking<br />
||Job Status<br />
||Job Status<br />
|-<br />
||[[Sales Tracking]]<br />
||Opportunity<br />
||Opportunity Status<br />
||Opportunity Status<br />
|-<br />
||Smart Folders<br />
||N/A<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||[[Web Forms]]<br />
||Web Form<br />
||New or Modified Web Form<br />
||N/A<br />
|-<br />
| rowspan="2"|[[Universal Tracking Application]]<br /><span style="font-size: xx-small;">''Select the name of the relevant UTA''</span><br />
||UTA Template<br />
||Level 1 Status<br />
||Level 1 Status<br />
|-<br />
||[[Custom Field Type: Link – Single File|Single File]] or [[Custom Field Type: Link – Multiple Files|Multiple Files]] Custom Field<br /> <span style="font-size: xx-small;">''Note: Can be at any level within the selected [[UTA]]''</span><br />
||File upload<br /><span style="font-size: xx-small;">''Note: Within the workflow set '''Trigger When''' to ''' --Deactivate--'''''</span><br />
||N/A<br />
|-<br />
||Tracking Activities<br />
||UTA Template<br />
||Level 2 Status<br />
||Level 2 Status<br />
|-<br />
||Tracking Activity Assignment<br />
||UTA Template<br />
||Addition of Level 2 Contact<br />
||N/A<br />
|-<br />
||Tracking Sub-Activities<br />
||UTA Template<br />
||Level 3 Status<br />
||Level 3 Status<br />
|-<br />
||[[Transactions]]<br />
||Always available<br />
||Transaction Status<br />
||N/A<br />
|-<br />
||Notes<br />
||Always Available<br />
||New, Modified and On Demand<br />
||N/A<br />
|-<br />
||UTA Role Assignment<br />
||UTA Template<br />
||Contact Assignment at Level 1<br /><span style="font-size: xx-small;">(with the [[Role]] specified) </span><br />
||N/A<br />
|-<br />
||UTA Company Assignment<br />
||UTA Template<br />
||Company Assignment at Level 1<br />
||N/A<br />
|}<br />
<br />
7. Set the Trigger When option. This determines when a new instance of the workflow should be started. The options available, are determined by the Workflow Type (see Workflow Types table above). The available options include:.<br />
<br />
* The New option will only trigger when a new object is created.<br />
* The Modified option will trigger the workflow when an existing object is changed.<br />
* The On Demand option will trigger the workflow when called by a System Call or a browser script.<br />
* The Status Change option found on the Company and User Workflow Type, will expose the statuses for the relevant company/user. The workflow will trigger when the company/user status is changed and saved.<br />
* The Trigger When option will expose different options depending on the Workflow Type:<br />
** UTA specific statuses when Workflow Type is UTA specific (e.g. Universal Tracking Application, Tracking Activities, Tracking Sub-Activities). The workflow will trigger when UTA level 1, 2 or 3 is created or updated to the selected status.<br />
** Roles for assigning users or companies to an object when Workflow Type is User / Org assignment specific (e.g. UTA Role Assignment, UTA Company Assignment). The workflow will trigger when user/company is added to the object with the selected role.<br />
<br />
8. Set the Termination Trigger options if appropriate. This option is exposed for certain workflow types, including the UTA specific workflow types (see Workflow Types table above). If the entity changes to the status after the workflow has triggered, any Pending tasks are removed (not executed).<br />
<br />
9. Click the Save button. The workflow is saved and the Workflow ID is now populated. The following options appear in the action bar near the top of the screen:<br />
<br />
* Back/Recently Visited – click this button to return to pages previous accessed.<br />
* Workflows – click this button to return to the workflow list.<br />
* New Task – click this button to create a new workflow task.<br />
* Diagram – click this button to see a diagram view of the workflow.<br />
<br />
10. The following tabs are also now displayed:<br />
<br />
* Task – click this tab to view workflow task and to edit tasks. Tasks are steps within the workflow.<br />
* Pending Queue – click this tab to see a list of outstanding tasks for this workflow, you can delete tasks and reassign tasks to other contacts within the system.<br />
* History - click this tab to see a list of completed tasks for this workflow.<br />
<br />
==Create workflow tasks==<br />
Once you have created the workflow you can add tasks, each task automates and streamlines some action or step in your business processes.<br />
<br />
The process for adding a task to a workflow is as follows:<br />
<br />
1. Navigate to the desired workflow and click on the Tasks tab.<br />
<br />
2. Click the New task button in the action bar.<br />
<br />
3. The Task details are displayed, with a Task Number initially set to 100 and increasing in increments of 100 for each subsequent workflow task.<br />
<br />
[[Image:workflow2017_3.png|1000px|border]]<br />
<br />
<br />
4. Update Task Name then select the Task Type. The task type determines how the task should be processed. The available Task Types include:<br />
<br />
* '''Acknowledgement''' - use to generate a message such as an email to appropriate users.<br />
* '''Request for Approval''' - use to generate action requirements that need an approval. These action requirements display in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Request for Comment''' - use to generate comment requirements. These will be displayed in the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] area.<br />
* '''Change Status''' - use to change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
* '''Create Consumer/Provider Link''' - use to create Consumer/Provider relationship without custom scripting.<br />
* '''Create New Activity''' - use in Universal Tracking Application workflows, to create Level 2 records.<br />
* '''Update Custom Field Value''' - use to update a custom field to an entered value.<br />
* '''Update Standard Field Value''' - use to update a standard field to an entered value.<br />
* '''Select User for Next Task''' - use to pre-select the user that is responsible for a task that immediately follows this task type. This is necessary for tasks that will trigger at a later date.<br />
* '''User Activation''' - use to activate a contact as a user and send the credentials in order to log in. This is useful for project-type work when you only wish to activate a user as part of a project.<br />
* '''Generate PDF File''' - use for automatic generation of a PDF that will be emailed to the person(s) designated in the workflow step.<br />
* '''People Association''' - use to add either pre-defined, or user selected, contact(s) to the contacts section of a Level 1 record with a given role.<br />
* '''Company Association''' - use to add either pre-defined, or user selected, companies to the Account section of a Level 1 record with a given category.<br />
* '''Activate/Deactivate User''' - use to set the access type of a user or remove access.<br />
* '''Update User Role''' - use to add or remove selected roles from a user.<br />
* '''Update Company Category''' - use to add or remove selected categories from a company.<br />
* '''Web Service - HTTP Request''' - use to send the HTTP Post web service request via a workflow step to retrieve a web service response.<br />
* '''Web Service - SOAP Message''' - use to pass information to a system outside of SmartSimple as a Web Services call.<br />
* '''Web Service - RESTful Request''' - use to consume Restful web service request via a workflow step to get/post a web service response.<br />
* '''Trigger Workflow''' - use to trigger a different workflow against a specified object.<br />
* '''Signority Submission''' - use to trigger Signority signing process.<br />
* '''Retrieve Latitude / Longitude''' - use to retrieve Latitude and Longitude values without need to save the object itself<br />
* '''Translate Field Values''' - use to automatically translate records and field values in the system<br />
<br />
<br />
The Task Types available will vary depending on the Workflow Type selected. The following matrix displays Workflow Task Types availability for Workflow Types.<br />
<br />
The following matrix displays which [[Workflow Task Types]] are available for which [[Workflow Types]].<br />
<br />
scope row Move Object<br />
<br />
{| border="1"<br />
|-<br />
! rowspan="2"|Workflow Task Type Available?<br />
! colspan="17" scope="col"|Workflow Types<br />
|-<br />
! scope="col"|[[Recurring Workflow|Recurring]]<br />
! scope="col"|Company<br />
! scope="col"|User<br />
! scope="col"|File<br />
! scope="col"|Applicant Tracking<br />
! scope="col"|Job Tracking<br />
! scope="col"|Sales Tracking<br />
! scope="col"|Smart Folders<br />
! scope="col"|Web Forms<br />
! scope="col"|Universal Tracking Application<br />
! scope="col"|Tracking Activities<br />
! scope="col"|Tracking Activity Assignment<br />
! scope="col"|Tracking Sub-Activities<br />
! scope="col"|Transactions<br />
! scope="col"|Notes<br />
! scope="col"|UTA Role Assignment<br />
! scope="col"|UTA Company Assignment<br />
|-<br />
! scope="row"|[[Workflow Task Type: Acknowledgement|Acknowledgement]]<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Activate/Deactivate User|Activate/Deactivate User]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Change Status|Change Status]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Create New Activity|Create New Activity]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Generate PDF File|Generate PDF File]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: PDF Merge|PDF Merge]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: People Association|People Association]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Approval|Request for Approval]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Request for Comment|Request for Comment]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Select User for Next Task|Select User for Next Task]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Trigger Workflow|Trigger Workflow]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Custom Field Value|Update Custom Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Standard Field Value|Update Standard Field Value]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update User Role|Update User Role]]<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Update Company Category|Update Company Category]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: User Activation|User Activation]]<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - HTTP Request|Web Service - HTTP Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - SOAP Message|Web Service - SOAP Message]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|[[Workflow Task Type: Web Service - RESTful Request|Web Service - RESTful Request]]<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
<br />
|-<br />
! scope="row"|Retrieve Latitude / Longtitude<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|-<br />
! scope="row"|Translate Field Values<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{yes}}<br />
||{{yes}}<br />
||{{no}}<br />
||{{no}}<br />
||{{no}}<br />
|}<br />
<br />
5. Set the ''Name'' of the Task as appropriate.<br />
<br />
6. Populate the Description field if required.<br />
<br />
7. Click Save at the bottom of the page.<br />
NOTE: There are a number of other settings specific to the Task Type selected. These are covered in the individual entries specific to each Task Type within the Configuring - Advanced section.<br />
<br />
8. Click on the Back button to return to the Edit Workflow screen.<br />
<br />
[[Image:workflow2017_4.png|1100px|border]]<br />
<br />
9. The Task is listed, but without Connectors, the task will not be executed if the workflow is triggered.<br />
<br />
==Create Workflow Connectors==<br />
All tasks must be connected to other tasks or to the start and complete before they will execute.<br />
<br />
The connectors control when the next steps execute and control what the next steps are (based on defined conditions).<br />
<br />
1. Navigate to the desired workflow and click on the Task tab.<br />
<br />
2. Inside the list of tasks, click the New button in the row preceding the task you wish to connect. In the example below the preceding task may be the Start option, but it could also be a preceding Task.<br />
<br />
3. The New Connector modal window launches with number of options.<br />
<br />
[[Image:workflow201802_6.png|border]]<br />
<br />
<br />
The available options include:<br />
<br />
* '''Name''' - use to enter a descriptive name for the connector<br />
* '''Trigger Type''' - use to select Default or Expired options<br />
* '''Connect To''' - use to select what you want to connect. All tasks within the workflow appear, alongside the Start and Complete options. Also, there will be a list of other workflows in the system.<br />
* '''Trigger Date''' - use to define a trigger date. The connector triggers, when the date matches the selected date.<br />
** '''Trigger Date''' - The date the task is triggers.<br />
** '''Start Date''' - The date in the Start Date field of the record with which the workflow is associated.<br />
** '''End Date''' - The date in the End Date field of the record with which the workflow is associated.<br />
** '''Custom Date Field''' - The date in a selected custom field that stores date values.<br />
* '''Delay(s)''' - user can specify any delays based on the trigger date:<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours after the defined Trigger Date.<br />
** If the value 1 is entered, and use selects the time frame of Hour, then the task will trigger 1 hour after the defined Trigger Date.<br />
** If the value -1 entered, and use selects the time frame of Day with no Trigger Time selected, then the task will trigger 24 hours before the defined Trigger Date.<br />
* '''Trigger Time''' – allow relevant when a delay is scheduled with the Day option selected. The drop-downs to allow users to specify what time the task should be trigger.<br />
* '''Business Day Only''' - toggle on to take into account the normal working week, and statutory holidays when determining dates and delays.<br />
* '''Holiday Calendar Used''' - used to select a custom calendar. Holiday calendars can be created and used when you specify which days are Business Days for your community instead of using the predefined Business Days Only option.<br />
* '''Required Respondents''' - use to specify how many people must complete an action before the workflow moves to the next task.<br />
* '''Type Filter''' - lookup to select L1, L2, or L3 types, which will then act as the type condition<br />
* '''Status Filter''' - Lookup to select L1, L2, or L3 statuses, which will then act as the status condition<br />
* '''Condition''' - use to specify a logical condition that must be met before a connector triggers the next workflow task. Multiple connectors can be set up with mutually exclusive conditions to have branching logic on the workflow.<br />
<br />
<br />
4. Complete as appropriate and click Save at the bottom of the screen.<br />
<br />
5. Click the New button in the desired row for the task you wish to connect and connect to a proceeding task, the Complete option or to another workflow entirely. Click Save when finished.<br />
<br />
6. Go back to the General tab and click Save once all connectors have been defined. When the page refreshes then the connectors should be displayed.<br />
<br />
[[Image:workflow2017_7.png|1000px|border]]<br />
<br />
<br />
When you create a Workflow with a delay connector, the recipients of the subsequent task are processed at the time the workflow is triggered and NOT at the time it runs. In other words, the tasks on the workflow, such as generating an email, are processed before the delay, not at the end of the delay.<br />
<br />
If the recipients change between the time the workflow is initiated and the time it fires (based on the delay) the recipients will not be updated. To ensure recipients are evaluated at the time the workflow task fires, insert a blank task after the delay connector (i.e. an Acknowledgement workflow with no recipients), then flow into a new Workflow Task with the desired recipients.<br />
<br />
Example scenario:<br />
<br />
* A workflow is configured to wait 5 days and then mail all contacts attached to the Level 1 with role Reviewer.<br />
* That workflow is triggered against a specific Level 1 record which has three contacts in the contacts section with the role Reviewer.<br />
* After the workflow has been triggered, before the 5 days have gone by, two additional Reviewers are added to the contacts section, and one of the original three is removed.<br />
* If the Acknowledgement task is attached directly after the connector with the delay then the original three contacts will receive the email, even though they are no longer current.<br />
* If there is a blank workflow task following the connector with the delay, which flows into a workflow task configured to email all Level 1 contacts with the role Reviewer, then the four reviewers on the Level 1 record at the time the email is sent, will be emailed, rather than the original three reviewers.<br />
<br />
==Enable on Object==<br />
===Enable Workflow on Company/User===<br />
Workflows must be enabled against an organization before workflows will run against the organization itself, its sub-branches and the users within the organization and its sub-branches.<br />
<br />
If the current User has the Workflows - Attach Workflow to Company System Feature Permission enabled then they will see 2 drop-downs on an organization profile<br />
<br />
* '''Company Workflow''' - which lists all Workflows with a Workflow Type of Company. Only a single company workflow can be selected per Company<br />
* '''User Workflow''' - which lists all Workflows with a Workflow Type of User. Only a single User workflow can be selected per Company<br />
<br />
The way the selected Company workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new Company is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new Company is created, and when an existing Company is modified.<br />
<br />
The way the selected User workflow will execute will depend on the Trigger Type:<br />
<br />
* If '''New''' is selected the Workflow will only be triggered when a new User or Contact is created.<br />
* If '''Modified''' is selected the Workflow will be triggered when a new User/Contact is created, and when an existing User/Contact is modified.<br />
<br />
<br />
===Enable Workflow on Company/User Registration Page===<br />
This feature enables a Workflow to trigger on a Company/User registration page.<br />
<br />
An example use would be sending an email to an employee every time a new company registers so that they can verify the information entered for the company.<br />
<br />
Company/User registration Workflows will override other new and modified status-based Workflows. We recommended Workflows triggered from Sign Up pages be On Demand.<br />
<br />
Every sign-up page has an Attach Workflow drop-down menu where users can choose the Workflow they want triggered from the sign up page.<br />
<br />
<br />
<br />
===Enable Status-Driven Workflow on UTA===<br />
Status-driven workflows can be triggered from all levels of a UTA if Workflows have been enabled on the types . To enable workflows for a type do the following:<br />
<br />
1. In your desired UTA, click configuration Settings. Click on the level 1 tab, Click on Types. A list of types is displayed.<br />
<br />
2. Click the Edit button on the desired Type The template details are displayed.<br />
<br />
[[Image:workflow2017_8.png|500px|border]]<br />
<br />
<br />
3. To enable workflows for the Level 1 items, select Yes in the first workflow combo box.<br />
<br />
4. To enable workflows for the Level 2 and 3 activities, select Yes in the second workflow combo box.<br />
<br />
5. Click Save.<br />
<br />
Note: upon creation of new Templates, the Workflow combo boxes default to "Yes." Change these values to "No" in the case that you would like to disable workflows for this template at Level 1 and/or Level 2 and 3.<br />
<br />
<br />
<br />
===Enable Workflow on UTA Type===<br />
Level 1/2/3 Types can be configured to trigger a unique workflow whenever a new item using this template type is added.<br />
<br />
Go to configuration settings, choose the desired tab (level 1/2/3) click the types link, edit the desired type and click on the Template Page tab.<br />
<br />
In the Workflow drop-down, select the appropriate workflow and then click Save.<br />
<br />
<br />
<br />
===Enable UTA Role / Company Assignment Workflow on UTA===<br />
If you wish to trigger a UTA Role Assignment Workflow or a UTA Company Assignment Workflow from a UTA level one record then you must have configured the [[Types|Level 1 Type]] settings.<br />
<br />
Each Level One Type page has the following 2 options:<br />
<br />
* '''UTA Role Assignment Workflow''' - use to define one or more UTA Role Assignment Workflows that are triggered by this type .<br />
* '''UTA Company Assignment Workflow''' - use to define one or more UTA Company Assignment Workflows that are triggered by this type.<br />
<br />
<br />
===Enable Workflow on File Upload field===<br />
To trigger a workflow when a file is uploaded to a Link - Single File or Link - Multiple Files Custom Field scroll down to the File Options section. For Workflow on Upload select the desired workflow and save .<br />
<br />
If the file upload Custom Field is located at Level 2 or Level 3, you can select Tracking Activities or Tracking Sub-Activities Workflow Types.<br />
<br />
If the file Custom Field is located on a Company or User you can select Company or User Workflow Types.<br />
NOTE: The Workflow is only triggered when I file is uploaded, it is not triggered by file deletions.<br />
<br />
<br />
<br />
===Enable Workflow on SmartFolder===<br />
To trigger a workflow when a file is uploaded into a SmartFolder navigate to the desired SmartFolder.<br />
<br />
Click the Folder Settings button (looks like a gear).<br />
<br />
For Workflows select the desired work flow (all workflows of the Type File will be displayed) and click save.<br />
<br />
=Configuration – Advanced=<br />
==Suppress Workflow Window==<br />
When a workflow step is executed the user is generally presented with a Workflow window where they can select a value that will be used to determine the next task to be performed.<br />
<br />
This feature is vital for workflows that require user interventions, but is not required for workflows that are used to simply send an instant message or email message to one or more users.<br />
<br />
If the User has a pop-up stopper/blocker enabled within their browser, the Workflow Window will be suppressed and the Workflow will not trigger. You must ensure that users of workflows that prompt their<br />
<br />
Workflow Window, have enabled pop-up window display for your instance of SmartSimple.<br />
<br />
If you wish to suppress the display of this window you can change the workflow settings as follows:<br />
<br />
1. Go to the menu icon and under System Process click Workflows.<br />
<br />
2. Click the edit button on the desired Workflow.<br />
<br />
3. For Workflow Window enable the Suppress option.<br />
<br />
4. Click Save.<br />
NOTE: If you do not require a user interventions in your workflows it is recommended that the Workflow window be suppressed to ensure workflows execute as you may have little control over user browser settings.<br />
<br />
<br />
<br />
==Recurring Workflow==<br />
A recurring workflow is a Workflow that is not triggered against any particular object.<br />
<br />
A recurring workflows ability to use variables is limited, but recurring workflows are useful for tasks that recur at regular intervals, such as a weekly reminder e-mail.<br />
<br />
When using a recurring workflow, the tasks must be connected in a loop, and there must be at least one connector with a delay. Otherwise, the workflow would endlessly loop.<br />
<br />
If the workflow is set to look endlessly (without a delay), the system will automatically stop processing any workflows configured this way, after five loops.<br />
<br />
Once you have configured the Workflow, the Activate button can be used to start the workflow. Once activated, a Deactivate button will be visible that can be used to stop the workflow.<br />
<br />
If you wish to have a recurring workflow send an e-mail on a particular day or days of the month, you can use the following conditions:<br />
<br />
* date_format(now(),"%d")="01" - Will be true only on the 1st of the month<br />
* date_format(now(),"%d") in ("01","15") - Will be true on the 1st and 15th of the month.<br />
<br />
You will need to configure an empty task (i.e. an Acknowledgement with no recipients) to manage the branching based on the date, and an empty task to manage the one-day delay so the workflow will loop daily and connect to the task that sends the e-mail on the appropriate day(s).<br />
<br />
[[Image:workflow2017_9.png|1000px|border]]<br />
<br />
<br />
The Workflow Connectors attached to the "Empty Task for Branching" should have the following Conditions:<br />
<br />
[[Image:workflow2017_10.png|1000px|border]]<br />
<br />
<br />
<br />
==Task Type specific configuration==<br />
Each available task type represents a different type of action and has different configurations needs as a result.<br />
<br />
This section discusses the specific configuration needs for the different tasks types<br />
<br />
<br />
<br />
===Task Type: Acknowledgement===<br />
Acknowledgements use this Task to send messages to users in SmartSimple.<br />
<br />
Acknowledgement Tasks have the following settings:<br />
<br />
* '''Name''' - name for the task.<br />
* '''Task Type''' - manually set to Acknowledgment<br />
* '''Task Number''' - a system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location, but order or execution of tasks is determined by the Connectors.<br />
* '''Description''' - optional description of the task.<br />
* '''Expire After''' - intended duration of the workflow.<br />
{{Template:WorkflowMessageTemplate}}<br />
* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables.<br />
* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients. Only appears if workflow is UTA specific.<br />
* '''Routing: Role''' - Used to select recipients by role. This list includes all roles configured in the system, alongside the built-in roles that can be used in a workflow:<br />
*** The Originator role is used to reference the name of the person that started the workflow. This could be the person that submitted an expense claim, added a file to a workflow or added a new employee. :*The Initiator role is used to reference the name of the person that initiated the current task in the workflow. This refers to the person that approved the current step of an expense claim, or reviewed a document loaded into a workflow enabled Smart Folder.<br />
*** The Owner role is used to reference the user assigned as the Owner of the record.<br />
*** The People role is used to reference the user assigned as the Person on the level one. This role is only available to Level One specific tasks.<br />
*** The Assigned Users role is used to send messaging to users who are in the Assigned field of a Level Two activity. This role is only available for Level Two workflows.<br />
Once the role has been selected the following recipient choices are available:<br />
<br />
* <br />
*::* Let the current user select target user from this role – When the workflow is triggered, the user will be prompted to select recipients from the list of users currently in the role.<br />
*::* All Users of this role – The message will be sent to all users in the selected role.<br />
*::* Selectable list of users currently in the role – The message is sent to the specific users that are selected.<br />
* '''Routing: Selected Users''' - details of the users configured as Recipients in the Role section<br />
* '''Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
===Task Type: Activate/Deactivate User===<br />
This type of Workflow task is used to set the access type for a user or to deactivate a user.<br />
<br />
No message accompanies this workflow task. If you wish to notify users of a change in access type, for example to notify activated users of their password, you can configure an Acknowledgement type workflow task to follow this step in the workflow.<br />
<br />
Activate/Deactivate User Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Activate / Deactivate User.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - Sets the access type for the user against which the workflow is triggered. Options are:<br />
* '''Activate (Administrative or Portal Interface)''' - Provides access to the system to the extent permitted through the user's membership of specific roles.<br />
* '''Activate (User Centric or Applicant Interface)''' – Only provides access through the User Centric Interface and Applicant Tracking “career sites”.<br />
* '''Activate (Web Service Client Access)''' - Account type used to access data in a SmartSimple instance via an API (Application Programming Interface). Does not give access to SmartSimple interface directly.<br />
* '''Deactivate (No Access)''' – User cannot log into the system.<br />
<br />
===Task Type: Change Status===<br />
Change Status Workflow Task Types change the status of the object that triggered the workflow. There is no messaging on this task type.<br />
<br />
Change Status Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Change Status<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Change Status To''' - lists statuses from the selected UTA level. This workflow task will change the status of the object that triggered the workflow to the selected status.<br />
<br />
===Task Type: Company Association===<br />
You can use the Company Association Workflow Task Type to automatically add, remove or update one or more companies to a Level 1 record. They will be assigned to the record with the UTA category defined in the "Roles will be assigned" setting.<br />
<br />
Company Association Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Company Association<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Variables for companies''' - Allows user to use syntax to reference the company IDs<br />
* '''Action''' - Add, update or delete the company association<br />
* '''Companies''' - use Lookup to select the Companies that will be added.<br />
* '''Roles will be Assigned''' - select the categories that you want the companies to be assigned with. To assign different companies with different categories, you will have to create more than one Company Association task.<br />
<br />
===Task Type: Create Consumer/Provider Link===<br />
Consumer/Provider Link Workflow Task Type creates Consumer/Provider relationships, and is only available to Level 1 and Level 2 workflows.<br />
<br />
Consumer/Provider Tasks have the following settings, all of which control how the target record is linked to the record triggering the workflow:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Connection Type''' - Select whether the link will be a Consumer or Provider<br />
* '''Connection Application''' - Select the UTA being connected<br />
* '''Connection Level''' - Choose the connection level (Level One or Level Two)<br />
* '''Object ID / Variable''' - Enter the Record ID (or a variable to obtain the Record ID of the object to connect to). It accepts semicolon separated lists.<br />
* '''Connection Role''' - Select the Consumer UTA Connection role to be used for the connection<br />
<br />
===Task Type: Create New Activity===<br />
You can use the Create New Activity Workflow Task Type to automatically create and attach one or more Level 2 records to a Level 1 record. This workflow can be driven by a Status change on the Level 1 record. The workflow will also trigger (in this sequence):<br />
<br />
1. Auto-assignments<br />
<br />
2. Level 2 Formulas<br />
<br />
3. Level 2 Workflows<br />
<br />
<br />
New Activity Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Type''' - manually set to Create New Activity<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional)<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Activity Scheduling Options''' - drop-down with 3 options (Disable, Schedule by Date and Amount, Schedule by Number of Activities) that can be used to create multiple instances of the Activity.<br />
<br />
: If '''Schedule by Date and Amount''' option is selected then following settings are exposed.<br />
::* '''Start Date''': Level 1 field used to set the start date of the activity scheduling period<br />
::* '''End Date''': Level 1 field used to set the end date of the activity scheduling period<br />
::* '''Schedule Every''': frequency of scheduling<br />
::* '''Total Amount''': Level 1 field used for the Total Amount to be distributed. The amount specified will be split evenly between each Level 2. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Date''': Level 2 field used to set the date to be assigned to each record based on the scheduling options."<br />
::* '''Activity Amount''': Level 2 field used to store the calculated amount for each record. If 'N/A' is selected, the Level 2s will be created without an amount.<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
: If '''Schedule by Number of Activities''' option is selected then following settings are exposed.<br />
::* '''Number of Activities''': Level 1 field used to set the number of activities to be created<br />
::* '''Activity Index''': Level 2 field used to store the index number of each record. If 'N/A' is selected, the Level 2s will be created without an index number."<br />
'''Days Delay''' - Number in days of delay before creation of new activity. If left blank, the new activity will be created immediately.<br />
::* '''Create for Users in UTA Role''' - select the UTA Role of the users that the Peer Activity should be created against.<br />
::* '''Activity Type''' - This is where you specify which Level 2 Type you wish to create. If you select the Custom Field option then a Custom Field ID field is exposed.<br />
::* '''Custom Field ID''' - The Create New Activity workflow can be driven by a Custom Field. For example, you could have check boxes at Level 1 corresponding to various Level 2 Types. Selecting each check box would create and attach the relevant Level 2 activity type. You must first create a Custom Field on the Level 1 record which stores the typeid(s) of the Level 2 Types to be created. To create multiple Level 2 records use one of the Select many field types (e.g. Select Many – Check Boxes, Select Many – Scrolling Check Box, Select Many – List Box) and to create a single Level 2 record use the Select One – Combo Box.<br />
::* '''Activity Status''' - Allows you to define the Status for the newly created Level 2 record(s). Note: If that Level 2 Status has a workflow attached to it the workflow will be triggered at the point of creation of the Level 2 record.<br />
::* '''Reminder Type''' - You can select whether a Quick Message or reminder email will be sent out to the Owner or contacts attached to the record, or any combination of the above.<br />
::* '''Reminder Days''' - Sets delay for reminder message being sent.<br />
<br />
: <br />
===Task Type: Generate PDF File===<br />
Auto generation of a PDF that can be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field.<br />
The PDF generated must be based upon a Web Page View Custom Field. You must specify the Custom Field ID of the Web Page View to be converted in the Web Page Field ID field on the Workflow Task settings.<br />
<br />
: <br />
Multiple PDFs can be created and stored in a single Link - Multiple Files custom field using this workflow task type, by entering the Custom Field IDs of the Web Page View fields, separated by commas.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Web Page Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: PDF Merge===<br />
Will convert [[Custom Field Type: Special – MS Word Merge|Word Merge]] document to a PDF which can then be:<br />
<br />
:::::* E-mailed to the person(s) designated in the workflow step.<br />
:::::* Stored within a Multiple Files Custom Field<br />
<br />
: <br />
The PDF generated must be based upon a [[Custom Field Type: Special – MS Word Merge|Word Merge]] Custom Field. You must specify the Custom Field ID of the MS Word Merge document to be converted in the MSWord Merge Field ID field on the Workflow Task settings.<br />
<br />
To store the PDF, specify the field ID of the Link - Multiple Files custom field in the Store to Field ID field on the Workflow Task settings.<br />
<br />
The field you are storing too does not need to be on the same object. The syntax @parent.Field Name.id@ allows the workflow to store a level two web page view to the parent record.<br />
<br />
Generate PDF File Tasks have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to Create Consumer/Provider Link<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''MSWord Merge Field ID''' - Must contain the Custom Field ID of the Web Page View to be converted into PDF format. To create multiple PDFs, enter the Custom Field IDs of the Web Page View fields in the Web Page Field ID# setting of the Workflow Task, separated by commas.<br />
::* '''Store to Field ID''' - If PDF file should also be stored to the record, must contain the Custom Field ID of the relevant Link - Multiple Files custom field.<br />
::* '''PDF Render Language''' - If a language is specified, the language option will be applied to the PDF generated<br />
::*::* '''Message Template: Message Type''' - Type of message – e-mail, instant message, both, or none required with this task. E-mail and instant messages can be created using variables that will create custom messages specific to instances of the workflow. Options are No Message Required (default), Quick Message, Email Only and Quick Message and Email.<br />
{{Template:WorkflowMessageTemplate}}<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. See this article for configuration details.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to select recipients by role.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to complete this task. This technique restricts the number of users that the initiator can select.<br />
::* '''Routing: Routing Options''' - Specifies the types of options available to process this workflow step. In many instances, the default options can be used, such as Approved, Rejected or Revise. But additional and alternate sets of options can be created to reflect more complex business processes.<br />
<br />
: <br />
===Task Type: People Association===<br />
You can use the People Association Workflow Task Type to automatically add one or more contacts to a Level 1 record. They will be assigned to the record with the UTA role defined in the "Roles will be assigned" setting.<br />
<br />
People Association have the following settings:<br />
<br />
::* '''Name''' - Narrative name for the task.<br />
::* '''Task Type''' - manually set to People Association<br />
::* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
::* '''Description''' - Detailed description of the task (optional).<br />
::* '''Expire After''' - Intended duration of the workflow.<br />
::* '''Action''': Add, update or delete the people association<br />
::* '''Routing: Use Variable for Recipients''' - Allows recipients of the message to be selected using variables. This is discussed in greater detail in the Configuration – Advanced section.<br />
::* '''Routing: Use UTA Role''' - When using roles to select recipients, the UTA Role can be used to determine recipients.<br />
::* '''Routing: Role''' - Used to control role of user that will be associated.<br />
::* '''Routing: Selected Users''' - If required, specific users can be selected to be associated<br />
::* '''Roles will be Assigned''' - select the role(s) that you want the contact(s) to be associated with. To assign different contacts with different roles, you will have to create more than one People Association task.<br />
In the Routing section select a Role currently possessed by the contact(s) you wish to add, whether this is a system role or a UTA role. You can then either select specific contacts or groups that will always be added to the Level 1 when the workflow is triggered, or you can choose Let current user select target user from this role to allow the person that triggers the workflow to select a contact to be added.<br />
Note:<br />
::** If you are allowing the current user to select target user Suppress Workflow Window must be off (not enabled) otherwise the workflow will not fire.<br />
::** If you are allowing the current user to select target user, the Workflow must be triggered by a status, and not by a script.<br />
::** Include a description, as the description will be presented to the user when they are asked to select the contact to be assigned.<br />
In order to notify the contact(s) that they have been assigned you can create a subsequent Acknowledgement Workflow Task to e-mail all contacts with the UTA role you selected.<br />
<br />
===Task Type: Request for Approval / Request for Comment===<br />
Both of these Workflow Task Types prompt users to review the work of others, and keep track of outstanding reviews on the [[Workflows_Overview#Workflow_Requests|Workflow Requests]] page.<br />
<br />
The settings for both of these Workflow Task Types match those used for the Acknowledgment task except for 2 additional settings:<br />
<br />
:* '''Respondents''' - Indicates the number of respondents required for this approval.<br />
:* '''Allow Edit''' - Allows editing of the attached object.<br />
By default, a Request for Approval or Comment workflow task will move on to the next task (whether approved, rejected, etc.) as soon as the first recipient of the Workflow Task responds. The Respondents field allows a specific number of respondents to be required, which will keep the Request for Comment Task active until that number of respondents has replied.<br />
The Routing options field is used as part of the Request for Approval process. Users should enter appropriate options within the Routing Options section(Example: 10=approved;20=reject;30=Revise) and click Save.<br />
<br />
These Routing Options will then be available in the Trigger Type drop-down when configuring Connectors. It is suggested that each routing option should have a corresponding task so that the routing option can then be connected to an appropriate task.<br />
<br />
You must set the minimum number of respondents on the connector associated with each of the approval options.<br />
<br />
::* If you have selected three respondents on the Request for Approval Task, and the task should only pass if all three respondents click approve you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be one.<br />
::* If you have selected four respondents on the Request for Approval Task, and the task should only pass if three respondents click "Approve," you would set the number of respondents on the Approve connector to be three, and the number of respondents on the Reject connector to be two.<br />
The system checks the connectors once the number of respondents on the task has been met, this behaviour is not configurable. The first connector the system checks will be taken if the requirements are met.<br />
You must ensure the Workflow Task is sent to enough people to meet the minimum number of respondents required, if you do not send the task to enough recipients the task would never complete.<br />
<br />
===Task Type: Select User for Next Task===<br />
This task type used to allow the current user to pre-select the user that is responsible for the task that immediately follows this task type.<br />
<br />
This is necessary for tasks that will trigger at a later date.<br />
<br />
For example, consider a Workflow that is triggered on the status of Escalated which is configured to send a reminder e-mail to a manager if the status has not changed for seven days. If the reminder e-mail workflow task has Let current user select target user from this role as the recipient the Workflow would fail. This is because the e-mail is triggered (seven days later) by the system, and there is no current user.<br />
<br />
The settings for this Workflow Task Types match those used for the Acknowledgment task. The only difference if that the Request with the Routing options.<br />
<br />
<br />
<br />
===Task Type: Signority Submission===<br />
You can use the Signority Submission Workflow Task Type to automatically trigger the Signority signing process via workflow.<br />
<br />
Signority Submission Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Signority Field''' - drop-down which lists all Signority enabled WPV fields for the entity the workflow is configured against.<br />
<br />
===Task Type: Trigger Workflow===<br />
You can use the Trigger Workflow tasks to trigger a different workflow.<br />
<br />
Trigger Workflow Tasks have the following settings:<br />
<br />
:* '''Name''' - Narrative name for the task.<br />
:* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
:* '''Description''' - Detailed description of the task (optional).<br />
:* '''Expire After''' - Intended duration of the workflow.<br />
:* '''Trigger Workflow''' - Select the workflow that should be triggered from this dropdown menu.<br />
:* '''Record id / Variable''' - this setting should contain the unique record ID for the record against which the selected workflow should be triggered. This record ID can be referenced using variables.<br />
:*** Examples: If the workflow to be triggered is a User type workflow, you would need to provide a User ID for the contact record against which you would want the workflow to be triggered.<br />
:*** If the workflow is to be triggered against a series of Level 2s attached to a Level 1 record, you could use List Syntax to define a list of activities meeting certain criteria against which the workflow should be triggered.<br />
<br />
===Task Type: Update Company Category===<br />
Update User Role Workflow Task Types can add or remove categories from SmartSimple organizations.<br />
<br />
This task type is only available for "Company" workflows.<br />
<br />
Update Company Category Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove categories from the organization upon which the workflow is triggered.<br />
* '''Categories''' - select the categories that should be added or removed from the organization's profile.<br />
<br />
===Task Type: Update Custom Field Value===<br />
The Update Custom Field Value workflow task type can be used to write values to custom fields on the object against which the Workflow is triggered.<br />
<br />
These values can be hard-coded or they can use variables.<br />
<br />
You can also use MySQL syntax to manipulate values using sscalculation.<br />
<br />
Update Custom Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists custom fields across all UTAs from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
Note: If the field to be updated has the Read Only toggle enabled in the Formatting section of the field options (or a "read-only" HTML tag or "textreadonly" CSS class) the value will not update.<br />
* '''Update To Value''' - This workflow task will use this value to update the field selected in the "Use Field" setting. Variables can be used in the "Update To Value" setting as well as hard-coded values.<br />
<br />
===Task Type: Update Standard Field Value===<br />
The Update Standard Field Value workflow type can be used to write values to standard fields on the object against which the Workflow is triggered.<br />
<br />
Standard fields on the level 1, level 2, level 3, companies, contact and transaction can be updated using this method:<br />
<br />
Update Standard Field Value Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Use Field''' - lists standard fields from the selected UTA level. This workflow task will update the selected field with the value in the "Update To Value" setting.<br />
* '''Update To Value''' - accepts hard-coded values and variables. This workflow task will use this value to update the field selected in the "Use Field" setting.<br />
Note: Some standard fields (such as Type) require the ID, not the type name in order to update correctly.<br />
<br />
===Task Type: Update User Role===<br />
Update User Role Workflow Task Types can add or remove roles from SmartSimple contacts.<br />
<br />
This task type is only available for "User" workflows.<br />
<br />
Update User Role Tasks have the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Option''' - options are Add or Remove. This determines whether the task will add or remove roles from the contact upon which the workflow is triggered.<br />
* '''Roles''' - select the roles that should be added or removed from the contact's profile.<br />
<br />
===Task Type: Web Service - HTTP Request===<br />
This workflow task type is used to consume a [[APIs|web service]] via a workflow step. The web service will send the HTTP Post request to retrieve information. The response returned by the web service can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:HTTPPost.PNG|500px]]<br />
<br />
HTTP Post have the following settings:<br />
<br />
:* '''URL''' - endpoint of the HTTP Post web service<br />
:* '''User Name''' - username to access post location if needed<br />
:* '''Password''' - password to access post location if needed<br />
:* '''Parameters''' - free text field to pass in parameters such as apitoken , alias id, etc. Can include username and password if not specified in the specific fields<br />
:* '''Response Stores To''' - field on system where response from HTTP post can be stored<br />
<br />
===Task Type: Web Service – SOAP Message===<br />
The Web Service - SOAP Message Workflow Task allows you to post data to another system, outside of SmartSimple. The response returned by the external system can be stored into a custom field on the object against which the Workflow was triggered.<br />
<br />
[[File:SOAP.png]]<br />
<br />
This Task type has the following settings:<br />
<br />
* '''Name''' - Narrative name for the task.<br />
* '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
* '''Description''' - Detailed description of the task (optional).<br />
* '''Expire After''' - Intended duration of the workflow.<br />
* '''Message Template: Action''' - The action to called by the Web Service call (These actions are defined by the external server, and are not part of SmartSimple)<br />
* '''Message Template: Custom Field ID for Response''' - The Custom Field ID of an XML custom field on the object that the Workflow was triggered against that the response returned by the external server.<br />
* '''Message Template: Email Message Header''' - The email header can be modified using the following syntax, with the arguments separated by semicolon:<br />
** X-Priority={1,2,3,4,5}<br />
** Priority={normal,urgent,non-urgent}<br />
** Importance={high,normal,low}<br />
** Sensitivity={personal,private,company,confidential}<br />
*: e.g. Priority=urgent;Importance=high<br />
** '''Message Template: Endpoint''' - The URL or IP address of the destination server<br />
** '''Message Template: Envelope Template''' - The content of the Web Service message to be sent to the external service. This can contain variables related to the object the workflow is triggered against.<br />
** '''Message Template: Attach Object''' - Attaches the details of the object to the message. In the case of a SmartSimple object, such as a company, person, or application, the textual details of the object will be added. If the object is a file, then the file will be attached to an e-mail message, but not an instant message.<br />
** '''Message Template: Attachment File IDs''' - Attach additional default files when triggered from a Smart Folder. See the Determining the File ID article for instructions.<br />
** '''Message Template: Save as Event''' - Email will be saved as an event.<br />
If the content from the custom fields being included within the SOAP message contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server.<br />
<br />
The less than symbol (<) and ampersand (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving system understands that they are data content and not part of the XML structure:<br />
<br />
:: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
For example, an address could contain ampersands, so it should be wrapped as follows:<br />
<br />
<pre>@firstname@@lastname@</pre><address> </address><br />
<br />
If the response to your Web Service call contains values that you wish to store within a Custom Field on the object against which the Workflow was triggered, you can connect a Update Custom Field Value Workflow Task to be the task following the Web Service - SOAP Message and use the variable syntax to pull the value from the XML Custom Field you selected to store the response to the Web Service call.<br />
<br />
For example, if the [[Custom Field Type: Special - XML Data|XML]] Custom Field that stores the response (custom field ID 155255 in the image above) is called '''Web Service Response''', the variable in the [[Update Custom Field Value]] task to pull a node called '''AssignedIdentifier''' could be:<br />
<br />
@xml.Web Service Response.soap:Body.AssignedIdentifier.nodevalue@<br />
<br />
If the response should be saved to a [[System Variable]], the syntax would be:<br />
<br />
@system.xml.''fieldname''.''nodename''.nodevalue@<br />
<br />
===Task Type: Web Service - RESTful Request===<br />
This workflow task type is used to consume a RESTful web service using GET or POST method.<br />
<br />
====RESTful Web Service Request using GET Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_GET.PNG|500px]]<br />
<br />
GET RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - resource of the web service<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====RESTful Web Service Request using POST Method====<br />
POST method is used to send data to a RESTful web service.<br />
<br />
[[File:RESTful_POST.PNG|500px]]<br />
<br />
POST RESTful Web Service Request have the following settings:<br />
<br />
:* '''Endpoint''' - endpoint of the web service<br />
:* '''Request Body''' - data sent with the request.<br />
:* '''Request Header''' - additional instructions sent with the request. These might define the type of response required or the authorization details.<br />
:* '''Store Response To Field''' - [[Custom_Fields|Custom field]] where the response will be stored.<br />
:* '''Store Response to SmartFolder''' - [[SmartFolders|SmartFolder ID]] where the response file will be stored.<br />
<br />
====Credentials of the RESTful Web Service Request====<br />
<!--89397 - Workflow Task Type: Web Service - RESTful Request --><br />
Credentials of the web service can be added in the Request Header in the format: Authorization=Basic [base64 encoded credentials].<br/><br />
A third party software can be used to convert the username/password to a base64 encoded credentials.<br/><br />
Note that all equal signs within the base64 credentials should be replaced with %3D.<br/><br />
Example:<br/><br />
FROM: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''='''</span><br/><br />
TO: Authorization=Basic c3NcUyVzZXI6SzhAtHVuY2g<span style="color: #ff0000;">'''%3D'''</span><br />
====Parsing JSON response====<br />
<!--67458 - Add GET/POST REST services workflow tasks that are compatible with JSON--><br />
Variable syntax is available to parse and retrieve values from JSON format data.<br/><br />
''Sample 1''<br />
<pre>FIELD_NAME: {"firstname":"John"}<br />
variable syntax: @json.FIELD_NAME.firstname@ <br />
result: John<br />
</pre><br />
''Sample 2''<br />
<br />
<pre>FIELD_NAME: {"primarycontact":{"firstname":"Thomas"}}<br />
variable syntax: @json.FIELD_NAME.primarycontact.firstname@ <br />
result: Thomas<br />
</pre><br />
''Sample 3''<br />
<br />
<pre>FIELD_NAME: {"users":[{"firstname":"Marie"},{"firstname":"Eve"}]}<br />
variable syntax: @json.FIELD_NAME.users.[# ~firstname~, #]@<br />
result: Marie, Eve<br />
</pre><br />
<br />
===Task Type: Translate Field Value===<br />
The Translate Field Value Workflow Task allows you to perform automatic translation of records and field values in the system. It will only apply to those custom fields that have [[Enable_Translation_Service|enabled translation services]].<br />
<br />
This Task type has the following settings:<br />
<br />
** '''Name''' - Narrative name for the task.<br />
** '''Task Number''' - A system generated number that determines the presentation order of the task in the workflow. This number can be changed to display the step in a different location.<br />
** '''Description''' - Detailed description of the task (optional).<br />
** '''Translate to''' - set which language or languages to translate to for the custom fields that have enabled translation<br />
If a record has translation enabled and a stored field translation exist, there will be a "Show Translation Values" in the Options menu<br />
<br />
When shown, the translated field values will appear directly underneath the existing field value.<br />
<br />
If more than one translated language exist, there will be a language drop down appearing at the top of the record.<br />
<br />
==Importing and Exporting Workflow Tasks==<br />
Workflow Tasks can be exported and imported into other Workflows using the Import/Export function on the Edit Workflow page. This feature is particularly useful if you have created workflows for testing on your backup instance and wish to implement the finalized reports in your live system.<br />
<br />
The steps to export a workflow task or set of workflow tasks are as follows:<br />
<br />
[[Image:ExportWorkflow2017.png|1000px|border]]<br />
<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab and select the checkbox next to the workflow task(s) that you wish to export.<br />
<br />
2. Click on the Export button.<br />
<br />
3. A pop-up window will appear, containing the details of the tasks you have selected in XML format. Select all of the text in the pop-up window and save it to a text editing program, such as Notepad.<br />
<br />
Note that, if multiple tasks are selected, they will be delimited in the XML text block with the tag.<br />
<br />
<br />
The steps to '''import''' a workflow task or set of workflow tasks are as follows:<br />
<br />
1. Go to the relevant Workflow, click on the Tasks tab, then click on the Import button.<br />
<br />
2. A blank pop-up window will appear. Paste the XML data that you have exported into this window.<br />
<br />
3. Confirm your selection by clicking on the Import button at the bottom of the pop-up window.<br />
<br />
* The workflow tasks will be imported into the new workflow.<br />
* The Edit Workflow page will refresh to show the newly-added workflow tasks.<br />
<br />
==Workflow Condition==<br />
A logical statement can be added to workflow connectors in the Condition field, enabling you to specify which workflow task will be triggered.<br />
<br />
Example Branching Logic can be implemented to send an approval message to Senior Management when the request is over $100,000, while requests under $100,000 will take a different path when the workflow is triggered.<br />
<br />
<br />
[[Image:workflow2017_13.png|600px|border]]<br />
<br />
<br />
In general the Workflow Condition is used with several different connectors attached to a task. Collectively the conditions on each task should accommodate every possibility.<br />
<br />
Note: because the sequence in which the system accesses each connector is not configurable it is important that the conditions are mutually exclusive. For example, if you have 3 connectors for different paths based on a particular value the conditions could be:<br />
<br />
* "@Selection@"="Yes"<br />
* "@Selection@"="No"<br />
* "@Selection@"!="Yes" and "@Selection@"!="No"<br />
* The last statement could also be represented as "@Selection@" not in ("Yes","No")<br />
You can also use MySQL syntax to perform calculations within the Condition:<br />
* date_format(now(),"%d")="01"<br />
<br />
<br />
This condition will be true only on the 1st of the month. This could be used with a Recurring Workflow that loops daily if you wish to send out a summary e-mail on the 1st of every month.<br />
<br />
It is recommended that workflows with a loop include an empty task with 2 connectors with 2 separate conditions, one which goes back to the looped task and another which proceeds on to the next task, thus preventing an endless loop.<br />
<br />
Note: Other than values that are always numeric, all variables should be enclosed in double quotes.<br />
<br />
<br />
<br />
===Workflow Condition Examples===<br />
There are two rules that must be followed when adding multiple connectors to a workflow task that incorporate conditional logic statements:<br />
<br />
'''1. Collectively, the conditions on each task must accommodate every possible permutation'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@"="12345"'' and<br />
* ''"@typeid@"="45678"'', respectively<br />
<br />
If the workflow is fired against a record associated with typeID 67890, the workflow will never progress to the next task.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
As above, three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Three connectors are set up on a workflow task with conditions of:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"'',<br />
* ''"@typeid@"="45678"'' and<br />
* ''"@typeid@"="67890"'', respectively<br />
<br />
<br />
Alternatively, connectors with the following conditions could be set up:<br />
<br />
<br />
<br />
* ''"@typeid@"="12345"''<br />
* ''"@typeid@"!="12345"'' (not equal to "12345"), and<br />
* ''"@typeid@" NOT IN ("12345","45678")'', respectively<br />
<br />
<br />
'''2. Each condition must be mutually exclusive from every other'''<br />
<br />
''<u>Example of Incorrect Configuration</u>'':<br />
<br />
Three [[types]] exist in a given [[UTA|application]], with [[Determining the typeid|typeIDs]] of 12345, 45678 and 67890.<br />
<br />
Two [[status]]es exist in the same application, with [[Determining the statusid|statusIDs]] of 888 and 999.<br />
<br />
The system administrator wishes to send emails via workflow if the record is in one of the above statuses. One email should be sent out if the type is 12345 or 45678 and a different email should be sent out if a different type has been used.<br />
<br />
Two connectors are set up on a workflow task with conditions of:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@statusid@" in ("888","999")''<br />
<br />
<br />
The issue here is that both statements [[Boolean Operators|evaluate]] as '''true''' if the statuses on the record triggering the workflow have a statusID of 888 or 999.<br />
<br />
The workflow process will not "know" which task to connect to. The workflow will progress, but not necessarily to the next intended workflow task. In other words, the wrong email may be sent.<br />
<br />
<br />
''<u>Example of Correct Configuration</u>'':<br />
<br />
The types and statuses exist as above, and the system administrator wishes to configure the same branching logic.<br />
<br />
Two connectors should be set up on a workflow task with the following conditions:<br />
<br />
* ''"@typeid@" in ("12345","45678") AND "@statusid@" in ("888","999")'' and<br />
* ''"@typeid@" not in ("12345","45678") AND "@statusid@" in ("888","999")''<br />
<br />
<br />
This configuration satisfies Rule #2, in that the conditions are now mutually exclusive. However, a third connector must be included, with the following condition, which connects to the "Complete" task, in order to satisfy Rule #1 above:<br />
<br />
* ''"@statusid@" not in ("888","999")''<br />
<br />
<br />
With these three connectors configured, the workflow will:<br />
<br />
* never not have instructions on ''whether'' to trigger the next workflow task (Rule #1), and<br />
* always have clear instructions on ''which'' task to trigger given a certain set of conditions (Rule #2).<br />
<br />
==Using iCalendar to generate Meeting Requests, Tasks and Contact cards==<br />
iCalendar is a file format that allows Internet users to send meeting requests, contacts and tasks through email and other digital methods.<br />
<br />
SmartSimple workflows support 3 email attachments types (ievent, itodo and icard).<br />
<br />
The SmartSimple email engine will look for email contents that have ievent, itodo, and icard objects. The contents of these objects are assembled and added as email attachments.<br />
<br />
The email engine will process iCalendar objects using the following syntax:<br />
<br />
* "@@ievent"<br />
* "@@itodo"<br />
* "@@icard"<br />
<br />
Simple sample iCalendar objects are shown below<br />
<br />
<br />
<br />
===ievent Object===<br />
Manifests as an ical attachment on the email.<br />
<br />
<pre><br />
<!--@ssattach(icalendar,vevent)--><br />
@@ievent<br />
UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DTSTART:TO_UTC(@startdate@ @starttime@)<br />
DTEND:TO_UTC(@enddate@ @endtime@)<br />
LOCATION:Room 1<br />
SUMMARY: Details to follow<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
instead of UTC you can specify the Time Zone for the DTSTART and DTEND as:<br />
<br />
<pre>DTSTART;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullstartdate@","%Y%m%dT%H%i%s"))--><br />
DTEND;TZID=Australia/Sydney:&lt;!--@sscalculation(DATE_FORMAT("@fullenddate@","%Y%m%dT%H%i%s"))--><br />
</pre><br />
<br />
===itodo Object===<br />
<pre><br />
<!--@ssattach(icalendar,vtodo)--><br />
@@itodo<br />UID:@owner.email@<br />
ORGANIZER;CN=@company@<br />
DUE:TO_UTC(@startdate@)<br />
STATUS:NEEDS-ACTIONLOCATION:Room 1<br />
SUMMARY: Meeting<br />
DESCRIPTION: @description@<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
<br />
===icard Object===<br />
<pre><br />
<!--@ssattach(icalendar,vcard)--><br />
@@icard<br />FN:@owner.fullname@<br />
ORG:@company@<br />TITLE:@name@<br />
TEL;TYPE=WORK,VOICE:@owner.phone@<br />
TEL;TYPE=HOME,VOICE:(404) 555-1212<br />
ADR;TYPE=WORK:;;100 Waters Edge;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=WORK:100 Waters Edge\nBaytown\, LA 30314\nUnited States of America<br />
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America<br />
LABEL;TYPE=HOME:42 Plantation St.\nBaytown\, LA 30314\nUnited States of America<br />
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com<br />
@@<br />
<!--@end--><br />
</pre><br />
<br />
==Trigger a Workflow from a Custom Browser Script==<br />
Workflows can be triggered based on a value in a custom field on the object using a browser script:<br />
<br />
_triggerwf(objectid,workflowid,Entity ID); <br />
<br />
The Entity ID should not be included for UTA Level 1 workflows<br />
<br />
You must first create the workflow. Once it has been created you need the [[Workflows_Overview#Determining_the_workflowid|Workflow ID]].<br />
<br />
In the browser script you would use triggerwf with the following syntax:<br /><br />
'''Level 1''': _triggerwf('@opportunityid@',''workflowid'');<br />
<br />
<br />
<br />
Example:<br />
<br />
_triggerwf('@opportunityid@',98765);<br />
<br />
'''Level 2''': _triggerwf('@eventid@',''workflowid'',26);<br />
<br />
Example:<br />
<br />
_triggerwf('@eventid@',98765,26);<br />
<br />
('''26''' is the objecttype for Level 2 activities, and will be the same for all Level 2 workflows)<br />
<br />
NOTE: For workflows triggered by a Browser Script within a UTA you should set Trigger When to --Deactivate-- rather than selecting a Status. This ensures that the workflow is only triggered when called by the script, and there is no risk of triggering it when a status changes.<br />
<br />
Notes:<br />
<br />
* You must not select Let current user select target user from this role for the Routing of workflows triggered by script, as they will not execute.<br />
* Because the workflow is triggered when the script executes it happens before the record is saved. If the workflow changes the Status or a Custom Field value, when the record on the screen is actually saved it will overwrite any changes made by the workflow by those on the page that is being saved. Accordingly you should include any Status or Custom Field changes within the JavaScript that triggers the Workflow.<br />
* If this function is called with a button on a page where standard libraries are not included, make sure to include /js/sstools.js (Example:<script src="js/sstools.js" type="text/javascript"></script>).<br />
<br />
==Using variables with workflows==<br />
===Pass parameters when workflow triggers another workflow===<br />
If a workflow is triggered from another workflow, you can reference a value from the object that triggers the previous workflow (e.g. if a L3 workflow triggers a L2 workflow, you can reference any value from the L3 object from within the L2 workflow). The syntax is as below:<br />
<br />
@triggerobject.FIELDNAME@<br />
<br />
This syntax should work when generating an email, and when used in the connectors as a condition.<br />
<br />
It should also work when using a Trigger Workflow task, and when a Task Connector is linked directly to the workflow.<br />
<br />
===Using variable syntax to select recipients for workflow tasks===<br />
The recipient of workflows (selected in the Acknowledgement, Request for Comment and Request for Approval task types) can be defined using [[Variable List|variable syntax]], rather than being limited to the list by role.<br />
<br />
The benefits to using this approach is, you can send to multiple roles at the same time, rather than having to configure different tasks for each role.<br />
<br />
It also allows you to filter recipients based on a custom field on the contact, or UTA Contact Role Based custom field(s).<br />
<br />
To enable this feature, click on the "Use Variable for Recipients" checkbox under the "Routing" header in the workflow task and then use variables to reference the relevant user.<br />
<br />
<br />
<br />
===Notes Workflow===<br />
The following variables can be used in Notes Workflows:<br />
<br />
@notes@ - the body of the note<br />
<br />
To reference fields found on the associated Level 1, Level 2, Level 3, contact or organization record:<br />
<br />
@parent.fieldname@ or @parent.#fieldID#@<br />
<br />
For Notes at Level 2 you can reference fields on Level 1 using:<br />
<br />
@parent.parent.fieldname@ or @parent.parent.#fieldID#@<br />
The same syntax can be used to call Level 2 fields for Notes at Level 3<br />
<br />
To call Level 1 fields for notes on Level 3:<br />
<br />
@parent.parent.parent.fieldname@ or @parent.parent.parent.#fieldid#@<br />
<br />
Using the "Variable processed recipients" feature of Workflow Tasks, you can direct a Notes Workflow to the contacts on the record to which the note is attached, using the @parent.owner.userid@ or @parent.[#(?object=contact)~userid~,#]@ syntaxes.<br />
<br />
<br />
<br />
===Password Variables===<br />
Different [[Password|password]] [[Variables|variables]] can be used depending on the [[Workflow|workflow]] task type.<br />
<br />
[[UTA]] Activation task type uses @password@<br />
<br />
Acknowledgment task type uses @randompassword@ or @checkactivatedpassword@<br />
<br />
<br />
'''Task Type: User Activation'''<br />
<br />
* @password@ - Checks if the user is activated<br />
** if the [[User|user]] is not activated then generates a new random [[Password|password]] (i.e. Your password is: ABCDEFGH)<br />
** if the [[User|user]] is activated then sends the text "current password" (i.e. Password is: current password)<br />
'''Task Type: Acknowledgment'''<br />
** @randompassword@ - generates a new random [[Password|password]]<br />
** @checkactivatedpassword@ - checks if the [[User|user]] is activated<br />
*** if the [[User|user]] is not activated then generates a new random [[Password|password]]<br />
*** if the [[User|user]] is activated then sends the text "existing password" (see '''Notes''' below)<br />
Because of the complex nature of the password creation and validation process it is not possible to automatically translate '''existing password''' into other languages. If you are sending an e-mail containing the @checkactivatedpassword@ variable you can use the following syntax to display text other than "existing password" if required.<br />
* <br />
<br />
For example, for an existing user the following will show the French translation of '''existing password''' which is '''Mot de passe courant'''. If the user has not been previously activated the syntax will provide a randomly generated password as normal:<br />
<br />
<pre><br />
<!--@sscalculation(if(trim("@checkactivatedpassword@")="existing password","Mot de passe courant","@checkactivatedpassword@"))--><br />
</pre><br />
<br />
{{WorkflowTaskTypeCCEmailSyntaxOptions}}<br />
<!--sendnoto sendnotto Sendnotto sendasto reply-to replyto--><br />
<br />
=Using workflows=<br />
==Searching or Sorting Workflows==<br />
To access the workflows list, click the menu icon in the action bar, followed by the Workflows link in the System Process section.<br />
<br />
The following tabs are also displayed:<br />
<br />
* '''Workflows''' – click this tab to see list of workflows.<br />
* '''Tasks''' – click this tab to see a list of tasks for all workflows.<br />
* '''Outstanding Tasks''' – click this tab to see a list of outstanding tasks for all workflows.<br />
Each of these tabs has search and sort options, to allow quick and easy location of workflows and tasks.<br />
The steps for '''searching''' are as follows:<br />
<br />
<br />
1. Go to the tab that you wish to search against.<br />
<br />
2. Click into the search criteria field to select the list view column to search against.<br />
<br />
3. Enter in appropriate criteria.<br />
<br />
4. Click on the Search button to run the search or click on the X (clear button) to clear the criteria.<br />
<br />
5. All matching results will be listed, as well as filter criteria.<br />
<br />
<br />
<br />
The steps for '''sorting''' are as follows:<br />
<br />
1. Click the column header on the column you wish to sort. First click sorts ascending (going up example 1,2,3).<br />
<br />
2. Second click sorts descending (going down example 3,2,1)<br />
<br />
3. Third click returns to the default sort order.<br />
<br />
==Workflow Requests==<br />
Workflow Requests are generated by Request for Approval / Request for Comment workflow tasks.<br />
<br />
The Workflow Requests page lists:<br />
<br />
* outstanding tasks that you need to complete based on SmartSimple [[workflows]],<br />
* tasks that other people need to complete where you are participating in some steps in the workflow, and<br />
* project tasks that you are assigned to complete.<br />
The request will be listed under the '''Requests to me''' link.<br />
1. Click the '''Communications''', Workflow Requests link. The Workflow task is displayed.<br />
<br />
2. Click the '''Task type''', '''File''' link. The Workflow step is displayed with the following fields in the request:<br />
<br />
* '''Task Name''' – The name of the [[Workflow|workflow]] task.<br />
* '''Created Date''' – The date the task was triggered.<br />
* '''Task Description''' – The description of the task’s purpose.<br />
* '''Action''' – The '''Routing Options''' for the request. These options are only visible for '''Requests For Approval'''.<br />
* '''Comments''' – This box is always visible but can only be used with '''Request For Comments'''.<br />
* '''Object Area''' – The bottom portion of the request screen where the attached object is displayed.<br />
3. Select '''Approve''' to approve the file and click the '''Submit''' button. The '''Approve''' option requires us to select a [[User|user]] to send the approval message to so the '''Select User''' list is displayed.<br />
4. Select the [[User|user]] to receive the approval message and click the '''Submit''' button. The step is complete and the Workflow is also complete. The '''workflow complete''' message is displayed.<br />
<br />
5. Click the '''Communications''', '''Workflow Requests''' button. The [[Workflow|workflow]] is removed from the '''Request to Me''' window.<br />
<br />
==Workflow Diagram==<br />
Clicking on the Diagram button in the action bar of the Edit Workflow page will bring up a graphical representation of the Workflow Tasks that have been configured on that workflow.<br />
<br />
System Administrators use this feature to document and troubleshoot complicated workflow configurations.<br />
<br />
[[Image:workflow2017_17.png|border]]<br />
<br />
<br />
<br />
==Workflow Pending Queue==<br />
On the Edit Workflow page, the Pending Queue tab shows all instances where the workflow in question has been triggered, and the task has been scheduled for future completion.<br />
<br />
The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
[[Image:workflow2017_18.png|900px|border]]<br />
<br />
<br />
<br />
==Workflow History==<br />
In the Edit Workflow page, the history of an individual Workflow can also be accessed by the History tab.<br />
<br />
This page shows all instances of the workflow being triggered. The last column shows the "Objectid" of the entity against which the workflow was fired.<br />
<br />
<br />
<br />
==Workflows Triggered by a Given Entity==<br />
The Workflow History tab is made visible for a given Universal Tracking Application™ by enabling the relevant Manager Permission. Go to UTA – Settings – Security, click on Feature and Function Permissions.<br />
<br />
The Enable Workflow History setting is found on the Feature tab.<br />
<br />
Enabling the Manager Permission will enable the Workflow History section from the Option drop-down on Level 1, Level 2 and Level 3 records.<br />
<br />
[[Image:workflow2017_19.png|border]]<br />
<br />
<br />
Clicking on the Workflow History tab will display the history of workflows triggered on the entity.<br />
<br />
[[Image:workflow2017_20.png|border]]<br />
<br />
<br />
<br />
==Configure System to display Workflow options==<br />
The user creating the workflow must have permission to set company workflow trigger.<br />
<br />
Go to Global settings – Security – System Feature Permissions , go to the Action Permission tab and scroll down to the Workflows - Attach Workflow to Company setting.<br />
<br />
There should be a Lookup button to select the roles that should be allowed to attach the workflow.<br />
<br />
Once the role is selected, the options will display in the edit company view.<br />
<br />
[[Image:workflow2017_21.png|border]]<br />
<br />
<br />
<br />
==Reasons workflow messages aren't arriving==<br />
Some common reasons for workflow messages not arriving are:<br />
<br />
# Your [[Browser|browser]] has a pop-up blocker.<br />
# [[Workflow|Workflows]] are not enabled.<br />
# There is another [[Workflow|workflow]] triggering on the same status.<br />
# Your [[Workflow|workflow]] is not configured properly.<br />
Solution to:<br />
# Allow [[SmartSimple]] as a trusted site '''''or''''' check your [[Browser|browser]] for any tool bars that may be blocking the pop-ups '''''or''''' set the [[Workflow|workflows]] to [[Workflow - Silent Mode|suppress pop-ups]].<br />
# Typically in [[UTA]]s, you will need to edit the ''template'' and enable [[Workflow|workflows]] for the level at which they are being triggered.<br />
# You will need to review the other [[Workflow|workflows]] to make sure that two [[Workflow|workflows]] are not triggering on the same status.<br />
# You will need to review the configuration of the [[Workflow|workflows]] to ensure that the connectors are set appropriately as well as the individual tasks that are to take place.<br />
<br />
==Determining the Workflow ID==<br />
Once a workflow has been created, the workflow ID (''wfid'') can be found as follows:<br />
<br />
* Click on the hyperlink for [[Global Settings]]<br />
* Go System tab, click on the hyperlink for ''Workflows''<br />
* The workflow ID is visible as the right-most column on the list of workflows.<br />
Alternatively:<br />
* Click on the Edit workflow icon for the Workflow you want, and the Workflow ID will be at the top of the page:<br />
<br />
[[Category:System Management]][[Category:Workflows]][[Category:Applications]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Auto_Loader&diff=36205Auto Loader2019-07-02T17:24:40Z<p>Ciaran: /* Defining the Column Mapping */</p>
<hr />
<div>A [[SmartSimple]] feature used to automatically upload files of data related to [[organization|companies]], [[contact]]s and [[Universal Tracking Application]]s.<br />
<br />
==Overview==<br />
The Autoloader feature provides you with the ability to automatically update SmartSimple information with data from external text files. This feature is vital if you need to keep SmartSimple customer or project data in sync with an existing ERP or other legacy system.<br />
<br />
An Autoloader can be triggered whenever a file is added to a designated [[SmartFolder]]. These files can be added manually or uploaded automatically using the file synchronization plug-in – [[SmartSync for Folder Synchronization|SmartSync]].<br />
<br />
* Once a file is added to the [[SmartFolders Overview|SmartFolder]], the autoloader process will recognize that a file has been added and start the upload process.<br />
* Once the file has been processed, it will not be processed a second time unless a new file of the same name is added to the folder.<br />
* Each record from the upload file will update the associated record in the database.<br />
* A log file created indicates the success or failure of each record update and an email can be sent to a designated user indicating the success of the upload.<br />
* If a new version of the file is added to the folder, then this flag is reset and new file will be processed.<br />
* You can create any number of Autoloaders within the system to provide for different upload processes.<br />
* An Autoloader can upload [[organization|companies]], [[contact]]s and [[Universal Tracking Application]] {{l1}} or {{l2}} data.<br />
<br />
Before you can deploy this feature it is necessary to:<br />
<br />
* Define the [[SmartFolders Overview|SmartFolder]], where the upload file will be stored.<br />
* Define the format and layout of the data file – the number of columns in the upload file, the delimiter between each field and the field order.<br />
* Specify a field in the upload file that the system will use to match an upload record to an existing customer record.<br />
* Determine if you wish to use an automated process for files by using the SmartSync utility or manually add the files to the folder.<br />
<br />
Each record in the upload file is used to update one set of fields in the entity to be updated.<br />
The existing value in the SmartSimple field will be replaced by the value on the field in the upload file.<br />
<br />
==Creating a SmartFolder==<br />
* Any SmartFolder can be used as the source for an Autoloader.<br />
* The folder must be used '''exclusively''' for the Autoloader, since every file uploaded will be processed.<br />
* Incorrect files or incorrectly formatted files '''will be processed''' so could lead to data loss and/or creation of invalid data.<br />
'''IMPORTANT''' Because any file uploaded to a SmartFolder that is attached to an autoloader will be processed it is extremely important that the SmartFolder is permissioned and labelled appropriately.<br />
* SmartFolders for autoloaders should be permissioned such that only contacts that need to be able to upload files for autoloading are permitted to do so.<br />
* It is '''best practice''' to put all Autoloader enabled SmartFolders into a parent folder named '''Autoloader''' (with role-restricted access) to help ensure no inappropriate files are uploaded to the folder.<br />
<br />
<br />
<br />
==Preparing the Upload File==<br />
* You must be able to specify a unique field that will be used to link each record in the upload file to each record in the customer record. You cannot use a standard field such as customer name or phone number.<br />
* This common field needs to be present in each record on the upload file and in each customer record. For instance, a unique account number field that you add to the customer table can be linked to the same account number field in the upload data.<br />
* The file to be uploaded must be in '''ASCII''' format. There is no specific file naming convention.<br />
* Each record in the file must be separated by a CR/LF (ASCII 13,10 /D,A) character combination.<br />
* Each field must be delimited by one of the following characters:<br />
<br />
Comma – “,” (ASCII 44/2C)<br />
Tab – (ASCII 9/9)<br />
Pipe – “|” (ASCII 179/B3)<br />
Semi colon – “;” (ASCII 59/3B)<br />
Colon – “:” (ASCII 58/3A)<br />
<br />
: This can be accomplished either using Notepad to create and edit the data for import which can be saved with '''txt''' as the file extension.<br />
: Alternately you can use the '''Save As''' feature within Microsoft Excel and save the document as a '''csv''' file.<br />
'''Notes:'''<br />
* If any of the data to be imported contains commas and you are creating a '''csv''' file from Excel you should export the data using pipes (|) as the separators rather than commas. To do this you need to change the settings on your PC prior to creating the '''csv''' file. The method of doing this depends on your PCs Operating System, but is roughly outlined below:<br />
<br />
Start -> Settings -> Control Panel -> Regional Settings -> Additional Settings Button.<br />
Click the "Number" tab and in the "List Separator" field, <br />
Replace the current default separator with the one you want to use (such as the pipe symbol | ). <br />
* If you use Microsoft Excel to create a '''csv''' file it is recommended that you open the document with Notepad to review the contents prior to Autoloading. If any of the data within the Excel document had line breaks within cells it will create a line break in the '''csv''' document. Each new line in the '''csv''' document will start a new record, thus you must ensure all inner-cell line breaks are removed from either Excel or the '''txt''' document.<br />
* Alternately when performing a CSV import, any columns that have line breaks or delimiters within the content can be contained within double quotes. NOTE: Any double quotes within that content MUST be escaped with a backslash \ in front of the double quote so they aren't treated as the closing quote of the column. Example of a 4-column CSV:<br />
<br />
1st Record|Draft|"This content"|555-1212<br />
2nd Record|Submitted|"That content"|123-4567<br />
3rd Record|Draft|"Broken <br />
Content"|444-5555<br />
4th Record|Draft|"Normal Content Test"|321-9876<br />
5th Record|Submitted|"Backslash Escaped \" quote content<br />
Also with <br />
multiple line breaks"|777-8888<br />
6th Record|Submitted|"Normal Content again"|111-2233<br />
<br />
<br />
===Autoloader Constraints===<br />
* You must be a {{GUA}} in your [[instance]] of SmartSimple to access the Autoloader feature and set up an upload process.<br />
* The user uploading the file must have write permissions to the folder where the file is to be stored.<br />
* You '''must''' not use the upload folder for any purpose other than uploading files, as the autoloader will attempt to process any file added to the folder.<br />
<br />
==Instructions==<br />
This section describes the detailed steps required to use the Autoloader. Carefully examine, using a file editor, the file that will be uploaded.<br />
<br />
Ensure that the file meets the file layout criteria outlined in the previous section:<br />
<br />
* Choose the Configuration, [[Global Settings]] menu.<br />
* Stay on the System tab and scroll down the page.<br />
* Click the '''Autoloader''' link.<br />
* Click the New Autoloader tab.<br />
<br />
<br />
===Setting the Autoloader Name===<br />
As you can define any number of autoloaders each autoloader process must be uniquely named.<br />
<br />
* Set the name for this autoloader process.<br />
<br />
: [[File:Auto3.PNG|thumb|none|400px]]<br />
===Setting the SmartFolder===<br />
* Click the Folder Lookup button to display the [[SmartFolders Overview|SmartFolder]], list.<br />
* Select the folder where you plan to add the file.<br />
<br />
: [[Image:Auto4.png|thumb|none|400px]]<br />
The folder name will be added to the Folder box.<br />
<br />
===Setting the File Properties===<br />
The File Type can be a CSV,Text file, an XML file, Fixed Length, or JSON data.<br />
<br />
The File Encoding can be UTF-8, UTF-16 or ANSI. This option is hidden if the File Type is XML.<br />
<br />
: [[Image:AutoFile.png|thumb|none|400px]]<br />
===Defining the Record Type===<br />
The Record type can be Company, Contact, Resource or a [[Universal Tracking Application]].<br />
<br />
If the selected Record type is Company or Contact then the user is required to populate an additional Item field. The possible options here can include Company or Contact, Event,Transactions, Address and Associations (User or Company) .<br />
<br />
If the selected Record type is a [[UTA]] then the user is required to populate an additional Level field. The possible options here can include Level 1, Level 2, Level 3, Transactions, L1 Company Association, L1 Contact Association, L2 Company Association and L2 Contact Association.<br />
<br />
: [[Image:Auto5.png|thumb|none|400px]]<br />
If the selected Record type is a [[UTA]] and the selected Level is Transaction then the user is required to populate an additional drop-down field reflecting all the levels that the transactions are enabled against.<br />
<br />
: [[Image:Auto5b.png|thumb|none|400px]]<br />
==Additional Settings==<br />
You must set the following additional settings:<br />
<br />
1. '''GENERAL''' tab<br />
<br />
: [[File:Auto6b.PNG]]<br />
* '''Loader Name''' – set the name for the Autoloader<br />
* '''Folder''' – select the SmartFolder where the file will be located<br />
* '''File Type''' – select the file type of the file for processing<br />
* '''File Encoding''' – select the file encoding of the file for processing<br />
* '''Record Type''' – drop-down list that allows the user to select what object to process <br />
* '''Item'''or '''App Level''' – drop-down list of items from the '''Record Type'''. Caption will appear as Item when Record Type set to Contact or Company. Caption appears as App. Level for UTA specific Record Types. <br />
* '''Activate''' – enables the Autoloader. Until this check box is enabled the Autoloader will not execute.<br />
* '''Connection Type''' – drop-down list that allows the user to select the connection type of the external data source.<br />
* '''Frequency''' – drop-down list that allows the user to select when the Autoloader should be run. Options are '''On File Upload''' or '''Scheduled'''.<br />
* '''Launch Hour''' – only displayed if '''Frequency''' is set to '''Scheduled'''. Sets the time on a daily basis that the autoloader will execute. This should be a comma delimited list of the hour values in 24-hour format.<br />
<br />
2. '''PROCESS''' tab<br />
<br />
: [[Image:Auto6.png]]<br />
* '''Workflow before loader starts''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute before the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Workflow after loader ends''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute after the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Run sequencial Autoloader after loader ends''' – [[Linking Autoloaders]]<br />
* '''Trigger Formulas''' – enables the triggering of any template formulas that may exist for the selected record type and item/level. If this check box is not enabled then these formulas will not execute.<br />
* '''Delete First (use with caution)''' – all existing data will be deleted from the [[UTA]] level selected ('''This setting only applies to UTA data''').<br />
*:* '''IMPORTANT''': Delete First is only used to delete UTA data where the data will be completely replaced with uploaded data. '''Use with caution'<br />
* '''Send email with log when Autoloader is done''' – Sends email every time the Autoloader executes with a report of the upload process.(Note: The log file is also stored in the same folder as the uploaded file.)<br />
* '''Send email notification when Autoloader failed to complete''' – Sends email when ftp/sftp connection failed, or when autoloader process was terminated unexpectedly.<br />
* '''Email Log To''' – Sets the email address who will receive a message. Multiple email addresses can be included separated by commas.<br />
<br />
===New Record===<br />
The New Record section of the Autoloader is used to determine how new records in the upload file should be handled.<br />
<br />
The exact fields that are displayed vary depending on the '''Record Type''' and '''Item''' or '''List''' values previously selected.<br />
<br />
====Company Record / Company Item====<br />
: [[Image:Auto7.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update matching record''''' check box. If you enable the other check box '''''Update only, do not create new''', existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Is External''' – choose this option when creating external companies under the root company.<br />
* '''Category''' – determines the organisational category that you wish to be associated with the new records.<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is you wish to have a workflow execute against all records, whether new records or updated records. This can be used to create companies with multiple categories.<br />
<br />
====Contact Record / Contact Item====<br />
: [[Image:Auto7b.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Role''' – determines a user role that you wish to be associated with the new records. If you wish to have multiple roles associated with a user then you will need to trigger a workflow against each record (see below for further details).<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is users wants to have a workflow execute against all records, whether new records or updated records. This can be used to activate users with multiple roles and to e-mail a password to newly created contacts automatically.<br />
<br />
====Company or Contact Record / Event or Transaction Item====<br />
: [[Image:Auto7c.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Event or Transaction types, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Event or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if users wants to have a workflow execute against all records, whether new records or updated records.<br />
<br />
====UTA Record / all Levels====<br />
: [[Image:AutoloaderNewRecordUTA.png|link=]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction types, depending on the exact '''Level''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if you wish to have a workflow execute against all records, whether new records or updated records.<br />
<br />
===File Layout===<br />
The File Layout section is used to determine the number of columns in the file, the delimiter between the columns and the use of a '''HTML table''' to display the data.<br />
<br />
: [[Image:Auto8.png]]<br />
* '''Number of Columns''' - The number of columns you select is used to define the number of columns in the upload file, and the number of fields that can be updated in the database.<br />
** The maximum number of fields that can be updated is 100 fields in a single file.<br />
** If more than 100 fields are required, then you will need to create two upload files.<br />
* '''Ignore Lines''' - You can specify the number of rows to ignore from the beginning of the file. This can be used to ignore column headers, if they exist as the first row in any file.<br />
* '''Field Delimiter''' - drop-down list showing the delimiter options used to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Use HTML Table''' - An HTML table is very useful where imported data contains multiple records and a single record set of fields exists within SmartSimple. For example, if you wished to import multiple lines of sales information into a single text box field you would enable the HTML table feature and then map all the fields into a single field indicating the column and row delimiters. Will not be presented when the File Type is XML.<br />
* '''Column Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Row Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different rows. Will not be presented when the File Type is XML or JSON.<br />
* '''Record Node Name''' - Only presented when the File Type is XML.<br />
* '''Record Node Filter''' - Only presented when the File Type is XML.<br />
<br />
===Defining the Column Mapping===<br />
Once you have defined the number of fields, you define the field order to match the column order in the upload file.<br />
<br />
: [[Image:Auto9.png|thumb|none|900px]]<br />
* The '''number of columns''' you select determines the number of fields you can map.<br />
* The '''field name''' is selected from the Field combo box. (see the Reference section below for information on standard field names)<br />
* In order for the update to succeed, a single field is required to match an upload record to an existing database record this is indicated as the Identifier field. Customer data will generally be an account number type field.<br />
* The''' Table header''' field is only required if you are using the HTML Table feature or when loading an XML or JSON file.<br />
* The '''Duplicate Match Beahviour''' drop-down allows user to specify the behaviour whenever multiple records are matched using the Identifier field(s).<br />
** Update Unique Match Only - will only update when one matching record is found<br />
** Update All Matches - will update all matching records<br />
<br />
<span style="font-size: medium;">'''IMPORTANT:''' </span><br /><br />
The following fields must only be included in the Autoloader field mappings if you are updating '''existing''' records. These fields '''must not''' be used when using the Auto Loader to create new records.<br />
<br />
*::* '''Company ID''' (Company Auto Loader)<br />
*::* '''User ID''' (Contact Auto Loader)<br />
*::* '''Resource ID''' (Resource Auto Loader)<br />
*::* '''Tracking ID''' ({{l2}} / {{l3}} Auto Loader)<br />
<br />
<br />
** When using the fields above the IDs being Auto Loaded must match IDs of records present within the system.<br />
** If used the fields should be marked as the Identifier.<br />
** These fields would normally be used if you have extracted data from [[SmartSimple]] including those ID fields, updated the data outside of [[SmartSimple]] and wish to import the updated information.<br />
<br />
'''NOTE:''' If you wish to deactivate a user using the Autoloader then select the '''Disable User Login (use value of 1)''' Field option and ensure that the uploaded file has a value of 1 in the relevant cells.<br />
<br />
'''NOTE:''' If the Item or App Level option is set to one of the Association options then you can only have Associations ID as identifier. The system we will force the Identifier when Associations ID is selected in mapping, and will only alert them when they try to set any other columns as identifier.<br />
<br />
==Updating Account Owners==<br />
When you are updating company type information you can automatically associate an account field to a user field in order to establish “account ownership”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10a.png]]<br /><br />
''For example, if the imported account file contains an employee ID field, then this can be matched to the user table – providing each user with an employee ID field.''<br />
<br />
==Updating Account Parent==<br />
When you are updating company type information you can automatically associate an account field to a parent account field in order to establish “company hierarchy”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10b.png]]<br /><br />
''For example, if the imported account file contains a parent ID field, then this can be matched to the account table – providing each company with a parent company.''<br /><br />
'''Example: Updating Account Parent AutoLoader Configuration:'''<br /><br />
[[File:Update_Account_Parent_Example.JPG]]<br /><br />
'''The AutoLoader Parent ID field is an Account field that will get populated with the second value (Parent ID) from the CSV record below.'''<br /><br />
'''Example: AutoLoader Source File:'''<br /><br />
[[File:Update_Account_Parent_Example_-_Source_File.JPG]]<br /><br />
'''Action: A two column report with the Company ID and the Parent ID needs to be created, exported to a CSV file and uploaded to the associated AutoLoader SmartFolder. '''<br /><br />
Result: The Account records with a Company ID IN (278520,297733,316703) will have their Parent ID changed to 349238.<br />
<br />
==Updating Event / Transaction Parent Company==<br />
When you are updating company type information related to an Event or a Transaction you can automatically associate an account field to a transaction or event field in order to establish a parent for the transaction. This includes using Account standard fields.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to Company and the '''Item''' to either Event or Transaction.<br />
<br />
<br />
[[Image:Auto10c.png]]<br />
<br />
==Updating Parent Company==<br />
When you are updating people type information you can automatically associate an account field to a user field in order to attach the user to the correct account. This section is only displayed at the bottom of the Autoloader page if you have set the Type to People.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Updating Event / Transaction Parent User==<br />
When you are updating user type related to a Transaction information you can automatically associate a user field to a transaction field in order to establish a parent user for the transaction.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to People and the '''Item''' to either Event or Transaction.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Branch, Company and Owner Custom Field Matching==<br />
When you are updating UTA information you can automatically associate a standard field on the UTA with user and company fields in order to establish individual or organizational ownership. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 1.<br />
<br />
[[Image:Auto10e.png]]<br />
<br />
==Updating Tracking Parent==<br />
When you are updating UTA Level 2 or 3 information you can automatically associate a field on the level 2 with a field on the level 1, or associate a field on the level 3 with a field on the level 1, in order to establish a relationship between the entities.<br />
<br />
If no matches exist then you can select the required action using the No parent matched action drop-down.<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent entity specified in the Default Parent ID field.<br />
This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 2 or Level 3.<br />
<br />
[[Image:Auto10g.png]]<br />
<br />
==Parent record match field ids==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is '''XML'''.<br />
<br />
[[Image:AutoXML.png]]<br />
<br />
==File Preparation==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is either '''CSV,Text''' or '''Fixed Length Text'''.<br />
<br />
It is not available when '''File Type''' is XML.<br />
<br />
See [[Autoloader File Preparation]] for configuration instructions.<br />
<br />
[[Image:AutoFilePreparation.png]]<br />
<br />
==External Data Source==<br />
This section allows for the configuration of an external file source if the user does not want to manually upload the file.<br />
<br />
[[Image:Autoloader_DS1.png ]]<br />
<br />
The '''External Data Source''' is a drop-down list with 5 options available:<br />
<br />
Additional fields are exposed when one of these options is selected, with the exact number and type of fields dependent on the selected option.<br />
<br />
===FTP and SFTP===<br />
[[Image:AutoFTP2.PNG]]<br />
<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
* '''Delete File from Data Source After Downloaded''' - file will be deleted from the sftp site<br />
* '''Append Datetime Stamp to File Name''' - will append date and time when the file picked up from the sftp do not have a datestamp<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from. e.g. ''my.sftp.com'' or ''my.sftp.com:2222''<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Use Private Key''' - enable this setting when using keys as credentials to authenticate<br />
* '''Private Key File''' - upload the private key file<br />
* '''Path''' - exact folder location on the system where the files can be found i.e. "/" for root directory or "/in" or "/out"<br />
* '''File Names''' - name of the files to be loaded via the Autoloader. e.g. HRFeed.csv, Payment_*.csv (Use '''*''' for wildcards in filenames. < br/><br />
<br />
Note that when settings are saved, a '''Verify Connection''' button will appear next to the Login Name Textbox. This button can be used to verify that the url, username, password are correct.<br />
<br />
===HTTP===<br />
[[Image:AutoHTTP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''File Names''' - name of the files to be loaded via the Autoloader<br />
<br />
===SOAP===<br />
[[Image:AutoSOAP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Function''' - The function called by the Web Service call.<br />
* '''Request Body''' - The content of the Web Service message to be sent to the external service.<br />
* '''Callback''' - Method to sends the response back to the client.<br />
<br />
===OData===<br />
<!--Upgrade May 2018 - Ticket#62753--><br />
[[Image:External-OData1.PNG]]<br />
* '''OData Version''' - Version of OData available from the endpoint<br />
* '''URL''' - the endpoint of OData<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
<br />
==Schedule==<br />
[[Image:External-Schedule.PNG]]<br />
<br />
* Frequency -<br />
<br />
'''On File Upload''' - will process autoloader upon file upload<br />
'''Scheduled''' - will allow you to specify the launch times of the autoloader everyday.<br />
* Launch Hour - a 24-hour format on desired hours to pull from external source for processing<br />
<br />
e.g. 07,15,23<br />
* Process Last Completed - datestamp of the last time the autoloader was processed.<br />
<br />
==History==<br />
<span style="color: #ff0000;">Available after February 2019 upgrade.</span> <br/><br />
A new Autoloader feature that shows a new History information tab. The list includes the file name, user who uploaded the file, start time, end time, records added/updated and status of last run.<br />
<br />
==Important note about XML Files==<br />
If the contents of any the elements in an XML file being autoloaded contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server. The '''less than''' symbol (<) and '''ampersand''' (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving understands that they are data content and not part of the XML structure:<br />
<br />
* <br />
*: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
<br />
For example, an '''address''' or '''company name''' could contain ampersands, so should be included as:<br />
<br />
<pre><br />
<primarycontact><br />
<firstname>Jane</firstname><br />
<lastname>Smith</lastname><br />
<address><![CDATA[145 Main Street]]></address><br />
<companyname><![CDATA[Acme & Friends]]></companyname><br />
</primarycontact><br />
</pre><br />
<br />
<br />
* It is advisable to use CDATA for any field containing text since the contents are often unpredictable.<br />
<br />
==Note about JSON Files==<br />
JSON format should start with a '''data''' node, as shown in the example below<br />
<br />
<pre>{<br />
"data":[{<br />
"Name":"Acme Corporation",<br />
"Phone":"416-123-4567",<br />
"CompanyID":"496246"<br />
},<br />
{<br />
"Name":"Super Banana Ltd.",<br />
"Phone":"800-555-1234",<br />
"CompanyID":"496244"<br />
},<br />
{<br />
"Name":"Red Apple Supply",<br />
"Phone":"917-123-0000",<br />
"CompanyID":"496248"<br />
},<br />
{<br />
"Name":"Orange you Glad",<br />
"Phone":"410-222-2030",<br />
"CompanyID":"496242"<br />
}<br />
]<br />
}<br />
</pre><br />
<br />
==Ad hoc upload url==<br />
This is an Autoloader setting that provides a more friendly and accessible user interface for importing data into the system as well as allowing users to verify the file before uploading it to a SmartFolder for processing by the Autoloader.<br />
<br />
[[Image:AdhocAutoload.png|border|100.px]]<br />
<br />
When you click on the Upload File button then you will be presented with page one of the Ad Hoc Autoloader screen. Use the 'Choose file' button to select the file to be loaded and then click the 'Upload' button.<br />
<br />
[[Image:AdhocAutoload1.png|100.px|border]]<br />
<br />
You will be presented with page 2 of the Ad Hoc Autoloader screen, which provides users the option to review the file being uploaded, including what data us being mapped to what field.<br />
<br />
[[Image:AdhocAutoload2.png|100.px|border]]<br />
<br />
If there is no issue with the data and the mappings then click on the 'Add to SmartFolder and Autolader queue' button. You should be presented with page 3 of the Ad Hoc Autoloader screen, which confirms that the file has been successfully added to the SmartFolder.<br />
<br />
[[Image:AdhocAutoload3.png|100.px|border]]<br />
<br />
<br />
<br />
==Reference: Standard Field Names and Variables==<br />
The below table can be used to compare Level 1 Standard Field terminology found in the [[UTA]], on the Autoloader, in the Database, and Variable syntax]]<br />
<br />
{|<br />
|-<br />
| style="background-color: #c8c8c8;"|'''UTA L1 Standard Field Name '''<br />
| style="background-color: #c8c8c8;"|'''Autoloader Standard Field Name'''<br />
| style="background-color: #c8c8c8;"|'''Database name'''<br />
| style="background-color: #c8c8c8;"|'''Variable List'''<br />
|-<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|Level 1 ID<br />
| style="background-color: #f0f0f0;"|opportunityid<br />
| style="background-color: #f0f0f0;"|@opportunityid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Application Type<br />
| style="background-color: #dcdcdc;"|Type Name<br />
| style="background-color: #dcdcdc;"|opportunitytypename<br />
| style="background-color: #dcdcdc;"|@type@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Type ID<br />
| style="background-color: #dcdcdc;"|opportunitytype<br />
| style="background-color: #dcdcdc;"|@typeid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Application Name<br />
| style="background-color: #f0f0f0;"|Name<br />
| style="background-color: #f0f0f0;"|name<br />
| style="background-color: #f0f0f0;"|@name@<br />
|-<br />
| style="background-color: #dcdcdc;"|Customer<br />
| style="background-color: #dcdcdc;"|Client<br />
| style="background-color: #dcdcdc;"|company<br />
| style="background-color: #dcdcdc;"|@client@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client ID<br />
| style="background-color: #dcdcdc;"|companyid<br />
| style="background-color: #dcdcdc;"|@clientid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client Custom Field<br />
| style="background-color: #dcdcdc;"|companycfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|stagename<br />
| style="background-color: #f0f0f0;"|@status@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Status ID<br />
| style="background-color: #f0f0f0;"|stageid<br />
| style="background-color: #f0f0f0;"|@stausid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|revenue<br />
| style="background-color: #dcdcdc;"|@revenue@<br />
|-<br />
| style="background-color: #f0f0f0;"|Currency<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|currencyid<br />
| style="background-color: #f0f0f0;"|@currencyname@/ @currencycode@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency Exchange (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|excur<br />
| style="background-color: #f0f0f0;"|@excurrencycode@/ @excurrencyname@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Exchange Rate<br />
| style="background-color: #f0f0f0;"|excur_rate<br />
| style="background-color: #f0f0f0;"|@exrate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Close Date<br />
| style="background-color: #dcdcdc;"|Close Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|closedate<br />
| style="background-color: #dcdcdc;"|@closedate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Probability<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@probability@<br />
|-<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|description<br />
| style="background-color: #dcdcdc;"|@description@<br />
|-<br />
| style="background-color: #f0f0f0;"|Requirement<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@requirements@<br />
|-<br />
| style="background-color: #dcdcdc;"|Owner<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner ID<br />
| style="background-color: #dcdcdc;"|updatedby<br />
| style="background-color: #dcdcdc;"|@ownerid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner (firstname lastname)<br />
| style="background-color: #dcdcdc;"|updatedbyname<br />
| style="background-color: #dcdcdc;"|@owner@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Email<br />
| style="background-color: #dcdcdc;"|updatedbyemail<br />
| style="background-color: #dcdcdc;"|@owner.email@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Custom Field<br />
| style="background-color: #dcdcdc;"|updatedbyfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|branch<br />
| style="background-color: #f0f0f0;"|@branch@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch ID<br />
| style="background-color: #f0f0f0;"|branchid<br />
| style="background-color: #f0f0f0;"|@branchid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch Custom Field<br />
| style="background-color: #f0f0f0;"|branchcfield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|Workflow<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Contacts<br />
| style="background-color: #f0f0f0;"|n/a (added Import Contacts on UTA)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Activity List<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Date<br />
| style="background-color: #f0f0f0;"|End Date (yyyy-mm-dd)<br />
| style="background-color: #f0f0f0;"|oenddate<br />
| style="background-color: #f0f0f0;"|@enddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Date<br />
| style="background-color: #dcdcdc;"|Start Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|ostartdate<br />
| style="background-color: #dcdcdc;"|@startdate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Modified Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@modifieddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Institutions<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Time<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@hour(fullenddate)@:@minute(fullenddate)@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Time<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@hour(fullstartdate)@:@minute(fullstartdate)@<br />
|-<br />
| style="background-color: #f0f0f0;"|Person<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person ID<br />
| style="background-color: #f0f0f0;"|oppeopleid<br />
| style="background-color: #f0f0f0;"|@personid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person (firstname lastname)<br />
| style="background-color: #f0f0f0;"|oppeoplename<br />
| style="background-color: #f0f0f0;"|@person@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Email<br />
| style="background-color: #f0f0f0;"|oppeopleemail<br />
| style="background-color: #f0f0f0;"|@person.email@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Custom Field<br />
| style="background-color: #f0f0f0;"|oppeoplefield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|UTA Providers<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow task)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|Status Indicator<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Transactions<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|UTA Providers (L2)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #dcdcdc;"|Modified By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@modifiedby@/ @modifiedbyid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Created Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@createddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Created By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Invitations<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|}<br />
<br />
==See Also==<br />
** [[How to Add Users and Contacts]]<br />
** [[Autoloader File Preparation]]<br />
** [[Linking Autoloaders]]<br />
[[Category:Data Import]]<br />
[[Category:Global Settings]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Auto_Loader&diff=36204Auto Loader2019-07-02T17:23:49Z<p>Ciaran: /* Additional Settings */</p>
<hr />
<div>A [[SmartSimple]] feature used to automatically upload files of data related to [[organization|companies]], [[contact]]s and [[Universal Tracking Application]]s.<br />
<br />
==Overview==<br />
The Autoloader feature provides you with the ability to automatically update SmartSimple information with data from external text files. This feature is vital if you need to keep SmartSimple customer or project data in sync with an existing ERP or other legacy system.<br />
<br />
An Autoloader can be triggered whenever a file is added to a designated [[SmartFolder]]. These files can be added manually or uploaded automatically using the file synchronization plug-in – [[SmartSync for Folder Synchronization|SmartSync]].<br />
<br />
* Once a file is added to the [[SmartFolders Overview|SmartFolder]], the autoloader process will recognize that a file has been added and start the upload process.<br />
* Once the file has been processed, it will not be processed a second time unless a new file of the same name is added to the folder.<br />
* Each record from the upload file will update the associated record in the database.<br />
* A log file created indicates the success or failure of each record update and an email can be sent to a designated user indicating the success of the upload.<br />
* If a new version of the file is added to the folder, then this flag is reset and new file will be processed.<br />
* You can create any number of Autoloaders within the system to provide for different upload processes.<br />
* An Autoloader can upload [[organization|companies]], [[contact]]s and [[Universal Tracking Application]] {{l1}} or {{l2}} data.<br />
<br />
Before you can deploy this feature it is necessary to:<br />
<br />
* Define the [[SmartFolders Overview|SmartFolder]], where the upload file will be stored.<br />
* Define the format and layout of the data file – the number of columns in the upload file, the delimiter between each field and the field order.<br />
* Specify a field in the upload file that the system will use to match an upload record to an existing customer record.<br />
* Determine if you wish to use an automated process for files by using the SmartSync utility or manually add the files to the folder.<br />
<br />
Each record in the upload file is used to update one set of fields in the entity to be updated.<br />
The existing value in the SmartSimple field will be replaced by the value on the field in the upload file.<br />
<br />
==Creating a SmartFolder==<br />
* Any SmartFolder can be used as the source for an Autoloader.<br />
* The folder must be used '''exclusively''' for the Autoloader, since every file uploaded will be processed.<br />
* Incorrect files or incorrectly formatted files '''will be processed''' so could lead to data loss and/or creation of invalid data.<br />
'''IMPORTANT''' Because any file uploaded to a SmartFolder that is attached to an autoloader will be processed it is extremely important that the SmartFolder is permissioned and labelled appropriately.<br />
* SmartFolders for autoloaders should be permissioned such that only contacts that need to be able to upload files for autoloading are permitted to do so.<br />
* It is '''best practice''' to put all Autoloader enabled SmartFolders into a parent folder named '''Autoloader''' (with role-restricted access) to help ensure no inappropriate files are uploaded to the folder.<br />
<br />
<br />
<br />
==Preparing the Upload File==<br />
* You must be able to specify a unique field that will be used to link each record in the upload file to each record in the customer record. You cannot use a standard field such as customer name or phone number.<br />
* This common field needs to be present in each record on the upload file and in each customer record. For instance, a unique account number field that you add to the customer table can be linked to the same account number field in the upload data.<br />
* The file to be uploaded must be in '''ASCII''' format. There is no specific file naming convention.<br />
* Each record in the file must be separated by a CR/LF (ASCII 13,10 /D,A) character combination.<br />
* Each field must be delimited by one of the following characters:<br />
<br />
Comma – “,” (ASCII 44/2C)<br />
Tab – (ASCII 9/9)<br />
Pipe – “|” (ASCII 179/B3)<br />
Semi colon – “;” (ASCII 59/3B)<br />
Colon – “:” (ASCII 58/3A)<br />
<br />
: This can be accomplished either using Notepad to create and edit the data for import which can be saved with '''txt''' as the file extension.<br />
: Alternately you can use the '''Save As''' feature within Microsoft Excel and save the document as a '''csv''' file.<br />
'''Notes:'''<br />
* If any of the data to be imported contains commas and you are creating a '''csv''' file from Excel you should export the data using pipes (|) as the separators rather than commas. To do this you need to change the settings on your PC prior to creating the '''csv''' file. The method of doing this depends on your PCs Operating System, but is roughly outlined below:<br />
<br />
Start -> Settings -> Control Panel -> Regional Settings -> Additional Settings Button.<br />
Click the "Number" tab and in the "List Separator" field, <br />
Replace the current default separator with the one you want to use (such as the pipe symbol | ). <br />
* If you use Microsoft Excel to create a '''csv''' file it is recommended that you open the document with Notepad to review the contents prior to Autoloading. If any of the data within the Excel document had line breaks within cells it will create a line break in the '''csv''' document. Each new line in the '''csv''' document will start a new record, thus you must ensure all inner-cell line breaks are removed from either Excel or the '''txt''' document.<br />
* Alternately when performing a CSV import, any columns that have line breaks or delimiters within the content can be contained within double quotes. NOTE: Any double quotes within that content MUST be escaped with a backslash \ in front of the double quote so they aren't treated as the closing quote of the column. Example of a 4-column CSV:<br />
<br />
1st Record|Draft|"This content"|555-1212<br />
2nd Record|Submitted|"That content"|123-4567<br />
3rd Record|Draft|"Broken <br />
Content"|444-5555<br />
4th Record|Draft|"Normal Content Test"|321-9876<br />
5th Record|Submitted|"Backslash Escaped \" quote content<br />
Also with <br />
multiple line breaks"|777-8888<br />
6th Record|Submitted|"Normal Content again"|111-2233<br />
<br />
<br />
===Autoloader Constraints===<br />
* You must be a {{GUA}} in your [[instance]] of SmartSimple to access the Autoloader feature and set up an upload process.<br />
* The user uploading the file must have write permissions to the folder where the file is to be stored.<br />
* You '''must''' not use the upload folder for any purpose other than uploading files, as the autoloader will attempt to process any file added to the folder.<br />
<br />
==Instructions==<br />
This section describes the detailed steps required to use the Autoloader. Carefully examine, using a file editor, the file that will be uploaded.<br />
<br />
Ensure that the file meets the file layout criteria outlined in the previous section:<br />
<br />
* Choose the Configuration, [[Global Settings]] menu.<br />
* Stay on the System tab and scroll down the page.<br />
* Click the '''Autoloader''' link.<br />
* Click the New Autoloader tab.<br />
<br />
<br />
===Setting the Autoloader Name===<br />
As you can define any number of autoloaders each autoloader process must be uniquely named.<br />
<br />
* Set the name for this autoloader process.<br />
<br />
: [[File:Auto3.PNG|thumb|none|400px]]<br />
===Setting the SmartFolder===<br />
* Click the Folder Lookup button to display the [[SmartFolders Overview|SmartFolder]], list.<br />
* Select the folder where you plan to add the file.<br />
<br />
: [[Image:Auto4.png|thumb|none|400px]]<br />
The folder name will be added to the Folder box.<br />
<br />
===Setting the File Properties===<br />
The File Type can be a CSV,Text file, an XML file, Fixed Length, or JSON data.<br />
<br />
The File Encoding can be UTF-8, UTF-16 or ANSI. This option is hidden if the File Type is XML.<br />
<br />
: [[Image:AutoFile.png|thumb|none|400px]]<br />
===Defining the Record Type===<br />
The Record type can be Company, Contact, Resource or a [[Universal Tracking Application]].<br />
<br />
If the selected Record type is Company or Contact then the user is required to populate an additional Item field. The possible options here can include Company or Contact, Event,Transactions, Address and Associations (User or Company) .<br />
<br />
If the selected Record type is a [[UTA]] then the user is required to populate an additional Level field. The possible options here can include Level 1, Level 2, Level 3, Transactions, L1 Company Association, L1 Contact Association, L2 Company Association and L2 Contact Association.<br />
<br />
: [[Image:Auto5.png|thumb|none|400px]]<br />
If the selected Record type is a [[UTA]] and the selected Level is Transaction then the user is required to populate an additional drop-down field reflecting all the levels that the transactions are enabled against.<br />
<br />
: [[Image:Auto5b.png|thumb|none|400px]]<br />
==Additional Settings==<br />
You must set the following additional settings:<br />
<br />
1. '''GENERAL''' tab<br />
<br />
: [[File:Auto6b.PNG]]<br />
* '''Loader Name''' – set the name for the Autoloader<br />
* '''Folder''' – select the SmartFolder where the file will be located<br />
* '''File Type''' – select the file type of the file for processing<br />
* '''File Encoding''' – select the file encoding of the file for processing<br />
* '''Record Type''' – drop-down list that allows the user to select what object to process <br />
* '''Item'''or '''App Level''' – drop-down list of items from the '''Record Type'''. Caption will appear as Item when Record Type set to Contact or Company. Caption appears as App. Level for UTA specific Record Types. <br />
* '''Activate''' – enables the Autoloader. Until this check box is enabled the Autoloader will not execute.<br />
* '''Connection Type''' – drop-down list that allows the user to select the connection type of the external data source.<br />
* '''Frequency''' – drop-down list that allows the user to select when the Autoloader should be run. Options are '''On File Upload''' or '''Scheduled'''.<br />
* '''Launch Hour''' – only displayed if '''Frequency''' is set to '''Scheduled'''. Sets the time on a daily basis that the autoloader will execute. This should be a comma delimited list of the hour values in 24-hour format.<br />
<br />
2. '''PROCESS''' tab<br />
<br />
: [[Image:Auto6.png]]<br />
* '''Workflow before loader starts''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute before the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Workflow after loader ends''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute after the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Run sequencial Autoloader after loader ends''' – [[Linking Autoloaders]]<br />
* '''Trigger Formulas''' – enables the triggering of any template formulas that may exist for the selected record type and item/level. If this check box is not enabled then these formulas will not execute.<br />
* '''Delete First (use with caution)''' – all existing data will be deleted from the [[UTA]] level selected ('''This setting only applies to UTA data''').<br />
*:* '''IMPORTANT''': Delete First is only used to delete UTA data where the data will be completely replaced with uploaded data. '''Use with caution'<br />
* '''Send email with log when Autoloader is done''' – Sends email every time the Autoloader executes with a report of the upload process.(Note: The log file is also stored in the same folder as the uploaded file.)<br />
* '''Send email notification when Autoloader failed to complete''' – Sends email when ftp/sftp connection failed, or when autoloader process was terminated unexpectedly.<br />
* '''Email Log To''' – Sets the email address who will receive a message. Multiple email addresses can be included separated by commas.<br />
<br />
===New Record===<br />
The New Record section of the Autoloader is used to determine how new records in the upload file should be handled.<br />
<br />
The exact fields that are displayed vary depending on the '''Record Type''' and '''Item''' or '''List''' values previously selected.<br />
<br />
====Company Record / Company Item====<br />
: [[Image:Auto7.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update matching record''''' check box. If you enable the other check box '''''Update only, do not create new''', existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Is External''' – choose this option when creating external companies under the root company.<br />
* '''Category''' – determines the organisational category that you wish to be associated with the new records.<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is you wish to have a workflow execute against all records, whether new records or updated records. This can be used to create companies with multiple categories.<br />
<br />
====Contact Record / Contact Item====<br />
: [[Image:Auto7b.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Role''' – determines a user role that you wish to be associated with the new records. If you wish to have multiple roles associated with a user then you will need to trigger a workflow against each record (see below for further details).<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is users wants to have a workflow execute against all records, whether new records or updated records. This can be used to activate users with multiple roles and to e-mail a password to newly created contacts automatically.<br />
<br />
====Company or Contact Record / Event or Transaction Item====<br />
: [[Image:Auto7c.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Event or Transaction types, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Event or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if users wants to have a workflow execute against all records, whether new records or updated records.<br />
<br />
====UTA Record / all Levels====<br />
: [[Image:AutoloaderNewRecordUTA.png|link=]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction types, depending on the exact '''Level''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if you wish to have a workflow execute against all records, whether new records or updated records.<br />
<br />
===File Layout===<br />
The File Layout section is used to determine the number of columns in the file, the delimiter between the columns and the use of a '''HTML table''' to display the data.<br />
<br />
: [[Image:Auto8.png]]<br />
* '''Number of Columns''' - The number of columns you select is used to define the number of columns in the upload file, and the number of fields that can be updated in the database.<br />
** The maximum number of fields that can be updated is 100 fields in a single file.<br />
** If more than 100 fields are required, then you will need to create two upload files.<br />
* '''Ignore Lines''' - You can specify the number of rows to ignore from the beginning of the file. This can be used to ignore column headers, if they exist as the first row in any file.<br />
* '''Field Delimiter''' - drop-down list showing the delimiter options used to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Use HTML Table''' - An HTML table is very useful where imported data contains multiple records and a single record set of fields exists within SmartSimple. For example, if you wished to import multiple lines of sales information into a single text box field you would enable the HTML table feature and then map all the fields into a single field indicating the column and row delimiters. Will not be presented when the File Type is XML.<br />
* '''Column Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Row Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different rows. Will not be presented when the File Type is XML or JSON.<br />
* '''Record Node Name''' - Only presented when the File Type is XML.<br />
* '''Record Node Filter''' - Only presented when the File Type is XML.<br />
<br />
===Defining the Column Mapping===<br />
Once you have defined the number of fields, you define the field order to match the column order in the upload file.<br />
<br />
: [[Image:Auto9.png|thumb|none|900px]]<br />
* The '''number of columns''' you select determines the number of fields you can map.<br />
* The '''field name''' is selected from the Field combo box. (see the Reference section below for information on standard field names)<br />
* In order for the update to succeed, a single field is required to match an upload record to an existing database record this is indicated as the Identifier field. Customer data will generally be an account number type field.<br />
* The''' Table header''' field is only required if you are using the HTML Table feature or when loading an XML or JSON file.<br />
* The '''Duplicate Match Beahviour''' drop-down allows user to specify the behaviour whenever multiple records are matched using the Identifier field(s).<br />
** Update Unique Match Only - will only update when one matching record is found<br />
** Update All Matches - will update all matching records<br />
<br />
<span style="font-size: medium;">'''IMPORTANT:''' </span><br /><br />
The following fields must only be included in the Autoloader field mappings if you are updating '''existing''' records. These fields '''must not''' be used when using the Auto Loader to create new records.<br />
<br />
**::* '''Company ID''' (Company Auto Loader)<br />
**::* '''User ID''' (Contact Auto Loader)<br />
**::* '''Resource ID''' (Resource Auto Loader)<br />
**::* '''Tracking ID''' ({{l2}} / {{l3}} Auto Loader)<br />
<br />
<br />
** When using the fields above the IDs being Auto Loaded must match IDs of records present within the system.<br />
** If used the fields should be marked as the Identifier.<br />
** These fields would normally be used if you have extracted data from [[SmartSimple]] including those ID fields, updated the data outside of [[SmartSimple]] and wish to import the updated information.<br />
NOTE: If you wish to deactivate a user using the Autoloader then select the '''Disable User Login (use value of 1)''' Field option and ensure that the uploaded file has a value of 1 in the relevant cells.<br />
NOTE: If the Item or App Level option is set to one of the Association options then you can only have Associations ID as identifier. The system we will force the Identifier when Associations ID is selected in mapping, and will only alert them when they try to set any other columns as identifier.<br />
<br />
==Updating Account Owners==<br />
When you are updating company type information you can automatically associate an account field to a user field in order to establish “account ownership”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10a.png]]<br /><br />
''For example, if the imported account file contains an employee ID field, then this can be matched to the user table – providing each user with an employee ID field.''<br />
<br />
==Updating Account Parent==<br />
When you are updating company type information you can automatically associate an account field to a parent account field in order to establish “company hierarchy”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10b.png]]<br /><br />
''For example, if the imported account file contains a parent ID field, then this can be matched to the account table – providing each company with a parent company.''<br /><br />
'''Example: Updating Account Parent AutoLoader Configuration:'''<br /><br />
[[File:Update_Account_Parent_Example.JPG]]<br /><br />
'''The AutoLoader Parent ID field is an Account field that will get populated with the second value (Parent ID) from the CSV record below.'''<br /><br />
'''Example: AutoLoader Source File:'''<br /><br />
[[File:Update_Account_Parent_Example_-_Source_File.JPG]]<br /><br />
'''Action: A two column report with the Company ID and the Parent ID needs to be created, exported to a CSV file and uploaded to the associated AutoLoader SmartFolder. '''<br /><br />
Result: The Account records with a Company ID IN (278520,297733,316703) will have their Parent ID changed to 349238.<br />
<br />
==Updating Event / Transaction Parent Company==<br />
When you are updating company type information related to an Event or a Transaction you can automatically associate an account field to a transaction or event field in order to establish a parent for the transaction. This includes using Account standard fields.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to Company and the '''Item''' to either Event or Transaction.<br />
<br />
<br />
[[Image:Auto10c.png]]<br />
<br />
==Updating Parent Company==<br />
When you are updating people type information you can automatically associate an account field to a user field in order to attach the user to the correct account. This section is only displayed at the bottom of the Autoloader page if you have set the Type to People.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Updating Event / Transaction Parent User==<br />
When you are updating user type related to a Transaction information you can automatically associate a user field to a transaction field in order to establish a parent user for the transaction.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to People and the '''Item''' to either Event or Transaction.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Branch, Company and Owner Custom Field Matching==<br />
When you are updating UTA information you can automatically associate a standard field on the UTA with user and company fields in order to establish individual or organizational ownership. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 1.<br />
<br />
[[Image:Auto10e.png]]<br />
<br />
==Updating Tracking Parent==<br />
When you are updating UTA Level 2 or 3 information you can automatically associate a field on the level 2 with a field on the level 1, or associate a field on the level 3 with a field on the level 1, in order to establish a relationship between the entities.<br />
<br />
If no matches exist then you can select the required action using the No parent matched action drop-down.<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent entity specified in the Default Parent ID field.<br />
This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 2 or Level 3.<br />
<br />
[[Image:Auto10g.png]]<br />
<br />
==Parent record match field ids==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is '''XML'''.<br />
<br />
[[Image:AutoXML.png]]<br />
<br />
==File Preparation==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is either '''CSV,Text''' or '''Fixed Length Text'''.<br />
<br />
It is not available when '''File Type''' is XML.<br />
<br />
See [[Autoloader File Preparation]] for configuration instructions.<br />
<br />
[[Image:AutoFilePreparation.png]]<br />
<br />
==External Data Source==<br />
This section allows for the configuration of an external file source if the user does not want to manually upload the file.<br />
<br />
[[Image:Autoloader_DS1.png ]]<br />
<br />
The '''External Data Source''' is a drop-down list with 5 options available:<br />
<br />
Additional fields are exposed when one of these options is selected, with the exact number and type of fields dependent on the selected option.<br />
<br />
===FTP and SFTP===<br />
[[Image:AutoFTP2.PNG]]<br />
<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
* '''Delete File from Data Source After Downloaded''' - file will be deleted from the sftp site<br />
* '''Append Datetime Stamp to File Name''' - will append date and time when the file picked up from the sftp do not have a datestamp<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from. e.g. ''my.sftp.com'' or ''my.sftp.com:2222''<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Use Private Key''' - enable this setting when using keys as credentials to authenticate<br />
* '''Private Key File''' - upload the private key file<br />
* '''Path''' - exact folder location on the system where the files can be found i.e. "/" for root directory or "/in" or "/out"<br />
* '''File Names''' - name of the files to be loaded via the Autoloader. e.g. HRFeed.csv, Payment_*.csv (Use '''*''' for wildcards in filenames. < br/><br />
<br />
Note that when settings are saved, a '''Verify Connection''' button will appear next to the Login Name Textbox. This button can be used to verify that the url, username, password are correct.<br />
<br />
===HTTP===<br />
[[Image:AutoHTTP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''File Names''' - name of the files to be loaded via the Autoloader<br />
<br />
===SOAP===<br />
[[Image:AutoSOAP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Function''' - The function called by the Web Service call.<br />
* '''Request Body''' - The content of the Web Service message to be sent to the external service.<br />
* '''Callback''' - Method to sends the response back to the client.<br />
<br />
===OData===<br />
<!--Upgrade May 2018 - Ticket#62753--><br />
[[Image:External-OData1.PNG]]<br />
* '''OData Version''' - Version of OData available from the endpoint<br />
* '''URL''' - the endpoint of OData<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
<br />
==Schedule==<br />
[[Image:External-Schedule.PNG]]<br />
<br />
* Frequency -<br />
<br />
'''On File Upload''' - will process autoloader upon file upload<br />
'''Scheduled''' - will allow you to specify the launch times of the autoloader everyday.<br />
* Launch Hour - a 24-hour format on desired hours to pull from external source for processing<br />
<br />
e.g. 07,15,23<br />
* Process Last Completed - datestamp of the last time the autoloader was processed.<br />
<br />
==History==<br />
<span style="color: #ff0000;">Available after February 2019 upgrade.</span> <br/><br />
A new Autoloader feature that shows a new History information tab. The list includes the file name, user who uploaded the file, start time, end time, records added/updated and status of last run.<br />
<br />
==Important note about XML Files==<br />
If the contents of any the elements in an XML file being autoloaded contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server. The '''less than''' symbol (<) and '''ampersand''' (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving understands that they are data content and not part of the XML structure:<br />
<br />
* <br />
*: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
<br />
For example, an '''address''' or '''company name''' could contain ampersands, so should be included as:<br />
<br />
<pre><br />
<primarycontact><br />
<firstname>Jane</firstname><br />
<lastname>Smith</lastname><br />
<address><![CDATA[145 Main Street]]></address><br />
<companyname><![CDATA[Acme & Friends]]></companyname><br />
</primarycontact><br />
</pre><br />
<br />
<br />
* It is advisable to use CDATA for any field containing text since the contents are often unpredictable.<br />
<br />
==Note about JSON Files==<br />
JSON format should start with a '''data''' node, as shown in the example below<br />
<br />
<pre>{<br />
"data":[{<br />
"Name":"Acme Corporation",<br />
"Phone":"416-123-4567",<br />
"CompanyID":"496246"<br />
},<br />
{<br />
"Name":"Super Banana Ltd.",<br />
"Phone":"800-555-1234",<br />
"CompanyID":"496244"<br />
},<br />
{<br />
"Name":"Red Apple Supply",<br />
"Phone":"917-123-0000",<br />
"CompanyID":"496248"<br />
},<br />
{<br />
"Name":"Orange you Glad",<br />
"Phone":"410-222-2030",<br />
"CompanyID":"496242"<br />
}<br />
]<br />
}<br />
</pre><br />
<br />
==Ad hoc upload url==<br />
This is an Autoloader setting that provides a more friendly and accessible user interface for importing data into the system as well as allowing users to verify the file before uploading it to a SmartFolder for processing by the Autoloader.<br />
<br />
[[Image:AdhocAutoload.png|border|100.px]]<br />
<br />
When you click on the Upload File button then you will be presented with page one of the Ad Hoc Autoloader screen. Use the 'Choose file' button to select the file to be loaded and then click the 'Upload' button.<br />
<br />
[[Image:AdhocAutoload1.png|100.px|border]]<br />
<br />
You will be presented with page 2 of the Ad Hoc Autoloader screen, which provides users the option to review the file being uploaded, including what data us being mapped to what field.<br />
<br />
[[Image:AdhocAutoload2.png|100.px|border]]<br />
<br />
If there is no issue with the data and the mappings then click on the 'Add to SmartFolder and Autolader queue' button. You should be presented with page 3 of the Ad Hoc Autoloader screen, which confirms that the file has been successfully added to the SmartFolder.<br />
<br />
[[Image:AdhocAutoload3.png|100.px|border]]<br />
<br />
<br />
<br />
==Reference: Standard Field Names and Variables==<br />
The below table can be used to compare Level 1 Standard Field terminology found in the [[UTA]], on the Autoloader, in the Database, and Variable syntax]]<br />
<br />
{|<br />
|-<br />
| style="background-color: #c8c8c8;"|'''UTA L1 Standard Field Name '''<br />
| style="background-color: #c8c8c8;"|'''Autoloader Standard Field Name'''<br />
| style="background-color: #c8c8c8;"|'''Database name'''<br />
| style="background-color: #c8c8c8;"|'''Variable List'''<br />
|-<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|Level 1 ID<br />
| style="background-color: #f0f0f0;"|opportunityid<br />
| style="background-color: #f0f0f0;"|@opportunityid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Application Type<br />
| style="background-color: #dcdcdc;"|Type Name<br />
| style="background-color: #dcdcdc;"|opportunitytypename<br />
| style="background-color: #dcdcdc;"|@type@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Type ID<br />
| style="background-color: #dcdcdc;"|opportunitytype<br />
| style="background-color: #dcdcdc;"|@typeid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Application Name<br />
| style="background-color: #f0f0f0;"|Name<br />
| style="background-color: #f0f0f0;"|name<br />
| style="background-color: #f0f0f0;"|@name@<br />
|-<br />
| style="background-color: #dcdcdc;"|Customer<br />
| style="background-color: #dcdcdc;"|Client<br />
| style="background-color: #dcdcdc;"|company<br />
| style="background-color: #dcdcdc;"|@client@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client ID<br />
| style="background-color: #dcdcdc;"|companyid<br />
| style="background-color: #dcdcdc;"|@clientid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client Custom Field<br />
| style="background-color: #dcdcdc;"|companycfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|stagename<br />
| style="background-color: #f0f0f0;"|@status@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Status ID<br />
| style="background-color: #f0f0f0;"|stageid<br />
| style="background-color: #f0f0f0;"|@stausid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|revenue<br />
| style="background-color: #dcdcdc;"|@revenue@<br />
|-<br />
| style="background-color: #f0f0f0;"|Currency<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|currencyid<br />
| style="background-color: #f0f0f0;"|@currencyname@/ @currencycode@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency Exchange (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|excur<br />
| style="background-color: #f0f0f0;"|@excurrencycode@/ @excurrencyname@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Exchange Rate<br />
| style="background-color: #f0f0f0;"|excur_rate<br />
| style="background-color: #f0f0f0;"|@exrate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Close Date<br />
| style="background-color: #dcdcdc;"|Close Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|closedate<br />
| style="background-color: #dcdcdc;"|@closedate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Probability<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@probability@<br />
|-<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|description<br />
| style="background-color: #dcdcdc;"|@description@<br />
|-<br />
| style="background-color: #f0f0f0;"|Requirement<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@requirements@<br />
|-<br />
| style="background-color: #dcdcdc;"|Owner<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner ID<br />
| style="background-color: #dcdcdc;"|updatedby<br />
| style="background-color: #dcdcdc;"|@ownerid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner (firstname lastname)<br />
| style="background-color: #dcdcdc;"|updatedbyname<br />
| style="background-color: #dcdcdc;"|@owner@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Email<br />
| style="background-color: #dcdcdc;"|updatedbyemail<br />
| style="background-color: #dcdcdc;"|@owner.email@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Custom Field<br />
| style="background-color: #dcdcdc;"|updatedbyfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|branch<br />
| style="background-color: #f0f0f0;"|@branch@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch ID<br />
| style="background-color: #f0f0f0;"|branchid<br />
| style="background-color: #f0f0f0;"|@branchid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch Custom Field<br />
| style="background-color: #f0f0f0;"|branchcfield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|Workflow<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Contacts<br />
| style="background-color: #f0f0f0;"|n/a (added Import Contacts on UTA)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Activity List<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Date<br />
| style="background-color: #f0f0f0;"|End Date (yyyy-mm-dd)<br />
| style="background-color: #f0f0f0;"|oenddate<br />
| style="background-color: #f0f0f0;"|@enddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Date<br />
| style="background-color: #dcdcdc;"|Start Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|ostartdate<br />
| style="background-color: #dcdcdc;"|@startdate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Modified Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@modifieddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Institutions<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Time<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@hour(fullenddate)@:@minute(fullenddate)@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Time<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@hour(fullstartdate)@:@minute(fullstartdate)@<br />
|-<br />
| style="background-color: #f0f0f0;"|Person<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person ID<br />
| style="background-color: #f0f0f0;"|oppeopleid<br />
| style="background-color: #f0f0f0;"|@personid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person (firstname lastname)<br />
| style="background-color: #f0f0f0;"|oppeoplename<br />
| style="background-color: #f0f0f0;"|@person@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Email<br />
| style="background-color: #f0f0f0;"|oppeopleemail<br />
| style="background-color: #f0f0f0;"|@person.email@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Custom Field<br />
| style="background-color: #f0f0f0;"|oppeoplefield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|UTA Providers<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow task)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|Status Indicator<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Transactions<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|UTA Providers (L2)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #dcdcdc;"|Modified By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@modifiedby@/ @modifiedbyid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Created Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@createddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Created By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Invitations<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|}<br />
<br />
==See Also==<br />
** [[How to Add Users and Contacts]]<br />
** [[Autoloader File Preparation]]<br />
** [[Linking Autoloaders]]<br />
[[Category:Data Import]]<br />
[[Category:Global Settings]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Auto_Loader&diff=36203Auto Loader2019-07-02T17:12:50Z<p>Ciaran: </p>
<hr />
<div>A [[SmartSimple]] feature used to automatically upload files of data related to [[organization|companies]], [[contact]]s and [[Universal Tracking Application]]s.<br />
<br />
==Overview==<br />
The Autoloader feature provides you with the ability to automatically update SmartSimple information with data from external text files. This feature is vital if you need to keep SmartSimple customer or project data in sync with an existing ERP or other legacy system.<br />
<br />
An Autoloader can be triggered whenever a file is added to a designated [[SmartFolder]]. These files can be added manually or uploaded automatically using the file synchronization plug-in – [[SmartSync for Folder Synchronization|SmartSync]].<br />
<br />
* Once a file is added to the [[SmartFolders Overview|SmartFolder]], the autoloader process will recognize that a file has been added and start the upload process.<br />
* Once the file has been processed, it will not be processed a second time unless a new file of the same name is added to the folder.<br />
* Each record from the upload file will update the associated record in the database.<br />
* A log file created indicates the success or failure of each record update and an email can be sent to a designated user indicating the success of the upload.<br />
* If a new version of the file is added to the folder, then this flag is reset and new file will be processed.<br />
* You can create any number of Autoloaders within the system to provide for different upload processes.<br />
* An Autoloader can upload [[organization|companies]], [[contact]]s and [[Universal Tracking Application]] {{l1}} or {{l2}} data.<br />
<br />
Before you can deploy this feature it is necessary to:<br />
<br />
* Define the [[SmartFolders Overview|SmartFolder]], where the upload file will be stored.<br />
* Define the format and layout of the data file – the number of columns in the upload file, the delimiter between each field and the field order.<br />
* Specify a field in the upload file that the system will use to match an upload record to an existing customer record.<br />
* Determine if you wish to use an automated process for files by using the SmartSync utility or manually add the files to the folder.<br />
<br />
Each record in the upload file is used to update one set of fields in the entity to be updated.<br />
The existing value in the SmartSimple field will be replaced by the value on the field in the upload file.<br />
<br />
==Creating a SmartFolder==<br />
* Any SmartFolder can be used as the source for an Autoloader.<br />
* The folder must be used '''exclusively''' for the Autoloader, since every file uploaded will be processed.<br />
* Incorrect files or incorrectly formatted files '''will be processed''' so could lead to data loss and/or creation of invalid data.<br />
'''IMPORTANT''' Because any file uploaded to a SmartFolder that is attached to an autoloader will be processed it is extremely important that the SmartFolder is permissioned and labelled appropriately.<br />
* SmartFolders for autoloaders should be permissioned such that only contacts that need to be able to upload files for autoloading are permitted to do so.<br />
* It is '''best practice''' to put all Autoloader enabled SmartFolders into a parent folder named '''Autoloader''' (with role-restricted access) to help ensure no inappropriate files are uploaded to the folder.<br />
<br />
<br />
<br />
==Preparing the Upload File==<br />
* You must be able to specify a unique field that will be used to link each record in the upload file to each record in the customer record. You cannot use a standard field such as customer name or phone number.<br />
* This common field needs to be present in each record on the upload file and in each customer record. For instance, a unique account number field that you add to the customer table can be linked to the same account number field in the upload data.<br />
* The file to be uploaded must be in '''ASCII''' format. There is no specific file naming convention.<br />
* Each record in the file must be separated by a CR/LF (ASCII 13,10 /D,A) character combination.<br />
* Each field must be delimited by one of the following characters:<br />
<br />
Comma – “,” (ASCII 44/2C)<br />
Tab – (ASCII 9/9)<br />
Pipe – “|” (ASCII 179/B3)<br />
Semi colon – “;” (ASCII 59/3B)<br />
Colon – “:” (ASCII 58/3A)<br />
<br />
: This can be accomplished either using Notepad to create and edit the data for import which can be saved with '''txt''' as the file extension.<br />
: Alternately you can use the '''Save As''' feature within Microsoft Excel and save the document as a '''csv''' file.<br />
'''Notes:'''<br />
* If any of the data to be imported contains commas and you are creating a '''csv''' file from Excel you should export the data using pipes (|) as the separators rather than commas. To do this you need to change the settings on your PC prior to creating the '''csv''' file. The method of doing this depends on your PCs Operating System, but is roughly outlined below:<br />
<br />
Start -> Settings -> Control Panel -> Regional Settings -> Additional Settings Button.<br />
Click the "Number" tab and in the "List Separator" field, <br />
Replace the current default separator with the one you want to use (such as the pipe symbol | ). <br />
* If you use Microsoft Excel to create a '''csv''' file it is recommended that you open the document with Notepad to review the contents prior to Autoloading. If any of the data within the Excel document had line breaks within cells it will create a line break in the '''csv''' document. Each new line in the '''csv''' document will start a new record, thus you must ensure all inner-cell line breaks are removed from either Excel or the '''txt''' document.<br />
* Alternately when performing a CSV import, any columns that have line breaks or delimiters within the content can be contained within double quotes. NOTE: Any double quotes within that content MUST be escaped with a backslash \ in front of the double quote so they aren't treated as the closing quote of the column. Example of a 4-column CSV:<br />
<br />
1st Record|Draft|"This content"|555-1212<br />
2nd Record|Submitted|"That content"|123-4567<br />
3rd Record|Draft|"Broken <br />
Content"|444-5555<br />
4th Record|Draft|"Normal Content Test"|321-9876<br />
5th Record|Submitted|"Backslash Escaped \" quote content<br />
Also with <br />
multiple line breaks"|777-8888<br />
6th Record|Submitted|"Normal Content again"|111-2233<br />
<br />
<br />
===Autoloader Constraints===<br />
* You must be a {{GUA}} in your [[instance]] of SmartSimple to access the Autoloader feature and set up an upload process.<br />
* The user uploading the file must have write permissions to the folder where the file is to be stored.<br />
* You '''must''' not use the upload folder for any purpose other than uploading files, as the autoloader will attempt to process any file added to the folder.<br />
<br />
==Instructions==<br />
This section describes the detailed steps required to use the Autoloader. Carefully examine, using a file editor, the file that will be uploaded.<br />
<br />
Ensure that the file meets the file layout criteria outlined in the previous section:<br />
<br />
* Choose the Configuration, [[Global Settings]] menu.<br />
* Stay on the System tab and scroll down the page.<br />
* Click the '''Autoloader''' link.<br />
* Click the New Autoloader tab.<br />
<br />
<br />
===Setting the Autoloader Name===<br />
As you can define any number of autoloaders each autoloader process must be uniquely named.<br />
<br />
* Set the name for this autoloader process.<br />
<br />
: [[File:Auto3.PNG|thumb|none|400px]]<br />
===Setting the SmartFolder===<br />
* Click the Folder Lookup button to display the [[SmartFolders Overview|SmartFolder]], list.<br />
* Select the folder where you plan to add the file.<br />
<br />
: [[Image:Auto4.png|thumb|none|400px]]<br />
The folder name will be added to the Folder box.<br />
<br />
===Setting the File Properties===<br />
The File Type can be a CSV,Text file, an XML file, Fixed Length, or JSON data.<br />
<br />
The File Encoding can be UTF-8, UTF-16 or ANSI. This option is hidden if the File Type is XML.<br />
<br />
: [[Image:AutoFile.png|thumb|none|400px]]<br />
===Defining the Record Type===<br />
The Record type can be Company, Contact, Resource or a [[Universal Tracking Application]].<br />
<br />
If the selected Record type is Company or Contact then the user is required to populate an additional Item field. The possible options here can include Company or Contact, Event,Transactions, Address and Associations (User or Company) .<br />
<br />
If the selected Record type is a [[UTA]] then the user is required to populate an additional Level field. The possible options here can include Level 1, Level 2, Level 3, Transactions, L1 Company Association, L1 Contact Association, L2 Company Association and L2 Contact Association.<br />
<br />
: [[Image:Auto5.png|thumb|none|400px]]<br />
If the selected Record type is a [[UTA]] and the selected Level is Transaction then the user is required to populate an additional drop-down field reflecting all the levels that the transactions are enabled against.<br />
<br />
: [[Image:Auto5b.png|thumb|none|400px]]<br />
==Additional Settings==<br />
You must set the following additional settings:<br />
<br />
1. '''GENERAL''' tab<br />
<br />
: [[File:Auto6b.PNG]]<br />
* '''Loader Name''' – set the name for the Autoloader<br />
* '''Folder''' – select the SmartFolder where the file will be located<br />
* '''File Type''' – select the file type of the file for processing<br />
* '''File Encoding''' – select the file encoding of the file for processing<br />
* '''Record Type''' – drop-down list that allows the user to select what object to process<br />
* '''Item''' – drop-down list of items from the '''Record Type'''<br />
* '''Activate''' – enables the Autoloader. Until this check box is enabled the Autoloader will not execute.<br />
* '''Connection Type''' – drop-down list that allows the user to select the connection type of the external data source.<br />
* '''Frequency''' – drop-down list that allows the user to select when the Autoloader should be run. Options are '''On File Upload''' or '''Scheduled'''.<br />
* '''Launch Hour''' – only displayed if '''Frequency''' is set to '''Scheduled'''. Sets the time on a daily basis that the autoloader will execute. This should be a comma delimited list of the hour values in 24-hour format.<br />
<br />
2. '''PROCESS''' tab<br />
<br />
: [[Image:Auto6.png]]<br />
* '''Workflow before loader starts''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute before the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Workflow after loader ends''' – drop-down list that contains a list of all workflows in the system. It defaults to No and if users wants to have a workflow execute after the Autoloader adds the data to the system they should select the relevant workflow.<br />
* '''Run sequencial Autoloader after loader ends''' – [[Linking Autoloaders]]<br />
* '''Trigger Formulas''' – enables the triggering of any template formulas that may exist for the selected record type and item/level. If this check box is not enabled then these formulas will not execute.<br />
* '''Delete First (use with caution)''' – all existing data will be deleted from the [[UTA]] level selected ('''This setting only applies to UTA data''').<br />
*:* '''IMPORTANT''': Delete First is only used to delete UTA data where the data will be completely replaced with uploaded data. '''Use with caution'<br />
* '''Send email with log when Autoloader is done''' – Sends email every time the Autoloader executes with a report of the upload process.(Note: The log file is also stored in the same folder as the uploaded file.)<br />
* '''Send email notification when Autoloader failed to complete''' – Sends email when ftp/sftp connection failed, or when autoloader process was terminated unexpectedly.<br />
* '''Email Log To''' – Sets the email address who will receive a message. Multiple email addresses can be included separated by commas.<br />
<br />
===New Record===<br />
The New Record section of the Autoloader is used to determine how new records in the upload file should be handled.<br />
<br />
The exact fields that are displayed vary depending on the '''Record Type''' and '''Item''' or '''List''' values previously selected.<br />
<br />
====Company Record / Company Item====<br />
: [[Image:Auto7.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update matching record''''' check box. If you enable the other check box '''''Update only, do not create new''', existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Is External''' – choose this option when creating external companies under the root company.<br />
* '''Category''' – determines the organisational category that you wish to be associated with the new records.<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is you wish to have a workflow execute against all records, whether new records or updated records. This can be used to create companies with multiple categories.<br />
<br />
====Contact Record / Contact Item====<br />
: [[Image:Auto7b.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Account''' – determines where in the organisational hierarchy new records should be added.<br />
* '''Role''' – determines a user role that you wish to be associated with the new records. If you wish to have multiple roles associated with a user then you will need to trigger a workflow against each record (see below for further details).<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated is users wants to have a workflow execute against all records, whether new records or updated records. This can be used to activate users with multiple roles and to e-mail a password to newly created contacts automatically.<br />
<br />
====Company or Contact Record / Event or Transaction Item====<br />
: [[Image:Auto7c.png]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Event or Transaction types, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Event or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list that of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if users wants to have a workflow execute against all records, whether new records or updated records.<br />
<br />
====UTA Record / all Levels====<br />
: [[Image:AutoloaderNewRecordUTA.png|link=]]<br />
* '''Create/Update Behavior''' - If you wish to create new record, then enable the '''Create new or update Matching record''' check box. If you do not enable the other check box '''Update only, do not create new''' existing records will be updated but new records will be rejected.<br />
* '''Duplicate Match Behavior''' - behavior when multiple records are matched by the same identifier key.<br />
* '''Type''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction types, depending on the exact '''Level''' selected. It defaults to N/A<br />
* '''Status''' – drop-down list of all Level 1, Level 2, Level 3 or Transaction statuses, depending on the exact '''Item''' selected. It defaults to N/A<br />
* '''Trigger Workflow''' – drop-down list of all workflows related to the '''Record Type'''. It defaults to N/A.<br />
* ''' Trigger On All Records ''' - check-box that is populated if you wish to have a workflow execute against all records, whether new records or updated records.<br />
<br />
===File Layout===<br />
The File Layout section is used to determine the number of columns in the file, the delimiter between the columns and the use of a '''HTML table''' to display the data.<br />
<br />
: [[Image:Auto8.png]]<br />
* '''Number of Columns''' - The number of columns you select is used to define the number of columns in the upload file, and the number of fields that can be updated in the database.<br />
** The maximum number of fields that can be updated is 100 fields in a single file.<br />
** If more than 100 fields are required, then you will need to create two upload files.<br />
* '''Ignore Lines''' - You can specify the number of rows to ignore from the beginning of the file. This can be used to ignore column headers, if they exist as the first row in any file.<br />
* '''Field Delimiter''' - drop-down list showing the delimiter options used to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Use HTML Table''' - An HTML table is very useful where imported data contains multiple records and a single record set of fields exists within SmartSimple. For example, if you wished to import multiple lines of sales information into a single text box field you would enable the HTML table feature and then map all the fields into a single field indicating the column and row delimiters. Will not be presented when the File Type is XML.<br />
* '''Column Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different columns. Will not be presented when the File Type is XML or JSON.<br />
* '''Row Delimiter''' - free text field to allow entry of any delimiters required to separate different values in the file into different rows. Will not be presented when the File Type is XML or JSON.<br />
* '''Record Node Name''' - Only presented when the File Type is XML.<br />
* '''Record Node Filter''' - Only presented when the File Type is XML.<br />
<br />
===Defining the Column Mapping===<br />
Once you have defined the number of fields, you define the field order to match the column order in the upload file.<br />
<br />
: [[Image:Auto9.png|thumb|none|900px]]<br />
* The '''number of columns''' you select determines the number of fields you can map.<br />
* The '''field name''' is selected from the Field combo box. (see the Reference section below for information on standard field names)<br />
* In order for the update to succeed, a single field is required to match an upload record to an existing database record this is indicated as the Identifier field. Customer data will generally be an account number type field.<br />
* The''' Table header''' field is only required if you are using the HTML Table feature or when loading an XML or JSON file.<br />
* The '''Duplicate Match Beahviour''' drop-down allows user to specify the behaviour whenever multiple records are matched using the Identifier field(s).<br />
** Update Unique Match Only - will only update when one matching record is found<br />
** Update All Matches - will update all matching records<br />
<br />
<span style="font-size: medium;">'''IMPORTANT:''' </span><br /><br />
The following fields must only be included in the Autoloader field mappings if you are updating '''existing''' records. These fields '''must not''' be used when using the Auto Loader to create new records.<br />
<br />
**::* '''Company ID''' (Company Auto Loader)<br />
**::* '''User ID''' (Contact Auto Loader)<br />
**::* '''Resource ID''' (Resource Auto Loader)<br />
**::* '''Tracking ID''' ({{l2}} / {{l3}} Auto Loader)<br />
<br />
** When using the fields above the IDs being Auto Loaded must match IDs of records present within the system.<br />
** If used the fields should be marked as the Identifier.<br />
** These fields would normally be used if you have extracted data from [[SmartSimple]] including those ID fields, updated the data outside of [[SmartSimple]] and wish to import the updated information.<br />
NOTE: If you wish to deactivate a user using the Autoloader then select the '''Disable User Login (use value of 1)''' Field option and ensure that the uploaded file has a value of 1 in the relevant cells.<br />
<br />
==Updating Account Owners==<br />
When you are updating company type information you can automatically associate an account field to a user field in order to establish “account ownership”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10a.png]]<br /><br />
''For example, if the imported account file contains an employee ID field, then this can be matched to the user table – providing each user with an employee ID field.''<br />
<br />
==Updating Account Parent==<br />
When you are updating company type information you can automatically associate an account field to a parent account field in order to establish “company hierarchy”. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to Company and Item to company.<br />
<br />
[[Image:Auto10b.png]]<br /><br />
''For example, if the imported account file contains a parent ID field, then this can be matched to the account table – providing each company with a parent company.''<br /><br />
'''Example: Updating Account Parent AutoLoader Configuration:'''<br /><br />
[[File:Update_Account_Parent_Example.JPG]]<br /><br />
'''The AutoLoader Parent ID field is an Account field that will get populated with the second value (Parent ID) from the CSV record below.'''<br /><br />
'''Example: AutoLoader Source File:'''<br /><br />
[[File:Update_Account_Parent_Example_-_Source_File.JPG]]<br /><br />
'''Action: A two column report with the Company ID and the Parent ID needs to be created, exported to a CSV file and uploaded to the associated AutoLoader SmartFolder. '''<br /><br />
Result: The Account records with a Company ID IN (278520,297733,316703) will have their Parent ID changed to 349238.<br />
<br />
==Updating Event / Transaction Parent Company==<br />
When you are updating company type information related to an Event or a Transaction you can automatically associate an account field to a transaction or event field in order to establish a parent for the transaction. This includes using Account standard fields.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to Company and the '''Item''' to either Event or Transaction.<br />
<br />
<br />
[[Image:Auto10c.png]]<br />
<br />
==Updating Parent Company==<br />
When you are updating people type information you can automatically associate an account field to a user field in order to attach the user to the correct account. This section is only displayed at the bottom of the Autoloader page if you have set the Type to People.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Updating Event / Transaction Parent User==<br />
When you are updating user type related to a Transaction information you can automatically associate a user field to a transaction field in order to establish a parent user for the transaction.<br />
If no matches exist then you can select the required action using the '''No parent matched action''' drop-down.<br />
<br />
<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent company specified in the '''Default Parent ID''' field.<br />
<br />
<br />
This section is only displayed at the bottom of the Autoloader page if you have set the '''Record Type''' to People and the '''Item''' to either Event or Transaction.<br />
<br />
[[Image:Auto10f.png]]<br />
<br />
==Branch, Company and Owner Custom Field Matching==<br />
When you are updating UTA information you can automatically associate a standard field on the UTA with user and company fields in order to establish individual or organizational ownership. This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 1.<br />
<br />
[[Image:Auto10e.png]]<br />
<br />
==Updating Tracking Parent==<br />
When you are updating UTA Level 2 or 3 information you can automatically associate a field on the level 2 with a field on the level 1, or associate a field on the level 3 with a field on the level 1, in order to establish a relationship between the entities.<br />
<br />
If no matches exist then you can select the required action using the No parent matched action drop-down.<br />
<br />
* Reject Record - record is not loaded into the system<br />
* Add as orphan record - record is loaded into the system but without being attached to a parent company<br />
* Attach to dummy account - record is loaded into the system and is attached to the parent entity specified in the Default Parent ID field.<br />
This section is only displayed at the bottom of the Autoloader page if you have set the Record Type to [[UTA]] and the Level to Level 2 or Level 3.<br />
<br />
[[Image:Auto10g.png]]<br />
<br />
==Parent record match field ids==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is '''XML'''.<br />
<br />
[[Image:AutoXML.png]]<br />
<br />
==File Preparation==<br />
This section allows for manipulation of the data prior to the Autoloader actually loading the data onto the system.<br />
<br />
It is only available when the '''File Type''' is either '''CSV,Text''' or '''Fixed Length Text'''.<br />
<br />
It is not available when '''File Type''' is XML.<br />
<br />
See [[Autoloader File Preparation]] for configuration instructions.<br />
<br />
[[Image:AutoFilePreparation.png]]<br />
<br />
==External Data Source==<br />
This section allows for the configuration of an external file source if the user does not want to manually upload the file.<br />
<br />
[[Image:Autoloader_DS1.png ]]<br />
<br />
The '''External Data Source''' is a drop-down list with 5 options available:<br />
<br />
Additional fields are exposed when one of these options is selected, with the exact number and type of fields dependent on the selected option.<br />
<br />
===FTP and SFTP===<br />
[[Image:AutoFTP2.PNG]]<br />
<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
* '''Delete File from Data Source After Downloaded''' - file will be deleted from the sftp site<br />
* '''Append Datetime Stamp to File Name''' - will append date and time when the file picked up from the sftp do not have a datestamp<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from. e.g. ''my.sftp.com'' or ''my.sftp.com:2222''<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Use Private Key''' - enable this setting when using keys as credentials to authenticate<br />
* '''Private Key File''' - upload the private key file<br />
* '''Path''' - exact folder location on the system where the files can be found i.e. "/" for root directory or "/in" or "/out"<br />
* '''File Names''' - name of the files to be loaded via the Autoloader. e.g. HRFeed.csv, Payment_*.csv (Use '''*''' for wildcards in filenames. < br/><br />
<br />
Note that when settings are saved, a '''Verify Connection''' button will appear next to the Login Name Textbox. This button can be used to verify that the url, username, password are correct.<br />
<br />
===HTTP===<br />
[[Image:AutoHTTP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''File Names''' - name of the files to be loaded via the Autoloader<br />
<br />
===SOAP===<br />
[[Image:AutoSOAP.png]]<br />
* '''Disable processing. Download file only''' - if checked then the system will only pull the file across into SmartSimple, but will not load the contents of the file<br />
<br />
<!--see ticket 18426 - autoloader FTP settings--><br />
* '''URL''' - the URL where the file(s) can be retrieved from<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
* '''Function''' - The function called by the Web Service call.<br />
* '''Request Body''' - The content of the Web Service message to be sent to the external service.<br />
* '''Callback''' - Method to sends the response back to the client.<br />
<br />
===OData===<br />
<!--Upgrade May 2018 - Ticket#62753--><br />
[[Image:External-OData1.PNG]]<br />
* '''OData Version''' - Version of OData available from the endpoint<br />
* '''URL''' - the endpoint of OData<br />
* '''Login Name''' - username to allow access to the system<br />
* '''Login Password''' - password to allow access to the system<br />
<br />
==Schedule==<br />
[[Image:External-Schedule.PNG]]<br />
<br />
* Frequency -<br />
<br />
'''On File Upload''' - will process autoloader upon file upload<br />
'''Scheduled''' - will allow you to specify the launch times of the autoloader everyday.<br />
* Launch Hour - a 24-hour format on desired hours to pull from external source for processing<br />
<br />
e.g. 07,15,23<br />
* Process Last Completed - datestamp of the last time the autoloader was processed.<br />
<br />
==History==<br />
<span style="color: #ff0000;">Available after February 2019 upgrade.</span> <br/><br />
A new Autoloader feature that shows a new History information tab. The list includes the file name, user who uploaded the file, start time, end time, records added/updated and status of last run.<br />
<br />
==Important note about XML Files==<br />
If the contents of any the elements in an XML file being autoloaded contains certain special characters it will disrupt the XML structure, making the message unreadable by the receiving server. The '''less than''' symbol (<) and '''ampersand''' (&) are two primary special characters to be concerned about. When including fields that may contain those characters you should use a special wrapper so the receiving understands that they are data content and not part of the XML structure:<br />
<br />
* <br />
*: <span style="font-size: small;">&lt;![CDATA[ '''''CONTENTS''''' ]]></span><br />
<br />
For example, an '''address''' or '''company name''' could contain ampersands, so should be included as:<br />
<br />
<pre><br />
<primarycontact><br />
<firstname>Jane</firstname><br />
<lastname>Smith</lastname><br />
<address><![CDATA[145 Main Street]]></address><br />
<companyname><![CDATA[Acme & Friends]]></companyname><br />
</primarycontact><br />
</pre><br />
<br />
<br />
* It is advisable to use CDATA for any field containing text since the contents are often unpredictable.<br />
<br />
==Note about JSON Files==<br />
JSON format should start with a '''data''' node, as shown in the example below<br />
<br />
<pre>{<br />
"data":[{<br />
"Name":"Acme Corporation",<br />
"Phone":"416-123-4567",<br />
"CompanyID":"496246"<br />
},<br />
{<br />
"Name":"Super Banana Ltd.",<br />
"Phone":"800-555-1234",<br />
"CompanyID":"496244"<br />
},<br />
{<br />
"Name":"Red Apple Supply",<br />
"Phone":"917-123-0000",<br />
"CompanyID":"496248"<br />
},<br />
{<br />
"Name":"Orange you Glad",<br />
"Phone":"410-222-2030",<br />
"CompanyID":"496242"<br />
}<br />
]<br />
}<br />
</pre><br />
<br />
==Ad hoc upload url==<br />
This is an Autoloader setting that provides a more friendly and accessible user interface for importing data into the system as well as allowing users to verify the file before uploading it to a SmartFolder for processing by the Autoloader.<br />
<br />
[[Image:AdhocAutoload.png|border|100.px]]<br />
<br />
When you click on the Upload File button then you will be presented with page one of the Ad Hoc Autoloader screen. Use the 'Choose file' button to select the file to be loaded and then click the 'Upload' button.<br />
<br />
[[Image:AdhocAutoload1.png|100.px|border]]<br />
<br />
You will be presented with page 2 of the Ad Hoc Autoloader screen, which provides users the option to review the file being uploaded, including what data us being mapped to what field.<br />
<br />
[[Image:AdhocAutoload2.png|100.px|border]]<br />
<br />
If there is no issue with the data and the mappings then click on the 'Add to SmartFolder and Autolader queue' button. You should be presented with page 3 of the Ad Hoc Autoloader screen, which confirms that the file has been successfully added to the SmartFolder.<br />
<br />
[[Image:AdhocAutoload3.png|100.px|border]]<br />
<br />
<br />
<br />
==Reference: Standard Field Names and Variables==<br />
The below table can be used to compare Level 1 Standard Field terminology found in the [[UTA]], on the Autoloader, in the Database, and Variable syntax]]<br />
<br />
{|<br />
|-<br />
| style="background-color: #c8c8c8;"|'''UTA L1 Standard Field Name '''<br />
| style="background-color: #c8c8c8;"|'''Autoloader Standard Field Name'''<br />
| style="background-color: #c8c8c8;"|'''Database name'''<br />
| style="background-color: #c8c8c8;"|'''Variable List'''<br />
|-<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|Level 1 ID<br />
| style="background-color: #f0f0f0;"|opportunityid<br />
| style="background-color: #f0f0f0;"|@opportunityid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Application Type<br />
| style="background-color: #dcdcdc;"|Type Name<br />
| style="background-color: #dcdcdc;"|opportunitytypename<br />
| style="background-color: #dcdcdc;"|@type@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Type ID<br />
| style="background-color: #dcdcdc;"|opportunitytype<br />
| style="background-color: #dcdcdc;"|@typeid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Application Name<br />
| style="background-color: #f0f0f0;"|Name<br />
| style="background-color: #f0f0f0;"|name<br />
| style="background-color: #f0f0f0;"|@name@<br />
|-<br />
| style="background-color: #dcdcdc;"|Customer<br />
| style="background-color: #dcdcdc;"|Client<br />
| style="background-color: #dcdcdc;"|company<br />
| style="background-color: #dcdcdc;"|@client@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client ID<br />
| style="background-color: #dcdcdc;"|companyid<br />
| style="background-color: #dcdcdc;"|@clientid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Client Custom Field<br />
| style="background-color: #dcdcdc;"|companycfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|Status<br />
| style="background-color: #f0f0f0;"|stagename<br />
| style="background-color: #f0f0f0;"|@status@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Status ID<br />
| style="background-color: #f0f0f0;"|stageid<br />
| style="background-color: #f0f0f0;"|@stausid@<br />
|-<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|Revenue<br />
| style="background-color: #dcdcdc;"|revenue<br />
| style="background-color: #dcdcdc;"|@revenue@<br />
|-<br />
| style="background-color: #f0f0f0;"|Currency<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|currencyid<br />
| style="background-color: #f0f0f0;"|@currencyname@/ @currencycode@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Currency Exchange (USD,CAD etc.)<br />
| style="background-color: #f0f0f0;"|excur<br />
| style="background-color: #f0f0f0;"|@excurrencycode@/ @excurrencyname@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Exchange Rate<br />
| style="background-color: #f0f0f0;"|excur_rate<br />
| style="background-color: #f0f0f0;"|@exrate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Close Date<br />
| style="background-color: #dcdcdc;"|Close Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|closedate<br />
| style="background-color: #dcdcdc;"|@closedate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Probability<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@probability@<br />
|-<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|Description<br />
| style="background-color: #dcdcdc;"|description<br />
| style="background-color: #dcdcdc;"|@description@<br />
|-<br />
| style="background-color: #f0f0f0;"|Requirement<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@requirements@<br />
|-<br />
| style="background-color: #dcdcdc;"|Owner<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner ID<br />
| style="background-color: #dcdcdc;"|updatedby<br />
| style="background-color: #dcdcdc;"|@ownerid@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner (firstname lastname)<br />
| style="background-color: #dcdcdc;"|updatedbyname<br />
| style="background-color: #dcdcdc;"|@owner@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Email<br />
| style="background-color: #dcdcdc;"|updatedbyemail<br />
| style="background-color: #dcdcdc;"|@owner.email@<br />
|-<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|Owner Custom Field<br />
| style="background-color: #dcdcdc;"|updatedbyfield<br />
| style="background-color: #dcdcdc;"| <br />
|-<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|Branch<br />
| style="background-color: #f0f0f0;"|branch<br />
| style="background-color: #f0f0f0;"|@branch@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch ID<br />
| style="background-color: #f0f0f0;"|branchid<br />
| style="background-color: #f0f0f0;"|@branchid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Branch Custom Field<br />
| style="background-color: #f0f0f0;"|branchcfield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|Workflow<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Contacts<br />
| style="background-color: #f0f0f0;"|n/a (added Import Contacts on UTA)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Activity List<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Date<br />
| style="background-color: #f0f0f0;"|End Date (yyyy-mm-dd)<br />
| style="background-color: #f0f0f0;"|oenddate<br />
| style="background-color: #f0f0f0;"|@enddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Date<br />
| style="background-color: #dcdcdc;"|Start Date (yyyy-mm-dd)<br />
| style="background-color: #dcdcdc;"|ostartdate<br />
| style="background-color: #dcdcdc;"|@startdate@<br />
|-<br />
| style="background-color: #f0f0f0;"|Modified Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@modifieddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Institutions<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|End Time<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@hour(fullenddate)@:@minute(fullenddate)@<br />
|-<br />
| style="background-color: #dcdcdc;"|Start Time<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@hour(fullstartdate)@:@minute(fullstartdate)@<br />
|-<br />
| style="background-color: #f0f0f0;"|Person<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person ID<br />
| style="background-color: #f0f0f0;"|oppeopleid<br />
| style="background-color: #f0f0f0;"|@personid@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person (firstname lastname)<br />
| style="background-color: #f0f0f0;"|oppeoplename<br />
| style="background-color: #f0f0f0;"|@person@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Email<br />
| style="background-color: #f0f0f0;"|oppeopleemail<br />
| style="background-color: #f0f0f0;"|@person.email@<br />
|-<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|Person Custom Field<br />
| style="background-color: #f0f0f0;"|oppeoplefield<br />
| style="background-color: #f0f0f0;"| <br />
|-<br />
| style="background-color: #dcdcdc;"|UTA Providers<br />
| style="background-color: #dcdcdc;"|n/a (needs a workflow task)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|Status Indicator<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|-<br />
| style="background-color: #dcdcdc;"|Transactions<br />
| style="background-color: #dcdcdc;"|n/a (needs separate autoloader)<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #f0f0f0;"|UTA Providers (L2)<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|https://wiki.smartsimple.com/wiki/Web_Page_View_Field_Variables<br />
|-<br />
| style="background-color: #dcdcdc;"|Modified By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|@modifiedby@/ @modifiedbyid@<br />
|-<br />
| style="background-color: #f0f0f0;"|Created Date<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|@createddate@<br />
|-<br />
| style="background-color: #dcdcdc;"|Created By<br />
| style="background-color: #dcdcdc;"|n/a<br />
| style="background-color: #dcdcdc;"| <br />
| style="background-color: #dcdcdc;"|n/a<br />
|-<br />
| style="background-color: #f0f0f0;"|Invitations<br />
| style="background-color: #f0f0f0;"|n/a<br />
| style="background-color: #f0f0f0;"| <br />
| style="background-color: #f0f0f0;"|n/a<br />
|}<br />
<br />
==See Also==<br />
** [[How to Add Users and Contacts]]<br />
** [[Autoloader File Preparation]]<br />
** [[Linking Autoloaders]]<br />
[[Category:Data Import]]<br />
[[Category:Global Settings]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Charity_Check&diff=36202GuideStar Charity Check2019-07-02T16:58:51Z<p>Ciaran: </p>
<hr />
<div>{{Banner-Billable}} <br />
<br />
GuideStar Charity Check is feature available from SmartSimple as an additional billable add-on. <br />
<br />
It is used by foundation staff during their due diligence process, to validate that the nonprofit is in good-standing and eligible for funding.<br />
<br />
It validates against IRS Publication 78 data, IRS Business Master File data, Internal Revenue Bulletin data, and OFAC status (i.e. meets all IRS requirements). Includes 60+ fields of data including deductibility codes and limitations, as well as the “GuideStar Charity Check” PDF. This provides easily auditable evidence of due diligence compliance.<br />
<br />
To access Guidestar settings you must first have the '''Enable GuideStar Integrations''' toggle switched on.<br />
<br />
==Configuration==<br />
<br />
:[[Image:GuideStarCharityCheckConfig.png|900px|border]]<br />
<br />
* Go to [[Global Settings]] - Integrations.<br />
* In the Services Settings section ensure that the '''Enable GuideStar Integrations''' toggle is on. If not then toggle on and resave. '''NOTE:''' Using this feature is billable. <br />
* Click on the "GuideStar Charity Check" option.<br />
* The Settings page has the following configurable options:<br />
:*'''EIN Field''': The organization custom field used for searching on GuideStar.<br />
:*'''PDF Store To Field''': after charity check, a returned PDF file will be save to this field.<br />
:*'''Available Roles''': Lookup to select [[Roles]]. Users under these roles are allowed to see the GuideStar Charity Check option on organization record.<br />
:*'''Available Status''': Lookup to select [[Status]]. GuideStar Charity Check option will show up on organizations in these status<br />
:*'''Available Categories''': Lookup to select [[Categories]]. Charity Check option will show up on organizations in these categories<br />
:*'''Field Mappings''': Mapping of GuideStar field and fields in SmartSimple. Once mapped the value from GuideStar field will be saved to the according organization field in the system.<br />
::'''NOTE:''' Each GuideStar field can only be mapped once. When adding a new row, the fields were added previously will not show up in the combo box. There’s also a validation on save to check if there’s any duplicate GuideStar fields<br />
* Click Save when complete.<br />
<br />
<br />
==Using GuideStar Charity Check==<br />
<br />
:[[Image:GuideStarCharityCheck.png|600px|border]]<br />
<br />
A User will be able to access the GuideStar Charity Check feature under the Options menu if all of the below apply ...<br />
* instance has the '''Enable GuideStar Integrations''' toggle switched on<br />
* the user has roles that match any of those configured against the Available Roles section<br />
* the organization has status that match any of those configured against the Available Status section<br />
* the organization has category that match any of those configured against the Available Category section<br />
<br />
Clicking the GuideStar Charity Check option will result in a charity check being run, populating any mapped fields and saving returned PDF file against the configured field. <br />
<br />
Each call is also recorded for auditing purposes. <br />
<br />
<br />
==System call==<br />
<br />
GuideStar Charity Check can also be executed programmatically using a system call: <br />
<br />
<pre style="white-space: pre-wrap; <br />
white-space: -moz-pre-wrap; <br />
white-space: -pre-wrap; <br />
white-space: -o-pre-wrap; <br />
word-wrap: break-word;"><!--SysCall_charitycheck(companyid)--></pre><br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Settings&diff=36201GuideStar Settings2019-07-02T16:58:06Z<p>Ciaran: </p>
<hr />
<div>To access Guidestar settings you must first have the '''Enable GuideStar Integrations''' toggle switched on.<br />
<br />
The Guidestar settings allows SmartSimple clients to verify organization records in SmartSimple against GuideStar's databases.<br />
<br />
[[Image:GuidestarSettingsJune2014.png|link=]]<br />
<br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Settings&diff=36200GuideStar Settings2019-07-02T15:57:33Z<p>Ciaran: </p>
<hr />
<div>To access this setting you must have the '''Enable GuideStar Integrations''' toggle switched on.<br />
<br />
This setting allows SmartSimple clients to verify organization records in SmartSimple against GuideStar's databases.<br />
<br />
[[Image:GuidestarSettingsJune2014.png|link=]]<br />
<br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Charity_Check&diff=36199GuideStar Charity Check2019-07-02T15:56:54Z<p>Ciaran: </p>
<hr />
<div>{{Banner-Billable}} <br />
<br />
GuideStar Charity Check is feature available from SmartSimple as an additional billable add-on. <br />
<br />
It is used by foundation staff during their due diligence process, to validate that the nonprofit is in good-standing and eligible for funding.<br />
<br />
It validates against IRS Publication 78 data, IRS Business Master File data, Internal Revenue Bulletin data, and OFAC status (i.e. meets all IRS requirements). Includes 60+ fields of data including deductibility codes and limitations, as well as the “GuideStar Charity Check” PDF. This provides easily auditable evidence of due diligence compliance.<br />
<br />
<br />
==Configuration==<br />
<br />
:[[Image:GuideStarCharityCheckConfig.png|900px|border]]<br />
<br />
* Go to [[Global Settings]] - Integrations.<br />
* In the Services Settings section ensure that the '''Enable GuideStar Integrations''' toggle is on. If not then toggle on and resave. '''NOTE:''' Using this feature is billable. <br />
* Click on the "GuideStar Charity Check" option.<br />
* The Settings page has the following configurable options:<br />
:*'''EIN Field''': The organization custom field used for searching on GuideStar.<br />
:*'''PDF Store To Field''': after charity check, a returned PDF file will be save to this field.<br />
:*'''Available Roles''': Lookup to select [[Roles]]. Users under these roles are allowed to see the GuideStar Charity Check option on organization record.<br />
:*'''Available Status''': Lookup to select [[Status]]. GuideStar Charity Check option will show up on organizations in these status<br />
:*'''Available Categories''': Lookup to select [[Categories]]. Charity Check option will show up on organizations in these categories<br />
:*'''Field Mappings''': Mapping of GuideStar field and fields in SmartSimple. Once mapped the value from GuideStar field will be saved to the according organization field in the system.<br />
::'''NOTE:''' Each GuideStar field can only be mapped once. When adding a new row, the fields were added previously will not show up in the combo box. There’s also a validation on save to check if there’s any duplicate GuideStar fields<br />
* Click Save when complete.<br />
<br />
<br />
==Using GuideStar Charity Check==<br />
<br />
:[[Image:GuideStarCharityCheck.png|600px|border]]<br />
<br />
A User will be able to access the GuideStar Charity Check feature under the Options menu if all of the below apply ...<br />
* instance has the '''Enable GuideStar Integrations''' toggle switched on<br />
* the user has roles that match any of those configured against the Available Roles section<br />
* the organization has status that match any of those configured against the Available Status section<br />
* the organization has category that match any of those configured against the Available Category section<br />
<br />
Clicking the GuideStar Charity Check option will result in a charity check being run, populating any mapped fields and saving returned PDF file against the configured field. <br />
<br />
Each call is also recorded for auditing purposes. <br />
<br />
<br />
==System call==<br />
<br />
GuideStar Charity Check can also be executed programmatically using a system call: <br />
<br />
<pre style="white-space: pre-wrap; <br />
white-space: -moz-pre-wrap; <br />
white-space: -pre-wrap; <br />
white-space: -o-pre-wrap; <br />
word-wrap: break-word;"><!--SysCall_charitycheck(companyid)--></pre><br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Charity_Check&diff=36198GuideStar Charity Check2019-07-02T15:50:13Z<p>Ciaran: </p>
<hr />
<div>{{Banner-Billable}} <br />
<br />
GuideStar Charity Check is feature available from SmartSimple as an additional billable add-on. <br />
<br />
It is used by foundation staff during their due diligence process, to validate that the nonprofit is in good-standing and eligible for funding.<br />
<br />
It validates against IRS Publication 78 data, IRS Business Master File data, Internal Revenue Bulletin data, and OFAC status (i.e. meets all IRS requirements). Includes 60+ fields of data including deductibility codes and limitations, as well as the “GuideStar Charity Check” PDF. This provides easily auditable evidence of due diligence compliance.<br />
<br />
<br />
==Configuration==<br />
<br />
:[[Image:GuideStarCharityCheckConfig.png|900px|border]]<br />
<br />
* Go to [[Global Settings]] - Integrations.<br />
* In the Services Settings section ensure that the '''Enable GuideStar Integrations''' toggle is on. '''NOTE:''' Using this feature is billable. <br />
* Click on the "GuideStar Charity Check" option.<br />
* The Settings page has the following configurable options:<br />
:*'''EIN Field''': The organization custom field used for searching on GuideStar.<br />
:*'''PDF Store To Field''': after charity check, a returned PDF file will be save to this field.<br />
:*'''Available Roles''': Lookup to select [[Roles]]. Users under these roles are allowed to see the GuideStar Charity Check option on organization record.<br />
:*'''Available Status''': Lookup to select [[Status]]. GuideStar Charity Check option will show up on organizations in these status<br />
:*'''Available Categories''': Lookup to select [[Categories]]. Charity Check option will show up on organizations in these categories<br />
:*'''Field Mappings''': Mapping of GuideStar field and fields in SmartSimple. Once mapped the value from GuideStar field will be saved to the according organization field in the system.<br />
::'''NOTE:''' Each GuideStar field can only be mapped once. When adding a new row, the fields were added previously will not show up in the combo box. There’s also a validation on save to check if there’s any duplicate GuideStar fields<br />
* Click Save when complete.<br />
<br />
<br />
==Using GuideStar Charity Check==<br />
<br />
:[[Image:GuideStarCharityCheck.png|600px|border]]<br />
<br />
A User will be able to access the GuideStar Charity Check feature under the Options menu if all of the below apply ...<br />
* instance has the '''Enable GuideStar Integrations''' toggle switched on<br />
* the user has roles that match any of those configured against the Available Roles section<br />
* the organization has status that match any of those configured against the Available Status section<br />
* the organization has category that match any of those configured against the Available Category section<br />
<br />
Clicking the GuideStar Charity Check option will result in a charity check being run, populating any mapped fields and saving returned PDF file against the configured field. <br />
<br />
Each call is also recorded for auditing purposes. <br />
<br />
<br />
==System call==<br />
<br />
GuideStar Charity Check can also be executed programmatically using a system call: <br />
<br />
<pre style="white-space: pre-wrap; <br />
white-space: -moz-pre-wrap; <br />
white-space: -pre-wrap; <br />
white-space: -o-pre-wrap; <br />
word-wrap: break-word;"><!--SysCall_charitycheck(companyid)--></pre><br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Charity_Check&diff=36197GuideStar Charity Check2019-07-02T15:49:26Z<p>Ciaran: </p>
<hr />
<div>{{Banner-Billable}} <br />
<br />
GuideStar Charity Check is feature available from SmartSimple as an additional billable add-on. <br />
<br />
It is used by foundation staff during their due diligence process, to validate that the nonprofit is in good-standing and eligible for funding.<br />
<br />
It validates against IRS Publication 78 data, IRS Business Master File data, Internal Revenue Bulletin data, and OFAC status (i.e. meets all IRS requirements). Includes 60+ fields of data including deductibility codes and limitations, as well as the “GuideStar Charity Check” PDF. This provides easily auditable evidence of due diligence compliance.<br />
<br />
<br />
==Configuration==<br />
<br />
:[[Image:GuideStarCharityCheckConfig.png|900px|border]]<br />
<br />
* Go to [[Global Settings]] - Integrations.<br />
* In the Services Settings section ensure that the '''Enable GuideStar Integrations''' toggle is on. '''NOTE:''' Using this feature is billable. <br />
* Click on the "GuideStar Charity Check" option.<br />
* The Settings page has the following configurable options:<br />
:*'''EIN Field''': The organization custom field used for searching on GuideStar.<br />
:*'''PDF Store To Field''': after charity check, a returned PDF file will be save to this field.<br />
:*'''Available Roles''': Lookup to select [[Roles]]. Users under these roles are allowed to see the GuideStar Charity Check option on organization record.<br />
:*'''Available Status''': Lookup to select [[Status]]. GuideStar Charity Check option will show up on organizations in these status<br />
:*'''Available Categories''': Lookup to select [[Categories]]. Charity Check option will show up on organizations in these categories<br />
:*'''Field Mappings''': Mapping of GuideStar field and fields in SmartSimple. Once mapped the value from GuideStar field will be saved to the according organization field in the system.<br />
::'''NOTE:''' Each GuideStar field can only be mapped once. When adding a new row, the fields were added previously will not show up in the combo box. There’s also a validation on save to check if there’s any duplicate GuideStar fields<br />
* Click Save when complete.<br />
<br />
<br />
==Using GuideStar Charity Check==<br />
<br />
:[[Image:GuideStarCharityCheck.png|600px|border]]<br />
<br />
A User will be able to access the GuideStar Charity Check feature under the Options menu if all of the below apply ...<br />
* the user has roles that match any of those configured against the Available Roles section<br />
* the organization has status that match any of those configured against the Available Status section<br />
* the organization has category that match any of those configured against the Available Category section<br />
<br />
Clicking the GuideStar Charity Check option will result in a charity check being run, populating any mapped fields and saving returned PDF file against the configured field. <br />
<br />
Each call is also recorded for auditing purposes. <br />
<br />
<br />
==System call==<br />
<br />
GuideStar Charity Check can also be executed programmatically using a system call: <br />
<br />
<pre style="white-space: pre-wrap; <br />
white-space: -moz-pre-wrap; <br />
white-space: -pre-wrap; <br />
white-space: -o-pre-wrap; <br />
word-wrap: break-word;"><!--SysCall_charitycheck(companyid)--></pre><br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=GuideStar_Charity_Check&diff=36196GuideStar Charity Check2019-07-02T15:49:11Z<p>Ciaran: </p>
<hr />
<div>{{Banner-Billable}} <br />
<br />
GuideStar Charity Check is feature available from SmartSimple as an additional billable add-on. <br />
<br />
It is used by foundation staff during their due diligence process, to validate that the nonprofit is in good-standing and eligible for funding.<br />
<br />
It validates against IRS Publication 78 data, IRS Business Master File data, Internal Revenue Bulletin data, and OFAC status (i.e. meets all IRS requirements). Includes 60+ fields of data including deductibility codes and limitations, as well as the “GuideStar Charity Check” PDF. This provides easily auditable evidence of due diligence compliance.<br />
<br />
<br />
==Configuration==<br />
<br />
:[[Image:GuideStarCharityCheckConfig.png|900px|border]]<br />
<br />
* Go to [[Global Settings]] - Integrations.<br />
* In the Services Settings section ensure that the Enable GuideStar Integrations toggle is on. '''NOTE:''' Using this feature is billable. <br />
* Click on the "GuideStar Charity Check" option.<br />
* The Settings page has the following configurable options:<br />
:*'''EIN Field''': The organization custom field used for searching on GuideStar.<br />
:*'''PDF Store To Field''': after charity check, a returned PDF file will be save to this field.<br />
:*'''Available Roles''': Lookup to select [[Roles]]. Users under these roles are allowed to see the GuideStar Charity Check option on organization record.<br />
:*'''Available Status''': Lookup to select [[Status]]. GuideStar Charity Check option will show up on organizations in these status<br />
:*'''Available Categories''': Lookup to select [[Categories]]. Charity Check option will show up on organizations in these categories<br />
:*'''Field Mappings''': Mapping of GuideStar field and fields in SmartSimple. Once mapped the value from GuideStar field will be saved to the according organization field in the system.<br />
::'''NOTE:''' Each GuideStar field can only be mapped once. When adding a new row, the fields were added previously will not show up in the combo box. There’s also a validation on save to check if there’s any duplicate GuideStar fields<br />
* Click Save when complete.<br />
<br />
<br />
==Using GuideStar Charity Check==<br />
<br />
:[[Image:GuideStarCharityCheck.png|600px|border]]<br />
<br />
A User will be able to access the GuideStar Charity Check feature under the Options menu if all of the below apply ...<br />
* the user has roles that match any of those configured against the Available Roles section<br />
* the organization has status that match any of those configured against the Available Status section<br />
* the organization has category that match any of those configured against the Available Category section<br />
<br />
Clicking the GuideStar Charity Check option will result in a charity check being run, populating any mapped fields and saving returned PDF file against the configured field. <br />
<br />
Each call is also recorded for auditing purposes. <br />
<br />
<br />
==System call==<br />
<br />
GuideStar Charity Check can also be executed programmatically using a system call: <br />
<br />
<pre style="white-space: pre-wrap; <br />
white-space: -moz-pre-wrap; <br />
white-space: -pre-wrap; <br />
white-space: -o-pre-wrap; <br />
word-wrap: break-word;"><!--SysCall_charitycheck(companyid)--></pre><br />
<br />
<br />
[[Category:Global Settings]]<br />
[[Category:Integration]]<br />
[[Category:External Data Source]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Password_Policy&diff=36195Password Policy2019-07-02T15:25:32Z<p>Ciaran: </p>
<hr />
<div>{{Banner-UnderConstruction}}<br />
<br />
<br />
<br />
==Overview==<br />
'''Password Policy '''is used to configure the password policies within [[SmartSimple]] with your organizational standards. It is best practice to ensure that these policies match the other systems deployed by your organization; consequently, these policies allow for extensive configuration options. <br />
<br />
'''Password Policies include the following:'''<br />
<br />
* The ability to control the length and complexity of passwords<br />
* The password expiration time period <br />
* The password frequency usage <br />
* The method for sending new requested passwords (via Email Templates) <br />
* Word restrictions <br />
* The number of retries allowed<br />
* The lockout time for the account if they exceed retry quota <br />
* Email alerts for invalid passwords <br />
<br />
Multiple password policies can be supported by the system. This feature provides for less stringent policies for types of users that ''infrequently ''access the system - for example, [[External]] contacts who would only use the system for an application. Alternative password policies can be set for any level in the [[Organization hierarchy|organization hierarchy]]. <br />
<br />
You can also set individual password policies for the different companies of your organization hierarchy. However, they will be able to ''edit ''the policy only, and not edit the [[Email#Email Templates for User Activation and Password|the Activation Emails]], which can only be configured from [[Global Settings]] by a [[User|user]] with [[Global User Administrator|System Administrator]] [[User Role|privileges]]. <br />
<br />
: '''Note: '''In all cases of password policies, '''common words '''or '''known common passwords '''are ineligible to be used as [[SmartSimple]] passwords. <br />
==Configuration - Essentials==<br />
===How to Access the Password Settings===<br />
1. Click on the 9-square menu icon on the top right of your page.<br />
<br />
:: {{Icon-Menu}} <br />
2. Under the heading '''Configuration, '''select '''[[Global Settings]]. '''<br />
<br />
3. Click on the tab labelled '''Security.'''<br />
<br />
4. Click on the hyperlink called '''Password and Activation Policies.'''<br />
<br />
A page displayed with numerous settings and tabs related to your system's password and activation policies will appear. On this page, you can modify the required complexities of passwords, email templates for activating users and setting passwords, disable inactive accounts, and more. <br />
<br />
:: [[File:General password activation policies.png|900px|border]] <br />
{| class="wikitable"<br />
|-<br />
||'''Tab Name'''<br />
||'''Overview of Features and Functionality'''<br />
|-<br />
||'''[[Password Policy#Password Settings|General]]'''<br />
||Provides access to modify, configure, or enable/disable general password settings, the deactivation of inactive accounts, activation settings, password reset messages, and persistent login.<br />
|-<br />
||'''[[Email#Email Templates for User Activation and Password|Activation Email Templates]]'''<br />
||Allows modification and configuration of Email Templates for the following functions: New User, Request Password, and Password Change Notification. Can also set a default language and From Address. <br />
|-<br />
||'''[[Password Policy#Intruder Lockout Settings and Intruder Email Alert|Intruder Alert Settings]]'''<br />
||Allows modification of intruder settings, including the amount of retries, the lockout duration, and the content for an email alert when there is an intrusion.<br />
|-<br />
||'''Invalid Login Audit'''<br />
||Provides a [[List View Overview|list]] of invalid logins by username, IP Address, and time for auditing and record-keeping purposes.<br />
|-<br />
||'''[[Password Policy#View Locked Users|Locked Users]]'''<br />
||Provides a list of locked users by name, Lockout Time, and the feature to directly set that user with a new password. <br />
|-<br />
||'''Disabled Inactive Users '''<br />
||Provides a list of disabled, inactive users by name and date of disabling. <br />
|}<br />
===Password Encryption===<br />
For your information, if necessary: <br />
<br />
{{PasswordEncryption}}<br />
<br />
===Password Settings===<br />
This section, under the first tab of the '''Password and Activation Policies '''labelled '''General, '''is used to set password attributes. <br />
<br />
:: [[File:General password settings.png|400px|border]]<br />
{| class="wikitable"<br />
|-<br />
||'''Password Length'''<br />
||The minimum length allowed for a password; the number inputted must be between '''6 - 32 characters.'''<br />
|-<br />
||'''Complexity'''<br />
||<br />
Set the level of character-type complexity required for a password. The options are as follows: <br />
<br />
* '''No Restriction - '''any character can be used; this is the default. <br />
* '''Alpha Only - '''only letters are able to be used.<br />
* '''Alpha & Numeric - '''both letters and numbers must be used in the password.<br />
* '''Alpha & Numeric & Special Characters - '''a combination of letters, numbers, and special characters must be used. <br />
* '''Custom Policy - '''a password policy can be custom-defined. <br />
<br />
'''Disable Restriction of Common Passwords - '''Toggling on this function will then ''enable ''the user's ability to use common passwords as their password. This is not recommended for security reasons, as common passwords are easier to guess and to enable security breaches. <br />
<br />
|-<br />
||'''Force Password Change'''<br />
||<br />
'''Force New Password on First Login - '''This will ensure that each individual user will be forced to change their password from a system-generated or SysAdmin-determined password into one of their own accord. <br />
<br />
* '''Note: '''This first login does not count towards the Maximum Password Update in 24 Hours setting. <br />
<br />
<br />
'''Expire All Passwords Now - '''This is a handy button that will immediately invalidate all passwords in the system, ensuring that each user will have to reset their passwords when they next log in. A good use-case of this function might be if you updated your password policy to require more complex passwords; by expiring all passwords, every user in your system will have to create new passwords that fall under the new password criteria. <br />
<br />
|-<br />
||'''Password Expiration'''<br />
||Each user will be forced to change their password once the selected number of days has passed. Doing so every quarter or so is good security practice; however, any number of days can be set. On each login, the system will check how many days until the password expires and will notify the user their password is about to expire in X days.<br />
|-<br />
||'''Password History Check'''<br />
||You can set the number of previous passports (to a maximum of 32) that the system will remember for each user. When changing their password, users will not be permitted to re-use a previous password that is remembered by the '''Password History '''until the specified number of unique passwords have been used. <br />
|-<br />
||'''Maximum Password Changes in 24 Hours'''<br />
||<br />
This will set the maximum number of password changes any individual user is able to make within a 24-hour period. This is to prevent users from bypassing the password history restriction by changing their password repeatedly in order to return to a previously used password.<br />
<br />
* This setting only pertains to password changes by use of '''Update Password '''by the user - it is not relevant to the '''Forgot Password '''link nor to the [[Global User Administrator|System Administrators]] ability to '''Set Password '''for users. <br />
<br />
|-<br />
||'''Password Data Restriction'''<br />
||<br />
Configuring this setting will restrict password settings so that values such as first name, last name, or organization name ''cannot ''be used in the password. Any number of fields can be selected from both the '''Organization '''or the '''Contact '''[[Profile]]. <br />
<br />
'''Organization Field '''- Both [[Standard Fields|standard]] and [[Custom Fields|custom fields]] are supported. <br />
<br />
'''Contact Field '''- Both [[Standard Fields|standard]] and [[Custom Fields|custom fields]] are supported. <br />
<br />
|}<br />
====Disable Inactive Accounts and Activation Settings====<br />
Scrolling down further on the '''General '''password settings page will bring you to the sections that allow you to set the criteria for disabling and activating accounts. <br />
<br />
:: [[File:Password disable and activate.png|500px|border]]<br />
{| class="wikitable"<br />
|-<br />
||'''Disable user accounts after ''X ''days'''<br />
||Insert the number of days a user account is inactive before it is disabled. In order to disable this feature, simply leave the field blank.<br />
|-<br />
||'''Apply Policy to All Sub-Companies'''<br />
||<br />
Click this button to force-update the password policy related to the current organization and all sub-companies. <br />
<br />
'''Note: '''This is applicable when an organization has a [[The Root Company|root organization]], and one or more sub-companies each with its own password policies.<br />
<br />
|-<br />
||'''Disabled Inactive Account Message'''<br />
||Write in the text that will be displayed when a user is attempting to access an expired account.<br />
|-<br />
||'''Enable reCAPTCHA Validation'''<br />
||<br />
|-<br />
||'''Activation link life span'''<br />
||<br />
This function works with the @activationlink@ [[Password Variables to Set or Reset User Passwords|password variable]]. If the '''https://@url@@activationlink@ '''syntax is used in the '''Request Password '''section of [[Email#Email Templates for User Activation and Password|email templates]], this setting sets the duration that the activation link will be valid for the user in ''number of hours. ''<br />
<br />
* '''Note: '''Best practice is to provide around 24 hours. Providing too little time will force you to continuously resend links as users will be more likely to forget to activate their accounts in time. <br />
<br />
|-<br />
||'''Default Security Code'''<br />
||This is a hard-coded value to be entered when users request new passwords. For example, 12345. <br />
|-<br />
||'''Challenge Questions, delimited by semi-colons'''<br />
||<br />
You can set a series of challenge questions through which all users will be prompted to select one upon next login. Their answer to that question will be stored in the system, and if they forget their password, they will be prompted to enter this answer and click the activation link in the '''Forgot Password '''[[Email#Email Templates for User Activation and Password|email template]]. <br />
<br />
* '''Note: '''The best challenge questions will have answers that are simple, memorable, not easy to guess, and will not change over time. <br />
<br />
'''Example of Challenge Questions: '''<br />
<br />
: ''In what city or town was your first job?;''<br />''What is your mother's maiden name?;''<br />''What was your first pet's name?;''<br />''In what year was your father born? ''<br />
|}<br />
====Password Reset Message====<br />
Even further down at the bottom of the '''General '''page of '''Password and Activation Policies '''are features relating to a '''Password Reset Message '''and '''Persistent Login. '''<br />
<br />
:: [[File:Password reset message custom.png|800px|border]] <br />
In the text field box, write the content for the '''Reset Password '''message that a user will see if they need to reset their password. You may select between a default template or you may choose to make it custom. <br />
<br />
====Persistent Login====<br />
:: [[File:Persistent login.png|600px|border]] <br />
The '''Persistent Login''' functionality provides for the use of a persistent secure cookie on the [[SmartSimple]] [[User|user]]'s computer to eliminate the need to use a username and password to log into the system. <br />
Rather than having to log in to SmartSimple each time you open your web browser, a "cookie" can be installed on your computer that will automatically authenticate you, allowing you to bypass the login screen. (This setting can be [[System_Security_Permissions#Miscellaneous_Feature_Permission|enabled or disabled]] by your system administrator). In order for this feature to work, you must have the user's browser enabled to accept persistent cookies.<br />
====Rules for Password Activation Settings====<br />
When an organization has their password settings configured, then they will be used in full.<br />
<br />
When an organization does not have their password settings configured, the system will go up the [[Organization hierarchy|organization hierarchy]] until it finds a parent company with password settings configured, and by default it will allow the organization to inherit those settings. '''Example: '''If only the [[The Root Company|root organization]] has its password settings configured, all other organizations would inherit the same policies, as they all fall under the root organization on the organization hierarchy. <br />
<br />
* '''Note: '''An organization will display informational text at the top saying that its password policies have not been configured until they are. <br />
<br />
{| class="wikitable"<br />
|-<br />
||For when a new user is sent their password for the first time<br />
||<br />
* If the password activation settings have a '''default security code '''but no challenge questions, the user will be prompted to enter the default security code. <br />
* If the password activation settings have a '''default security code '''and '''challenge questions, '''the user will be prompted to enter the default security code and then taken to a second screen to define an answer to one of the challenge questions. The user can then go their [[Profile]] and access the '''Change Password '''page to view and update their stored challenge question and answer.<br />
* The user will be presented with reCAPTCHA validation in all cases.<br />
<br />
|-<br />
||For when an existing user requests a new password<br />
||<br />
* If the password activation settings have a '''default security code '''but no challenge questions, the user will be prompted to enter the default security code. <br />
* If the password activation settings have a '''default security ''''''code '''and '''challenge questions, '''the user will only be prompted to answer a challenge question.<br />
* The user will be presented with reCAPTCHA validation in all cases. <br />
<br />
|}<br />
After a user has successfully completed the appropriate password activation process, they will be logged into that SmartSimple [[instance]] and their newly created password will become active. <br />
<br />
====Custom Policy====<br />
* The '''Compose Custom Password Policy''' table provides the ability to define the custom password policy that matches your organization's security standards and provides control of each character type desired (upper case, lower case, numeric and/or symbols). You can also specify the minimum number of characters required for that character type.<br />
* The character mask used to define your selection will appear in the '''Custom Password Policy''' field. You can also write your own code and paste it into this field if desired.<br />
* The '''Validate Pattern''' button will open a window where you can test various passwords against the policy to see if they will pass or fail.<br />
* The value in the '''Custom Password Policy Description''' field will be displayed to users when setting/changing their password. You can use plain text or html in this field (For example, to insert a line break use ''&lt;br>'')<br />
* '''Note''': See also [[Custom Password Policy Examples]]<br />
[[Image:Custpwpolicy.png]]<br />
<br />
'''Important:''' When defining a custom password policy be sure to provide a detailed description of the policy in the '''Custom Password Policy Description''' field so that users are aware of the minimum requirement to enable them to create a valid password.<br />
<br />
If you need to translate the '''Custom Password Policy Description''' message you can use [[sslogic]]. It is often easiest to use [[System Variables]] for these. Example:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">&lt;!--@sslogic('@langid@'='2')-->&lt;br>@system.Password Policy - French@&lt;!--@else-->&lt;br>@system.Password Policy@&lt;!--@end--></pre><br />
===Intruder Lockout Settings and Intruder Email Alert===<br />
The third tab in '''Password and Activation Policies, '''called '''Intruder Alert Settings, '''will determine the actions that should be taken if someone attempts to log into your copy of [[SmartSimple]] but cannot provide accurate credentials.<br />
<br />
:: [[File:Intruder alert settings new.png|600px|border]]<br />
{| class="wikitable"<br />
|-<br />
||'''Number of Attempts'''<br />
||Enter a number from 1-32 that will denote the amount of times someone can ''attempt ''to log in with an account (that is, with an incorrect password) before that account is locked. <br />
|-<br />
||'''Lockout Duration'''<br />
||<br />
Select from a number of options the duration of the account lockout. Within this period, the user will have no ability to log in, even if their credentials are correct. <br />
<br />
* Options: 5 minutes, 15 minutes, 20 minutes, 1 hour, 3 hours, 12 hours, 24 hours or Forever<br />
* '''Note: '''If the '''Forever '''option is selected for the lockout duration, the user will have no access to login ''until ''manually unlocked by the [[Global User Administrator|System Administrator]] <br />
<br />
|}<br />
The latter half of this page has the heading '''Intruder Email Alert - '''using a default template, it allows you to customize the email alert when someone has been locked out because of intruding attempts. <br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Email From'''<br />
||The From Address for the email alert. If you do not manually set this value, then the address '''donotreply@smartsimple.com '''will be used.<br />
|-<br />
||'''Email To'''<br />
||<br />
Select the [[Internal]] people to receive the email alert. Click the '''binoculars icon '''for a full list of internal staff, from which you can select who to send the email alert to.<br />
<br />
* '''Note: '''The Default Template will use the [[Organization hierarchy#Organization Ownership|primary contact]] of the [[The Root Company|root organization]] to populate the '''Email To '''field. <br />
<br />
|-<br />
||'''Subject'''<br />
||The subject of the email. <br />
|-<br />
||'''Body'''<br />
||'''Sample Template - '''Clicking this will populate the text window automatically with a template of what the email alert will contain. It will include [[System Variables]]. <br />
|}<br />
'''Intruder Alert Email Variables''' – because the [[User|user]] is not logged into the system, the amount of information available is limited to IP Address '''@ip@''', the attempted username '''@username@''' and date/time '''@now@''' of the attempted login.<br />
<br />
===Locked Users===<br />
The '''Locked Users '''tab will display a [[List View Overview|list]] of all users that have had their account locked. <br />
<br />
:: [[File:Locked user lists.png|800px|border]]<br />
If a user is locked, you can click on the '''Set Password''' button on the '''View Locked Users''' tab to reactivate the account and send the [[User|user]] a new [[Password|password]].<br />
<br />
Once an account has been locked for exceeding the number of permitted login attempts, it will remain on the '''Locked Users '''list until the correct password is entered. This allows the SysAdmin to see which users have been unable to log in, even if the configured lockout duration has passed and the account is no longer technically locked.<br />
<br />
When an account has been locked for exceeding the number of permitted login attempts, after the lockout time has passed they are permitted only ''ONE ''attempt at the correct password. <br />
<br />
* A single incorrect password at this point will '''re-lock '''the account for the configured lockout duration. <br />
* This is a preventative measure so that would-be intruders do not have multiple attempts to guess the password each time the lockout duration has passed. <br />
<br />
===Disabled Inactive Users===<br />
This function is only available from '''Global Settings > Security > Password and Activation Policies; '''it is not accessible from individual password policies for the different companies in your [[Organization hierarchy|organization hierarchy]]. <br />
<br />
:: [[File:Disabled inactive users.png|800px|border]] <br />
<br />
Similarly to the '''Locked Users '''tab, the '''Disabled Inactive ''''''Users '''tab will provide a [[List View Overview|list]] of all expired [[User|users]] in your system. Their accounts have expired as a result of inactivity and a disabling that can be configured after a certain amount of time (see [[Password Policy#Disable Inactive Accounts and Activation Settings|Disable Inactive Accounts]].<br />
<br />
* Once an account has been disabled as a result of overly long inactivity, the user will remain on this list until their password is reset. This allows the SysAdmin to see which users have had their accounts disabled because of inactivity.<br />
* If an inactive user is disabled, there will be a '''Send Password '''button next to their name on this tab - that way, you can reactive the account and send the user a new password with which they can log into the system.<br />
<br />
==Single Sign-On==<br />
For information on the Single Sign-On settings and functionality, please refer to the [[Single Sign-On]] page.<br />
<br />
=See Also=<br />
* [[Custom Password Policy Examples]]<br />
* [[Password Variables to Set or Reset User Passwords]]<br />
<br />
<br />
[[Category:Global Settings]][[Category:Security]][[Category:System Auditing]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Web_Page_View_Field_Variables&diff=35521Web Page View Field Variables2019-06-21T12:17:44Z<p>Ciaran: </p>
<hr />
<div>The [[Web Page View Field]] provides the ability to display a fully formatted document or web page.<br />
<br />
In constructing this type of page HTML is used in conjunction with the following variables.<br />
<br />
=Variable List=<br />
==Current User==<br />
''Note: "me" -- refers to the current user''<br />
<br />
'''@me.firstname@ will be replaced by current user's firstname'''<br />
<br />
'''@me.lastname@'''<br />
<br />
'''@me.email@'''<br />
<br />
'''@me.phone@'''<br />
<br />
'''@me.companyname@'''<br />
<br />
'''@me.type@''' (returns 'User', 'Local User Administrator' or 'Global User Administrator')<br />
<br />
==UTA Level 1, Sales Opportunity and Job Variables==<br />
'''@name@''' - standard field '''Application Name'''.<br />
<br />
'''@type@''' - standard field '''Application Template Type'''.<br />
<br />
'''@status@''' - standard field '''Status'''<br />
<br />
'''@typecaption@''' - standard field '''Application Template Type Caption'''.<br />
<br />
'''@statuscaption@''' - standard field '''Status Caption'''<br />
<br />
'''@type_lang@''' - standard field '''Application Template Type (Based on user language setting)'''.<br />
<br />
'''@status_lang@''' - standard field '''Status (Based on user language setting)'''<br />
<br />
'''@description@'''<br />
<br />
'''@requirements@'''<br />
<br />
'''@currency@'''<br />
<br />
'''@revenue@'''<br />
<br />
'''@probability@'''<br />
<br />
'''@modifiedby@''' / '''@modifiedbyid@'''<br />
<br />
'''@modifieddate@'''<br />
<br />
'''@closedate@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''Created Date''' - no variable<br />
<br />
'''Created By''' - no variable<br />
<br />
'''@jobquestions@''' - displays as combo boxes<br />
<br />
'''@jobquestionsr@''' - displays question only<br />
<br />
'''@jobskills@'''<br />
<br />
<br />
'''@owner.field@'''<br />
<br />
Example: '''@owner.fullname@''' or '''@owner.address@'''<br />
<br />
'''@person.field@'''<br />
<br />
Example: '''@person.fullname@''' or '''@person.address@'''<br />
<br />
<br />
'''@company.field@'''<br />
<br />
Example: '''@company.name@''' or '''@company.address@'''<br />
<br />
<br />
'''@company.owner.field@'''<br />
<br />
Example '''@company.owner.email@'''<br />
<br />
'''@branch.field@'''<br />
<br />
Example: '''@branch.name@''' or '''@branch.address@'''<br />
<br />
'''@apptype@''' the Application ID (appid) of the UTA.<br />
<br />
==UTA Level 2 / Activities Variables==<br />
'''@subject@'''<br />
<br />
'''@description@'''<br />
<br />
'''@location@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@isallday@'''<br />
<br />
'''@modifieddate@''' (numeric value including time)<br />
<br />
'''@longmodifieddate@''' (text value excluding time)<br />
<br />
'''@starthour@''' - (0-23)<br />
<br />
'''@starth@''' - (0-12)<br />
<br />
'''@startpmam@''' - (PM or AM)<br />
<br />
'''@startminute@'''<br />
<br />
'''@endhour@''' - (0-23)<br />
<br />
'''@endh@''' - (0-12)<br />
<br />
'''@endpmam@''' - (PM or AM)<br />
<br />
'''@endminute@'''<br />
<br />
'''@owner@'''<br />
<br />
'''@eownerid@''' - userid of the owner<br />
<br />
'''@contact@'''<br />
<br />
'''@assigned@'''<br />
<br />
'''@eventid@'''<br />
<br />
'''@typename@'''<br />
<br />
'''@objectid@'''<br />
<br />
'''@objecttype@'''<br />
<br />
'''@rootcompanyid@'''<br />
<br />
'''@rootcompany.name@'''<br />
<br />
'''@contact.field@'''<br />
'''@eamount@'''<br />
<br />
Example: @contact.firstname@ or @contact.email@<br />
<br />
'''@assigned.field@'''<br />
<br />
Example: @assigned.firstname@ or @assigned.email@<br />
<br />
'''@contact.company.field@''' (same as assigned)<br />
<br />
Example: @contact.company.address@ or @contact.company.city@<br />
<br />
<u>'''Custom Field Variables'''</u><br />
<br />
'''@customfield name@ - by name'''<br />
<br />
'''or'''<br />
<br />
'''@#customfield id#@ - by id'''<br />
<br />
Example: @more information@ or @#17342#@<br />
<br />
<br />
See Also: [[Invoice Module Variables]] for Variables specific to the Invoicing module.<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 2'''</u><br />
<br />
If your '''Web Page View''' is at Level 2, you can call Level 1 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
Example: '''@parent.status@''' or '''@parent.startdate'''@ or '''@parent.#12345#@'''<br />
<br />
<br />
==UTA Level 2 variables called from UTA Level 3==<br />
When working at Level 3, you can call Level 2 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 3'''</u><br />
<br />
If your '''Web Page View''' is at Level 3, you can call Level 1 variables using:<br />
<br />
'''@parent.parent.'''''fieldname'''''@''' or '''@parent.parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''Level 3 Associated Parent (Opportunity) '''</u><br />
<br />
Where Payment Allocation is enabled you have two models to choose from before configuring: usually the Associated Parent is a Funding Stream of Overall Budget (event) and the associated object is the Disbursement (Level 3). In less granular cases the Associated Parent is the opportunity.<br />
<br />
<u>'''Level 3 Associated Parent'''</u><br />
<br />
<br />
If Payment Allocation is enabled, you can pull fields from the Associated Parent using the following variable:<br />
<br />
'''@linkparent.''fieldname''@'''<br />
<br />
If your associated payment is linked to the event you can pull fields from the opporunity using the following variable:<br />
<br />
'''@linkparent.''parent''.fieldname@''' So '''@linkparent.''parent''.branch@''' will return: '''SmartSimple Inc.'''<br />
<br />
On the company/branch:<br />
<br />
'''@linkparent.parent.branch.''Transit''@''' will return: '''''1950'''''<br />
<br />
=Field List=<br />
<u>'''People Fields'''</u><br />
<br />
firstname, lastname, fullname, title, email, phone, company, address, address2, city,<br />
province, state, country, postalcode, owner, modifieddate, cost, costunit, type,<br />
resourcename, isrecource, uprefix (prefix), usuffix (suffix), uphoneext (Phone Extension)<br />
<br />
<u>'''Company Fields'''</u><br />
<br />
name, address, address2, city, province, state, country, postalcode, phone, fax, website<br />
<br />
<u>'''Lead Fields'''</u><br />
<br />
status, description, name, phone, fax, address, address2, city, state, province, country,<br />
postalcode, website, firstname, lastname, contactphone, title, email, dat_added<br />
<br />
=UTA Contact and Account Variables=<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname'''''@</span><br />
Assigned (Level 2 only):<br />
<br />
: <span style="font-size: medium;">'''@assigned.''fieldname''@'''</span><br />
Company (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@client.''fieldname''@'''</span><br />
Use @client.categoryids@ to return a list of [[Determining the categoryid|category IDs]] - comma delimited - note the leading comma - e.g. ",1234,555,666,"<br />
<br />
Use @client.categories@ to return a list of category names - comma delimited e.g. "Agency,Marketing,Good client"<br />
<br />
==Level 1 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact/account in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename.fieldname''@''' </span> &nbsp; or &nbsp; <span style="font-size: medium;"> '''@company.''rolename.fieldname''@'''</span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact/account on the Level One item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contact.adjuster.firstname@ or @company.funding agency.address@<br />
<br />
Note: if there is more than one contact/account assigned with the rolename specified, only one will be displayed.<br />
<br />
===List===<br />
To display a list of multiple contacts/accounts in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~''fieldname''~ #]''' </span> or <span style="font-size: medium;"> '''[#(?object=company) ~''fieldname''~ #]''' </span><br />
See [[#To display a list of Activities (Level 2 or 3), Notes, Contacts or Companies|below]] for details on how to filter and sort the list(s).<br />
<br />
* '''Note''': to display the role that the contact or account is assigned on the Level 1 record use: <span style="font-size: medium;">'''~role~'''</span><br />
* '''Note''': to display the name of the contact's company use: <span style="font-size: medium;">'''~companyname~'''</span><br />
<br />
==Level 2 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact in the Level 2 contacts section:<br />
<br />
: <span style="font-size: medium;">'''@contacts.''rolename.fieldname''@''' </span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact on the Level Two item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contacts.adjuster.firstname@<br />
<br />
Note: if there is more than one contact assigned with the rolename specified, only one will be displayed.<br />
<br />
===Contacts===<br />
To display a list of the contacts assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To display only contacts assigned at Level 2 with a specific role/roles (only relevant if the Level 2 Multiple Contact List is enabled)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact::criteria=roleid=12345) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To get the intersection record identifier (equivalent to ~oprid~ at Level 1) (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~lnkid~ #]'''</span><br />
To display the contact's profile status:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~ustatusid~ #]'''</span><br />
'''Notes:'''<br />
<br />
* Contacts at level 2 cannot be filtered by rolename, only roleid<br />
* If the multiple contact list is enabled use '''~role~''' to display the assigned role.<br />
<br />
===Accounts===<br />
To display information for a <u>single</u> account in the Level 2 accounts section:<br />
<br />
: <span style="font-size: medium;">'''@companies.''rolename.fieldname''@'''</span><br />
To display a list of the companies assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company::orderby=name)~name~ #]'''</span><br />
To get the intersection record identifier (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company) ~clnkid~ #]'''</span><br />
'''Notes:'''<br />
<br />
:* The Account standard field is only available at Level 2 when the Multiple Account list is enabled. See [[Relating Contacts and Accounts to the Universal Tracking Application#The Account List Field|here]] for details.<br />
<br />
==To display Level 1 Company Role or Contact Role custom fields==<br />
<span style="font-size: medium;">'''[#(?object=company;)$?opc_''customfieldid''$#]'''</span> or <span style="font-size: medium;">'''[#(?object=contact;)$?opr_''customfieldid''$#]'''</span><br />
<br />
<br />
'''where:'''<br />
<br />
* customfieldid = the numeric id of the custom field<br />
<br />
'''Note:''' for level 2 records (when the multiple contact/company list(s) are enabled) use $?opr2_''customfieldid''$ and $?opc2_''customfieldid''$<br />
<br />
Following the same format above, you can also reference custom fields on the company role using the @#field id#@ syntax.<br />
<br />
<u>'''Contact Detail'''</u><br />
<br />
~uprefix~ ~firstname~ ~lastname~<br />
<br />
~uaddress~ ~uaddress2~<br />
<br />
~ucity~, ~ustate~ ~upostalcode~<br />
<br />
==To display Company Association or Contact Association fields==<br />
The syntax for extracting information on the entity to which they are associated is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association)~name~ ~standard field name~ $?afc_custom field id$ $?afc_custom field name$#]<br /><br />
<br />'''[#(?object=companyassociation)~standard field name~ $custom field id$ $custom field name$#]'''</span><br />
<br />
'''where:'''<br />
<br />
* standard field name = name of the standard field<br />
* custom field id = the numeric id of the custom field<br />
* custom field name = the name of the custom field<br />
<br />
<br />
The syntax for extracting information on fields that are on the intersection, rather than the entity to which they are associated, is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association) ~afcompanyid~ #]<br /><br />
<br />'''[#(?object=companyassociation)~afroleid~ #]'''</span><br />
<br />
<br />
Other '''intersection''' specific variables options include:<br />
<br />
* ~afcid~: association (intersection) record id.<br />
* ~afcompanyid~: [[companyid]] of associated company<br />
* ~afcontactid~: [[userid]] of associated contact<br />
* ~afroleid~: [[roleid]] of association<br />
* ~afstartdate~: start date of association<br />
* ~afenddate~: end date of association<br />
<br />
==Role Based Custom Fields==<br />
When you have a [[Custom Field]] such as a [[Web Page View]] or [[MS Word Merge]] that is located <u>'''on'''</u> a User Role or Company Role you can access:<br />
<br />
[[UTA]] Level 1 Information:<br />
<br />
: <span style="font-size: medium;">'''@levelone.''fieldname''@'''</span> or <span style="font-size: medium;">'''@levelone.''customfieldid''@'''</span><br />
Contact Information:<br />
<br />
: <span style="font-size: medium;">'''@contact.''fieldname''@'''</span> or <span style="font-size: medium;">'''@contact.''customfieldid''@'''</span><br />
Company Information:<br />
<br />
: <span style="font-size: medium;">'''@company.''fieldname''@'''</span> or <span style="font-size: medium;">'''@company.''customfieldid''@'''</span><br />
When you want to refer to a User Role based [[Custom Field]] '''<u>from</u>''' a [[UTA]] Level 1 record use the following syntax:<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person:<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname''@'''</span><br />
Contact:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename''.''fieldname''@'''</span><br />
: ''where rolename is the role they are assigned on the Level 1 record''<br />
=To Display a List of Activities, Notes, Transactions, Contacts, Companies, Consumers, Providers=<br />
==Syntax==<br />
: <span style="font-size: medium;">'''[#(?object=''objectname''::{options})~''standardfieldname''~ $''customfieldname''$#]'''</span><br />
'''Where:'''<br />
<br />
:* ''objectname'' is the name of the item to be listed.<br />
:: Either: '''address, activity, assign, contact, user, group, company, notes, association, companyassociation, transaction, timesheet''', '''level-1''', '''utaproviderL1''', '''utaproviderL2''', '''utaconsumerL1''', '''utaconsumerL2''' or '''linkactivity'''<br />
: <br />
:* ''standardfieldname'' is the name of a standard field (between tildes, ~)<br />
:* ''customfieldname'' is the name of a custom field (between dollar signs, $)<br />
<br />
'''Notes:'''<br />
<br />
:* You can refer to [[Custom Fields]] in the list using the Custom Field ID instead of the field name, still between dollar signs ('''$12345$''')<br />
:* '''level-1''' can only be used as an object when referenced from a contact record. Also '''level-1''' will only list the level 1s that the contact has been added to in the contacts section.<br />
:* You can include text as well as variables within the [#...#] syntax.<br />
:* When using this syntax for [[Web Page View]]s, [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] etc. you will usually want to include HTML table formatting within the '''[#...#]''' syntax (see examples below). For [[MS Word Merge]] custom fields the table defined on the MS Word Template document, with the columns delimited by pipes (|) within the '''[#...#]'''.<br />
:* '''~Index~''' can be used to number the lines (1, 2, 3...) '''Note:''' ~index~ does not work for all lists. For example, it cannot be used when listing contacts associated with a Level 1.<br />
:** ''~Index~'' (upper case 'I') starts numbering at 1, ''~index~'' (lower case 'i') starts numbering at 0.<br />
~eventid~ will display the id of the level 2.<br />
<br />
<br />
'''Options:'''<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Option'''<br />
||'''Effect'''<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname''</span><br />
||Sorts the list in ascending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname'' desc</span><br />
||Sorts the list in descending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=tbl_''customfieldid''.valuestr</span><br />
||Sorts the list in ascending order by the custom field specified<br />
|-<br />
||<span style="font-size: medium;">criteria=''standardfieldname''='''value'''</span><br />
||Filters the list by the standard field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=tbl_''customfieldid''.valuestr='''value'''</span><br />
||Filter the list by the custom field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' or ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''either''' conditional criteria can apply<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' AND ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''both''' conditional criteria must apply<br />
|-<br />
||<span style="font-size: medium;">groupfunction=''aggregatefunction''</span><br />
||Performs specified aggregate function on the listed fields<br />Ex. sum, count, countdistinct<br />
|}<br />
<br />
* ''multiple options (i.e. a criteria and an orderby option) can be included, separated by doubled colons (::)''<br />
<br />
'''Important:''' Any custom fields that you use as criteria or orderby '''must''' appear in the display. If you do not wish to display the field you can place it in a comment. (i.e.: &lt;!--$12343$-->) However, if referencing a field as a property of a table you must show the value.<br />
<br />
'''Examples:'''<br />
<br />
* To generate a list of Level 2 activities for a [[MS Word Merge]]:<br />
<br />
[#(?object=activity)|~statusname~|~typename~|$speciality$|$123456$|#]<br />
:: ''See [[MS Word Merge]] for further details on including tables on MS Word Merge documents''<br />
: <br />
:* To reference the Consumer UTA Level 1 owner name and ownerid from a Provider UTA Level 1 Read Only - System Variable custom field<br />
<br />
[#(?object=utaconsumer::criteria=statusname IN ('Placed','Resigned/Terminated'))~ownername~,~ownerid~ #]<br />
<br />
:* To Display custom fields via List Syntax for Invoicing (objectname=appliedtoinvoices). Grabbing a custom field value off the invoice (ie. 282588) and into an adjustment.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">Example: [#(?object=appliedtoinvoices)$282588$#]</pre><br />
::: ''Note: refer to the custom field by the number ONLY, do not use the custom field name.''<br />
<br />
<br />
:* To generate a list of all contacts for a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] custom field (note that the HTML table formatting is included within the '''[#...#]''' syntax)<br />
<br />
[#(?object=contact)#]<br />
<br />
{|<br />
|-<br />
||First Name<br />
||Last Name<br />
||E-mail Address<br />
||Cell Phone Number<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
||$Cell Phone$<br />
|}<br />
::: ''Note: The first line creates a header row for the table''<br />
<br />
<br />
:* For a list of Level 2 (or Level 3) activities sorted by Start Date in descending order:<br />
<br />
[#(?object=activity::orderby=startdate desc)#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* For a list of contacts assigned to a Level 1 with the role of "Internal People", sorted by surname:<br />
<br />
[#(?object=contact::orderby=lastname::criteria=rolename='Internal People')#]<br />
<br />
{|<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
|}<br />
<br />
:* For a list of level 1 records, including owner details, that a Company has been asssigned to:<br />
<br />
[#(?(object =level-1) NAME: ~name~ OWNERID: ~ownerid~ OWNERNAME: ~ownername~ #]<br />
<br />
<br />
<br />
:* For a list of all companies that the owner of a [[UTA]] record is associated with:<br />
<br />
@owner.[#(?object=association)~name~ (Phone ~phone~)<br />
#]@<br />
<br />
<br />
:* To get a comma-separated list of the companyids of all the companies the current user is associated with with roleid 54545:<br />
<br />
,@me.[#(?object=association::criteria=roleid=54545)~afcompanyid~,#]@<br />
<br />
<br />
:* For a list of all contacts associated to the current user's parent company record (associated to the company with [[roleid]] 12345):<br />
<br />
@me.parent.[#(?object=association::criteria=roleid='12345')~firstname~ ~lastname~ (Phone ~phone~)<br />
#]@<br />
<br />
:* For a list of a company's Active(current date is between start and end date) associations:<br />
<br />
[#(?object=association::criteria=(afstartdate is null OR afstartdate<='@date(currentdate)@') AND (afenddate is null OR afenddate>='@date(currentdate)@'))~userid~,#]<br />
<br />
:* For a list of all contacts/users located under a company with a given role<br />
<br />
[#(?object=user::criteria=rolelist like '%,12345,%') ~email~ #]<br />
<br />
<br />
:* To count the number of contacts assigned with the role of Reviewer:<br />
<br />
[#(?object=contact::criteria=rolename="Reviewer"::groupfunction=count)~userid~#]<br />
<br />
<br />
:* To include and format a date stored in a custom field (see also [[sscalculation]])<br />
<br />
[#(?object=activity)<!--@sscalculation(date_format("$fieldname$","%M %d, %Y"))-->#]<br />
<br />
<br />
:* With Multiple Criteria:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=contact::criteria=(rolename='External' or rolename='Internal'))~firstname~ ~lastname~#]<br />
</pre><br />
<br />
<br />
:* To sort descending by a custom field called ''Total Hours'' with a custom field id of ''67292'':<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=tbl_67292.valuestr desc)Subject: ~subject~Total Hours: $Total Hours$Start Date: ~startdate~#]<br />
</pre><br />
'''Note:''' ''$Total Hours$'' in the list could be listed as ''$67292$'' with the same result.<br />
<br />
<br />
<br />
:* To sort descending reviews in a specific status by a custom field on a separate UTA Level 1 field called ''$Staff Final Score$'' with a custom field id of ''1584168'' in numeric order:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaconsumerL1::orderby=tbl_15868.valuestr*1::criteria=(statusname='Member Review'))<br />
</pre><br />
'''Note:''' ''$Staff Final Score$'' in the list could be listed as ''$15868$'' with the same result.<br />
<br />
<br />
<br />
:* To list a specific activity type only:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate::criteria=typename='This Activity Type')~subject~~location~~startdate~#]<br />
</pre><br />
<br />
<br />
:* To list activities based on the [[Determining the typeid|type ID]] ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=typeid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To include a hyperlink to the object (for Accounts):<br />
<br />
[#(?object=company::criteria=rolename="Cooperating Organization")#]<br />
<br />
{|<br />
|-<br />
||[s_viewcompany.jsp?companyid=~companyid~ ~name~]<br />
||~role~<br />
|}<br />
<br />
<br />
:* To list activities based on status:<br />
<br />
[#(?object=activity::orderby=startdate::criteria=statusname='Open')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list activities based on the status ID ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=status.statusid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list UTA Providers:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=rolename="Panel") ~name~ ~typename~ ~statusname~ ~enddate~ $Panel Review Date$ $Panel ID</pre><br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">lt;br>#]</pre><br />
<br />
<br />
:* To list notes (from the record that contains the notes):<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=notes::orderby=createddate desc)~notes~~createddate~~username~#]<br />
</pre><br />
::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
:: <br />
::* To list all companies under a parent company record:<br />
<br />
[#(?object=company) ~name~ #]<br />
<br />
::* To list all L3 allocations within a L2 budget record:<br />
<br />
[#(?object=linkactivity) ~subject~ #]<br />
<br />
<br />
::* To sum or count all the L3 allocations from the budget L2 record:<br />
<br />
@linkactivity.sum(...)@ or @linkactivity.count(...)@<br />
<br />
'''To list level 2 notes for each level 2 record at level 1:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate desc)~subject~~description~~startdate~<br />
[@(?object=notes::orderby=createddate desc)@]</pre><br />
{|<br />
|-<br />
||~notes~<br />
||~createddate~<br />
||~username~<br />
|}<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">#]<br />
</pre><br />
:::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
'''To do a sum of all the unpaid payment transaction:<br />
<br />
{|<br />
|-<br />
||Total Paid: [#(?object=transaction::criteria=trstranstype=11 and tbl_1145339.valuestr='Paid'::groupfunction=sum)$1145183$ <!--"145339$-->#] Note: $1145339$ - Status of payment $1145183$ - Payment Amount<br />
|}<br />
<br />
==Referencing Standard Fields of UTA Providers==<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 1 Field Name and Variable List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Application Name<br />
||~name~<br />
|-<br />
||Type Name<br />
||~typename~<br />
|-<br />
||Type ID<br />
||~type~<br />
|-<br />
||Status Name<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Close Date<br />
||~closedate~<br />
|-<br />
||Branch<br />
||''No variables''<br />
|-<br />
||Branch ID<br />
||~branchid~<br />
|-<br />
||Currency<br />
||''No variables''<br />
|-<br />
||Exchange Currency<br />
||''No variables''<br />
|-<br />
||Currency Exchange Rate<br />
||''No variables''<br />
|-<br />
||Customer<br />
||~client~<br />
|-<br />
||Customer ID<br />
||~companyid~<br />
|-<br />
||Modified By<br />
||''No variables''<br />
|-<br />
||Modified Date<br />
||''No variables''<br />
|-<br />
||Owner (full name)<br />
||~ownername~<br />
|-<br />
||Owner (userid)<br />
||~updatedby~<br />
|-<br />
||Person (full name)<br />
||''No variables''<br />
|-<br />
||Person (userid)<br />
||~oppeopleid~<br />
|-<br />
||Role Name<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~conroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1) ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 2 Field Names and Variables List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Activity Type<br />
||~typename~<br />
|-<br />
||Activity Type ID<br />
||~typeid~<br />
|-<br />
||Owner<br />
||~ownername~<br />
|-<br />
||Owner ID<br />
||~eownerid~<br />
|-<br />
||Assigned People<br />
||''No variables''<br />
|-<br />
||Status<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Subject<br />
||~subject~<br />
|-<br />
||Description<br />
||~description~<br />
|-<br />
||Location<br />
||~location~<br />
|-<br />
||Amount<br />
||~eamount~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Opportunity ID<br />
||~cevconoppid~<br />
|-<br />
||Event ID<br />
||~cevprovevtid~<br />
|-<br />
||Rolename<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~cevroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL2) ~typename~ | ~statusname~ <br />#]</pre><br />
If you have multiple different UTAs connected as providers, you can use criteria to filter:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=provappid="12345") ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
==To Format the Start Date or Start Time==<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%Y-%m-%d') as startdate~'''</span><br />
:::: or<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%h:%i %p') as starttime~'''</span><br />
'''Note:'''<br />
<br />
:::* If you wish to use ''"orderby=startdate"'', along with a date format other than yyyy-mm-dd you must use a slightly different syntax.<br />
:::* Using ''"~date_format(startdate,'%d-%m-%Y') as startdate~"'' when using ''"orderby=startdate"'' will cause the date to be ordered by dd-mm-yyyy (rather than yyyy-mm-dd, which is chronological)<br />
:::* To avoid this, change ''"date_format(startdate,'%d-%m-%Y') as '''startdate'''"'' to ''"date_format(startdate,'%d-%m-%Y') as '''sdate'''"''<br />
<br />
==Displaying Both Level 2 and Level 3 Activities at Level 1==<br />
When displaying a list of '''Level 2''' activities using the '''[#(?object=activity;)...#]''' syntax, the corresponding '''Level 3''' activities can be displayed under each of the parent '''Level 2''' activities.<br />
<br />
<br />
To facilitate this you must create a [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] field '''at''' Level 2 that contains the list of Level 3 activities, formatted and filtered as desired.<br />
<br />
:::: ''You can use [[Visibility Condition]]s, [[Role Field Permissions]] or [[Status Field Permissions]] to prevent the field from being displayed on the Level 2 record.<br />
'''Example:'''<br />
<br />
::* Create a Level 2 [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] Custom Field called '''Level 3 Activity List''' with the following:<br />
<br />
[@(?object=activity::orderby=typename)@]<br />
<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
<br />
Then create either a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] at Level 1:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|$Level 3 Activity List$<br />
|}<br />
:::: '''where''' "Level 3 Activity List" is the name you gave the [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] field<br />
<br />
<br />
===Level 3s with Less Than 25 Fields===<br />
If Level 3 has less than 25 fields it is not necessary to create a [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] Custom Field on the Level 2 that lists the Level 3 activities.<br />
<br />
Instead you can use the following syntax '''within''' the '''[#...#]''' that lists the Level 2 activities:<br />
<br />
::: <span style="font-size: medium;">'''[@(?object=activity)~standardfieldname~ $customfieldname$@]'''</span><br />
'''Note:'''<br />
<br />
::* This syntax will only work if there are '''less than 25 fields at Level 3.'''<br />
<br />
'''Example:'''<br />
<br />
::* To display a list of Level 2 activities, including any Level 3 activities under their parent Level 2 activity:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|[@(?object=activity;orderby=typename)@]<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
|}<br />
<br />
==Displaying a Specific Number of Items in a List==<br />
When you want to display only specific number of activities or transactions in a [[Web Page View]] use the following syntax.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"> [#(?object=object::orderby=field) <br />
<!--@sslogic(~index~='num')--> <br />
~standard field~ $custom field$ <br /> <br />
<!--@end--> <br />
#] <br /> <br />
</pre><br />
'''where:'''<br />
<br />
::* num = number of activities that should be displayed<br />
<br />
=XML Variables=<br />
==Count how many options were selected==<br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<br />
<br />
==Filtered XML display output==<br />
<pre>@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A")~FirstName.nodevalue~ ~LastName.nodevalue~<br />#]@</pre><br />
<br />
<br />
=Date/Time Variables=<br />
==Standard Fields Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
'''Start Date''''''End Date''''''Close Date'''<br />''Level 1 only'''''Modified Date''''''Display Format'''@startdate@@enddate@@closedate@@modifieddate@Date formatted according to user preferences (At Level 1 Modified Date also includes the time: 15:40)@longstartdate@@longenddate@@longclosedate@@longmodifieddate@Friday, January 23, 2009@fullstartdate@@fullenddate@@fullclosedate@@fullmodifieddate@2009-01-23 15:40:00@datetime(fullstartdate)@@datetime(fullenddate)@@datetime(fullclosedate)@@datetime(fullmodifieddate)@2009-01-23 15:40:00@date(fullstartdate)@@date(fullenddate)@@date(fullclosedate)@@date(fullmodifieddate)@2009-01-23<br />
<br />
<br />
<br />
::* '''Note''': ''Start Time'' and ''End Time'' are stored within the ''fullstartdate'' and ''fullenddate'' fields respectively. They can be accessed and formatted using the variables elements listed below.<br />
<br />
'''To display specific elements of the Start Date, Start Time, End Date, End Time, Close Date, Modified Date''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(fullstartdate)@month number in ''Start Date''@monthname(fullstartdate)@name of month in ''Start Date''@day(fullstartdate)@day in ''Start Date''@dayweek(fullstartdate)@name of day in ''Start Date''@year(fullstartdate)@year in ''Start Date''@hour(fullstartdate)@hour in ''Start Time'' using 12 hour clock (0-12)@ampm(fullstartdate)@AM or PM reference for ''Start Time''@hour24(fullstartdate)@hour in ''Start Time'' using 24 hour clock (0-24)@minute(fullstartdate)@minute in ''Start Time''<br />
<br />
::: '''Note:''' For '''End Date''', '''Close Date''' or '''Modified Date''' replace '''fullstartdate''' with '''fullenddate''', '''fullclosedate''' or '''fullmodifieddate''' respectively.'''<br />
::: ''(seconds are not available for standard date/time fields)''<br />
::: ''('''Close Date''' does not have a time associated with it)<br />
'''Examples:'''<br />
<br />
::* To display the Start Date in the format '''February 22, 1985''' you would use:<br />
<br />
@monthname(fullstartdate)@ @day(fullstartdate)@, @year(fullstartdate)@<br />
<br />
::* To display the End Time in the format '''06:45PM''' you would use:<br />
<br />
@hour(fullenddate)@:@minute(fullenddate)@@ampm(fullenddate)@<br />
<br />
==Current Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplayComment@datetime(currentdate)@current date and time as for yyyy-mm-dd HH:mm:ss2013-01-22 17:55:22See also [[Obtain Server Date and Time]]@date(currentdate)@current date as for yyyy-mm-dd2013-05-17&nbsp;@currentdate@current date2009 January 25&nbsp;@now@current date and time2009 August 25 11:05AMWorkflows only. Not available within [[UTA]]s<br />
<br />
<br />
'''To display specific elements of the current date or time''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(currentdate)@current month number@monthname(currentdate)@name of current month@day(currentdate)@current day@dayweek(currentdate)@name of current day@year(currentdate)@current year@hour(currentdate)@current hour using 12 hour clock (0-12)@ampm(currentdate)@AM or PM reference for current time@hour24(currentdate)@current hour using 24 hour clock (0-24)@minute(currentdate)@current minute<br />
<br />
::: (seconds are not available for the current time)<br />
'''Examples:'''<br />
<br />
::* To display the current date/time in the format '''Friday at 19:55''' you would use:<br />
<br />
@dayweek(currentdate)@ at @hour24(currentdate)@:@minute(currentdate)@<br />
<br />
==Custom Fields Date/Time==<br />
'''For a custom field on the same level as the Web Page View Field, you can parse out a particular date/time in a date field'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplay@date(''fieldname'')@custom field date as for yyyy-mm-dd2013-05-17<br />
<br />
<br />
@month(''fieldname'')@month number in ''fieldname''05@monthname(''fieldname'')@name of month in ''fieldname''May@day(''fieldname'')@day in ''fieldname''17@dayweek(''fieldname'')@name of day in ''fieldname''Friday@year(''fieldname'')@year in ''fieldname''2013@hour(''fieldname'')@hour in ''fieldname'' using 12 hour clock (0-12)12@ampm(''fieldname'')@AM or PM reference for time in ''fieldname''AM@hour24(''fieldname'')@hour in ''fieldname'' using 24 hour clock (0-24)00@minute(''fieldname'')@minute in ''fieldname''00@second(''fieldname'')@second in ''fieldname''00<br />
<br />
<br />
'''Examples:'''<br />
<br />
::* To display the custom field '''Date Of Birth''' in the format '''31-01-2001''' you would use:<br />
<br />
@day(date of birth)@-@month(date of birth)@-@year(date of birth)@<br />
<br />
'''Note:'''<br />
This syntax will not work for custom fields on a different level. You will not be able to reference, for example, @day(parent.''fieldname'')@. To parse out date/time information from a custom field on a different level, use the [[Sscalculation#Using_sscalculation_to_Change_Date_Formats_of_Data_in_Custom_Fields|sscalculation]] syntax.<br />
<br />
=Miscellaneous Variables=<br />
==Adding an image from Upload fields==<br />
Users can return image thumbnails or meta data from multiple file fields using the list syntax below":<br />
<br />
::* Show thumbnail image using thunbnailpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~thumbnailpath~" alt="" width="240" /> #]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using filepath option:<br />
<br />
<pre>@multi file name.template[# <img src="~filepath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using compressedpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~compressedpath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show file name, size and upload date:<br />
<br />
<pre>@multi file name.template[# ~filename~, ~filesize~, ~uploaddate~#]@<br />
</pre><br />
<br />
<br />
==Adding a File Upload button==<br />
To display a button to upload to a [[Single File]] or [[Multiple Files]] custom field:<br />
<br />
::* Single File:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label" /></span><br />
:: <br />
::* Multiple Files:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label." /></span><br />
'''where:'''<br />
<br />
::* ''customfieldid'' = the field id of the Single or Multiple file custom field (without '''cf_''')<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Multiple files..." /><br />
<br />
'''Note:''' if adding to a [[Web Page View]] you will need to add the following to the page:<br />
<br />
<pre>function include_dom(script_filename) {<br />
var html_doc = document.getElementsByTagName('head').item(0);<br />
var js = document.createElement('script');<br />
js.setAttribute('language', 'javascript');<br />
js.setAttribute('type', 'text/javascript');<br />
js.setAttribute('src', script_filename);<br />
html_doc.appendChild(js);<br />
return false;<br />
}<br />
function includejsfiles() {<br />
include_dom("/validate.js");<br />
}<br />
</pre><br />
You will also have to call the ''includejsfiles'' function in the body onload:<br />
<br />
<br />
<br />
<br />
<br />
'''Alternatively:'''<br />
<br />
You may also use @fieldname.uploadlink@ to get the url for the upload page and construct your own function to open the window.<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Upload" /><br />
<pre>function openupload(url)<br />
{ <br />
upload_window = window.open(url,'upload_window', 'menubar=yes,scrollbars=yes,width=800,height=600,status=no,resizable=yes,dependent=yes,alwaysRaised=yes');<br />
upload_window.opener = window;<br />
upload_window.focus();<br />
}<br />
</pre><br />
<br />
'''Note:''' this method will only open the single file upload page.<br />
<br />
==Displaying a Dynamic Data Grid field==<br />
To show a [[Custom Field Type: Dynamic Data – Data Grid|Dynamic Data – Data Grid]] field in a webpage view field use the following syntax:<br />
<br />
::: <span style="font-size: medium;">'''@fieldname.table'''@</span><br />
==Retrieving History for Fields with Track Changes Enabled==<br />
The following syntax is used to retrieve standard or custom field history:<br />
<br />
For the [[Status]] standard field:<br />
<br />
::: <span style="font-size: medium;">'''@HistoryOf(status)@'''</span><br />
::: <span style="font-size: medium;">'''@HistoryOf(statuscaption)@'''</span><br />
For a [[Custom Field]]:<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldid'')@'''</span><br />
OR<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldname'')@'''</span><br />
'''Notes:'''<br />
:::* ''HistoryOf'' is case sensitive.<br />
:::* See the [[HistoryOf function]] page for a complete description of this variable and its uses.<br />
<br />
<!--:::* You can only obtain the history of the Status field and [[Custom Fields]] in this way.--><br />
<br />
==For Hybrid Sign-Up Pages==<br />
::: The @user_input_form@ will display the associated user sign up form on a company sign up page if included in the HTML template of the company sign up page.<br />
<br />
<br />
==Currency Format==<br />
::: You can use the following syntax to format a custom field with currency: @format(L2 Subcontract total y1,currency,USD,2)@. The last parameter can be changed from 2 to 0 to display as a whole number.<br />
=Controls=<br />
==Hide a variable if it is missing==<br />
Put the following in front of variable name.<br />
<br />
::: <span style="font-size: medium;">'''&lt;!--hideifnotfound-->'''</span><br />
'''Example''':<br />
<br />
<pre> <!--hideifnotfound-->@parent.contact.adjuster.email@<br />
</pre><br />
<br />
'''Note:''' the &lt;!--hideifnotfound--> and the variable must be in immediate succession, and not separated by a space.<br />
<br />
==How to display different content based on a value using SSlogic==<br />
To display content based on a value from a variable add '''&lt;!--@sslogic('@branch.name@'='Internal Staff')--&gt;''' in front of the content and '''&lt;!--@end--&gt;''' at the end of the content. If there are 2 different pieces of content to be displayed based on a value and all others add '''&lt;!--@else--&gt;''' between the 2 pieces of content.<br />
<br />
<pre><br />
<!--@sslogic(CONDITION)--><br />
The content to be displayed when condition is true.<br />
This can be more than one line.<br />
<!--@end--><br />
</pre><br />
<br />
::* The content to be displayed (the middle line) can either be in plaintext or in HTML.<br />
::* Be sure there are single quotes around the variable and value.<br />
::* SSlogic does not support nested logic statements.<br />
<br />
'''Example:'''<br />
<br />
::* The following will display a Christmas tree image if the month is December:<br />
<br />
<pre><br />
<!--@sslogic(month(now())=12)--><br />
<img src="images/xmasstree.jpg" alt="" /><br />
<!--@end--><br />
</pre><br />
<br />
'''See [[SSlogic]] for more information and further examples.'''<br />
<br />
==How to display check boxes in the Web Page View==<br />
To display Select Many - Check Box type custom fields as check boxes in a web page view add '''@checkbox('fieldname/fieldnumber','option name')@''' to the check box control.<br />
<br />
This syntax works if the check boxes are on the same level.<br />
<br />
'''Example:'''<br />
<br />
<pre><input type="checkbox" /><br />
</pre><br />
<br />
::: See Also: [[Updateable Web Page View Fields]] if you wish the Web Page View check boxes to have the ability to change the underlying data.<br />
==How to display level two check boxes on level one in the Web Page View==<br />
@checkboxvalue(id<br />
<br />
values to be checked)@<br />
<br />
<input name="checkboxb20" type="checkbox" value="Limited community support" /><br />
<br />
<br />
::* Use two "'''|'''" (pipes) to separate '''id''' and '''value''' to be checked<br />
<br />
where 1199639 is customfield id<br />
if it is used on the same level '''@1199639@'''<br />
if it is used on the child level '''$1199639$'''<br />
<br />
This works for level one check boxes on level one web page view<br />
AND<br />
works for level two check boxes on level one web page view<br />
AND<br />
works for level three check boxes on level one web page view<br />
<br />
<br />
<br />
<br />
<br />
==How to suppress the Page Footer with Printing the Page==<br />
To suppress the footer when printing the page you need to change your browser settings.<br />
<br />
'''Internet Explorer'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Delete the '''Header''' and '''Footer''' text.<br />
<br />
3. If required, change the margins.<br />
<br />
'''FireFox'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Click the '''Margins & Header/Footer''' tab.<br />
<br />
3. Set all '''Header''' and '''Footer''' options to '''Blank'''.<br />
<br />
3. If required, change the margins.<br />
<br />
==How to control print behaviour==<br />
'''To define a page break place the following code in the HTML source before the content you deem as the next page''':<br />
<br />
<br />
'''To change the page orientation to landscape first place the following in the header portion ('''<br />
<br />
''') of the HTML''':<br />
<br />
'''<strong>Then place'''</strong><br />
<br />
<pre> </pre><br />
'''in the HTML source around the "page" content.'''<br />
Example:<br />
<br />
<div class="page">This is the page content that needs to be in landscape</div><br />
Please note that the page orientation control only works with Internet Explorer and is not the greatest quality print due to the page being converted to an image then rotated.<br />
<br />
==How to control print behaviour when saving as a PDF==<br />
To define a page break in a PDF add before the content you deem as the next page.<br />
<br />
To change the orientation of a page to landscape in a PDF add before the content you deem as the next page.<br />
<br />
::* See [[PDF Writer Custom Tags]] for further [[PDF]] formatting options<br />
<br />
=Troubleshooting=<br />
::* '''Issue''': 2 variables run together (thus removing the ending @ and beginning @)<br />
::* '''Resolution''': Place a non-breaking space tag (&amp;nbsp;) between the variables.<br />
<br />
<br />
<br />
::** '''Issue''': For a list of level 2 activities, the code is showing instead of the field headings and values you've designated.<br />
::** '''Resolution''': Insert a comment tag before the first cell tag. i.e.<br />
<br />
<pre> </pre><br />
<br />
index <br />
<br />
==See Also==<br />
::* [[Root Company Variable]]s<br />
::* [[sslogic]]<br />
::* [[ssattach]]<br />
::* [[sscalculation]]<br />
::* [[Web Page View Field]]<br />
::* [[Attach a PDF to a Web Page View]]<br />
::* [[Updateable Web Page View Fields]]<br />
::* [[Changing the Status from a Web Page View]]<br />
::* [[Custom Field Type: Display Only – Web Page View]]<br />
::* [[:Category:PDF|PDF Category]]<br />
::* [[PDF Writer Custom Tags]]<br />
::* [[Adding JavaScript JS files to Web Page View Pages]]<br />
::* [[Custom Field ID|Determining the Custom Field ID]]<br />
::* [[Allow for '$' in webpage view field showing activity]]<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=Web_Page_View_Field_Variables&diff=35520Web Page View Field Variables2019-06-21T12:17:08Z<p>Ciaran: </p>
<hr />
<div>The [[Web Page View Field]] provides the ability to display a fully formatted document or web page.<br />
<br />
In constructing this type of page HTML is used in conjunction with the following variables.<br />
<br />
=Variable List=<br />
==Current User==<br />
''Note: "me" -- refers to the current user''<br />
<br />
'''@me.firstname@ will be replaced by current user's firstname'''<br />
<br />
'''@me.lastname@'''<br />
<br />
'''@me.email@'''<br />
<br />
'''@me.phone@'''<br />
<br />
'''@me.companyname@'''<br />
<br />
'''@me.type@''' (returns 'User', 'Local User Administrator' or 'Global User Administrator')<br />
<br />
==UTA Level 1, Sales Opportunity and Job Variables==<br />
'''@name@''' - standard field '''Application Name'''.<br />
<br />
'''@type@''' - standard field '''Application Template Type'''.<br />
<br />
'''@status@''' - standard field '''Status'''<br />
<br />
'''@typecaption@''' - standard field '''Application Template Type Caption'''.<br />
<br />
'''@statuscaption@''' - standard field '''Status Caption'''<br />
<br />
'''@type_lang@''' - standard field '''Application Template Type (Based on user language setting)'''.<br />
<br />
'''@status_lang@''' - standard field '''Status (Based on user language setting)'''<br />
<br />
'''@description@'''<br />
<br />
'''@requirements@'''<br />
<br />
'''@currency@'''<br />
<br />
'''@revenue@'''<br />
<br />
'''@probability@'''<br />
<br />
'''@modifiedby@''' / '''@modifiedbyid@'''<br />
<br />
'''@modifieddate@'''<br />
<br />
'''@closedate@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''Created Date''' - no variable<br />
<br />
'''Created By''' - no variable<br />
<br />
'''@jobquestions@''' - displays as combo boxes<br />
<br />
'''@jobquestionsr@''' - displays question only<br />
<br />
'''@jobskills@'''<br />
<br />
<br />
'''@owner.field@'''<br />
<br />
Example: '''@owner.fullname@''' or '''@owner.address@'''<br />
<br />
'''@person.field@'''<br />
<br />
Example: '''@person.fullname@''' or '''@person.address@'''<br />
<br />
<br />
'''@company.field@'''<br />
<br />
Example: '''@company.name@''' or '''@company.address@'''<br />
<br />
<br />
'''@company.owner.field@'''<br />
<br />
Example '''@company.owner.email@'''<br />
<br />
'''@branch.field@'''<br />
<br />
Example: '''@branch.name@''' or '''@branch.address@'''<br />
<br />
'''@apptype@''' the Application ID (appid) of the UTA.<br />
<br />
==UTA Level 2 / Activities Variables==<br />
'''@subject@'''<br />
<br />
'''@description@'''<br />
<br />
'''@location@'''<br />
<br />
'''@startdate@'''<br />
<br />
'''@enddate@'''<br />
<br />
'''@isallday@'''<br />
<br />
'''@modifieddate@''' (numeric value including time)<br />
<br />
'''@longmodifieddate@''' (text value excluding time)<br />
<br />
'''@starthour@''' - (0-23)<br />
<br />
'''@starth@''' - (0-12)<br />
<br />
'''@startpmam@''' - (PM or AM)<br />
<br />
'''@startminute@'''<br />
<br />
'''@endhour@''' - (0-23)<br />
<br />
'''@endh@''' - (0-12)<br />
<br />
'''@endpmam@''' - (PM or AM)<br />
<br />
'''@endminute@'''<br />
<br />
'''@owner@'''<br />
<br />
'''@eownerid@''' - userid of the owner<br />
<br />
'''@contact@'''<br />
<br />
'''@assigned@'''<br />
<br />
'''@eventid@'''<br />
<br />
'''@typename@'''<br />
<br />
'''@objectid@'''<br />
<br />
'''@objecttype@'''<br />
<br />
'''@rootcompanyid@'''<br />
<br />
'''@rootcompany.name@'''<br />
<br />
'''@contact.field@'''<br />
'''@eamount@'''<br />
<br />
Example: @contact.firstname@ or @contact.email@<br />
<br />
'''@assigned.field@'''<br />
<br />
Example: @assigned.firstname@ or @assigned.email@<br />
<br />
'''@contact.company.field@''' (same as assigned)<br />
<br />
Example: @contact.company.address@ or @contact.company.city@<br />
<br />
<u>'''Custom Field Variables'''</u><br />
<br />
'''@customfield name@ - by name'''<br />
<br />
'''or'''<br />
<br />
'''@#customfield id#@ - by id'''<br />
<br />
Example: @more information@ or @#17342#@<br />
<br />
<br />
See Also: [[Invoice Module Variables]] for Variables specific to the Invoicing module.<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 2'''</u><br />
<br />
If your '''Web Page View''' is at Level 2, you can call Level 1 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
Example: '''@parent.status@''' or '''@parent.startdate'''@ or '''@parent.#12345#@'''<br />
<br />
<br />
==UTA Level 2 variables called from UTA Level 3==<br />
When working at Level 3, you can call Level 2 variables using:<br />
<br />
'''@parent.'''''fieldname'''''@''' or '''@parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''UTA Level 1 variables called from UTA Level 3'''</u><br />
<br />
If your '''Web Page View''' is at Level 3, you can call Level 1 variables using:<br />
<br />
'''@parent.parent.'''''fieldname'''''@''' or '''@parent.parent.#'''''fieldid'''''#@''' (Note: All field names should be entirely lower case.)<br />
<br />
<br />
<u>'''Level 3 Associated Parent (Opportunity) '''</u><br />
<br />
Where Payment Allocation is enabled you have two models to choose from before configuring: usually the Associated Parent is a Funding Stream of Overall Budget (event) and the associated object is the Disbursement (Level 3). In less granular cases the Associated Parent is the opportunity.<br />
<br />
<u>'''Level 3 Associated Parent'''</u><br />
<br />
<br />
If Payment Allocation is enabled, you can pull fields from the Associated Parent using the following variable:<br />
<br />
'''@linkparent.''fieldname''@'''<br />
<br />
If your associated payment is linked to the event you can pull fields from the opporunity using the following variable:<br />
<br />
'''@linkparent.''parent''.fieldname@''' So '''@linkparent.''parent''.branch@''' will return: '''SmartSimple Inc.'''<br />
<br />
On the company/branch:<br />
<br />
'''@linkparent.parent.branch.''Transit''@''' will return: '''''1950'''''<br />
<br />
=Field List=<br />
<u>'''People Fields'''</u><br />
<br />
firstname, lastname, fullname, title, email, phone, company, address, address2, city,<br />
province, state, country, postalcode, owner, modifieddate, cost, costunit, type,<br />
resourcename, isrecource, uprefix (prefix), usuffix (suffix), uphoneext (Phone Extension)<br />
<br />
<u>'''Company Fields'''</u><br />
<br />
name, address, address2, city, province, state, country, postalcode, phone, fax, website<br />
<br />
<u>'''Lead Fields'''</u><br />
<br />
status, description, name, phone, fax, address, address2, city, state, province, country,<br />
postalcode, website, firstname, lastname, contactphone, title, email, dat_added<br />
<br />
=UTA Contact and Account Variables=<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname'''''@</span><br />
Assigned (Level 2 only):<br />
<br />
: <span style="font-size: medium;">'''@assigned.''fieldname''@'''</span><br />
Company (Level 1 only):<br />
<br />
: <span style="font-size: medium;">'''@client.''fieldname''@'''</span><br />
Use @client.categoryids@ to return a list of [[Determining the categoryid|category IDs]] - comma delimited - note the leading comma - e.g. ",1234,555,666,"<br />
<br />
Use @client.categories@ to return a list of category names - comma delimited e.g. "Agency,Marketing,Good client"<br />
<br />
==Level 1 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact/account in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename.fieldname''@''' </span> &nbsp; or &nbsp; <span style="font-size: medium;"> '''@company.''rolename.fieldname''@'''</span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact/account on the Level One item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contact.adjuster.firstname@ or @company.funding agency.address@<br />
<br />
Note: if there is more than one contact/account assigned with the rolename specified, only one will be displayed.<br />
<br />
===List===<br />
To display a list of multiple contacts/accounts in the Level 1 contacts/accounts section:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~''fieldname''~ #]''' </span> or <span style="font-size: medium;"> '''[#(?object=company) ~''fieldname''~ #]''' </span><br />
See [[#To display a list of Activities (Level 2 or 3), Notes, Contacts or Companies|below]] for details on how to filter and sort the list(s).<br />
<br />
* '''Note''': to display the role that the contact or account is assigned on the Level 1 record use: <span style="font-size: medium;">'''~role~'''</span><br />
* '''Note''': to display the name of the contact's company use: <span style="font-size: medium;">'''~companyname~'''</span><br />
<br />
==Level 2 Contacts/Accounts==<br />
===Individual===<br />
To display information for a <u>single</u> contact in the Level 2 contacts section:<br />
<br />
: <span style="font-size: medium;">'''@contacts.''rolename.fieldname''@''' </span><br />
'''where:'''<br />
<br />
* ''rolename'' = the name of the role that has been assigned to the contact on the Level Two item<br />
* ''fieldname'' = the name of the field that is located on the contact's record.<br />
Example:<br />
<br />
@contacts.adjuster.firstname@<br />
<br />
Note: if there is more than one contact assigned with the rolename specified, only one will be displayed.<br />
<br />
===Contacts===<br />
To display a list of the contacts assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To display only contacts assigned at Level 2 with a specific role/roles (only relevant if the Level 2 Multiple Contact List is enabled)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact::criteria=roleid=12345) ~firstname~ ~lastname~ ~email~ #]'''</span><br />
To get the intersection record identifier (equivalent to ~oprid~ at Level 1) (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~lnkid~ #]'''</span><br />
To display the contact's profile status:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=contact) ~firstname~ ~lastname~ ~ustatusid~ #]'''</span><br />
'''Notes:'''<br />
<br />
* Contacts at level 2 cannot be filtered by rolename, only roleid<br />
* If the multiple contact list is enabled use '''~role~''' to display the assigned role.<br />
<br />
===Accounts===<br />
To display information for a <u>single</u> account in the Level 2 accounts section:<br />
<br />
: <span style="font-size: medium;">'''@companies.''rolename.fieldname''@'''</span><br />
To display a list of the companies assigned at Level 2:<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company::orderby=name)~name~ #]'''</span><br />
To get the intersection record identifier (i.e. for use in [[Pandora]] functions)<br />
<br />
: <span style="font-size: medium;">'''[#(?object=company) ~clnkid~ #]'''</span><br />
'''Notes:'''<br />
<br />
:* The Account standard field is only available at Level 2 when the Multiple Account list is enabled. See [[Relating Contacts and Accounts to the Universal Tracking Application#The Account List Field|here]] for details.<br />
<br />
==To display Level 1 Company Role or Contact Role custom fields==<br />
<span style="font-size: medium;">'''[#(?object=company;)$?opc_''customfieldid''$#]'''</span> or <span style="font-size: medium;">'''[#(?object=contact;)$?opr_''customfieldid''$#]'''</span><br />
<br />
<br />
'''where:'''<br />
<br />
* customfieldid = the numeric id of the custom field<br />
<br />
'''Note:''' for level 2 records (when the multiple contact/company list(s) are enabled) use $?opr2_''customfieldid''$ and $?opc2_''customfieldid''$<br />
<br />
Following the same format above, you can also reference custom fields on the company role using the @#field id#@ syntax.<br />
<br />
<u>'''Contact Detail'''</u><br />
<br />
~uprefix~ ~firstname~ ~lastname~<br />
<br />
~uaddress~ ~uaddress2~<br />
<br />
~ucity~, ~ustate~ ~upostalcode~<br />
<br />
==To display Company Association or Contact Association fields==<br />
The syntax for extracting information on the entity to which they are associated is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association)~name~ ~standard field name~ $?afc_custom field id$ $?afc_custom field name$#]<br /><br />
<br />'''[#(?object=companyassociation)~standard field name~ $custom field id$ $custom field name$#]'''</span><br />
<br />
'''where:'''<br />
<br />
* standard field name = name of the standard field<br />
* custom field id = the numeric id of the custom field<br />
* custom field name = the name of the custom field<br />
<br />
<br />
The syntax for extracting information on fields that are on the intersection, rather than the entity to which they are associated, is as follows . . .<br />
<br />
<span style="font-size: medium;">'''[#(?object=association) ~afcompanyid~ #]<br /><br />
<br />'''[#(?object=companyassociation)~afroleid~ #]'''</span><br />
<br />
<br />
Other '''intersection''' specific variables options include:<br />
<br />
* ~afcid~: association (intersection) record id.<br />
* ~afcompanyid~: [[companyid]] of associated company<br />
* ~afcontactid~: [[userid]] of associated contact<br />
* ~afroleid~: [[roleid]] of association<br />
* ~afstartdate~: start date of association<br />
* ~afenddate~: end date of association<br />
<br />
==Role Based Custom Fields==<br />
When you have a [[Custom Field]] such as a [[Web Page View]] or [[MS Word Merge]] that is located <u>'''on'''</u> a User Role or Company Role you can access:<br />
<br />
[[UTA]] Level 1 Information:<br />
<br />
: <span style="font-size: medium;">'''@levelone.''fieldname''@'''</span> or <span style="font-size: medium;">'''@levelone.''customfieldid''@'''</span><br />
Contact Information:<br />
<br />
: <span style="font-size: medium;">'''@contact.''fieldname''@'''</span> or <span style="font-size: medium;">'''@contact.''customfieldid''@'''</span><br />
Company Information:<br />
<br />
: <span style="font-size: medium;">'''@company.''fieldname''@'''</span> or <span style="font-size: medium;">'''@company.''customfieldid''@'''</span><br />
When you want to refer to a User Role based [[Custom Field]] '''<u>from</u>''' a [[UTA]] Level 1 record use the following syntax:<br />
Owner:<br />
<br />
: <span style="font-size: medium;">'''@owner.''fieldname''@'''</span><br />
Person:<br />
<br />
: <span style="font-size: medium;">'''@person.''fieldname''@'''</span><br />
Contact:<br />
<br />
: <span style="font-size: medium;">'''@contact.''rolename''.''fieldname''@'''</span><br />
: ''where rolename is the role they are assigned on the Level 1 record''<br />
=To Display a List of Activities, Notes, Transactions, Contacts, Companies, Consumers, Providers=<br />
==Syntax==<br />
: <span style="font-size: medium;">'''[#(?object=''objectname''::{options})~''standardfieldname''~ $''customfieldname''$#]'''</span><br />
'''Where:'''<br />
<br />
:* ''objectname'' is the name of the item to be listed.<br />
:: Either: '''address, activity, assign, contact, user, group, company, notes, association, companyassociation, transaction, timesheet''', '''level-1''', '''utaproviderL1''', '''utaproviderL2''', '''utaconsumerL1''', '''utaconsumerL2''' or '''linkactivity'''<br />
: <br />
:* ''standardfieldname'' is the name of a standard field (between tildes, ~)<br />
:* ''customfieldname'' is the name of a custom field (between dollar signs, $)<br />
<br />
'''Notes:'''<br />
<br />
:* You can refer to [[Custom Fields]] in the list using the Custom Field ID instead of the field name, still between dollar signs ('''$12345$''')<br />
:* '''level-1''' can only be used as an object when referenced from a contact record. Also '''level-1''' will only list the level 1s that the contact has been added to in the contacts section.<br />
:* You can include text as well as variables within the [#...#] syntax.<br />
:* When using this syntax for [[Web Page View]]s, [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] etc. you will usually want to include HTML table formatting within the '''[#...#]''' syntax (see examples below). For [[MS Word Merge]] custom fields the table defined on the MS Word Template document, with the columns delimited by pipes (|) within the '''[#...#]'''.<br />
:* '''~Index~''' can be used to number the lines (1, 2, 3...) '''Note:''' ~index~ does not work for all lists. For example, it cannot be used when listing contacts associated with a Level 1.<br />
:** ''~Index~'' (upper case 'I') starts numbering at 1, ''~index~'' (lower case 'i') starts numbering at 0.<br />
~eventid~ will display the id of the level 2.<br />
<br />
<br />
'''Options:'''<br />
<br />
{| class="wikitable"<br />
|-<br />
||'''Option'''<br />
||'''Effect'''<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname''</span><br />
||Sorts the list in ascending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=''standardfieldname'' desc</span><br />
||Sorts the list in descending order by the standard field specified<br />
|-<br />
||<span style="font-size: medium;">orderby=tbl_''customfieldid''.valuestr</span><br />
||Sorts the list in ascending order by the custom field specified<br />
|-<br />
||<span style="font-size: medium;">criteria=''standardfieldname''='''value'''</span><br />
||Filters the list by the standard field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=tbl_''customfieldid''.valuestr='''value'''</span><br />
||Filter the list by the custom field and value specified<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' or ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''either''' conditional criteria can apply<br />
|-<br />
||<span style="font-size: medium;">criteria=(''standardfieldname''='''value''' AND ''standardfieldname''='''value''')</span><br />
||For multiple criteria when '''both''' conditional criteria must apply<br />
|-<br />
||<span style="font-size: medium;">groupfunction=''aggregatefunction''</span><br />
||Performs specified aggregate function on the listed fields<br />Ex. sum, count, countdistinct<br />
|}<br />
<br />
* ''multiple options (i.e. a criteria and an orderby option) can be included, separated by doubled colons (::)''<br />
<br />
'''Important:''' Any custom fields that you use as criteria or orderby '''must''' appear in the display. If you do not wish to display the field you can place it in a comment. (i.e.: &lt;!--$12343$-->) However, if referencing a field as a property of a table you must show the value.<br />
<br />
'''Examples:'''<br />
<br />
* To generate a list of Level 2 activities for a [[MS Word Merge]]:<br />
<br />
[#(?object=activity)|~statusname~|~typename~|$speciality$|$123456$|#]<br />
:: ''See [[MS Word Merge]] for further details on including tables on MS Word Merge documents''<br />
: <br />
:* To reference the Consumer UTA Level 1 owner name and ownerid from a Provider UTA Level 1 Read Only - System Variable custom field<br />
<br />
[#(?object=utaconsumer::criteria=statusname IN ('Placed','Resigned/Terminated'))~ownername~,~ownerid~ #]<br />
<br />
:* To Display custom fields via List Syntax for Invoicing (objectname=appliedtoinvoices). Grabbing a custom field value off the invoice (ie. 282588) and into an adjustment.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">Example: [#(?object=appliedtoinvoices)$282588$#]</pre><br />
::: ''Note: refer to the custom field by the number ONLY, do not use the custom field name.''<br />
<br />
<br />
:* To generate a list of all contacts for a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only – System Variables]] custom field (note that the HTML table formatting is included within the '''[#...#]''' syntax)<br />
<br />
[#(?object=contact)#]<br />
<br />
{|<br />
|-<br />
||First Name<br />
||Last Name<br />
||E-mail Address<br />
||Cell Phone Number<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
||$Cell Phone$<br />
|}<br />
::: ''Note: The first line creates a header row for the table''<br />
<br />
<br />
:* For a list of Level 2 (or Level 3) activities sorted by Start Date in descending order:<br />
<br />
[#(?object=activity::orderby=startdate desc)#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* For a list of contacts assigned to a Level 1 with the role of "Internal People", sorted by surname:<br />
<br />
[#(?object=contact::orderby=lastname::criteria=rolename='Internal People')#]<br />
<br />
{|<br />
|-<br />
||~firstname~<br />
||~lastname~<br />
||~email~<br />
|}<br />
<br />
:* For a list of level 1 records, including owner details, that a Company has been asssigned to:<br />
<br />
[#(?(object =level-1) NAME: ~name~ OWNERID: ~ownerid~ OWNERNAME: ~ownername~ #]<br />
<br />
<br />
<br />
:* For a list of all companies that the owner of a [[UTA]] record is associated with:<br />
<br />
@owner.[#(?object=association)~name~ (Phone ~phone~)<br />
#]@<br />
<br />
<br />
:* To get a comma-separated list of the companyids of all the companies the current user is associated with with roleid 54545:<br />
<br />
,@me.[#(?object=association::criteria=roleid=54545)~afcompanyid~,#]@<br />
<br />
<br />
:* For a list of all contacts associated to the current user's parent company record (associated to the company with [[roleid]] 12345):<br />
<br />
@me.parent.[#(?object=association::criteria=roleid='12345')~firstname~ ~lastname~ (Phone ~phone~)<br />
#]@<br />
<br />
:* For a list of a company's Active(current date is between start and end date) associations:<br />
<br />
[#(?object=association::criteria=(afstartdate is null OR afstartdate<='@date(currentdate)@') AND (afenddate is null OR afenddate>='@date(currentdate)@'))~userid~,#]<br />
<br />
:* For a list of all contacts/users located under a company with a given role<br />
<br />
[#(?object=user::criteria=rolelist like '%,12345,%') ~email~ #]<br />
<br />
<br />
:* To count the number of contacts assigned with the role of Reviewer:<br />
<br />
[#(?object=contact::criteria=rolename="Reviewer"::groupfunction=count)~userid~#]<br />
<br />
<br />
:* To include and format a date stored in a custom field (see also [[sscalculation]])<br />
<br />
[#(?object=activity)<!--@sscalculation(date_format("$fieldname$","%M %d, %Y"))-->#]<br />
<br />
<br />
:* With Multiple Criteria:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=contact::criteria=(rolename='External' or rolename='Internal'))~firstname~ ~lastname~#]<br />
</pre><br />
<br />
<br />
:* To sort descending by a custom field called ''Total Hours'' with a custom field id of ''67292'':<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=tbl_67292.valuestr desc)Subject: ~subject~Total Hours: $Total Hours$Start Date: ~startdate~#]<br />
</pre><br />
'''Note:''' ''$Total Hours$'' in the list could be listed as ''$67292$'' with the same result.<br />
<br />
<br />
<br />
:* To sort descending reviews in a specific status by a custom field on a separate UTA Level 1 field called ''$Staff Final Score$'' with a custom field id of ''1584168'' in numeric order:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaconsumerL1::orderby=tbl_15868.valuestr*1::criteria=(statusname='Member Review'))<br />
</pre><br />
'''Note:''' ''$Staff Final Score$'' in the list could be listed as ''$15868$'' with the same result.<br />
<br />
<br />
<br />
:* To list a specific activity type only:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate::criteria=typename='This Activity Type')~subject~~location~~startdate~#]<br />
</pre><br />
<br />
<br />
:* To list activities based on the [[Determining the typeid|type ID]] ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=typeid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To include a hyperlink to the object (for Accounts):<br />
<br />
[#(?object=company::criteria=rolename="Cooperating Organization")#]<br />
<br />
{|<br />
|-<br />
||[s_viewcompany.jsp?companyid=~companyid~ ~name~]<br />
||~role~<br />
|}<br />
<br />
<br />
:* To list activities based on status:<br />
<br />
[#(?object=activity::orderby=startdate::criteria=statusname='Open')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list activities based on the status ID ('''Level 2 and Level 3 only'''):<br />
<br />
[#(?object=activity::orderby=startdate::criteria=status.statusid='24160')#]<br />
<br />
{|<br />
|-<br />
||~subject~<br />
||~location~<br />
||~startdate~<br />
|}<br />
<br />
<br />
:* To list UTA Providers:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=rolename="Panel") ~name~ ~typename~ ~statusname~ ~enddate~ $Panel Review Date$ $Panel ID</pre><br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">lt;br>#]</pre><br />
<br />
<br />
:* To list notes (from the record that contains the notes):<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=notes::orderby=createddate desc)~notes~~createddate~~username~#]<br />
</pre><br />
::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
:: <br />
::* To list all companies under a parent company record:<br />
<br />
[#(?object=company) ~name~ #]<br />
<br />
::* To list all L3 allocations within a L2 budget record:<br />
<br />
[#(?object=linkactivity) ~subject~ #]<br />
<br />
<br />
::* To sum or count all the L3 allocations from the budget L2 record:<br />
<br />
@linkactivity.sum(...)@ or @linkactivity.count(...)@<br />
<br />
'''To list level 2 notes for each level 2 record at level 1:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=activity::orderby=startdate desc)~subject~~description~~startdate~<br />
[@(?object=notes::orderby=createddate desc)@]</pre><br />
{|<br />
|-<br />
||~notes~<br />
||~createddate~<br />
||~username~<br />
|}<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">#]<br />
</pre><br />
:::: ''Note: This syntax is for "Public (Default)" notes only, not custom note types.<br />
'''To do a sum of all the unpaid payment transaction:<br />
<br />
{|<br />
|-<br />
||Total Paid: [#(?object=transaction::criteria=trstranstype=11 and tbl_1145339.valuestr='Paid'::groupfunction=sum)$1145183$ <!--"145339$-->#] Note: $1145339$ - Status of payment $1145183$ - Payment Amount<br />
|}<br />
<br />
==Referencing Standard Fields of UTA Providers==<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 1 Field Name and Variable List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Application Name<br />
||~name~<br />
|-<br />
||Type Name<br />
||~typename~<br />
|-<br />
||Type ID<br />
||~type~<br />
|-<br />
||Status Name<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Close Date<br />
||~closedate~<br />
|-<br />
||Branch<br />
||''No variables''<br />
|-<br />
||Branch ID<br />
||~branchid~<br />
|-<br />
||Currency<br />
||''No variables''<br />
|-<br />
||Exchange Currency<br />
||''No variables''<br />
|-<br />
||Currency Exchange Rate<br />
||''No variables''<br />
|-<br />
||Customer<br />
||~client~<br />
|-<br />
||Customer ID<br />
||~companyid~<br />
|-<br />
||Modified By<br />
||''No variables''<br />
|-<br />
||Modified Date<br />
||''No variables''<br />
|-<br />
||Owner (full name)<br />
||~ownername~<br />
|-<br />
||Owner (userid)<br />
||~updatedby~<br />
|-<br />
||Person (full name)<br />
||''No variables''<br />
|-<br />
||Person (userid)<br />
||~oppeopleid~<br />
|-<br />
||Role Name<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~conroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1) ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
{| class="wikitable"<br />
|+style="text-align:left"|Level 2 Field Names and Variables List<br />
|-<br />
!|Field Name<br />
!|Variable<br />
|-<br />
||Activity Type<br />
||~typename~<br />
|-<br />
||Activity Type ID<br />
||~typeid~<br />
|-<br />
||Owner<br />
||~ownername~<br />
|-<br />
||Owner ID<br />
||~eownerid~<br />
|-<br />
||Assigned People<br />
||''No variables''<br />
|-<br />
||Status<br />
||~statusname~<br />
|-<br />
||Status ID<br />
||~statusid~<br />
|-<br />
||Subject<br />
||~subject~<br />
|-<br />
||Description<br />
||~description~<br />
|-<br />
||Location<br />
||~location~<br />
|-<br />
||Amount<br />
||~eamount~<br />
|-<br />
||Start Date<br />
||~startdate~<br />
|-<br />
||End Date<br />
||~enddate~<br />
|-<br />
||Opportunity ID<br />
||~cevconoppid~<br />
|-<br />
||Event ID<br />
||~cevprovevtid~<br />
|-<br />
||Rolename<br />
||~rolename~<br />
|-<br />
||Role ID<br />
||~cevroleid~<br />
|}<br />
<br />
'''Example:'''<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL2) ~typename~ | ~statusname~ <br />#]</pre><br />
If you have multiple different UTAs connected as providers, you can use criteria to filter:<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;">[#(?object=utaproviderL1::criteria=provappid="12345") ~typename~ | ~statusname~ <br />#]</pre><br />
<br />
==To Format the Start Date or Start Time==<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%Y-%m-%d') as startdate~'''</span><br />
:::: or<br />
::: <span style="font-size: medium;">'''~date_format(startdate,'%h:%i %p') as starttime~'''</span><br />
'''Note:'''<br />
<br />
:::* If you wish to use ''"orderby=startdate"'', along with a date format other than yyyy-mm-dd you must use a slightly different syntax.<br />
:::* Using ''"~date_format(startdate,'%d-%m-%Y') as startdate~"'' when using ''"orderby=startdate"'' will cause the date to be ordered by dd-mm-yyyy (rather than yyyy-mm-dd, which is chronological)<br />
:::* To avoid this, change ''"date_format(startdate,'%d-%m-%Y') as '''startdate'''"'' to ''"date_format(startdate,'%d-%m-%Y') as '''sdate'''"''<br />
<br />
==Displaying Both Level 2 and Level 3 Activities at Level 1==<br />
When displaying a list of '''Level 2''' activities using the '''[#(?object=activity;)...#]''' syntax, the corresponding '''Level 3''' activities can be displayed under each of the parent '''Level 2''' activities.<br />
<br />
<br />
To facilitate this you must create a [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] field '''at''' Level 2 that contains the list of Level 3 activities, formatted and filtered as desired.<br />
<br />
:::: ''You can use [[Visibility Condition]]s, [[Role Field Permissions]] or [[Status Field Permissions]] to prevent the field from being displayed on the Level 2 record.<br />
'''Example:'''<br />
<br />
::* Create a Level 2 [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] Custom Field called '''Level 3 Activity List''' with the following:<br />
<br />
[@(?object=activity::orderby=typename)@]<br />
<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
<br />
Then create either a [[Web Page View]] or [[Custom Field Type: Read Only – System Variables|Read Only - System Variable]] at Level 1:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|$Level 3 Activity List$<br />
|}<br />
:::: '''where''' "Level 3 Activity List" is the name you gave the [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] field<br />
<br />
<br />
===Level 3s with Less Than 25 Fields===<br />
If Level 3 has less than 25 fields it is not necessary to create a [[Custom Field Type: Read Only – System Variables|Read Only – System Variable]] Custom Field on the Level 2 that lists the Level 3 activities.<br />
<br />
Instead you can use the following syntax '''within''' the '''[#...#]''' that lists the Level 2 activities:<br />
<br />
::: <span style="font-size: medium;">'''[@(?object=activity)~standardfieldname~ $customfieldname$@]'''</span><br />
'''Note:'''<br />
<br />
::* This syntax will only work if there are '''less than 25 fields at Level 3.'''<br />
<br />
'''Example:'''<br />
<br />
::* To display a list of Level 2 activities, including any Level 3 activities under their parent Level 2 activity:<br />
<br />
[#(?object=activity::orderby=startdate) #]<br />
<br />
{|<br />
|-<br />
||Level 2 Activity: ~subject~<br />
||~statusname~<br />
||~startdate~<br />
||~enddate~<br />
|-<br />
||<br />
| colspan="3"|[@(?object=activity;orderby=typename)@]<br />
{|<br />
|-<br />
||Level 3 Activity: ~typename~<br />
||~location~<br />
|}<br />
|}<br />
<br />
==Displaying a Specific Number of Items in a List==<br />
When you want to display only specific number of activities or transactions in a [[Web Page View]] use the following syntax.<br />
<br />
<pre style="white-space: -o-pre-wrap; word-wrap: break-word;"> [#(?object=object::orderby=field) <br />
<!--@sslogic(~index~='num')--> <br />
~standard field~ $custom field$ <br /> <br />
<!--@end--> <br />
#] <br /> <br />
</pre><br />
'''where:'''<br />
<br />
::* num = number of activities that should be displayed<br />
<br />
=XML Variables=<br />
==Count how many options were selected==<br />
<pre><br />
<!--@sscalculation(@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A") 1+#]@ 0)--></pre><br />
<br />
<br />
==Filtered XML display output==<br />
<pre>@xml.XML Field.People.Person[#(?criteria="~type.nodevalue~" == "A")~FirstName.nodevalue~ ~LastName.nodevalue~<br />#]@</pre><br />
<br />
<br />
=Date/Time Variables=<br />
==Standard Fields Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
'''Start Date''''''End Date''''''Close Date'''<br />''Level 1 only'''''Modified Date''''''Display Format'''@startdate@@enddate@@closedate@@modifieddate@Date formatted according to user preferences (At Level 1 Modified Date also includes the time: 15:40)@longstartdate@@longenddate@@longclosedate@@longmodifieddate@Friday, January 23, 2009@fullstartdate@@fullenddate@@fullclosedate@@fullmodifieddate@2009-01-23 15:40:00@datetime(fullstartdate)@@datetime(fullenddate)@@datetime(fullclosedate)@@datetime(fullmodifieddate)@2009-01-23 15:40:00@date(fullstartdate)@@date(fullenddate)@@date(fullclosedate)@@date(fullmodifieddate)@2009-01-23<br />
<br />
<br />
<br />
::* '''Note''': ''Start Time'' and ''End Time'' are stored within the ''fullstartdate'' and ''fullenddate'' fields respectively. They can be accessed and formatted using the variables elements listed below.<br />
<br />
'''To display specific elements of the Start Date, Start Time, End Date, End Time, Close Date, Modified Date''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(fullstartdate)@month number in ''Start Date''@monthname(fullstartdate)@name of month in ''Start Date''@day(fullstartdate)@day in ''Start Date''@dayweek(fullstartdate)@name of day in ''Start Date''@year(fullstartdate)@year in ''Start Date''@hour(fullstartdate)@hour in ''Start Time'' using 12 hour clock (0-12)@ampm(fullstartdate)@AM or PM reference for ''Start Time''@hour24(fullstartdate)@hour in ''Start Time'' using 24 hour clock (0-24)@minute(fullstartdate)@minute in ''Start Time''<br />
<br />
::: '''Note:''' For '''End Date''', '''Close Date''' or '''Modified Date''' replace '''fullstartdate''' with '''fullenddate''', '''fullclosedate''' or '''fullmodifieddate''' respectively.'''<br />
::: ''(seconds are not available for standard date/time fields)''<br />
::: ''('''Close Date''' does not have a time associated with it)<br />
'''Examples:'''<br />
<br />
::* To display the Start Date in the format '''February 22, 1985''' you would use:<br />
<br />
@monthname(fullstartdate)@ @day(fullstartdate)@, @year(fullstartdate)@<br />
<br />
::* To display the End Time in the format '''06:45PM''' you would use:<br />
<br />
@hour(fullenddate)@:@minute(fullenddate)@@ampm(fullenddate)@<br />
<br />
==Current Date/Time==<br />
'''Variable List:'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplayComment@datetime(currentdate)@current date and time as for yyyy-mm-dd HH:mm:ss2013-01-22 17:55:22See also [[Obtain Server Date and Time]]@date(currentdate)@current date as for yyyy-mm-dd2013-05-17&nbsp;@currentdate@current date2009 January 25&nbsp;@now@current date and time2009 August 25 11:05AMWorkflows only. Not available within [[UTA]]s<br />
<br />
<br />
'''To display specific elements of the current date or time''':<br />
<br />
::: {| border="1" cellpadding="5"<br />
@month(currentdate)@current month number@monthname(currentdate)@name of current month@day(currentdate)@current day@dayweek(currentdate)@name of current day@year(currentdate)@current year@hour(currentdate)@current hour using 12 hour clock (0-12)@ampm(currentdate)@AM or PM reference for current time@hour24(currentdate)@current hour using 24 hour clock (0-24)@minute(currentdate)@current minute<br />
<br />
::: (seconds are not available for the current time)<br />
'''Examples:'''<br />
<br />
::* To display the current date/time in the format '''Friday at 19:55''' you would use:<br />
<br />
@dayweek(currentdate)@ at @hour24(currentdate)@:@minute(currentdate)@<br />
<br />
==Custom Fields Date/Time==<br />
'''For a custom field on the same level as the Web Page View Field, you can parse out a particular date/time in a date field'''<br />
<br />
::: {| border="1" cellpadding="5"<br />
VariableContentDisplay@date(''fieldname'')@custom field date as for yyyy-mm-dd2013-05-17<br />
<br />
<br />
@month(''fieldname'')@month number in ''fieldname''05@monthname(''fieldname'')@name of month in ''fieldname''May@day(''fieldname'')@day in ''fieldname''17@dayweek(''fieldname'')@name of day in ''fieldname''Friday@year(''fieldname'')@year in ''fieldname''2013@hour(''fieldname'')@hour in ''fieldname'' using 12 hour clock (0-12)12@ampm(''fieldname'')@AM or PM reference for time in ''fieldname''AM@hour24(''fieldname'')@hour in ''fieldname'' using 24 hour clock (0-24)00@minute(''fieldname'')@minute in ''fieldname''00@second(''fieldname'')@second in ''fieldname''00<br />
<br />
<br />
'''Examples:'''<br />
<br />
::* To display the custom field '''Date Of Birth''' in the format '''31-01-2001''' you would use:<br />
<br />
@day(date of birth)@-@month(date of birth)@-@year(date of birth)@<br />
<br />
'''Note:'''<br />
This syntax will not work for custom fields on a different level. You will not be able to reference, for example, @day(parent.''fieldname'')@. To parse out date/time information from a custom field on a different level, use the [[Sscalculation#Using_sscalculation_to_Change_Date_Formats_of_Data_in_Custom_Fields|sscalculation]] syntax.<br />
<br />
=Miscellaneous Variables=<br />
==Adding an image from Upload fields==<br />
Users can return image thumbnails or meta data from multiple file fields using the list syntax below":<br />
<br />
::* Show thumbnail image using thunbnailpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~thumbnailpath~" alt="" width="240" /> #]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using filepath option:<br />
<br />
<pre>@multi file name.template[# <img src="~filepath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show thumbnail image and file name using compressedpath option:<br />
<br />
<pre>@multi file name.template[# <img src="~compressedpath~/thumbnail/?maxwidth=240" alt="" width="240" />~filename~#]@<br />
</pre><br />
<br />
::* Show file name, size and upload date:<br />
<br />
<pre>@multi file name.template[# ~filename~, ~filesize~, ~uploaddate~#]@<br />
</pre><br />
<br />
<br />
==Adding a File Upload button==<br />
To display a button to upload to a [[Single File]] or [[Multiple Files]] custom field:<br />
<br />
::* Single File:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label" /></span><br />
:: <br />
::* Multiple Files:<br />
::: <span style="font-size: medium;"><input class="Button" type="button" value="Button Label." /></span><br />
'''where:'''<br />
<br />
::* ''customfieldid'' = the field id of the Single or Multiple file custom field (without '''cf_''')<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Multiple files..." /><br />
<br />
'''Note:''' if adding to a [[Web Page View]] you will need to add the following to the page:<br />
<br />
<pre>function include_dom(script_filename) {<br />
var html_doc = document.getElementsByTagName('head').item(0);<br />
var js = document.createElement('script');<br />
js.setAttribute('language', 'javascript');<br />
js.setAttribute('type', 'text/javascript');<br />
js.setAttribute('src', script_filename);<br />
html_doc.appendChild(js);<br />
return false;<br />
}<br />
function includejsfiles() {<br />
include_dom("/validate.js");<br />
}<br />
</pre><br />
You will also have to call the ''includejsfiles'' function in the body onload:<br />
<br />
<br />
<br />
<br />
<br />
'''Alternatively:'''<br />
<br />
You may also use @fieldname.uploadlink@ to get the url for the upload page and construct your own function to open the window.<br />
<br />
'''Example:'''<br />
<br />
<input class="Button" type="button" value="Upload" /><br />
<pre>function openupload(url)<br />
{ <br />
upload_window = window.open(url,'upload_window', 'menubar=yes,scrollbars=yes,width=800,height=600,status=no,resizable=yes,dependent=yes,alwaysRaised=yes');<br />
upload_window.opener = window;<br />
upload_window.focus();<br />
}<br />
</pre><br />
<br />
'''Note:''' this method will only open the single file upload page.<br />
<br />
==Displaying a Dynamic Data Grid field==<br />
To show a [[Custom Field Type: Dynamic Data – Data Grid|Dynamic Data – Data Grid]] field in a webpage view field use the following syntax:<br />
<br />
::: <span style="font-size: medium;">'''@fieldname.table'''@</span><br />
==Retrieving History for Fields with Track Changes Enabled==<br />
The following syntax is used to retrieve standard or custom field history:<br />
<br />
For the [[Status]] standard field:<br />
<br />
::: <span style="font-size: medium;">'''@HistoryOf(status)@'''</span><br />
::: <span style="font-size: medium;">'''@HistoryOf(statuscaption)@'''</span><br />
For a [[Custom Field]]:<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldid'')@'''</span><br />
OR<br />
::: <span style="font-size: medium;">'''@HistoryOf(''customfieldname'')@'''</span><br />
'''Notes:'''<br />
:::* ''HistoryOf'' is case sensitive.<br />
:::* See the [[HistoryOf function]] page for a complete description of this variable and its uses.<br />
<br />
<!--:::* You can only obtain the history of the Status field and [[Custom Fields]] in this way.--><br />
<br />
==For Hybrid Sign-Up Pages==<br />
::: The @user_input_form@ will display the associated user sign up form on a company sign up page if included in the HTML template of the company sign up page.<br />
<br />
<br />
==Currency Format==<br />
::: You can use the following syntax to format a custom field with currency: @format(L2 Subcontract total y1,currency,USD,2)@. The last parameter can be changed from 2 to 0 to display as a whole number.<br />
=Controls=<br />
==Hide a variable if it is missing==<br />
Put the following in front of variable name.<br />
<br />
::: <span style="font-size: medium;">'''&lt;!--hideifnotfound-->'''</span><br />
'''Example''':<br />
<br />
<pre> <!--hideifnotfound-->@parent.contact.adjuster.email@<br />
</pre><br />
<br />
'''Note:''' the &lt;!--hideifnotfound--> and the variable must be in immediate succession, and not separated by a space.<br />
<br />
==How to display different content based on a value using SSlogic==<br />
To display content based on a value from a variable add '''&lt;!--@sslogic('@branch.name@'='Internal Staff')--&gt;''' in front of the content and '''&lt;!--@end--&gt;''' at the end of the content. If there are 2 different pieces of content to be displayed based on a value and all others add '''&lt;!--@else--&gt;''' between the 2 pieces of content.<br />
<br />
<pre><br />
<!--@sslogic(CONDITION)--><br />
The content to be displayed when condition is true.<br />
This can be more than one line.<br />
<!--@end--><br />
</pre><br />
<br />
::* The content to be displayed (the middle line) can either be in plaintext or in HTML.<br />
::* Be sure there are single quotes around the variable and value.<br />
::* SSlogic does not support nested logic statements.<br />
<br />
'''Example:'''<br />
<br />
::* The following will display a Christmas tree image if the month is December:<br />
<br />
<pre><br />
<!--@sslogic(month(now())=12)--><br />
<img src="images/xmasstree.jpg" alt="" /><br />
<!--@end--><br />
</pre><br />
<br />
'''See [[SSlogic]] for more information and further examples.'''<br />
<br />
==How to display check boxes in the Web Page View==<br />
To display Select Many - Check Box type custom fields as check boxes in a web page view add '''@checkbox('fieldname/fieldnumber','option name')@''' to the check box control.<br />
<br />
This syntax works if the check boxes are on the same level.<br />
<br />
'''Example:'''<br />
<br />
<pre><input type="checkbox" /><br />
</pre><br />
<br />
::: See Also: [[Updateable Web Page View Fields]] if you wish the Web Page View check boxes to have the ability to change the underlying data.<br />
==How to display level two check boxes on level one in the Web Page View==<br />
@checkboxvalue(id<br />
<br />
values to be checked)@<br />
<br />
<input name="checkboxb20" type="checkbox" value="Limited community support" /><br />
<br />
<br />
::* Use two "'''|'''" (pipes) to separate '''id''' and '''value''' to be checked<br />
<br />
where 1199639 is customfield id<br />
if it is used on the same level '''@1199639@'''<br />
if it is used on the child level '''$1199639$'''<br />
<br />
This works for level one check boxes on level one web page view<br />
AND<br />
works for level two check boxes on level one web page view<br />
AND<br />
works for level three check boxes on level one web page view<br />
<br />
<br />
<br />
<br />
<br />
==How to suppress the Page Footer with Printing the Page==<br />
To suppress the footer when printing the page you need to change your browser settings.<br />
<br />
'''Internet Explorer'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Delete the '''Header''' and '''Footer''' text.<br />
<br />
3. If required, change the margins.<br />
<br />
'''FireFox'''<br />
<br />
1. Choose the '''File Page Setup''' [[Menu|menu]].<br />
<br />
2. Click the '''Margins & Header/Footer''' tab.<br />
<br />
3. Set all '''Header''' and '''Footer''' options to '''Blank'''.<br />
<br />
3. If required, change the margins.<br />
<br />
==How to control print behaviour==<br />
'''To define a page break place the following code in the HTML source before the content you deem as the next page''':<br />
<br />
<br />
'''To change the page orientation to landscape first place the following in the header portion ('''<br />
<br />
''') of the HTML''':<br />
<br />
'''<strong>Then place'''</strong><br />
<br />
<pre> </pre><br />
'''in the HTML source around the "page" content.'''<br />
Example:<br />
<br />
<div class="page">This is the page content that needs to be in landscape</div><br />
Please note that the page orientation control only works with Internet Explorer and is not the greatest quality print due to the page being converted to an image then rotated.<br />
<br />
==How to control print behaviour when saving as a PDF==<br />
To define a page break in a PDF add before the content you deem as the next page.<br />
<br />
To change the orientation of a page to landscape in a PDF add before the content you deem as the next page.<br />
<br />
::* See [[PDF Writer Custom Tags]] for further [[PDF]] formatting options<br />
<br />
=Troubleshooting=<br />
::* '''Issue''': 2 variables run together (thus removing the ending @ and beginning @)<br />
::* '''Resolution''': Place a non-breaking space tag (&amp;nbsp;) between the variables.<br />
<br />
<br />
<br />
::** '''Issue''': For a list of level 2 activities, the code is showing instead of the field headings and values you've designated.<br />
::** '''Resolution''': Insert a comment tag before the first cell tag. i.e.<br />
<br />
<pre> </pre><br />
<br />
index <br />
<br />
==See Also==<br />
::* [[Root Company Variable]]s<br />
::* [[sslogic]]<br />
::* [[ssattach]]<br />
::* [[sscalculation]]<br />
::* [[Web Page View Field]]<br />
::* [[Attach a PDF to a Web Page View]]<br />
::* [[Updateable Web Page View Fields]]<br />
::* [[Changing the Status from a Web Page View]]<br />
::* [[Custom Field Type: Display Only – Web Page View]]<br />
::* [[:Category:PDF|PDF Category]]<br />
::* [[PDF Writer Custom Tags]]<br />
::* [[Adding JavaScript JS files to Web Page View Pages]]<br />
::* [[Custom Field ID|Determining the Custom Field ID]]<br />
::* [[Allow for '$' in webpage view field showing activity]]<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]%20in%20webpage%20view%20field%20showing%20activity" data-mce-href="Allow%20for%20'<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]%20in%20webpage%20view%20field%20showing%20activity" title="Allow%20for%20'<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]%20in%20webpage%20view%20field%20showing%20activity" data-bs-type="internal_link" class="internal bs-internal-link" data-bs-wikitext="Allow%20for%20'<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]%20in%20webpage%20view%20field%20showing%20activity">Allow for '<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]] in webpage view field showing activity<br />
<br />
<br />
[[Category:Custom Fields]][[Category:Variables]][[Category:PDF]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartSimple_Workflows_Guide&diff=33965SmartSimple Workflows Guide2019-03-25T18:50:29Z<p>Ciaran: </p>
<hr />
<div>Download the latest version of the SmartSimple [[Workflow|Workflows]] guide here:<br />
<br />
'''[http://smartsimple.com/files/113/f102251/SmartSimple_Workflow_Guide.pdf SmartSimple Workflows Guide]'''<br />
<br />
[[Category:SmartSimple Documentation]][[Category:Training]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartSimple_Workflows_Guide&diff=33964SmartSimple Workflows Guide2019-03-25T18:48:38Z<p>Ciaran: </p>
<hr />
<div>Download the latest version of the SmartSimple [[Workflow|Workflows]] guide here:<br />
<br />
'''[[http://smartsimple.com/files/113/f102251/SmartSimple_Workflow_Guide.pdf|SmartSimple Workflows Guide]]'''<br />
<br />
[[Category:SmartSimple Documentation]][[Category:Training]]</div>Ciaranhttps://wiki.smartsimple.com/index.php?title=SmartSimple_Workflows_Guide&diff=33963SmartSimple Workflows Guide2019-03-25T18:47:40Z<p>Ciaran: </p>
<hr />
<div>Download the latest version of the SmartSimple [[Workflow|Workflows]] guide here:<br />
<br />
'''[http://smartsimple.com/files/113/f102251/SmartSimple_Workflow_Guide.pdf SmartSimple Workflows Guide]'''<br />
<br />
[[Category:SmartSimple Documentation]][[Category:Training]]</div>Ciaran