Add CC accounts tracking, AML rule trial and branch approval fixes
Fineract Build & Cucumber tests (without E2E tests) / verify (main, build-core) (push) Canceled after 0s
Fineract Build & Cucumber tests (without E2E tests) / verify (main, cucumber) (push) Canceled after 0s
Fineract Build & Cucumber tests (without E2E tests) / verify (progressive-loan, build-progressive-loan) (push) Canceled after 0s
Fineract Documentation build / build (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 1 of 10) (push) Canceled after 0s
Fineract Docker Builds / build (false, docker-compose-postgresql.yml, postgresql) (push) Canceled after 0s
Fineract Docker Builds / build (true, docker-compose.yml, mariadb) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 10 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 2 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 3 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 4 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 6 of 10) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-3) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-4) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-3) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-4) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-5) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-1) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-2) (push) Canceled after 0s
Fineract Liquibase Only mode - PostgreSQL / test (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 5 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 7 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 8 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 9 of 10) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-1) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-2) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-5) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-1) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MySQL / test (test-core-2) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-3) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-4) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - PostgreSQL / test (test-core-5) (push) Canceled after 0s
Fineract Messaging Smoke Tests / Smoke Test with ActiveMQ (push) Canceled after 0s
Fineract Messaging Smoke Tests / Smoke Test with Kafka (push) Canceled after 0s

This commit is contained in:
2026-10-19 18:10:52 +05:30
parent e4a2c00d75
commit ae69d126a9
108 changed files with 7866 additions and 199 deletions
@@ -25,13 +25,19 @@ import org.apache.fineract.portfolio.savings.SavingsApiConstants;
public class SavingsAccountConstant extends SavingsApiConstants {
/**
* The branch to open the account at, when it is not the client's own branch. Optional; absent means the
* client's branch. See SavingsAccount#office.
*/
public static final String accountOfficeIdParamName = "accountOfficeId";
/**
* These parameters will match the class level parameters of {@link SavingsProductData}. Where possible, we try to
* get response parameters to match those of request parameters.
*/
protected static final Set<String> SAVINGS_ACCOUNT_REQUEST_DATA_PARAMETERS = new HashSet<>(Arrays.asList(localeParamName,
dateFormatParamName, monthDayFormatParamName, staffIdParamName, isGSIM, isParentAccount, accountNoParamName,
externalIdParamName, clientIdParamName, groupIdParamName, productIdParamName, fieldOfficerIdParamName, submittedOnDateParamName,
externalIdParamName, clientIdParamName, accountOfficeIdParamName, groupIdParamName, productIdParamName, fieldOfficerIdParamName, submittedOnDateParamName,
nominalAnnualInterestRateParamName, interestCompoundingPeriodTypeParamName, interestPostingPeriodTypeParamName,
interestCalculationTypeParamName, interestCalculationDaysInYearTypeParamName, minRequiredOpeningBalanceParamName,
lockinPeriodFrequencyParamName, lockinPeriodFrequencyTypeParamName,
@@ -160,6 +160,15 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom<Long>
@JoinColumn(name = "group_id", nullable = true)
protected Group group;
/**
* The branch this account is held at, when that is not the client's own branch (a customer of Head Office who
* opens an account at Bhopal). Null for every ordinary account, meaning "the client's branch". It decides the
* branch of the account's transactions and journal entries; see {@link #office()}.
*/
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "office_id", nullable = true)
protected Office accountOffice;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "gsim_id", nullable = true)
private GroupSavingsIndividualMonitoring gsim;
@@ -2601,7 +2610,9 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom<Long>
public Long officeId() {
Long officeId = null;
if (this.client != null) {
if (this.accountOffice != null) {
officeId = this.accountOffice.getId();
} else if (this.client != null) {
officeId = this.client.officeId();
} else if (this.group != null) {
officeId = this.group.officeId();
@@ -2609,9 +2620,15 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom<Long>
return officeId;
}
/**
* The branch whose books this account is in: the branch it was opened at when that differs from the client's,
* otherwise the client's (or group's) branch. Every transaction and journal entry takes its branch from here.
*/
public Office office() {
Office office = null;
if (this.client != null) {
if (this.accountOffice != null) {
office = this.accountOffice;
} else if (this.client != null) {
office = this.client.getOffice();
} else if (this.group != null) {
office = this.group.getOffice();
@@ -2663,6 +2680,15 @@ public class SavingsAccount extends AbstractAuditableWithUTCDateTimeCustom<Long>
return this.savingsProduct().getId();
}
/** Opens this account at a branch other than its client's. Pass null to keep it at the client's branch. */
public void setAccountOffice(final Office accountOffice) {
this.accountOffice = accountOffice;
}
public Office getAccountOffice() {
return this.accountOffice;
}
public void setGsim(GroupSavingsIndividualMonitoring gsim) {
this.gsim = gsim;
}