namespace OnBaseRocketUnityScriptTrigger
{
using System.Data;
using System.Collections.Generic;
using Hyland.Unity.UnityForm;
using System;
using Hyland.Unity;
using Hyland.Rocket.RPA.ApiHelper;
///
/// OnBaseUnityScriptTrigger
///
public class OnBaseRocketUnityScriptTrigger : Hyland.Unity.IClientWorkflowScript
{
private string defaultProcessIdPropertyBagName = "pProcessorID";
private string defaultProcessId = "1";
private string defaultHeartApiUrl = "";
private string defaultIdentityApiUrl = "";
private string defaultAccessToken = "";
private bool isTaskRedoable = true;
private RpaTaskType type = RpaTaskType.PRO;
private string diversity = "";
INPUTDATA_MODE INPUTMODE = INPUTDATA_MODE.DOCUMENT_ID; //INPUTDATA_MODE.WORKVIEW_ID, INPUTDATA_MODE.UNITYFORM_FIELDS
/******************************************************************/
/******************************************************************/
/****** STOP EDITING HERE UNLESS YOU KNOW WHAT YOU ARE DOING ******/
/******************************************************************/
/******************************************************************/
#region IClientWorkflowScript
private Dictionary mapping =>
new Dictionary()
{
{FieldDataType.Numeric9, typeof(int)},
{FieldDataType.Numeric20, typeof(int)},
{FieldDataType.FloatingPoint, typeof(Double)},
{FieldDataType.Date, typeof(DateTime)},
{FieldDataType.AlphaNumeric, typeof(string)},
{FieldDataType.Currency, typeof(string)},
{FieldDataType.Decimal, typeof(Double)},
{FieldDataType.Boolean, typeof(bool)},
{FieldDataType.DateTime, typeof(DateTime)}
};
public Application _app { get; set; }
///
/// Implementation of .
///
///
///
///
public void OnClientWorkflowScriptExecute(Hyland.Unity.Application app, Hyland.Unity.ClientWorkflowEventArgs args)
{
try
{
var doc = args.Document;
var wv = args.WorkViewObject;
_app = app;
// Get Configuration
string heartApiUrl;
GetConfigValue("Hyland.RPA.HeartApiUrl", defaultHeartApiUrl, out heartApiUrl);
string identityApiUrl;
GetConfigValue("Hyland.RPA.IdentityApiUrl", defaultIdentityApiUrl, out identityApiUrl);
string apiAccessToken;
GetConfigValue("Hyland.RPA.AccessToken", defaultAccessToken, out apiAccessToken);
// Get ProcessorID
// Depending on your Property it can be a string or int
string processId;
try
{
var found = args.PropertyBag.TryGetValue(defaultProcessIdPropertyBagName, out processId);
processId = found ? processId : defaultProcessId;
}
catch (Exception e)
{
app.Diagnostics.Write("Could not get ProcessID");
app.Diagnostics.Write(e);
throw new Exception("Could not get ProcessID", e);
}
// Connect to the API
RpaApi rpaApi = null;
try
{
rpaApi = new RpaApi(heartApiUrl, identityApiUrl, apiAccessToken);
}
catch (Exception e)
{
app.Diagnostics.Write("Could not connect to the API");
app.Diagnostics.Write(e);
throw new Exception("Could not connect to the API", e);
}
// Create InputData DataTable
DataTable dt;
switch (INPUTMODE)
{
case INPUTDATA_MODE.UNITYFORM_FIELDS:
dt = GetUnityFormFieldsAsDataTable(app, doc);
break;
default:
case INPUTDATA_MODE.DOCUMENT_ID:
dt = GetDocumentIdAsDataTable(app, doc);
break;
case INPUTDATA_MODE.WORKVIEW_ID:
dt = GetWorkViewIdAsDataTable(app, wv);
break;
}
var inputData = RpaHelper.SerializeDataTable(dt);
var task = rpaApi.Tasks.Create(Convert.ToInt32(processId), inputData, type, diversity, isTaskRedoable);
app.Diagnostics.Write("Created a new RPA Task with ID: " + task);
}
catch (Exception e)
{
app.Diagnostics.Write(e);
throw e;
}
}
private DataTable GetDocumentIdAsDataTable(Application app, Document doc)
{
var dt = new DataTable("InputData");
dt.Columns.Add("DocumentId", typeof(int));
dt.Rows.Add(Convert.ToInt32(doc.ID));
return dt;
}
private DataTable GetWorkViewIdAsDataTable(Application app, Hyland.Unity.WorkView.Object doc)
{
var dt = new DataTable("InputData");
dt.Columns.Add("WorkViewId", typeof(int));
dt.Rows.Add(Convert.ToInt32(doc.ID));
return dt;
}
private DataTable GetUnityFormFieldsAsDataTable(Application app, Document doc)
{
var dt = new DataTable("InputData");
// Get all UnityFields from Document
var unityFields = doc.UnityForm?.AllFields?.ValueFields;
foreach (var x in unityFields)
{
Type currentType = mapping[x.FieldDefinition.DataType];
dt.Columns.Add(new DataColumn(x.FieldDefinition.Name, currentType));
}
// Add all values to the dt DataTable
var d = dt.NewRow();
foreach (var field in unityFields)
{
try
{
app.Diagnostics.Write("Start Field with name: " + field.FieldDefinition.Name);
Type currentType = mapping[field.FieldDefinition.DataType];
app.Diagnostics.Write("Field DataType: " + field.FieldDefinition.DataType + " / " + currentType.ToString());
switch (currentType.ToString())
{
case "System.Int32":
if (!field.IsEmpty)
d.SetField(field.FieldDefinition.Name, System.Convert.ToInt32(field.Value.ToString()));
break;
case "System.Double":
if (!field.IsEmpty)
d.SetField(field.FieldDefinition.Name, field.FloatingPointValue);
break;
case "System.String":
if (!field.IsEmpty)
d.SetField(field.FieldDefinition.Name, field.Value.ToString());
break;
case "System.DateTime":
if (!field.IsEmpty)
d.SetField(field.FieldDefinition.Name, field.DateTimeValue);
break;
case "System.Boolean":
if (!field.IsEmpty)
d.SetField(field.FieldDefinition.Name, field.BooleanValue);
break;
}
}
catch (Exception e)
{
app.Diagnostics.Write("Could not convert value for " + field.FieldDefinition.Name);
app.Diagnostics.Write("Value: " + field.Value.ToString());
app.Diagnostics.Write(e);
throw new Exception("Could not convert value for " + field?.FieldDefinition?.Name, e);
}
}
dt.Columns.Add(new DataColumn("DocumentId", typeof(int)));
d.SetField("DocumentId", System.Convert.ToInt32(doc?.ID));
dt.Rows.Add(d);
return dt;
}
protected void GetConfigValue(string key, string defaultValue, out string result)
{
string _r;
result = _app.Configuration.TryGetValue(key, out _r) ? _r : defaultValue;
}
public enum INPUTDATA_MODE
{
DOCUMENT_ID,
UNITYFORM_FIELDS,
WORKVIEW_ID
}
#endregion
}
}