diff --git a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepository.java b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepository.java index bc75e3ab..10164486 100644 --- a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepository.java +++ b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepository.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import org.cardanofoundation.lob.app.accounting_reporting_core.domain.core.LedgerDispatchStatus; +import org.cardanofoundation.lob.app.accounting_reporting_core.domain.core.TxItemValidationStatus; import org.cardanofoundation.lob.app.accounting_reporting_core.domain.entity.TransactionItemEntity; @Slf4j @@ -25,13 +26,13 @@ public class TransactionItemExtractionRepository { private final EntityManager em; - public List findByItemAccount(LocalDate dateFrom, LocalDate dateTo, List accountCode, List costCenter, List project) { + public List findByItemAccount(LocalDate dateFrom, LocalDate dateTo, List accountCode, List costCenter, List project, List accountType, List accountSubType) { String jpql = STR.""" SELECT ti FROM accounting_reporting_core.TransactionItemEntity ti INNER JOIN ti.transaction te """; String where = STR.""" WHERE te.entryDate >= :dateFrom AND te.entryDate <= :dateTo - AND ti.amountFcy <> 0 + AND ti.status = '\{TxItemValidationStatus.OK}' """; if (null != accountCode && 0 < accountCode.stream().count()) { @@ -39,6 +40,23 @@ public List findByItemAccount(LocalDate dateFrom, LocalDa AND (ti.accountDebit.code in (\{accountCode.stream().map(code -> "'" + code + "'").collect(Collectors.joining(","))}) or ti.accountCredit.code in (\{accountCode.stream().map(code -> "'" + code + "'").collect(Collectors.joining(","))})) """; } + if (null != accountSubType && 0 < accountSubType.stream().count()) { + where += STR.""" + AND ( + ti.accountDebit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (\{accountSubType.stream().map(code -> "" + code + "").collect(Collectors.joining(","))})) or + ti.accountCredit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (\{accountSubType.stream().map(code -> "" + code + "").collect(Collectors.joining(","))})) + ) + """; + } + + if (null != accountType && 0 < accountType.stream().count()) { + where += STR.""" + AND ( + ti.accountDebit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (select id from OrganisationChartOfAccountSubType where type.id in (\{accountType.stream().map(code -> "" + code + "").collect(Collectors.joining(","))}))) or + ti.accountCredit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (select id from OrganisationChartOfAccountSubType where type.id in (\{accountType.stream().map(code -> "" + code + "").collect(Collectors.joining(","))}))) + ) + """; + } if (null != costCenter && 0 < costCenter.stream().count()) { where += STR.""" @@ -76,7 +94,7 @@ public List findByItemAccountDate(String orgId, LocalDate String where = STR.""" WHERE te.entryDate >= :dateFrom AND te.entryDate <= :dateTo AND te.organisation.id = '\{orgId}' - AND ti.amountFcy <> 0 + AND ti.status = '\{TxItemValidationStatus.OK}' """; if (!event.isEmpty()) { diff --git a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/ExtractionController.java b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/ExtractionController.java index a1c7e8bc..706035d8 100644 --- a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/ExtractionController.java +++ b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/ExtractionController.java @@ -45,7 +45,7 @@ public class ExtractionController { public ResponseEntity transactionSearch(@Valid @RequestBody ExtractionTransactionsRequest transactionsRequest) { return ResponseEntity .ok() - .body(extractionItemService.findTransactionItems(transactionsRequest.getDateFrom(), transactionsRequest.getDateTo(), transactionsRequest.getAccountCode(), transactionsRequest.getCostCenter(), transactionsRequest.getProject())); + .body(extractionItemService.findTransactionItems(transactionsRequest.getDateFrom(), transactionsRequest.getDateTo(), transactionsRequest.getAccountCode(), transactionsRequest.getCostCenter(), transactionsRequest.getProject(),transactionsRequest.getAccountType(),transactionsRequest.getAccountSubType())); } diff --git a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemService.java b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemService.java index fbeca997..8c11f10a 100644 --- a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemService.java +++ b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemService.java @@ -30,9 +30,9 @@ public class ExtractionItemService { private final TransactionItemExtractionRepository transactionItemRepositoryImpl; @Transactional(readOnly = true) - public ExtractionTransactionView findTransactionItems(LocalDate dateFrom, LocalDate dateTo, List accountCode, List costCenter, List project) { + public ExtractionTransactionView findTransactionItems(LocalDate dateFrom, LocalDate dateTo, List accountCode, List costCenter, List project, List accountType, List accountSubType) { - List transactionItem = transactionItemRepositoryImpl.findByItemAccount(dateFrom, dateTo, accountCode, costCenter, project).stream().map(this::extractionTransactionItemViewBuilder).collect(Collectors.toList()); + List transactionItem = transactionItemRepositoryImpl.findByItemAccount(dateFrom, dateTo, accountCode, costCenter, project,accountType,accountSubType).stream().map(this::extractionTransactionItemViewBuilder).collect(Collectors.toList()); return ExtractionTransactionView.createSuccess(transactionItem); } diff --git a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/requests/ExtractionTransactionsRequest.java b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/requests/ExtractionTransactionsRequest.java index 1e34e373..129c34b6 100644 --- a/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/requests/ExtractionTransactionsRequest.java +++ b/accounting_reporting_core/src/main/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/requests/ExtractionTransactionsRequest.java @@ -36,6 +36,14 @@ public class ExtractionTransactionsRequest { @Nullable private List accountCode; + @ArraySchema(arraySchema = @Schema(example = "[\"2\",\"3\"]")) + @Nullable + private List accountType; + + @ArraySchema(arraySchema = @Schema(example = "[\"1\",\"4\"]")) + @Nullable + private List accountSubType; + @ArraySchema(arraySchema = @Schema(example = "[\"4300\",\"5400\"]")) @Nullable private List costCenter; diff --git a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepositoryTest.java b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepositoryTest.java index 49bdc687..ca0c6702 100644 --- a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepositoryTest.java +++ b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/repository/TransactionItemExtractionRepositoryTest.java @@ -31,8 +31,16 @@ void findByItemAccountOnlyDates() { String query = """ SELECT ti FROM accounting_reporting_core.TransactionItemEntity ti INNER JOIN ti.transaction te WHERE te.entryDate >= :dateFrom AND te.entryDate <= :dateTo - AND ti.amountFcy <> 0 + AND ti.status = 'OK' AND (ti.accountDebit.code in ('AccountCode') or ti.accountCredit.code in ('AccountCode')) + AND ( + ti.accountDebit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (accountSubType)) or + ti.accountCredit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (accountSubType)) + ) + AND ( + ti.accountDebit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (select id from OrganisationChartOfAccountSubType where type.id in (accountType))) or + ti.accountCredit.code in (select Id.customerCode from OrganisationChartOfAccount where subType.id in (select id from OrganisationChartOfAccountSubType where type.id in (accountType))) + ) AND ti.costCenter.externalCustomerCode in ('CostCenterCode') AND ti.project.customerCode in ('ProjectCode') AND te.ledgerDispatchStatus = 'FINALIZED' @@ -46,7 +54,9 @@ AND ti.project.customerCode in ('ProjectCode') LocalDate.of(2023, Month.JANUARY, 31), List.of("AccountCode"), List.of("CostCenterCode"), - List.of("ProjectCode") + List.of("ProjectCode"), + List.of("accountType"), + List.of("accountSubType") ); Mockito.verify(em, Mockito.times(1)).createQuery(query); } @@ -61,11 +71,11 @@ void findByItemAccountDate() { "OrgId", LocalDate.of(2023, Month.JANUARY, 1), LocalDate.of(2023, Month.JANUARY, 31), - Set.of("EventCode2","EventCode1"), - Set.of("Currency2","Currency1"), + Set.of("EventCode2", "EventCode1"), + Set.of("Currency2", "Currency1"), Optional.of(BigDecimal.valueOf(100)), Optional.of(BigDecimal.valueOf(1000)), - Set.of("TheHast2","TheHast1") + Set.of("TheHast2", "TheHast1") ); Mockito.verify(em, Mockito.times(1)).createQuery(anyString()); } diff --git a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemServiceTest.java b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemServiceTest.java index 08075a53..624a3511 100644 --- a/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemServiceTest.java +++ b/accounting_reporting_core/src/test/java/org/cardanofoundation/lob/app/accounting_reporting_core/resource/presentation_layer_service/ExtractionItemServiceTest.java @@ -52,10 +52,10 @@ void findTransactionItemsTest() { item1.setTransaction(tx); - Mockito.when(transactionItemExtractionRepository.findByItemAccount(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(List.of(item1)); + Mockito.when(transactionItemExtractionRepository.findByItemAccount(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any())).thenReturn(List.of(item1)); ExtractionItemService extractionItemService = new ExtractionItemService(transactionItemExtractionRepository); - ExtractionTransactionView result = extractionItemService.findTransactionItems(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); + ExtractionTransactionView result = extractionItemService.findTransactionItems(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()); assertInstanceOf(ExtractionTransactionView.class, result); assertEquals(1L, result.getTotal()); verifyNoMoreInteractions(transactionItemExtractionRepository);