Skip to content

Commit f0875dc

Browse files
authored
Merge pull request #471 from Backbase/hotfix/added_config_with_startOffsetInDays_payment_order
Added ExecutionDateFrom filter in payment order based on configuration
2 parents d1bb2f0 + a411161 commit f0875dc

File tree

4 files changed

+110
-22
lines changed

4 files changed

+110
-22
lines changed

CHANGELOG.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
# Changelog
22
All notable changes to this project will be documented in this file.
33

4+
## [4.1.9](https://github.com/Backbase/stream-services/compare/4.1.9...4.1.9)
5+
### Changed.
6+
- Adding configuration to filter payments by ExecutionDateFrom based in offset period days
7+
48
## [4.1.8](https://github.com/Backbase/stream-services/compare/4.1.7...4.1.8)
59
### Changed.
610
- Adding ingestion mode support for batch product groups
@@ -12,11 +16,11 @@ All notable changes to this project will be documented in this file.
1216
## [4.1.6](https://github.com/Backbase/stream-services/compare/4.1.4...4.1.6)
1317
### Fix
1418
- Fix arrangements being retrieved per payment order instead of once per payment order ingestion request.
15-
-
19+
1620
## [4.1.4](https://github.com/Backbase/stream-services/compare/4.1.3...4.1.4)
1721
### Fix
1822
- Fixed deletion of non-repository custom data-group items on data-group update
19-
-
23+
2024
## [4.1.3](https://github.com/Backbase/stream-services/compare/4.1.3...4.1.4)
2125
### Changed
2226
- Query for existing payments by using arrangement IDs instead of user IDs. This will eliminate duplicate payments from being ingested when joint owners are added.

stream-payment-order/payment-order-core/src/main/java/com/backbase/stream/config/PaymentOrderTypeConfiguration.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ public class PaymentOrderTypeConfiguration {
1515

1616
@NotNull
1717
private List<String> types;
18+
19+
private Long startOffsetInDays;
1820
}

stream-payment-order/payment-order-core/src/main/java/com/backbase/stream/paymentorder/PaymentOrderUnitOfWorkExecutor.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.backbase.dbs.paymentorder.api.service.v2.model.Status;
2424
import java.math.BigDecimal;
2525
import java.time.Duration;
26+
import java.time.LocalDate;
2627
import com.backbase.dbs.paymentorder.api.service.v2.model.AccessFilter;
2728
import com.backbase.stream.config.PaymentOrderTypeConfiguration;
2829
import java.util.*;
@@ -236,20 +237,21 @@ private record DBSPaymentOrderPageResult(int next, int total, List<GetPaymentOrd
236237
}
237238

