Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature/XIVY-13085 add business notification demo #514

Merged
merged 1 commit into from
Feb 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions workflow/workflow-demos-test/src_test/test/bpm/TestOrder.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package test.bpm;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.jupiter.api.Test;

import ch.ivyteam.ivy.bpm.engine.client.BpmClient;
import ch.ivyteam.ivy.bpm.engine.client.element.BpmElement;
import ch.ivyteam.ivy.bpm.engine.client.element.BpmProcess;
import ch.ivyteam.ivy.bpm.exec.client.IvyProcessTest;
import ch.ivyteam.ivy.environment.Ivy;
import ch.ivyteam.ivy.notification.impl.NotificationRepository;
import ch.ivyteam.ivy.notification.query.NotificationQuery;
import ch.ivyteam.ivy.scripting.objects.Tuple;
import ch.ivyteam.ivy.workflow.CaseState;
import workflow.order.Order;
import workflow.order.Person;

@IvyProcessTest
public class TestOrder
{
private static final BpmProcess ORDER_PROCESS = BpmProcess.name("OrderProcess");

private static final BpmElement START_ORDER = ORDER_PROCESS.elementName("startOrder");
private static final BpmElement INPUT_ORDER = ORDER_PROCESS.elementName("Input Order");
private static final BpmElement PROCESS_ORDER = ORDER_PROCESS.elementName("Process Order");
private static final BpmElement DELIVER_ORDER = ORDER_PROCESS.elementName("Deliver Order");
private static final BpmElement SEND_INVOICE = ORDER_PROCESS.elementName("Send Invoice");
private static final BpmElement BOOK_PAYMENT = ORDER_PROCESS.elementName("Book Payment");

private static final Person CUSTOMER = new Person();
private static final Order ORDER = new Order();

static
{
CUSTOMER.setName("Doe");
CUSTOMER.setSurname("John");
ORDER.setProduct("Ferrari Testarossa");
}

@Test
void runProcess(BpmClient bpmClient)
{
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

legacy fromatting ;-)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, the whole demo is formatted this way.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can change in a a different PR. But then all demos.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have changed this class to legazy formatting only. Will convert every demo to new formatting in a new PR after my holidays.

bpmClient.mock().uiOf(INPUT_ORDER).with(this::inputOrder);
bpmClient.mock().uiOf(PROCESS_ORDER).withNoAction();
bpmClient.mock().uiOf(DELIVER_ORDER).withNoAction();
bpmClient.mock().uiOf(DELIVER_ORDER).withNoAction();
bpmClient.mock().uiOf(SEND_INVOICE).withNoAction();
bpmClient.mock().uiOf(BOOK_PAYMENT).withNoAction();

NotificationQuery nofiticationQuery = NotificationRepository.of(Ivy.wf().getSecurityContext()).query();
var notifications = nofiticationQuery.executor().count();

var result = bpmClient.start().process(START_ORDER)
.as().everybody().execute();
bpmClient.start().anyActiveTask(result).as().role("Processor").execute();
bpmClient.start().anyActiveTask(result).as().role("Deliverer").execute();
bpmClient.start().anyActiveTask(result).as().role("Finance").execute();
bpmClient.start().anyActiveTask(result).as().role("Finance").execute();

assertThat(result.workflow().activeCase().getState()).isEqualTo(CaseState.DONE);
assertThat(nofiticationQuery.executor().count()).isEqualTo(notifications + 9);
}

