Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1431,6 +1431,7 @@ public CommandProcessingResult payCharge(final Long savingsAccountId, final Long
.withClientId(savingsAccountCharge.savingsAccount().clientId()) //
.withGroupId(savingsAccountCharge.savingsAccount().groupId()) //
.withSavingsId(savingsAccountCharge.savingsAccount().getId()) //
.withTransactionId(chargeTransaction.getId().toString()) //
.build();

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,34 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNoException;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.apache.fineract.accounting.journalentry.service.JournalEntryWritePlatformService;
import org.apache.fineract.infrastructure.businessdate.domain.BusinessDateType;
import org.apache.fineract.infrastructure.configuration.domain.ConfigurationDomainService;
import org.apache.fineract.infrastructure.core.api.JsonCommand;
import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
import org.apache.fineract.infrastructure.core.exception.ErrorHandler;
import org.apache.fineract.infrastructure.core.exception.GeneralPlatformDomainRuleException;
import org.apache.fineract.infrastructure.core.service.ThreadLocalContextUtil;
import org.apache.fineract.infrastructure.dataqueries.service.EntityDatatableChecksWritePlatformService;
import org.apache.fineract.infrastructure.event.business.service.BusinessEventNotifierService;
import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
import org.apache.fineract.organisation.holiday.domain.HolidayRepositoryWrapper;
import org.apache.fineract.organisation.monetary.domain.MonetaryCurrency;
import org.apache.fineract.organisation.staff.domain.StaffRepositoryWrapper;
import org.apache.fineract.organisation.workingdays.domain.WorkingDaysRepositoryWrapper;
import org.apache.fineract.portfolio.account.domain.StandingInstructionRepository;
Expand All @@ -51,34 +64,87 @@
import org.apache.fineract.portfolio.savings.domain.GSIMRepositoy;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountAssembler;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountCharge;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountChargeRepositoryWrapper;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepositoryWrapper;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransaction;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountTransactionRepository;
import org.apache.fineract.useradministration.domain.AppUserRepositoryWrapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

@ExtendWith(MockitoExtension.class)
@MockitoSettings(strictness = Strictness.LENIENT)
class SavingsAccountWritePlatformServiceJpaRepositoryImplTest {

@Mock
private PlatformSecurityContext context;
@Mock
private SavingsAccountDataValidator fromApiJsonDeserializer;
@Mock
private SavingsAccountRepositoryWrapper savingAccountRepositoryWrapper;
@Mock
private StaffRepositoryWrapper staffRepository;
@Mock
private SavingsAccountTransactionRepository savingsAccountTransactionRepository;
@Mock
private SavingsAccountAssembler savingAccountAssembler;
@Mock
private SavingsAccountTransactionDataValidator savingsAccountTransactionDataValidator;
@Mock
private SavingsAccountChargeDataValidator savingsAccountChargeDataValidator;
@Mock
private PaymentDetailWritePlatformService paymentDetailWritePlatformService;
@Mock
private JournalEntryWritePlatformService journalEntryWritePlatformService;
@Mock
private SavingsAccountDomainService savingsAccountDomainService;
@Mock
private NoteRepository noteRepository;
@Mock
private AccountTransfersReadPlatformService accountTransfersReadPlatformService;
@Mock
private AccountAssociationsReadPlatformService accountAssociationsReadPlatformService;
@Mock
private ChargeRepositoryWrapper chargeRepository;
@Mock
private SavingsAccountChargeRepositoryWrapper savingsAccountChargeRepository;
@Mock
private HolidayRepositoryWrapper holidayRepository;
@Mock
private WorkingDaysRepositoryWrapper workingDaysRepository;
@Mock
private ConfigurationDomainService configurationDomainService;
@Mock
private DepositAccountOnHoldTransactionRepository depositAccountOnHoldTransactionRepository;
@Mock
private EntityDatatableChecksWritePlatformService entityDatatableChecksWritePlatformService;
@Mock
private AppUserRepositoryWrapper appuserRepository;
@Mock
private StandingInstructionRepository standingInstructionRepository;
@Mock
private BusinessEventNotifierService businessEventNotifierService;
@Mock
private GSIMRepositoy gsimRepository;
@Mock
private SavingsAccountInterestPostingService savingsAccountInterestPostingService;
@Mock
private ErrorHandler errorHandler;

@InjectMocks
private SavingsAccountWritePlatformServiceJpaRepositoryImpl service;

private Method validateTransactionsForTransfer;

@BeforeEach
void setUp() throws Exception {
service = new SavingsAccountWritePlatformServiceJpaRepositoryImpl(mock(PlatformSecurityContext.class),
mock(SavingsAccountDataValidator.class), mock(SavingsAccountRepositoryWrapper.class), mock(StaffRepositoryWrapper.class),
mock(SavingsAccountTransactionRepository.class), mock(SavingsAccountAssembler.class),
mock(SavingsAccountTransactionDataValidator.class), mock(SavingsAccountChargeDataValidator.class),
mock(PaymentDetailWritePlatformService.class), mock(JournalEntryWritePlatformService.class),
mock(SavingsAccountDomainService.class), mock(NoteRepository.class), mock(AccountTransfersReadPlatformService.class),
mock(AccountAssociationsReadPlatformService.class), mock(ChargeRepositoryWrapper.class),
mock(SavingsAccountChargeRepositoryWrapper.class), mock(HolidayRepositoryWrapper.class),
mock(WorkingDaysRepositoryWrapper.class), mock(ConfigurationDomainService.class),
mock(DepositAccountOnHoldTransactionRepository.class), mock(EntityDatatableChecksWritePlatformService.class),
mock(AppUserRepositoryWrapper.class), mock(StandingInstructionRepository.class), mock(BusinessEventNotifierService.class),
mock(GSIMRepositoy.class), mock(SavingsAccountInterestPostingService.class), mock(ErrorHandler.class));

validateTransactionsForTransfer = SavingsAccountWritePlatformServiceJpaRepositoryImpl.class
.getDeclaredMethod("validateTransactionsForTransfer", SavingsAccount.class, LocalDate.class);
validateTransactionsForTransfer.setAccessible(true);
Expand Down Expand Up @@ -158,4 +224,59 @@ void validateTransactionsForTransfer_transactionDateBeforeTransferDate_doesNotTh

assertThatNoException().isThrownBy(() -> validateTransactionsForTransfer.invoke(service, savingsAccount, transferDate));
}

@Test
void payCharge_shouldReturnTransactionIdInResult() {
// Given
final Long savingsAccountId = 1L;
final Long chargeId = 2L;
final Long expectedTransactionId = 42L;
final LocalDate transactionDate = LocalDate.of(2024, 3, 15);

ThreadLocalContextUtil.setBusinessDates(new HashMap<>(Map.of(BusinessDateType.BUSINESS_DATE, transactionDate)));

JsonCommand command = mock(JsonCommand.class);
when(command.json()).thenReturn("{}");
when(command.extractLocale()).thenReturn(java.util.Locale.ENGLISH);
when(command.dateFormat()).thenReturn("dd MMMM yyyy");
when(command.bigDecimalValueOfParameterNamed("amount")).thenReturn(BigDecimal.TEN);
when(command.localDateValueOfParameterNamed("dueAsOfDate")).thenReturn(transactionDate);
when(command.stringValueOfParameterNamed("note")).thenReturn(null);

SavingsAccount savingsAccount = mock(SavingsAccount.class);
when(savingsAccount.getId()).thenReturn(savingsAccountId);
when(savingsAccount.officeId()).thenReturn(1L);
when(savingsAccount.clientId()).thenReturn(1L);
when(savingsAccount.groupId()).thenReturn(1L);
when(savingsAccount.findExistingTransactionIds()).thenReturn(new HashSet<>());
when(savingsAccount.findExistingReversedTransactionIds()).thenReturn(new HashSet<>());
when(savingsAccount.getOnHoldFunds()).thenReturn(BigDecimal.ZERO);
when(savingsAccount.isBeforeLastPostingPeriod(any(LocalDate.class), anyBoolean())).thenReturn(false);
MonetaryCurrency currency = mock(MonetaryCurrency.class);
when(currency.getCode()).thenReturn("USD");
when(savingsAccount.getCurrency()).thenReturn(currency);
when(savingsAccount.deriveAccountingBridgeData(any(), any(), any(), anyBoolean(), anyBoolean())).thenReturn(new HashMap<>());

SavingsAccountCharge savingsAccountCharge = mock(SavingsAccountCharge.class);
when(savingsAccountCharge.getId()).thenReturn(chargeId);
when(savingsAccountCharge.savingsAccount()).thenReturn(savingsAccount);

SavingsAccountTransaction chargeTransaction = mock(SavingsAccountTransaction.class);
when(chargeTransaction.getId()).thenReturn(expectedTransactionId);

when(savingsAccountChargeRepository.findOneWithNotFoundDetection(chargeId, savingsAccountId)).thenReturn(savingsAccountCharge);
when(configurationDomainService.allowTransactionsOnHolidayEnabled()).thenReturn(true);
when(configurationDomainService.allowTransactionsOnNonWorkingDayEnabled()).thenReturn(true);
when(configurationDomainService.isSavingsInterestPostingAtCurrentPeriodEnd()).thenReturn(false);
when(configurationDomainService.retrieveFinancialYearBeginningMonth()).thenReturn(1);
when(savingsAccountTransactionRepository.findBySavingsAccountIdAndLessThanDateOfAndReversedIsFalse(anyLong(), any(LocalDate.class),
any())).thenReturn(Collections.emptyList());
when(savingsAccount.payCharge(any(), any(), any(), any(), anyBoolean(), any())).thenReturn(chargeTransaction);

// When
CommandProcessingResult result = service.payCharge(savingsAccountId, chargeId, command);

// Then
assertThat(result.getTransactionId()).isEqualTo(expectedTransactionId.toString());
}
}
Loading