Skip to content

WEB-657: Working Capital loan Breach pause action#3651

Open
alberto-art3ch wants to merge 1 commit into
openMF:devfrom
alberto-art3ch:WEB-657/working-capital-loan-breach-pause-action
Open

WEB-657: Working Capital loan Breach pause action#3651
alberto-art3ch wants to merge 1 commit into
openMF:devfrom
alberto-art3ch:WEB-657/working-capital-loan-breach-pause-action

Conversation

@alberto-art3ch

@alberto-art3ch alberto-art3ch commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

Description

Now that we can have Breach for Working Capital loans, we can use the Breach actions in this case pause action

Related issues and discussion

WEB-657

Screenshots

Screen.Recording.2026-06-14.at.9.42.20.PM.mov

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

Release Notes

  • New Features
    • Added a “Breach Actions” tab for Working Capital loans with KPI summary, Pause Timeline visualization, and breach actions records.
    • Added status-based filtering, plus an empty-state when no breach actions exist.
    • Added a permission-gated “Pause Breach” action to create a new pause entry.
  • Bug Fixes
    • Updated the delinquency action dialog title to use the provided context label.
  • Documentation
    • Refreshed UI translations across supported languages (including the new “Breach Actions” text).
  • Style
    • Updated charge tab styling to use shared redesign tokens.

@coderabbitai

coderabbitai Bot commented Jun 15, 2026

Copy link
Copy Markdown

Review Change Stack

Note

.coderabbit.yaml has unrecognized properties

CodeRabbit is using all valid settings from your configuration. Unrecognized properties (listed below) have been ignored and may indicate typos or deprecated fields that can be removed.

⚠️ Parsing warnings (1)
Validation error: Unrecognized key: "pre_merge_checks"
⚙️ Configuration instructions
  • Please see the configuration documentation for more information.
  • You can also validate your configuration using the online YAML validator.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: d341cdda-ba37-4b52-b4bd-afd1f66b6bb4

📥 Commits

Reviewing files that changed from the base of the PR and between 719116d and b777ee3.

📒 Files selected for processing (27)
  • src/app/core/utils/dates.ts
  • src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
  • src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html
  • src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts
  • src/app/loans/loans-routing.module.ts
  • src/app/loans/loans-view/charges-tab/charges-tab.component.scss
  • src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts
  • src/app/loans/loans-view/loans-view.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts
  • src/app/loans/loans.module.ts
  • src/app/loans/loans.service.ts
  • src/assets/styles/_redesign-tokens.scss
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json
✅ Files skipped from review due to trivial changes (3)
  • src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.ts
  • src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts
  • src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html
🚧 Files skipped from review as they are similar to previous changes (11)
  • src/app/loans/loans.module.ts
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html
  • src/assets/styles/_redesign-tokens.scss
  • src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
  • src/app/loans/loans-routing.module.ts
  • src/app/core/utils/dates.ts
  • src/app/loans/loans.service.ts
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss
  • src/app/loans/loans-view/loans-view.component.html
  • src/app/loans/loans-view/charges-tab/charges-tab.component.scss
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts

Walkthrough

Adds a new "Breach Actions" tab for Working Capital loans: two LoansService HTTP methods, a route resolver, a standalone LoanBreachActionsTabComponent with KPI strip, SVG pause timeline, and filterable table, plus routing/module/nav wiring. Expands date utilities with a Month enum, refactors design tokens into a shared SCSS module, and synchronizes translation keys (including new breach/pause/timeline strings) across 12 locale JSON files.

Changes

Loan Breach Actions Feature

Layer / File(s) Summary
LoansService breach-action API methods
src/app/loans/loans.service.ts
Adds getBreachActions(loanId) (GET) and createBreachAction(loanId, payload) (POST) targeting /working-capital-loans/:loanId/breach-actions.
LoanBreachActionsResolver
src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
New injectable resolver extending LoanBaseResolver: reads loanId from route or parent and conditionally fetches breach actions for numeric working-capital loan IDs.
LoanBreachActionsTabComponent core logic
src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts
Standalone component with signal/computed data model transforming raw breach actions into display rows with status, durations, KPI values, and SVG timeline bars; handles status filtering, dialog-driven pause creation, payload dispatch, and data refresh.
LoanBreachActionsTabComponent template and styles
src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html, loan-breach-actions-tab.component.scss
HTML template renders KPI strip, SVG pause timeline with month grid and status-colored bars, permission-gated "Pause Breach" button, filter chips, breach-actions table with pills/duration bars, and two empty states. SCSS covers light/dark theme tokens, chip animations, timeline bar variants, staggered row fade-in, duration-bar fills, and an 880px responsive breakpoint.
Routing, module registration, and navigation link
src/app/loans/loans-routing.module.ts, src/app/loans/loans.module.ts, src/app/loans/loans-view/loans-view.component.html
Registers breach-actions child route under :loanId with resolver and component; imports LoanBreachActionsTabComponent into LoansModule; adds a conditional mat-tab-link visible only for active working-capital loans with a breach value.
Dialog component reuse wiring
src/app/loans/custom-dialog/loan-delinquency-action-dialog/loan-delinquency-action-dialog.component.html, .component.ts, src/app/loans/loans-view/loan-delinquency-tags-tab/loan-delinquency-tags-tab.component.ts
Minor updates enabling the LoanDelinquencyActionDialogComponent to be dynamically titled and reused for breach-action pauses: dialog title now derives from data.title, tags-tab passes a title field when opening the dialog, and unused ReactiveFormsModule import is removed.

Supporting Infrastructure Updates

Layer / File(s) Summary
Month enum and monthLabels getter
src/app/core/utils/dates.ts
Adds a new exported Month enum with abbreviated month labels (Jan–Dec) and a Dates.monthLabels getter returning the enum values as an array for use in timeline and calendar UIs.
Design token refactoring and SCSS token file
src/assets/styles/_redesign-tokens.scss, src/app/loans/loans-view/charges-tab/charges-tab.component.scss
Introduces a new shared SCSS token file defining ch-tokens and ch-dark-tokens mixins that centralize light/dark theme CSS variables for charge/transaction components; refactors charges-tab.component.scss to use these mixins instead of hardcoded variable definitions.

Translation Key Synchronization (12 locales)

Layer / File(s) Summary
English (en-US) baseline
src/assets/translations/en-US.json
Adds/reorders entries in buttons, heading (including "Loan Breach Actions", "No Breach Actions", "Pause Timeline"), and inputs (including products.loan.amortizationType nested structure and Zip); removes leading BOM marker.
Czech, German, Spanish (CL/MX), French, Italian, Korean, Lithuanian, Latvian, Portuguese
src/assets/translations/cs-CS.json, de-DE.json, es-CL.json, es-MX.json, fr-FR.json, it-IT.json, ko-KO.json, lt-LT.json, lv-LV.json, pt-PT.json
Mirror the same key additions and reorderings with locale-specific strings; remove BOM markers where applicable; add breach/pause-timeline heading keys and all new inputs field-label variants including products.loan.amortizationType to each locale.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • adamsaghy
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: implementing the Breach pause action feature for Working Capital loans, which aligns with the PR's core objective and the substantial implementation across resolver, component, service, and template files.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Note

Due to the large number of review comments, Critical, Major severity comments were prioritized as inline comments.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/assets/translations/cs-CS.json (1)

1-5086: ⚠️ Potential issue | 🟠 Major

