Skip to content

Commit ceb9f0f

Browse files
committed
FINERACT-2386: Update read query to support other products
1 parent 334da61 commit ceb9f0f

File tree

3 files changed

+187
-41
lines changed

3 files changed

+187
-41
lines changed

fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/service/aggregationjob/JournalEntryAggregationJobReader.java

Lines changed: 66 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -79,25 +79,75 @@ private JournalEntryAggregationSummaryData mapRow(ResultSet rs, int rowNum) thro
7979

8080
private String buildAggregationQuery() {
8181
return """
82-
SELECT lp.id AS productId,
83-
acc_gl_account.id AS glAccountId,
84-
acc_gl_journal_entry.entity_type_enum AS entityTypeEnum,
85-
acc_gl_journal_entry.office_id AS officeId,
86-
aw.owner_id AS externalOwner,
87-
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 2 THEN amount ELSE 0 END) AS debitAmount,
88-
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 1 THEN amount ELSE 0 END) AS creditAmount,
89-
acc_gl_journal_entry.submitted_on_date as aggregatedOnDate,
90-
acc_gl_journal_entry.currency_code as currencyCode
82+
SELECT
83+
COALESCE(
84+
loan_product.id,
85+
savings_product.id,
86+
prov_product.id,
87+
share_product.id
88+
) AS productId,
89+
acc_gl_account.id AS glAccountId,
90+
acc_gl_journal_entry.entity_type_enum AS entityTypeEnum,
91+
acc_gl_journal_entry.office_id AS officeId,
92+
aw.owner_id AS externalOwner,
93+
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 2 THEN amount ELSE 0 END) AS debitAmount,
94+
SUM(CASE WHEN acc_gl_journal_entry.type_enum = 1 THEN amount ELSE 0 END) AS creditAmount,
95+
acc_gl_journal_entry.submitted_on_date AS aggregatedOnDate,
96+
acc_gl_journal_entry.currency_code AS currencyCode
9197
FROM acc_gl_account
92-
JOIN acc_gl_journal_entry ON acc_gl_account.id = acc_gl_journal_entry.account_id
93-
JOIN m_loan m ON m.id = acc_gl_journal_entry.entity_id
94-
JOIN m_product_loan lp ON lp.id = m.product_id
98+
JOIN acc_gl_journal_entry
99+
ON acc_gl_account.id = acc_gl_journal_entry.account_id
100+
101+
-- entity_type_enum = 1 → LOAN
102+
LEFT JOIN m_loan loan
103+
ON loan.id = acc_gl_journal_entry.entity_id
104+
AND acc_gl_journal_entry.entity_type_enum = 1
105+
LEFT JOIN m_product_loan loan_product
106+
ON loan_product.id = loan.product_id
107+
AND acc_gl_journal_entry.entity_type_enum = 1
108+
109+
-- entity_type_enum = 2 → SAVING
110+
LEFT JOIN m_savings_account savings
111+
ON savings.id = acc_gl_journal_entry.entity_id
112+
AND acc_gl_journal_entry.entity_type_enum = 2
113+
LEFT JOIN m_savings_product savings_product
114+
ON savings_product.id = savings.product_id
115+
AND acc_gl_journal_entry.entity_type_enum = 2
116+
117+
-- entity_type_enum = 3 → PROVISIONING
118+
LEFT JOIN m_provisioning_history prov
119+
ON prov.id = acc_gl_journal_entry.entity_id
120+
AND acc_gl_journal_entry.entity_type_enum = 3
121+
LEFT JOIN m_loanproduct_provisioning_entry prov_entry
122+
ON prov_entry.history_id = prov.id
123+
AND acc_gl_journal_entry.entity_type_enum = 3
124+
LEFT JOIN m_product_loan prov_product
125+
ON prov_product.id = prov_entry.product_id
126+
AND acc_gl_journal_entry.entity_type_enum = 3
127+
128+
-- entity_type_enum = 4 → SHARED
129+
LEFT JOIN m_share_account share
130+
ON share.id = acc_gl_journal_entry.entity_id
131+
AND acc_gl_journal_entry.entity_type_enum = 4
132+
LEFT JOIN m_share_product share_product
133+
ON share_product.id = share.product_id
134+
AND acc_gl_journal_entry.entity_type_enum = 4
135+
136+
-- external owner
95137
LEFT JOIN m_external_asset_owner_journal_entry_mapping aw
96-
ON aw.journal_entry_id = acc_gl_journal_entry.id
97-
WHERE acc_gl_journal_entry.entity_type_enum = 1
98-
AND acc_gl_journal_entry.submitted_on_date > ?
138+
ON aw.journal_entry_id = acc_gl_journal_entry.id
139+
140+
WHERE acc_gl_journal_entry.submitted_on_date > ?
99141
AND acc_gl_journal_entry.submitted_on_date <= ?
100-
GROUP BY productId, glAccountId, externalOwner, aggregatedOnDate, currencyCode, entityTypeEnum, officeId
142+
143+
GROUP BY
144+
productId,
145+
glAccountId,
146+
externalOwner,
147+
aggregatedOnDate,
148+
currencyCode,
149+
entityTypeEnum,
150+
officeId
101151
""";
102152
}
103153
}

