mariiaKraievska commented on code in PR #6542:
URL: https://github.com/apache/fineract/pull/6542#discussion_r4258242359
##########
fineract-working-capital-loan/src/main/java/org/apache/fineract/portfolio/workingcapitalloan/service/WorkingCapitalLoanWritePlatformServiceImpl.java:
##########
@@ -813,6 +814,179 @@ public CommandProcessingResult undoTransaction(final Long
loanId, final Long tra
};
}
+ @Override
+ public CommandProcessingResult adjustByDeltaTransaction(final Long loanId,
final Long transactionId, final JsonCommand command) {
+ final WorkingCapitalLoan loan =
loanRepository.findById(loanId).orElseThrow(() -> new
WorkingCapitalLoanNotFoundException(loanId));
+ final WorkingCapitalLoanTransaction transaction =
transactionRepository.findByIdAndWcLoan_Id(transactionId, loanId)
+ .orElseThrow(() -> new
PlatformApiDataValidationException("validation.msg.wc.loan.transaction.not.found",
+ "Working capital loan transaction not found",
WorkingCapitalLoanConstants.transactionIdParamName));
+
+ return switch (transaction.getTypeOf()) {
+ case REPAYMENT, GOODWILL_CREDIT, CHARGE_ADJUSTMENT, PAYOUT_REFUND
->
+ adjustByDeltaRepaymentLikeTransaction(loan, transaction,
command);
+ default -> throw new
PlatformApiDataValidationException("validation.msg.wc.loan.transaction.adjust.not.supported",
+ "Adjust is not supported for transaction type " +
transaction.getTypeOf(),
+ WorkingCapitalLoanConstants.transactionTypeParamName);
+ };
+ }
+
+ private CommandProcessingResult
adjustByDeltaRepaymentLikeTransaction(final WorkingCapitalLoan loan,
+ final WorkingCapitalLoanTransaction transactionToAdjust, final
JsonCommand command) {
+ this.validator.validateAdjustByDelta(command, loan,
transactionToAdjust);
+
+ final BigDecimal deltaAmount =
this.fromApiJsonHelper.extractBigDecimalNamed(WorkingCapitalLoanConstants.transactionAmountParamName,
+ command.parsedJson(), new HashSet<>());
+ final BigDecimal newTransactionAmount =
transactionToAdjust.getTransactionAmount().add(deltaAmount);
+
+ final Map<String, Object> changes = new LinkedHashMap<>();
+ changes.put("adjustByDelta", true);
+
+ return adjustRepaymentLikeTransaction(loan, transactionToAdjust,
newTransactionAmount, command, changes);
+ }
+
+ private CommandProcessingResult
adjustRepaymentLikeTransaction(WorkingCapitalLoan loan,
+ WorkingCapitalLoanTransaction transactionToAdjust, BigDecimal
newTransactionAmount, JsonCommand command,
+ final Map<String, Object> changes) {
+ final LocalDate businessLocalDate = DateUtils.getBusinessLocalDate();
+ final LoanStatus oldStatus = loan.getStatus();
+
+ ExternalId reversalExternalId = externalIdFactory
+
.create(command.stringValueOfParameterNamedAllowingNull(WorkingCapitalLoanConstants.reversalExternalIdParamName));
+
+ final boolean isReverseOnly =
newTransactionAmount.compareTo(BigDecimal.ZERO) == 0;
+
+ final WorkingCapitalLoanTransaction newTransaction = !isReverseOnly
+ ? resolveNewTransaction(loan, transactionToAdjust,
newTransactionAmount, command, changes)
+ : null;
+
+ if (isReverseOnly) {
+ changes.put("reversed", true);
+ changes.put("reversedOnDate", businessLocalDate);
+ propagateChangesByTransaction(transactionToAdjust, changes);
+ }
+
+ transactionToAdjust.setReversed(true);
+ transactionToAdjust.setReversalExternalId(reversalExternalId);
+ transactionToAdjust.setReversedOnDate(businessLocalDate);
+
+ processUndoTransaction(loan, transactionToAdjust);
+
+ if (!isReverseOnly) {
+
+ saveNewTransactionRelation(newTransaction, transactionToAdjust,
LoanTransactionRelationTypeEnum.REPLAYED);
+
+ propagateChangesByTransaction(newTransaction, changes);
+ changes.put("adjustedTransaction",
propagateChangesByTransaction(transactionToAdjust, new HashMap<>()));
+
+ transactionProcessor.processRepaymentLikeTransaction(loan,
newTransaction, newTransaction.getTransactionDate(),
+ newTransactionAmount);
+ }
+
+ changes.put("status", loan.getLoanStatus());
+ handleNote(loan, command, changes);
+
+ this.loanRepository.saveAndFlush(loan);
+
+ if (isReverseOnly) {
+ adjustTransactionEventPublisher.publishReversal(loan.getId(),
transactionToAdjust);
+ } else {
+ adjustTransactionEventPublisher.publishAdjustment(loan.getId(),
transactionToAdjust, newTransaction);
+ }
+ notifyBalanceChanged(loan);
+ notifyStatusChanged(loan, oldStatus);
+
+ Long entityId = transactionToAdjust.getId();
+ ExternalId entityExternalId = transactionToAdjust.getExternalId();
+
+ if (newTransaction != null) {
+ entityId = newTransaction.getId();
+ entityExternalId = newTransaction.getExternalId();
+ }
+
+ return new CommandProcessingResultBuilder() //
+ .withLoanId(loan.getId()) //
+ .withLoanExternalId(loan.getExternalId()) //
+ .withEntityId(entityId) //
+ .withEntityExternalId(entityExternalId) //
+ .withOfficeId(loan.getOfficeId()) //
+ .withClientId(loan.getClientId()) //
+ .withLoanId(loan.getId()) //
+ .with(changes) //
+ .build();
+ }
+
+ private Map<String, Object> propagateChangesByTransaction(final
WorkingCapitalLoanTransaction transaction,
+ final Map<String, Object> changes) {
+ if (transaction.getExternalId() != null) {
+ changes.put(WorkingCapitalLoanConstants.externalIdParameterName,
transaction.getExternalId().getValue());
+ }
+ if (transaction.getReversalExternalId() != null) {
+
changes.put(WorkingCapitalLoanConstants.reversalExternalIdParamName,
transaction.getReversalExternalId().getValue());
+ }
+ changes.put(WorkingCapitalLoanConstants.transactionAmountParamName,
transaction.getTransactionAmount());
+ if (transaction.getClassification() != null) {
+ changes.put(WorkingCapitalLoanConstants.classificationIdParamName,
transaction.getClassification().getCode().getId());
+ }
+ return changes;
+ }
+
+ private WorkingCapitalLoanTransaction
resolveNewTransaction(WorkingCapitalLoan loan, WorkingCapitalLoanTransaction
transactionToAdjust,
+ BigDecimal adjustedTransactionAmount, JsonCommand command,
Map<String, Object> changes) {
+ final ExternalId txnExternalId =
this.externalIdFactory.createFromCommand(command,
+ WorkingCapitalLoanConstants.externalIdParameterName);
+
+ PaymentDetail paymentDetail =
createAndPersistPaymentDetailFromCommand(command, changes);
+ final PaymentDetail newPaymentDetail = paymentDetail == null ?
transactionToAdjust.getPaymentDetail() : paymentDetail;
+ changes.put("paymentDetail", paymentDetail);
Review Comment:
Remove changes.put("paymentDetail", ...). Payment fields are already
recorded by createAndPersistPaymentDetailFromCommand
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]