diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
index 82be2e7e4a0..e419f395fc1 100644
--- a/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/changelog-tenant.xml
@@ -247,4 +247,5 @@
+
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0229_trial_balance_summary_fix_empty_space.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0229_trial_balance_summary_fix_empty_space.xml
new file mode 100644
index 00000000000..e44c4890356
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0229_trial_balance_summary_fix_empty_space.xml
@@ -0,0 +1,449 @@
+
+
+
+
+
+ (SELECT latest FROM aggregated_date)
+ )
+ AND acc_gl_journal_entry.submitted_on_date < '${endDate}'
+ AND (acc_gl_journal_entry.office_id = ${officeId})
+ GROUP BY productname, glcode, glname, assetowner, originator_external_ids),
+ merged_historical_data AS (SELECT COALESCE(s.productname, p.productname) AS productname,
+ COALESCE(s.glcode, p.glcode) AS glcode,
+ COALESCE(s.glname, p.glname) AS glname,
+ COALESCE(s.assetowner, p.assetowner, 0) AS assetowner,
+ COALESCE(s.debitamount, 0) + COALESCE(p.debitamount, 0) AS debitamount,
+ COALESCE(s.creditamount, 0) + COALESCE(p.creditamount, 0) AS creditamount,
+ COALESCE(p.originator_external_ids, '') AS originator_external_ids
+ FROM summary_snapshot_baseline_data s
+ LEFT JOIN post_snapshot_delta_data p
+ ON s.glcode = p.glcode
+ AND s.productname = p.productname
+ AND s.assetowner = p.assetowner
+ AND s.originator_external_ids = p.originator_external_ids
+
+ UNION ALL
+
+ SELECT p.productname AS productname,
+ p.glcode AS glcode,
+ p.glname AS glname,
+ COALESCE(p.assetowner, 0) AS assetowner,
+ COALESCE(p.debitamount, 0) AS debitamount,
+ COALESCE(p.creditamount, 0) AS creditamount,
+ COALESCE(p.originator_external_ids, '') AS originator_external_ids
+ FROM post_snapshot_delta_data p
+ LEFT JOIN summary_snapshot_baseline_data s
+ ON s.glcode = p.glcode
+ AND s.productname = p.productname
+ AND s.assetowner = p.assetowner
+ AND s.originator_external_ids = p.originator_external_ids
+ WHERE s.glcode IS NULL),
+ current_cob_data AS (SELECT lp.name AS productname,
+ account_id,
+ acc_gl_account.gl_code AS glcode,
+ acc_gl_account.name AS glname,
+ CASE WHEN aw.owner_id IS NULL THEN 0 ELSE aw.owner_id END AS assetowner,
+ 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,
+ COALESCE(lo.originator_external_ids, '') AS originator_external_ids
+ FROM acc_gl_journal_entry
+ JOIN acc_gl_account 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
+ LEFT JOIN m_external_asset_owner_journal_entry_mapping aw
+ ON aw.journal_entry_id = acc_gl_journal_entry.id
+ LEFT JOIN loan_originators lo ON lo.loan_id = m.id
+ WHERE acc_gl_journal_entry.entity_type_enum = 1
+ AND acc_gl_journal_entry.manual_entry = FALSE
+ AND acc_gl_journal_entry.submitted_on_date = '${endDate}'
+ AND (acc_gl_journal_entry.office_id = ${officeId})
+ GROUP BY productname, account_id, glcode, glname, assetowner, originator_external_ids)
+
+SELECT *
+FROM (SELECT *
+ FROM retained_earning
+ WHERE glacct = (SELECT gl_code FROM acc_gl_account WHERE name = 'Retained Earnings Prior Year')
+
+ UNION
+
+ SELECT txnreport.postingdate,
+ txnreport.product,
+ txnreport.glacct,
+ txnreport.description,
+ txnreport.assetowner,
+ (COALESCE(txnreport.beginningbalance, 0) + COALESCE(summary.beginningbalance, 0)) AS beginningbalance,
+ txnreport.debitmovement AS debitmovement,
+ txnreport.creditmovement AS creditmovement,
+ (COALESCE(txnreport.endingbalance, 0) + COALESCE(summary.beginningbalance, 0)) AS endingbalance,
+ txnreport.originator_external_ids AS originator_external_ids
+ FROM (SELECT *
+ FROM (SELECT DISTINCT '${endDate}' AS postingdate,
+ loan.pname AS product,
+ loan.gl_code AS glacct,
+ loan.glname AS description,
+ COALESCE((SELECT external_id FROM m_external_asset_owner WHERE id = loan.assetowner),
+ 'self') AS assetowner,
+ loan.openingbalance AS beginningbalance,
+ (loan.debitamount * 1) AS debitmovement,
+ (loan.creditamount * -1) AS creditmovement,
+ (loan.openingbalance + loan.debitamount - loan.creditamount) AS endingbalance,
+ loan.originator_external_ids AS originator_external_ids
+ FROM (SELECT DISTINCT g.pname AS pname,
+ g.gl_code AS gl_code,
+ g.glname AS glname,
+ COALESCE(mh.assetowner, c.assetowner, 0) AS assetowner,
+ COALESCE(mh.debitamount, 0) - COALESCE(mh.creditamount, 0) AS openingbalance,
+ COALESCE(c.debitamount, 0) AS debitamount,
+ COALESCE(c.creditamount, 0) AS creditamount,
+ COALESCE(mh.originator_external_ids, c.originator_external_ids) AS originator_external_ids
+ FROM (SELECT DISTINCT ag.gl_code, ag.id, pl.NAME AS pname, ag.NAME AS glname
+ FROM acc_gl_account ag
+ JOIN acc_product_mapping am ON am.gl_account_id = ag.id AND am.product_type = 1
+ JOIN m_product_loan pl ON pl.id = am.product_id) g
+ LEFT JOIN merged_historical_data mh
+ ON g.gl_code = mh.glcode
+ AND mh.productname = g.pname
+ LEFT JOIN current_cob_data c
+ ON g.gl_code = c.glcode
+ AND c.productname = g.pname
+ AND mh.assetowner = c.assetowner
+ AND mh.originator_external_ids = c.originator_external_ids
+
+ UNION ALL
+
+ SELECT DISTINCT c.productname AS pname,
+ c.glcode AS gl_code,
+ c.glname AS glname,
+ COALESCE(c.assetowner, 0) AS assetowner,
+ 0 AS openingbalance,
+ COALESCE(c.debitamount, 0) AS debitamount,
+ COALESCE(c.creditamount, 0) AS creditamount,
+ COALESCE(matched.originator_external_ids, c.originator_external_ids) AS originator_external_ids
+ FROM current_cob_data c
+ LEFT JOIN (SELECT g3.gl_code, g3.pname, mh.assetowner, mh.originator_external_ids
+ FROM (SELECT DISTINCT ag.gl_code, pl.NAME AS pname
+ FROM acc_gl_account ag
+ JOIN acc_product_mapping am
+ ON am.gl_account_id = ag.id AND am.product_type = 1
+ JOIN m_product_loan pl ON pl.id = am.product_id) g3
+ LEFT JOIN merged_historical_data mh
+ ON g3.gl_code = mh.glcode
+ AND mh.productname = g3.pname) matched
+ ON matched.gl_code = c.glcode
+ AND matched.pname = c.productname
+ AND matched.assetowner = c.assetowner
+ AND matched.originator_external_ids = c.originator_external_ids
+ WHERE matched.gl_code IS NULL) loan) a) AS txnreport
+ LEFT JOIN retained_earning summary
+ ON txnreport.glacct = summary.glacct
+ AND txnreport.assetowner = summary.assetowner
+ AND summary.product = txnreport.product
+ AND summary.originator_external_ids = txnreport.originator_external_ids) report
+WHERE report.endingbalance != 0
+ OR report.debitmovement != 0
+ OR report.creditmovement != 0
+ORDER BY glacct
+
+ ]]>
+
+ report_name='Trial Balance Summary Report with Asset Owner'
+
+
+
+
+ (SELECT latest FROM aggregated_date)
+ )
+ AND acc_gl_journal_entry.submitted_on_date < '${endDate}'
+ AND (acc_gl_journal_entry.office_id = ${officeId})
+ GROUP BY productname, glcode, glname, assetowner, originator_external_ids),
+ merged_historical_data AS (SELECT COALESCE(s.productname, p.productname) AS productname,
+ COALESCE(s.glcode, p.glcode) AS glcode,
+ COALESCE(s.glname, p.glname) AS glname,
+ COALESCE(s.assetowner, p.assetowner, 0) AS assetowner,
+ COALESCE(s.debitamount, 0) + COALESCE(p.debitamount, 0) AS debitamount,
+ COALESCE(s.creditamount, 0) + COALESCE(p.creditamount, 0) AS creditamount,
+ COALESCE(p.originator_external_ids, '') AS originator_external_ids
+ FROM summary_snapshot_baseline_data s
+ LEFT JOIN post_snapshot_delta_data p
+ ON s.glcode = p.glcode
+ AND s.productname = p.productname
+ AND s.assetowner = p.assetowner
+ AND s.originator_external_ids = p.originator_external_ids
+
+ UNION ALL
+
+ SELECT p.productname AS productname,
+ p.glcode AS glcode,
+ p.glname AS glname,
+ COALESCE(p.assetowner, 0) AS assetowner,
+ COALESCE(p.debitamount, 0) AS debitamount,
+ COALESCE(p.creditamount, 0) AS creditamount,
+ COALESCE(p.originator_external_ids, '') AS originator_external_ids
+ FROM post_snapshot_delta_data p
+ LEFT JOIN summary_snapshot_baseline_data s
+ ON s.glcode = p.glcode
+ AND s.productname = p.productname
+ AND s.assetowner = p.assetowner
+ AND s.originator_external_ids = p.originator_external_ids
+ WHERE s.glcode IS NULL),
+ current_cob_data AS (SELECT lp.name AS productname,
+ account_id,
+ acc_gl_account.gl_code AS glcode,
+ acc_gl_account.name AS glname,
+ CASE WHEN aw.owner_id IS NULL THEN 0 ELSE aw.owner_id END AS assetowner,
+ 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,
+ COALESCE(lo.originator_external_ids, '') AS originator_external_ids
+ FROM acc_gl_journal_entry
+ JOIN acc_gl_account 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
+ LEFT JOIN m_external_asset_owner_journal_entry_mapping aw
+ ON aw.journal_entry_id = acc_gl_journal_entry.id
+ LEFT JOIN loan_originators lo ON lo.loan_id = m.id
+ WHERE acc_gl_journal_entry.entity_type_enum = 1
+ AND acc_gl_journal_entry.manual_entry = FALSE
+ AND acc_gl_journal_entry.submitted_on_date = '${endDate}'
+ AND (acc_gl_journal_entry.office_id = ${officeId})
+ GROUP BY productname, account_id, glcode, glname, assetowner, originator_external_ids)
+
+SELECT *
+FROM (SELECT *
+ FROM retained_earning
+ WHERE glacct = (SELECT gl_code FROM acc_gl_account WHERE name = 'Retained Earnings Prior Year')
+
+ UNION
+
+ SELECT txnreport.postingdate,
+ txnreport.product,
+ txnreport.glacct,
+ txnreport.description,
+ txnreport.assetowner,
+ (COALESCE(txnreport.beginningbalance, 0) + COALESCE(summary.beginningbalance, 0)) AS beginningbalance,
+ txnreport.debitmovement AS debitmovement,
+ txnreport.creditmovement AS creditmovement,
+ (COALESCE(txnreport.endingbalance, 0) + COALESCE(summary.beginningbalance, 0)) AS endingbalance,
+ txnreport.originator_external_ids AS originator_external_ids
+ FROM (SELECT *
+ FROM (SELECT DISTINCT '${endDate}' AS postingdate,
+ loan.pname AS product,
+ loan.gl_code AS glacct,
+ loan.glname AS description,
+ COALESCE((SELECT external_id FROM m_external_asset_owner WHERE id = loan.assetowner),
+ 'self') AS assetowner,
+ loan.openingbalance AS beginningbalance,
+ (loan.debitamount * 1) AS debitmovement,
+ (loan.creditamount * -1) AS creditmovement,
+ (loan.openingbalance + loan.debitamount - loan.creditamount) AS endingbalance,
+ loan.originator_external_ids AS originator_external_ids
+ FROM (SELECT DISTINCT g.pname AS pname,
+ g.gl_code AS gl_code,
+ g.glname AS glname,
+ COALESCE(mh.assetowner, c.assetowner, 0) AS assetowner,
+ COALESCE(mh.debitamount, 0) - COALESCE(mh.creditamount, 0) AS openingbalance,
+ COALESCE(c.debitamount, 0) AS debitamount,
+ COALESCE(c.creditamount, 0) AS creditamount,
+ COALESCE(mh.originator_external_ids, c.originator_external_ids) AS originator_external_ids
+ FROM (SELECT DISTINCT ag.gl_code, ag.id, pl.NAME AS pname, ag.NAME AS glname
+ FROM acc_gl_account ag
+ JOIN acc_product_mapping am ON am.gl_account_id = ag.id AND am.product_type = 1
+ JOIN m_product_loan pl ON pl.id = am.product_id) g
+ LEFT JOIN merged_historical_data mh
+ ON g.gl_code = mh.glcode
+ AND mh.productname = g.pname
+ LEFT JOIN current_cob_data c
+ ON g.gl_code = c.glcode
+ AND c.productname = g.pname
+ AND mh.assetowner = c.assetowner
+ AND mh.originator_external_ids = c.originator_external_ids
+
+ UNION ALL
+
+ SELECT DISTINCT c.productname AS pname,
+ c.glcode AS gl_code,
+ c.glname AS glname,
+ COALESCE(c.assetowner, 0) AS assetowner,
+ 0 AS openingbalance,
+ COALESCE(c.debitamount, 0) AS debitamount,
+ COALESCE(c.creditamount, 0) AS creditamount,
+ COALESCE(matched.originator_external_ids, c.originator_external_ids) AS originator_external_ids
+ FROM current_cob_data c
+ LEFT JOIN (SELECT g3.gl_code, g3.pname, mh.assetowner, mh.originator_external_ids
+ FROM (SELECT DISTINCT ag.gl_code, pl.NAME AS pname
+ FROM acc_gl_account ag
+ JOIN acc_product_mapping am
+ ON am.gl_account_id = ag.id AND am.product_type = 1
+ JOIN m_product_loan pl ON pl.id = am.product_id) g3
+ LEFT JOIN merged_historical_data mh
+ ON g3.gl_code = mh.glcode
+ AND mh.productname = g3.pname) matched
+ ON matched.gl_code = c.glcode
+ AND matched.pname = c.productname
+ AND matched.assetowner = c.assetowner
+ AND matched.originator_external_ids = c.originator_external_ids
+ WHERE matched.gl_code IS NULL) loan) a) AS txnreport
+ LEFT JOIN retained_earning summary
+ ON txnreport.glacct = summary.glacct
+ AND txnreport.assetowner = summary.assetowner
+ AND summary.product = txnreport.product
+ AND summary.originator_external_ids = txnreport.originator_external_ids) report
+WHERE report.endingbalance != 0
+ OR report.debitmovement != 0
+ OR report.creditmovement != 0
+ORDER BY glacct
+
+ ]]>
+
+ report_name='Trial Balance Summary Report with Asset Owner'
+
+
+