public Money waive(final MonetaryCurrency currency, final Integer loanInstallmentNumber) { if (isInstalmentFee()) { final LoanInstallmentCharge chargePerInstallment = getInstallmentLoanCharge(loanInstallmentNumber); final Money amountWaived = chargePerInstallment.waive(currency); if (this.amountWaived == null) { this.amountWaived = BigDecimal.ZERO; } this.amountWaived = this.amountWaived.add(amountWaived.getAmount()); this.amountOutstanding = this.amountOutstanding.subtract(amountWaived.getAmount()); if (determineIfFullyPaid()) { this.paid = false; this.waived = true; } return amountWaived; } this.amountWaived = this.amountOutstanding; this.amountOutstanding = BigDecimal.ZERO; this.paid = false; this.waived = true; return getAmountWaived(currency); }