瀏覽代碼

refactored to include rejections and clarifications

Grega Bremec 2 年之前
父節點
當前提交
facb7a53a1

+ 132 - 29
src/main/resources/com/redhat/training/claims/ClaimRuleFlow.bpmn

@@ -1,15 +1,20 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:bpsim="http://www.bpsim.org/schemas/1.0" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:drools="http://www.jboss.org/drools" id="_WXuWsNVbEDq3g_nKccKQ0w" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd http://www.bpsim.org/schemas/1.0 bpsim.xsd http://www.omg.org/spec/DD/20100524/DC DC.xsd http://www.omg.org/spec/DD/20100524/DI DI.xsd " exporter="jBPM Process Modeler" exporterVersion="2.0" targetNamespace="http://www.omg.org/bpmn20">
+<bpmn2:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn2="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:bpsim="http://www.bpsim.org/schemas/1.0" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:drools="http://www.jboss.org/drools" id="_M8l1MNWsEDqNXYTLd93myg" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd http://www.jboss.org/drools drools.xsd http://www.bpsim.org/schemas/1.0 bpsim.xsd http://www.omg.org/spec/DD/20100524/DC DC.xsd http://www.omg.org/spec/DD/20100524/DI DI.xsd " exporter="jBPM Process Modeler" exporterVersion="2.0" targetNamespace="http://www.omg.org/bpmn20">
   <bpmn2:itemDefinition id="_claimantItem" structureRef="com.redhat.training.claims.model.Claimant"/>
   <bpmn2:itemDefinition id="_claimItem" structureRef="com.redhat.training.claims.model.Claim"/>
   <bpmn2:itemDefinition id="_claimResultsItem" structureRef="com.redhat.training.claims.model.ClaimResults"/>
+  <bpmn2:itemDefinition id="_claimClarificationRequestsItem" structureRef="com.redhat.training.claims.model.ClaimClarificationRequests"/>
+  <bpmn2:itemDefinition id="_claimProcessingAbortedItem" structureRef="com.redhat.training.claims.model.ClaimProcessingAborted"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_namespaceInputXItem" structureRef="java.lang.String"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_modelInputXItem" structureRef="java.lang.String"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_decisionInputXItem" structureRef="java.lang.String"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimantInputXItem" structureRef="com.redhat.training.claims.model.Claimant"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimInputXItem" structureRef="com.redhat.training.claims.model.Claim"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsInputXItem" structureRef="com.redhat.training.claims.model.ClaimResults"/>
+  <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsInputXItem" structureRef="com.redhat.training.claims.model.ClaimClarificationRequests"/>
+  <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimProcAbortInputXItem" structureRef="com.redhat.training.claims.model.ClaimProcessingAborted"/>
   <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsOutputXItem" structureRef="com.redhat.training.claims.model.ClaimResults"/>
+  <bpmn2:itemDefinition id="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsOutputXItem" structureRef="com.redhat.training.claims.model.ClaimClarificationRequests"/>
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_SkippableInputXItem" structureRef="Object"/>
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_PriorityInputXItem" structureRef="Object"/>
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_CommentInputXItem" structureRef="Object"/>
@@ -22,16 +27,30 @@
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_NotCompletedReassignInputXItem" structureRef="Object"/>
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_NotStartedNotifyInputXItem" structureRef="Object"/>
   <bpmn2:itemDefinition id="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_NotCompletedNotifyInputXItem" structureRef="Object"/>
-  <bpmn2:collaboration id="_3AF1B1BD-FB3E-4C36-8212-D227DDCF7872" name="Default Collaboration">
-    <bpmn2:participant id="_D1CF98A8-E4C0-44B8-9435-5D47E2E5B98E" name="Pool Participant" processRef="claims.ClaimRuleFlow"/>
+  <bpmn2:collaboration id="_BDE719F9-EFA6-4EC5-B47D-D747F434D950" name="Default Collaboration">
+    <bpmn2:participant id="_77675508-89E8-4BF1-B7F3-6E1046128C86" name="Pool Participant" processRef="claims.ClaimRuleFlow"/>
   </bpmn2:collaboration>
   <bpmn2:process id="claims.ClaimRuleFlow" drools:packageName="com.redhat.training.claims" drools:version="1.0" drools:adHoc="false" name="ClaimRuleFlow" isExecutable="true" processType="Public">
     <bpmn2:property id="claimant" itemSubjectRef="_claimantItem" name="claimant"/>
     <bpmn2:property id="claim" itemSubjectRef="_claimItem" name="claim"/>
     <bpmn2:property id="claimResults" itemSubjectRef="_claimResultsItem" name="claimResults"/>