private void inputOrder(Tuple parameters, Tuple results)
{
try
{
results.set("customer", CUSTOMER);
results.set("order", ORDER);
}
catch (NoSuchFieldException ex)
{
throw new RuntimeException(ex);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<html>
<body>
<img class="logo" src="<%= ivy.branding.ref("logo_mail") %>"/>
<h1><%= ivy.cm.co("/Notification/business/Templates/Order/Labels/Title") %></h1>
<p><%= ivy.cm.co("/Notification/business/Templates/Order/Labels/Greeting") %> <%= ivy.session.getSessionUser().getFullName() %></p>
<table>
<tr>
<th><%= ivy.cm.co("/Notification/business/Templates/Order/Labels/Message") %><th>
<td><%= ivy.html.escape(message) %></td>
</tr>
<tr>
<th><%= ivy.cm.co("/Notification/business/Templates/Order/Labels/Customer") %></th>
<td><i style="color: red;"> <%= ivy.html.escape(payload.get("surname")) %> <%= ivy.html.escape(payload.get("name")) %> </i></td>
</tr>
</table>
</body>
</html>
35 changes: 27 additions & 8 deletions workflow/workflow-demos/cms/cms_de.yaml
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
Categories:
notification:
cssIcon: si si-messages-bubble
name: 8. Notification
Dialogs:
agileBPM:
define_WF:
Expand Down Expand Up @@ -107,15 +111,14 @@ Dialogs:
selectParkingLot: Parkplatz auswählen
Emails:
accepted: akzeptiert
confirmParkingLot: "<H1>\r\nHallo <%=in.name%>\r\n</H1>\r\n<P>\r\nDer Parkplatz Nr. <%=in.selectedParkingLotNr%> wurde für Sie reserviert. \r\n</P>\r\n<P>\r\nWir wünschen Ihnen einen schönen Tag.\r\n</P>\r\n"
confirmParkingLot: "<H1>\nHallo <%=in.name%>\n</H1>\n<P>\nDer Parkplatz Nr. <%=in.selectedParkingLotNr%> wurde für Sie reserviert. \n</P>\n<P>\nWir wünschen Ihnen einen schönen Tag.\n</P>\n"
declined: abgelehnt
parkingLotReservationHeader: Ihr Parkplatz wurde reserviert
procurementRequestNotification: "<H1>\r\nHallo <%=in.requester.fullName%> \r\n</H1>\r\n<P>\r\nIhr Antrag wurde <%=(in.accepted ? \"angenommen\" : \"abgelehnt\")%>: \r\n</P>\r\n<P>\r\n<%=in.amount%> Stück '<%=in.description%>' zum Gesamtpreis von <%=in.totalPrice%> <%=ivy.cms.co(\"/Dialogs/procurementRequest/currencySymbol\"\
)%> \r\n</P>\r\n<P>\r\nFreundliche Grüsse \r\n</P>\r\n"
procurementRequestNotification: "<H1>\nHallo <%=in.requester.fullName%> \n</H1>\n<P>\nIhr Antrag wurde <%=(in.accepted ? \"angenommen\" : \"abgelehnt\")%>: \n</P>\n<P>\n<%=in.amount%> Stück '<%=in.description%>' zum Gesamtpreis von <%=in.totalPrice%> <%=ivy.cms.co(\"/Dialogs/procurementRequest/currencySymbol\"\
)%> \n</P>\n<P>\nFreundliche Grüsse \n</P>\n"
senderMail: [email protected]
welcomeHeader: Willkommen
welcomeMail: "<H1>\r\nHallo <%=in.name%> \r\n</H1>\r\n<P>\r\nWillkommen in unserem Unternehmen. Wir freuen uns, Sie bei uns begrüssen zu dürfen! \r\n</P>\r\n<P>\r\nWenn Sie Fragen haben, wenden Sie sich bitte an Ihren Teamleiter oder an Ihren HR Manager. \r\n</P>\r\n<P>\r\nWir wünschen Ihnen einen schö\
nen Tag! \r\n</P>\r\n"
welcomeMail: "<H1>\nHallo <%=in.name%> \n</H1>\n<P>\nWillkommen in unserem Unternehmen. Wir freuen uns, Sie bei uns begrüssen zu dürfen! \n</P>\n<P>\nWenn Sie Fragen haben, wenden Sie sich bitte an Ihren Teamleiter oder an Ihren HR Manager. \n</P>\n<P>\nWir wünschen Ihnen einen schönen Tag! \n</P>\n"
yourRequestHasBeen: 'Ihre Anfrage wurde '
Labels:
AdhocWorkflow: Beschreiben Sie Ihren Workflow
Expand All @@ -125,6 +128,19 @@ Labels:
InsertTheTask: Aufgabe einfügen
TaskUser-Explain: Komma getrennte Liste von Benutzern
title: Self Service Ad-Hoc Workflow
Notification:
Messages:
InvoiceSent: Die Rechnung für die Bestellung {0} wurde versendet
OrderDelivered: Bestellung {0} wurde an Kunde {1} {2} ausgeliefert
OrderFinished: Die Bestellung {0} wurde erfolgreich abgeschlossen
business:
Templates:
Order:
Labels:
Customer: Kunde
Greeting: 'Hallo '
Message: Meldung
Title: Bestellungsinformation
TaskDescriptions:
DeliverKeyCardDesc: Bitte liefern Sie die Schlüsselkarte aus für
acceptRequest: Antrag annehmen
Expand All @@ -138,8 +154,11 @@ TaskDescriptions:
verifyRequest: Prüfe Antrag
Texts:
Adhoc-Explain: '<P> <B>Geben Sie Ihren Kommentar ein </B>und drücken Sie <B>Senden</B> um weiterzufahren. </P> '
AdhocWF-Explain: "<P>\r\nDefinieren und starten Sie einen Workflow auf Knopfdruck. \r\n</P>\r\n"
Approval-Explain: "<P>\r\n<B>Treffen Sie Ihre Entscheidung</B> und klicken Sie auf <B>Senden </B>um weiterzufahren. \r\n</P>\r\n"
QA-Explain: "<P>\r\nBeantworten Sie die Frage und <B>Senden </B>Sie Ihre Antwort an den Fragesteller zurück.\r\n</P>\r\n"
AdhocWF-Explain: "<P>\nDefinieren und starten Sie einen Workflow auf Knopfdruck. \n</P>\n"
Approval-Explain: "<P>\n<B>Treffen Sie Ihre Entscheidung</B> und klicken Sie auf <B>Senden </B>um weiterzufahren. \n</P>\n"
QA-Explain: |
<P>
Beantworten Sie die Frage und <B>Senden </B>Sie Ihre Antwort an den Fragesteller zurück.
</P>
QAresponse-Explain: '<P> Sie können eine Anschlussfrage <B>Zurücksenden</B> oder den Workflow <B>Beenden</B>.</P> '
ToDo-Explain: '<P> Bestätigen Sie, dass das <B> TODO Erledigt</B> wurde oder lehnen Sie es ab.</P> '
84 changes: 74 additions & 10 deletions workflow/workflow-demos/cms/cms_en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ Categories:
cssIcon: si si-multiple-neutral-1
name: 2. Human Tasks
tooltip: How to integrate humans into workflows
notification:
cssIcon: si si-messages-bubble
name: 8. Notification
signal:
cssIcon: si si-network-signal
name: 3. Signals
Expand Down Expand Up @@ -138,14 +141,46 @@ Dialogs:
selectParkingLot: Select parking lot
Emails:
accepted: accepted
confirmParkingLot: "<H1>\r\nHello <%=in.name%>\r\n</H1>\r\n<P>\r\nWe reserved the parking lot nr. <%=in.selectedParkingLotNr%> for you.\r\n</P>\r\n<P>\r\nHave a nice day.\r\n</P>\r\n"
confirmParkingLot: |
<H1>
Hello <%=in.name%>
</H1>
<P>
We reserved the parking lot nr. <%=in.selectedParkingLotNr%> for you.
</P>
<P>
Have a nice day.
</P>
declined: declined
parkingLotReservationHeader: Your parking lot has been reserved
procurementRequestNotification: "<H1>\r\nHello <%=in.requester.fullName%>\r\n</H1>\r\n<P>\r\nYour request has been <%=(in.accepted ? \"accepted\" : \"declined\")%>:\r\n</P>\r\n<P>\r\n<%=in.amount%> pieces of '<%=in.description%>' for a total of <%=in.totalPrice%> <%=ivy.cms.co(\"/Dialogs/procurementRequest/currencySymbol\"\
)%>\r\n</P>\r\n<P>\r\nKind regards\r\n</P>\r\n"
procurementRequestNotification: |
<H1>
Hello <%=in.requester.fullName%>
</H1>
<P>
Your request has been <%=(in.accepted ? "accepted" : "declined")%>:
</P>
<P>
<%=in.amount%> pieces of '<%=in.description%>' for a total of <%=in.totalPrice%> <%=ivy.cms.co("/Dialogs/procurementRequest/currencySymbol")%>
</P>
<P>
Kind regards
</P>
senderMail: [email protected]
welcomeHeader: Welcome
welcomeMail: "<H1>\r\nHello <%=in.name%>\r\n</H1>\r\n<P>\r\nWelcome at our company. It is a great pleasure to have you here!\r\n</P>\r\n<P>\r\nIf you have any question, please don't hesitate to contact your teamleader or your HR Manager.\r\n</P>\r\n<P>\r\nHave a nice day!\r\n</P>\r\n"
welcomeMail: |
<H1>
Hello <%=in.name%>
</H1>
<P>
Welcome at our company. It is a great pleasure to have you here!
</P>
<P>
If you have any question, please don't hesitate to contact your teamleader or your HR Manager.
</P>
<P>
Have a nice day!
</P>
yourRequestHasBeen: Your request has been
Labels:
AdhocWorkflow: Describe your Workflow
Expand All @@ -155,6 +190,23 @@ Labels:
InsertTheTask: Insert the task
TaskUser-Explain: Comma separated list of users
title: Self Service Ad-hoc Workflow
Notification:
Messages:
InvoiceSent: The invoice for order {0} was sent
OrderDelivered: Order {0} delivered to customer {1} {2}
OrderFinished: The order {0} successfully finished
business:
Templates:
Order:
Labels:
Customer: Customer
Greeting: Hello
Message: Message
Title: Order Information
web:
Subject: |-
<%= ivy.html.escape(message) %><br>
<%= ivy.cm.co("/Notification/business/Templates/Order/Labels/Customer") %> <i style="color:red;"><%= ivy.html.escape(payload.get("surname")) %> <%= ivy.html.escape(payload.get("name")) %> </i>
ProcessDescriptions:
AdHocDescription: 'Self Service Process: Launch an ad-hoc Workflow based on a predefined flow pattern.'
AdHocName: Ad-hoc Process
Expand Down Expand Up @@ -194,9 +246,21 @@ TaskDescriptions:
setupWorkstationDesc: 'Please set up the workstation for '
verifyRequest: Verify Request
Texts:
Adhoc-Explain: "<P>\r\n<B>Enter your comment </B>and press <B>Send</B> to proceed the workflow.\r\n</P>\r\n"
AdhocWF-Explain: "<P>\r\nDefine and launch a Workflow at your fingertip: Select a flow pattern, add some tasks and start the Workflow. \r\n</P>\r\n<P>\r\n\r\n</P>\r\n"
Approval-Explain: "<P>\r\n<B>Enter your decision</B> and press <B>Send </B>to proceed the workflow.\r\n</P>\r\n"
QA-Explain: "<P>\r\nAnswer the question and <B>Send </B>your answer back to the caller. \r\n</P>\r\n"
QAresponse-Explain: "<P>\r\nYou can <B>Send</B> back a follow-up question or <B>Finish</B> the Workflow.\r\n</P>\r\n"
ToDo-Explain: "<P>\r\nConfirm that the<B> TODO </B>is <B>Done</B> or decline it.\r\n</P>\r\n"
Adhoc-Explain: |
<P>
<B>Enter your comment </B>and press <B>Send</B> to proceed the workflow.
</P>
AdhocWF-Explain: "<P>\nDefine and launch a Workflow at your fingertip: Select a flow pattern, add some tasks and start the Workflow. \n</P>\n<P>\n\n</P>\n"
Approval-Explain: |
<P>
<B>Enter your decision</B> and press <B>Send </B>to proceed the workflow.
</P>
QA-Explain: "<P>\nAnswer the question and <B>Send </B>your answer back to the caller. \n</P>\n"
QAresponse-Explain: |
<P>
You can <B>Send</B> back a follow-up question or <B>Finish</B> the Workflow.
</P>
ToDo-Explain: |
<P>
Confirm that the<B> TODO </B>is <B>Done</B> or decline it.
</P>
12 changes: 12 additions & 0 deletions workflow/workflow-demos/config/roles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,16 @@
<identifier>Executive Manager</identifier>
</role>
</role>
<role>
<identifier>Order</identifier>
<role>
<identifier>Deliverer</identifier>
</role>
<role>
<identifier>Processor</identifier>
</role>
<role>
<identifier>Finance</identifier>
</role>
</role>
</role>
3 changes: 3 additions & 0 deletions workflow/workflow-demos/config/users.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
<role>IT Manager</role>
<role>Office Manager</role>
<role>Executive Manager</role>
<role>Processor</role>
</user>
<user>
<username>wt</username>
Expand All @@ -41,6 +42,7 @@
<fullName>James Bond</fullName>
<emailAddress>[email protected]</emailAddress>
<role>Office Manager</role>
<role>Deliverer</role>
</user>
<user>
<username>hf</username>
Expand All @@ -53,5 +55,6 @@
<fullName>Benjamin Franklin</fullName>
<emailAddress>[email protected]</emailAddress>
<role>Executive Manager</role>
<role>Finance</role>
</user>
</userConfig>
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Order #class
workflow.order #namespace
product String #field
product PERSISTENT #fieldModifier
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
OrderData #class
workflow.order #namespace
customer workflow.order.Person #field
customer PERSISTENT #fieldModifier
order workflow.order.Order #field
order PERSISTENT #fieldModifier
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Person #class
workflow.order #namespace
name String #field
name PERSISTENT #fieldModifier
surname String #field
surname PERSISTENT #fieldModifier
Loading
Loading