Frontend counterpart to the backend dividend rework: - Create Dividend screen auto-computes the amount from real bank profit x officer percentage, blocks overlapping declaration periods, and adds a Total Dividend Paid summary card. - View Dividend page modernized and reusable as an embedded popup from the new cross-product "Dividend Requests" approval-center tab. - New consolidated Dividend Dashboard: summary stats, every declaration and its status, locked-dividend-vs-overdue-EMI matching with a proactive apply-to-loan action, full 3-year lock history, and a maker-checker claim panel letting a clerk split a member's unclaimed dividend across an overdue loan, savings credit, or cash for a manager to approve. - Menu/routing consolidated under Share > Dividend Management; removed the now-unreachable Failed Dividend Payouts page and its home-dashboard alert once the backend stopped needing a retry path for stuck payouts. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
228 lines
9.3 KiB
TypeScript
228 lines
9.3 KiB
TypeScript
/**
|
|
* Copyright since 2025 Mifos Initiative
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
import { NgModule } from '@angular/core';
|
|
import { Routes, RouterModule } from '@angular/router';
|
|
|
|
import { Route } from '../core/route/route.service';
|
|
import { CashierOnlyGuard } from '../core/authentication/cashier-only.guard';
|
|
import { CashExchangeEntryComponent } from './cash-exchange-entry/cash-exchange-entry.component';
|
|
import { CurrencyExchangeDetailComponent } from './currency-exchange-detail/currency-exchange-detail.component';
|
|
import { CashTransferComponent } from './cash-transfer/cash-transfer.component';
|
|
import { CashSettlementComponent } from './cash-settlement/cash-settlement.component';
|
|
import { InterCashierTransferComponent } from './inter-cashier-transfer/inter-cashier-transfer.component';
|
|
import { CashierPositionComponent } from './cashier-position/cashier-position.component';
|
|
import { ReconciliationComponent } from './reconciliation/reconciliation.component';
|
|
import { CashHistoryComponent } from './cash-history/cash-history.component';
|
|
import { ClosingCashReportComponent } from './closing-cash-report/closing-cash-report.component';
|
|
import { ExcessTransactionReportComponent } from './excess-transaction-report/excess-transaction-report.component';
|
|
import { ShareCollectionComponent } from './share-collection/share-collection.component';
|
|
|
|
const routes: Routes = [
|
|
Route.withShell([
|
|
{
|
|
path: 'clerk',
|
|
data: { title: 'Clerk', breadcrumb: 'Clerk' },
|
|
children: [
|
|
{
|
|
path: 'dashboard',
|
|
loadComponent: () =>
|
|
import('../clerk/clerk-dashboard/clerk-dashboard.component').then((m) => m.ClerkDashboardComponent),
|
|
data: { title: 'Clerk Dashboard', breadcrumb: 'Clerk Dashboard' }
|
|
},
|
|
{
|
|
path: 'withdrawal-request',
|
|
loadComponent: () =>
|
|
import('../clerk/withdrawal-request/withdrawal-request.component').then(
|
|
(m) => m.WithdrawalRequestComponent
|
|
),
|
|
data: { title: 'New Withdrawal Request', breadcrumb: 'New Withdrawal Request', mode: 'create' }
|
|
},
|
|
{
|
|
path: 'withdrawal-request/:id',
|
|
loadComponent: () =>
|
|
import('../clerk/withdrawal-edit/withdrawal-edit.component').then((m) => m.WithdrawalEditComponent),
|
|
data: { title: 'Edit Withdrawal Request', breadcrumb: 'Edit Withdrawal Request' }
|
|
},
|
|
{
|
|
path: 'withdrawal-requests',
|
|
loadComponent: () => import('../clerk/my-requests/my-requests.component').then((m) => m.MyRequestsComponent),
|
|
data: { title: 'My Withdrawal Requests', breadcrumb: 'My Withdrawal Requests' }
|
|
},
|
|
{
|
|
path: 'my-disbursement-requests',
|
|
loadComponent: () =>
|
|
import('../clerk/my-disbursement-requests/my-disbursement-requests.component').then(
|
|
(m) => m.MyDisbursementRequestsComponent
|
|
),
|
|
data: { title: 'My Disbursement Requests', breadcrumb: 'My Disbursement Requests' }
|
|
},
|
|
{
|
|
path: 'share-withdrawal-request',
|
|
loadComponent: () =>
|
|
import('../clerk/share-withdrawal-request/share-withdrawal-request.component').then(
|
|
(m) => m.ShareWithdrawalRequestComponent
|
|
),
|
|
data: { title: 'New Share Withdrawal Request', breadcrumb: 'New Share Withdrawal Request', mode: 'create' }
|
|
},
|
|
{
|
|
path: 'share-withdrawal-requests',
|
|
loadComponent: () =>
|
|
import('../clerk/my-share-withdrawal-requests/my-share-withdrawal-requests.component').then(
|
|
(m) => m.MyShareWithdrawalRequestsComponent
|
|
),
|
|
data: { title: 'My Share Requests', breadcrumb: 'My Share Requests' }
|
|
},
|
|
{
|
|
path: 'account-facilities',
|
|
loadComponent: () =>
|
|
import('../clerk/account-facilities/account-facilities.component').then(
|
|
(m) => m.AccountFacilitiesComponent
|
|
),
|
|
data: { title: 'Account Facilities', breadcrumb: 'Account Facilities' }
|
|
},
|
|
{
|
|
path: 'account-facilities/cheque-book',
|
|
loadComponent: () =>
|
|
import('../clerk/cheque-book/cheque-book.component').then((m) => m.ClerkChequeBookComponent),
|
|
data: { title: 'Cheque Book', breadcrumb: 'Cheque Book' }
|
|
},
|
|
{
|
|
path: 'account-facilities/cheque-book/:id',
|
|
loadComponent: () =>
|
|
import('../clerk/cheque-book/cheque-book-detail.component').then((m) => m.ClerkChequeBookDetailComponent),
|
|
data: { title: 'Cheque Book Detail', breadcrumb: 'Cheque Book Detail' }
|
|
},
|
|
{
|
|
path: 'photo-signature',
|
|
loadComponent: () =>
|
|
import('../clerk/photo-signature/photo-signature.component').then((m) => m.PhotoSignatureComponent),
|
|
data: { title: 'Photo & Signature', breadcrumb: 'Photo & Signature' }
|
|
},
|
|
{
|
|
path: 'standing-instructions',
|
|
loadComponent: () =>
|
|
import('../clerk/standing-instructions/standing-instructions.component').then(
|
|
(m) => m.StandingInstructionsComponent
|
|
),
|
|
data: { title: 'Standing Instructions', breadcrumb: 'Standing Instructions' }
|
|
},
|
|
{
|
|
path: 'today-activity',
|
|
loadComponent: () =>
|
|
import('../clerk/today-activity/today-activity.component').then((m) => m.TodayActivityComponent),
|
|
data: { title: "Today's Activity", breadcrumb: "Today's Activity" }
|
|
},
|
|
{
|
|
path: 'dividend-dashboard',
|
|
loadComponent: () =>
|
|
import('../clerk/dividend-dashboard/dividend-dashboard.component').then(
|
|
(m) => m.DividendDashboardComponent
|
|
),
|
|
data: { title: 'Dividend Dashboard', breadcrumb: 'Dividend Dashboard' }
|
|
}
|
|
]
|
|
},
|
|
{
|
|
path: 'cashier',
|
|
data: { title: 'Cashier', breadcrumb: 'Cashier' },
|
|
children: [
|
|
{
|
|
path: 'cash-exchange',
|
|
component: CashExchangeEntryComponent,
|
|
data: { title: 'Cash Exchange Entry', breadcrumb: 'Cash Exchange Entry' }
|
|
},
|
|
{
|
|
path: 'exchange-detail',
|
|
component: CurrencyExchangeDetailComponent,
|
|
data: { title: 'Currency Exchange Detail', breadcrumb: 'Currency Exchange Detail' }
|
|
},
|
|
{
|
|
path: 'cash-transfer',
|
|
component: CashTransferComponent,
|
|
data: { title: 'Cash Transfer', breadcrumb: 'Cash Transfer' }
|
|
},
|
|
{
|
|
path: 'cash-settlement',
|
|
component: CashSettlementComponent,
|
|
data: { title: 'Cash Settlement', breadcrumb: 'Cash Settlement' }
|
|
},
|
|
{
|
|
path: 'inter-cashier',
|
|
component: InterCashierTransferComponent,
|
|
data: { title: 'Inter-Cashier Transfer', breadcrumb: 'Inter-Cashier Transfer' }
|
|
},
|
|
{
|
|
path: 'cashier-position',
|
|
component: CashierPositionComponent,
|
|
data: { title: 'Cashier Position', breadcrumb: 'Cashier Position' }
|
|
},
|
|
{
|
|
path: 'reconciliation',
|
|
component: ReconciliationComponent,
|
|
data: { title: 'Reconciliation', breadcrumb: 'Reconciliation' }
|
|
},
|
|
{
|
|
path: 'cash-history',
|
|
component: CashHistoryComponent,
|
|
data: { title: 'Cash History', breadcrumb: 'Cash History' }
|
|
},
|
|
{
|
|
path: 'closing-report',
|
|
component: ClosingCashReportComponent,
|
|
data: { title: 'Closing Cash Report', breadcrumb: 'Closing Cash Report' }
|
|
},
|
|
{
|
|
path: 'excess-report',
|
|
component: ExcessTransactionReportComponent,
|
|
data: { title: 'Excess Transaction Report', breadcrumb: 'Excess Transaction Report' }
|
|
},
|
|
{
|
|
path: 'share-collection',
|
|
component: ShareCollectionComponent,
|
|
data: { title: 'Share Collection', breadcrumb: 'Share Collection' }
|
|
},
|
|
{
|
|
path: 'transaction-entry',
|
|
canActivate: [CashierOnlyGuard],
|
|
loadComponent: () =>
|
|
import('./transaction-entry/transaction-entry.component').then((m) => m.TransactionEntryComponent),
|
|
data: {
|
|
title: 'Cashier Transaction Entry',
|
|
breadcrumb: 'Transaction Entry',
|
|
hideShellLayout: true
|
|
}
|
|
},
|
|
{
|
|
path: 'my-deposit-requests',
|
|
loadComponent: () =>
|
|
import('./my-deposit-requests/my-deposit-requests.component').then((m) => m.MyDepositRequestsComponent),
|
|
data: { title: 'My Deposit Requests', breadcrumb: 'My Deposit Requests' }
|
|
},
|
|
{
|
|
path: 'cash-clearing-transfer-summary',
|
|
loadComponent: () =>
|
|
import('./cash-clearing-transfer-summary/cash-clearing-transfer-summary.component').then(
|
|
(m) => m.CashClearingTransferSummaryComponent
|
|
),
|
|
data: {
|
|
title: 'Cash / Clearing / Transfer - Summary Report',
|
|
breadcrumb: 'Cash / Clearing / Transfer - Summary Report'
|
|
}
|
|
}
|
|
]
|
|
}
|
|
])
|
|
];
|
|
|
|
@NgModule({
|
|
imports: [RouterModule.forChild(routes)],
|
|
exports: [RouterModule]
|
|
})
|
|
export class CashierRoutingModule {}
|