+    <bpmn2:property id="claimClarificationRequests" itemSubjectRef="_claimClarificationRequestsItem" name="claimClarificationRequests"/>
+    <bpmn2:property id="claimProcessingAborted" itemSubjectRef="_claimProcessingAbortedItem" name="claimProcessingAborted"/>
+    <bpmn2:sequenceFlow id="_A45EA022-B33F-4419-950F-314B8B4EA4D9" sourceRef="_C949CBF9-166E-4264-BE02-962E835A0C73" targetRef="_1FA071B5-3E70-42C1-8691-0653B167608A"/>
+    <bpmn2:sequenceFlow id="_86CF4723-CA1C-4E7A-8532-7618F57FF303" sourceRef="_DF5599B5-716E-436A-AB4F-735AFEABB424" targetRef="_C949CBF9-166E-4264-BE02-962E835A0C73">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" language="http://www.jboss.org/drools/rule"><![CDATA[exists ClaimProcessingAborted(reasons.size() > 0)]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
     <bpmn2:sequenceFlow id="_9C685875-6800-4B5D-AB22-12ECE1E58ED0" sourceRef="_E3C7932A-6597-47A4-9B3A-179EF25F38D6" targetRef="_9A005979-945D-487B-BD3C-207B325C4732"/>
-    <bpmn2:sequenceFlow id="_97F4B5CB-1DEC-4717-897E-847695EBE458" sourceRef="_6C623396-2499-4830-AAD0-D2C7469414DB" targetRef="_BD49B16F-21C9-42A0-ACEC-039DA99282C3"/>
-    <bpmn2:sequenceFlow id="_D862660E-26B4-4AF6-853D-B60287135DFB" sourceRef="_40A79752-23EE-4959-9C2C-FCF16AC32CAD" targetRef="_6C623396-2499-4830-AAD0-D2C7469414DB"/>
+    <bpmn2:sequenceFlow id="_2A60BF9E-0CBA-4D7C-B109-883F50E213C0" sourceRef="_6C623396-2499-4830-AAD0-D2C7469414DB" targetRef="_E3C7932A-6597-47A4-9B3A-179EF25F38D6">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" language="http://www.jboss.org/drools/rule"><![CDATA[exists ClaimClarificationRequests(requests.size > 0)]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="_97F4B5CB-1DEC-4717-897E-847695EBE458" sourceRef="_6C623396-2499-4830-AAD0-D2C7469414DB" targetRef="_BD49B16F-21C9-42A0-ACEC-039DA99282C3">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" language="http://www.jboss.org/drools/rule"><![CDATA[not ClaimClarificationRequests(requests.size > 0)]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="_6018778E-DA4F-4751-B950-10FBF9F2708B" sourceRef="_DF5599B5-716E-436A-AB4F-735AFEABB424" targetRef="_6C623396-2499-4830-AAD0-D2C7469414DB">
+      <bpmn2:conditionExpression xsi:type="bpmn2:tFormalExpression" language="http://www.jboss.org/drools/rule"><![CDATA[not  ClaimProcessingAborted(reasons.size() > 0)]]></bpmn2:conditionExpression>
+    </bpmn2:sequenceFlow>
+    <bpmn2:sequenceFlow id="_F08D6919-DFF8-41E5-ADDD-F7A1431A220B" sourceRef="_40A79752-23EE-4959-9C2C-FCF16AC32CAD" targetRef="_DF5599B5-716E-436A-AB4F-735AFEABB424"/>
     <bpmn2:sequenceFlow id="_4C4D5089-43DF-4F08-8570-3CFE2CBD9A6B" sourceRef="_9A005979-945D-487B-BD3C-207B325C4732" targetRef="_40A79752-23EE-4959-9C2C-FCF16AC32CAD">
       <bpmn2:extensionElements>
         <drools:metaData name="isAutoConnection.target">
@@ -47,6 +66,25 @@
         </drools:metaData>
       </bpmn2:extensionElements>
     </bpmn2:sequenceFlow>
+    <bpmn2:endEvent id="_1FA071B5-3E70-42C1-8691-0653B167608A">
+      <bpmn2:incoming>_A45EA022-B33F-4419-950F-314B8B4EA4D9</bpmn2:incoming>
+      <bpmn2:terminateEventDefinition/>
+    </bpmn2:endEvent>
+    <bpmn2:scriptTask id="_C949CBF9-166E-4264-BE02-962E835A0C73" name="Log Failure" scriptFormat="http://www.java.com/java">
+      <bpmn2:extensionElements>
+        <drools:metaData name="elementname">
+          <drools:metaValue><![CDATA[Log Failure]]></drools:metaValue>
+        </drools:metaData>
+      </bpmn2:extensionElements>
+      <bpmn2:incoming>_86CF4723-CA1C-4E7A-8532-7618F57FF303</bpmn2:incoming>
+      <bpmn2:outgoing>_A45EA022-B33F-4419-950F-314B8B4EA4D9</bpmn2:outgoing>
+      <bpmn2:script>System.out.println("Terminating process due to rejections.");</bpmn2:script>
+    </bpmn2:scriptTask>
+    <bpmn2:parallelGateway id="_DF5599B5-716E-436A-AB4F-735AFEABB424" gatewayDirection="Diverging">
+      <bpmn2:incoming>_F08D6919-DFF8-41E5-ADDD-F7A1431A220B</bpmn2:incoming>
+      <bpmn2:outgoing>_6018778E-DA4F-4751-B950-10FBF9F2708B</bpmn2:outgoing>
+      <bpmn2:outgoing>_86CF4723-CA1C-4E7A-8532-7618F57FF303</bpmn2:outgoing>
+    </bpmn2:parallelGateway>
     <bpmn2:exclusiveGateway id="_9A005979-945D-487B-BD3C-207B325C4732" gatewayDirection="Converging">
       <bpmn2:incoming>_5B0B8901-C6B0-40A6-B5FF-706CCBD455C6</bpmn2:incoming>
       <bpmn2:incoming>_9C685875-6800-4B5D-AB22-12ECE1E58ED0</bpmn2:incoming>
