Skip to content

Commit 9320dd1

Browse files
cucusenokadamsaghy
authored andcommitted
FINEREACT-2404: Improved extensibility and cleanup
1 parent d269cb9 commit 9320dd1

File tree

12 files changed

+72
-45
lines changed

12 files changed

+72
-45
lines changed

fineract-accounting/src/main/java/org/apache/fineract/accounting/journalentry/serialization/JournalEntryCommandFromApiJsonDeserializer.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,22 @@
4545
*/
4646
@Component
4747
@RequiredArgsConstructor
48-
public final class JournalEntryCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer<JournalEntryCommand> {
48+
public class JournalEntryCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer<JournalEntryCommand> {
4949

5050
private final FromJsonHelper fromApiJsonHelper;
5151

52+
protected Set<String> getSupportedParameters() {
53+
return JournalEntryJsonInputParams.getAllValues();
54+
}
55+
5256
@Override
5357
public JournalEntryCommand commandFromApiJson(final String json) {
5458
if (StringUtils.isBlank(json)) {
5559
throw new InvalidJsonException();
5660
}
5761

5862
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
59-
final Set<String> supportedParameters = JournalEntryJsonInputParams.getAllValues();
63+
final Set<String> supportedParameters = this.getSupportedParameters();
6064
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
6165

6266
final JsonElement element = this.fromApiJsonHelper.parse(json);

fineract-core/src/main/java/org/apache/fineract/infrastructure/core/service/MDCWrapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,8 @@ public void put(String key, String val) {
3232
public void remove(String key) {
3333
MDC.remove(key);
3434
}
35+
36+
public String get(String key) {
37+
return MDC.get(key);
38+
}
3539
}

fineract-core/src/main/java/org/apache/fineract/infrastructure/event/external/jobs/SendAsynchronousEventsTasklet.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public RepeatStatus execute(StepContribution contribution, ChunkContext chunkCon
8686
return RepeatStatus.FINISHED;
8787
}
8888

89-
private boolean isDownstreamChannelEnabled() {
89+
protected boolean isDownstreamChannelEnabled() {
9090
return fineractProperties.getEvents().getExternal().getProducer().getJms().isEnabled()
9191
|| fineractProperties.getEvents().getExternal().getProducer().getKafka().isEnabled();
9292
}

fineract-core/src/main/java/org/apache/fineract/portfolio/savings/data/SavingsAccountTransactionData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
*/
5454
@Getter
5555
@JsonLocalDateArrayFormat
56-
public final class SavingsAccountTransactionData implements Serializable {
56+
public class SavingsAccountTransactionData implements Serializable {
5757

5858
private Long id;
5959
private final SavingsAccountTransactionEnumData transactionType;
@@ -110,7 +110,7 @@ public final class SavingsAccountTransactionData implements Serializable {
110110
private Long accountCredit;
111111
private Long accountDebit;
112112

113-
private SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType,
113+
protected SavingsAccountTransactionData(final Long id, final SavingsAccountTransactionEnumData transactionType,
114114
final PaymentDetailData paymentDetailData, final Long savingsId, final String savingsAccountNo, final LocalDate transactionDate,
115115
final CurrencyData currency, final BigDecimal amount, final BigDecimal outstandingChargeAmount, final BigDecimal runningBalance,
116116
final boolean reversed, final AccountTransferData transfer, final Collection<PaymentTypeData> paymentTypeOptions,

fineract-e2e-tests-core/src/test/java/org/apache/fineract/test/messaging/store/EventStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ public List<EventMessage<?>> getReceivedEvents() {
6868
return receivedEvents;
6969
}
7070

71-
void receive(byte[] message) throws Exception {
71+
public void receive(byte[] message) throws Exception {
7272
MessageV1 msgObject = MessageV1.fromByteBuffer(ByteBuffer.wrap(message));
7373
String type = msgObject.getType();
7474
String idempotencyKey = msgObject.getIdempotencyKey();

fineract-loan/src/main/java/org/apache/fineract/portfolio/loanaccount/domain/LoanAccrualActivityRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,11 @@
2020

2121
import java.time.LocalDate;
2222
import java.util.Set;
23+
import org.springframework.data.jpa.repository.JpaRepository;
2324
import org.springframework.data.jpa.repository.Query;
24-
import org.springframework.data.repository.Repository;
2525
import org.springframework.data.repository.query.Param;
2626

27-
public interface LoanAccrualActivityRepository extends Repository<Loan, Long> {
27+
public interface LoanAccrualActivityRepository extends JpaRepository<Loan, Long> {
2828

2929
@Query("select loan.id from Loan loan left join LoanTransaction lt on lt.loan = loan and lt.typeOf = :loanType and lt.reversed = false and lt.dateOf = :currentDate inner join LoanRepaymentScheduleInstallment rs on rs.loan = loan and rs.isDownPayment = false and rs.additional = false and rs.dueDate = :currentDate where loan.loanRepaymentScheduleDetail.enableAccrualActivityPosting = true and loan.loanStatus = :loanStatus and lt.id is null ")
3030
Set<Long> fetchLoanIdsForAccrualActivityPosting(@Param("currentDate") LocalDate currentDate,

fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/service/JournalEntryReadPlatformServiceImpl.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,11 +79,11 @@ public class JournalEntryReadPlatformServiceImpl implements JournalEntryReadPlat
7979
private final PaginationHelper paginationHelper;
8080
private final DatabaseSpecificSQLGenerator sqlGenerator;
8181

82-
private static final class GLJournalEntryMapper implements RowMapper<JournalEntryData> {
82+
protected static class GLJournalEntryMapper implements RowMapper<JournalEntryData> {
8383

8484
private final JournalEntryAssociationParametersData associationParametersData;
8585

86-
GLJournalEntryMapper(final JournalEntryAssociationParametersData associationParametersData) {
86+
protected GLJournalEntryMapper(final JournalEntryAssociationParametersData associationParametersData) {
8787
this.associationParametersData = Objects.requireNonNullElseGet(associationParametersData,
8888
JournalEntryAssociationParametersData::new);
8989
}
@@ -240,8 +240,7 @@ public Page<JournalEntryData> retrieveAll(final SearchParameters searchParameter
240240
final Boolean onlyManualEntries, final LocalDate fromDate, final LocalDate toDate, final LocalDate submittedOnDateFrom,
241241
final LocalDate submittedOnDateTo, final String transactionId, final Integer entityType,
242242
final JournalEntryAssociationParametersData associationParametersData) {
243-
244-
GLJournalEntryMapper rm = new GLJournalEntryMapper(associationParametersData);
243+
GLJournalEntryMapper rm = getGlJournalEntryMapper(associationParametersData);
245244
final StringBuilder sqlBuilder = new StringBuilder(200);
246245
sqlBuilder.append("select ").append(sqlGenerator.calcFoundRows()).append(" ");
247246
sqlBuilder.append(rm.schema());
@@ -383,12 +382,16 @@ public Page<JournalEntryData> retrieveAll(final SearchParameters searchParameter
383382
return this.paginationHelper.fetchPage(this.jdbcTemplate, sqlBuilder.toString(), finalObjectArray, rm);
384383
}
385384

385+
protected GLJournalEntryMapper getGlJournalEntryMapper(JournalEntryAssociationParametersData associationParametersData) {
386+
return new GLJournalEntryMapper(associationParametersData);
387+
}
388+
386389
@Override
387390
public JournalEntryData retrieveGLJournalEntryById(final long glJournalEntryId,
388391
JournalEntryAssociationParametersData associationParametersData) {
389392
try {
390393

391-
final GLJournalEntryMapper rm = new GLJournalEntryMapper(associationParametersData);
394+
final GLJournalEntryMapper rm = getGlJournalEntryMapper(associationParametersData);
392395
// Programmatic query, disable sonar issue
393396
final String sql = "select " + rm.schema() + " where journalEntry.id = ?";
394397

@@ -526,7 +529,7 @@ private Page<JournalEntryData> retrieveContraTransactions(final Long officeId, f
526529
public Page<JournalEntryData> retrieveJournalEntriesByEntityId(String transactionId, Long entityId, Integer entityType) {
527530
JournalEntryAssociationParametersData associationParametersData = new JournalEntryAssociationParametersData(true, true);
528531
try {
529-
final GLJournalEntryMapper rm = new GLJournalEntryMapper(associationParametersData);
532+
final GLJournalEntryMapper rm = getGlJournalEntryMapper(associationParametersData);
530533
final String sql = "select " + rm.schema()
531534
+ " where journalEntry.transaction_id = ? and journalEntry.entity_id = ? and journalEntry.entity_type_enum = ?";
532535
Object[] data = { transactionId, entityId, entityType };

fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/serialization/LoanTransactionValidatorImpl.java

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@
9898

9999
@Component("loanTransactionValidator")
100100
@AllArgsConstructor
101-
public final class LoanTransactionValidatorImpl implements LoanTransactionValidator {
101+
public class LoanTransactionValidatorImpl implements LoanTransactionValidator {
102102

103103
private final FromJsonHelper fromApiJsonHelper;
104104
private final LoanApplicationValidator fromApiJsonDeserializer;
@@ -245,7 +245,7 @@ public void validateDisbursement(JsonCommand command, boolean isAccountTransfer,
245245
});
246246
}
247247

248-
private void validateDisbursementWithPostDatedChecks(final String json, final Long loanId) {
248+
protected void validateDisbursementWithPostDatedChecks(final String json, final Long loanId) {
249249
final JsonElement jsonElement = this.fromApiJsonHelper.parse(json);
250250
final List<ApiParameterError> dataValidationErrors = new ArrayList<>();
251251
final DataValidatorBuilder baseDataValidator = new DataValidatorBuilder(dataValidationErrors).resource("loan.disbursement");
@@ -291,7 +291,7 @@ private void validateDisbursementWithPostDatedChecks(final String json, final Lo
291291
}
292292
}
293293

294-
private void validateDisbursementDateWithMeetingDate(final LocalDate actualDisbursementDate, final CalendarInstance calendarInstance,
294+
protected void validateDisbursementDateWithMeetingDate(final LocalDate actualDisbursementDate, final CalendarInstance calendarInstance,
295295
Boolean isSkipRepaymentOnFirstMonth, Integer numberOfDays) {
296296
if (null != calendarInstance) {
297297
final Calendar calendar = calendarInstance.getCalendar();
@@ -334,9 +334,7 @@ public void validateTransaction(final String json) {
334334
throw new InvalidJsonException();
335335
}
336336

337-
final Set<String> transactionParameters = new HashSet<>(Arrays.asList("transactionDate", "transactionAmount", "externalId", "note",
338-
"locale", "dateFormat", "paymentTypeId", "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber",
339-
LoanApiConstants.REVERSAL_EXTERNAL_ID_PARAMNAME));
337+
final Set<String> transactionParameters = getTransactionParametersForEdit();
340338

341339
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
342340
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, transactionParameters);
@@ -363,6 +361,12 @@ public void validateTransaction(final String json) {
363361
throwExceptionIfValidationWarningsExist(dataValidationErrors);
364362
}
365363

364+
protected HashSet<String> getTransactionParametersForEdit() {
365+
return new HashSet<>(Arrays.asList("transactionDate", "transactionAmount", "externalId", "note", "locale", "dateFormat",
366+
"paymentTypeId", "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber",
367+
LoanApiConstants.REVERSAL_EXTERNAL_ID_PARAMNAME));
368+
}
369+
366370
@Override
367371
public void validateChargebackTransaction(final String json) {
368372

@@ -405,8 +409,7 @@ public void validateTransactionWithNoAmount(final String json) {
405409
throw new InvalidJsonException();
406410
}
407411

408-
final Set<String> disbursementParameters = new HashSet<>(
409-
Arrays.asList("transactionDate", "note", "locale", "dateFormat", "writeoffReasonId", "externalId"));
412+
final Set<String> disbursementParameters = getNoAmountTransactionParameters();
410413

411414
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
412415
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, disbursementParameters);
@@ -427,6 +430,10 @@ public void validateTransactionWithNoAmount(final String json) {
427430
throwExceptionIfValidationWarningsExist(dataValidationErrors);
428431
}
429432

433+
protected Set<String> getNoAmountTransactionParameters() {
434+
return new HashSet<>(Arrays.asList("transactionDate", "note", "locale", "dateFormat", "writeoffReasonId", "externalId"));
435+
}
436+
430437
@Override
431438
public void validateChargeOffTransaction(final String json) {
432439
if (StringUtils.isBlank(json)) {
@@ -659,7 +666,7 @@ public void validateLoanGroupIsActive(final Loan loan) {
659666
}
660667
}
661668

662-
private void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATransaction(Loan loan, LocalDate transactionDate,
669+
protected void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATransaction(Loan loan, LocalDate transactionDate,
663670
String reversedOrCreated) {
664671
for (LoanTransaction txn : loan.getLoanTransactions()) {
665672
if (txn.isChargeRefund() && DateUtils.isBefore(transactionDate, txn.getTransactionDate())) {
@@ -671,7 +678,7 @@ private void validateLoanHasNoLaterChargeRefundTransactionToReverseOrCreateATran
671678
}
672679
}
673680

674-
private void validateLoanDisbursementIsBeforeTransactionDate(final Loan loan, final LocalDate transactionDate) {
681+
protected void validateLoanDisbursementIsBeforeTransactionDate(final Loan loan, final LocalDate transactionDate) {
675682
if (DateUtils.isBefore(transactionDate, loan.getDisbursementDate())) {
676683
final String errorMessage = "The transaction date cannot be before the loan disbursement date: "
677684
+ loan.getDisbursementDate().toString();
@@ -680,22 +687,22 @@ private void validateLoanDisbursementIsBeforeTransactionDate(final Loan loan, fi
680687
}
681688
}
682689

683-
private void validateTransactionShouldNotBeInTheFuture(final LocalDate transactionDate) {
690+
protected void validateTransactionShouldNotBeInTheFuture(final LocalDate transactionDate) {
684691
if (DateUtils.isDateInTheFuture(transactionDate)) {
685692
final String errorMessage = "The transaction date cannot be in the future.";
686693
throw new InvalidLoanStateTransitionException("transaction", "cannot.be.a.future.date", errorMessage, transactionDate);
687694
}
688695
}
689696

690-
private void validateLoanHasCurrency(final Loan loan) {
697+
protected void validateLoanHasCurrency(final Loan loan) {
691698
MonetaryCurrency currency = loan.getCurrency();
692699
final ApplicationCurrency defaultApplicationCurrency = this.applicationCurrencyRepository.findOneByCode(currency.getCode());
693700
if (defaultApplicationCurrency == null) {
694701
throw new CurrencyNotFoundException(currency.getCode());
695702
}
696703
}
697704

698-
private void validateClientOfficeJoiningDateIsBeforeTransactionDate(Loan loan, LocalDate transactionDate) {
705+
protected void validateClientOfficeJoiningDateIsBeforeTransactionDate(Loan loan, LocalDate transactionDate) {
699706
if (loan.getClient() != null && loan.getClient().getOfficeJoiningDate() != null) {
700707
final LocalDate clientOfficeJoiningDate = loan.getClient().getOfficeJoiningDate();
701708
if (DateUtils.isBefore(transactionDate, clientOfficeJoiningDate)) {
@@ -759,7 +766,7 @@ public void validateRepaymentDateIsOnHoliday(final LocalDate repaymentDate, fina
759766
}
760767
}
761768

762-
private void validateTransactionAmountNotExceedThresholdForMultiDisburseLoan(Loan loan) {
769+
protected void validateTransactionAmountNotExceedThresholdForMultiDisburseLoan(Loan loan) {
763770
if (loan.getLoanProduct().isMultiDisburseLoan()) {
764771
BigDecimal totalDisbursed = loan.getDisbursedAmount();
765772
BigDecimal totalPrincipalAdjusted = loan.getSummary().getTotalPrincipalAdjustments();
@@ -830,7 +837,7 @@ public void validateRefund(final Loan loan, LoanTransactionType loanTransactionT
830837
validateTransactionAmountNotExceedThresholdForMultiDisburseLoan(loan);
831838
}
832839

833-
private void validateRepaymentTypeTransactionNotBeforeAChargeRefund(final Loan loan, final LoanTransactionType loanTransactionType,
840+
protected void validateRepaymentTypeTransactionNotBeforeAChargeRefund(final Loan loan, final LoanTransactionType loanTransactionType,
834841
final LocalDate transactionDate) {
835842
if (loanTransactionType.isRepaymentType() && !loanTransactionType.isChargeRefund()) {
836843
for (LoanTransaction txn : loan.getLoanTransactions()) {
@@ -931,7 +938,7 @@ public void validateActivityNotBeforeClientOrGroupTransferDate(final Loan loan,
931938
return totalCollateral;
932939
}
933940

934-
private static @NonNull Set<String> getDisbursementParameters(boolean isAccountTransfer) {
941+
protected @NonNull Set<String> getDisbursementParameters(boolean isAccountTransfer) {
935942
Set<String> disbursementParameters;
936943

937944
if (isAccountTransfer) {
@@ -952,9 +959,7 @@ private void validatePaymentTransaction(String json) {
952959
throw new InvalidJsonException();
953960
}
954961

955-
final Set<String> transactionParameters = new HashSet<>(Arrays.asList("transactionDate", "transactionAmount", "externalId", "note",
956-
"locale", "dateFormat", "paymentTypeId", "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber",
957-
"loanId", "numberOfRepayments", "interestRefundCalculation"));
962+
final Set<String> transactionParameters = getRepaymentParameters();
958963

959964
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
960965
this.fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, transactionParameters);
@@ -976,6 +981,12 @@ private void validatePaymentTransaction(String json) {
976981
throwExceptionIfValidationWarningsExist(dataValidationErrors);
977982
}
978983

984+
protected Set<String> getRepaymentParameters() {
985+
return new HashSet<>(Arrays.asList("transactionDate", "transactionAmount", "externalId", "note", "locale", "dateFormat",
986+
"paymentTypeId", "accountNumber", "checkNumber", "routingCode", "receiptNumber", "bankNumber", "loanId",
987+
"numberOfRepayments", "interestRefundCalculation"));
988+
}
989+
979990
@Override
980991
public void validatePaymentDetails(final DataValidatorBuilder baseDataValidator, final JsonElement element) {
981992
// Validate all string payment detail fields for max length

0 commit comments

Comments
 (0)