FINERACT-2213: Client transfer from one branch to another leaves loans attached to the client in transfer.in.progress status instead of active

This commit is contained in:
a7med3del1973
2025-06-24 15:20:08 +02:00
committed by Adam Saghy
parent 28fbaa920d
commit d5958f36c7
2 changed files with 148 additions and 1 deletions
@@ -97,6 +97,7 @@ public class AccountNumberGenerator {
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put(ID, shareaccount.getId().toString());
propertyMap.put(SHARE_PRODUCT_SHORT_NAME, shareaccount.getShareProduct().getShortName());
propertyMap.put(ENTITY_TYPE, "shareAccount");
return generateAccountNumber(propertyMap, accountNumberFormat);
}
@@ -240,6 +241,7 @@ public class AccountNumberGenerator {
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put(ID, group.getId().toString());
propertyMap.put(OFFICE_NAME, group.getOffice().getName());
propertyMap.put(ENTITY_TYPE, "group");
return generateAccountNumber(propertyMap, accountNumberFormat);
}
@@ -247,7 +249,7 @@ public class AccountNumberGenerator {
Map<String, String> propertyMap = new HashMap<>();
propertyMap.put(ID, group.getId().toString());
propertyMap.put(OFFICE_NAME, group.getOffice().getName());
propertyMap.put(ENTITY_TYPE, "center");
return generateAccountNumber(propertyMap, accountNumberFormat);
}
}
@@ -0,0 +1,145 @@
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.fineract.portfolio.account.jobs.executestandinginstructions;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.apache.fineract.infrastructure.accountnumberformat.domain.AccountNumberFormat;
import org.apache.fineract.infrastructure.codes.domain.CodeValue;
import org.apache.fineract.infrastructure.configuration.api.GlobalConfigurationConstants;
import org.apache.fineract.infrastructure.configuration.data.GlobalConfigurationPropertyData;
import org.apache.fineract.infrastructure.configuration.service.ConfigurationReadPlatformService;
import org.apache.fineract.organisation.office.domain.Office;
import org.apache.fineract.portfolio.account.service.AccountNumberGenerator;
import org.apache.fineract.portfolio.client.domain.Client;
import org.apache.fineract.portfolio.client.domain.ClientRepository;
import org.apache.fineract.portfolio.loanaccount.domain.Loan;
import org.apache.fineract.portfolio.loanaccount.domain.LoanRepository;
import org.apache.fineract.portfolio.loanproduct.domain.LoanProduct;
import org.apache.fineract.portfolio.savings.domain.SavingsAccount;
import org.apache.fineract.portfolio.savings.domain.SavingsAccountRepository;
import org.apache.fineract.portfolio.savings.domain.SavingsProduct;
import org.apache.fineract.portfolio.shareaccounts.domain.ShareAccount;
import org.apache.fineract.portfolio.shareproducts.domain.ShareProduct;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class AccountNumberGeneratorTest {
private ConfigurationReadPlatformService configService;
private ClientRepository clientRepo;
private LoanRepository loanRepo;
private SavingsAccountRepository savingsRepo;
private AccountNumberGenerator generator;
@BeforeEach
public void setup() {
configService = mock(ConfigurationReadPlatformService.class);
clientRepo = mock(ClientRepository.class);
loanRepo = mock(LoanRepository.class);
savingsRepo = mock(SavingsAccountRepository.class);
generator = new AccountNumberGenerator(configService, clientRepo, loanRepo, savingsRepo);
GlobalConfigurationPropertyData accountLengthConfig = mock(GlobalConfigurationPropertyData.class);
when(accountLengthConfig.getValue()).thenReturn(Long.valueOf("9"));
when(configService.retrieveGlobalConfiguration(GlobalConfigurationConstants.CUSTOM_ACCOUNT_NUMBER_LENGTH))
.thenReturn(accountLengthConfig);
GlobalConfigurationPropertyData randomAccountConfig = mock(GlobalConfigurationPropertyData.class);
when(randomAccountConfig.getValue()).thenReturn(Long.valueOf("0"));
when(configService.retrieveGlobalConfiguration(GlobalConfigurationConstants.RANDOM_ACCOUNT_NUMBER)).thenReturn(randomAccountConfig);
}
@Test
public void testGenerateClientAccountNumber() {
Client client = mock(Client.class);
Office office = mock(Office.class);
CodeValue clientType = mock(CodeValue.class);
when(client.getId()).thenReturn(123L);
when(client.getOffice()).thenReturn(office);
when(office.getName()).thenReturn("MainOffice");
when(client.clientType()).thenReturn(clientType);
when(clientType.getLabel()).thenReturn("Individual");
AccountNumberFormat format = mock(AccountNumberFormat.class);
when(format.getPrefixEnum()).thenReturn(null);
String accountNumber = generator.generate(client, format);
assertThat(accountNumber).isEqualTo("000000123");
}
@Test
public void testGenerateLoanAccountNumber() {
Loan loan = mock(Loan.class);
Office office = mock(Office.class);
LoanProduct product = mock(LoanProduct.class);
when(loan.getId()).thenReturn(77L);
when(loan.getOffice()).thenReturn(office);
when(office.getName()).thenReturn("LoanBranch");
when(loan.loanProduct()).thenReturn(product);
when(product.getShortName()).thenReturn("LP01");
AccountNumberFormat format = mock(AccountNumberFormat.class);
when(format.getPrefixEnum()).thenReturn(null);
String accountNumber = generator.generate(loan, format);
assertThat(accountNumber).isEqualTo("000000077");
}
@Test
public void testGenerateSavingsAccountNumber() {
SavingsAccount savings = mock(SavingsAccount.class);
Office office = mock(Office.class);
SavingsProduct product = mock(SavingsProduct.class);
when(savings.getId()).thenReturn(456L);
when(savings.office()).thenReturn(office);
when(office.getName()).thenReturn("Branch01");
when(savings.savingsProduct()).thenReturn(product);
when(product.getShortName()).thenReturn("SP01");
AccountNumberFormat format = mock(AccountNumberFormat.class);
when(format.getPrefixEnum()).thenReturn(null);
String accountNumber = generator.generate(savings, format);
assertThat(accountNumber).isEqualTo("000000456");
}
@Test
public void testGenerateShareAccountNumber() {
ShareAccount share = mock(ShareAccount.class);
ShareProduct product = mock(ShareProduct.class);
when(share.getId()).thenReturn(321L);
when(share.getShareProduct()).thenReturn(product);
when(product.getShortName()).thenReturn("SH01");
AccountNumberFormat format = mock(AccountNumberFormat.class);
when(format.getPrefixEnum()).thenReturn(null);
String accountNumber = generator.generate(share, format);
assertThat(accountNumber).isEqualTo("000000321");
}
}