@@ -58,6 +96,7 @@
           <drools:metaValue><![CDATA[Provide Clarifications]]></drools:metaValue>
         </drools:metaData>
       </bpmn2:extensionElements>
+      <bpmn2:incoming>_2A60BF9E-0CBA-4D7C-B109-883F50E213C0</bpmn2:incoming>
       <bpmn2:outgoing>_9C685875-6800-4B5D-AB22-12ECE1E58ED0</bpmn2:outgoing>
       <bpmn2:ioSpecification>
         <bpmn2:dataInput id="_E3C7932A-6597-47A4-9B3A-179EF25F38D6_TaskNameInputX" drools:dtype="Object" itemSubjectRef="__E3C7932A-6597-47A4-9B3A-179EF25F38D6_TaskNameInputXItem" name="TaskName"/>
@@ -93,8 +132,9 @@
       <bpmn2:script>System.out.println("Registering facts with session.");</bpmn2:script>
     </bpmn2:scriptTask>
     <bpmn2:exclusiveGateway id="_6C623396-2499-4830-AAD0-D2C7469414DB" gatewayDirection="Diverging">
-      <bpmn2:incoming>_D862660E-26B4-4AF6-853D-B60287135DFB</bpmn2:incoming>
+      <bpmn2:incoming>_6018778E-DA4F-4751-B950-10FBF9F2708B</bpmn2:incoming>
       <bpmn2:outgoing>_97F4B5CB-1DEC-4717-897E-847695EBE458</bpmn2:outgoing>
+      <bpmn2:outgoing>_2A60BF9E-0CBA-4D7C-B109-883F50E213C0</bpmn2:outgoing>
     </bpmn2:exclusiveGateway>
     <bpmn2:businessRuleTask id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD" drools:ruleFlowGroup="sanity" name="Sanity Checks" implementation="http://www.jboss.org/drools/rule">
       <bpmn2:extensionElements>
@@ -103,19 +143,25 @@
         </drools:metaData>
       </bpmn2:extensionElements>
       <bpmn2:incoming>_4C4D5089-43DF-4F08-8570-3CFE2CBD9A6B</bpmn2:incoming>
-      <bpmn2:outgoing>_D862660E-26B4-4AF6-853D-B60287135DFB</bpmn2:outgoing>
+      <bpmn2:outgoing>_F08D6919-DFF8-41E5-ADDD-F7A1431A220B</bpmn2:outgoing>
       <bpmn2:ioSpecification>
         <bpmn2:dataInput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimantInputX" drools:dtype="com.redhat.training.claims.model.Claimant" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimantInputXItem" name="tClaimant"/>
         <bpmn2:dataInput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimInputX" drools:dtype="com.redhat.training.claims.model.Claim" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimInputXItem" name="tClaim"/>
         <bpmn2:dataInput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsInputX" drools:dtype="com.redhat.training.claims.model.ClaimResults" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsInputXItem" name="tClaimResults"/>
+        <bpmn2:dataInput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsInputX" drools:dtype="com.redhat.training.claims.model.ClaimClarificationRequests" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsInputXItem" name="tClaimClarificationReqs"/>
+        <bpmn2:dataInput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimProcAbortInputX" drools:dtype="com.redhat.training.claims.model.ClaimProcessingAborted" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimProcAbortInputXItem" name="tClaimProcAbort"/>
         <bpmn2:dataOutput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsOutputX" drools:dtype="com.redhat.training.claims.model.ClaimResults" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsOutputXItem" name="tClaimResults"/>
+        <bpmn2:dataOutput id="_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsOutputX" drools:dtype="com.redhat.training.claims.model.ClaimClarificationRequests" itemSubjectRef="__40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsOutputXItem" name="tClaimClarificationReqs"/>
         <bpmn2:inputSet>
           <bpmn2:dataInputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimantInputX</bpmn2:dataInputRefs>
           <bpmn2:dataInputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimInputX</bpmn2:dataInputRefs>
           <bpmn2:dataInputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsInputX</bpmn2:dataInputRefs>
+          <bpmn2:dataInputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsInputX</bpmn2:dataInputRefs>
+          <bpmn2:dataInputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimProcAbortInputX</bpmn2:dataInputRefs>
         </bpmn2:inputSet>
         <bpmn2:outputSet>
           <bpmn2:dataOutputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsOutputX</bpmn2:dataOutputRefs>
+          <bpmn2:dataOutputRefs>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsOutputX</bpmn2:dataOutputRefs>
         </bpmn2:outputSet>
       </bpmn2:ioSpecification>
       <bpmn2:dataInputAssociation>
