FINERACT-2386: Update read query to support other products

This commit is contained in:
Adam Saghy
2025-10-06 11:24:30 +02:00
parent 334da61ed8
commit ceb9f0f783
3 changed files with 187 additions and 41 deletions
@@ -79,25 +79,75 @@ public class JournalEntryAggregationJobReader extends JdbcCursorItemReader<Journ
private String buildAggregationQuery() {
return """
SELECT lp.id AS productId,
acc_gl_account.id AS glAccountId,
acc_gl_journal_entry.entity_type_enum AS entityTypeEnum,
acc_gl_journal_entry.office_id AS officeId,
aw.owner_id AS externalOwner,
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 2 THEN amount ELSE 0 END) AS debitAmount,
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 1 THEN amount ELSE 0 END) AS creditAmount,
acc_gl_journal_entry.submitted_on_date as aggregatedOnDate,
acc_gl_journal_entry.currency_code as currencyCode
SELECT
COALESCE(
loan_product.id,
savings_product.id,
prov_product.id,
share_product.id
) AS productId,
acc_gl_account.id AS glAccountId,
acc_gl_journal_entry.entity_type_enum AS entityTypeEnum,
acc_gl_journal_entry.office_id AS officeId,
aw.owner_id AS externalOwner,
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 2 THEN amount ELSE 0 END) AS debitAmount,
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 1 THEN amount ELSE 0 END) AS creditAmount,
acc_gl_journal_entry.submitted_on_date AS aggregatedOnDate,
acc_gl_journal_entry.currency_code AS currencyCode
FROM acc_gl_account
JOIN acc_gl_journal_entry ON acc_gl_account.id = acc_gl_journal_entry.account_id
JOIN m_loan m ON m.id = acc_gl_journal_entry.entity_id
JOIN m_product_loan lp ON lp.id = m.product_id
JOIN acc_gl_journal_entry
ON acc_gl_account.id = acc_gl_journal_entry.account_id
-- entity_type_enum = 1 → LOAN
LEFT JOIN m_loan loan
ON loan.id = acc_gl_journal_entry.entity_id
AND acc_gl_journal_entry.entity_type_enum = 1
LEFT JOIN m_product_loan loan_product
ON loan_product.id = loan.product_id
AND acc_gl_journal_entry.entity_type_enum = 1
-- entity_type_enum = 2 → SAVING
LEFT JOIN m_savings_account savings
ON savings.id = acc_gl_journal_entry.entity_id
AND acc_gl_journal_entry.entity_type_enum = 2
LEFT JOIN m_savings_product savings_product
ON savings_product.id = savings.product_id
AND acc_gl_journal_entry.entity_type_enum = 2
-- entity_type_enum = 3 → PROVISIONING
LEFT JOIN m_provisioning_history prov
ON prov.id = acc_gl_journal_entry.entity_id
AND acc_gl_journal_entry.entity_type_enum = 3
LEFT JOIN m_loanproduct_provisioning_entry prov_entry
ON prov_entry.history_id = prov.id
AND acc_gl_journal_entry.entity_type_enum = 3
LEFT JOIN m_product_loan prov_product
ON prov_product.id = prov_entry.product_id
AND acc_gl_journal_entry.entity_type_enum = 3
-- entity_type_enum = 4 → SHARED
LEFT JOIN m_share_account share
ON share.id = acc_gl_journal_entry.entity_id
AND acc_gl_journal_entry.entity_type_enum = 4
LEFT JOIN m_share_product share_product
ON share_product.id = share.product_id
AND acc_gl_journal_entry.entity_type_enum = 4
-- external owner
LEFT JOIN m_external_asset_owner_journal_entry_mapping aw
ON aw.journal_entry_id = acc_gl_journal_entry.id
WHERE acc_gl_journal_entry.entity_type_enum = 1
AND acc_gl_journal_entry.submitted_on_date > ?
ON aw.journal_entry_id = acc_gl_journal_entry.id
WHERE acc_gl_journal_entry.submitted_on_date > ?
AND acc_gl_journal_entry.submitted_on_date <= ?
GROUP BY productId, glAccountId, externalOwner, aggregatedOnDate, currencyCode, entityTypeEnum, officeId
GROUP BY
productId,
glAccountId,
externalOwner,
aggregatedOnDate,
currencyCode,
entityTypeEnum,
officeId
""";
}
}
@@ -112,26 +112,6 @@
<addForeignKeyConstraint baseColumnNames="created_by" baseTableName="m_journal_entry_aggregation_tracking" constraintName="FK_GL_JOURNAL_ENTRY_AGGREGATION_TRACKING_ON_CREATED_BY" referencedColumnNames="id" referencedTableName="m_appuser"/>
<addForeignKeyConstraint baseColumnNames="last_modified_by" baseTableName="m_journal_entry_aggregation_tracking" constraintName="FK_GL_JOURNAL_ENTRY_AGGREGATION_TRACKING_ON_LAST_MODIFIED_BY" referencedColumnNames="id" referencedTableName="m_appuser"/>
</changeSet>
<changeSet id="4" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="submitted_on_date"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(submitted_on_date);
</sql>
</changeSet>
<changeSet id="5" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="aggregated_on_date_to"/>
</not>
</preConditions>
<sql>
create unique index concurrently idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
</sql>
</changeSet>
<changeSet id="6" author="fineract" context="mysql">
<preConditions onFail="MARK_RAN">
@@ -223,6 +203,26 @@
<addForeignKeyConstraint baseColumnNames="created_by" baseTableName="m_journal_entry_aggregation_tracking" constraintName="FK_GL_JOURNAL_ENTRY_AGGREGATION_TRACKING_ON_CREATED_BY" referencedColumnNames="id" referencedTableName="m_appuser"/>
<addForeignKeyConstraint baseColumnNames="last_modified_by" baseTableName="m_journal_entry_aggregation_tracking" constraintName="FK_GL_JOURNAL_ENTRY_AGGREGATION_TRACKING_ON_LAST_MODIFIED_BY" referencedColumnNames="id" referencedTableName="m_appuser"/>
</changeSet>
<changeSet id="4" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="submitted_on_date"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(submitted_on_date);
</sql>
</changeSet>
<changeSet id="5" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="aggregated_on_date_to"/>
</not>
</preConditions>
<sql>
create unique index concurrently idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
</sql>
</changeSet>
<changeSet id="9" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
@@ -243,4 +243,104 @@
create unique index idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
</sql>
</changeSet>
<changeSet id="11" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="job_execution_id"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_jour_ent_aggr_trac_job_exec_id on m_journal_entry_aggregation_tracking(job_execution_id);
</sql>
</changeSet>
<changeSet id="12" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="job_execution_id"/>
</not>
</preConditions>
<sql>
create index idx_m_jour_ent_aggr_trac_job_exec_id on m_journal_entry_aggregation_tracking(job_execution_id);
</sql>
</changeSet>
<changeSet id="13" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="job_execution_id"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_jour_ent_aggr_sum_job_exec_id on m_journal_entry_aggregation_summary(job_execution_id);
</sql>
</changeSet>
<changeSet id="14" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="job_execution_id"/>
</not>
</preConditions>
<sql>
create index idx_m_jour_ent_aggr_sum_job_exec_id on m_journal_entry_aggregation_summary(job_execution_id);
</sql>
</changeSet>
<changeSet id="15" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="product_id,entity_type_enum"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_jour_ent_aggr_sum_prod_id_entity_type on m_journal_entry_aggregation_summary(product_id, entity_type_enum);
</sql>
</changeSet>
<changeSet id="16" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="product_id,entity_type_enum"/>
</not>
</preConditions>
<sql>
create index idx_m_jour_ent_aggr_sum_prod_id_entity_type on m_journal_entry_aggregation_summary(product_id, entity_type_enum);
</sql>
</changeSet>
<changeSet id="17" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="aggregated_on_date"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_jour_ent_aggr_sum_aggr_date on m_journal_entry_aggregation_summary(aggregated_on_date);
</sql>
</changeSet>
<changeSet id="18" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="aggregated_on_date"/>
</not>
</preConditions>
<sql>
create index idx_m_jour_ent_aggr_sum_aggr_date on m_journal_entry_aggregation_summary(aggregated_on_date);
</sql>
</changeSet>
<changeSet id="19" author="fineract" runInTransaction="false" context="postgresql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="office_id"/>
</not>
</preConditions>
<sql>
create index concurrently idx_m_jour_ent_aggr_sum_office_id on m_journal_entry_aggregation_summary(office_id);
</sql>
</changeSet>
<changeSet id="20" author="fineract" runInTransaction="false" context="mysql">
<preConditions onFail="MARK_RAN">
<not>
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="office_id"/>
</not>
</preConditions>
<sql>
create index idx_m_jour_ent_aggr_sum_office_id on m_journal_entry_aggregation_summary(office_id);
</sql>
</changeSet>
</databaseChangeLog>
@@ -23,7 +23,7 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
<changeSet author="fineract" id="trial-balance-summary-with-asset-owner-update-1">
<changeSet author="fineract" id="trial-balance-summary-with-asset-owner-update-2">
<update tableName="stretchy_report">
<column name="report_sql" value="WITH retained_earning AS (
SELECT DISTINCT '${endDate}' AS postingdate,
@@ -46,7 +46,6 @@
FROM m_journal_entry_aggregation_tracking
),
summary_snapshot_baseline_data AS (
--using m_journal_entry_aggregation_summary to fetch aggregated journal entry data
SELECT lp.NAME AS productname,
acc_gl_account.gl_code AS glcode,
acc_gl_account.NAME AS glname,
@@ -63,7 +62,6 @@
GROUP BY productname, glcode, glname, assetowner
),
post_snapshot_delta_data AS (
-- still using acc_gl_journal_entry for dates after last aggregated data and before the cob date
SELECT lp.NAME AS productname,
acc_gl_account.gl_code AS glcode,
acc_gl_account.NAME AS glname,
@@ -82,7 +80,6 @@
AND (acc_gl_journal_entry.office_id = ${officeId})
GROUP BY productname, glcode, glname, assetowner
),
-- fetch all data before cob date
merged_historical_data AS (
SELECT summary_snapshot_baseline_data.productname,
summary_snapshot_baseline_data.glcode,
@@ -95,7 +92,6 @@
AND summary_snapshot_baseline_data.productname = post_snapshot_delta_data.productname
AND summary_snapshot_baseline_data.assetowner = post_snapshot_delta_data.assetowner
),
-- fetch data for cob date
current_cob_data AS (
SELECT lp.name AS productname,
account_id,