FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc
, '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 - Loan Details API - Expose Payment date / Payment amount - #6349

Merged
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details
Sep 2, 2026
Merged

FINERACT-2455: WC - Loan Details API - Expose Payment date / Payment amount#6349
adamsaghy merged 3 commits into
apache:developfrom
openMF:FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details

Conversation

@somasorosdpc

Copy link
Copy Markdown
Contributor

Description

Loan Details API - Expose

  • Payment date / Payment amount
  • Repayment date / Repayment amount

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.

galovics
galovics previously requested changes Aug 31, 2026

@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.

The API change itself is purely additive so nothing breaking there. Two things worth fixing on the substance though.

GOODWILL_CREDIT is missing from the "payment" transaction type list, even though the WC module treats it as payment-like everywhere else - WorkingCapitalLoanWritePlatformServiceImpl handles it alongside REPAYMENT/PAYOUT_REFUND/CHARGE_ADJUSTMENT for undo and balance purposes, and WorkingCapitalLoanBusinessEventSerializer already includes it in its own PAYMENT_TRANSACTION_TYPES constant. For a loan whose most recent balance-reducing transaction is a goodwill credit, lastPaymentDate/lastPaymentAmount will silently report the older repayment instead - which contradicts the Swagger text ("last paid by any repayment like transaction").

That points at the real issue: this computation is a second, independent implementation of something that already exists.WorkingCapitalLoanBusinessEventSerializer.populateLastTransactions already computes the same four values for the external event payload, using LoanTransactionType.getRepaymentLikeTransactionTypes() (8 types, including goodwill credit) rather than this PR's hardcoded 3-type list. Once this ships, the API and the business event will report different lastPaymentDate for the same loan - a real data-consistency problem for anyone reconciling the two. Worth making this new service the single source of truth (or at least sharing the type list/constant) and having the serializer call into it instead of maintaining a parallel computation.

Smaller things: LastPaymentDetail (new) duplicates the shape of the existing TransactionDateAndAmountHolder record in the same package - worth reusing that instead. And LastPaymentDetail vs LastPaymentDetails differing by one character in the same package is a readability trap that already shows up at the call site (lastRepaymentDetail.getLastPaymentDate() reads like a bug even though it isn't one).

I know it's a draft, but since the value of this PR is entirely in "which transaction types count and which wins on a tie", I'd want a unit test on retrieveLastPaymentDetails covering the goodwill-credit case, reversed transactions being excluded, and the same-date tie-break before this comes out of draft.

Recommendation: CHANGES_REQUESTED

@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from 39a4242 to 96b6df6CompareAugust 31, 2026 15:36
@somasorosdpc
somasorosdpc marked this pull request as ready for review September 1, 2026 08:57
@somasorosdpc
somasorosdpcforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from d835f9d to 1f46605CompareSeptember 1, 2026 14:24
@adamsaghy
adamsaghyforce-pushed the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch from eb404ad to 6889c06CompareSeptember 2, 2026 10:09

@adamsaghyadamsaghy 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.

LGTM

@adamsaghyadamsaghy 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.

LGTM

@adamsaghy
adamsaghy dismissed galovics’s stale reviewSeptember 2, 2026 11:44

All concerns were addressed.

@adamsaghy
adamsaghy merged commit f1379a5 into apache:developSep 2, 2026
178 of 180 checks passed
@adamsaghy
adamsaghy deleted the FINERACT-2455/wc-loan-details-with-last-repayment-and--payment-details branch September 2, 2026 11:44
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.

4 participants

@somasorosdpc@galovics@adamsaghy@peter-kovacs-dpc