@@ -130,10 +176,22 @@
         <bpmn2:sourceRef>claimResults</bpmn2:sourceRef>
         <bpmn2:targetRef>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsInputX</bpmn2:targetRef>
       </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>claimClarificationRequests</bpmn2:sourceRef>
+        <bpmn2:targetRef>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
+      <bpmn2:dataInputAssociation>
+        <bpmn2:sourceRef>claimProcessingAborted</bpmn2:sourceRef>
+        <bpmn2:targetRef>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimProcAbortInputX</bpmn2:targetRef>
+      </bpmn2:dataInputAssociation>
       <bpmn2:dataOutputAssociation>
         <bpmn2:sourceRef>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimResultsOutputX</bpmn2:sourceRef>
         <bpmn2:targetRef>claimResults</bpmn2:targetRef>
       </bpmn2:dataOutputAssociation>
+      <bpmn2:dataOutputAssociation>
+        <bpmn2:sourceRef>_40A79752-23EE-4959-9C2C-FCF16AC32CAD_tClaimClarificationReqsOutputX</bpmn2:sourceRef>
+        <bpmn2:targetRef>claimClarificationRequests</bpmn2:targetRef>
+      </bpmn2:dataOutputAssociation>
     </bpmn2:businessRuleTask>
     <bpmn2:startEvent id="_69928F5A-82C2-45EE-9DE1-E54DC9C81260">
       <bpmn2:outgoing>_5B0B8901-C6B0-40A6-B5FF-706CCBD455C6</bpmn2:outgoing>
@@ -145,49 +203,74 @@
   <bpmndi:BPMNDiagram>
     <bpmndi:BPMNPlane bpmnElement="claims.ClaimRuleFlow">
       <bpmndi:BPMNShape id="shape__006D4A8C-DF0F-4342-BB59-9A722B80462B" bpmnElement="_006D4A8C-DF0F-4342-BB59-9A722B80462B">
-        <dc:Bounds height="56" width="56" x="820" y="99"/>
+        <dc:Bounds height="56" width="56" x="990" y="243"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__69928F5A-82C2-45EE-9DE1-E54DC9C81260" bpmnElement="_69928F5A-82C2-45EE-9DE1-E54DC9C81260">
-        <dc:Bounds height="56" width="56" x="51" y="99"/>
+        <dc:Bounds height="56" width="56" x="39" y="243"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__40A79752-23EE-4959-9C2C-FCF16AC32CAD" bpmnElement="_40A79752-23EE-4959-9C2C-FCF16AC32CAD">
-        <dc:Bounds height="102" width="154" x="275" y="76"/>
+        <dc:Bounds height="102" width="154" x="263" y="220"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__6C623396-2499-4830-AAD0-D2C7469414DB" bpmnElement="_6C623396-2499-4830-AAD0-D2C7469414DB">
-        <dc:Bounds height="56" width="56" x="484" y="99"/>
+        <dc:Bounds height="56" width="56" x="654" y="243"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__BD49B16F-21C9-42A0-ACEC-039DA99282C3" bpmnElement="_BD49B16F-21C9-42A0-ACEC-039DA99282C3">
-        <dc:Bounds height="102" width="154" x="603" y="76"/>
+        <dc:Bounds height="102" width="154" x="773" y="220"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__E3C7932A-6597-47A4-9B3A-179EF25F38D6" bpmnElement="_E3C7932A-6597-47A4-9B3A-179EF25F38D6">
-        <dc:Bounds height="102" width="154" x="275" y="255"/>
+        <dc:Bounds height="102" width="154" x="263" y="399"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="shape__9A005979-945D-487B-BD3C-207B325C4732" bpmnElement="_9A005979-945D-487B-BD3C-207B325C4732">
-        <dc:Bounds height="56" width="56" x="163" y="99"/>
+        <dc:Bounds height="56" width="56" x="151" y="243"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape__DF5599B5-716E-436A-AB4F-735AFEABB424" bpmnElement="_DF5599B5-716E-436A-AB4F-735AFEABB424">
+        <dc:Bounds height="56" width="56" x="497" y="243"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape__C949CBF9-166E-4264-BE02-962E835A0C73" bpmnElement="_C949CBF9-166E-4264-BE02-962E835A0C73">
+        <dc:Bounds height="102" width="154" x="448" y="86"/>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="shape__1FA071B5-3E70-42C1-8691-0653B167608A" bpmnElement="_1FA071B5-3E70-42C1-8691-0653B167608A">
+        <dc:Bounds height="56" width="56" x="682" y="109"/>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="edge_shape__BD49B16F-21C9-42A0-ACEC-039DA99282C3_to_shape__006D4A8C-DF0F-4342-BB59-9A722B80462B" bpmnElement="_6FFB03BF-7A48-4B42-82D8-98D055337563">
-        <di:waypoint x="680" y="127"/>
-        <di:waypoint x="820" y="127"/>
+        <di:waypoint x="850" y="271"/>
+        <di:waypoint x="990" y="271"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge_shape__69928F5A-82C2-45EE-9DE1-E54DC9C81260_to_shape__9A005979-945D-487B-BD3C-207B325C4732" bpmnElement="_5B0B8901-C6B0-40A6-B5FF-706CCBD455C6">
-        <di:waypoint x="107" y="127"/>
-        <di:waypoint x="163" y="127"/>
+        <di:waypoint x="95" y="271"/>
+        <di:waypoint x="151" y="271"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge_shape__9A005979-945D-487B-BD3C-207B325C4732_to_shape__40A79752-23EE-4959-9C2C-FCF16AC32CAD" bpmnElement="_4C4D5089-43DF-4F08-8570-3CFE2CBD9A6B">
-        <di:waypoint x="191" y="127"/>
-        <di:waypoint x="275" y="127"/>
+        <di:waypoint x="179" y="271"/>
+        <di:waypoint x="263" y="271"/>
       </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="edge_shape__40A79752-23EE-4959-9C2C-FCF16AC32CAD_to_shape__6C623396-2499-4830-AAD0-D2C7469414DB" bpmnElement="_D862660E-26B4-4AF6-853D-B60287135DFB">
