Skip to content
Snippets Groups Projects
Commit 07fb72b3 authored by Sebastian Listl's avatar Sebastian Listl :speech_balloon:
Browse files

#1065237 Send email with workflow link

parent 2e9008ed
No related branches found
No related tags found
No related merge requests found
......@@ -15,7 +15,4 @@ var activityData = {
};
var links = [[variables.targetContext, variables.targetId]];
var activity = ActivityUtils.insertNewActivity(activityData, links);
result.string(activity.activityId);
var activity = ActivityUtils.insertNewActivity(activityData, links);
\ No newline at end of file
......@@ -34,4 +34,4 @@ var processVariables = {
"targetId": id,
"targetContext": "Salesproject"
}
workflow.setProcessInstanceVariables(vars.get("$local.uid"), processVariables)
result.object(processVariables);
......@@ -637,6 +637,7 @@ DocumentTemplate.prototype.getReplacementsByContactIds = function (pContactIds,
var placeholders = this._getRequiredPlaceholders(["{@firstname@}", "{@lastname@}"], pAdditionalPlaceholders);
var contactPlaceholders = [];
var additionalPlaceholders = {};
var isUserRequired = false;
placeholders.forEach(function (placeholder)
{
switch (placeholder.type)
......@@ -673,7 +674,7 @@ DocumentTemplate.prototype.getReplacementsByContactIds = function (pContactIds,
if (placeholder.type === Placeholder.types.FIXEDVALUE)
replacements[contactId][placeholderName] = placeholder.valueDefinition;
else if (placeholder.type === Placeholder.types.CALLBACKFUNCTION)
replacements[contactId][placeholderName] = placeholder.valueDefinition(contactId);
replacements[contactId][placeholderName] = placeholder.valueDefinition.call(this, contactId);
}
}
return replacements;
......
......@@ -22,7 +22,9 @@ EmployeeUtils.getCurrentContactId = function ()
{
if (vars.getString("$sys.isclient") == "true" && vars.exists("$global.user.contactId"))
return vars.get("$global.user.contactId");
if (!vars.exists("$sys.user"))
return null;
var user = tools.getCurrentUser();
return user ? user[tools.PARAMS][tools.CONTACTID] : null;
}
......
import("Util_lib");
import("Communication_lib");
import("system.tools");
import("system.result");
import("DocumentTemplate_lib");
import("system.vars");
import("Email_lib");
import("Placeholder_lib");
import("Workflow_lib");
var processInstanceId = vars.get("$local.uid");
var variables = JSON.parse(vars.get("$local.value"));
var recipientContactId = variables.recipientContactId;
var documentTemplateId = variables.documentTemplateId;
var senderName = variables.senderName;
var mailSubject = variables.mailSubject;
var email = Email.fromTemplate(documentTemplateId, recipientContactId);
var actionParams = Utils.clone(variables);
actionParams.processInstanceId = processInstanceId;
var linkPlaceholder = new Placeholder("workflowActionLink", Placeholder.types.CALLBACKFUNCTION, function ()
{
return WorkflowLinkActions.getActionLink("https://localhost:8443", actionParams.linkActionType, actionParams.redirectLink, actionParams);
});
var email = Email.fromTemplate(documentTemplateId, recipientContactId, null, [linkPlaceholder]);
email.subject = mailSubject;
email.toRecipients = [CommUtil.getStandardMail(recipientContactId)];
//if we use @@instanceId in the mail body to track the user interaction, we replace it here with the instance id
email.body = email.body.replace("@@instanceId", vars.get("$local.uid"));
email.body = email.body.replace("@@instanceId", processInstanceId);
var sendResult;
if(senderName)
......@@ -29,5 +40,4 @@ if(senderName)
else
{
sendResult = email.send();
}
result.string(sendResult);
\ No newline at end of file
}
\ No newline at end of file
import("system.vars");
import("system.result");
import("Workflow_lib");
import("KeywordRegistry_basic");
......@@ -19,7 +20,34 @@ var contacts = newSelect(["CONTACTID", new ContactTitleRenderer(Contact.createWi
.table()
.map(function (item) {return {id : item[0], name : item[1]};});
result.object([
var workflowLinkActionTypes = [];
for (let typeName in WorkflowLinkActions.types)
{
let actionType = WorkflowLinkActions.types[typeName];
workflowLinkActionTypes.push({id: actionType(), name: actionType.title});
}
var parameters = [
new WorkflowServiceTaskParameter("documentTemplateId", "Document template", WorkflowServiceTaskParameter.ENUM(), templates),
new WorkflowServiceTaskParameter("recipientContactId", "Recipient", WorkflowServiceTaskParameter.ENUM(), contacts)
]);
\ No newline at end of file
new WorkflowServiceTaskParameter("recipientContactId", "Recipient", WorkflowServiceTaskParameter.ENUM(), contacts),
new WorkflowServiceTaskParameter("linkActionType", "Link action", WorkflowServiceTaskParameter.ENUM(), workflowLinkActionTypes, true)
];
var currentValues = JSON.parse(vars.get("$local.value"));
if (currentValues.linkActionType && currentValues.linkActionType.value)
{
parameters.push(new WorkflowServiceTaskParameter("redirectLink", "Link", WorkflowServiceTaskParameter.STRING()));
switch (currentValues.linkActionType.value)
{
case WorkflowLinkActions.types.RECEIVE_TASK():
parameters.push(new WorkflowServiceTaskParameter("receiveTask", "Receive Task Id", WorkflowServiceTaskParameter.STRING()));
break;
case WorkflowLinkActions.types.SIGNAL():
parameters.push(new WorkflowServiceTaskParameter("signal", "Signal", WorkflowServiceTaskParameter.STRING()));
break;
case WorkflowLinkActions.types.MESSAGE():
parameters.push(new WorkflowServiceTaskParameter("message", "Message", WorkflowServiceTaskParameter.STRING()));
}
}
result.object(parameters);
\ No newline at end of file
......@@ -16,4 +16,4 @@ if (variables.attributeName)
else
attributeId = variables.attributeId;
result.string(new AttributeRelationQuery(variables.targetId, attributeId, variables.targetContext).insertAttribute(variables.attributeValue));
\ No newline at end of file
new AttributeRelationQuery(variables.targetId, attributeId, variables.targetContext).insertAttribute(variables.attributeValue);
\ No newline at end of file
import("system.process");
import("Util_lib");
import("system.text");
import("system.logging");
......@@ -605,44 +606,89 @@ WorkflowModelerApiCall.prototype.importModel = function ()
function WorkflowLinkActions () {}
WorkflowLinkActions.types = {
RECEIVE_TASK: function () {return "receive";}
RECEIVE_TASK: function () {return "rec";},
SIGNAL: function () {return "sig";},
MESSAGE: function () {return "msg";}
};
WorkflowLinkActions.types.RECEIVE_TASK.title = "Receive Task";
WorkflowLinkActions.types.RECEIVE_TASK.execute = function (pParameters)
{
if (!pParameters.piId || !pParameters.recId)
if (!pParameters.processInstanceId)
return;
workflow.triggerReceiveTask(pParameters.piId, pParameters.recId);
workflow.triggerReceiveTask(pParameters.processInstanceId, pParameters.receiveTask || null);
}
WorkflowLinkActions.types.SIGNAL.title = "Signal";
WorkflowLinkActions.types.SIGNAL.execute = function (pParameters)
{
if (!pParameters.processInstanceId)
return;
workflow.signalEventReceived(pParameters.signal);
}
WorkflowLinkActions.types.MESSAGE.title = "Message";
WorkflowLinkActions.types.MESSAGE.execute = function (pParameters)
{
if (!pParameters.processInstanceId || !pParameters.message)
return;
}
WorkflowLinkActions.encodeAction = function (pType, pLink, pParams)
{
var actionObj = pParams || {};
actionObj.type = pType;
actionObj.link = pLink;
if (!pParams)
pParams = {};
//map params to have shorter keys, results in shorter url
var actionObj = {};
if (pParams.processInstanceId)
actionObj.pi = pParams.processInstanceId;
if (pParams.signal)
actionObj.sg = pParams.signal;
if (pParams.message)
actionObj.ms = pParams.message;
if (pParams.receiveTask)
actionObj.re = pParams.receiveTask;
actionObj.ty = pType;
actionObj.ln = pLink;
var actionString = JSON.stringify(actionObj);
return encodeURIComponent(util.encodeBase64String(actionString));
}
WorkflowLinkActions.getActionLink = function (pBaseUrl, pType, pLink, pParams)
{
if (!pBaseUrl.endsWith("/"))
pBaseUrl += "/";
return pBaseUrl + "services/rest/redirect_rest?act=" + WorkflowLinkActions.encodeAction(pType, pLink, pParams);
}
WorkflowLinkActions.parseAction = function (pEncodedAction)
{
try
{
var decodedAction = decodeURIComponent(util.decodeBase64String(pEncodedAction))
var decodedAction = decodeURIComponent(util.decodeBase64String(pEncodedAction));
var parsedAction = JSON.parse(decodedAction);
}
catch (err)
{
parsedAction = {};
}
//map the object so it has understandable keys when used
var actionParams = {};
if (parsedAction.pi)
actionParams.processInstanceId = parsedAction.pi;
if (parsedAction.sg)
actionParams.signal = parsedAction.sg;
if (parsedAction.ms)
actionParams.message = parsedAction.ms;
if (parsedAction.re)
actionParams.receiveTask = parsedAction.re;
return {
type: parsedAction.type || null,
redirectLink: parsedAction.link || null,
params: parsedAction,
type: parsedAction.ty || null,
redirectLink: parsedAction.ln || null,
params: actionParams,
run: function ()
{
for (let typeName in WorkflowLinkActions.types)
......
import("Workflow_lib");
import("Util_lib");
import("system.util");
import("system.logging");
function restget (pRequest)
{
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment