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 631adda7cd8..e3edd8d3824 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
@@ -251,4 +251,5 @@
+
diff --git a/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml
new file mode 100644
index 00000000000..4913d7b8afc
--- /dev/null
+++ b/fineract-provider/src/main/resources/db/changelog/tenant/parts/0233_backfill_repayment_start_date_type_on_loan.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ DROP PROCEDURE IF EXISTS backfill_repayment_start_date_type_on_loan;
+
+ CREATE PROCEDURE backfill_repayment_start_date_type_on_loan()
+ BEGIN
+ DECLARE v_rows_updated INT DEFAULT 1;
+
+ WHILE v_rows_updated > 0 DO
+ UPDATE m_loan l
+ INNER JOIN (
+ SELECT l2.id, lp2.repayment_start_date_type_enum
+ FROM m_loan l2
+ INNER JOIN m_product_loan lp2 ON lp2.id = l2.product_id
+ WHERE l2.repayment_start_date_type_enum IS NULL
+ AND lp2.repayment_start_date_type_enum IS NOT NULL
+ ORDER BY l2.id
+ LIMIT 10000
+ ) batch ON batch.id = l.id
+ SET l.repayment_start_date_type_enum = batch.repayment_start_date_type_enum;
+
+ SET v_rows_updated = ROW_COUNT();
+ COMMIT;
+ END WHILE;
+ END;
+
+ CALL backfill_repayment_start_date_type_on_loan();
+ DROP PROCEDURE backfill_repayment_start_date_type_on_loan;
+
+
+
+
+
+
+
+
+
+
+
+
+ DO $$
+ DECLARE
+ v_rows_updated INTEGER;
+ v_batch_count INTEGER := 0;
+ v_total_updated BIGINT := 0;
+ v_start_time TIMESTAMP := NOW();
+ v_duration NUMERIC;
+ BEGIN
+ RAISE NOTICE 'Starting repaymentStartDateType backfill at % with batch size: 10000', v_start_time;
+
+ LOOP
+ WITH batch AS (
+ SELECT l.id, lp.repayment_start_date_type_enum
+ FROM m_loan l
+ INNER JOIN m_product_loan lp ON lp.id = l.product_id
+ WHERE l.repayment_start_date_type_enum IS NULL
+ AND lp.repayment_start_date_type_enum IS NOT NULL
+ ORDER BY l.id
+ LIMIT 10000
+ FOR UPDATE OF l SKIP LOCKED
+ )
+ UPDATE m_loan
+ SET repayment_start_date_type_enum = batch.repayment_start_date_type_enum
+ FROM batch
+ WHERE m_loan.id = batch.id;
+
+ GET DIAGNOSTICS v_rows_updated = ROW_COUNT;
+ v_batch_count := v_batch_count + 1;
+ v_total_updated := v_total_updated + v_rows_updated;
+
+ RAISE NOTICE 'Batch %: Updated % rows. Total updated: %', v_batch_count, v_rows_updated, v_total_updated;
+
+ EXIT WHEN v_rows_updated = 0;
+ COMMIT;
+ END LOOP;
+
+ v_duration := EXTRACT(EPOCH FROM (NOW() - v_start_time));
+ RAISE NOTICE 'Completed repaymentStartDateType backfill at %. Total rows updated: %. Duration: % seconds',
+ NOW(), v_total_updated, v_duration;
+ END $$;
+
+
+