-        <di:waypoint x="429" y="127"/>
-        <di:waypoint x="484" y="127"/>
+      <bpmndi:BPMNEdge id="edge_shape__40A79752-23EE-4959-9C2C-FCF16AC32CAD_to_shape__DF5599B5-716E-436A-AB4F-735AFEABB424" bpmnElement="_F08D6919-DFF8-41E5-ADDD-F7A1431A220B">
+        <di:waypoint x="417" y="271"/>
+        <di:waypoint x="497" y="271"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge_shape__DF5599B5-716E-436A-AB4F-735AFEABB424_to_shape__6C623396-2499-4830-AAD0-D2C7469414DB" bpmnElement="_6018778E-DA4F-4751-B950-10FBF9F2708B">
+        <di:waypoint x="525" y="271"/>
+        <di:waypoint x="654" y="271"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge_shape__6C623396-2499-4830-AAD0-D2C7469414DB_to_shape__BD49B16F-21C9-42A0-ACEC-039DA99282C3" bpmnElement="_97F4B5CB-1DEC-4717-897E-847695EBE458">
-        <di:waypoint x="540" y="127"/>
-        <di:waypoint x="603" y="127"/>
+        <di:waypoint x="710" y="271"/>
+        <di:waypoint x="773" y="271"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge_shape__6C623396-2499-4830-AAD0-D2C7469414DB_to_shape__E3C7932A-6597-47A4-9B3A-179EF25F38D6" bpmnElement="_2A60BF9E-0CBA-4D7C-B109-883F50E213C0">
+        <di:waypoint x="682" y="299"/>
+        <di:waypoint x="417" y="450"/>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="edge_shape__E3C7932A-6597-47A4-9B3A-179EF25F38D6_to_shape__9A005979-945D-487B-BD3C-207B325C4732" bpmnElement="_9C685875-6800-4B5D-AB22-12ECE1E58ED0">
-        <di:waypoint x="275" y="306"/>
-        <di:waypoint x="191" y="155"/>
+        <di:waypoint x="263" y="450"/>
+        <di:waypoint x="179" y="299"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge_shape__DF5599B5-716E-436A-AB4F-735AFEABB424_to_shape__C949CBF9-166E-4264-BE02-962E835A0C73" bpmnElement="_86CF4723-CA1C-4E7A-8532-7618F57FF303">
+        <di:waypoint x="525" y="243"/>
+        <di:waypoint x="525" y="188"/>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="edge_shape__C949CBF9-166E-4264-BE02-962E835A0C73_to_shape__1FA071B5-3E70-42C1-8691-0653B167608A" bpmnElement="_A45EA022-B33F-4419-950F-314B8B4EA4D9">
+        <di:waypoint x="525" y="137"/>
+        <di:waypoint x="710" y="137"/>
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
@@ -263,10 +346,30 @@
               </bpsim:UnitCost>
             </bpsim:CostParameters>
           </bpsim:ElementParameters>
+          <bpsim:ElementParameters elementRef="_C949CBF9-166E-4264-BE02-962E835A0C73">
+            <bpsim:TimeParameters>
+              <bpsim:ProcessingTime>
+                <bpsim:NormalDistribution mean="0" standardDeviation="0"/>
+              </bpsim:ProcessingTime>
+            </bpsim:TimeParameters>
+            <bpsim:ResourceParameters>
+              <bpsim:Availability>
+                <bpsim:FloatingParameter value="0"/>
+              </bpsim:Availability>
+              <bpsim:Quantity>
+                <bpsim:FloatingParameter value="0"/>
+              </bpsim:Quantity>
+            </bpsim:ResourceParameters>
+            <bpsim:CostParameters>
+              <bpsim:UnitCost>
+                <bpsim:FloatingParameter value="0"/>
+              </bpsim:UnitCost>
+            </bpsim:CostParameters>
+          </bpsim:ElementParameters>
         </bpsim:Scenario>
       </bpsim:BPSimData>
     </bpmn2:extensionElements>
