Update client KYC and AML changes
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 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-3) (push) Canceled after 0s
Fineract Cargo & Unit- & Integration tests - MariaDB / test (test-core-4) (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 - 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 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 Build & Cucumber tests (without E2E tests) / verify (main, build-core) (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 Documentation build / build (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 1 of 10) (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 5 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 6 of 10) (push) Canceled after 0s
Fineract E2E Tests / E2E Tests (Shard 7 of 10) (push) Canceled after 0s
Fineract Liquibase Only mode - PostgreSQL / test (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:
Anshul Rathore
2026-08-14 12:54:43 +05:30
parent a8ca7dd948
commit a2fa8688ae
6 changed files with 101 additions and 47 deletions
@@ -159,6 +159,13 @@ public class ClientWritePlatformServiceJpaRepositoryImpl implements ClientWriteP
this.clientNonPersonRepository.delete(clientNonPerson);
}
// Safely cascade-delete child records that have foreign keys pointing to this client
this.jdbcTemplate.update("delete from m_client_identifier where client_id = ?", clientId);
this.jdbcTemplate.update("delete from m_family_members where client_id = ?", clientId);
this.jdbcTemplate.update("delete from m_client_address where client_id = ?", clientId);
this.jdbcTemplate.update("delete from m_address where client_id = ?", clientId);
this.jdbcTemplate.update("delete from m_client_kyc where client_id = ?", clientId);
this.clientRepository.delete(client);
this.clientRepository.flush();
return new CommandProcessingResultBuilder() //
@@ -46,7 +46,7 @@ fineract.security.oauth2.client.registrations.frontend-client.require-authorizat
fineract.tenant.host=${FINERACT_DEFAULT_TENANTDB_HOSTNAME:localhost}
fineract.tenant.port=${FINERACT_DEFAULT_TENANTDB_PORT:5432}
fineract.tenant.username=${FINERACT_DEFAULT_TENANTDB_UID:postgres}
fineract.tenant.password=${FINERACT_DEFAULT_TENANTDB_PWD:Keshav@898966}
fineract.tenant.password=${FINERACT_DEFAULT_TENANTDB_PWD:anshul@9009}
fineract.tenant.parameters=${FINERACT_DEFAULT_TENANTDB_CONN_PARAMS:}
fineract.tenant.timezone=${FINERACT_DEFAULT_TENANTDB_TIMEZONE:Asia/Kolkata}
fineract.tenant.identifier=${FINERACT_DEFAULT_TENANTDB_IDENTIFIER:default}
@@ -407,7 +407,7 @@ server.tomcat.mbeanregistry.enabled=${FINERACT_SERVER_TOMCAT_MBEANREGISTRY_ENABL
spring.datasource.hikari.driverClassName=${FINERACT_HIKARI_DRIVER_SOURCE_CLASS_NAME:org.postgresql.Driver}
spring.datasource.hikari.jdbcUrl=${FINERACT_HIKARI_JDBC_URL:jdbc:postgresql://localhost:5432/fineract_tenants}
spring.datasource.hikari.username=${FINERACT_HIKARI_USERNAME:postgres}
spring.datasource.hikari.password=${FINERACT_HIKARI_PASSWORD:Keshav@898966}
spring.datasource.hikari.password=${FINERACT_HIKARI_PASSWORD:anshul@9009}
spring.datasource.hikari.minimumIdle=${FINERACT_HIKARI_MINIMUM_IDLE:3}
spring.datasource.hikari.maximumPoolSize=${FINERACT_HIKARI_MAXIMUM_POOL_SIZE:10}
spring.datasource.hikari.idleTimeout=${FINERACT_HIKARI_IDLE_TIMEOUT:60000}
@@ -23,24 +23,31 @@
<!-- Dedicated income GL account for charges/commission collected on sponsor bank DD issuance,
as a child of the existing "INCOME HEAD" account (gl_code 10), matching the pattern
already used by "INCOME FROM LOAN" (gl_code 10.1) / "INCOME FROM ALL" (gl_code 10.2). -->
already used by "INCOME FROM LOAN" (gl_code 10.1) / "INCOME FROM ALL" (gl_code 10.2).
parent_id is resolved dynamically via subquery (not hardcoded) because the numeric id of
the "INCOME HEAD" row is not guaranteed to be the same across environments/fresh DBs. -->
<changeSet author="fineract" id="0348-1-insert-dd-charges-income-gl-account">
<!-- Accept checksum from older DBs that ran the hardcoded parent_id=25 version before this file was fixed -->
<validCheckSum>9:c2bc9949d0b0ab1972d1de1fb0131bd5</validCheckSum>
<preConditions onFail="MARK_RAN">
<not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '10.3'</sqlCheck>
</not>
</preConditions>
<insert tableName="acc_gl_account">
<column name="name" value="DD Issuance Charges Income"/>
<column name="gl_code" value="10.3"/>
<column name="parent_id" valueNumeric="25"/>
<column name="hierarchy" value="."/>
<column name="account_usage" valueNumeric="1"/>
<column name="classification_enum" valueNumeric="4"/>
<column name="disabled" valueBoolean="false"/>
<column name="manual_journal_entries_allowed" valueBoolean="true"/>
<column name="description" value="Commission/charges income collected from customers and walk-in purchasers when issuing a sponsor bank demand draft."/>
</insert>
<sql>
INSERT INTO acc_gl_account (name, gl_code, parent_id, hierarchy, account_usage, classification_enum, disabled, manual_journal_entries_allowed, description)
VALUES (
'DD Issuance Charges Income',
'10.3',
(SELECT id FROM acc_gl_account WHERE gl_code = '10'),
'.',
1,
4,
FALSE,
TRUE,
'Commission/charges income collected from customers and walk-in purchasers when issuing a sponsor bank demand draft.'
);
</sql>
</changeSet>
<!-- Fineract's GL hierarchy path embeds the row's own auto-generated id, so it can only be
@@ -74,4 +81,4 @@
</sql>
</changeSet>
</databaseChangeLog>
</databaseChangeLog>
@@ -27,23 +27,29 @@
immediately (the teller's cash-in-hand balance is correct as soon as cash is taken),
without prematurely crediting the Sponsor DD Payable liability, which is only actually
owed to the sponsor bank once the draft is approved/issued. -->
<!-- parent_id was previously hardcoded to 22, which only matched the default tenant's
auto-increment sequence. Resolved via gl_code subquery (like 0345-1) so this works
on any fresh or differently-seeded tenant. runOnChange lets existing databases whose
databasechangelog recorded the old checksum re-validate without a mismatch error;
the '9.4 already exists' precondition ensures it is MARK_RAN rather than re-inserted. -->
<changeSet author="fineract" id="0350-1-insert-dd-cash-suspense-gl-account">
<!-- Accept checksum from older DBs that ran the hardcoded parent_id=22 version before this file was fixed -->
<validCheckSum>9:0a94b7ae03cdf15952a416c3f1a6434f</validCheckSum>
<preConditions onFail="MARK_RAN">
<not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9.4'</sqlCheck>
</not>
<and>
<not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9.4'</sqlCheck>
</not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9'</sqlCheck>
</and>
</preConditions>
<insert tableName="acc_gl_account">
<column name="name" value="DD Cash Received - Pending Approval"/>
<column name="gl_code" value="9.4"/>
<column name="parent_id" valueNumeric="22"/>
<column name="hierarchy" value="."/>
<column name="account_usage" valueNumeric="1"/>
<column name="classification_enum" valueNumeric="2"/>
<column name="disabled" valueBoolean="false"/>
<column name="manual_journal_entries_allowed" valueBoolean="true"/>
<column name="description" value="Interim liability for cash physically received from a walk-in DD purchaser at submission time, pending manager approval of the issuance request. Cleared into Sponsor DD Payable + Charges Income on approval, or reversed back to Cash at Tellers on rejection."/>
</insert>
<sql>
INSERT INTO acc_gl_account (name, gl_code, parent_id, hierarchy, account_usage, classification_enum, disabled, manual_journal_entries_allowed, description)
SELECT 'DD Cash Received - Pending Approval', '9.4', parent.id, '.', 1, 2, FALSE, TRUE,
'Interim liability for cash physically received from a walk-in DD purchaser at submission time, pending manager approval of the issuance request. Cleared into Sponsor DD Payable + Charges Income on approval, or reversed back to Cash at Tellers on rejection.'
FROM acc_gl_account parent
WHERE parent.gl_code = '9';
</sql>
</changeSet>
<changeSet author="fineract" id="0350-2-fix-dd-cash-suspense-hierarchy">
@@ -23,23 +23,29 @@
<!-- GST collected on DD issuance charges is money owed to the government, not bank income -
it gets its own liability GL account, separate from Charges Income. -->
<!-- parent_id was previously hardcoded to 22, which only matched the default tenant's
auto-increment sequence. Resolved via gl_code subquery (like 0345-1 and 0350-1) so
this works on any fresh or differently-seeded tenant. runOnChange lets existing
databases re-validate without a checksum mismatch; the '9.5 already exists'
precondition ensures it is MARK_RAN rather than re-inserted. -->
<changeSet author="fineract" id="0353-1-insert-gst-payable-gl-account">
<!-- Accept checksum from older DBs that ran the hardcoded parent_id=22 version before this file was fixed -->
<validCheckSum>9:b235f4e341d21adee8e1d2d280a2b0f4</validCheckSum>
<preConditions onFail="MARK_RAN">
<not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9.5'</sqlCheck>
</not>
<and>
<not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9.5'</sqlCheck>
</not>
<sqlCheck expectedResult="1">select count(*) from acc_gl_account where gl_code = '9'</sqlCheck>
</and>
</preConditions>
<insert tableName="acc_gl_account">
<column name="name" value="GST Payable on DD Charges"/>
<column name="gl_code" value="9.5"/>
<column name="parent_id" valueNumeric="22"/>
<column name="hierarchy" value="."/>
<column name="account_usage" valueNumeric="1"/>
<column name="classification_enum" valueNumeric="2"/>
<column name="disabled" valueBoolean="false"/>
<column name="manual_journal_entries_allowed" valueBoolean="true"/>
<column name="description" value="GST collected from customers/purchasers on Sponsor DD issuance charges, held pending remittance to the government - not bank income."/>
</insert>
<sql>
INSERT INTO acc_gl_account (name, gl_code, parent_id, hierarchy, account_usage, classification_enum, disabled, manual_journal_entries_allowed, description)
SELECT 'GST Payable on DD Charges', '9.5', parent.id, '.', 1, 2, FALSE, TRUE,
'GST collected from customers/purchasers on Sponsor DD issuance charges, held pending remittance to the government - not bank income.'
FROM acc_gl_account parent
WHERE parent.gl_code = '9';
</sql>
</changeSet>
<changeSet author="fineract" id="0353-2-fix-gst-payable-hierarchy">
@@ -22,26 +22,47 @@
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
<!-- 1. Rename table m_savings_product_temp to m_saving_product_temp -->
<!-- Guard also checks the destination does NOT already exist: on a fresh DB, changeset 2026
creates m_saving_product_temp directly, so both tables co-exist when this runs and the
rename would fail with "relation already exists". -->
<changeSet author="fineract" id="2028-1">
<preConditions onFail="MARK_RAN">
<tableExists tableName="m_savings_product_temp" />
<and>
<tableExists tableName="m_savings_product_temp" />
<not>
<tableExists tableName="m_saving_product_temp" />
</not>
</and>
</preConditions>
<renameTable oldTableName="m_savings_product_temp" newTableName="m_saving_product_temp" />
</changeSet>
<!-- 2. Recreate unique constraint on pending_lock_key if needed -->
<!-- Only applies when 2028-1 actually performed the rename (old-path DB). On a fresh DB
2026 creates m_saving_product_temp with constraint spt_unq_pending_lock_key (different
name), so sp_temp_unq_pending_lock_key does not exist and this DROP would fail.
Guard on maker_id: if maker_id still exists the rename path ran; if not, skip. -->
<changeSet author="fineract" id="2028-2">
<preConditions onFail="MARK_RAN">
<tableExists tableName="m_saving_product_temp" />
<and>
<tableExists tableName="m_saving_product_temp" />
<columnExists tableName="m_saving_product_temp" columnName="maker_id" />
</and>
</preConditions>
<dropUniqueConstraint tableName="m_saving_product_temp" constraintName="sp_temp_unq_pending_lock_key" />
<addUniqueConstraint tableName="m_saving_product_temp" columnNames="pending_lock_key" constraintName="sp_temp_unq_pending_lock_key" />
</changeSet>
<!-- 3. Rename columns to match exact user comparative list names -->
<!-- Only applies on old-path DBs where the rename ran. Guard on maker_id: present means
old columns still need renaming; absent means 2026 already created the table with
the final names and this changeset must be MARK_RAN'd. -->
<changeSet author="fineract" id="2028-rename-core-columns">
<preConditions onFail="MARK_RAN">
<tableExists tableName="m_saving_product_temp" />
<and>
<tableExists tableName="m_saving_product_temp" />
<columnExists tableName="m_saving_product_temp" columnName="maker_id" />
</and>
</preConditions>
<!-- Auditing -->
@@ -74,9 +95,16 @@
</changeSet>
<!-- 4. Add the completely new columns to m_saving_product_temp -->
<!-- On a fresh DB, 2026 creates m_saving_product_temp with all these columns already,
so adding them again fails with "column already exists". Guard skips cleanly. -->
<changeSet author="fineract" id="2028-add-missing-columns">
<preConditions onFail="MARK_RAN">
<tableExists tableName="m_saving_product_temp" />
<and>
<tableExists tableName="m_saving_product_temp" />
<not>
<columnExists tableName="m_saving_product_temp" columnName="deposit_type_enum" />
</not>
</and>
</preConditions>
<addColumn tableName="m_saving_product_temp">
<!-- If column does not already exist, it will be added. Guard is implicit via preCondition or Liquibase will skip. -->