mariiaKraievska commented on code in PR #6542:
URL: https://github.com/apache/fineract/pull/6542#discussion_r4258159923


##########
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);

Review Comment:
   Missing the same post-adjust corrections we landed on absolute adjust: probe 
overpaidOnDate with the earlier of original vs replacement date, then 
recalculateSettlementDates(loan). Without this, moving an overpaying txn 
forward to a non-overpaying amount leaves a stale overpaidOnDate, and backdated 
adjust that closes/overpays can leave stale closedOnDate / maturedOnDate. 
Please mirror the absolute-adjust sequence here (or share the same helper).



-- 
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]

Reply via email to