Align cs-CS.json with en-US.json

  • The locale tree is out of parity with the canonical file: 128 keys are missing and 304 extra keys are present. Normalize the key structure so this translation stays in sync with en-US.json.
  • No duplicate keys are present in either file, so the remaining fix is the key-shape mismatch.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/cs-CS.json` around lines 1 - 5086, The Czech
translation file (cs-CS.json) has diverged from the canonical English version
(en-US.json) with 128 missing keys and 304 extraneous keys. To fix this, compare
the complete key hierarchy in cs-CS.json against en-US.json and: (1) remove all
keys that exist in cs-CS.json but not in en-US.json (the 304 extra keys), and
(2) add all keys that exist in en-US.json but not in cs-CS.json (the 128 missing
keys), preserving their nested structure and using appropriate Czech
translations or copying placeholder values. This will synchronize the two files'
key shapes while maintaining the existing Czech translations for matching keys.
src/assets/translations/de-DE.json (1)

1574-3118: ⚠️ Potential issue | 🟠 Major

Fix de-DE translation file key and placeholder parity issues.

Verification found significant discrepancies:

  • 127 missing keys in de-DE (e.g., validation errors, business event labels, UI inputs)
  • 290 extra/orphaned keys in de-DE (e.g., audit trail, permissions, messages)
  • 2 placeholder mismatches:
    • errors.Password is required: en-US has no placeholders; de-DE has {{min}}
    • labels.commons.Password validation: en-US has {{minchar}}; de-DE has {{michar}} (typo)

Align de-DE keys with en-US, fix the michar typo to minchar, and run npx prettier --write . to format before merging.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/de-DE.json` around lines 1574 - 3118, The de-DE.json
translation file has key and placeholder parity issues with the en-US reference
file. First, identify and add the 127 missing keys from en-US to de-DE (such as
validation errors, business event labels, and UI inputs). Second, remove the 290
extra or orphaned keys that exist in de-DE but not in en-US. Third, fix the two
placeholder mismatches: in the errors.Password is required key, remove the
{{min}} placeholder from the German translation, and in the
labels.commons.Password validation key, correct the typo by changing {{michar}}
to {{minchar}}. Finally, run npx prettier --write . to ensure proper formatting
of the JSON file before submitting the changes.
src/assets/translations/ko-KO.json (1)

2349-2355: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

inputs["Loading vendors"] has the wrong value type (object instead of string).

At Line 2349, this key is mapped to a nested object, while translation consumers expect a leaf string for label keys. This can render incorrectly (e.g., object output/fallback) where the loading text is shown.

Proposed fix
-      "Loading vendors": {
-        "": {
-          "": {
-            "": "공급업체 불러오는 중..."
-          }
-        }
-      },
+      "Loading vendors": "공급업체 불러오는 중...",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/ko-KO.json` around lines 2349 - 2355, The "Loading
vendors" translation key in the ko-KO.json file is structured as a nested object
with empty string keys instead of being a simple string value. Replace the
nested object structure (with the empty string keys and intermediate objects) so
that the "Loading vendors" key directly maps to the string value "공급업체 불러오는
중..." as a leaf value, which is what translation consumers expect for label
keys.
src/assets/translations/lv-LV.json (1)

1-4796: ⚠️ Potential issue | 🔴 Critical

Locale key parity check confirms 124 missing keys and 13 extra keys in lv-LV.json — must be resolved before release.

Verification against en-US.json baseline shows the Latvian translation file is significantly out of sync:

Missing in lv-LV (124 keys):

  • 124 keys exist in en-US but are absent in lv-LV
  • Notable gaps: validation error messages (e.g., errors.validation.msg.savingsproduct.insufficient.balance), UI labels (e.g., labels.heading.Quick Access), and 99+ business event descriptions (e.g., LoanCreatedBusinessEvent, LoanDisbursalBusinessEvent, etc.)
  • Untranslated strings will fall back to English or display as key names, degrading UX for Latvian users

Extra in lv-LV (13 keys):

  • 13 keys exist in lv-LV but are absent in en-US (orphaned/obsolete keys)
  • Examples: Deactivate Role, Delete Role, labels.heading.SMS

Before merge:

  1. Add all 124 missing keys to lv-LV.json with Latvian translations
  2. Remove 13 orphaned keys that no longer exist in the English baseline
  3. Run npx prettier --write src/assets/translations/lv-LV.json to enforce formatting per coding guidelines
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/lv-LV.json` around lines 1 - 4796, The Latvian
translation file (lv-LV.json) is out of sync with the English baseline
(en-US.json). You must synchronize the locale keys before merge by: (1)
identifying all 124 missing keys that exist in en-US.json but are absent from
lv-LV.json — particularly validation error messages, UI labels, and business
event descriptions — and adding them with appropriate Latvian translations to
lv-LV.json, (2) removing the 13 orphaned/obsolete keys that exist in lv-LV.json
but no longer appear in en-US.json (such as `Deactivate Role`, `Delete Role`,
and `labels.heading.SMS`), and (3) running `npx prettier --write
src/assets/translations/lv-LV.json` to enforce consistent formatting and comply
with coding guidelines. Fallback to English will occur for any untranslated
strings, degrading the user experience for Latvian speakers, so all missing keys
must be filled before release.
🟡 Minor comments (23)
src/assets/translations/en-US.json-2174-2174 (1)

2174-2174: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the incomplete gap label.