-    <bpmn2:source>_WXuWsNVbEDq3g_nKccKQ0w</bpmn2:source>
-    <bpmn2:target>_WXuWsNVbEDq3g_nKccKQ0w</bpmn2:target>
+    <bpmn2:source>_M8l1MNWsEDqNXYTLd93myg</bpmn2:source>
+    <bpmn2:target>_M8l1MNWsEDqNXYTLd93myg</bpmn2:target>
   </bpmn2:relationship>
 </bpmn2:definitions>

+ 114 - 13
src/main/resources/com/redhat/training/claims/sanity.drl

@@ -6,6 +6,15 @@ query "Get ClaimResults"
     cr: ClaimResults()
 end
 
+query "Get ClaimClarificationRequests"
+    ccr: ClaimClarificationRequests()
+end
+
+query "Get ClaimProcessingAborted"
+    cpa: ClaimProcessingAborted()
+end
+
+/* Add control facts. */
 rule "Create a ClaimResults for each Claim without one"
 ruleflow-group "sanity"
 salience 1000000
@@ -13,27 +22,36 @@ when
     c: Claim()
     not ClaimResults(claimId == c.getId())
 then
-    ClaimResults r = new ClaimResults();
-    r.setClaimId(c.getId());
+    ClaimResults r = new ClaimResults(c.getId());
     insert(r);
     System.out.println("Created ClaimResults for " + c.getId());
 end
 
-rule "Check whether Claimant is not Involved"
+rule "Create a ClaimClarificationRequests for each Claim without one"
 ruleflow-group "sanity"
+salience 1000000
 when
-    claimant: Claimant()
-    claim: Claim(!(involvedPersons contains claimant))
-    Claimant(this == claimant, claims contains claim)
-    r: ClaimResults(claimId == claim.getId())
+    c: Claim()
+    not ClaimClarificationRequests(claimId == c.getId())
 then
-    r.setApproved(false);
-    r.getReasons().add("Can't file claim on behalf of someone else.");
-    update(r);
-    System.out.println("Claimant " + claimant.getName() + " not involved " +
-                        "in claim " + claim.getId() + "!");
+    ClaimClarificationRequests r = new ClaimClarificationRequests(c.getId());
+    insert(r);
+    System.out.println("Created ClaimClarificationRequests for " + c.getId());
+end
+
+rule "Create a ClaimProcessingAborted for each Claim without one"
+ruleflow-group "sanity"
+salience 1000000
+when
+    c: Claim()
+    not ClaimProcessingAborted(claimId == c.getId())
+then
+    ClaimProcessingAborted cpa = new ClaimProcessingAborted(c.getId());
+    insert(cpa);
+    System.out.println("Created ClaimProcessingAborted for " + c.getId());
 end
 
+/* Successful score. */
 rule "Check that Claimant is Involved"
 ruleflow-group "sanity"
 when
@@ -43,7 +61,90 @@ when
     r: ClaimResults(claimId == claim.getId())
 then
     r.getReasons().add("Claim owner properly listed as involved.");
-    update(r);
+    r.bumpScore(1);
+    // update(r);
     System.out.println("Claimant " + claimant.getName() + " is involved " +
                         "in claim " + claim.getId() + "!");
 end
+
+/* Abort processing. */
+rule "Check whether Claimant is not Involved"
+ruleflow-group "sanity"
+when
+    claimant: Claimant()
+    claim: Claim(!(involvedPersons contains claimant))
+    Claimant(this == claimant, claims contains claim)
+    cpa: ClaimProcessingAborted(claimId == claim.getId())
+then
+    cpa.getReasons().add("Can't file claim on behalf of someone else.");
+    update(cpa);
+    System.out.println("FATAL: Claimant " + claimant.getName() + " not involved " +
+                        "in claim " + claim.getId() + "!");
+end
+
+/* Ask for clarifications. */
+rule "Check that there is a reason for the Claim"
+ruleflow-group "sanity"
+when
+    claim: Claim(reason == null || reason == "")
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then   
+    req.getRequests().add("reason for the claim");
+    update(req);
+    System.out.println("No reason for " + claim.getId() + "!");
+end
+
+rule "Check that there is a date for the event of the Claim"
+ruleflow-group "sanity"
+when
+    claim: Claim(dateOfEvent == null)
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then   
+    req.getRequests().add("date of event for the claim");
+    update(req);
+    System.out.println("No event date for " + claim.getId() + "!");
+end
+
+rule "Check that there is a date for filing of the Claim"
+ruleflow-group "sanity"
+when
+    claim: Claim(dateFiled == null)
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then   
+    req.getRequests().add("date of filing the claim");
+    update(req);
+    System.out.println("No filing date for " + claim.getId() + "!");
+end
+
+rule "Check that there is a Claim amount"
+ruleflow-group "sanity"
+when
+    claim: Claim(amount == 0.0)
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then
+    req.getRequests().add("an amount to claim");
+    update(req);
+    System.out.println("No amount for " + claim.getId() + "!");
+end
+
+rule "Check that there is a vehicle involved in the Claim"
+ruleflow-group "sanity"
+when
+    claim: Claim(vehicle == null)
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then
+    req.getRequests().add("vehicle involved");
+    update(req);
+    System.out.println("No vehicle for " + claim.getId() + "!");
+end
+
+rule "Check that there is at least one person involved in the Claim"
+ruleflow-group "sanity"
+when
+    claim: Claim(involvedPersons == null || involvedPersons.size() == 0)
+    req: ClaimClarificationRequests(claimId == claim.getId())
+then   
+    req.getRequests().add("person(s) involved in the claim");
+    update(req);
+    System.out.println("No persons involved in " + claim.getId() + "!");
+end

