WEB-642: Add Originators tab on loan details view#3064
Conversation
|
Note
|
| Cohort / File(s) | Summary |
|---|---|
Component src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.ts, src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.html, src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.scss |
New standalone Angular component and template for the Originators tab; displays a Material table (columns: id, externalId, name, status, originatorTypeId, channelTypeId). Reads loanId from route and subscribes to parent route data. |
Resolver src/app/loans/common-resolvers/loan-originators.resolver.ts |
New providedIn:'root' resolver that extracts loanId from route (or parent) and calls LoansService.getLoanOriginators(loanId), returns Observable or error when loanId missing. |
Routing & UI Integration src/app/loans/loans-routing.module.ts, src/app/loans/loans-view/loans-view.component.html |
Imports and registers the originators child route under :loanId using the resolver; adds a new Originators tab link in the loans view navigation. General tab resolve object simplified to empty. |
Service & Model src/app/loans/loans.service.ts, src/app/loans/models/loan-account.model.ts |
Adds getLoanOriginators(loanId) to LoansService (HTTP GET /loans/{loanId}/originators). Adds LoanOriginator interface with fields id, externalId, name, status, originatorTypeId, channelTypeId. |
Translations src/assets/translations/*.json cs-CS.json, de-DE.json, en-US.json, es-CL.json, es-MX.json, fr-FR.json, it-IT.json, ko-KO.json, lt-LT.json, lv-LV.json, ne-NE.json, pt-PT.json, sw-SW.json, ... |
Adds translation keys ("Loan Originators", "Channel Type", "Originator Type", "Originators") across multiple locale files. |
Sequence Diagram(s)
sequenceDiagram
participant User
participant Router as Angular Router
participant Resolver as LoanOriginatorsResolver
participant Service as LoansService
participant API as HTTP API
participant Component as LoanOriginatorsTabComponent
User->>Router: Navigate to /loans/{loanId}/originators
Router->>Resolver: resolve(ActivatedRouteSnapshot)
Resolver->>Service: getLoanOriginators(loanId)
Service->>API: GET /loans/{loanId}/originators
API-->>Service: originators payload
Service-->>Resolver: Observable(originators)
Resolver-->>Router: resolved loanOriginatorsData
Router->>Component: activate LoanOriginatorsTabComponent (route data available)
Component->>Component: read parent route data and populate loanOriginatorsData
Component->>User: render Material table with originators
Estimated code review effort
🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
- WEB-521 fix(i18n): add missing translations and apply translate pipes across … #2934 — Overlapping changes to i18n translation JSONs adding related keys like "Loan Originators".
Suggested reviewers
- gkbishnoi07
- adamsaghy
🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
| Check name | Status | Explanation |
|---|---|---|
| Description Check | ✅ Passed | Check skipped - CodeRabbit’s high-level summary is enabled. |
| Title check | ✅ Passed | The title 'WEB-642: Add Originators tab on loan details view' directly and clearly describes the main change: adding a new Originators tab to the loan details view interface. |
| Docstring Coverage | ✅ Passed | No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check. |
✏️ Tip: You can configure your own custom pre-merge checks in the settings.
✨ Finishing touches
- 📝 Generate docstrings
🧪 Generate unit tests (beta)
- Create PR with unit tests
- Post copyable unit tests in a comment
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands and usage tips.
There was a problem hiding this comment.
Actionable comments posted: 7
🤖 Fix all issues with AI agents
In `@src/app/loans/common-resolvers/loan-originators.resolver.ts`:
- Around line 24-26: In resolve(route: ActivatedRouteSnapshot) ensure you
null-guard route.parent and the loanId before calling
loansService.getLoanOriginators: first check if route.paramMap.get('loanId')
returns a value, then if not check route.parent exists and
route.parent.paramMap.get('loanId'); if loanId is still null/undefined, avoid
calling loansService.getLoanOriginators (e.g., return of(null) or throw/redirect
as appropriate for this resolver) so you never call getLoanOriginators with a
null id and you never dereference route.parent when it is null.
In
`@src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.ts`:
- Around line 58-62: Constructor currently reads loanId from
route.parent.parent.snapshot.params and subscribes to route.parent.data with any
typing; change to use route.parent?.parent?.snapshot.paramMap.get('loanId') and
safely parse it to a number (e.g., parseInt with NaN handling) when assigning
loanId, and replace the subscription to route.parent.data.subscribe by reading
typed snapshot data from route.parent?.snapshot.data (define a
LoanOriginatorsResolverData interface or type for loanOriginatorsData) to avoid
the unnecessary subscription and remove the any type; update references to
loanOriginatorsData and ensure null/undefined checks around route.parent/parent
before accessing.
In `@src/assets/translations/ko-KO.json`:
- Around line 2140-2141: The translation for the "Originators" key currently
reads "창시자" and should be aligned with the terminology used for "Loan
Originators"; update the value for the "Originators" JSON key to use the same
Korean term (e.g., "대출 담당자") as used for "Loan Originators" so both labels are
consistent with "Originator Type" ("발신자 유형") and the rest of the UI.
In `@src/assets/translations/lt-LT.json`:
- Line 1088: The Lithuanian translation uses inconsistent terms: the key "Loan
Originators" is "Paskolų teikėjai" while the key "Originators" is "Kūrėjai"
(which can mean "creators"); confirm the preferred locale term with the locale
owner and make them consistent across the file by updating the "Originators"
entry (and any other occurrences of "Originators"/similar keys) to the agreed
term (e.g., change "Kūrėjai" to "Paskolų teikėjai" if that is confirmed) so all
originator labels use the same Lithuanian phrasing.
In `@src/assets/translations/lv-LV.json`:
- Around line 2139-2140: Update the Latvian translations for the keys
"Originator Type" and "Originators" to match the terminology used for "Loan
Originators" and fix grammatical case: replace "Originators" value "Izcelsmes"
with "Izsniedzēji" and replace "Originator Type" value "Izcelsmes veids" with
"Izsniedzēja veids" so they align with "Aizdevumu izsniedzēji" and use correct
nominative forms.
In `@src/assets/translations/pt-PT.json`:
- Around line 2139-2140: Update the pt-PT translations for the loan-originator
related keys to use the specific financial term used elsewhere: replace the
value for "Originator Type" with "Tipo de originador" and the value for
"Originators" with "Originadores" in src/assets/translations/pt-PT.json so they
match the terminology used by LoanOriginatorsTabComponent and sister-language
translations.
- Line 1090: Replace the inconsistent Portuguese translations for the Originator
family: change the value "Agentes de Crédito" (for the "Loan Originators" key)
to "Originadores de Empréstimo", change "Criadores" to "Originadores", and
change "Tipo de origem" to "Tipo de Originador" so all three related JSON
entries use consistent, domain-accurate terminology.
🧹 Nitpick comments (5)
src/assets/translations/de-DE.json (1)
1090-1090: Align “Originators” terminology with the loan context.
"Originators": "Urheber"and"Originator Type": "Ursprungstyp"read like author/origin rather than the loan “originator” role. Consider aligning them with"Loan Originators": "Kreditvermittler"(e.g., “Originatoren” / “Originator-Typ” or “Kreditvermittler” / “Kreditvermittler-Typ”) for consistency and clarity.💡 Possible translation alignment
- "Originator Type": "Ursprungstyp", - "Originators": "Urheber", + "Originator Type": "Originator-Typ", + "Originators": "Originatoren",Also applies to: 2139-2140
src/assets/translations/fr-FR.json (1)
1090-1090: Unify “Originator” terminology across related keys.“Les courtiers en prêts”, “Créateurs”, and “Type d'initiateur” don’t align and can confuse users. Recommend using one consistent domain term across all three labels.
🔧 Suggested wording (consistent terminology)
- "Loan Originators": "Les courtiers en prêts", + "Loan Originators": "Originateurs de prêts", ... - "Originator Type": "Type d'initiateur", - "Originators": "Créateurs", + "Originator Type": "Type d'originateur", + "Originators": "Originateurs",Also applies to: 2139-2140
src/app/loans/loans.service.ts (1)
775-780: Prefer a typed response and parameter overany.Please align
getLoanOriginatorswith the backend response shape to keep type safety consistent. Consider typingloanIdasstring | numberand returning a typedObservable.
As per coding guidelines, for Angular code: verify component separation, trackBy on *ngFor, strict type safety, and clean observable patterns.♻️ Proposed typing update (adjust response shape if needed)
-import { DisbursementData } from './models/loan-account.model'; +import { DisbursementData, LoanOriginator } from './models/loan-account.model'; +interface LoanOriginatorsResponse { + originators: LoanOriginator[]; +} - getLoanOriginators(loanId: any) { - return this.http.get(`/loans/${loanId}/originators`); - } + getLoanOriginators(loanId: string | number): Observable<LoanOriginatorsResponse> { + return this.http.get<LoanOriginatorsResponse>(`/loans/${loanId}/originators`); + }src/app/loans/common-resolvers/loan-originators.resolver.ts (1)
17-26: Prefer a typed resolver output instead ofObservable<any>.Consider implementing
Resolve<LoanOriginatorsResponse>and returningObservable<LoanOriginatorsResponse>(using the model introduced for originators) to keep strict typing across route data.As per coding guidelines: verify component separation, trackBy on *ngFor, strict type safety, and clean observable patterns.
src/app/loans/loans-routing.module.ts (1)
110-114: Drop the emptyresolveblock.
It doesn’t add value and can be removed to keep routing config clean.♻️ Suggested cleanup
path: 'general', component: GeneralTabComponent, data: { title: 'General', breadcrumb: 'General', routeParamBreadcrumb: false }, - resolve: {}
| constructor() { | ||
| this.loanId = this.route.parent.parent.snapshot.params['loanId']; | ||
| this.route.parent.data.subscribe((data: { loanOriginatorsData: any }) => { | ||
| this.loanOriginatorsData = data.loanOriginatorsData.originators; | ||
| }); |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
fd "loan-originators-tab.component.ts" -t fRepository: openMF/web-app
Length of output: 137
🏁 Script executed:
cat -n src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.tsRepository: openMF/web-app
Length of output: 2127
🏁 Script executed:
cat -n src/app/loans/models/loan-account.model.ts | head -100Repository: openMF/web-app
Length of output: 3334
🏁 Script executed:
rg "interface LoanOriginator" src/app/loans/models/loan-account.model.ts -A 10Repository: openMF/web-app
Length of output: 216
🏁 Script executed:
fd "routing\|resolver" src/app/loans -t f | head -20Repository: openMF/web-app
Length of output: 40
🏁 Script executed:
rg "loanOriginatorsData\|LoanOriginators" src/app/loans --type ts -B 2 -A 2Repository: openMF/web-app
Length of output: 40
🏁 Script executed:
fd "routing\|module" src/app/loans -t ts | head -20Repository: openMF/web-app
Length of output: 227
🏁 Script executed:
fd "routing\|module" src/app/loans -type f | grep -E "\.(ts|js)$"Repository: openMF/web-app
Length of output: 228
🏁 Script executed:
rg "loan-originators-tab" src/app/loans --type-list | headRepository: openMF/web-app
Length of output: 447
🏁 Script executed:
rg "loanOriginatorsData" src/app/loans -B 3 -A 3Repository: openMF/web-app
Length of output: 3134
🏁 Script executed:
rg "LoanOriginatorsResolver" src/app/loans -B 5 -A 15Repository: openMF/web-app
Length of output: 4901
🏁 Script executed:
cat -n src/app/loans/common-resolvers/loan-originators.resolver.tsRepository: openMF/web-app
Length of output: 1123
🏁 Script executed:
rg "getLoanOriginators" src/app/loans -B 2 -A 10Repository: openMF/web-app
Length of output: 902
🏁 Script executed:
cat -n src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.html | head -30Repository: openMF/web-app
Length of output: 1351
🏁 Script executed:
rg "originators" src/app/loans --type-add "json:*.json" -l | head -10Repository: openMF/web-app
Length of output: 339
Harden route param parsing and resolver data typing.
loanId is assigned from a string param without conversion, and resolver data is typed as any with an unnecessary subscription. Prefer paramMap.get() with numeric parsing and snapshot data access with proper types to maintain strict type safety and avoid memory leaks.
✅ Suggested fix
- loanId: number;
+ loanId: number | null = null;
constructor() {
- this.loanId = this.route.parent.parent.snapshot.params['loanId'];
- this.route.parent.data.subscribe((data: { loanOriginatorsData: any }) => {
- this.loanOriginatorsData = data.loanOriginatorsData.originators;
- });
+ const loanIdParam = this.route.parent?.parent?.snapshot.paramMap.get('loanId');
+ this.loanId = loanIdParam ? Number(loanIdParam) : null;
+
+ const data = this.route.parent?.snapshot.data['loanOriginatorsData'] as
+ | { originators: LoanOriginator[] }
+ | undefined;
+ this.loanOriginatorsData = data?.originators ?? [];
}🤖 Prompt for AI Agents
In
`@src/app/loans/loans-view/loan-originators-tab/loan-originators-tab.component.ts`
around lines 58 - 62, Constructor currently reads loanId from
route.parent.parent.snapshot.params and subscribes to route.parent.data with any
typing; change to use route.parent?.parent?.snapshot.paramMap.get('loanId') and
safely parse it to a number (e.g., parseInt with NaN handling) when assigning
loanId, and replace the subscription to route.parent.data.subscribe by reading
typed snapshot data from route.parent?.snapshot.data (define a
LoanOriginatorsResolverData interface or type for loanOriginatorsData) to avoid
the unnecessary subscription and remove the any type; update references to
loanOriginatorsData and ensure null/undefined checks around route.parent/parent
before accessing.
| "Originator Type": "발신자 유형", | ||
| "Originators": "창시자", |
There was a problem hiding this comment.
Align “Originators” term with “Loan Originators” for consistency.
Right now “Originators” is translated as “창시자”, which doesn’t match “대출 담당자” used for “Loan Originators.” Consider using a consistent term across both labels to avoid UI confusion.
💡 Suggested tweak
- "Originators": "창시자",
+ "Originators": "대출 담당자",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "Originator Type": "발신자 유형", | |
| "Originators": "창시자", | |
| "Originator Type": "발신자 유형", | |
| "Originators": "대출 담당자", |
🤖 Prompt for AI Agents
In `@src/assets/translations/ko-KO.json` around lines 2140 - 2141, The translation
for the "Originators" key currently reads "창시자" and should be aligned with the
terminology used for "Loan Originators"; update the value for the "Originators"
JSON key to use the same Korean term (e.g., "대출 담당자") as used for "Loan
Originators" so both labels are consistent with "Originator Type" ("발신자 유형") and
the rest of the UI.
| "Loan Delinquency Installment Tags": "Paskolos nusikalstamumo įmokos žymos", | ||
| "Loan Details": "Paskolos informacija", | ||
| "Loan Disbursal": "Paskolos išmokimas", | ||
| "Loan Originators": "Paskolų teikėjai", |
There was a problem hiding this comment.
Verify Lithuanian terminology consistency for originator labels.
“Loan Originators” is translated as “Paskolų teikėjai” while “Originators” uses “Kūrėjai”, which can read as “creators” and may feel inconsistent in the UI. Please confirm the intended term with the locale owner and align if needed.
Also applies to: 1450-1450, 2137-2138
🤖 Prompt for AI Agents
In `@src/assets/translations/lt-LT.json` at line 1088, The Lithuanian translation
uses inconsistent terms: the key "Loan Originators" is "Paskolų teikėjai" while
the key "Originators" is "Kūrėjai" (which can mean "creators"); confirm the
preferred locale term with the locale owner and make them consistent across the
file by updating the "Originators" entry (and any other occurrences of
"Originators"/similar keys) to the agreed term (e.g., change "Kūrėjai" to
"Paskolų teikėjai" if that is confirmed) so all originator labels use the same
Lithuanian phrasing.
| "Originator Type": "Izcelsmes veids", | ||
| "Originators": "Izcelsmes", |
There was a problem hiding this comment.
Translation inconsistency with "Loan Originators".
The translations for "Originator Type" and "Originators" use "Izcelsmes" (origin), but "Loan Originators" on line 1090 uses "izsniedzēji" (issuers/originators). Additionally, "Izcelsmes" appears to be genitive singular rather than nominative plural.
For consistency, consider:
- "Originators" → "Izsniedzēji" (to match "Aizdevumu izsniedzēji")
- "Originator Type" → "Izsniedzēja veids" (originator's type)
Suggested fix for consistency
- "Originator Type": "Izcelsmes veids",
- "Originators": "Izcelsmes",
+ "Originator Type": "Izsniedzēja veids",
+ "Originators": "Izsniedzēji",🤖 Prompt for AI Agents
In `@src/assets/translations/lv-LV.json` around lines 2139 - 2140, Update the
Latvian translations for the keys "Originator Type" and "Originators" to match
the terminology used for "Loan Originators" and fix grammatical case: replace
"Originators" value "Izcelsmes" with "Izsniedzēji" and replace "Originator Type"
value "Izcelsmes veids" with "Izsniedzēja veids" so they align with "Aizdevumu
izsniedzēji" and use correct nominative forms.
| "Loan Delinquency Installment Tags": "Tags de parcelamento de inadimplência de empréstimo", | ||
| "Loan Details": "Detalhes do empréstimo", | ||
| "Loan Disbursal": "Desembolso do empréstimo", | ||
| "Loan Originators": "Agentes de Crédito", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
# Check the context around line 1090 in the PT-PT translation file
sed -n '1085,1095p' src/assets/translations/pt-PT.jsonRepository: openMF/web-app
Length of output: 743
🏁 Script executed:
# Check the related lines mentioned (1452, 2139-2140)
echo "=== Line 1452 context ===" && sed -n '1448,1455p' src/assets/translations/pt-PT.json
echo "=== Lines 2139-2140 context ===" && sed -n '2135,2145p' src/assets/translations/pt-PT.jsonRepository: openMF/web-app
Length of output: 847
🏁 Script executed:
# Check if there are other uses of "Originators" or similar terms in the file
rg -n "Originator|Agente de Crédito" src/assets/translations/pt-PT.json | head -20Repository: openMF/web-app
Length of output: 197
🏁 Script executed:
# Also check the English file to understand the context better
rg -n "Loan Originator|Channel Type" src/assets/translations/en.json | head -20Repository: openMF/web-app
Length of output: 129
🏁 Script executed:
# Find the English translation file
fd -t f "en\.json" src/assets/translations/Repository: openMF/web-app
Length of output: 40
🏁 Script executed:
# Check if there's an English translation at a different location
find src/assets/translations -name "*en*" -type fRepository: openMF/web-app
Length of output: 92
🏁 Script executed:
# Get broader context around the originators-related entries
grep -n "Originator\|Loan Originators" src/assets/translations/pt-PT.jsonRepository: openMF/web-app
Length of output: 197
🏁 Script executed:
# Check if the codebase has any financial/lending context documentation
find . -name "*.md" -o -name "*.txt" | xargs grep -l "Originator\|originat" 2>/dev/null | head -5Repository: openMF/web-app
Length of output: 40
🏁 Script executed:
# Check the English source translations for these terms
sed -n '1088,1092p' src/assets/translations/en-US.json
echo "---"
sed -n '2137,2142p' src/assets/translations/en-US.jsonRepository: openMF/web-app
Length of output: 970
🏁 Script executed:
# Search for all "Originator" related terms in English file
grep -n "Originator" src/assets/translations/en-US.jsonRepository: openMF/web-app
Length of output: 198
Fix terminology consistency for "Originator(s)" family across all three related translations.
Three related translations need correction for domain accuracy and consistency:
- Line 1090: "Agentes de Crédito" (loan officers) should use "Originadores de Empréstimo" to reflect the origination role rather than officer roles.
- Line 2140: "Criadores" (creators) is semantically incorrect in financial context; should be "Originadores" to align with the loan origination domain.
- Line 2139: "Tipo de origem" should be "Tipo de Originador" to maintain consistency with corrected terminology.
🔤 Suggested adjustments
- "Loan Originators": "Agentes de Crédito",
+ "Loan Originators": "Originadores de Empréstimo",- "Originator Type": "Tipo de origem",
+ "Originator Type": "Tipo de Originador",- "Originators": "Criadores",
+ "Originators": "Originadores",🤖 Prompt for AI Agents
In `@src/assets/translations/pt-PT.json` at line 1090, Replace the inconsistent
Portuguese translations for the Originator family: change the value "Agentes de
Crédito" (for the "Loan Originators" key) to "Originadores de Empréstimo",
change "Criadores" to "Originadores", and change "Tipo de origem" to "Tipo de
Originador" so all three related JSON entries use consistent, domain-accurate
terminology.
7aae14e to
f1e3813
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@src/assets/translations/es-MX.json`:
- Line 1089: The translation for the key "Loan Originators" uses "Originadores
de préstamos" which is inconsistent with the project's use of "Crédito"; update
the value for the "Loan Originators" key to use the established term (e.g.,
"Originadores de crédito" or "Originadores de Crédito") so it aligns with other
es‑MX entries using "Crédito".
🧹 Nitpick comments (2)
src/app/loans/common-resolvers/loan-originators.resolver.ts (1)
9-29: Prefer a typed resolver contract instead ofany.
UsingObservable<any>weakens type safety and makes consumption harder. Consider returningObservable<LoanOriginator[]>and aligning the service signature.♻️ Proposed typing update
-import { Observable, throwError } from 'rxjs'; +import { Observable, throwError } from 'rxjs'; +import { LoanOriginator } from 'app/loans/models/loan-account.model'; @@ - resolve(route: ActivatedRouteSnapshot): Observable<any> { + resolve(route: ActivatedRouteSnapshot): Observable<LoanOriginator[]> {If you align the service too:
// src/app/loans/loans.service.ts getLoanOriginators(loanId: string): Observable<LoanOriginator[]> { return this.http.get<LoanOriginator[]>(`/loans/${loanId}/originators`); }As per coding guidelines:
src/app/**: For Angular code: verify component separation, trackBy on *ngFor, strict type safety, and clean observable patterns.src/assets/translations/es-CL.json (1)
1089-1091: Consider aligning “Loan” terminology with existing “Crédito” translations.Most “Loan” strings in this locale use “Crédito” (e.g., “Loan Products” → “Productos de Crédito”). To keep UI terminology consistent, consider “Originadores de crédito” here.
💡 Suggested tweak
- "Loan Originators": "Originadores de préstamos", + "Loan Originators": "Originadores de crédito",
| "Loan Delinquency Installment Tags": "Etiquetas de morosidad de cuotas", | ||
| "Loan Details": "Detalles del Crédito", | ||
| "Loan Disbursal": "Desembolso de préstamos", | ||
| "Loan Originators": "Originadores de préstamos", |
There was a problem hiding this comment.
Align “Loan” terminology with existing “Crédito” translations.
“Originadores de préstamos” diverges from the rest of the es‑MX file where “Loan” is translated as “Crédito.” Consider standardizing to avoid UI inconsistency.
🔧 Suggested tweak
- "Loan Originators": "Originadores de préstamos",
+ "Loan Originators": "Originadores de Crédito",📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "Loan Originators": "Originadores de préstamos", | |
| "Loan Originators": "Originadores de Crédito", |
🤖 Prompt for AI Agents
In `@src/assets/translations/es-MX.json` at line 1089, The translation for the key
"Loan Originators" uses "Originadores de préstamos" which is inconsistent with
the project's use of "Crédito"; update the value for the "Loan Originators" key
to use the established term (e.g., "Originadores de crédito" or "Originadores de
Crédito") so it aligns with other es‑MX entries using "Crédito".
Description
Add new tab where attached loan originators are listed
WEB-642
Related issues and discussion
Screenshots, if any
Checklist
Please make sure these boxes are checked before submitting your pull request - thanks!
If you have multiple commits please combine them into one commit by squashing them.
Read and understood the contribution guidelines at
web-app/.github/CONTRIBUTING.md.Summary by CodeRabbit
New Features
Documentation
✏️ Tip: You can customize this high-level summary in your review settings.