Line 2174 renders Gap between Installments:(Min verbatim, leaving a truncated label and unmatched parenthesis in the UI. Use a complete label, or add a separate key for any min/max helper text.

📝 Proposed fix
-      "Gap between Installments": "Gap between Installments:(Min",
+      "Gap between Installments": "Gap between Installments",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/en-US.json` at line 2174, The translation value for
the "Gap between Installments" key in the en-US.json file is truncated, ending
with an unmatched opening parenthesis after "Min". Complete the label text to
properly display the intended UI text, such as including the closing parenthesis
and any range text like a maximum value, or alternatively split the content into
separate translation keys where the main label is in one key and the min/max
helper text is in a different key for better maintainability.
src/assets/translations/cs-CS.json-2166-2166 (1)

2166-2166: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Truncated localized value will render broken helper text.

Line 2166 ("Gap between Installments": "Mezera mezi splátkami: (min") appears cut off and will show incomplete UI text.

Proposed fix
-      "Gap between Installments": "Mezera mezi splátkami: (min",
+      "Gap between Installments": "Mezera mezi splátkami",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/cs-CS.json` at line 2166, The Czech translation for
"Gap between Installments" key in src/assets/translations/cs-CS.json at line
2166 is incomplete, ending with "(min" which will cause broken UI text to
render. Complete the truncated translation string by adding the missing closing
text. Reference the corresponding English translation or other language
translations in the file to understand what the complete format should be, then
ensure the Czech value is properly closed with the appropriate closing
parenthesis and text.
src/assets/translations/de-DE.json-1467-1467 (1)

1467-1467: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove or rename probable debug-style translation key.

Line 1467 ("savings-transaction-datatable-tab works") looks like a temporary/debug phrase rather than a stable i18n key. This increases long-term i18n drift and noisy locale files.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/de-DE.json` at line 1467, The translation key
"savings-transaction-datatable-tab works" in src/assets/translations/de-DE.json
(line 1467) appears to be a temporary debug phrase rather than a proper i18n
key, which creates unnecessary noise and potential i18n drift in the locale
file. Either remove this key-value pair entirely from the de-DE.json file if it
is not actually being used, or rename both the key and its associated usage in
the codebase to follow a proper naming convention that aligns with other
translation keys (e.g., something like "savings-transaction-datatable-tab-label"
or similar, depending on the actual semantic purpose).
src/assets/translations/de-DE.json-3117-3117 (1)

3117-3117: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix incorrect German translation for postal code.

Line 3117 maps "Zip" to "Reißverschluss" (zipper), which is semantically incorrect for address fields and will confuse users.

Suggested fix
-      "Zip": "Reißverschluss"
+      "Zip": "Postleitzahl"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/de-DE.json` at line 3117, In
src/assets/translations/de-DE.json at line 3117, the key "Zip" is incorrectly
mapped to "Reißverschluss" (zipper). Replace this value with the correct German
translation for postal code, which should be "Postleitzahl" or the common
abbreviation "PLZ" used in German-speaking countries for address-related postal
codes.
src/assets/translations/de-DE.json-2168-2168 (1)

2168-2168: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Complete the truncated label text.

Line 2168 appears cut off ("Abstand zwischen den Raten: (Min"), which will render incomplete UI copy.

Suggested fix
-      "Gap between Installments": "Abstand zwischen den Raten: (Min",
+      "Gap between Installments": "Abstand zwischen den Raten",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/de-DE.json` at line 2168, The German translation
string for the "Gap between Installments" key in the de-DE.json translation file
is truncated and ends with "(Min" without closing the parenthesis or completing
the range specification. Complete this truncated label text by adding the
missing portion (likely the maximum indicator and closing parenthesis) to ensure
the UI displays the full, grammatically correct label for the gap between
installments field.
src/assets/translations/es-CL.json-1749-1749 (1)

1749-1749: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix incorrect Spanish meanings on newly added labels.

These entries will mislead users in UI flows:

  • Line 1749: "cannot": "no puedo" should be impersonal/third-person (e.g., "no puede").
  • Line 2020: "Due On": "Debido a" reads like “because of”; for due-date context use "Vence el".
  • Line 2189: "GSIM Id": "Id GSM" changes acronym meaning; keep GSIM.
  • Line 3116: "Zip": "Comprimir" is incorrect in address context; use "Código Postal".

Also applies to: 2020-2020, 2189-2189, 3116-3116

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/es-CL.json` at line 1749, In the
src/assets/translations/es-CL.json file, correct four Spanish translation
entries that will mislead users: at line 1749 change the "cannot" entry from "no
puedo" to "no puede" to use correct third-person form; at line 2020 change the
"Due On" entry from "Debido a" to "Vence el" for proper due-date context; at
line 2189 change the "GSIM Id" entry from "Id GSM" to "GSIM Id" to preserve the
correct acronym meaning; and at line 3116 change the "Zip" entry from
"Comprimir" to "Código Postal" for correct address-field terminology.
src/assets/translations/es-MX.json-2943-2944 (1)

2943-2944: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove duplicate Submitted On Date key in labels.inputs.

"Submitted On Date" already exists earlier (Line 1695). Re-declaring it here causes silent override behavior in JSON parsers and makes future edits error-prone.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/es-MX.json` around lines 2943 - 2944, Remove the
duplicate "Submitted On Date" key entry from the JSON translation file. The key
"Submitted On Date" with its corresponding translation "Registrado el día"
already exists earlier in the labels.inputs section and should not be
redeclared, as duplicate keys in JSON cause silent override behavior and
introduce maintenance issues. Delete the duplicate key-value pair while keeping
the original definition.
src/assets/translations/es-MX.json-1438-1438 (1)

1438-1438: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix untranslated/mistranslated user-facing labels in es-MX.

These entries will render incorrect Spanish in UI:

  • Line 1438: "Quick Access": "Quick Access" (left in English)
  • Line 1755: "cannot": "no puedo" (first person; should be impersonal/third person)
  • Line 2655: "Payments Left": "Payments Left" (left in English)
  • Line 3120: "Zip": "Comprimir" (semantic mismatch; “ZIP code” label expected)
Suggested patch
-      "Quick Access": "Quick Access",
+      "Quick Access": "Acceso rápido",
-      "cannot": "no puedo",
+      "cannot": "no puede",
-      "Payments Left": "Payments Left",
+      "Payments Left": "Pagos restantes",
-      "Zip": "Comprimir"
+      "Zip": "Código postal"

Also applies to: 1755-1755, 2655-2655, 3120-3120

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/es-MX.json` at line 1438, The es-MX.json translation
file contains four keys with incorrect or missing Spanish translations that will
display improperly in the UI. For the "Quick Access" key, replace the English
value with its proper Spanish translation. For the "cannot" key, change the
value from the first-person "no puedo" to the correct impersonal/third-person
Spanish form. For the "Payments Left" key, replace the English value with its
proper Spanish translation. For the "Zip" key, replace the incorrect value
"Comprimir" (which means file compression) with the proper Spanish term for ZIP
code.
src/assets/translations/fr-FR.json-673-673 (1)

673-673: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use one French domain term for “Breach” in the new loan UI.

The new breach-action labels mix Manquement and Brèches, so the same Working Capital feature appears under different concepts in French. Pick one domain term for these new keys and apply it consistently.

Proposed wording using “manquement” consistently
-      "Pause Breach": "Suspendre le Manquement",
+      "Pause Breach": "Suspendre le manquement",
...
-      "Loan Breach Actions": "Actions de Manquement du Prêt",
+      "Loan Breach Actions": "Actions de manquement du prêt",
...
-      "No Breach Actions": "Aucune Action sur Brèches",
+      "No Breach Actions": "Aucune action de manquement",
...
-      "Breach Actions": "Actions de Manquement",
+      "Breach Actions": "Actions de manquement",
...
-      "No breach actions have been recorded for this loan": "Aucune action sur brèches n'a été enregistrée pour ce prêt",
+      "No breach actions have been recorded for this loan": "Aucune action de manquement n'a été enregistrée pour ce prêt",

Also applies to: 1353-1353, 1405-1405, 1735-1735, 2514-2514

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/fr-FR.json` at line 673, The French translations for
breach-related labels in the Working Capital feature are inconsistent, mixing
"Manquement" and "Brèches" for the same concept. Review all breach-action label
keys in the file at lines 673, 1353, 1405, 1735, and 2514 to identify which ones
use which term, then standardize all of them to use a single domain term
consistently throughout. Choose either "Manquement" or "Brèches" as the standard
and apply it to all the affected breach-related translation keys so the feature
appears under one unified concept in French.
src/assets/translations/fr-FR.json-1830-1830 (1)

1830-1830: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix mistranslated technical field labels.

These labels render as the wrong concepts: COB Date becomes PPE, OTP becomes “Office of the Prosecutor”, and Zip becomes a clothing zipper. labels.inputs.Zip is used by the guarantor ZIP field in src/app/loans/custom-dialog/edit-guarantor-dialog/edit-guarantor-dialog.component.html:43-46.

Proposed label fixes
-      "COB Date": "Date de l'ÉPI",
+      "COB Date": "Date COB",
...
-      "OTP": "Bureau du Procureur",
+      "OTP": "OTP",
...
-      "Zip": "Fermeture éclair"
+      "Zip": "Code postal"

Also applies to: 2583-2583, 3118-3118

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/fr-FR.json` at line 1830, The fr-FR.json file
contains three mistranslated technical field labels that use incorrect French
equivalents. At line 1830, fix "COB Date" which is currently mistranslated as
"Date de l'ÉPI" (PPE) when it should refer to Close of Business. At line 2583,
fix the "OTP" label which is mistranslated as "Office of the Prosecutor" when it
should refer to One-Time Password. At line 3118, fix the "Zip" label which is
mistranslated with a clothing-related meaning when it should refer to postal
code (ZIP code). Replace each of these translations with the correct French
equivalents that properly represent the technical meanings of COB (Close of
Business), OTP (One-Time Password), and Zip (postal code), as these labels are
used throughout the application including in components like the guarantor ZIP
field.
src/assets/translations/fr-FR.json-2837-2839 (1)

2837-2839: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate the S3 snake_case aliases instead of showing raw keys.

These alias keys are likely used as labels just like the title-cased S3 keys above them; leaving the values as s3_access_key, s3_bucket_name, and s3_secret_key exposes implementation names in the UI.

Proposed alias translations
-      "s3_access_key": "s3_access_key",
-      "s3_bucket_name": "s3_bucket_name",
-      "s3_secret_key": "s3_secret_key",
+      "s3_access_key": "Clé d'accès S3",
+      "s3_bucket_name": "Nom du compartiment S3",
+      "s3_secret_key": "Clé secrète S3",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/fr-FR.json` around lines 2837 - 2839, In the French
translation file fr-FR.json at lines 2837-2839, the snake_case alias keys
s3_access_key, s3_bucket_name, and s3_secret_key currently have values that
match their raw implementation names. Replace these values with proper French
translations that match the translation style used for the title-cased S3 keys
appearing earlier in the file, so the UI displays user-friendly French labels
instead of exposing raw technical key names.
src/assets/translations/fr-FR.json-1593-1599 (1)

1593-1599: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use accounting terms for account-class labels.

LIABILITY, EQUITY, and EXPENSE are financial account classes; translating them as RESPONSABILITÉ, ÉQUITÉ, and FRAIS changes the accounting meaning.

Proposed accounting terminology fix
       "accounting": {
         "ASSET": "ACTIF",
-        "LIABILITY": "RESPONSABILITÉ",
-        "EQUITY": "ÉQUITÉ",
+        "LIABILITY": "PASSIF",
+        "EQUITY": "CAPITAUX PROPRES",
         "INCOME": "REVENU",
-        "EXPENSE": "FRAIS"
+        "EXPENSE": "CHARGES"
       },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/fr-FR.json` around lines 1593 - 1599, The accounting
field labels in the accounting object contain incorrect translations that change
the accounting meaning of these financial terms. Replace the translations for
LIABILITY, EQUITY, and EXPENSE with proper French accounting terminology instead
of their current general translations. Use standard accounting terms in French
that preserve the specific financial meaning of these account classes.
src/assets/translations/it-IT.json-3115-3115 (1)

3115-3115: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Correct mistranslation of “Zip” for address forms.

"Zip": "Cerniera lampo" translates to zipper, not postal code. This is misleading in address entry flows.

💡 Suggested fix
-      "Zip": "Cerniera lampo"
+      "Zip": "CAP"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/it-IT.json` at line 3115, The "Zip" key in the
Italian translation file is incorrectly translated to "Cerniera lampo" which
means zipper, not postal code. This causes confusion in address entry forms
where "Zip" should represent a postal code. Replace the value of the "Zip" key
with the correct Italian term for postal code, which should be "CAP" (the
standard Italian acronym for Codice di Avviamento Postale) or "Codice Postale"
to properly reflect its use in address forms.
src/assets/translations/it-IT.json-2166-2166 (1)

2166-2166: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix truncated Italian label for installment gap.

"Gap between Installments": "Intervallo tra le rate: (Min" is incomplete/truncated and will render broken UI text.

💡 Suggested fix
-      "Gap between Installments": "Intervallo tra le rate: (Min",
+      "Gap between Installments": "Intervallo tra le rate",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/it-IT.json` at line 2166, The Italian translation
value for the "Gap between Installments" key in the it-IT.json file is truncated
and ends with an unclosed parenthesis at "(Min". Complete this translation by
adding the missing text that should follow to properly convey the full meaning
of the installment gap description in Italian, ensuring the parenthetical
statement is closed and the complete intended message is present.
src/assets/translations/ko-KO.json-3115-3115 (1)

3115-3115: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

"Zip" is mistranslated as “지퍼” (zipper), not postal code.

At Line 3115, this label is used in address forms, so the current translation is misleading for users entering postal information.

Proposed fix
-      "Zip": "지퍼"
+      "Zip": "우편번호"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/ko-KO.json` at line 3115, The "Zip" key in the
ko-KO.json file at line 3115 is incorrectly translated as "지퍼" which means
zipper (the fastener), but the context is for address forms where it refers to
postal code. Replace the current translation with the proper Korean term for
postal code to ensure users understand they should enter their postal/zip code
information.
src/assets/translations/lt-LT.json-2165-2165 (1)

2165-2165: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the dangling “(min” from the installment-gap label.

Line 2165 will render as Tarpas tarp įmokų: (min, which looks truncated in the UI.

Proposed fix
-      "Gap between Installments": "Tarpas tarp įmokų: (min",
+      "Gap between Installments": "Tarpas tarp įmokų",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/lt-LT.json` at line 2165, The Lithuanian translation
for "Gap between Installments" in the lt-LT.json file contains a trailing "(min"
that appears incomplete in the UI. Remove the dangling "(min" text from the end
of the translation value so that the label "Tarpas tarp įmokų:" displays cleanly
without the truncated parenthetical fragment.
src/assets/translations/lv-LV.json-1465-1465 (1)

1465-1465: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove/rename debug-like translation key before merge.

Line [1465] ("savings-transaction-datatable-tab works") looks like a temporary/debug key and not a stable product label. This can leak non-user-facing wording into UI if referenced.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/lv-LV.json` at line 1465, The translation key
"savings-transaction-datatable-tab works" in the lv-LV.json file appears to be a
temporary debug entry rather than a production translation. Either remove this
debug key entirely from the file if it is not used elsewhere, or rename it to a
proper user-facing label that accurately describes the translated content if it
is actively referenced in the codebase.
src/assets/translations/lv-LV.json-2166-2166 (1)

2166-2166: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix truncated translation value for installment gap label.

Line [2166] ends mid-phrase ("(min"), so the UI label will render incomplete. Please replace it with the full intended Latvian text.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/lv-LV.json` at line 2166, The translation value for
the "Gap between Installments" key is incomplete and ends mid-phrase with
"(min". Replace this truncated value with the full intended Latvian translation
text that properly completes the label in the UI.
src/assets/translations/lv-LV.json-1283-1283 (1)

1283-1283: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use context-appropriate translation for “General”.

Lines [1283] and [2170] map "General" to "Ģenerālis" (military rank). For section/title context, this should be the equivalent of “General/Overview” (e.g., “Vispārīgi”).

Also applies to: 2170-2170

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/lv-LV.json` at line 1283, The translation for
"General" in the Latvian translation file (lv-LV.json) is currently set to
"Ģenerālis" (military rank), but in the context of section/title headings, it
should represent "General/Overview" instead. Change the value "Ģenerālis" to
"Vispārīgi" at line 1283 and at line 2170 to use the context-appropriate
translation for section titles rather than military rank terminology.
src/assets/translations/pt-PT.json-3114-3114 (1)

3114-3114: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use the postal-code translation for Zip.

Fecho eclair means “zipper”; address forms should display Código postal.

🌐 Proposed translation fix
-      "Zip": "Fecho eclair"
+      "Zip": "Código postal"
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/pt-PT.json` at line 3114, The translation for the
"Zip" key in the pt-PT.json file is incorrectly set to "Fecho eclair" which
means "zipper" in Portuguese. For address forms, this should use the postal code
translation instead. Change the value of the "Zip" key from "Fecho eclair" to
"Código postal" to provide the correct postal code terminology for Portuguese
users.
src/assets/translations/pt-PT.json-1589-1595 (1)

1589-1595: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the accounting meaning of LIABILITY.

RESPONSABILIDADE is not the accounting category here; use PASSIVO so GL account-type labels are not misleading.

🌐 Proposed translation fix
 "accounting": {
   "ASSET": "ATIVO",
-  "LIABILITY": "RESPONSABILIDADE",
+  "LIABILITY": "PASSIVO",
   "EQUITY": "EQUIDADE",
   "INCOME": "RENDA",
   "EXPENSE": "DESPESA"
 },
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/pt-PT.json` around lines 1589 - 1595, In the
accounting translations object within the pt-PT.json file, the translation for
the LIABILITY key is currently set to "RESPONSABILIDADE", which is misleading in
an accounting context. Change the LIABILITY translation value from
"RESPONSABILIDADE" to "PASSIVO" to correctly represent the accounting category
term in Portuguese.
src/assets/translations/pt-PT.json-2165-2165 (1)

2165-2165: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Remove the truncated suffix from this label.

Intervalo entre as parcelas:(mín. will render with a dangling partial “min.” hint. Keep this label complete and move any min/max detail to the actual validation/help text if needed.

🌐 Proposed translation fix
-      "Gap between Installments": "Intervalo entre as parcelas:(mín.",
+      "Gap between Installments": "Intervalo entre as parcelas",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/pt-PT.json` at line 2165, The translation for "Gap
between Installments" in the pt-PT.json file contains a truncated suffix
":(mín." at the end which will render as incomplete text. Remove the dangling
"(mín." portion and keep the label complete as "Intervalo entre as parcelas". If
minimum or maximum detail is needed for this field, ensure that information is
provided separately through validation or help text rather than appended to the
label itself.
src/assets/translations/pt-PT.json-2833-2835 (1)

2833-2835: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Translate the S3 field labels instead of exposing internal keys.

These values currently mirror the snake_case keys, so users can see s3_access_key/s3_bucket_name/s3_secret_key as labels.

🌐 Proposed translation fix
-      "s3_access_key": "s3_access_key",
-      "s3_bucket_name": "s3_bucket_name",
-      "s3_secret_key": "s3_secret_key",
+      "s3_access_key": "Chave de acesso S3",
+      "s3_bucket_name": "Nome do bucket S3",
+      "s3_secret_key": "Chave secreta S3",
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/pt-PT.json` around lines 2833 - 2835, Replace the
hardcoded internal key names with proper Portuguese translations for the three
S3 configuration field labels: s3_access_key, s3_bucket_name, and s3_secret_key
in the pt-PT.json file. Instead of showing the internal key names as values,
provide user-friendly Portuguese translations that describe what each field
represents (e.g., access key, bucket name, secret key) so users see meaningful
labels in the Portuguese interface rather than technical identifiers.
🧹 Nitpick comments (1)
src/assets/translations/cs-CS.json (1)

1465-1465: ⚡ Quick win

Looks like debug/internal keys were committed into user translation space.

Line 1465 ("savings-transaction-datatable-tab works"), Line 2955 ("task-management component"), and Line 2990 ("TODO") read like debug/internal labels, not production i18n keys. These should be removed unless they are intentionally rendered to end users.

Also applies to: 2955-2955, 2990-2990

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/cs-CS.json` at line 1465, Remove the debug/internal
translation keys from the Czech translation file at all affected locations.
Delete the entry "savings-transaction-datatable-tab works" at line 1465, the
entry "task-management component" at line 2955, and the entry "TODO" at line
2990 from src/assets/translations/cs-CS.json. These debug labels are not
legitimate user-facing i18n strings and should not exist in the production
translation space.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html`:
- Around line 121-145: Replace the custom filter chip controls (buttons with
class "filter-chip" inside the filter-group) with Angular Material
mat-chip-listbox and mat-chip components, replacing the click handler and active
state styling with Material chip bindings. Convert all native button elements,
including the "Pause Breach" button with classes "btn btn-primary", to use the
mat-button directive instead. Additionally, the raw table mentioned in lines
150-212 should be converted to use the mat-table component with appropriate
mat-header-cell, mat-cell, and mat-row directives to maintain compliance with
project Material design standards.

In
`@src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss`:
- Around line 9-35: The component stylesheet contains custom color variables and
off-grid explicit spacings that should be replaced with shared theme variables
and 8px-aligned spacing values. Remove the custom color variable declarations
(such as --ba-blue-700, --ba-blue-600, --ba-paid, --ba-alert, etc.) from the
:host selector and replace them with variables from src/main.scss and
src/theme/mifosx-theme.scss. Update all explicit spacing values in the padding
property and throughout the stylesheet (at lines 93-99, 182-183, 340-341,
703-717) to use multiples of 8px (such as 8px, 16px, 24px, 32px) instead of
off-grid values like 12px, 22px, or 13px, ensuring consistency with the
project's 8px grid system and design-system contract.

In
`@src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts`:
- Around line 164-165: Replace all hardcoded English strings and date formatting
with i18n-compliant alternatives across the affected locations. In the tooltip
construction at lines 164-165, replace the hardcoded 'Ongoing' string with a
translated i18n key using `@ngx-translate/core`. Update the shortDate() method and
any other date formatting logic (at lines 190-206 and 301-303) to use proper
i18n locale settings instead of hardcoded 'en-US' in toLocaleDateString calls
and hardcoded month names like 'Jan'..'Dec'. Ensure all user-facing strings in
the tooltip and date displays use translate pipe or i18n service calls to
respect the application's current locale setting.
- Around line 87-93: The code unconditionally calls getTime() on the end
variable (derived from endDate) in the BreachActionStatus determination logic,
but endDate is nullable and will be null for ongoing pauses. Add a guard
condition to check if end is null before calling getTime() on it. When end is
null (indicating an ongoing pause with no end date), determine the appropriate
status based on the start date comparison with businessDate only, or assign a
status that reflects the ongoing nature of the pause. Ensure all branches in the
if-else chain account for the possibility of end being null.

In `@src/assets/translations/es-CL.json`:
- Around line 2709-2720: The es-CL.json translation file is out of sync with
en-US.json: it has 124 missing keys that will cause runtime fallbacks to
English, 15 orphaned extra keys, and a placeholder mismatch where
errors.Password is required has a {{min}} token in es-CL but not in en-US. To
fix this, either restore all missing keys with proper Spanish translations,
remove the 15 extra keys, and correct the placeholder mismatch in
errors.Password is required, or reset es-CL to a clean baseline that mirrors the
complete structure of en-US.json with Spanish translations. After making these
changes, run npx prettier --write to enforce the project's formatting standards
on the translation file.

In `@src/assets/translations/lt-LT.json`:
- Line 1: The lt-LT.json file is missing 65+ translation keys that are present
in en-US.json, including error.resource.notImplemented.* entries, catalog keys
for Share Building Contribution and Share Solidarity Fund, commons keys like
pass is required, multiple heading and input labels, and numerous
Loan*BusinessEvent keys. To fix this, review the en-US.json file and add all
missing keys to lt-LT.json with appropriate Lithuanian translations, ensuring
the structure and key names match exactly with en-US.json to prevent
untranslated strings or objects from appearing in the UI.

---

Outside diff comments:
In `@src/assets/translations/cs-CS.json`:
- Around line 1-5086: The Czech translation file (cs-CS.json) has diverged from
the canonical English version (en-US.json) with 128 missing keys and 304
extraneous keys. To fix this, compare the complete key hierarchy in cs-CS.json
against en-US.json and: (1) remove all keys that exist in cs-CS.json but not in
en-US.json (the 304 extra keys), and (2) add all keys that exist in en-US.json
but not in cs-CS.json (the 128 missing keys), preserving their nested structure
and using appropriate Czech translations or copying placeholder values. This
will synchronize the two files' key shapes while maintaining the existing Czech
translations for matching keys.

In `@src/assets/translations/de-DE.json`:
- Around line 1574-3118: The de-DE.json translation file has key and placeholder
parity issues with the en-US reference file. First, identify and add the 127
missing keys from en-US to de-DE (such as validation errors, business event
labels, and UI inputs). Second, remove the 290 extra or orphaned keys that exist
in de-DE but not in en-US. Third, fix the two placeholder mismatches: in the
errors.Password is required key, remove the {{min}} placeholder from the German
translation, and in the labels.commons.Password validation key, correct the typo
by changing {{michar}} to {{minchar}}. Finally, run npx prettier --write . to
ensure proper formatting of the JSON file before submitting the changes.

In `@src/assets/translations/ko-KO.json`:
- Around line 2349-2355: The "Loading vendors" translation key in the ko-KO.json
file is structured as a nested object with empty string keys instead of being a
simple string value. Replace the nested object structure (with the empty string
keys and intermediate objects) so that the "Loading vendors" key directly maps
to the string value "공급업체 불러오는 중..." as a leaf value, which is what translation
consumers expect for label keys.

In `@src/assets/translations/lv-LV.json`:
- Around line 1-4796: The Latvian translation file (lv-LV.json) is out of sync
with the English baseline (en-US.json). You must synchronize the locale keys
before merge by: (1) identifying all 124 missing keys that exist in en-US.json
but are absent from lv-LV.json — particularly validation error messages, UI
labels, and business event descriptions — and adding them with appropriate
Latvian translations to lv-LV.json, (2) removing the 13 orphaned/obsolete keys
that exist in lv-LV.json but no longer appear in en-US.json (such as `Deactivate
Role`, `Delete Role`, and `labels.heading.SMS`), and (3) running `npx prettier
--write src/assets/translations/lv-LV.json` to enforce consistent formatting and
comply with coding guidelines. Fallback to English will occur for any
untranslated strings, degrading the user experience for Latvian speakers, so all
missing keys must be filled before release.

---

Minor comments:
In `@src/assets/translations/cs-CS.json`:
- Line 2166: The Czech translation for "Gap between Installments" key in
src/assets/translations/cs-CS.json at line 2166 is incomplete, ending with
"(min" which will cause broken UI text to render. Complete the truncated
translation string by adding the missing closing text. Reference the
corresponding English translation or other language translations in the file to
understand what the complete format should be, then ensure the Czech value is
properly closed with the appropriate closing parenthesis and text.

In `@src/assets/translations/de-DE.json`:
- Line 1467: The translation key "savings-transaction-datatable-tab works" in
src/assets/translations/de-DE.json (line 1467) appears to be a temporary debug
phrase rather than a proper i18n key, which creates unnecessary noise and
potential i18n drift in the locale file. Either remove this key-value pair
entirely from the de-DE.json file if it is not actually being used, or rename
both the key and its associated usage in the codebase to follow a proper naming
convention that aligns with other translation keys (e.g., something like
"savings-transaction-datatable-tab-label" or similar, depending on the actual
semantic purpose).
- Line 3117: In src/assets/translations/de-DE.json at line 3117, the key "Zip"
is incorrectly mapped to "Reißverschluss" (zipper). Replace this value with the
correct German translation for postal code, which should be "Postleitzahl" or
the common abbreviation "PLZ" used in German-speaking countries for
address-related postal codes.
- Line 2168: The German translation string for the "Gap between Installments"
key in the de-DE.json translation file is truncated and ends with "(Min" without
closing the parenthesis or completing the range specification. Complete this
truncated label text by adding the missing portion (likely the maximum indicator
and closing parenthesis) to ensure the UI displays the full, grammatically
correct label for the gap between installments field.

In `@src/assets/translations/en-US.json`:
- Line 2174: The translation value for the "Gap between Installments" key in the
en-US.json file is truncated, ending with an unmatched opening parenthesis after
"Min". Complete the label text to properly display the intended UI text, such as
including the closing parenthesis and any range text like a maximum value, or
alternatively split the content into separate translation keys where the main
label is in one key and the min/max helper text is in a different key for better
maintainability.

In `@src/assets/translations/es-CL.json`:
- Line 1749: In the src/assets/translations/es-CL.json file, correct four
Spanish translation entries that will mislead users: at line 1749 change the
"cannot" entry from "no puedo" to "no puede" to use correct third-person form;
at line 2020 change the "Due On" entry from "Debido a" to "Vence el" for proper
due-date context; at line 2189 change the "GSIM Id" entry from "Id GSM" to "GSIM
Id" to preserve the correct acronym meaning; and at line 3116 change the "Zip"
entry from "Comprimir" to "Código Postal" for correct address-field terminology.

In `@src/assets/translations/es-MX.json`:
- Around line 2943-2944: Remove the duplicate "Submitted On Date" key entry from
the JSON translation file. The key "Submitted On Date" with its corresponding
translation "Registrado el día" already exists earlier in the labels.inputs
section and should not be redeclared, as duplicate keys in JSON cause silent
override behavior and introduce maintenance issues. Delete the duplicate
key-value pair while keeping the original definition.
- Line 1438: The es-MX.json translation file contains four keys with incorrect
or missing Spanish translations that will display improperly in the UI. For the
"Quick Access" key, replace the English value with its proper Spanish
translation. For the "cannot" key, change the value from the first-person "no
puedo" to the correct impersonal/third-person Spanish form. For the "Payments
Left" key, replace the English value with its proper Spanish translation. For
the "Zip" key, replace the incorrect value "Comprimir" (which means file
compression) with the proper Spanish term for ZIP code.

In `@src/assets/translations/fr-FR.json`:
- Line 673: The French translations for breach-related labels in the Working
Capital feature are inconsistent, mixing "Manquement" and "Brèches" for the same
concept. Review all breach-action label keys in the file at lines 673, 1353,
1405, 1735, and 2514 to identify which ones use which term, then standardize all
of them to use a single domain term consistently throughout. Choose either
"Manquement" or "Brèches" as the standard and apply it to all the affected
breach-related translation keys so the feature appears under one unified concept
in French.
- Line 1830: The fr-FR.json file contains three mistranslated technical field
labels that use incorrect French equivalents. At line 1830, fix "COB Date" which
is currently mistranslated as "Date de l'ÉPI" (PPE) when it should refer to
Close of Business. At line 2583, fix the "OTP" label which is mistranslated as
"Office of the Prosecutor" when it should refer to One-Time Password. At line
3118, fix the "Zip" label which is mistranslated with a clothing-related meaning
when it should refer to postal code (ZIP code). Replace each of these
translations with the correct French equivalents that properly represent the
technical meanings of COB (Close of Business), OTP (One-Time Password), and Zip
(postal code), as these labels are used throughout the application including in
components like the guarantor ZIP field.
- Around line 2837-2839: In the French translation file fr-FR.json at lines
2837-2839, the snake_case alias keys s3_access_key, s3_bucket_name, and
s3_secret_key currently have values that match their raw implementation names.
Replace these values with proper French translations that match the translation
style used for the title-cased S3 keys appearing earlier in the file, so the UI
displays user-friendly French labels instead of exposing raw technical key
names.
- Around line 1593-1599: The accounting field labels in the accounting object
contain incorrect translations that change the accounting meaning of these
financial terms. Replace the translations for LIABILITY, EQUITY, and EXPENSE
with proper French accounting terminology instead of their current general
translations. Use standard accounting terms in French that preserve the specific
financial meaning of these account classes.

In `@src/assets/translations/it-IT.json`:
- Line 3115: The "Zip" key in the Italian translation file is incorrectly
translated to "Cerniera lampo" which means zipper, not postal code. This causes
confusion in address entry forms where "Zip" should represent a postal code.
Replace the value of the "Zip" key with the correct Italian term for postal
code, which should be "CAP" (the standard Italian acronym for Codice di
Avviamento Postale) or "Codice Postale" to properly reflect its use in address
forms.
- Line 2166: The Italian translation value for the "Gap between Installments"
key in the it-IT.json file is truncated and ends with an unclosed parenthesis at
"(Min". Complete this translation by adding the missing text that should follow
to properly convey the full meaning of the installment gap description in
Italian, ensuring the parenthetical statement is closed and the complete
intended message is present.

In `@src/assets/translations/ko-KO.json`:
- Line 3115: The "Zip" key in the ko-KO.json file at line 3115 is incorrectly
translated as "지퍼" which means zipper (the fastener), but the context is for
address forms where it refers to postal code. Replace the current translation
with the proper Korean term for postal code to ensure users understand they
should enter their postal/zip code information.

In `@src/assets/translations/lt-LT.json`:
- Line 2165: The Lithuanian translation for "Gap between Installments" in the
lt-LT.json file contains a trailing "(min" that appears incomplete in the UI.
Remove the dangling "(min" text from the end of the translation value so that
the label "Tarpas tarp įmokų:" displays cleanly without the truncated
parenthetical fragment.

In `@src/assets/translations/lv-LV.json`:
- Line 1465: The translation key "savings-transaction-datatable-tab works" in
the lv-LV.json file appears to be a temporary debug entry rather than a
production translation. Either remove this debug key entirely from the file if
it is not used elsewhere, or rename it to a proper user-facing label that
accurately describes the translated content if it is actively referenced in the
codebase.
- Line 2166: The translation value for the "Gap between Installments" key is
incomplete and ends mid-phrase with "(min". Replace this truncated value with
the full intended Latvian translation text that properly completes the label in
the UI.
- Line 1283: The translation for "General" in the Latvian translation file
(lv-LV.json) is currently set to "Ģenerālis" (military rank), but in the context
of section/title headings, it should represent "General/Overview" instead.
Change the value "Ģenerālis" to "Vispārīgi" at line 1283 and at line 2170 to use
the context-appropriate translation for section titles rather than military rank
terminology.

In `@src/assets/translations/pt-PT.json`:
- Line 3114: The translation for the "Zip" key in the pt-PT.json file is
incorrectly set to "Fecho eclair" which means "zipper" in Portuguese. For
address forms, this should use the postal code translation instead. Change the
value of the "Zip" key from "Fecho eclair" to "Código postal" to provide the
correct postal code terminology for Portuguese users.
- Around line 1589-1595: In the accounting translations object within the
pt-PT.json file, the translation for the LIABILITY key is currently set to
"RESPONSABILIDADE", which is misleading in an accounting context. Change the
LIABILITY translation value from "RESPONSABILIDADE" to "PASSIVO" to correctly
represent the accounting category term in Portuguese.
- Line 2165: The translation for "Gap between Installments" in the pt-PT.json
file contains a truncated suffix ":(mín." at the end which will render as
incomplete text. Remove the dangling "(mín." portion and keep the label complete
as "Intervalo entre as parcelas". If minimum or maximum detail is needed for
this field, ensure that information is provided separately through validation or
help text rather than appended to the label itself.
- Around line 2833-2835: Replace the hardcoded internal key names with proper
Portuguese translations for the three S3 configuration field labels:
s3_access_key, s3_bucket_name, and s3_secret_key in the pt-PT.json file. Instead
of showing the internal key names as values, provide user-friendly Portuguese
translations that describe what each field represents (e.g., access key, bucket
name, secret key) so users see meaningful labels in the Portuguese interface
rather than technical identifiers.

---

Nitpick comments:
In `@src/assets/translations/cs-CS.json`:
- Line 1465: Remove the debug/internal translation keys from the Czech
translation file at all affected locations. Delete the entry
"savings-transaction-datatable-tab works" at line 1465, the entry
"task-management component" at line 2955, and the entry "TODO" at line 2990 from
src/assets/translations/cs-CS.json. These debug labels are not legitimate
user-facing i18n strings and should not exist in the production translation
space.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: be8c0e41-2e42-4652-9bd4-7417a7c4b433

📥 Commits

Reviewing files that changed from the base of the PR and between 070b861 and 91191fa.

📒 Files selected for processing (21)
  • src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
  • src/app/loans/loans-routing.module.ts
  • src/app/loans/loans-view/loans-view.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts
  • src/app/loans/loans.module.ts
  • src/app/loans/loans.service.ts
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json

Comment thread src/assets/translations/es-CL.json Outdated
Comment thread src/assets/translations/lt-LT.json
@alberto-art3ch alberto-art3ch force-pushed the WEB-657/working-capital-loan-breach-pause-action branch from 91191fa to d7e90d8 Compare June 15, 2026 03:36

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/assets/translations/fr-FR.json (1)

1574-3120: ⚠️ Potential issue | 🟠 Major

Add missing translation keys to fr-FR.json and remove extra keys to restore parity with en-US.

Verification found 12 keys present in en-US but missing from fr-FR:

  • labels.heading.Active Client Members
  • labels.heading.Quick Access
  • labels.inputs.Amortized Income
  • labels.inputs.Annual EIR
  • labels.inputs.Daily EIR
  • labels.inputs.Discount Factor
  • labels.inputs.Discount Fee
  • labels.inputs.ENTITY
  • labels.inputs.Incorporation Date
  • labels.inputs.PERSON
  • labels.inputs.Period Payment Amount
  • labels.inputs.Starting Date

Additionally, 9 keys exist in fr-FR but not in en-US (labels.heading.SMS, labels.inputs.CLIENT STATUS, and 7 others), which should also be addressed.

Add the missing keys with appropriate French translations to maintain runtime consistency. Afterward, run npx prettier --write src/assets/translations/fr-FR.json to enforce Prettier formatting.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/assets/translations/fr-FR.json` around lines 1574 - 3120, The fr-FR.json
translation file is out of sync with en-US.json. Add the 12 missing translation
keys (Active Client Members, Quick Access, Amortized Income, Annual EIR, Daily
EIR, Discount Factor, Discount Fee, ENTITY, Incorporation Date, PERSON, Period
Payment Amount, Starting Date) with appropriate French translations to the
inputs and headings sections. Additionally, remove or reconcile the 9 extra keys
that exist in fr-FR but not in en-US (such as SMS and CLIENT STATUS) to restore
parity. After making these changes, run the Prettier formatter using npx
prettier --write src/assets/translations/fr-FR.json to ensure consistent code
formatting.
🧹 Nitpick comments (1)
src/app/loans/loans-routing.module.ts (1)

477-506: Remove redundant resolver entries from the providers array for consistency.

All working-capital resolvers (LoanBreachActionsResolver, LoanDelinquencyRangeScheduleResolver, LoanAmortizationScheduleResolver, and LoanPeriodPaymentRatesResolver) use @Injectable({ providedIn: 'root' }). This means they are already registered at the root level and do not need to be listed in the module's providers array (lines 502–503). While having them in both places is not harmful, it creates inconsistency and redundancy.

Remove LoanAmortizationScheduleResolver and LoanPeriodPaymentRatesResolver from the providers array to align with the pattern used by the other working-capital resolvers.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/app/loans/loans-routing.module.ts` around lines 477 - 506, The
LoanAmortizationScheduleResolver and LoanPeriodPaymentRatesResolver are already
registered at the root level using `@Injectable`({ providedIn: 'root' }) and
therefore should not be duplicated in the providers array. Remove these two
resolver entries from the providers array in the loans-routing.module.ts file to
eliminate redundancy and maintain consistency with other working-capital
resolvers that follow this same pattern.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/core/utils/dates.ts`:
- Around line 13-26: The Month enum in src/app/core/utils/dates.ts contains
hardcoded English month names that bypass localization and violate the i18n
guidelines. Replace the hardcoded string values with a locale-aware approach by
either using Angular's DatePipe to format months based on the current locale, or
by using translation keys from `@ngx-translate/core` to fetch localized month
names. This ensures that any monthLabels derived from the enum will display
correctly for non-English locales instead of always showing English text.

In `@src/assets/translations/en-US.json`:
- Line 1473: Remove the debug/test placeholder strings from the en-US.json
translation file. Delete the entry at line 1473 containing
"savings-transaction-datatable-tab works" and the entry at line 2959 containing
"task-management component", as these are development placeholders rather than
actual production UI copy that should appear in user-facing translations.
- Line 2175: The translation value for the installment-gap label at line 2175 in
src/assets/translations/en-US.json is truncated and reads "Gap between
Installments:(Min" which will result in incomplete UI text. Locate this
key-value pair in the JSON file and replace the truncated value with the
complete, properly formatted translation text that provides the full intended
message for the gap between installments field.

In `@src/assets/translations/fr-FR.json`:
- Line 1830: Three technical domain terms in the French translation file are
currently mistranslated and will confuse users: at line 1830, COB is incorrectly
translated as "Date de l'ÉPI"; at line 2584, OTP has an incorrect translation;
and at line 3118, Zip has an incorrect translation. Replace each of these
mistranslations with the correct French equivalents for Close of Business (COB),
One-Time Password (OTP), and Zip code (Zip) respectively, ensuring the
translations are accurate technical terms that users in operations,
authentication, and address-entry flows will understand correctly.
- Line 2169: The translation string for "Gap between Installments" in the French
translations file is truncated and ends with the incomplete fragment `:(Min`,
which will cause broken UI rendering. Complete the truncated translation string
by appending the missing text to finish the phrase that begins with the opening
parenthesis and `Min` fragment, ensuring the translation is grammatically
complete and matches the intended meaning of the English key.

In `@src/assets/translations/lv-LV.json`:
- Line 2166: The Latvian translation for "Gap between Installments" in the
lv-LV.json file is incomplete, ending with the truncated text "Starpība starp
maksājumiem: (min". Replace this incomplete value with the full, properly
translated Latvian phrase that completely conveys the meaning of the English
label "Gap between Installments", ensuring it renders correctly in the UI
without any broken or cut-off text.

---

Outside diff comments:
In `@src/assets/translations/fr-FR.json`:
- Around line 1574-3120: The fr-FR.json translation file is out of sync with
en-US.json. Add the 12 missing translation keys (Active Client Members, Quick
Access, Amortized Income, Annual EIR, Daily EIR, Discount Factor, Discount Fee,
ENTITY, Incorporation Date, PERSON, Period Payment Amount, Starting Date) with
appropriate French translations to the inputs and headings sections.
Additionally, remove or reconcile the 9 extra keys that exist in fr-FR but not
in en-US (such as SMS and CLIENT STATUS) to restore parity. After making these
changes, run the Prettier formatter using npx prettier --write
src/assets/translations/fr-FR.json to ensure consistent code formatting.

---

Nitpick comments:
In `@src/app/loans/loans-routing.module.ts`:
- Around line 477-506: The LoanAmortizationScheduleResolver and
LoanPeriodPaymentRatesResolver are already registered at the root level using
`@Injectable`({ providedIn: 'root' }) and therefore should not be duplicated in
the providers array. Remove these two resolver entries from the providers array
in the loans-routing.module.ts file to eliminate redundancy and maintain
consistency with other working-capital resolvers that follow this same pattern.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 072e3e15-665d-49b2-a2db-f5eb6e5c7492

📥 Commits

Reviewing files that changed from the base of the PR and between 91191fa and d7e90d8.

📒 Files selected for processing (24)
  • src/app/core/utils/dates.ts
  • src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
  • src/app/loans/loans-routing.module.ts
  • src/app/loans/loans-view/charges-tab/charges-tab.component.scss
  • src/app/loans/loans-view/loans-view.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts
  • src/app/loans/loans.module.ts
  • src/app/loans/loans.service.ts
  • src/assets/styles/_redesign-tokens.scss
  • src/assets/translations/cs-CS.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/en-US.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/es-MX.json
  • src/assets/translations/fr-FR.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/ko-KO.json
  • src/assets/translations/lt-LT.json
  • src/assets/translations/lv-LV.json
  • src/assets/translations/ne-NE.json
  • src/assets/translations/pt-PT.json
  • src/assets/translations/sw-SW.json
✅ Files skipped from review due to trivial changes (1)
  • src/assets/styles/_redesign-tokens.scss
🚧 Files skipped from review as they are similar to previous changes (14)
  • src/app/loans/common-resolvers/working-capital/loan-breach-actions.resolver.ts
  • src/app/loans/loans-view/loans-view.component.html
  • src/app/loans/loans.service.ts
  • src/app/loans/loans.module.ts
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.html
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.scss
  • src/assets/translations/cs-CS.json
  • src/assets/translations/lt-LT.json
  • src/app/loans/loans-view/working-capital/loan-breach-actions-tab/loan-breach-actions-tab.component.ts
  • src/assets/translations/ko-KO.json
  • src/assets/translations/es-CL.json
  • src/assets/translations/de-DE.json
  • src/assets/translations/it-IT.json
  • src/assets/translations/es-MX.json

Comment thread src/app/core/utils/dates.ts
Comment thread src/assets/translations/en-US.json Outdated
Comment thread src/assets/translations/en-US.json
Comment thread src/assets/translations/fr-FR.json Outdated
Comment thread src/assets/translations/fr-FR.json Outdated
Comment thread src/assets/translations/lv-LV.json Outdated
@alberto-art3ch alberto-art3ch force-pushed the WEB-657/working-capital-loan-breach-pause-action branch from d7e90d8 to 719116d Compare June 16, 2026 19:03
@alberto-art3ch alberto-art3ch force-pushed the WEB-657/working-capital-loan-breach-pause-action branch from 719116d to b777ee3 Compare June 19, 2026 01:51
Sign up for free to 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.

1 participant