fineract-provider/src/main/resources/db/changelog/tenant/parts/0200_add_journal_entry_aggregation_tables.xml

Lines changed: 120 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -112,26 +112,6 @@
112112
<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"/>
113113
<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"/>
114114
</changeSet>
115-
<changeSet id="4" author="fineract" runInTransaction="false" context="postgresql">
116-
<preConditions onFail="MARK_RAN">
117-
<not>
118-
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="submitted_on_date"/>
119-
</not>
120-
</preConditions>
121-
<sql>
122-
create index concurrently idx_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(submitted_on_date);
123-
</sql>
124-
</changeSet>
125-
<changeSet id="5" author="fineract" runInTransaction="false" context="postgresql">
126-
<preConditions onFail="MARK_RAN">
127-
<not>
128-
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="aggregated_on_date_to"/>
129-
</not>
130-
</preConditions>
131-
<sql>
132-
create unique index concurrently idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
133-
</sql>
134-
</changeSet>
135115

136116
<changeSet id="6" author="fineract" context="mysql">
137117
<preConditions onFail="MARK_RAN">
@@ -223,6 +203,26 @@
223203
<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"/>
224204
<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"/>
225205
</changeSet>
206+
<changeSet id="4" author="fineract" runInTransaction="false" context="postgresql">
207+
<preConditions onFail="MARK_RAN">
208+
<not>
209+
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="submitted_on_date"/>
210+
</not>
211+
</preConditions>
212+
<sql>
213+
create index concurrently idx_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(submitted_on_date);
214+
</sql>
215+
</changeSet>
216+
<changeSet id="5" author="fineract" runInTransaction="false" context="postgresql">
217+
<preConditions onFail="MARK_RAN">
218+
<not>
219+
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="aggregated_on_date_to"/>
220+
</not>
221+
</preConditions>
222+
<sql>
223+
create unique index concurrently idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
224+
</sql>
225+
</changeSet>
226226
<changeSet id="9" author="fineract" runInTransaction="false" context="mysql">
227227
<preConditions onFail="MARK_RAN">
228228
<not>
@@ -243,4 +243,104 @@
243243
create unique index idx2_m_journal_entry_aggregation_tracking on m_journal_entry_aggregation_tracking(aggregated_on_date_to);
244244
</sql>
245245
</changeSet>
246+
<changeSet id="11" author="fineract" runInTransaction="false" context="postgresql">
247+
<preConditions onFail="MARK_RAN">
248+
<not>
249+
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="job_execution_id"/>
250+
</not>
251+
</preConditions>
252+
<sql>
253+
create index concurrently idx_m_jour_ent_aggr_trac_job_exec_id on m_journal_entry_aggregation_tracking(job_execution_id);
254+
</sql>
255+
</changeSet>
256+
<changeSet id="12" author="fineract" runInTransaction="false" context="mysql">
257+
<preConditions onFail="MARK_RAN">
258+
<not>
259+
<indexExists tableName="m_journal_entry_aggregation_tracking" columnNames="job_execution_id"/>
260+
</not>
261+
</preConditions>
262+
<sql>
263+
create index idx_m_jour_ent_aggr_trac_job_exec_id on m_journal_entry_aggregation_tracking(job_execution_id);
264+
</sql>
265+
</changeSet>
266+
<changeSet id="13" author="fineract" runInTransaction="false" context="postgresql">
267+
<preConditions onFail="MARK_RAN">
268+
<not>
269+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="job_execution_id"/>
270+
</not>
271+
</preConditions>
272+
<sql>
273+
create index concurrently idx_m_jour_ent_aggr_sum_job_exec_id on m_journal_entry_aggregation_summary(job_execution_id);
274+
</sql>
275+
</changeSet>
276+
<changeSet id="14" author="fineract" runInTransaction="false" context="mysql">
277+
<preConditions onFail="MARK_RAN">
278+
<not>
279+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="job_execution_id"/>
280+
</not>
281+
</preConditions>
282+
<sql>
283+
create index idx_m_jour_ent_aggr_sum_job_exec_id on m_journal_entry_aggregation_summary(job_execution_id);
284+
</sql>
285+
</changeSet>
286+
<changeSet id="15" author="fineract" runInTransaction="false" context="postgresql">
287+
<preConditions onFail="MARK_RAN">
288+
<not>
289+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="product_id,entity_type_enum"/>
290+
</not>
291+
</preConditions>
292+
<sql>
293+
create index concurrently idx_m_jour_ent_aggr_sum_prod_id_entity_type on m_journal_entry_aggregation_summary(product_id, entity_type_enum);
294+
</sql>
295+
</changeSet>
296+
<changeSet id="16" author="fineract" runInTransaction="false" context="mysql">
297+
<preConditions onFail="MARK_RAN">
298+
<not>
299+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="product_id,entity_type_enum"/>
300+
</not>
301+
</preConditions>
302+
<sql>
303+
create index idx_m_jour_ent_aggr_sum_prod_id_entity_type on m_journal_entry_aggregation_summary(product_id, entity_type_enum);
304+
</sql>
305+
</changeSet>
306+
<changeSet id="17" author="fineract" runInTransaction="false" context="postgresql">
307+
<preConditions onFail="MARK_RAN">
308+
<not>
309+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="aggregated_on_date"/>
310+
</not>
311+
</preConditions>
312+
<sql>
313+
create index concurrently idx_m_jour_ent_aggr_sum_aggr_date on m_journal_entry_aggregation_summary(aggregated_on_date);
314+
</sql>
315+
</changeSet>
316+
<changeSet id="18" author="fineract" runInTransaction="false" context="mysql">
317+
<preConditions onFail="MARK_RAN">
318+
<not>
319+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="aggregated_on_date"/>
320+
</not>
321+
</preConditions>
322+
<sql>
323+
create index idx_m_jour_ent_aggr_sum_aggr_date on m_journal_entry_aggregation_summary(aggregated_on_date);
324+
</sql>
325+
</changeSet>
326+
<changeSet id="19" author="fineract" runInTransaction="false" context="postgresql">
327+
<preConditions onFail="MARK_RAN">
328+
<not>
329+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="office_id"/>
330+
</not>
331+
</preConditions>
332+
<sql>
333+
create index concurrently idx_m_jour_ent_aggr_sum_office_id on m_journal_entry_aggregation_summary(office_id);
334+
</sql>
335+
</changeSet>
336+
<changeSet id="20" author="fineract" runInTransaction="false" context="mysql">
337+
<preConditions onFail="MARK_RAN">
338+
<not>
339+
<indexExists tableName="m_journal_entry_aggregation_summary" columnNames="office_id"/>
340+
</not>
341+
</preConditions>
342+
<sql>
343+
create index idx_m_jour_ent_aggr_sum_office_id on m_journal_entry_aggregation_summary(office_id);
344+
</sql>
345+
</changeSet>
246346
</databaseChangeLog>

