feat: non-individual entity UI improvements — hide individual-only sections, fix legal form display, send extended fields to API

- Hide Family Members tab/section for non-individual entities in client view, create flow, and preview
- Hide Financial & Classification section for non-individual entities in personal data and preview
- Fix legal form column in clients list — fetch legalForm from client API for correct display
- Add person/business icon before client name in list rows
- Remove unsupportedNpd filter — send authorizedSignatory, additionalInfo, dateOfRegistration to API
- Add registration number format hint (mat-hint) based on constitution type
- Add spacing between verification row and constitution type dropdowns
- Reduce table cell padding and prevent action buttons from being clipped
- Add missing MPL-2.0 license headers

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aditya
2026-04-04 15:10:51 +05:30
co-authored by Claude Opus 4.6
parent ab01111424
commit b890d24bb7
522 changed files with 51991 additions and 21885 deletions
+116 -326
View File
@@ -6,303 +6,117 @@
file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<div class="container">
<mat-card>
<div class="layout-row responsive-column gap-20px">
<div class="flex-50">
<mat-nav-list>
<mat-list-item *mifosxHasPermission="'CREATE_JOURNALENTRY'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['journal-entries/frequent-postings']">
<mat-icon matListIcon>
<fa-icon icon="sync" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Frequent Postings' | translate }}
@if (arrowBooleans[0]) {
<p matLine [routerLink]="['journal-entries/frequent-postings']" class="menu-explanation">
{{ 'labels.text.These are predefined postings' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[0]) {
<fa-icon (click)="arrowBooleansToggle(0)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[0]) {
<fa-icon (click)="arrowBooleansToggle(0)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
<div #createJournalEntries>
<mat-list-item *mifosxHasPermission="'CREATE_JOURNALENTRY'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['journal-entries/create']">
<mat-icon matListIcon>
<fa-icon icon="plus" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Create Journal Entries' | translate }}
@if (arrowBooleans[1]) {
<p matLine [routerLink]="['journal-entries/create']" class="menu-explanation">
{{ 'labels.text.Manual journal entry transactions recorded in a journal' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[1]) {
<fa-icon (click)="arrowBooleansToggle(1)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[1]) {
<fa-icon (click)="arrowBooleansToggle(1)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</div>
<mat-list-item *mifosxHasPermission="'READ_JOURNALENTRY'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['journal-entries']">
<mat-icon matListIcon>
<fa-icon icon="search" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Search Journal Entries' | translate }}
@if (arrowBooleans[2]) {
<p matLine [routerLink]="['journal-entries']" class="menu-explanation">
{{ 'labels.text.Advanced search option for journal entries' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[2]) {
<fa-icon (click)="arrowBooleansToggle(2)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[2]) {
<fa-icon (click)="arrowBooleansToggle(2)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
<div #accountsLinked>
<mat-list-item *mifosxHasPermission="'READ_FINANCIALACTIVITYACCOUNT'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['financial-activity-mappings']">
<mat-icon matListIcon>
<fa-icon icon="link" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Accounts Linked to Financial Activities' | translate }}
@if (arrowBooleans[3]) {
<p matLine [routerLink]="['financial-activity-mappings']" class="menu-explanation">
{{ 'labels.text.List of Financial Activities and GL Account Mappings' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[3]) {
<fa-icon (click)="arrowBooleansToggle(3)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[3]) {
<fa-icon (click)="arrowBooleansToggle(3)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</div>
<div #migrateOpeningBalances>
<mat-list-item *mifosxHasPermission="'READ_JOURNALENTRY'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['migrate-opening-balances']">
<mat-icon matListIcon>
<fa-icon icon="hand-holding-usd" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Migrate Opening Balances (Office-wise)' | translate }}
@if (arrowBooleans[4]) {
<p matLine [routerLink]="['migrate-opening-balances']" class="menu-explanation">
{{ 'labels.text.Set or update office-level opening balances for GL accounts' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[4]) {
<fa-icon (click)="arrowBooleansToggle(4)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[4]) {
<fa-icon (click)="arrowBooleansToggle(4)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</div>
</mat-nav-list>
</div>
<div class="flex-50">
<mat-nav-list>
<div #chartofAccounts>
<mat-list-item *mifosxHasPermission="'READ_GLACCOUNT'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['chart-of-accounts']">
<mat-icon matListIcon>
<fa-icon icon="sitemap" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Chart of Accounts' | translate }}
@if (arrowBooleans[5]) {
<p matLine [routerLink]="['chart-of-accounts']" class="menu-explanation">
{{ 'labels.text.List of accounts used by the organization' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[5]) {
<fa-icon (click)="arrowBooleansToggle(5)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[5]) {
<fa-icon (click)="arrowBooleansToggle(5)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</div>
<div #closingEntries>
<mat-list-item *mifosxHasPermission="'READ_GLCLOSURE'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['closing-entries']">
<mat-icon matListIcon>
<fa-icon icon="archive" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Closing Entries' | translate }}
@if (arrowBooleans[6]) {
<p matLine [routerLink]="['closing-entries']" class="menu-explanation">
{{ 'labels.text.Journal entries made at the end of accounting period' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[6]) {
<fa-icon (click)="arrowBooleansToggle(6)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[6]) {
<fa-icon (click)="arrowBooleansToggle(6)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</div>
<mat-list-item *mifosxHasPermission="'READ_ACCOUNTINGRULE'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['accounting-rules']">
<mat-icon matListIcon>
<fa-icon icon="list" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Accounting Rules' | translate }}
@if (arrowBooleans[7]) {
<p matLine [routerLink]="['accounting-rules']" class="menu-explanation">
{{ 'labels.text.List of all accounting rules' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[7]) {
<fa-icon (click)="arrowBooleansToggle(7)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[7]) {
<fa-icon (click)="arrowBooleansToggle(7)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
<mat-list-item *mifosxHasPermission="'EXECUTE_PERIODICACCRUALACCOUNTING'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['periodic-accruals']">
<mat-icon matListIcon>
<fa-icon icon="calendar" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Accruals' | translate }}
@if (arrowBooleans[8]) {
<p matLine [routerLink]="['periodic-accruals']" class="menu-explanation">
{{ 'labels.text.Accrues income, expenses and liabilities' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[8]) {
<fa-icon (click)="arrowBooleansToggle(8)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[8]) {
<fa-icon (click)="arrowBooleansToggle(8)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
<mat-list-item *mifosxHasPermission="'VIEW_PROVISIONING_ENTRIES'">
<div class="menu-list-item-content">
<div class="menu-left-section" [routerLink]="['provisioning-entries']">
<mat-icon matListIcon>
<fa-icon icon="cogs" size="sm"></fa-icon>
</mat-icon>
<div matLine>
{{ 'labels.heading.Provisioning Entries' | translate }}
@if (arrowBooleans[9]) {
<p matLine [routerLink]="['provisioning-entries']" class="menu-explanation">
{{ 'labels.text.Create provisioning entries' | translate }}
</p>
}
</div>
</div>
<div class="menu-right-section">
@if (!arrowBooleans[9]) {
<fa-icon (click)="arrowBooleansToggle(9)" icon="arrow-down" size="md"></fa-icon>
}
@if (arrowBooleans[9]) {
<fa-icon (click)="arrowBooleansToggle(9)" icon="arrow-up" size="md"></fa-icon>
}
</div>
</div>
</mat-list-item>
</mat-nav-list>
</div>
<div class="acc-container">
<!-- Header -->
<div class="acc-header">
<div class="acc-header__left">
<div class="acc-logomark"><span></span><span></span><span></span><span></span></div>
<h2 class="acc-header__title">{{ 'labels.menus.Accounting' | translate }}</h2>
</div>
</mat-card>
</div>
<!-- Cards Grid -->
<div class="acc-grid">
<!-- Frequent Postings -->
<a class="acc-card" [routerLink]="['journal-entries/frequent-postings']" *mifosxHasPermission="'CREATE_JOURNALENTRY'" #frequentPostings>
<div class="acc-card__icon blue"><i class="fas fa-sync-alt"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Frequent Postings' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.These are predefined postings' | translate }}</span>
</div>
</a>
<!-- Create Journal Entries -->
<a class="acc-card" [routerLink]="['journal-entries/create']" *mifosxHasPermission="'CREATE_JOURNALENTRY'" #createJournalEntries>
<div class="acc-card__icon green"><i class="fas fa-plus-circle"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Create Journal Entries' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Manual journal entry transactions recorded in a journal' | translate }}</span>
</div>
</a>
<!-- Search Journal Entries -->
<a class="acc-card" [routerLink]="['journal-entries']" *mifosxHasPermission="'READ_JOURNALENTRY'">
<div class="acc-card__icon purple"><i class="fas fa-search"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Search Journal Entries' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Advanced search option for journal entries' | translate }}</span>
</div>
</a>
<!-- Accounts Linked to Financial Activities -->
<a class="acc-card" [routerLink]="['financial-activity-mappings']" *mifosxHasPermission="'READ_FINANCIALACTIVITYACCOUNT'" #accountsLinked>
<div class="acc-card__icon teal"><i class="fas fa-link"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Accounts Linked to Financial Activities' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.List of Financial Activities and GL Account Mappings' | translate }}</span>
</div>
</a>
<!-- Migrate Opening Balances -->
<a class="acc-card" [routerLink]="['migrate-opening-balances']" *mifosxHasPermission="'READ_JOURNALENTRY'" #migrateOpeningBalances>
<div class="acc-card__icon amber"><i class="fas fa-hand-holding-usd"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Migrate Opening Balances (Office-wise)' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Set or update office-level opening balances for GL accounts' | translate }}</span>
</div>
</a>
<!-- Chart of Accounts -->
<a class="acc-card" [routerLink]="['chart-of-accounts']" *mifosxHasPermission="'READ_GLACCOUNT'" #chartofAccounts>
<div class="acc-card__icon blue"><i class="fas fa-sitemap"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Chart of Accounts' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.List of accounts used by the organization' | translate }}</span>
</div>
</a>
<!-- Closing Entries -->
<a class="acc-card" [routerLink]="['closing-entries']" *mifosxHasPermission="'READ_GLCLOSURE'" #closingEntries>
<div class="acc-card__icon red"><i class="fas fa-archive"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Closing Entries' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Journal entries made at the end of accounting period' | translate }}</span>
</div>
</a>
<!-- Accounting Rules -->
<a class="acc-card" [routerLink]="['accounting-rules']" *mifosxHasPermission="'READ_ACCOUNTINGRULE'">
<div class="acc-card__icon purple"><i class="fas fa-list-ul"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Accounting Rules' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.List of all accounting rules' | translate }}</span>
</div>
</a>
<!-- Accruals -->
<a class="acc-card" [routerLink]="['periodic-accruals']" *mifosxHasPermission="'EXECUTE_PERIODICACCRUALACCOUNTING'">
<div class="acc-card__icon green"><i class="fas fa-calendar-check"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Accruals' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Accrues income, expenses and liabilities' | translate }}</span>
</div>
</a>
<!-- Provisioning Entries -->
<a class="acc-card" [routerLink]="['provisioning-entries']" *mifosxHasPermission="'VIEW_PROVISIONING_ENTRIES'">
<div class="acc-card__icon amber"><i class="fas fa-cogs"></i></div>
<div class="acc-card__info">
<span class="acc-card__title">{{ 'labels.heading.Provisioning Entries' | translate }}</span>
<span class="acc-card__desc">{{ 'labels.text.Create provisioning entries' | translate }}</span>
</div>
</a>
</div>
</div>
<!-- Config Wizard Templates (keep as-is) -->
<ng-template #templateChartofAccounts let-popover="popover">
<h2>{{ 'labels.heading.Chart of Accounts' | translate }}</h2>
<p class="mw300">{{ 'labels.text.The Chart of Accounts - General Ledger Setup' | translate }}</p>
<div class="layout-row align-end gap-2px responsive-column">
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">
{{ 'labels.buttons.Close' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepChartofAccounts()">
{{ 'labels.buttons.Back' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepChartofAccounts()">
{{ 'labels.buttons.Next' | translate }}
</button>
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">{{ 'labels.buttons.Close' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepChartofAccounts()">{{ 'labels.buttons.Back' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepChartofAccounts()">{{ 'labels.buttons.Next' | translate }}</button>
</div>
</ng-template>
@@ -310,15 +124,9 @@
<h2>{{ 'labels.heading.Accounts Linked to Financial Activities' | translate }}</h2>
<p class="mw400">{{ 'labels.text.Accounts linked to Financial Activities' | translate }}</p>
<div class="layout-row align-end gap-2px responsive-column">
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">
{{ 'labels.buttons.Close' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepAccountsLinked()">
{{ 'labels.buttons.Back' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepAccountsLinked()">
{{ 'labels.buttons.Next' | translate }}
</button>
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">{{ 'labels.buttons.Close' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepAccountsLinked()">{{ 'labels.buttons.Back' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepAccountsLinked()">{{ 'labels.buttons.Next' | translate }}</button>
</div>
</ng-template>
@@ -326,15 +134,9 @@
<h2>{{ 'labels.heading.Migrate Opening Balances (Office-wise)' | translate }}</h2>
<p class="mw400">{{ 'labels.text.GLAccount Balances Application' | translate }}</p>
<div class="layout-row align-end gap-2px responsive-column">
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">
{{ 'labels.buttons.Close' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepMigrateOpeningBalances()">
{{ 'labels.buttons.Back' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepMigrateOpeningBalances()">
{{ 'labels.buttons.Next' | translate }}
</button>
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">{{ 'labels.buttons.Close' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepMigrateOpeningBalances()">{{ 'labels.buttons.Back' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepMigrateOpeningBalances()">{{ 'labels.buttons.Next' | translate }}</button>
</div>
</ng-template>
@@ -342,15 +144,9 @@
<h2>{{ 'labels.heading.Closing Entries' | translate }}</h2>
<p class="mw300">{{ 'labels.text.Accounting to journal entries' | translate }}</p>
<div class="layout-row align-end gap-2px responsive-column">
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">
{{ 'labels.buttons.Close' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepClosingEntries()">
{{ 'labels.buttons.Back' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepClosingEntries()">
{{ 'labels.buttons.Next' | translate }}
</button>
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">{{ 'labels.buttons.Close' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepClosingEntries()">{{ 'labels.buttons.Back' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepClosingEntries()">{{ 'labels.buttons.Next' | translate }}</button>
</div>
</ng-template>
@@ -358,14 +154,8 @@
<h2>{{ 'labels.heading.Create Journal Entries' | translate }}</h2>
<p class="mw300">{{ 'labels.text.Journal Entries Transactions' | translate }}</p>
<div class="layout-row align-end gap-2px responsive-column">
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">
{{ 'labels.buttons.Close' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepCreateJournalEntries()">
{{ 'labels.buttons.Back' | translate }}
</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepCreateJournalEntries()">
{{ 'labels.buttons.Next' | translate }}
</button>
<button mat-raised-button color="warn" (click)="popover.close(); configurationWizardService.closeConfigWizard()">{{ 'labels.buttons.Close' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); previousStepCreateJournalEntries()">{{ 'labels.buttons.Back' | translate }}</button>
<button mat-raised-button color="primary" (click)="popover.close(); nextStepCreateJournalEntries()">{{ 'labels.buttons.Next' | translate }}</button>
</div>
</ng-template>