33import org .apache .camel .Exchange ;
44import org .apache .camel .support .DefaultExchange ;
55import org .mifos .processor .bulk .camel .routes .RouteId ;
6+ import org .mifos .processor .bulk .schema .Transaction ;
67import org .springframework .stereotype .Component ;
78
9+ import java .util .List ;
810import java .util .Map ;
11+ import java .util .Set ;
12+ import java .util .HashSet ;
13+ import java .util .Objects ;
914
1015import static org .mifos .processor .bulk .camel .config .CamelProperties .SERVER_FILE_NAME ;
16+ import static org .mifos .processor .bulk .camel .config .CamelProperties .TRANSACTION_LIST ;
1117import static org .mifos .processor .bulk .zeebe .ZeebeVariables .*;
1218
1319@ Component
@@ -26,26 +32,83 @@ public void setup() {
2632 newWorker (Worker .ORDERING , (client , job ) -> {
2733 logger .debug ("Job '{}' started from process '{}' with key {}" , job .getType (), job .getBpmnProcessId (), job .getKey ());
2834 Map <String , Object > variables = job .getVariablesAsMap ();
35+ Exchange exchange = new DefaultExchange (camelContext );
36+
2937 if (workerConfig .isOrderingWorkerEnabled ) {
3038 variables .put (ORDERING_FAILED , false );
39+ String filename = (String ) variables .get (FILE_NAME );
40+ exchange .setProperty (SERVER_FILE_NAME , filename );
41+
42+ try {
43+ sendToCamelRoute (RouteId .ORDERING , exchange );
44+ assert !exchange .getProperty (ORDERING_FAILED , Boolean .class );
45+ } catch (Exception e ) {
46+ variables .put (ORDERING_FAILED , true );
47+ }
48+ variables .put (ORDERING_FAILED , false );
49+ variables .put (ORDERED_BY , exchange .getProperty (ORDERED_BY ));
3150 }
3251
33- String filename = (String ) variables .get (FILE_NAME );
34- Exchange exchange = new DefaultExchange (camelContext );
35- exchange .setProperty (SERVER_FILE_NAME , filename );
52+ if (workerConfig .isTransactionDeduplicationEnabled ){
53+ List <Transaction > transactionList = exchange .getProperty (TRANSACTION_LIST , List .class );
54+ removeDuplicates (transactionList , workerConfig .isOrderingWorkerEnabled );
55+ variables .put (TRANSACTION_LIST , transactionList );
56+ }
57+ client .newCompleteCommand (job .getKey ()).variables (variables ).send ();
58+ });
59+ }
60+
61+ private void removeDuplicates (List <Transaction > transactionList , boolean orderingEnabled ){
62+ if (orderingEnabled ){
63+ removeDuplicatesIfOrderingEnabled (transactionList );
64+ return ;
65+ }
66+ removeDuplicatesIfOrderingDisabled (transactionList );
67+ }
68+
69+ private void removeDuplicatesIfOrderingEnabled (List <Transaction > transactionList ){
3670
37- try {
38- sendToCamelRoute (RouteId .ORDERING , exchange );
39- assert !exchange .getProperty (ORDERING_FAILED , Boolean .class );
40- } catch (Exception e ) {
41- variables .put (ORDERING_FAILED , true );
71+ for (int i = 0 ; i <transactionList .size ()-1 ; i ++) {
72+ Transaction currentTransaction = transactionList .get (i );
73+ Transaction nextTransaction = transactionList .get (i + 1 );
74+
75+ if (currentTransaction == null || nextTransaction == null ) {
76+ continue ;
77+ }
78+ String currentPayeeDetail = fetchPayeeDetail (currentTransaction );
79+ String nextPayeeDetail = fetchPayeeDetail (nextTransaction );
80+
81+ if (currentPayeeDetail .equals (nextPayeeDetail )) {
82+ currentTransaction .setNote ("Duplicate transaction." );
4283 }
84+ }
85+ }
4386
44- variables . put ( ORDERING_FAILED , false );
45- variables . put ( ORDERED_BY , exchange . getProperty ( ORDERED_BY ) );
87+ private void removeDuplicatesIfOrderingDisabled ( List < Transaction > transactionList ){
88+ Set < String > set = new HashSet <>( );
4689
47- client .newCompleteCommand (job .getKey ()).variables (variables ).send ();
48- });
90+ if (Objects .isNull (transactionList )){
91+ return ;
92+ }
93+
94+ for (Transaction transaction : transactionList ){
95+ String payeeDetail = fetchPayeeDetail (transaction );
96+ if (set .contains (payeeDetail )){
97+ transaction .setNote ("Duplicate transaction." );
98+ }
99+ else {
100+ set .add (payeeDetail );
101+ }
102+ }
103+ }
104+
105+ private String fetchPayeeDetail (Transaction transaction ){
106+ String payeeIdentifier = transaction .getPayeeIdentifier ();
107+ String payeeIdentifierType = transaction .getPayeeIdentifierType ();
108+ String amount = transaction .getAmount ();
109+ String currency = transaction .getCurrency ();
110+
111+ return String .format ("%s%s%s%s" , payeeIdentifier , payeeIdentifierType , amount , currency );
49112 }
50113
51114}
0 commit comments