fix: restore remaining content dropped by the dev merge (comprehensive audit)
Systematic file-by-file audit of demo-backup against dev to find any remaining instances of the same silent-drop pattern from the earlier merge (git's 3-way auto-resolve keeping demo-backup's side wherever it had independently touched nearby lines, even when dev's side was a genuine, unrelated addition). Restored: - clients.module.ts: missing ClientFamilyMemberChildDialogComponent registration (component existed but was never wired in) - client-family-member-dialog: full children-management flow (checkbox, form array, child dialog integration, view/edit summary blocks) - edit-client: FIR-exception flow for inaccessible old mobile numbers, and a hardened detectSensitiveFieldChanges() (null-guard, phone-digit normalization, dirty-checked comparisons to avoid false-positive Verify-Contact-Change prompts) - shell.component.ts: withdrawal-review URL matcher extended to cover the Share Withdrawal Request review route - fiu.component.html: AML alert status filter and monthly CTR reports table UI (backing logic already existed unused in the .ts) - Shares module: Passbook tab (component existed but had no route or tab link), running-balance/resolution columns on the transactions tab, subscript-sizing fixes and a pill-style filter-bar redesign on Share Holders - Savings/Share product accounting steps: Payment-Channel-to-Fund- Source mapping section, and Share Reference account restructuring - pending-client-edits: email status badges + "View Email" button (dialog component existed but nothing on this list triggered it) Everything else that still differs from dev was individually verified as either demo-backup's own independent work (Investment/Loan Origination/NPA/RBI-OSS modules, the Approval Center tab-nav redesign, AML/compliance review features, bank-name rebrand in demo seed data) or purely cosmetic formatting differences — left untouched.
This commit is contained in:
@@ -152,6 +152,16 @@
|
||||
>
|
||||
{{ 'labels.inputs.Transactions' | translate }}
|
||||
</a>
|
||||
<a
|
||||
mat-tab-link
|
||||
[routerLink]="['./passbook']"
|
||||
routerLinkActive
|
||||
#passbook="routerLinkActive"
|
||||
[active]="passbook.isActive"
|
||||
*mifosxHasPermission="'READ_SHAREACCOUNTPURCHASE'"
|
||||
>
|
||||
Passbook
|
||||
</a>
|
||||
<a
|
||||
mat-tab-link
|
||||
[routerLink]="['./charges']"
|
||||
|
||||
@@ -50,12 +50,10 @@ export class SharesButtonsConfiguration {
|
||||
name: 'Reject Additional Shares',
|
||||
icon: 'arrow-left',
|
||||
taskPermissionName: 'REJECTADDITIONAL_SHAREACCOUNT'
|
||||
},
|
||||
{
|
||||
name: 'Redeem Shares',
|
||||
icon: 'arrow-left',
|
||||
taskPermissionName: 'WITHDRAW_SAVINGSACCOUNT'
|
||||
}
|
||||
// 'Redeem Shares' is intentionally not offered here — a share withdrawal must go
|
||||
// through the Clerk Dashboard maker-checker flow (Clerk Dashboard > My Share Requests),
|
||||
// never a direct one-step action from this view.
|
||||
];
|
||||
break;
|
||||
case 'Submitted and pending approval':
|
||||
|
||||
@@ -54,6 +54,25 @@
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="runningBalance">
|
||||
<th mat-header-cell *matHeaderCellDef>Share Balance</th>
|
||||
<td mat-cell *matCellDef="let transaction">{{ transaction.runningBalance }}</td>
|
||||
</ng-container>
|
||||
|
||||
<ng-container matColumnDef="resolutionMeeting">
|
||||
<th mat-header-cell *matHeaderCellDef>Resolution No. / Meeting Date</th>
|
||||
<td mat-cell *matCellDef="let transaction">
|
||||
@if (transaction.type.value === 'Redeem') {
|
||||
{{ transaction.resolutionNumber || '—' }}
|
||||
@if (transaction.meetingDate) {
|
||||
({{ transaction.meetingDate | dateFormat }})
|
||||
}
|
||||
} @else {
|
||||
—
|
||||
}
|
||||
</td>
|
||||
</ng-container>
|
||||
|
||||
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
|
||||
<tr mat-row *matRowDef="let row; columns: displayedColumns"></tr>
|
||||
</table>
|
||||
|
||||
@@ -56,14 +56,18 @@ export class TransactionsTabComponent implements OnInit {
|
||||
transactionsData: any;
|
||||
/** Data source for transactions table. */
|
||||
dataSource: MatTableDataSource<any>;
|
||||
/** Columns to be displayed in transactions table. */
|
||||
/** Columns to be displayed in transactions table — a share account's passbook: every
|
||||
* purchase/redeem entry plus the running share balance and, for a withdrawal, the Board
|
||||
* Resolution Number / Date of Meeting that authorised it. */
|
||||
displayedColumns: string[] = [
|
||||
'transactionDate',
|
||||
'transactionType',
|
||||
'totalShares',
|
||||
'purchasedOrRedeemedPrice',
|
||||
'chargeAmount',
|
||||
'amountRecievedOrReturned'
|
||||
'amountRecievedOrReturned',
|
||||
'runningBalance',
|
||||
'resolutionMeeting'
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -73,9 +77,19 @@ export class TransactionsTabComponent implements OnInit {
|
||||
constructor() {
|
||||
this.route.parent.data.subscribe((data: { sharesAccountData: any }) => {
|
||||
this.shareAccountData = data.sharesAccountData;
|
||||
this.transactionsData = this.shareAccountData.purchasedShares.filter(
|
||||
(transaction: any) => transaction.type.value !== 'Charge Payment'
|
||||
);
|
||||
this.transactionsData = this.shareAccountData.purchasedShares
|
||||
.filter((transaction: any) => transaction.type.value !== 'Charge Payment')
|
||||
.slice()
|
||||
.sort((a: any, b: any) => new Date(a.purchasedDate).getTime() - new Date(b.purchasedDate).getTime());
|
||||
|
||||
let runningBalance = 0;
|
||||
this.transactionsData.forEach((transaction: any) => {
|
||||
const shares = Number(transaction.numberOfShares) || 0;
|
||||
runningBalance += transaction.type.value === 'Redeem' ? -shares : shares;
|
||||
transaction.runningBalance = runningBalance;
|
||||
});
|
||||
// Passbook reads newest-first.
|
||||
this.transactionsData.reverse();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user