+ 33 - 5
src/test/java/com/redhat/training/claims/ClaimantInvolvedTest.java

@@ -1,12 +1,12 @@
 package com.redhat.training.claims;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 
 import com.redhat.training.claims.model.Claim;
+import com.redhat.training.claims.model.ClaimProcessingAborted;
 import com.redhat.training.claims.model.ClaimResults;
 import com.redhat.training.claims.model.Claimant;
 import com.redhat.training.claims.model.Gender;
@@ -24,8 +24,12 @@ public class ClaimantInvolvedTest extends ClaimsTestSupport {
         session.fireAllRules();
 
         ArrayList<ClaimResults> crs = this.getClaimResults();
+        ArrayList<ClaimProcessingAborted> cpas = this.getClaimProcessingAborted();
 
+        // must succeed
         assertEquals("Unexpected number of claim results", 1, crs.size());
+        assertEquals("Unexpected number of claim rejections", 1, cpas.size());
+        assertEquals("No rejection expected", 0, cpas.get(0).getReasons().size());
         assertTrue("Expected reason not in claim result", crs.get(0).getReasons().contains("Claim owner properly listed as involved."));
 
         System.out.println("Finished assertions for testClaimantInvolved.");
@@ -41,10 +45,12 @@ public class ClaimantInvolvedTest extends ClaimsTestSupport {
         session.fireAllRules();
 
         ArrayList<ClaimResults> crs = this.getClaimResults();
+        ArrayList<ClaimProcessingAborted> cpas = this.getClaimProcessingAborted();
 
         assertEquals("Unexpected number of claim results", 1, crs.size());
-        assertFalse("Expected a rejected Claim", crs.get(0).isApproved());
-        assertTrue("Expected reason not in claim result", crs.get(0).getReasons().contains("Can't file claim on behalf of someone else."));
+        assertEquals("Unexpected number of claim rejections", 1, cpas.size());
+        assertEquals("Rejection expected", 1, cpas.get(0).getReasons().size());
+        assertTrue("Expected reason not in claim result", cpas.get(0).getReasons().contains("Can't file claim on behalf of someone else."));
 
         System.out.println("Finished assertions for testClaimantNotInvolved.");
     }
@@ -59,10 +65,12 @@ public class ClaimantInvolvedTest extends ClaimsTestSupport {
         session.fireAllRules();
 
         ArrayList<ClaimResults> crs = this.getClaimResults();
+        ArrayList<ClaimProcessingAborted> cpas = this.getClaimProcessingAborted();
 
         assertEquals("Unexpected number of claim results", 1, crs.size());
-        assertFalse("Expected a rejected Claim", crs.get(0).isApproved());
-        assertTrue("Expected reason not in claim result", crs.get(0).getReasons().contains("Can't file claim on behalf of someone else."));
+        assertEquals("Unexpected number of claim rejections", 1, cpas.size());
+        assertEquals("Rejection expected", 1, cpas.get(0).getReasons().size());
+        assertTrue("Expected reason not in claim result", cpas.get(0).getReasons().contains("Can't file claim on behalf of someone else."));
 
         System.out.println("Finished assertions for testClaimantNotInvolvedLowAmount.");
     }
@@ -97,8 +105,21 @@ public class ClaimantInvolvedTest extends ClaimsTestSupport {
         session.fireAllRules();
 
         ArrayList<ClaimResults> crs = this.getClaimResults();
+        ArrayList<ClaimProcessingAborted> cpas = this.getClaimProcessingAborted();
 
         assertEquals("Unexpected number of claim results", 2, crs.size());
+        assertEquals("Unexpected number of claim rejections", 2, cpas.size());
+
+        for (ClaimProcessingAborted cpa : cpas) {
+            // Expect cl1 to NOT be rejected.
+            if (cpa.getClaimId() == cl1.getId()) {
+                assertEquals("No rejection expected for Claim " + cl1.getId(), 0, cpa.getReasons().size());
+            }
+            // Expect cl2 to BE rejected.
+            if (cpa.getClaimId() == cl2.getId()) {
+                assertEquals("Rejection expected for Claim " + cl2.getId(), 1, cpa.getReasons().size());
+            }
+        }
 
         System.out.println("Finished assertions for testMultipleClaimsOneClaimant.");
     }
@@ -114,8 +135,15 @@ public class ClaimantInvolvedTest extends ClaimsTestSupport {
         session.fireAllRules();
 
         ArrayList<ClaimResults> crs = this.getClaimResults();
+        ArrayList<ClaimProcessingAborted> cpas = this.getClaimProcessingAborted();
 
         assertEquals("Unexpected number of claim results", 2, crs.size());
+        assertEquals("Unexpected number of claim rejections", 2, cpas.size());
+
+        for (ClaimProcessingAborted cpa : cpas) {
+            // Expect NO claim to be rejected.
+            assertEquals("No rejection expected for Claim " + cpa.getClaimId(), 0, cpa.getReasons().size());
+        }
 
         System.out.println("Finished assertions for testMultipleClaimsMultiClaimants.");
     }

+ 22 - 0
src/test/java/com/redhat/training/claims/ClaimsTestSupport.java

@@ -3,6 +3,8 @@ package com.redhat.training.claims;
 import java.util.ArrayList;
 
 import com.redhat.training.claims.model.Claim;
+import com.redhat.training.claims.model.ClaimClarificationRequests;
+import com.redhat.training.claims.model.ClaimProcessingAborted;
 import com.redhat.training.claims.model.ClaimResults;
 import com.redhat.training.claims.model.Claimant;
 import com.redhat.training.claims.model.Gender;
@@ -75,4 +77,24 @@ public class ClaimsTestSupport {
         }
         return crs;
     }