fineract-provider/src/main/resources/db/changelog/tenant/parts/0202_trial_balance_summary_with_asset_owner_journal_entry_aggregation.xml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
2424
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.3.xsd">
2525

26-
<changeSet author="fineract" id="trial-balance-summary-with-asset-owner-update-1">
26+
<changeSet author="fineract" id="trial-balance-summary-with-asset-owner-update-2">
2727
<update tableName="stretchy_report">
2828
<column name="report_sql" value="WITH retained_earning AS (
2929
SELECT DISTINCT '${endDate}' AS postingdate,
@@ -46,7 +46,6 @@
4646
FROM m_journal_entry_aggregation_tracking
4747
),
4848
summary_snapshot_baseline_data AS (
49-
--using m_journal_entry_aggregation_summary to fetch aggregated journal entry data
5049
SELECT lp.NAME AS productname,
5150
acc_gl_account.gl_code AS glcode,
5251
acc_gl_account.NAME AS glname,
@@ -63,7 +62,6 @@
6362
GROUP BY productname, glcode, glname, assetowner
6463
),
6564
post_snapshot_delta_data AS (
66-
-- still using acc_gl_journal_entry for dates after last aggregated data and before the cob date
6765
SELECT lp.NAME AS productname,
6866
acc_gl_account.gl_code AS glcode,
6967
acc_gl_account.NAME AS glname,
@@ -82,7 +80,6 @@
8280
AND (acc_gl_journal_entry.office_id = ${officeId})
8381
GROUP BY productname, glcode, glname, assetowner
8482
),
85-
-- fetch all data before cob date
8683
merged_historical_data AS (
8784
SELECT summary_snapshot_baseline_data.productname,
8885
summary_snapshot_baseline_data.glcode,
@@ -95,7 +92,6 @@
9592
AND summary_snapshot_baseline_data.productname = post_snapshot_delta_data.productname
9693
AND summary_snapshot_baseline_data.assetowner = post_snapshot_delta_data.assetowner
9794
),
98-
-- fetch data for cob date
9995
current_cob_data AS (
10096
SELECT lp.name AS productname,
10197
account_id,

0 commit comments

Comments
 (0)