FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

FINERACT-2455: WC - Introduce Loan OverpaidOnDate - #6346

Open
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date
Open

FINERACT-2455: WC - Introduce Loan OverpaidOnDate#6346
somasorosdpc wants to merge 2 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-overpaid-on-date

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Describe the changes made and why they were made. (Ignore if these details are present on the associated Apache Fineract JIRA ticket.)

Checklist

Please make sure these boxes are checked before submitting your pull request - thanks!

  • Write the commit message as per our guidelines
  • Acknowledge that we will not review PRs that are not passing the build ("green") - it is your responsibility to get a proposed PR to pass the build, not primarily the project's maintainers.
  • Create/update unit or integration tests for verifying the changes made.
  • Follow our coding conventions.
  • Add required Swagger annotation and update API documentation at fineract-provider/src/main/resources/static/legacy-docs/apiLive.htm with details of any API changes
  • This PR must not be a "code dump". Large changes can be made in a branch, with assistance. Ask for help on the developer mailing list.
  • If merging this PR resolves a JIRA issue, I will mark that issue as resolved and set "Fix Version/s" appropriately.

Your assigned reviewer(s) will follow our guidelines for code reviews.

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b6572 to f7a198aCompareAugust 28, 2026 15:41
@somasorosdpc
somasorosdpc marked this pull request as ready for review August 28, 2026 15:41
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from f7a198a to 922689fCompareAugust 31, 2026 10:34

@galovicsgalovics left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is red on this one (3 e2e failures in the new scenarios), and I think the failures are pointing at real gaps rather than flakes.

overpaidOnDate is only ever written at the moment of a status change, via WorkingCapitalLoanLifecycleStateMachine. Two consequences:

  1. UC11 (backdated repayment that tips the loan into overpayment): the date gets stamped with the transaction date passed in, not the date the loan actually became overpaid - expected: "2026-01-06" but was: "2026-01-03".
  2. UC12 (undoing one of two overpaying repayments, leaving the loan still OVERPAID): since determineAndTransition only acts when the status actually changes, and the loan stays OVERPAID after the undo, the date never gets recomputed and the stale value survives - expected: "2026-01-05" but was: "2026-01-03".

Core Loan's own lifecycle state machine (DefaultLoanLifecycleStateMachine.determineAndTransition) has an unconditional guard - if (isEmpty(totalOverpaid)) setOverpaidOnDate(null) - that runs independent of whether a transition fires. This WC version ties clearing exclusively to a transition, which is the root of both failures. Worth mirroring that guard, and deciding explicitly whether the semantics should be "date of the triggering transaction" (current impl) or "date first became overpaid, recomputed from history" (what the tests assert) - right now the code and the tests disagree.

  1. UC13: the business event never carries the new field - WorkingCapitalLoanAccountDataMapper still has @Mapping(target = "overpaidOnDate", ignore = true), which predates this PR adding the field to WorkingCapitalLoanData. That ignore needs to go now that there's something to map. expected: "2026-01-04" but was: null.

Two more things worth fixing before merge:

  • No backfill for loans that are already in OVERPAID status today - they'll report null forever since nothing will ever re-trigger a transition for them. The module has a precedent for add-column-plus-backfill in the same part file (0070_wc_loan_principal_balance_backfill.xml) - worth following that here.
  • No unit test for WorkingCapitalLoanLifecycleStateMachine at all (core has one for its equivalent). Given the date semantics are non-trivial across a dozen transitions, that would catch this class of bug faster than a 25-minute e2e shard.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch 5 times, most recently from 756001a to 78b5a7aCompareSeptember 2, 2026 14:14
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-overpaid-on-date branch from 78b5a7a to 9f110afCompareSeptember 2, 2026 14:21
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@somasorosdpc@galovics@ruzeynalov