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]

Reply via email to