+
+    public ArrayList<ClaimClarificationRequests> getClaimClarificationRequests() {
+        ArrayList<ClaimClarificationRequests> ccrs = new ArrayList<>();
+        QueryResults qr = session.getQueryResults("Get ClaimClarificationRequests");
+        for (QueryResultsRow qrr : qr) {
+            ClaimClarificationRequests ccr = (ClaimClarificationRequests)qrr.get("ccr");
+            ccrs.add(ccr);
+        }
+        return ccrs;
+    }
+
+    public ArrayList<ClaimProcessingAborted> getClaimProcessingAborted() {
+        ArrayList<ClaimProcessingAborted> cpas = new ArrayList<>();
+        QueryResults qr = session.getQueryResults("Get ClaimProcessingAborted");
+        for (QueryResultsRow qrr : qr) {
+            ClaimProcessingAborted cpa = (ClaimProcessingAborted)qrr.get("cpa");
+            cpas.add(cpa);
+        }
+        return cpas;
+    }
 }

+ 16 - 7
src/test/java/com/redhat/training/claims/ProcessSanityCheckTest.java

@@ -6,15 +6,18 @@ import static org.junit.Assert.assertTrue;
 import java.util.HashMap;
 
 import com.redhat.training.claims.model.Claim;
+import com.redhat.training.claims.model.ClaimClarificationRequests;
+import com.redhat.training.claims.model.ClaimProcessingAborted;
 import com.redhat.training.claims.model.ClaimResults;
 import com.redhat.training.claims.model.Claimant;
 import com.redhat.training.claims.model.Gender;
 
 import org.junit.Test;
+import org.kie.api.runtime.process.ProcessInstance;
 
 public class ProcessSanityCheckTest extends ClaimsTestSupport {
     @Test
-    public void testSanityChecksValidClaim() {
+    public void testSanityChecksInvalidClaimAborted() {
         Claimant c = new Claimant();
         c.setName("Tom Jones");
         c.setGender(Gender.MALE);
@@ -23,21 +26,27 @@ public class ProcessSanityCheckTest extends ClaimsTestSupport {
         cl.setId(234);
         cl.setAmount(500.00);
         cl.setReason("Test 123");
-        cl.getInvolvedPersons().add(c);
+        // cl.getInvolvedPersons().add(c);
 
         c.getClaims().add(cl);
 
-        ClaimResults cr = new ClaimResults();
-        cr.setClaimId(cl.getId());
+        ClaimResults cr = new ClaimResults(cl.getId());
+        ClaimClarificationRequests ccr = new ClaimClarificationRequests(cl.getId());
+        ClaimProcessingAborted cpa = new ClaimProcessingAborted(cl.getId());
 
         HashMap<String, Object> params = new HashMap<>();
         params.put("claimant", c);
         params.put("claim", cl);
         params.put("claimResults", cr);
-        this.session.startProcess("claims.ClaimRuleFlow", params);
+        params.put("claimClarificationRequests", ccr);
+        params.put("claimProcessingAborted", cpa);
+        ProcessInstance pi = this.session.startProcess("claims.ClaimRuleFlow", params);
         this.session.fireAllRules();
 
-        assertTrue("Incorrect number of ClaimResults reasons", cr.getReasons().size() == 1);
-        assertEquals("Claim owner properly listed as involved.", cr.getReasons().get(0));
+        assertEquals("Process instance not Completed", ProcessInstance.STATE_COMPLETED, pi.getState());
+        assertEquals("Unexpected number of claim result reasons", 1, cr.getReasons().size());
+        assertEquals("Unexpected number of claim rejection reasons", 1, cpa.getReasons().size());
+        assertTrue("Expected reason not in claim result", cr.getReasons().contains("Claim amount too small to bother."));
+        assertTrue("Expected reason not in claim rejection", cpa.getReasons().contains("Can't file claim on behalf of someone else."));
     }
 }