238239
private Mono<List<GetPaymentOrderResponse>> pullFromDBS(final @NotNull List<String> arrangementIds) {
239-
return defer(() -> retrieveNextPage(0, arrangementIds)
240+
LocalDate startDate = paymentOrderTypeConfiguration.getStartOffsetInDays() != null ? LocalDate.now().minusDays(paymentOrderTypeConfiguration.getStartOffsetInDays()) : null;
241+
return defer(() -> retrieveNextPage(0, arrangementIds, startDate)
240242
.expand(page -> {
241243
// If there are no more pages, return an empty flux.
242244
if (page.next >= page.total || page.requests.isEmpty()) {
243245
return empty();
244246
} else {
245-
return retrieveNextPage(page.next, arrangementIds);
247+
return retrieveNextPage(page.next, arrangementIds, startDate);
246248
}
247249
}))
248250
.collectList()
249251
.map(pages -> pages.stream().flatMap(page -> page.requests.stream()).toList());
250252
}
251253

252-
private Mono<DBSPaymentOrderPageResult> retrieveNextPage(int currentCount, final @NotNull List<String> arrangementIds) {
254+
private Mono<DBSPaymentOrderPageResult> retrieveNextPage(int currentCount, final @NotNull List<String> arrangementIds, LocalDate executionDateFrom) {
253255
List<String> paymentTypes = paymentOrderTypeConfiguration.getTypes();
254256
var paymentOrderPostFilterRequest = new PaymentOrderPostFilterRequest();
255257
List<AccessFilter> accessFilters = paymentTypes.stream()
@@ -260,7 +262,7 @@ private Mono<DBSPaymentOrderPageResult> retrieveNextPage(int currentCount, final
260262
paymentOrderPostFilterRequest.setAccessFilters(accessFilters);
261263
paymentOrderPostFilterRequest.setStatuses(FILTER);
262264

263-
return paymentOrdersApi.postFilterPaymentOrders(null, null, null, null, null, null, null, null,
265+
return paymentOrdersApi.postFilterPaymentOrders(null, null, null, executionDateFrom, null, null, null, null,
264266
null, null, null, null, null, null, currentCount / PAGE_SIZE, PAGE_SIZE, null,
265267
null, paymentOrderPostFilterRequest)
266268
.retryWhen(fixedDelay(3, Duration.of(2000, MILLIS)).filter(

stream-payment-order/payment-order-core/src/test/java/com/backbase/stream/task/PaymentOrderUnitOfWorkExecutorTest.java

Lines changed: 96 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,23 @@
11
package com.backbase.stream.task;
22

33
import static org.mockito.ArgumentMatchers.any;
4-
import static org.mockito.Mockito.atLeastOnce;
4+
import static org.mockito.ArgumentMatchers.eq;
55
import static org.mockito.Mockito.doReturn;
6-
import static org.mockito.Mockito.verify;
76
import static org.mockito.Mockito.lenient;
8-
7+
import java.math.BigDecimal;
8+
import java.time.LocalDate;
9+
import java.util.ArrayList;
10+
import java.util.List;
11+
import org.apache.commons.lang3.StringUtils;
12+
import org.junit.jupiter.api.Assertions;
13+
import org.junit.jupiter.api.BeforeEach;
14+
import org.junit.jupiter.api.Test;
15+
import org.junit.jupiter.api.extension.ExtendWith;
16+
import org.mockito.ArgumentCaptor;
17+
import org.mockito.Captor;
18+
import org.mockito.Mock;
19+
import org.mockito.Mockito;
20+
import org.mockito.junit.jupiter.MockitoExtension;
921
import com.backbase.dbs.arrangement.api.service.v2.ArrangementsApi;
1022
import com.backbase.dbs.arrangement.api.service.v2.model.AccountArrangementItem;
1123
import com.backbase.dbs.arrangement.api.service.v2.model.AccountArrangementItems;
@@ -24,23 +36,10 @@
2436
import com.backbase.stream.paymentorder.PaymentOrderUnitOfWorkExecutor;
2537
import com.backbase.stream.worker.model.UnitOfWork;
2638
import com.backbase.stream.worker.repository.UnitOfWorkRepository;
27-
import java.math.BigDecimal;
28-
29-
import java.util.ArrayList;
30-
import org.apache.commons.lang3.StringUtils;
31-
import org.junit.jupiter.api.Assertions;
32-
import org.junit.jupiter.api.BeforeEach;
33-
import org.junit.jupiter.api.Test;
34-
import org.junit.jupiter.api.extension.ExtendWith;
35-
import org.mockito.Mock;
36-
import org.mockito.Mockito;
37-
import org.mockito.junit.jupiter.MockitoExtension;
3839
import reactor.core.publisher.Flux;
3940
import reactor.core.publisher.Mono;
4041
import reactor.test.StepVerifier;
4142

42-
import java.util.List;
43-
4443
@ExtendWith(MockitoExtension.class)
4544
public class PaymentOrderUnitOfWorkExecutorTest extends PaymentOrderBaseTest {
4645

@@ -53,6 +52,9 @@ public class PaymentOrderUnitOfWorkExecutorTest extends PaymentOrderBaseTest {
5352
@Mock
5453
private UnitOfWorkRepository<PaymentOrderTask, String> repository;
5554

55+
@Captor
56+
ArgumentCaptor<LocalDate> fromDateCaptor;
57+
5658
private PaymentOrderTypeConfiguration paymentOrderTypeConfiguration = new PaymentOrderTypeConfiguration();
5759

5860
private final PaymentOrderTaskExecutor streamTaskExecutor = new PaymentOrderTaskExecutor(paymentOrdersApi);
@@ -145,7 +147,85 @@ void test_prepareUnitOfWork_paymentOrderPostRequestFlux() {
145147
})
146148
.verifyComplete();
147149
}
150+
151+
@Test
152+
void test_prepareUnitOfWork_paymentOrderWithStartDateOffset() {
153+
paymentOrderTypeConfiguration.setStartOffsetInDays(30l);
154+
Flux<PaymentOrderPostRequest> paymentOrderPostRequestFlux = Flux.fromIterable(paymentOrderPostRequest);
155+
156+
PaymentOrderPostResponse paymentOrderPostResponse = new PaymentOrderPostResponse()
157+
.id("po_post_resp_id")
158+
.putAdditionsItem("key", "val");
159+
160+
lenient().when(paymentOrdersApi.postPaymentOrder(any()))
161+
.thenReturn(Mono.just(paymentOrderPostResponse));
162+
163+
GetPaymentOrderResponse getPaymentOrderResponse = new GetPaymentOrderResponse()
164+
.id("arrangementId_1")
165+
.bankReferenceId("bankReferenceId_1");
166+
PaymentOrderPostFilterResponse paymentOrderPostFilterResponse = new PaymentOrderPostFilterResponse()
167+
.addPaymentOrdersItem(getPaymentOrderResponse)
168+
.totalElements(new BigDecimal(1));
169+
doReturn(Mono.just(paymentOrderPostFilterResponse)).when(paymentOrdersApi).postFilterPaymentOrders(any(), any(), any(), fromDateCaptor.capture(), any(),any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
170+
171+
AccountArrangementItem accountArrangementItem = new AccountArrangementItem()
172+
.id("arrangementId_1")
173+
.externalArrangementId("externalArrangementId_1");
174+
AccountArrangementItems accountArrangementItems = new AccountArrangementItems()
175+
.addArrangementElementsItem(accountArrangementItem);
176+
177+
Mockito.when(arrangementsApi.postFilter(Mockito.any()))
178+
.thenReturn(Mono.just(accountArrangementItems));
179+
180+
StepVerifier.create(paymentOrderUnitOfWorkExecutor.prepareUnitOfWork(paymentOrderPostRequestFlux))
181+
.assertNext(unitOfWork -> {
182+
Assertions.assertTrue(unitOfWork.getUnitOfOWorkId().startsWith("payment-orders-mixed-"));
183+
Assertions.assertEquals(UnitOfWork.State.NEW, unitOfWork.getState());
184+
Assertions.assertEquals(1, unitOfWork.getStreamTasks().size());
185+
Assertions.assertEquals(paymentOrderPostRequest.size(), unitOfWork.getStreamTasks().get(0).getData().size());
186+
Assertions.assertEquals(LocalDate.now().minusDays(30), fromDateCaptor.getValue());
187+
})
188+
.verifyComplete();
189+
}
190+
191+
@Test
192+
void test_prepareUnitOfWork_paymentOrderWithoutStartDateOffset() {
193+
Flux<PaymentOrderPostRequest> paymentOrderPostRequestFlux = Flux.fromIterable(paymentOrderPostRequest);
194+
195+
PaymentOrderPostResponse paymentOrderPostResponse = new PaymentOrderPostResponse()
196+
.id("po_post_resp_id")
197+
.putAdditionsItem("key", "val");
198+
199+
lenient().when(paymentOrdersApi.postPaymentOrder(any()))
200+
.thenReturn(Mono.just(paymentOrderPostResponse));
201+
202+
GetPaymentOrderResponse getPaymentOrderResponse = new GetPaymentOrderResponse()
203+
.id("arrangementId_1")
204+
.bankReferenceId("bankReferenceId_1");
205+
PaymentOrderPostFilterResponse paymentOrderPostFilterResponse = new PaymentOrderPostFilterResponse()
206+
.addPaymentOrdersItem(getPaymentOrderResponse)
207+
.totalElements(new BigDecimal(1));
208+
doReturn(Mono.just(paymentOrderPostFilterResponse)).when(paymentOrdersApi).postFilterPaymentOrders(any(), any(), any(), fromDateCaptor.capture(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any());
209+
210+
AccountArrangementItem accountArrangementItem = new AccountArrangementItem()
211+
.id("arrangementId_1")
212+
.externalArrangementId("externalArrangementId_1");
213+
AccountArrangementItems accountArrangementItems = new AccountArrangementItems()
214+
.addArrangementElementsItem(accountArrangementItem);
148215

216+
Mockito.when(arrangementsApi.postFilter(Mockito.any()))
217+
.thenReturn(Mono.just(accountArrangementItems));
218+
219+
StepVerifier.create(paymentOrderUnitOfWorkExecutor.prepareUnitOfWork(paymentOrderPostRequestFlux))
220+
.assertNext(unitOfWork -> {
221+
Assertions.assertTrue(unitOfWork.getUnitOfOWorkId().startsWith("payment-orders-mixed-"));
222+
Assertions.assertEquals(UnitOfWork.State.NEW, unitOfWork.getState());
223+
Assertions.assertEquals(1, unitOfWork.getStreamTasks().size());
224+
Assertions.assertEquals(paymentOrderPostRequest.size(), unitOfWork.getStreamTasks().get(0).getData().size());
225+
Assertions.assertNull(fromDateCaptor.getValue());
226+
})
227+
.verifyComplete();
228+
}
149229
@Test
150230
void test_prepareunitofwork_blankuserid() {
151231

0 commit comments

Comments
 (0)