diff --git a/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml new file mode 100644 index 0000000000000000000000000000000000000000..ca188068504f512ef0e5c4ee9b52a9a37495dfae --- /dev/null +++ b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml @@ -0,0 +1,16 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="s.listl" id="18da4f91-3334-47c6-958d-6d0efce52d31"> + <createTable tableName="WORKFLOWSIGNAL"> + <column name="WORKFLOWSIGNALID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_WORKFLOWSIGNALID"/> + </column> + <column name="SIGNAL_NAME" type="VARCHAR(255)"/> + <column name="OBJECT_TYPE" type="VARCHAR(63)"/> + <column name="TRIGGER_EVENT" type="CHAR(36)"/> + <column name="PROCESSDEFINITION_KEY" type="VARCHAR(255)"/> + <column name="OBJECT_CONDITION" type="NVARCHAR(512)"/> + </createTable> + </changeSet> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2020.0.1/changelog.xml b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml new file mode 100644 index 0000000000000000000000000000000000000000..c3105c90b71f48e03afbe5a3771cbaaa080040da --- /dev/null +++ b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml @@ -0,0 +1,5 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <include file="WorkflowSignal/create_WorkflowSignal.xml" relativeToChangelogFile="true"/> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml index cc63bd025f48c03b71ce2b6d2613b52871996905..cc2f1fb471786b8918923569570fca173bbf091f 100644 --- a/.liquibase/Data_alias/changelog.xml +++ b/.liquibase/Data_alias/changelog.xml @@ -8,6 +8,7 @@ <include relativeToChangelogFile="true" file="basic/2019.3.2/changelog.xml"/> <include relativeToChangelogFile="true" file="basic/2019.3.3/changelog.xml"/> <include relativeToChangelogFile="true" file="basic/2020.0.0/changelog.xml"/> + <include relativeToChangelogFile="true" file="basic/2020.0.1/changelog.xml"/> <!--enable this only when you definetly want to overwrite the existing data with demo records:--> <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>--> diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod index 54d9a6d96337119edf5809df28e0d6849010a8ae..864f08aaa855fa6b4baf9353f73ab22daea1d9b2 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -13297,6 +13297,110 @@ </entityFieldDb> </entityFields> </entityDb> + <entityDb> + <name>WORKFLOWSIGNAL</name> + <dbName></dbName> + <idColumn>WORKFLOWSIGNALID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SIGNAL_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WORKFLOWSIGNALID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGER_EVENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_CONDITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROCESSDEFINITION_KEY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> </entities> </entityGroup> </aliasDefDb> diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod index 92b4a55b9b264a8ced721698129a93bd0baf14a3..f2201393b8ef0ca3b8308c427400cf082cd431c6 100644 --- a/entity/Context_entity/Context_entity.aod +++ b/entity/Context_entity/Context_entity.aod @@ -151,6 +151,12 @@ <fieldName>Contexts</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>591679c2-8fd3-4d05-9ef3-b648373785f7</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>Contexts</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> </entityFields> diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod index ca40ed92276a0d09ff1e111bc3cf710adc3f521e..126ed926b5fa3f0e51831332e07401bd60d68439 100644 --- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod +++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod @@ -559,6 +559,12 @@ <fieldName>CampaignStatusKeyword</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>66c64130-1997-4565-854e-94802b46dc96</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>TriggerKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/Offer_entity/afterOperatingState.js b/entity/Offer_entity/afterOperatingState.js index 95c27335097d5a484f25b37e679dbc332eb8302a..9e011dcf5d5d51fd3c9a78e55b9936e2bec21f10 100644 --- a/entity/Offer_entity/afterOperatingState.js +++ b/entity/Offer_entity/afterOperatingState.js @@ -1,3 +1,4 @@ +import("Context_lib"); import("system.vars"); import("Workflow_lib"); @@ -5,4 +6,5 @@ if (vars.exists("$context.workflowQueue") && vars.get("$context.workflowQueue")) { WorkflowStarter.inserted(vars.get("$context.workflowQueue")); vars.set("$context.workflowQueue", null); -} \ No newline at end of file +} +WorkflowSignalSender.doInsertedOrUpdated(); \ No newline at end of file diff --git a/entity/Offer_entity/recordcontainers/db/onDBDelete.js b/entity/Offer_entity/recordcontainers/db/onDBDelete.js index 1f353a6744202e829f1486293da519903a9a43b0..dbcf3083e10d4f8e2686a00a91f238d27e33c1f1 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBDelete.js +++ b/entity/Offer_entity/recordcontainers/db/onDBDelete.js @@ -5,4 +5,5 @@ import("system.vars"); newWhere("OFFERITEM.OFFER_ID", "$field.OFFERID") .deleteData(); -WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); \ No newline at end of file +WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); +WorkflowSignalSender.deleted(); \ No newline at end of file diff --git a/entity/Offer_entity/recordcontainers/db/onDBInsert.js b/entity/Offer_entity/recordcontainers/db/onDBInsert.js index e889b0d6c55e6902744e0a7469940c9a3a73972f..f65c655ec8749a87aaa568516948de8f37076339 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Offer_entity/recordcontainers/db/onDBInsert.js @@ -1,3 +1,4 @@ +import("system.workflow"); import("Workflow_lib"); import("system.db"); import("system.datetime"); @@ -22,3 +23,4 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) //start the execution in afterOperatingState, because here the dataset is not yet inserted vars.set("$context.workflowQueue", {sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); +WorkflowSignalSender.markInserted(); diff --git a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js index 8f911091e9794cb39984177859555ab3d1438b1d..481f3bcd1ad9144b89734a95b8f774f85a1af2d7 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js @@ -1,7 +1,10 @@ +import("system.workflow"); import("KeywordRegistry_basic"); import("system.vars"); import("Workflow_lib"); var status = vars.get("$local.rowdata")["OFFER.STATUS"]; if (vars.get("$local.changed").indexOf("OFFER.STATUS") !== -1 && status == $KeywordRegistry.offerStatus$toCheck()) - WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status}); \ No newline at end of file + WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status}); + +WorkflowSignalSender.markUpdated(); \ No newline at end of file diff --git a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod index f7bbe40886f6601c68134ddaefd9114e4861d66d..7a08e145424bf057bbb9823bbbdd4dae3f2e1eb7 100644 --- a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod +++ b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod @@ -171,6 +171,24 @@ <onActionProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/downloadxml/onActionProcess.js</onActionProcess> <iconId>VAADIN:DOWNLOAD</iconId> </entityActionField> + <entityConsumer> + <name>Signals</name> + <dependency> + <name>dependency</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>ProcessDefinitionSignals</fieldName> + </dependency> + <children> + <entityParameter> + <name>ProcessDefinitionId_param</name> + <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ProcessDefinitionKey_param</name> + <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..16c85500b5355a72548030867e3d300661e9d4aa --- /dev/null +++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.UID")); \ No newline at end of file diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..3c5c973d2b247ecef9c21e39584f539bf986176d --- /dev/null +++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.KEY")); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod new file mode 100644 index 0000000000000000000000000000000000000000..90a3b92882d6c751d6cafa209817a0ec6c874563 --- /dev/null +++ b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.13" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.13"> + <name>WorkflowSignal_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <title>Workflow signal</title> + <titlePlural>Signals</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>WORKFLOWSIGNALID</name> + </entityField> + <entityField> + <name>SIGNAL_NAME</name> + <title>Signal</title> + <dropDownProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js</dropDownProcess> + </entityField> + <entityField> + <name>SCOPE</name> + <title>Scope</title> + </entityField> + <entityParameter> + <name>ProcessDefinitionId_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>OBJECT_TYPE</name> + <title>Context</title> + <consumer>Contexts</consumer> + </entityField> + <entityField> + <name>TRIGGER_EVENT</name> + <title>Trigger</title> + <consumer>TriggerKeyword</consumer> + </entityField> + <entityField> + <name>OBJECT_CONDITION</name> + <title>Condition</title> + <contentType>FILTER_TREE</contentType> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js</valueProcess> + </entityField> + <entityConsumer> + <name>Contexts</name> + <dependency> + <name>dependency</name> + <entityName>Context_entity</entityName> + <fieldName>Exclusive</fieldName> + </dependency> + </entityConsumer> + <entityConsumer> + <name>TriggerKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityProvider> + <name>ProcessDefinitionSignals</name> + <dependencies> + <entityDependency> + <name>f08ff63c-296a-4b1f-8264-b6b1e6c1d748</name> + <entityName>WorkflowDefinition_entity</entityName> + <fieldName>Signals</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>PROCESSDEFINITION_KEY</name> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js</valueProcess> + </entityField> + <entityParameter> + <name>ProcessDefinitionKey_param</name> + <expose v="true" /> + </entityParameter> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <alias>Data_alias</alias> + <conditionProcess>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <linkInformation> + <linkInformation> + <name>f6162cb6-c209-4607-8d67-0d630b28feab</name> + <tableName>WORKFLOWSIGNAL</tableName> + <primaryKey>WORKFLOWSIGNALID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>WORKFLOWSIGNALID.value</name> + <recordfield>WORKFLOWSIGNAL.WORKFLOWSIGNALID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_CONDITION.value</name> + <recordfield>WORKFLOWSIGNAL.OBJECT_CONDITION</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_TYPE.value</name> + <recordfield>WORKFLOWSIGNAL.OBJECT_TYPE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>SIGNAL_NAME.value</name> + <recordfield>WORKFLOWSIGNAL.SIGNAL_NAME</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TRIGGER_EVENT.value</name> + <recordfield>WORKFLOWSIGNAL.TRIGGER_EVENT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TRIGGER_EVENT.displayValue</name> + <expression>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PROCESSDEFINITION_KEY.value</name> + <recordfield>WORKFLOWSIGNAL.PROCESSDEFINITION_KEY</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..8a7128421f3b6e6e5d154b230ca259e4f843dbbd --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js @@ -0,0 +1,23 @@ +import("Context_lib"); +import("system.neon"); +import("system.vars"); +import("system.result"); +import("Attribute_lib"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +{ + var context = vars.getString("$field.OBJECT_TYPE"); + var entity = ContextUtils.getEntity(context); + var emptyFilter = {entity: entity, filter: {type: "group", operator: "AND", childs: []}}; + + var currentFilter = vars.get("$this.value"); + if (currentFilter) + currentFilter = JSON.parse(currentFilter); + + //if the filter field is empty or if the entity was changed, reset the filter + if (!currentFilter || currentFilter.entity != emptyFilter.entity) + { + var condJson = JSON.stringify(emptyFilter); + result.string(condJson); + } +} \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..65a94b89933c5105c3abfb125ea08cd1a77c4b29 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$param.ProcessDefinitionKey_param")); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..50e53ca72a8aa2cd220405357914682f63e92a56 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js @@ -0,0 +1,13 @@ +import("system.result"); +import("system.workflow"); +import("system.vars"); + +var processDefinitionId = vars.get("$param.ProcessDefinitionId_param"); +var signals = processDefinitionId + ? JSON.parse(workflow.getSignalDefinitions(processDefinitionId)) + : []; + +result.object(signals.map(function (signal) +{ + return [signal.name, signal.name]; +})); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..dee07a7bcce5662c3c52ee83659e3c64fcf52d10 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.workflowTrigger()); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..cb352a5e45ce024c0ae6b3113c1c89a465508b13 --- /dev/null +++ b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,6 @@ +import("Sql_lib"); +import("system.result"); + +var cond = newWhereIfSet("WORKFLOWSIGNAL.PROCESSDEFINITION_ID", "$param.ProcessDefinitionId_param"); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js new file mode 100644 index 0000000000000000000000000000000000000000..f484f92b06795d86a986de789b39f35047dffbef --- /dev/null +++ b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.workflowTrigger(), "WORKFLOWSIGNAL.TRIGGER_EVENT"); +result.string(sql); \ No newline at end of file diff --git a/entity/WorkflowTask_entity/WorkflowTask_entity.aod b/entity/WorkflowTask_entity/WorkflowTask_entity.aod index f5ded376a8a6456237c30ff4ebfa04221760142a..378580b2459a6093f7ff363314a3a285d0de3b07 100644 --- a/entity/WorkflowTask_entity/WorkflowTask_entity.aod +++ b/entity/WorkflowTask_entity/WorkflowTask_entity.aod @@ -109,13 +109,33 @@ <name>TaskTitle_param</name> <expose v="true" /> </entityParameter> + <entityActionField> + <name>claimTask</name> + <title>Claim task</title> + <onActionProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CLIPBOARD_USER</iconId> + </entityActionField> + <entityField> + <name>ISACTIVE</name> + <title>Active</title> + <contentType>BOOLEAN</contentType> + </entityField> + <entityField> + <name>CLAIM_TIME</name> + <title>Claim date</title> + <contentType>DATE</contentType> + </entityField> + <entityField> + <name>PRIORITY</name> + <title>Priority</title> + </entityField> </entityFields> <recordContainers> <jDitoRecordContainer> <name>jdito</name> <jDitoRecordAlias>Data_alias</jDitoRecordAlias> <isFilterable v="true" /> - <isSortable v="true" /> + <isSortable v="false" /> <contentProcess>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <onUpdate>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/onUpdate.js</onUpdate> <recordFieldMappings> @@ -175,6 +195,15 @@ <jDitoRecordFieldMapping> <name>TARGET_ID.displayValue</name> </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>CLAIM_TIME.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ISACTIVE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>PRIORITY.value</name> + </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js new file mode 100644 index 0000000000000000000000000000000000000000..c7efdb62d29832c9280837e42b5d03e72c47f33a --- /dev/null +++ b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js @@ -0,0 +1,5 @@ +import("Employee_lib"); +import("system.vars"); +import("system.workflow"); + +workflow.claimTask(vars.get("$field.UID"), EmployeeUtils.getCurrentUserId()); \ No newline at end of file diff --git a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js index 9005006abf7ec25a907adc49073eac84509848be..60769b4b453cfa5ca56d8affa0db09a9337ec809 100644 --- a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js @@ -36,7 +36,7 @@ result.object((function () { //This can happen if the task is done, then it can't be loaded. If that's the case, return a dummy row var taskTitle = vars.exists("$param.TaskTitle_param") && vars.get("$param.TaskTitle_param") || ""; - return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", ""]]; + return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]]; } } else @@ -72,7 +72,10 @@ result.object((function () task.owner || "", variables.targetContext || "", variables.targetId || "", - targetTitle + targetTitle, + task.claimTime, + task.active, + task.priority ]; }); diff --git a/neonContext/WorkflowSignal/WorkflowSignal.aod b/neonContext/WorkflowSignal/WorkflowSignal.aod new file mode 100644 index 0000000000000000000000000000000000000000..af6b238d6feb60c6467deb3b70de3624cb81ce94 --- /dev/null +++ b/neonContext/WorkflowSignal/WorkflowSignal.aod @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>WorkflowSignal</name> + <title>Workflow signal</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>WorkflowSignalFilter_view</filterView> + <editView>WorkflowSignalEdit_view</editView> + <entity>WorkflowSignal_entity</entity> + <references> + <neonViewReference> + <name>5dd8a1ec-6279-4f85-ae49-d3d82a62d1dc</name> + <view>WorkflowSignalFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>0709bd97-560a-4a01-8e26-2993388956f3</name> + <view>WorkflowSignalEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>9395ba99-8725-43f4-998b-9865916f9a0f</name> + <view>WorkflowSignalPreview_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod index 8db78b1723af1159e1c454f188856b8e97f44adc..20311ee8d908f6844f16cf562f4fbe80e56f9dea 100644 --- a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod +++ b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod @@ -34,5 +34,10 @@ <entityField>StartConfigs</entityField> <view>WorkflowStartConfigFilter_view</view> </neonViewReference> + <neonViewReference> + <name>1a6329e9-8992-482b-82b6-fd01e09c6be1</name> + <entityField>Signals</entityField> + <view>WorkflowSignalFilter_view</view> + </neonViewReference> </children> </neonView> diff --git a/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..485a890ce1c763062bc1443dd81d95d7c391a63a --- /dev/null +++ b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <isSmall v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>937b8a52-58ab-49d3-80c7-ea98310632dd</name> + <entityField>SIGNAL_NAME</entityField> + </entityFieldLink> + <entityFieldLink> + <name>eb71448c-b176-4b12-a4d7-a46e2f242020</name> + <entityField>OBJECT_TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>bc88a7a6-6843-40c0-86ad-265424e98fb1</name> + <entityField>TRIGGER_EVENT</entityField> + </entityFieldLink> + <entityFieldLink> + <name>648536a5-2327-433e-8867-a3d60a0f8787</name> + <entityField>OBJECT_CONDITION</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..9e428d07362f6fa787f295ad8e35c82cdd2e1d45 --- /dev/null +++ b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>80fa7f03-9064-42f2-95bd-bebc23ca3e62</name> + <entityField>SIGNAL_NAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>44a02634-1b88-49e8-8125-5bc22e31683d</name> + <entityField>OBJECT_TYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>c23ed9c6-7baa-4742-ba1e-d771f98167d5</name> + <entityField>TRIGGER_EVENT</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod new file mode 100644 index 0000000000000000000000000000000000000000..2b648167cc55f5892350e33645fec4ca4c398bf5 --- /dev/null +++ b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + </headerFooterLayout> + </layout> +</neonView> diff --git a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod index e8c0235a6fb352faced599759b553d81eb055eec..661e81ca14968a258618510742be351d5ba1bb80 100644 --- a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod +++ b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod @@ -47,6 +47,18 @@ <name>63697864-5b0b-471f-89fc-60621fecbaec</name> <entityField>TARGET_ID</entityField> </entityFieldLink> + <entityFieldLink> + <name>232670b6-4923-4e8d-bfa0-8720e57e932a</name> + <entityField>ISACTIVE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>d193bea1-a470-4403-bce7-446e3b398540</name> + <entityField>PRIORITY</entityField> + </entityFieldLink> + <entityFieldLink> + <name>f93aeea0-7881-4284-957a-f4a300cdeeef</name> + <entityField>OWNER</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js index f70649273f22841c2b5f0fa804970b9393658a53..26d5997206feb96007911d3068aa687a14bf9628 100644 --- a/process/Context_lib/process.js +++ b/process/Context_lib/process.js @@ -80,6 +80,8 @@ ContextUtils.getIcon = function(pContextId) */ ContextUtils.getEntity = function (pContextId) { + if (!pContextId) + return null; return project.getContextStructure(pContextId).entity; } diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js index ba2ff373f770cb2e8159d344f35454d95b6afa61..eb23aed65f9b39702e76122a183879550acc92d2 100644 --- a/process/Workflow_lib/process.js +++ b/process/Workflow_lib/process.js @@ -87,9 +87,12 @@ WorkflowUtils.appendMandatoryVariables = function (pVariables, pTargetId, pTarge */ WorkflowUtils.engineIsEnabled = function () { - return project.getInstanceConfigValue("workflowEngineEnabled", "false") == "true"; + return String(project.getInstanceConfigValue("workflowEngineEnabled", "false")) == "true"; } +/** + * obsolete + */ function WorkflowStarter () {} WorkflowStarter.TRIGGER_INSERT = function () @@ -133,3 +136,115 @@ WorkflowStarter._startProcessByAction = function (pAction, pVariables, pTargetId } catch (err) {} }); } + +function WorkflowSignalSender () {} + +WorkflowSignalSender.EVENT_INSERT = function () +{ + return $KeywordRegistry.workflowTrigger$create(); +} + +WorkflowSignalSender.EVENT_UPDATE = function () +{ + return $KeywordRegistry.workflowTrigger$update(); +} + +WorkflowSignalSender.EVENT_DELETE = function () +{ + return $KeywordRegistry.workflowTrigger$delete(); +} + +WorkflowSignalSender.markInserted = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_INSERT(), pTargetId, pTargetContext); +} + +WorkflowSignalSender.markUpdated = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_UPDATE(), pTargetId, pTargetContext); +} + +WorkflowSignalSender._QUEUE_VARNAME = function () +{ + return "$context.workflowSignalQueue"; +} + +WorkflowSignalSender._addToQueue = function (pAction, pTargetId, pTargetContext) +{ + var contextVar = WorkflowSignalSender._QUEUE_VARNAME(); + var queue = []; + if (vars.exists(contextVar) && vars.get(contextVar)) + queue = vars.get(contextVar); + + queue.push([pAction, pTargetId, pTargetContext]); + vars.set(contextVar, queue); +} + +WorkflowSignalSender.doInsertedOrUpdated = function () +{ + var contextVar = WorkflowSignalSender._QUEUE_VARNAME(); + if (vars.exists(contextVar) && vars.get(contextVar)) + { + vars.get(contextVar).forEach(function (action) + { + WorkflowSignalSender.actionPerformed.apply(null, action); + }); + vars.set(contextVar, null); + } +} + +WorkflowSignalSender.deleted = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender.actionPerformed(WorkflowSignalSender.EVENT_DELETE(), pTargetId, pTargetContext); +} + +WorkflowSignalSender.actionPerformed = function (pAction, pTargetId, pTargetContext) +{ + if (!pTargetId) + pTargetId = vars.get("$sys.uid"); + if (!pTargetContext) + pTargetContext = ContextUtils.getCurrentContextId(); + + var signals = WorkflowSignalSender.getSignalConfig(pTargetContext, pAction); + signals.forEach(function (signal) + { + if (_checkCondition(signal.entity, pTargetId, signal.condition)) + workflow.signalEventReceived(signal.name); + }); + + function _checkCondition (pEntity, pUid, pCondition) + { + if (!pCondition) + return true; + + var loadConfig = entities.createConfigForLoadingRows() + .entity(pEntity) + .uid(pUid) + .filter(JSON.stringify(pCondition)); + + return entities.getRowCount(loadConfig) > 0; + } +} + +WorkflowSignalSender.getSignalConfig = function (pContext, pAction) +{ + var entity = ContextUtils.getEntity(pContext); + var signals = newSelect("SIGNAL_NAME, OBJECT_CONDITION") + .from("WORKFLOWSIGNAL") + .where("WORKFLOWSIGNAL.OBJECT_TYPE", pContext) + .and("WORKFLOWSIGNAL.TRIGGER_EVENT", pAction) + .table(); + + return signals.map(function (signal) + { + var condition = signal[1] + ? JSON.parse(signal[1]).filter + : null; + + return { + name : signal[0], + entity : entity, + condition : condition + }; + }); +} \ No newline at end of file